summaryrefslogtreecommitdiff
path: root/Donjon/src/D2PXSA.f
blob: 316188c60972677921b27e4627c01658281e6159 (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
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
*DECK D2PXSA
      SUBROUTINE D2PXSA(IPDAT,IPSAP,ICAL,IPRINT,NGP,NREA,NISO,NMAC,
     1 NMIL,NANI,NVAR,NADRX,STAIDX,B2,ADF_T,NSF,LABS,SCAT,LADF)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Recover FISSION cross sections of an elementary calculation and store
* in INFO/BRANCH_INFO/MACROLIB_XS/SFI.
* WARNING: the GET_SFI_XS subroutine cannot recover FISSION XS in the
* case where cross sections are ineterpolated by the SCR: module
*
*Author(s): 
* J. Taforeau
*
*Parameters: input
* IPDAT   address of the INFO data block
* ICAL    number of the elementary calculation in which fission cross
*         sections is to be recovered
* IPSAP   address of the Saphyb object
* NGP     number of group energies in Saphyb
* NREA    number of reactions in Saphyb
* NISO    number of isotopes in Saphyb
* NMAC    number of macros in Saphyb
* NMIL    number of mixtures in Saphyb
* NANI    number of Legendre orders in Saphyb
* NADRX   concerne cross section vector (ADRX)
* STAIDX  index of current branch state values
* NSF     number of elements of the tranfert matrix
* LABS    content of absorption xs LABS(1) : ABS XS = TOTAL - SIGS00 ;
*         LABS(2) abs xs recovered from sap ; LABS (3)  abs xs recovered
*         from SAP minus excess xs

*Parameters: output
* SFI     fission cross sections of the current BRANCH:
*         INFO/BRANCH_INFO/MACROLIB_XS/SFI
*
*Parameters: 
* IPRINT  
* NVAR    
* B2      
* ADF_T   
* SCAT    
* LADF    
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) IPDAT,IPSAP
      INTEGER ICAL,IPRINT,NGP,NREA,NISO,NMAC, NMIL,NANI,NVAR,
     1 STAIDX(NVAR),NSF,NADRX
      REAL B2
      CHARACTER*3 ADF_T
      LOGICAL LABS(3),SCAT,LADF
*----
*  LOCAL VARIABLES
*----
      TYPE(C_PTR) IPTH,KPTH
      ! order numbers of current : reaction , isotope, macro
      INTEGER iprf,isot,imil,imac,iabs,iexc,idif,itra
      INTEGER idifc
      INTEGER ani, il, nj, ii, it, i1,i2, j1, j2, iadc,g
      INTEGER ND
      ! location of excess cross sections in RDATAX
      INTEGER ADR_EXC
      ! location of absorption cross sections in RDATAX
      INTEGER ADR_ABS
      ! location of profil cross sections in RDATAX
      INTEGER ADR_PRF
      ! location of TRANSFERT cross sections in RDATAX
      INTEGER ADR_TRA
      INTEGER ADR_DIF
      ! number of group energies in Saphyb
      INTEGER NG
      ! type of data recovered from GANLIB subroutines
      INTEGER ITYLCM
      ! name of : isotopes, macros
      CHARACTER(LEN=8) NOM_MAC(NMAC)
      ! name of reactions
      CHARACTER(LEN=10) NOM_REA(NREA)
      ! residual macro
      INTEGER RESMAC(NMIL)
      ! 3rd index of ADRX
      INTEGER ISADRX(NMIL)
      ! number of elements in RADATAX
      INTEGER LENGDX(NMIL)
      ! name of total macro
      INTEGER TOTMAC(NMIL)
      ! number of elements in IDATAP
      INTEGER LENGDP(NMIL)
      ! contains the adress of the 1st element in RDATAX
      INTEGER ADRX (NREA+2,NISO+NMAC,NADRX)
      REAL ABSORPTION(NGP)
      REAL TRANSFERT (NANI,NGP*NGP)
      REAL DIFC(NGP)
      CHARACTER(LEN=12) CALDIR
      INTEGER fagg, lagg,fdgg,wgal,fag,lag   ! CF SAPHTOOL MANUAL
      INTEGER fdg(NGP),adr(NGP+1)            ! CF SAPHTOOL MANUAL
      INTEGER NSCAT
      REAL CURRN(NSF,NGP,2)
      REAL SRFLX(NSF,NGP)
      REAL ZAFLX(NMIL,NGP)
      DOUBLE PRECISION RPAR (6,NSF)
      INTEGER IPAR (3,NSF)
      REAL ADF(NGP,NSF,10)
      REAL SCAT_MAT(NGP*NGP)
      ! transfert matrix
      INTEGER ,ALLOCATABLE, DIMENSION(:) :: IDATAP
      ! contains values of cross sections of an elementary calculation
      REAL,ALLOCATABLE, DIMENSION(:) :: RDATAX

      TRANSFERT(:,:) = 0

      WRITE(CALDIR,'("calc", I8)') ICAL
      CALL LCMSIX(IPSAP,' ',0)
      CALL LCMSIX(IPSAP,'contenu',1)
      IF(NMIL.NE.1) THEN
        ! the number of mixtures must be equal to one for converting
        ! Saphyb into PMAXS format
        CALL XABORT('@D2P: MORE THAN ONE MIXTRURE IN SAPHYB')
      ENDIF
      CALL LCMGTC(IPSAP,'NOMREA',10,NREA,NOM_REA)
      CALL LCMGTC(IPSAP,'NOMMAC',8,NMAC,NOM_MAC)
      CALL LCMGET(IPSAP,'RESMAC',RESMAC)
      CALL LCMGET(IPSAP,'TOTMAC',TOTMAC)
      CALL LCMSIX(IPSAP,' ',0)

      CALL LCMSIX(IPSAP,'adresses',1)
      CALL LCMGET(IPSAP,'ADRX',ADRX)
      CALL LCMSIX(IPSAP,' ',0)
      CALL LCMSIX(IPSAP,CALDIR,1)
      CALL LCMSIX(IPSAP,'info',1)
      CALL LCMGET(IPSAP,'ISADRX',ISADRX)
      CALL LCMGET(IPSAP,'LENGDX',LENGDX)
      CALL LCMGET(IPSAP,'LENGDP',LENGDP)
      ALLOCATE (RDATAX(LENGDX(1)),IDATAP(LENGDP(1)))
      imac=0
      IF(RESMAC(1).NE.0) THEN
        imac=RESMAC(1)      ! recover name of residual macro
      ELSE IF(TOTMAC(1).NE.0) THEN
        imac=TOTMAC(1)      ! recover name of total macro
      ELSE
        CALL XABORT('@D2P: NO MACRO DEFINED')
      ENDIF
      isot=NISO+imac     ! we interest in macro fission cross sections
      imil=1             ! set the mixtures number to 1
      iprf=0
      iexc=0
      iabs=0
      idif=0
      iadc=0
      itra=0
      idifc=0
      !TEST HFATC
      NSCAT=1

      DO ir=1,NREA
        ! store the order numbers of PROFIL matrix
        IF((SCAT) .and. NOM_REA(ir)=="PROFIL") iprf=ir
        IF((SCAT) .and. NOM_REA(ir)=="DIFFUSION") idif=ir
        IF((SCAT) .and. NOM_REA(ir)=="TRANSFERT") itra=ir
        IF(NOM_REA(ir)=="NU*FISSION") iabs=ir
        ! store the order numbers of EXCESS matrix
        IF(LABS(3).and. NOM_REA(ir)=="EXCESS")  iexc=ir
        IF((LADF) .and. NOM_REA(ir)=="FUITES") idifc=ir
      ENDDO
      IF(iabs==0) CALL XABORT ('@D2P: NO ABSORPTION XS AVAILABLE')
      IF(LABS(3).and.iexc==0) THEN
        CALL XABORT('@D2P: NO EXCESS XS AVAILABLE')
      ENDIF
      IF(SCAT .and. iprf==0) THEN
        CALL XABORT('@D2P: NO PROFIL XS AVAILABLE')
      ENDIF
      IF(SCAT .and. idif==0) THEN
        CALL XABORT('@D2P: NO DIFFUSION XS AVAILABLE')
      ENDIF
      IF(SCAT .and. itra==0) THEN
        CALL XABORT('@D2P: NO TRANSFERT XS AVAILABLE')
      ENDIF
      IF((LADF) .and. idifc==0) THEN
        CALL XABORT('@D2P: NO FUITES XS AVAILABLE')
      ENDIF
      NANI=ADRX(NREA+2,isot,ISADRX(imil))-1
      ND=ADRX(NREA+1,isot,ISADRX(imil))
      IF(MOD(idif,NREA+1).GT.0  .AND. ND.GE.1) THEN
        iadc=ADRX(idif,isot,ISADRX(imil))+NGP
      ENDIF
      ! address in RDATAX of ABSORPTION XS
      ADR_ABS=ADRX(iabs,isot,ISADRX(imil))


      ! address in RDATAX of EXCESS XS
      ADR_EXC=0
      IF(LABS(3)) ADR_EXC=ADRX(iexc,isot,ISADRX(imil))
      ! address in RDATAX of PROFIL XS
      ADR_PRF=0
      IF(SCAT) ADR_PRF=ADRX(iprf,isot,ISADRX(imil))
      ! address in RDATAX of TRANSFERT XS
      ADR_TRA=0
      IF(SCAT) ADR_TRA=ADRX(itra,isot,ISADRX(imil))
      ! address in RDATAX of FUITES XS
      ADR_DIF=0
      IF(LADF) ADR_DIF=ADRX(idifc,isot,ISADRX(imil))

      ! moving in the saphyyb object to recover RDATAX information
      CALL LCMSIX(IPSAP,' ',0)
      CALL LCMSIX(IPSAP,CALDIR,1)
      CALL LCMSIX(IPSAP,'mili       1',1)
      CALL LCMGET(IPSAP,'RDATAX',RDATAX)
      CALL LCMGET(IPSAP,'IDATAP',IDATAP)

      ! LOOP over energy groups
      DO ig=1, NGP
       ABSORPTION(ig)=RDATAX(ADR_ABS+ig-1)
       IF(LADF) DIFC(ig)=RDATAX(ADR_DIF+ig-1)
       IF(LABS(3)) THEN
         ABSORPTION(ig)=ABSORPTION(ig)-RDATAX(ADR_EXC+ig-1)
       ENDIF
      ENDDO


      IF(SCAT)THEN   ! recover the scattering XS from Saphyb
         ii = ADR_PRF
         nj = IDATAP(ii+6+2*NGP)-1

        DO ani=0, NANI
         il = ADR_TRA + (ani) * nj
         fagg =IDATAP(ii)
         lagg =IDATAP(ii+1)
         fdgg =IDATAP(ii+2)
         wgal =IDATAP(ii+3)
         fag  =IDATAP(ii+4)
         lag  =IDATAP(ii+5)
         fdg  =IDATAP(ii+6:ii+5+NGP)
         adr  =IDATAP(ii+6+NGP:ii+6+2*NGP)
         IF(wgal.GT.0)THEN
          it=il
          DO g=fagg,lagg
           i1=(g-1)*NGP+fdgg
           i2=(g-1)*NGP+fdgg+wgal-1
           TRANSFERT(ani+1,i1:i2)=RDATAX(it:it+wgal-1)
           it=it+wgal
          ENDDO
         ENDIF
         DO g=fag,lag
          i1=(g-1)*NGP+fdg(g)
          i2=(g-1)*NGP+fdg(g)+adr(g+1)-adr(g)-1
          j1=il-1+adr(g)
          j2=il-1+adr(g+1)-1
          TRANSFERT(ani+1,i1:i2)=RDATAX(j1:j2)
         ENDDO
        ENDDO
        IF(iadc.NE.0)THEN
         NG=NGP
!         TRANSFERT(1,1:NG*NG:NG+1) =
!     >         TRANSFERT(1,1:NG*NG:NG+1) - RDATAX(iadc:iadc+NGP-1)
        ENDIF
      ENDIF
      DO g=1, NGP
        DO ig=1, NGP
         SCAT_MAT(NSCAT) = TRANSFERT(1,g+(ig-1)*NGP)
         NSCAT=NSCAT+1
        ENDDO
      ENDDO

      ! RECOVER ADF IN SAPHYB (IF AVAILABLE) (adapted from !
      ! saphyb_browser of UPM)

      IF(LADF) THEN
        IF((ADF_T.EQ.'SEL').OR.(ADF_T.EQ.'GET')) THEN
         CALL LCMSIX (IPSAP,' ',0)
         CALL LCMSIX (IPSAP,'geom        ',1)
         CALL LCMSIX (IPSAP,'outgeom     ',1)
         CALL LCMLEN(IPSAP,'SURF',NSURF,ITYLCM)
         IF(NSF.NE.NSURF) THEN
           WRITE(6,*) "@D2P: ERROR IN NUMBER OF ASSEMBLY SURFACES"
           WRITE(6,*) "THE NUMBER OF SURFACES IN SAP (",
     1     NSURF,") IF DIFFERENT FROM DRAG2PARCS INPUT (",NSF,")"
           CALL XABORT('')
         ENDIF

         CALL LCMGET(IPSAP,'IPAR',IPAR)
         CALL LCMGET(IPSAP,'RPAR',RPAR)

         CALL LCMSIX(IPSAP,' ',0)
         CALL LCMSIX(IPSAP,CALDIR,1)
         CALL LCMSIX(IPSAP,'outflx      ',1)

         CALL LCMGET(IPSAP,'CURRM',CURRN(:,:,2))
         CALL LCMGET(IPSAP,'CURRP',CURRN(:,:,1))
         CALL LCMGET(IPSAP,'SURFLX',SRFLX(:,:))
         CALL LCMGET(IPSAP,'REGFLX',ZAFLX(:,:))
         ADF = 0.
         DIFC(:)=DIFC(:)/B2

         ! CALL to GET_SFI_XS to recover ADF
         CALL D2PADF(IPDAT,IPRINT,NGP,NMIL, ADF, NSF, DIFC,CURRN,SRFLX,
     1   ZAFLX,RPAR,IPAR,ADF_T,STAIDX,NVAR)
        ENDIF
      ENDIF
      ! STORE RESULTS IN INFO DATA BLOCK
      CALL LCMSIX(IPDAT,' ',0)
      CALL LCMSIX(IPDAT,'BRANCH_INFO',1)
      IPTH=LCMGID(IPDAT,'CROSS_SECT')
      KPTH=LCMDIL(IPTH,STAIDX(NVAR))
      CALL LCMSIX(KPTH,'MACROLIB_XS',1)
      IF(LABS(2)) CALL LCMPUT(KPTH,'ABSORPTION',NGP,2,ABSORPTION)
      IF(SCAT) CALL LCMPUT(KPTH,'SCAT',NGP*NGP,2,SCAT_MAT)
      IF(LABS(2)) WRITE(6,*) "ABSORPTION EXCESS :", ABSORPTION
      IF(SCAT) WRITE(6,*) "SCATTERING MATRIX  :", SCAT_MAT
      DEALLOCATE (RDATAX,IDATAP)
      END