5 * Revision 1.1.1.1 1995/10/24 10:21:31 cernlib
9 #include "geant321/pilot.h"
10 *CMZ : 3.21/02 29/03/94 15.41.22 by S.Giani
14 *. ******************************************************************
15 *. * Creates PHXS bank containing x-section constants *
17 *. * ==>CALLED BY : GPHYSI *
18 *. * AUTHOR : J. CHWASTOWSKI *
20 *. ******************************************************************
22 * The photoelectric effect x-section bank
23 * 1 - Number of elements neded to create medium = NZ
24 * 2 <-> NZ+1 - Z of elements
26 * 2+2*NZ <-> 3*NZ+1 - weight of x-section constants
27 * 3*NZ+2 <-> top - X-section constants
28 #include "geant321/gcbank.inc"
29 #include "geant321/gcphys.inc"
30 #include "geant321/gcjloc.inc"
31 #include "geant321/gconsp.inc"
32 #include "geant321/gcunit.inc"
33 #include "geant321/gcpmxz.inc"
34 #include "geant321/gcphxs.inc"
35 #include "geant321/gc10ev.inc"
36 CHARACTER*1 CHSHEL, CHGROU
37 DIMENSION EUP(MAXINT),TMP(MAXPOW,MAXINT),ESHL(24)
38 PARAMETER (NXSB=73,NXSBF=70)
41 * Check Z range of validity for Sandia parametrization
42 IF(Z.GE.1.AND.Z.LE.MAXELZ) THEN
44 * Find number of elements neded to create current medium
46 * Is this medium a mixture ?
52 ZCUR = Q(JMIXT+NMIX+I)
53 IF(ZCUR.NE.INT(ZCUR)) THEN
55 * When Z is non integer you need 2 elements
68 ZCUR = Q(JMIXT+NMIX+I)
71 IF(ZCUR.NE.HZCUR) THEN
72 WS(1+2*NZ+K) = (HZCUR+1.-ZCUR)*Q(JMIXT+2*NMIX+I)
75 WS(1+2*NZ+K) = (ZCUR-HZCUR)*Q(JMIXT+2*NMIX+I)
77 WS(1+2*NZ+K) = Q(JMIXT+2*NMIX+I)
82 * Do Z values repeat ?
91 * WS(1+NZ+I) = WS(1+NZ+I)+WS(1+NZ+J)
92 WS(1+2*NZ+I) = WS(1+2*NZ+I)+WS(1+2*NZ+J)
99 * Now you can book a pht. eff. x-sec. constant bank and hang it as
100 * a first struc. link from JPHOT.
101 * From this bank you hang the banks for each separate Z !!!
103 IF(K.EQ.1) NW = NXSB+2
104 CALL MZBOOK(IXCONS,JPHXS,JPHOT,-1,'PHXS',NZ,NZ,NW,3,0)
105 * Fill JPHXS bank and calculates the weights
110 IF(WS(1+I).GT.0.0) THEN
111 Q(JPHXS+1+K) = WS(1+I)
112 * Q(JPHXS+1+K+NZN) = WS(1+I+NZ)
113 Q(JPHXS+1+K+2*NZN) = WS(1+I+2*NZ)
118 * Current medium consists of one "element"
122 IF(MOD(ZCUR,HZCUR).EQ.0) THEN
123 * Now you can book a pht. eff. x-sec. constant bank and hang it as
124 * a first struc. link from JPHOT.
126 CALL MZBOOK(IXCONS,JPHXS,JPHOT,-1,'PHXS',1,1,NW,3,0)
131 * Somebody is cheating. We need two elements
134 CALL MZBOOK(IXCONS,JPHXS,JPHOT,-1,'PHXS',2,2,NW,3,0)
138 Q(JPHXS+6) = (HZCUR+1.-ZCUR)
139 Q(JPHXS+7) = (ZCUR-HZCUR)
142 * We passed the bank booking phase and we can start real work
144 * Create a temporary working space
145 IBINS = 5*NZ+NZ*(MAXPOW+1)*(MAXINT+1)
159 CALL GFSHLS(ZCUR,ESHL,NSHL)
161 ESHL(I) = ESHL(I)*1.E-3
164 * Find out the interval upper limit.
167 CHSHEL=CRNGUP(I,IZ)(1:1)
168 CHGROU=CRNGUP(I,IZ)(2:2)
169 IF(CHSHEL.EQ.'I') THEN
173 ELSEIF(CHSHEL.EQ.'K') THEN
175 ELSEIF(CHSHEL.EQ.'L') THEN
176 IF(CHGROU.EQ.'1') THEN
178 ELSEIF(CHGROU.EQ.'2') THEN
180 ELSEIF(CHGROU.EQ.'3') THEN
183 CHMAIL = ' GPHXSI Error: Inconsistent data for L '
184 + //'shell. Maximum coded L3. Found shell '
185 + //'name: '//CRNGUP(I,IZ)
188 ELSEIF(CHSHEL.EQ.'M') THEN
189 IF(CHGROU.EQ.'1') THEN
191 ELSEIF(CHGROU.EQ.'2') THEN
193 ELSEIF(CHGROU.EQ.'3') THEN
195 ELSEIF(CHGROU.EQ.'4') THEN
197 ELSEIF(CHGROU.EQ.'5') THEN
200 CHMAIL = ' GPHXSI Error: Inconsistent data for M '
201 + //'shell. Maximum coded M5. Found shell '
202 + //'name: '//CRNGUP(I,IZ)
205 ELSEIF(CHSHEL.EQ.'N') THEN
206 IF(CHGROU.EQ.'1') THEN
208 ELSEIF(CHGROU.EQ.'2') THEN
210 ELSEIF(CHGROU.EQ.'3') THEN
212 ELSEIF(CHGROU.EQ.'4') THEN
214 ELSEIF(CHGROU.EQ.'5') THEN
216 ELSEIF(CHGROU.EQ.'6') THEN
218 ELSEIF(CHGROU.EQ.'7') THEN
221 CHMAIL = ' GPHXSI Error: Inconsistent data for N '
222 + //'shell. Maximum coded N7. Found shell name:'
223 + //' '//CRNGUP(I,IZ)
226 ELSEIF(CHSHEL.EQ.'O') THEN
227 IF(CHGROU.EQ.'1') THEN
229 ELSEIF(CHGROU.EQ.'2') THEN
231 ELSEIF(CHGROU.EQ.'3') THEN
233 ELSEIF(CHGROU.EQ.'4') THEN
235 ELSEIF(CHGROU.EQ.'5') THEN
238 CHMAIL = ' GPHXSI Error: Inconsistent data for O '
239 + //'shell. Maximum code O5. Found shell name:'
240 + //' '//CRNGUP(I,IZ)
243 ELSEIF(CHSHEL.EQ.'P') THEN
244 IF(CHGROU.EQ.'1') THEN
246 ELSEIF(CHGROU.EQ.'2') THEN
248 ELSEIF(CHGROU.EQ.'3') THEN
251 CHMAIL = ' GPHXSI Error: Inconsistent data for P '
252 + //'shell. Maximum coded P3. Found shell '
253 + //'name: '//CRNGUP(I,IZ)
257 READ(CRNGUP(I,IZ),'(F6.0)') EUP(I)
259 IF(EUP(I).EQ.0.0) THEN
260 WRITE(CHMAIL,'(A44,I5)') ' GPHXSI Error: Upper limit '
261 + //'= 0. Interval:',I
269 TMP(J,I) = COFS(J,I,IZ)*Q(JPHXS+1+2*NZ+N)
272 * Copy upper limits and coofficients to a work bank
288 KS = KS+(MAXINT+1)*(MAXPOW+1)
292 * WS(N) = Q(JPHXS+1+2*NZ+N)
293 * Create element x-section & final state bank
294 CALL MZBOOK(IXCONS,JPHFN,JPHXS,-N,'PHFN',0,0,IMAX*5+1,3,0)
299 * Copy energy & x-section parameters
301 Q(JPHFN+KFN) = EUP(I)
304 c Q(JPHFN+KFN) = TMP(J,I)*Q(JPHXS+1+2*NZ+N)
305 Q(JPHFN+KFN) = TMP(J,I)
309 * Get shells decay parameters
312 * Now find intervals and calculate the coofs for each
316 * Simple element so life is easy and nice
319 Q(JPHXS6) = GPOMIN(IZ)
329 Q(JPHXS6+K) = TMP(J,I)
333 NPSH = NW-5*(IMAX+1)-5
335 * More elements. It will not be so easy
336 * The following code is difficult and probably there are better solutions
337 * but I could think only about this one.
338 IPHXSP = JPHXS+2+3*NZ
339 IPIMAX = JPHXS+2+3*NZ
340 IOFFST = (MAXPOW+1)*(MAXINT+1)
341 DO 250 II = 1,NZ*(MAXINT+1)
342 * Find the interval for which the upper limit is the smallest
346 IPOINT = 5*NZ+1+(I-1)*IOFFST+K
348 WS(IEUP) = WS(IPOINT)
349 IF(WS(IEUP).LT.AMINV) AMINV = WS(IEUP)
353 IF(WS(4*NZ+I).LE.AMINV) L = L+1
356 CHMAIL = ' GPHXSI Error: Zero intervals found.'
361 Q(IPIMAX) = Q(IPIMAX)+1.
368 IPOINT = 5*NZ+1+(I-1)*IOFFST+K+J
369 c QS = QS+WS(I)*WS(IPOINT)
375 IF(L.EQ.NZ.AND.AMINV.EQ.55.E11) GO TO 260
376 * Update local pointers
379 IF(WS(IEUP).LE.AMINV) THEN
381 IF(IWS(3*NZ+I).LT.IWS(I+NZ)) THEN
382 IWS(INZ2) = IWS(INZ2)+5
383 IWS(3*NZ+I) = IWS(3*NZ+I)+1
388 * It is THE END of th x-secs. part, however you may not believe it.
394 * It just may happen that some of the energy limits are the same
396 IF(ABS(Q(IPIMAX+IENE)-Q(IPIMAX+IENE+5)).LT.
397 + Q(IPIMAX+IENE)*5E-4) THEN
398 DO 262 II=1,(NIT-IIT-1)*5
399 Q(IPIMAX+IENE+II)=Q(IPIMAX+IENE+II+5)
404 IF(IIT.LT.NIT-1) GO TO 261
406 NPSH = NW-Q(IPIMAX)*5-3*NZ-2
408 * Return unused locations in JPHXSI bank to the system
411 CALL MZPUSH(IXCONS,JPHXS,0,-NPSH,'R')
413 ELSEIF(Z.GT.100.) THEN
414 * Just in case we got called
415 CHMAIL = ' GPHXSI Error: Z > 100. No Sandia parameters. '