Last version:
FLUKA 2021.2.6, May 27th 2022
(last respin 2021.2.6)
flair-2.3-0b 30-Jul-2021


-- Fluka Release
( 28.05.2022 )

FLUKA 2021.2.6 has been released.
Flair-2.3-0bpy3 python3 port on 28.05

font_small font_med font_big print_ascii

previous FAQback to FAQ listnext FAQ

Common blocks and information on particle histories


What is a stack? How many stacks does FLUKA have?


A stack is a set of arrays containing all information about particles to be transported. A same value of array index ("stack pointer") corresponds to one specific particle. There is one array per each of the phase space coordinates (position coordinates, direction cosines, energy, age), others for the particle type, statistical weight, momentum, generation, various flags, etc. In other codes the stack is called the bank.

At the beginning of a history (or event), a primary is loaded in stack with all its properties (particle ID, position, direction cosines, energy, age, generation number, etc.). The stack index is increased by 1.

Then the particle is "unloaded" (i.e., a copy is made for transport, and the stack index is decreased by 1). The particle is transported and during its life any produced secondary is loaded onto stack, increasing the stack index by 1 at each new particle. (Secondaries includes delta ray electrons, evaporation particles, photon-produced pairs, capture gammas, split particles, photoneutrons, etc.) At the end of a particle life (by energy cutoff, absorption, escape, etc.), the program looks if there is still any particle in stack. If there are, the top one (i.e., the one with the largest pointer value) is unloaded and transported, and during transport, again, any new produced particle is stored in stack.

A primary history is completed when the stack is empty. Then FLUKA calls a subroutine called feeder (or a user-supplied source) to get a new primary to load on stack. And so on.

Note that when a particle changes its energy, that is not recorded in stack: in stack you have only the initial energies, ages, weights etc., and anyway they are deleted at the time that the particle is unloaded. Any change affects the "copy". Note that the stack is a collection of arrays in a COMMON: XFLK(I), YFLK(I) etc., but the copy is a collection of local scalars XTRACK, YTRACK, etc., contained in a COMMON called TRACKR.

In addition to the main stack, called FLKSTK, FLUKA has several secondary stacks, each contained in a Fortran COMMON:
  • the electromagnetic stack (EMFSTK),
  • the stack of optical photons (OPPHST),
  • the hadron generator stack (GENSTK),
  • the stack of heavy secondaries created in nuclear evaporation (FHEAVY),
  • the stack of radioactive decays (RDPSTK)


Is it possible to print information on the ancestor ("mother") of a particle produced in FLUKA?


At any time during a FLUKA run the common block FLKSTK is carrying those particles which have not yet been followed in the cascade, such as the primary beam particle or any other produced secondaries. Beside variables containing information on the type, momentum, position etc. of the respective entry it also contains variables which can be used by the user in order to save additional information:
  SPAREK (11,0:MFSTCK)   (11 double precision variables for each stack entry)
  ISPARK (11,0:MFSTCK)   (11 integer variables for each stack entry)
  LOUSE  (0:MFSTCK)     (one integer variable for each stack entry)
Furthermore the user-subroutine stuprf (in subdirectory usermvax) is called every time a new particle is produced and put into the stack. The identity and coordinates of the "mother" particle are handed over to stuprf as arguments (IJ, XX, YY, ZZ) and further information on the "mother" particle is stored in common TRACKR.

Hence in stuprf any information on the "mother" particle of a particle, which has just been produced and is put into the stack, can be stored in addition using the above 11 user variables.

For example if you want to save the identity, total energy and z-coordinate of the mother you must edit stuprf as follows
and leave the other user variables untouched
      DO 100 ISPR = 3, MKBMX1
      DO 200 ISPR = 1, MKBMX2
When a new particle is taken from the stack in order to transport it this particle is filled into TRACKR with the above 11 variables saved on LLOUSE, SPAUSR and ISPUSR (the following lines are not visible for the user):
      DO 96 ISPR = 1, MKBMX1
      DO 98 ISPR = 1, MKBMX2
Therefore common block TRACKR now contains not only the information on the presently transported particle but also the information on its mother and can be printed using mgdraw (see manual, collision tape, input card USERDUMP).

You'll therefore have to edit stuprf and mgdraw, to compile and link them with the FLUKA-library and to use the USERDUMP to plot all information.

In a similar way, one can save the information about the mother particle (and possibly other ancestors) when the particle is an electron or a photon. In this case the stack concerned is EMFSTK, and the user subroutine is stupre.


How can I get the nuclear recoils in neutron interactions? Can I deduce them from the residual nuclei and an energy balance of the outgoing fragments? How else can I get displacements per atom (DPA)?


For neutrons (and other hadrons) of energy > 19.6 MeV, the recoils can be obtained using the user routine mgdraw. They can be found after each nuclear interaction in COMMONs GENSTK and FHEAVY.

However, this is not possible in general with low energy neutrons. FLUKA provides recoil production and transport with detailed kinematics only for scattering on hydrogen and for 14-N(n,p), 10-B(n,alpha) and 6-Li(n,x). But don't try to get the recoils for low energy neutron interactions from energy balance, it will never work!

All low energy neutron information for FLUKA as well as for all other database based codes (pointwise or group) are unfortunately uncorrelated (i.e. you can get the capture gammas without having the neutron captured, or emit more energy than the original one etc.: all the data in the neutronic databases are uncorrelated).

To get DPAs from low energy neutrons, the simplest way is to use the user routine fluscw to weight track length with DPA cross sections. These can be obtained for some selected materials from specialised centers (IAEA, NEA, RSICC).


There exist different common blocks with particle properties, for example PART and PAPROP. What is the difference between both?


FLUKA distinguishes between particles that are produced and particles that are transported. The properties of the former are listed in COMMON block PART and of the latter in COMMON block PAPROP.


In the printout of the properties of transported particles stored in the common block TRACKR I noticed that the identity number of the particle (variable Jtrack) can be lower than -6. Which particles carry this label and where can I find their properties?


These particles are heavy fragments (heavier than 4He). When detailed transport for ions is activated, the "currently transported" ion/fragment properties are -almost always- cloned into the PART, PAPROP and THRSCM commons at index -2, in addition to its storage in common block FHEAVY under index abs(Jtrack).

Last updated: 26th of April, 2016

© FLUKA Team 2000–2022

Informativa cookies