]> git.uio.no Git - u/mrichter/AliRoot.git/blame - GEANT321/gparal/gpwriterng.F
New files for folders and Stack
[u/mrichter/AliRoot.git] / GEANT321 / gparal / gpwriterng.F
CommitLineData
fe4da5cc 1*CMZ : 26/02/96 11.38.47 by S.Ravndal
2*-- Author :
3C------------------------------------------------------------------------
4C gpwriterng( lunwrite, filename, ierr )
5C
6C Function: write out the state of the pseudo random number
7C generator on all the nodes into a file.
8C
9c A convention: if lunwrite is >= 0, use that unit.
10c If not, create a new file called <filename>
11C
12C Possible error codes:
13c ierr= -102 The number of seeds required for a subsequence of
14c the RNG (numperseq) is more than allocated
15c in the array iseedrng (SEEDS_PER_SEQ)
16c
17C called by: <USER> (if PARALLEL switch is used)
18C------------------------------------------------------------------------
19#if defined(CERNLIB_PARA)
20 subroutine gpwriterng( lunwrite, filename, ierr )
21 implicit none
22 integer lunwrite, ierr
23 character filename*(*)
24
25#include "geant321/mpifinc.inc"
26#include "geant321/multseeds.inc"
27 integer numprocs, nrank, nleader
28 integer MAXNODES, SEEDS_PER_SEQ
29 parameter (MAXNODES=4096)
30 character*12 chNameRng
31
32c In order to accomodate RANMAR, which has the largest table of seeds.
33 parameter (SEEDS_PER_SEQ=103)
34
35c For RANECU it would be enough: (SEEDS_PER_SEQ=2).
36c For ranlux parameter (SEEDS_PER_SEQ= 25)
37
38 integer myseeds(SEEDS_PER_SEQ)
39 integer iseedrng( SEEDS_PER_SEQ, MAXNODES )
40c version of the seed file format
41 real version
42 integer nsubseq, numperseq, nperline
43 integer lunwr, lunerr
44 integer isubseq, inumb, imax, ino
45 data version / 1.0 /
46
47 if (lunwrite .lt. 0) then
48c Default number
49 lunwr= 74
50 open (unit=lunwr, file=filename )
51 else
52 lunwr= lunwrite
53 endif
54
55c Make sure to go to the start of the file
56c
57 rewind( lunwr )
58#if defined(CERNLIB_PARA_RANECU)
59c -----------------------------------------------------------------
60c The RANECU pseudo random number generator, used by GEANT's GRNDM.
61c -----------------------------------------------------------------
62#if !defined(CERNLIB_PARA_TASKRNG)
63c Currently the number of sequences is the number of processors!
64 call gprocs( numprocs, nrank, nleader )
65 nsubseq= numprocs
66
67 if( numprocs .gt. MAXNODES ) then
68 write(*, *) 'GPwriteRng: ERROR Too many nodes ', numprocs
69 ierr= -101
70 goto 9999
71 endif
72
73#endif
74 chnamerng= 'RANECU'
75 numperseq= 2 ! 2 "seed" integers per RANECU sequence
76 nperline= 2 ! 2 numbers per line
77#endif
78#if defined(CERNLIB_PARA_RANMAR)
79 chnamerng= 'RANMAR'
80 numperseq= 103 ! 103 "seed" integers per RANMAR sequence
81 nperline= 5 ! 5 numbers per line
82#endif
83#if defined(CERNLIB_PARA_RANLUX)
84 chnamerng= 'RANLUX'
85 numperseq= 25 ! 25 "seed" integers per RANMAR sequence
86 nperline= 5 ! 5 numbers per line
87#endif
88
89c "Gather" all seeds to node 0
90c
91#if defined(CERNLIB_PARA_RANECU)
92#if !defined(CERNLIB_PARA_TASKRNG)
93c In this version there is one sequence per node
94 call grndmq( myseeds(1), myseeds(2), iseqnc, 'G' )
95
96 if (numperseq .gt. SEEDS_PER_SEQ ) then
97 ierr= -102
98 goto 9999
99 endif
100
101c The following has all nodes send their seed, and node 0 collect them.
102c It should work if numperseq <= SEEDS_PER_SEQ
103c
104 call MPI_Gather( myseeds, numperseq, MPI_INTEGER, iseedrng,
105 $ SEEDS_PER_SEQ, MPI_INTEGER, 0, MPI_COMM_WORLD, ierr )
106c
107 if ( ierr .gt. 0 ) then
108 write( lunerr, '(a,i,a)' ) 'GpWr(iteRng)Seeds: Error ', ierr,
109 $ ' in Mpi_gather '
110 goto 9999
111 endif
112#endif
113#endif
114c Write out the header and then all the seeds, on node 0 only !!
115c
116 if ( nrank .eq. 0 ) then
117 write(lunwr, 900 ) 'Version ', version,
118 $ ' of pRNG seed file for parallel Geant '
119
120 write(lunwr, 905) 'RNG ', chNameRng,
121 $ ' Identity of pseudorandom Number generator '
122 write(lunwr, 910) 'SUBSEQ ', nsubseq,
123 $ ' Number of subsequences '
124 write(lunwr, 910) 'NOPERSEQ ', numperseq,
125 $ ' Numbers per subsequence '
126 write(lunwr, 910) 'NPERLINE ', nperline,
127 $ ' Numbers per line '
128 write(lunwr, 920) 'ENDPROLOG'
129
130
131 DO isubseq= 1, nsubseq
132 write(lunwr, 930 ) ' Subsequence ' , isubseq
133 DO inumb= 1, numperseq, nperline
134 imax=max(inumb+nperline-1,numperseq)
135 write( lunwr, 940 ) ( iseedrng( ino, isubseq ),
136 $ ino=inumb, imax)
137 ENDDO
138 ENDDO
139
140 if (lunwrite .lt. 0) then
141 close (unit=lunwr)
142 endif
143
144 endif
145
146 900 format( a8, f5.2, a )
147 905 format( a7, a12, a )
148 910 format( a9, i6, a )
149 920 format( a )
150 930 format( a14, i6 )
151 940 format( 8i15 )
152
153
1549999 continue
155
156 return
157 end
158#endif