Understanding the basics before you write your first line
Most people skip straight to writing simulation code without understanding the geometry setup, and then they spend days debugging results that don't match reality. Coding radiation transport problems requires you to think about particle history tracking, cross-section data management, and variance reduction techniques before you even open an editor. I've seen teams burn through weeks of compute time on a project because they didn't properly define their material boundaries or their source geometry. The field splits into two main approaches. Monte Carlo methods track individual particles through random sampling, which gives you high accuracy but takes massive compute resources. Deterministic methods solve the Boltzmann transport equation on a mesh, which is faster but introduces angular and spatial discretization errors. Your choice depends on whether you need high-fidelity point results or a broader spatial distribution quickly. For reactor core modeling, I lean deterministic with Monte Carlo verification. For shielding analysis around a single component, Monte Carlo is the way to go.
CTR Guide To Coding Radiation
When I first started working with radiation transport codes, I hit a wall with a personal project involving dose calculation around a medical linear accelerator. I was using a simplified geometry model and the results were off by nearly 40% compared to measurement data. The problem turned out to be my treatment head modeling. I had collapsed the multi-layer collimator and shielding components into a single homogeneous block, which eliminated important scattering interactions. The fix was building a layered geometry with individual material definitions for each physical component, using real CAD-derived dimensions rather than textbook approximations. It added about three days to the model setup phase but saved me from publishing wrong results and having to retract them later. If you're looking to get started, the open source tools available are solid. MCNP remains the industry standard for general purpose radiation transport, with a learning curve that's steep but well documented. Serpent 2 handles reactor physics workflows efficiently and its scripting environment is more programmer friendly than MCNP's input file format. OpenMC is a newer Python-native option that's worth considering if you want to integrate transport calculations into a larger data pipeline. Each has different licensing considerations, so check before committing to a codebase. One thing beginners consistently miss is the importance of scoring tallies. Setting up a simple energy deposition tally is easy, but getting statistically meaningful results requires understanding convergence behavior. Run a short preliminary simulation with a small number of particle histories first. Look at the relative error bars on your tallies. If they're above 5%, your results aren't trustworthy for publication quality work. You need to increase particle histories or use variance reduction techniques like weight windows or source biasing to improve the statistics without burning through your compute allocation.
Another counter intuitive aspect is that more geometry detail doesn't always mean better results. I learned this the hard way when modeling a neutron source surrounded by concrete shielding. I spent hours adding fine detail to every brick joint and rebar location in the concrete. The refined mesh produced results that were actually less accurate because the statistical noise in each subvolume increased dramatically with the finer mesh. Sometimes a simpler geometry with better statistics beats a hyper detailed one with sparse sampling. I now start with a simplified model, verify it against known benchmarks, then add complexity only where it matters for the physics you care about. Cross section libraries deserve careful attention. The nuclear data you choose directly determines your answer quality. ENDF/B-VIII.0 is generally reliable for most applications, but some isotopes have known deficiencies in specific energy ranges. If you're simulating fission product gammas from a spent fuel assembly, you should verify your library data against evaluated databases for those specific nuclides. I once caught a discrepancy in the thermal neutron capture cross section for a beryllium isotope that was causing my reflection calculations to drift significantly. Cross checking against the CSEWG benchmark suite before running production simulations will save you from these kinds of issues. Computational cost is a real constraint that many underestimate. A well configured Monte Carlo simulation for a medium complexity geometry might take 48 to 72 hours on a standard workstation. Adding a second source term or refining your energy group structure can double or triple that. Parallelization helps, but communication overhead between MPI ranks becomes significant beyond a certain core count. For my typical workloads, I run between 64 and 128 cores. Going beyond that usually doesn't improve wall clock time meaningfully and sometimes makes it worse due to load imbalance across the geometry.
Get the Full Details

If your problem involves time dependent transport or transient scenarios, standard steady state Monte Carlo codes won't help you. You'll need something like PARTISN or a time dependent capability within a code like MCNP6. These are significantly more complex to set up and validate. For routine shielding and activation work, steady state analysis covers most practical needs. Don't overcomplicate your problem setup unless your physics question genuinely requires time dependence. The validation question comes up constantly and deserves honest discussion. No simulation is universally accurate. Every code and model has limitations. Geometry approximations, nuclear data uncertainties, and numerical artifacts all contribute to final answer uncertainty. I typically report a combined uncertainty budget that includes statistical error from the simulation, nuclear data uncertainty from the library evaluation, and geometric uncertainty from how closely my model matches the actual physical setup. These combined uncertainties often range from 3% to 15% depending on the problem complexity. Anyone claiming sub percent accuracy without a thorough uncertainty quantification is either overselling or working on a highly idealized benchmark case. For teams that need something faster than full Monte Carlo but can't afford the worst case uncertainties of crude deterministic approximations, hybrid approaches are worth exploring. Coupling a deterministic solver for the bulk flux with a Monte Carlo region solver for areas of interest gives you the best of both worlds in many scenarios. I've used this strategy successfully for fuel assembly pin power reconstruction, where deterministic methods handled the lattice physics and Monte Carlo resolved the detailed pin level information.