summaryrefslogtreecommitdiff
path: root/Dragon/src/CPOMAR.f
blob: fa21356349d0b0fed6c2739b70aa2697761757a0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
*DECK CPOMAR
      SUBROUTINE CPOMAR(IPEDIT,NGROUP,NMERGE,NL    ,NIFISS,NEDMAC,
     >                  HVECT ,IVECT ,NPROC ,ILEAKS,DXSMAC,DSCMAC,
     >                  EMJMAC,DISFC ,IFCDIS,DISFAC )
*
*-----------------------------------------------------------------------
*
*Purpose:
* Get macroscopic cross section from IPEDIT.
*
*Copyright:
* Copyright (C) 2007 Ecole Polytechnique de Montreal
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
*Author(s): G. Marleau
*
*Parameters: input
* IPEDIT  pointer to the edit.
* NGROUP  number of groups condensed.
* NMERGE  number of regions merged.
* NL      number of Legendre orders.
* NIFISS  number of fissile isotopes.
* NEDMAC  number of extra edit vectors.
* HVECT   name of additional xs.
* IVECT   location of additional xs.
* NPROC   number of microscopic xs to process.
* ILEAKS  leak calculation:
*         = 0 no leakage;
*         = 1 homogeneous leakage coefficients;
*         = 2 directional leakage coefficients.
*
*Parameters: output
* DXSMAC  averaged region/group x-s.
* DSCMAC  scattering rates.
* DISFC   disadvantage factor.
* EMJMAC  energy per fission.
* IFCDIS  discontinuity factor present (1) or absent.
* DISFAC  discontinuity factors.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
      IMPLICIT NONE
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR)      IPEDIT
      INTEGER          NGROUP,NMERGE,NL,NIFISS,NEDMAC,IVECT(NEDMAC),
     >                 NPROC,ILEAKS
      CHARACTER        HVECT(NEDMAC)*8
      REAL             DISFC(NGROUP),
     >                 EMJMAC(NMERGE)
      DOUBLE PRECISION DXSMAC(NGROUP,NPROC,NMERGE),
     >                 DSCMAC(NGROUP,NGROUP,NL,NMERGE)
      INTEGER          IFCDIS
      DOUBLE PRECISION DISFAC(2,NGROUP,3)
*----
*  LOCAL PARAMETERS
*----
      TYPE(C_PTR)      JPEDIT,KPEDIT
      INTEGER          NDPROC
      PARAMETER       (NDPROC=20)
      INTEGER          IGR,IED,IXSR,JXSR,KXSR,IMRG,IFIS,ILOCED,
     >                 IL,IPOSIT,JGR1,JGR2,JGR,ILCMLN,ITYLCM
      CHARACTER        CM*2
      INTEGER          IDIR,IPL,IEL
      REAL             TEMP(6)
*----
*  ALLOCATABLE ARRAYS
*----
      INTEGER, ALLOCATABLE, DIMENSION(:) :: IJJ,NJJ
      REAL, ALLOCATABLE, DIMENSION(:) :: SCATC
      DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:) :: DNUFI
*----
*  SCRATCH STORAGE ALLOCATION
*   SCATC   compress scattering data.
*   IJJ     position of first diffusion group.
*   NJJ     number of diffusion group.
*   DNUFI   fission source.
*----
      ALLOCATE(IJJ(NMERGE),NJJ(NMERGE))
      ALLOCATE(SCATC(NMERGE*NGROUP))
      ALLOCATE(DNUFI(NMERGE,NIFISS+1))
*----
*  INITIALIZE REACTION RATE VECTOR
*----
      DXSMAC(:NGROUP,:NPROC,:NMERGE)=0.0D0
      DSCMAC(:NGROUP,:NGROUP,:NL,:NMERGE)=0.0D0
      DNUFI(:NMERGE,:NIFISS+1)=0.0D0
*----
*  READ ALL CROSS SECTION FROM IPEDIT EXCEPT CHI
*----
      CALL LCMLEN(IPEDIT,'FLUXDISAFACT',ILCMLN,ITYLCM)
      IF(ILCMLN.EQ.NGROUP) THEN
        CALL LCMGET(IPEDIT,'FLUXDISAFACT',DISFC)
      ELSE
        DISFC(:NGROUP)=0.0
      ENDIF
      JPEDIT=LCMGID(IPEDIT,'GROUP')
      DO 100 IGR=1,NGROUP
        KPEDIT=LCMGIL(JPEDIT,IGR)
        IF(NEDMAC.GT.0) THEN
          DO 110 IED=1,NEDMAC
            IXSR=IVECT(IED)
            IF(IXSR.GT.0) THEN
              CALL LCMGET(KPEDIT,HVECT(IED),SCATC)
              DO 111 IMRG=1,NMERGE
                DXSMAC(IGR,IXSR,IMRG)=DBLE(SCATC(IMRG))
 111          CONTINUE
            ENDIF
 110      CONTINUE
        ENDIF
        IXSR=NDPROC+NL+1
        CALL LCMLEN(KPEDIT,'OVERV',ILCMLN,ITYLCM)
        IF(ILCMLN.EQ.NMERGE) THEN
          CALL LCMGET(KPEDIT,'OVERV',SCATC)
          DO 120 IMRG=1,NMERGE
            DXSMAC(IGR,IXSR,IMRG)=DBLE(SCATC(IMRG))
 120      CONTINUE
        ENDIF
        IXSR=1
        CALL LCMGET(KPEDIT,'NTOT0',SCATC)
        DO 130 IMRG=1,NMERGE
          DXSMAC(IGR,IXSR,IMRG)=DBLE(SCATC(IMRG))
 130    CONTINUE
        IXSR=2
        CALL LCMGET(KPEDIT,'TRANC',SCATC)
        DO 170 IMRG=1,NMERGE
          DXSMAC(IGR,IXSR,IMRG)=DBLE(SCATC(IMRG))
 170    CONTINUE
        IF(IFCDIS .EQ. 1) THEN
          CALL LCMLEN(KPEDIT,'ADFGENERAL',ILCMLN,ITYLCM)
          IF(ILCMLN .EQ. 6) THEN
            CALL LCMGET(KPEDIT,'ADFGENERAL',TEMP)
            IEL=0
            DO  IDIR=1,3
              DO  IPL=1,2
                IEL=IEL+1
                DISFAC(IPL,IGR,IDIR)=DBLE(TEMP(IEL))
              ENDDO
            ENDDO
          ELSE
            IFCDIS=0
          ENDIF
        ENDIF
        IXSR=16
        CALL LCMGET(KPEDIT,'FLUX-INTG',SCATC)
        DO 190 IMRG=1,NMERGE
          DXSMAC(IGR,IXSR,IMRG)=DBLE(SCATC(IMRG))
 190    CONTINUE
        IF(NIFISS.GT.0) THEN
          IXSR=3
          JXSR=16
          CALL LCMGET(KPEDIT,'NUSIGF',SCATC)
          ILOCED=1
          DO 150 IFIS=1,NIFISS
            DO 151 IMRG=1,NMERGE
              DXSMAC(IGR,IXSR,IMRG)=DXSMAC(IGR,IXSR,IMRG)
     >          +DBLE(SCATC(ILOCED))
              DNUFI(IMRG,IFIS)=DNUFI(IMRG,IFIS)
     >          +DBLE(SCATC(ILOCED))*DXSMAC(IGR,JXSR,IMRG)
              ILOCED=ILOCED+1
 151        CONTINUE
 150      CONTINUE
          IXSR=4
          CALL LCMGET(KPEDIT,'NFTOT',SCATC)
          DO 153 IMRG=1,NMERGE
            DXSMAC(IGR,IXSR,IMRG)=DXSMAC(IGR,IXSR,IMRG)
     >        +DBLE(SCATC(IMRG))
 153      CONTINUE
        ENDIF
        IXSR=NDPROC
        DO 200 IL=1,NL
          IXSR=IXSR+1
          WRITE (CM,'(I2.2)') IL-1
          CALL LCMGET(KPEDIT,'SCAT'//CM,SCATC)
          CALL LCMGET(KPEDIT,'NJJS'//CM,NJJ)
          CALL LCMGET(KPEDIT,'IJJS'//CM,IJJ)
          IPOSIT=0
          DO 210 IMRG=1,NMERGE
            JGR2=IJJ(IMRG)
            JGR1=JGR2-NJJ(IMRG)+1
            DO 211 JGR=JGR2,JGR1,-1
              IPOSIT=IPOSIT+1
              DSCMAC(IGR,JGR,IL,IMRG)=DBLE(SCATC(IPOSIT))
              DXSMAC(JGR,IXSR,IMRG)=DXSMAC(JGR,IXSR,IMRG)
     >                             +DSCMAC(IGR,JGR,IL,IMRG)
 211        CONTINUE
 210      CONTINUE
 200    CONTINUE
        IF(ILEAKS.EQ.1) THEN
          IXSR=17
          CALL LCMGET(KPEDIT,'DIFF',SCATC)
          DO 180 IMRG=1,NMERGE
            IF(SCATC(IMRG).GT.0.0) THEN
              DXSMAC(IGR,IXSR,IMRG)=1.0D0/(3.0D0*DBLE(SCATC(IMRG)))
            ENDIF
 180      CONTINUE
        ELSE IF(ILEAKS.EQ.2) THEN
          IXSR=17
          CALL LCMGET(KPEDIT,'DIFF',SCATC)
          DO 181 IMRG=1,NMERGE
            IF(SCATC(IMRG).GT.0.0) THEN
              DXSMAC(IGR,IXSR,IMRG)=1.0D0/(3.0D0*DBLE(SCATC(IMRG)))
            ENDIF
 181      CONTINUE
          IXSR=18
          CALL LCMGET(KPEDIT,'DIFFX',SCATC)
          DO 182 IMRG=1,NMERGE
            IF(SCATC(IMRG).GT.0.0) THEN
              DXSMAC(IGR,IXSR,IMRG)=1.0D0/(3.0D0*DBLE(SCATC(IMRG)))
            ENDIF
 182      CONTINUE
          IXSR=19
          CALL LCMGET(KPEDIT,'DIFFY',SCATC)
          DO 183 IMRG=1,NMERGE
            IF(SCATC(IMRG).GT.0.0) THEN
              DXSMAC(IGR,IXSR,IMRG)=1.0D0/(3.0D0*DBLE(SCATC(IMRG)))
            ENDIF
 183      CONTINUE
          IXSR=20
          CALL LCMGET(KPEDIT,'DIFFZ',SCATC)
          DO 184 IMRG=1,NMERGE
            IF(SCATC(IMRG).GT.0.0) THEN
              DXSMAC(IGR,IXSR,IMRG)=1.0D0/(3.0D0*DBLE(SCATC(IMRG)))
            ENDIF
 184      CONTINUE
        ELSE
          IXSR=17
          JXSR=1
          IF(NL.GE.2) THEN
            KXSR=NDPROC+2
            DO 185 IMRG=1,NMERGE
              DXSMAC(IGR,IXSR,IMRG)=DXSMAC(IGR,JXSR,IMRG)
     >                             -DXSMAC(IGR,KXSR,IMRG)
 185        CONTINUE
          ELSE
            DO 186 IMRG=1,NMERGE
              DXSMAC(IGR,IXSR,IMRG)=DXSMAC(IGR,JXSR,IMRG)
 186        CONTINUE
          ENDIF
        ENDIF
 100  CONTINUE
*----
*  PROCESS CHI IF REQUIRED
*----
      IF(NIFISS.GT.0) THEN
        DO 160 IGR=1,NGROUP
          KPEDIT=LCMGIL(JPEDIT,IGR)
          IXSR=5
          CALL LCMGET(KPEDIT,'CHI',SCATC)
          ILOCED=1
          DO 161 IFIS=1,NIFISS
            DO 162 IMRG=1,NMERGE
              DXSMAC(IGR,IXSR,IMRG)=DXSMAC(IGR,IXSR,IMRG)
     >          +DBLE(SCATC(ILOCED))*DNUFI(IMRG,IFIS)
              ILOCED=ILOCED+1
 162        CONTINUE
 161      CONTINUE
 160    CONTINUE
      ENDIF
*----
*  FIND TOTAL ENERGY PRODUCTION
*----
      JXSR=16
      EMJMAC(:NMERGE)=0.0
      DO 251 IGR=1,NGROUP
        KPEDIT=LCMGIL(JPEDIT,IGR)
        CALL LCMLEN(KPEDIT,'H-FACTOR',ILCMLN,ITYLCM)
        IF(ILCMLN.EQ.NMERGE) THEN
          CALL LCMGET(KPEDIT,'H-FACTOR',SCATC)
          DO 250 IMRG=1,NMERGE
            EMJMAC(IMRG)=EMJMAC(IMRG)+REAL(DXSMAC(IGR,JXSR,IMRG))*
     >      SCATC(IMRG)*1.0E18
 250      CONTINUE
        ENDIF
 251  CONTINUE
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(DNUFI)
      DEALLOCATE(SCATC)
      DEALLOCATE(NJJ,IJJ)
      RETURN
      END