TABLE OF CONTENTS
- 1. /VolumeElements
- 1.1. VolumeElements/tVolumeElements
- 1.2. VolumeElements/tVE
- 1.3. VolumeElements/VolumeElements_boxSize
- 1.4. VolumeElements/VolumeElements_INIT
- 1.5. VolumeElements/VolumeElements_CLEAR_Pert
- 1.6. VolumeElements/VolumeElements_CLEAR_Real
- 1.7. VolumeElements/VolumeElements_SETUP_Pert
- 1.8. VolumeElements/VolumeElements_SETUP_Real
- 1.9. VolumeElements/VolumeElements_Statistics
- 1.10. VolumeElements/FindNextVE_RealPert
- 1.11. VolumeElements/FindNextVE_RealReal
- 1.12. VolumeElements/VolumeElements_InitGetPart_RealPert
- 1.13. VolumeElements/VolumeElements_InitGetPart_RealReal
- 1.14. VolumeElements/VolumeElements_GetPart_RealPert
- 1.15. VolumeElements/VolumeElements_GetPart_RealReal
- 1.16. VolumeElements/GetEnsInd_Real
- 1.17. VolumeElements/GetEnsInd_Pert
- 1.18. VolumeElements/VolumeElements_NukSearch
- 1.19. VolumeElements/VolumeElements_3Body
- 1.19.1. VolumeElements_3Body/FindFirst3
- 1.19.2. VolumeElements_3Body/FindSecond3
- 1.19.3. VolumeElements_3Body/CheckFound3()
/VolumeElements [ Modules ]
NAME
module VolumeElements
PURPOSE
This module defines all stuff necessary to seperate the whole interaction volume in different "volume elements" (also called "VE-cells")
This is necessary for the implementation of "local ensemble" runs.
INPUTS
(none)
VolumeElements/tVolumeElements [ Types ]
[ Top ] [ VolumeElements ] [ Types ]
PURPOSE
Discretize the whole possible space volume and hold in a 3D array Lists of particles, which are at the moment in a given coordinate cell
NOTES
Die Arrays "zCoordFilled_xxx" sollen eine Abkürzung für die Loops über die z-Koordinate darstellen: Wenn für eine z-Koordinate für keine x- oder y-Zelle Einträge vorhanden sind, dann kann man diese z-Koord auch ganz schnell überspringen!
Denkbar wäre auch eine Verbesserung durch die Einführung von
integer, dimension(3,2) :: iRange_Used
wobei alle Schleifen statt über
iRange(i,1)..iRange(i,2)
über
iRange_Used(i,1)..iRange_Used(i,2)
laufen würden. Hierbei können aber nur zusammenhängende Bereiche benutzt werden, wodurch das benutzte Modell wiederum starken Auftrieb bekommt!!!
SOURCE
type tVolumeElements type(tParticleList), DIMENSION(:,:,:), ALLOCATABLE :: VE_real ! ~ 100 MB type(tParticleList), DIMENSION(:,:,:), ALLOCATABLE :: VE_pert ! ~ 100 MB real, dimension(3) :: Delta real, dimension(3,2) :: Range integer, dimension(3,2) :: iRange logical, dimension(:), ALLOCATABLE :: zCoordFilled_real logical, dimension(:), ALLOCATABLE :: zCoordFilled_pert end type tVolumeElements
VolumeElements/tVE [ Global module-variables ]
[ Top ] [ VolumeElements ] [ Global module-variables ]
PURPOSE
The one and only instance of a tVolumeElements-object
SOURCE
type(tVolumeElements),save :: tVE
VolumeElements/VolumeElements_boxSize [ Functions ]
[ Top ] [ VolumeElements ] [ Functions ]
PURPOSE
Returns size of box used for the local ensemble method, unit of fm^3
OUTPUT
(function value)
VolumeElements/VolumeElements_INIT [ Subroutines ]
[ Top ] [ VolumeElements ] [ Subroutines ]
NAME
subroutine VolumeElements_INIT()
PURPOSE
This routine initializes the tVE-instance. Initial sizes are set and all memory allocation is done.
NOTES
The maximum volume size and also the volume elements size is still hard wired. maybe some more sophisticated init should be realized.
VolumeElements/VolumeElements_CLEAR_Pert [ Subroutines ]
[ Top ] [ VolumeElements ] [ Subroutines ]
NAME
subroutine VolumeElements_CLEAR_Pert()
PURPOSE
This routine resets the tVE-instance for perturbative particles
VolumeElements/VolumeElements_CLEAR_Real [ Subroutines ]
[ Top ] [ VolumeElements ] [ Subroutines ]
NAME
subroutine VolumeElements_CLEAR_Real()
PURPOSE
This routine resets the tVE-instance for real particles.
VolumeElements/VolumeElements_SETUP_Pert [ Subroutines ]
[ Top ] [ VolumeElements ] [ Subroutines ]
NAME
subroutine VolumeElements_SETUP_Pert(PartVec)
PURPOSE
Build up the tVE structure of perturbative particles.
In order to introduce some randomness, particles are prepended/appended to the list according the outcome of a random generator.
VolumeElements/VolumeElements_SETUP_Real [ Subroutines ]
[ Top ] [ VolumeElements ] [ Subroutines ]
NAME
subroutine VolumeElements_SETUP_Real(PartVec)
PURPOSE
Build up the tVE structure of real particles.
In order to introduce some randomness, particles are prepended/appended to the list according the outcome of a random generator.
VolumeElements/VolumeElements_Statistics [ Subroutines ]
[ Top ] [ VolumeElements ] [ Subroutines ]
NAME
subroutine VolumeElements_Statistics
PURPOSE
This is a routine to produce some statistical informations about the elements in the tVE instance.
This routine is only for trial/documentational purposes.
VolumeElements/FindNextVE_RealPert [ Functions ]
[ Top ] [ VolumeElements ] [ Functions ]
NAME
logical function FindNextVE_RealPert
PURPOSE
This routine searches for the next volume element with non-vanishing number of real- and perturbative-test-particles. It remembers the values of the last call and finds really the "next" cell.
It proceeds via first increasing the x- and y-coordinates and then stepping to the next z-coordinate.
INPUTS
- the static stored array iPart(1:3)
OUTPUT
- the static stored array iPart(1:3) (changed!)
- function value: .false. -> no more tVE-cells possible
VolumeElements/FindNextVE_RealReal [ Functions ]
[ Top ] [ VolumeElements ] [ Functions ]
NAME
logical function FindNextVE_RealReal
PURPOSE
This routine searches for the next volume element with non-vanishing number of real-test-particles. It remembers the values of the last call and finds really the "next" cell.
It proceeds via first increasing the x- and y-coordinates and then stepping to the next z-coordinate.
INPUTS
- the static stored array iPart(1:3)
OUTPUT
- the static stored array iPart(1:3) (changed!)
- function value: .false. -> no more tVE-cells possible
VolumeElements/VolumeElements_InitGetPart_RealPert [ Subroutines ]
[ Top ] [ VolumeElements ] [ Subroutines ]
NAME
subroutine VolumeElements_InitGetPart_RealPert
PURPOSE
initialize the "GetPart_RealPert"-routines
NOTES
this routine sets the x-,y-,z-indizes in such a way, that a call to "FindNextVE_RealPert" will start at the very first cell.
VolumeElements/VolumeElements_InitGetPart_RealReal [ Subroutines ]
[ Top ] [ VolumeElements ] [ Subroutines ]
NAME
subroutine VolumeElements_InitGetPart_RealReal
PURPOSE
initialize the "GetPart_RealPert"-routines
NOTES
this routine sets the x-,y-,z-indizes in such a way, that a call to "FindNextVE_RealReal" will start at the very first cell.
VolumeElements/VolumeElements_GetPart_RealPert [ Functions ]
[ Top ] [ VolumeElements ] [ Functions ]
NAME
logical function VolumeElements_GetPart_RealPert(Part1, Part2, nRealPart, iEns1,iInd1, iEns2,iInd2)
INPUTS
OUTPUT
- type(particle), POINTER :: Part1, Part2 -- real and perturbative particle
- integer :: nRealPart -- number of real particles in VE-cell
- integer :: iEns1,iInd1 -- coordinates of particle1 (real)
- integer :: iEns2,iInd2 -- coordinates of particle2 (pert)
PURPOSE
This routine finds the next (possibly colliding?) pair of one perturbative particle and one real particle in the actual VE-cell.
If one stepped over all pert. particles in the given VE-cell, the next cell is choosen (cf. FindNextVE) and everything goes on.
If no "next VE-cell" is possible any more, the routine returns .false. as failure-indicator. (Otherwise always .true. is returned.)
NOTES
- actually for a choosen VE-cell it returns the particle pairs (P_1,R_1), (P_2,R_2), ... (P_nPert, R_xxx) If there are more real particles than pert particles, "R_xxx" stands for "R_nPert". Otherwise, ie. if we have more pert particles than real particles, the loop restarts for the real particles (P_nReal,R_nReal), (P_nReal+1,R_1), ...
VolumeElements/VolumeElements_GetPart_RealReal [ Functions ]
[ Top ] [ VolumeElements ] [ Functions ]
NAME
logical function VolumeElements_GetPart_RealReal(Part1, Part2, nRealPart, iEns1,iInd1, iEns2,iInd2)
INPUTS
OUTPUT
- type(particle), POINTER :: Part1, Part2 -- real particles
- integer :: nRealPart -- number of real particles in VE-cell
- integer :: iEns1,iInd1 -- coordinates of particle1
- integer :: iEns2,iInd2 -- coordinates of particle2
PURPOSE
This routine finds the next (possibly colliding?) pair of two real particles in the actual VE-cell.
If one stepped over all real particles in thi given VE-cell, the next cell s choosen (cf. FindNextVE_REalReal) and everything goes on.
If no "next VE-cell" is possible any more, the routine returns .false. as failure-indicator. (Otherwise always .true. is returned.)
NOTES
VolumeElements/GetEnsInd_Real [ Subroutines ]
[ Top ] [ VolumeElements ] [ Subroutines ]
NAME
subroutine GetEnsInd_Real(pPart, iEns,iInd)
PURPOSE
Doing the pointer arithmetic for the real particles vector
INPUTS
OUTPUT
- integer :: iEns, iInd --- ensemble and index of particle
VolumeElements/GetEnsInd_Pert [ Subroutines ]
[ Top ] [ VolumeElements ] [ Subroutines ]
NAME
subroutine GetEnsInd_Pert(pPart, iEns,iInd)
PURPOSE
Doing the pointer arithmetic for the pert particles vector
INPUTS
OUTPUT
- integer :: iEns, iInd --- ensemble and index of particle
VolumeElements/VolumeElements_NukSearch [ Subroutines ]
[ Top ] [ VolumeElements ] [ Subroutines ]
NAME
subroutine VolumeElements_NukSearch(partIn,RadiusNukSearch,proton1,proton2,neutron1,neutron2,FlagOK)
PURPOSE
This routine searches for two protons and two neutrons given in the "volume elements particle vector array" "VE_real" in the vicinty of the particle given by "partIn".
NOTES
we are looking for 2 protons and 2 neutrons, i.e. for 4 nucleons, while only 2 nucleons are necessary: possible combinations are p+p, p+n, n+n.
INPUTS
- type(particle) :: partIn
- real :: RadiusNukSearch
OUTPUT
- type(particle), pointer :: proton1,proton2 -- Closest protons
- type(particle), pointer :: neutron1,neutron2 -- Closest neutrons
- logical :: FlagOK
VolumeElements/VolumeElements_3Body [ Functions ]
[ Top ] [ VolumeElements ] [ Functions ]
NAME
logical function VolumeElements_3Body(Decay3Body, isSameBool, doInit, iEns,iInd, Part1,Part2,Part3, scaleFak, mode)
PURPOSE
Find a triple of particles corresponding the given needs.
This routine starts with one cell, loops over all possibilities, then switchs to the next cell, and so on, until no triple can be found any more. Then the routine returns .false., otherwise .true.
INPUTS
- type(tDecay3Body) :: Decay3Body -- the decay to study
- integer :: isSameBool -- tricky number to hold the info, which particles are identical
- integer :: mode -- select how nDo is choosen
OUTPUT
- integer, dimension(1:3) :: iEns -- coordinate 1 of the 3 particles
- integer, dimension(1:3) :: iInd -- coordinate 2 of the 3 particles
- type(particle), POINTER :: Part1, Part2, Part3 -- the particles
- real :: scaleFak -- the factor nPossible/nDo
NOTES
possible values for mode:
- 1: nDo = nMax
- 2: nDo = nMin
VolumeElements_3Body/FindFirst3 [ Functions ]
[ Top ] [ VolumeElements_3Body ] [ Functions ]
NAME
logical function FindFirst3()
PURPOSE
This internal routine has two purposes:
- build up the particle lists L1, L2, L3 from the particles in the cell
- return the first possible particle triple
OUTPUT
The return vaule is .true., if everything went smoothly. In addition, this routine sets the following internal variables:
- Part1, Part2, Part3
- pNode1, pNode2, pNode3 show to the next possible triple.
- nMax indicates the number of triples to extract
- scaleFak = nPossible/nMax
This routine ensures, that Part1, Part2, Part3 do not accidentally point to a same particle.
NOTES
- a combinatorical factor is included in nPossible for indistinguishable particles
- Particles are added to the lists randomly at the beginning or the end.
VolumeElements_3Body/FindSecond3 [ Functions ]
[ Top ] [ VolumeElements_3Body ] [ Functions ]
NAME
logical function FindSecond3()
PURPOSE
This routine gives the 'next' triple. It loops over L1, L2 and L3, until it has genarated 'nDo' triples. This routine ensures, that Part1, Part2, Part3 do not accidentally point to a same particle.
VolumeElements_3Body/CheckFound3() [ Functions ]
[ Top ] [ VolumeElements_3Body ] [ Functions ]
NAME
logical function CheckFound3()
PURPOSE
This routine checks, whether the found triple is really according the input wishes. This is necessary, since a successfully performed 3->1 collision should delete the incoming mesons.