--- Common blocks and information on particle histories


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

A:
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), and
the stack of radioactive decays (RDPSTK).




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

A:
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

      LOUSE   (NPFLKA)  = JTRACK
      SPAREK (1,NPFLKA) = ETRACK
      SPAREK (2,NPFLKA) = ZTRACK

and leave the other user variables untouched

      DO 100 ISPR = 3, MKBMX1
         SPAREK (ISPR,NPFLKA) = SPAUSR (ISPR)
  100 CONTINUE
      DO 200 ISPR = 1, MKBMX2
         ISPARK (ISPR,NPFLKA) = ISPUSR (ISPR)
  200 CONTINUE

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):

      LLOUSE = LOUSE  (NPFLKA)
      DO 96 ISPR = 1, MKBMX1
         SPAUSR (ISPR) = SPAREK (ISPR,NPFLKA)
   96 CONTINUE
      DO 98 ISPR = 1, MKBMX2
         ISPUSR (ISPR) = ISPARK (ISPR,NPFLKA)
   98 CONTINUE

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.




Q:
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)?

A:
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).




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

A:
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.




Q:
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?

A:
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).

top / back
sponsored by: INFN and CERN updated: