Transient simulations

From Serpent Wiki
Jump to: navigation, search




Generating the steady state source distributions



set savesrc FILEPATH [PN PP NX NY NZ]


  • FILEPATH.main - containing general information of the generated source
  • FILEPATH.prec - containing a precursor source tallied on a cartesian mesh
  • - containing the live neutron source (binary)


Warning message from function WriteSourceFile:

P larger than 1 (1.630892E+00)

PN should be then adjusted to make the saving probabilities smaller than one (PN is directly used to multiply the saving probability). PN linearly affects the number of neutrons being saved, so making it too small means that a large amount of neutrons have to be simulated to produce an adequate number of source points. Another way to tackle the P larger than 1 problem is to decrease the maximum mean free path used by Serpent by setting lower values for set cfe: Halving the default scoring distance for neutrons should be a good starting point for lowering the sampled P values without storing less neutrons.



Background on PN

We want to have our live neutron source to be representative of the neutron distribution in our system at the time of the beginning of our transient. One way to visualize this is to have our system in its steady state and at a random moment take a snapshot of all the neutrons in the system. Each neutron is caught in this snapshot at a random time in their life: Some have just been born while others may have already thermalized.

To obtain such a source from a Monte Carlo simulation we have to store neutrons at random times during their life. If we don't want to slow down our criticality source calculation by stopping our neutrons at various times in the simulation we can save neutrons at their tentative interaction sites: After a path-length has been sampled for a neutron and it has been transported to a new (possible) interaction site we can store information (such as position, velocity and energy) on the neutron to a source file.

These tentative interaction sites are not, however, distributed uniformly in time or space. If we would store neutrons at each interaction site with a fixed probability, we would obtain too many fast neutrons (fast speed leads to more interactions per unit time than slow speed) and too many neutrons from materials with a large macroscopic cross section (large macroscopic cross section leads to more interactions).

To use a more rigorous derivation, the mean path-length between two interactions (mean free path) for a neutron with energy E travelling over a path, where the interaction probability is constant over the path length, is

\lambda_{\mathrm{mean}}(E) = \frac{1}{\Sigma_{\mathrm{tot}}(E)},

where \Sigma_{\mathrm{tot}}(E) is the total macroscopic cross section over the path. The time it takes for the neutron to travel this path length gives the mean time between two interactions

t_{\mathrm{mean}}(E) = \frac{\lambda_{\mathrm{mean}}(E)}{v(E)} = \frac{1}{\Sigma_{\mathrm{tot}}(E)v(E)},

where v(E) is the velocity of the neutron. This means that the mean interaction frequency depends on the energy of neutrons as

f_{\mathrm{mean}}(E) = \frac{1}{t_{\mathrm{mean}}(E)} = \Sigma_{\mathrm{tot}}(E)v(E).

If we want to save neutrons at interaction sites and want the saved neutrons to have been sampled uniformly in time, we'll want to have the probability to save a given neutron at an interaction site to be

P \propto \frac{1}{f_{\mathrm{mean}}(E)} = \frac{1}{\Sigma_{\mathrm{tot}}(E)v(E)}.

We'll want the probability to be less than one, which means that we'll use an additional normalization constant A:

P = A \frac{1}{\Sigma_{\mathrm{tot}}(E)v(E)}.

Furthermore, in non-analog simulations some of our neutrons might have a non-unity weight w, meaning that they represent a larger or a smaller group of neutrons than the average neutron. We'll take this in account as an additional weighting term for the probability:

P = A \frac{w}{\Sigma_{\mathrm{tot}}(E)v(E)}.

When delta tracking is used, the cross section used to sample each path length may be larger than the local macroscopic total cross section. This is taken in account by using the path length sampling cross section \Sigma_{\mathrm{path}}(E) instead of the local total cross section \Sigma_{\mathrm{tot}}(E):

P = A \frac{w}{\Sigma_{\mathrm{path}}(E)v(E)}.

The final question is then how to choose the normalization constant A. Based on the expression above, it is evident that if we choose

A = \frac{1}{\max \frac{w}{\Sigma_{\mathrm{path}}(E)v(E)}},

where the maximum is taken over all neutron energies and the whole geometry, the probability will always be smaller than unity. The minimum velocity of the neutrons is known based on the minimum energy of neutrons (minimum of cross section data). However, the minimum path length sampling cross section is slightly more tricky. In, e.g. void regions the total cross section is zero, which would lead to an infinite value of A. However, Serpent uses an internal minimum cross section for the path length sampling (set cfe), which means that the path length sampling cross section should always be greater than zero.

The current implementation sets

 A = P_{N} v_{\mathrm{min}},

where v_{\mathrm{min}} is the minimum velocity for neutrons and P_N is the parameter PN that can be set by user and needs to cover the variation in minimum path length sampling cross section and the neutron weight. The PN parameter may become obsolete at some point in the future due to better pre-calcuation of the constant A.




nPop nPopErr
nTime nGroups nSpatial0 nSpatial1 nSpatial2
lambda1 lambda2 ... lambdanGroups







iTime iGroup iSpatial value error


iGroup  : the delayed neutron group index
iSpatial  : the spatial bin index
value  : the stable precursor population in the bin
error  : the estimated relative standard error of the population



  1. x-coordinate (cm)
  2. y-coordinate (cm)
  3. z-coordinate (cm)
  7. E : Neutron energy (MeV)
  8. wgt : Statistical weight
  9. t : Simulation time

Since each neutron takes

9*sizeof(double) = 9*8 = 72 




9*sizeof(double) = 9*8 = 72

bytes of disk space, which means that the number of stored precursors can be calculated from the file size the same way as with live neutrons. The nine values stored for each precursor are

  1. x-coordinate (cm)
  2. y-coordinate (cm)
  3. z-coordinate (cm)
  4. Always 1 (not used)
  5. Always 0 (not used)
  6. Always 0 (not used)
  7. Either 1 (dynamic simulations) or energy of producing neutron (criticality source simulations) (not used)
  8. wgt : Statistical weight
  9. g : Precursor group

Important notes


Running the time dependent simulation

Basic approach in the time-dependent simulations

Serpent tracks both neutrons and precursors through time in a continuous manner (without any time-discretization). The initial neutron and precursor source in the beginning of the simulation is known based on the source generation simulation.

The transient simulation can be divided into sub-intervals for population control purposes. In the simplest case the transient can be simulated as a single time-interval.

The basic process for each time-interval is as follows:

  1. Create the primary source for the time-interval:
    1. Calculate the live neutron population at the beginning of the interval. This is done either from the initial neutron source or from the current neutron banks.
    2. Calculate the decay of precursor tallies based on the decay law to
      • Determine the delayed neutron population emitted from the tallies during the interval
      • Determine and store the initial value of each tally at end-of-interval.
    3. Divide the initial source points between live neutrons and delayed neutrons emitted from precursors based on proportion of the two populations.
    4. Population control the live neutron source to the required number.
    5. Sample the emission of the required number of delayed neutrons from existing precursors
  2. Simulate the primary particles and any secondary/further particles that emitted during the time-interval.
    • Tally the precursor production during the neutron tracking.
  3. Store the neutrons that reach the end of the time interval. Add the precursors that were produced and survived until the end of the interval to the end-of-interval precursor tallies.
  4. Start again from 1.

For the new precursors produced during the time-interval, only a part of their weight survives until the end of the time-interval due to decay happening during the interval:

A schematic plot of precursor production during a time-interval of a transient simulation

In the picture above, the initial produced precursor weight in an interaction happening at time t_* is w_0. Only a part of the weight survives until the end of the interval to be added to the end-of-interval tallies:

w_{\mathrm{tal}} = w_0e^{-\lambda_g (t_* - t_0)}.

The remaining part decays during the interval and should be emitted as a delayed neutron

w_{\mathrm{emit}} = w_0\left(1-e^{-\lambda_g (t_* - t_0)}\right).

As w_{\mathrm{emit}} is typically small compared to w_0 the delayed neutron to be emitted is subjected to Russian roulette to either increase its weight to a more reasonable level or not emit it at all.





set dynsrc PATH [ MODE ]

input option, where the parameters are


The four separate source files should be found PATH.main, PATH.prec, and PATH.precpoints.



Detector output in transient simulations

The detector output values in transient simulations are time-integrated values. For example, detector response -8 (fission power deposition) will yield the fission energy deposition in Joules rather than Watts.

The detector output in transient simulations works differently depending on whether the transient simulation is coupled (using set comfile or set ppid or by using the FINIX fuel behavior module) or not.

1. In non-coupled transient simulations the simulation proceeds by first simulating the first neutron batch through all of the time-intervals before simulating the next batch.

2. In coupled transient simulations the simulation proceeds by first simulating all of the neutron batches through the first time-interval before simulating the next time-interval.

Due to the difference in the simulation process, the detector results are also collected differently:

1. In non-coupled transient simulations the detector results are collected from all of the time-intervals and the [input]_det.m file will contain results from all time-intervals.

2. In coupled transient simulations all statistics, such as detector results are cleared between time-intervals, which means that during the simulation of a certain time-interval only the detector bins that lie in that interval get non-zero scores.

In coupled transient simulations Serpent produces one detector output file for each time-interval. [input]_det0.m will contain detector scores from the first time-interval, [input]_det1.m from the second time-interval and so on.

This means that if you want to get the detector results using a time-binning corresponding to the simulation time-intervals you don't actually need to specify any time-binning for the detector as each of the input_det<N>.m files will contain the results for one time-interval. If you want to obtain results using a finer grid than the one used for simulation time-intervals you can specify that for the detectors and combine the results from the [input]_det<N>.m files during post-processing.

Input examples

Publications and presentations