summaryrefslogtreecommitdiff
path: root/Trivac/src/TRISPS.f
blob: 10cd2cfa73546b42c6d4450a705d10272e98403e (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
*DECK TRISPS
      SUBROUTINE TRISPS(IPTRK,IPMACR,IPMACP,IPSYS,IMPX,NGRP,NEL,NLF,
     1 NANI,NBFIS,NALBP,LDIFF,IPR,MAT,VOL,NBMIX)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Recover the cross-section data in LCM object with pointer IPMACR,
* compute and store the corresponding Trivac system matrices for a
* simplified PN approximation (or a perturbation to the system
* matrices).
*
*Copyright:
* Copyright (C) 2005 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): A. Hebert
*
*Parameters: input
* IPTRK   L_TRACK pointer to the TRIVAC tracking information.
* IPMACR  L_MACROLIB pointer to the unperturbed cross sections.
* IPMACP  L_MACROLIB pointer to the perturbed cross sections if
*         IPR.gt.0. Equal to IPMACR if IPR=0.
* IPSYS   L_SYSTEM pointer to system matrices.
* IMPX    print parameter (equal to zero for no print).
* NGRP    number of energy groups.
* NEL     total number of finite elements.
* NLF     number of Legendre orders for the flux (even number).
* NANI    number of Legendre orders for the scattering cross sections.
* NBFIS   number of fissionable isotopes.
* NALBP   number of physical albedos per energy group.
* LDIFF   flag set to .true. to use 1/3D as 'NTOT1' cross sections.
* IPR     type of assembly:
*         =0: calculation of the system matrices;
*         =1: calculation of the derivative of these matrices;
*         =2: calculation of the first variation of these matrices;
*         =3: identical to IPR=2, but these variation are added to
*         unperturbed system matrices.
* MAT     index-number of the mixture type assigned to each volume.
* VOL     volumes.
* NBMIX   total number of material mixtures in the macrolib.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) IPTRK,IPMACR,IPMACP,IPSYS
      INTEGER IMPX,NGRP,NEL,NLF,NANI,NBFIS,NALBP,IPR,MAT(NEL),NBMIX
      REAL VOL(NEL)
      LOGICAL LDIFF
*----
*  LOCAL VARIABLES
*----
      CHARACTER TEXDIG*12,TEXT12*12,CM*2
      LOGICAL LFIS
      TYPE(C_PTR) JPMACP,KPMACP
      REAL, DIMENSION(:), ALLOCATABLE :: WORK
      REAL, DIMENSION(:,:), ALLOCATABLE :: GAMMA,SGD,ZUFIS
      REAL, DIMENSION(:,:,:), ALLOCATABLE :: CHI
      DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE :: GAR
      DOUBLE PRECISION, DIMENSION(:,:,:), ALLOCATABLE :: RCAT,RCATI,
     1 RCAT2
*----
*  SCRATCH STORAGE ALLOCATION
*----
      ALLOCATE(GAMMA(NALBP,NGRP),SGD(NBMIX,2*NLF),WORK(NBMIX*NGRP),
     1 CHI(NBMIX,NBFIS,NGRP),ZUFIS(NBMIX,NBFIS))
      ALLOCATE(RCAT(NGRP,NGRP,NBMIX),RCATI(NGRP,NGRP,NBMIX))
*----
*  PROCESS PHYSICAL ALBEDOS.
*----
      IF(NALBP.GT.0) THEN
         CALL TRIALB(IPTRK,IPMACR,IPMACP,IPSYS,NGRP,NALBP,IPR,GAMMA)
      ENDIF
*----
*  PROCESS MACROLIB INFORMATION FOR VARIOUS LEGENDRE ORDERS AND
*  INVERSION OF THE REMOVAL MATRIX.
*----
      IF(NLF.EQ.0) CALL XABORT('TRISPS: SPN APPROXIMATION REQUESTED.')
      DO 142 IL=1,NLF
      WRITE(CM,'(I2.2)') IL-1
      CALL TRIRCA(IPMACR,IPMACR,NGRP,NBMIX,NANI,LDIFF,IL,0,RCAT)
      IF(IPR.EQ.0) THEN
         DO 20 IBM=1,NBMIX
         DO 15 JGR=1,NGRP
         DO 10 IGR=1,NGRP
         RCATI(IGR,JGR,IBM)=RCAT(IGR,JGR,IBM)
   10    CONTINUE
   15    CONTINUE
         CALL ALINVD(NGRP,RCATI(1,1,IBM),NGRP,IER)
         IF(IER.NE.0) CALL XABORT('TRISPS: SINGULAR MATRIX(1).')
   20    CONTINUE
      ELSE
         ALLOCATE(RCAT2(NGRP,NGRP,NBMIX),GAR(NGRP))
         CALL TRIRCA(IPMACR,IPMACP,NGRP,NBMIX,NANI,LDIFF,IL,IPR,RCAT2)
         IF(IPR.EQ.1) THEN
            DO 62 IBM=1,NBMIX
            DO 31 JGR=1,NGRP
            DO 30 IGR=1,NGRP
            RCATI(IGR,JGR,IBM)=RCAT(IGR,JGR,IBM)
            RCAT(IGR,JGR,IBM)=RCAT2(IGR,JGR,IBM)
   30       CONTINUE
   31       CONTINUE
            CALL ALINVD(NGRP,RCATI(1,1,IBM),NGRP,IER)
            IF(IER.NE.0) CALL XABORT('TRISPS: SINGULAR MATRIX(2).')
            DO 42 JGR=1,NGRP
            RCAT2(:NGRP,JGR,IBM)=0.0D0
            DO 41 IGR=1,NGRP
            DO 40 KGR=1,NGRP
            RCAT2(IGR,JGR,IBM)=RCAT2(IGR,JGR,IBM)+RCATI(IGR,KGR,IBM)*
     1      RCAT(KGR,JGR,IBM)
   40       CONTINUE
   41       CONTINUE
   42       CONTINUE
            DO 61 JGR=1,NGRP
            GAR(:NGRP)=0.0D0
            DO 51 IGR=1,NGRP
            DO 50 KGR=1,NGRP
            GAR(IGR)=GAR(IGR)+RCAT2(IGR,KGR,IBM)*RCATI(KGR,JGR,IBM)
   50       CONTINUE
   51       CONTINUE
            DO 60 KGR=1,NGRP
            RCATI(KGR,JGR,IBM)=-GAR(KGR)
   60       CONTINUE
   61       CONTINUE
   62       CONTINUE
         ELSE IF(IPR.EQ.2) THEN
            DO 82 IBM=1,NBMIX
            DO 71 JGR=1,NGRP
            DO 70 IGR=1,NGRP
            RCATI(IGR,JGR,IBM)=RCAT(IGR,JGR,IBM)
            RCAT(IGR,JGR,IBM)=RCAT2(IGR,JGR,IBM)
            RCAT2(IGR,JGR,IBM)=RCAT(IGR,JGR,IBM)+RCATI(IGR,JGR,IBM)
   70       CONTINUE
   71       CONTINUE
            CALL ALINVD(NGRP,RCATI(1,1,IBM),NGRP,IER)
            IF(IER.NE.0) CALL XABORT('TRISPS: SINGULAR MATRIX(3).')
            CALL ALINVD(NGRP,RCAT2(1,1,IBM),NGRP,IER)
            IF(IER.NE.0) CALL XABORT('TRISPS: SINGULAR MATRIX(4).')
            DO 81 JGR=1,NGRP
            DO 80 IGR=1,NGRP
            RCATI(IGR,JGR,IBM)=RCAT2(IGR,JGR,IBM)-RCATI(IGR,JGR,IBM)
   80       CONTINUE
   81       CONTINUE
   82       CONTINUE
         ELSE IF(IPR.EQ.3) THEN
            DO 100 IBM=1,NBMIX
            DO 91 JGR=1,NGRP
            DO 90 IGR=1,NGRP
            RCAT(IGR,JGR,IBM)=RCAT(IGR,JGR,IBM)+RCAT2(IGR,JGR,IBM)
            RCATI(IGR,JGR,IBM)=RCAT(IGR,JGR,IBM)
   90       CONTINUE
   91       CONTINUE
            CALL ALINVD(NGRP,RCATI(1,1,IBM),NGRP,IER)
            IF(IER.NE.0) CALL XABORT('TRISPS: SINGULAR MATRIX(5).')
  100       CONTINUE
         ENDIF
         DEALLOCATE(GAR,RCAT2)
      ENDIF
*
      DO 141 IGR=1,NGRP
      IGMIN=IGR
      IGMAX=IGR
      DO 111 IBM=1,NBMIX
      DO 110 JGR=1,NGRP
      IF((RCAT(IGR,JGR,IBM).NE.0.0).OR.(RCATI(IGR,JGR,IBM).NE.0.0)) THEN
         IGMIN=MIN(IGMIN,JGR)
         IGMAX=MAX(IGMAX,JGR)
      ENDIF
  110 CONTINUE
  111 CONTINUE
      DO 140 JGR=IGMIN,IGMAX
      DO 120 IBM=1,NBMIX
      WORK(IBM)=REAL(RCAT(IGR,JGR,IBM))
  120 CONTINUE
      WRITE(TEXT12,'(4HSCAR,A2,2I3.3)') CM,IGR,JGR
      CALL LCMPUT(IPSYS,TEXT12,NBMIX,2,WORK)
      DO 130 IBM=1,NBMIX
      WORK(IBM)=REAL(RCATI(IGR,JGR,IBM))
  130 CONTINUE
      WRITE(TEXT12,'(4HSCAI,A2,2I3.3)') CM,IGR,JGR
      CALL LCMPUT(IPSYS,TEXT12,NBMIX,2,WORK)
  140 CONTINUE
  141 CONTINUE
  142 CONTINUE
*----
*  COMPUTE AND FACTORIZE THE DIAGONAL SYSTEM MATRICES.
*----
      DO 162 IGR=1,NGRP
      DO 150 IL=1,NLF
      WRITE(TEXT12,'(4HSCAR,I2.2,2I3.3)') IL-1,IGR,IGR
      CALL LCMGET(IPSYS,TEXT12,SGD(1,IL))
      WRITE(TEXT12,'(4HSCAI,I2.2,2I3.3)') IL-1,IGR,IGR
      CALL LCMGET(IPSYS,TEXT12,SGD(1,NLF+IL))
  150 CONTINUE
      WRITE(TEXT12,'(1HA,2I3.3)') IGR,IGR
      CALL TRIASN(TEXT12,IPTRK,IPSYS,IMPX,NBMIX,NEL,NLF,NALBP,IPR,MAT,
     1 VOL,GAMMA(1,IGR),SGD(1,1),SGD(1,1+NLF))
*----
*  PUT A FLAG IN IPSYS TO IDENTIFY NON-ZERO SCATTERING TERMS.
*----
      DO 161 IL=1,NLF
      DO 160 JGR=1,NGRP
      WRITE(TEXT12,'(4HSCAR,I2.2,2I3.3)') IL-1,IGR,JGR
      CALL LCMLEN(IPSYS,TEXT12,LENGT,ITYLCM)
      IF(LENGT.EQ.NBMIX) THEN
         WRITE(TEXT12,'(1HA,2I3.3)') IGR,JGR
         CALL LCMPUT(IPSYS,TEXT12,1,2,0.0)
      ENDIF
  160 CONTINUE
  161 CONTINUE
  162 CONTINUE
*----
*  PROCESS FISSION SPECTRUM TERMS
*----
      JPMACP=LCMGID(IPMACP,'GROUP')
      KPMACP=LCMGIL(JPMACP,1)
      CALL LCMLEN(KPMACP,'CHI',LENGT,ITYLCM)
      IF(LENGT.GT.0) THEN
         IF(LENGT.NE.NBMIX*NBFIS) CALL XABORT('TRISPS: INVALID LENGTH '
     1   //'FOR CHI INFORMATION.')
         DO 180 IGR=1,NGRP
         KPMACP=LCMGIL(JPMACP,IGR)
         CALL LCMGET(KPMACP,'CHI',CHI(1,1,IGR))
  180    CONTINUE
      ELSE
         DO 192 IBM=1,NBMIX
         DO 191 IFISS=1,NBFIS
         CHI(IBM,IFISS,1)=1.0
         DO 190 IGR=2,NGRP
         CHI(IBM,IFISS,IGR)=0.0
  190    CONTINUE
  191    CONTINUE
  192    CONTINUE
      ENDIF
*----
*  PROCESS FISSION NUSIGF TERMS
*----
      DO 230 IGR=1,NGRP
*     PROCESS SECONDARY GROUP IGR.
      LFIS=.FALSE.
      DO 201 IBM=1,NBMIX
      DO 200 IFISS=1,NBFIS
      LFIS=LFIS.OR.(CHI(IBM,IFISS,IGR).NE.0.0)
  200 CONTINUE
  201 CONTINUE
      IF(LFIS) THEN
         DO 220 JGR=1,NGRP
         KPMACP=LCMGIL(JPMACP,JGR)
         CALL LCMLEN(KPMACP,'NUSIGF',LENGT,ITYLCM)
         IF(LENGT.GT.0) THEN
            IF(LENGT.NE.NBMIX*NBFIS) CALL XABORT('TRISPS: INVALID LENG'
     1      //'TH FOR NUSIGF INFORMATION.')
            CALL LCMGET(KPMACP,'NUSIGF',ZUFIS)
            SGD(:NBMIX,1)=0.0
            DO 211 IBM=1,NBMIX
            DO 210 IFISS=1,NBFIS
            SGD(IBM,1)=SGD(IBM,1)+CHI(IBM,IFISS,IGR)*ZUFIS(IBM,IFISS)
  210       CONTINUE
  211       CONTINUE
            WRITE(TEXDIG,'(4HFISS,2I3.3)') IGR,JGR
            CALL LCMPUT(IPSYS,TEXDIG,NBMIX,2,SGD(1,1))
            WRITE (TEXDIG,'(1HB,2I3.3)') IGR,JGR
            CALL TRIDIG(TEXDIG,IPTRK,IPSYS,IMPX,NBMIX,NEL,IPR,MAT,VOL,
     1      SGD)
         ENDIF
  220    CONTINUE
      ENDIF
  230 CONTINUE
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(RCAT,RCATI)
      DEALLOCATE(GAMMA,SGD,WORK,CHI,ZUFIS)
      RETURN
      END