summaryrefslogtreecommitdiff
path: root/Donjon/src/D2PTH.f
blob: ffb6a46d0cecff067abb2b62502235ea2c7429a8 (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
*DECK D2PTH
      SUBROUTINE D2PTH(  IPDAT, IPMIC , IPRINT,    NBU,   NGP,    NBMIX,
     >                   NFISS,   NDEL,   NVAR, STAIDX,JOBOPT,     FLAG)

*
*-----------------------------------------------------------------------
*
*Purpose:
* Recover T/H inveariant data block and store in INFO/TH_DATA/
* WARNING: These data are extracted only if the corresponding flag is
* set to T in the GENPMAXS_INP/JOBOPT vector.
* NB 1 : The data for T/H are recovered from the reference state,  the
* branching calculation not includes the TH informations.
* NB 3 : The Helios format cannot recover the CHID (delay neutron
* fission spectrum), it is fixed to default values even if JOBOPT(6)=T.
* NB 4 : The Helios format cannot recover the Decay Heat Data (DBET and
* DLAM in GenPMAXS), it is fixed to default values even if JOBOPT(14)=T.
*
*Author(s): 
* J. Taforeau
*
*Parameters: input
* IPDAT   address of the INFO data block
* IPMIC   address of the MICROLIB object
* IPPRINT control the printing on screen
* NGP     number of energy groups
* NBU     number of burnup point in IPSAP
* NVAR    number of state parameters in INFO data block
* NDEL    number of delaued neutron groups
* NBMIX   number of mixtrures  in IPSAP
* NFISS   number of fissile isotopes
* STAIDX  index of state variables
* FLAG    End of a bran calculation (=-1: branch for yields calculation)
*
*Parameters: 
* IPRINT  
* JOBOPT  
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) IPDAT,IPMIC
      INTEGER IPRINT,NVAR,NBU, NBMIX,NGP
      INTEGER NFISS,NDEL
      INTEGER STAIDX(NVAR)
      INTEGER FLAG
*----
*  LOCAL VARIABLES
*----
      TYPE(C_PTR) JPMIC,KPMIC,IPTH,KPTH
      PARAMETER(NSTATE=40)
      INTEGER DSTATE(NSTATE)
      INTEGER NDFI,NDFP,MR,MI,MI_REAL,ITYLCM
      INTEGER :: I_PF = 0
      INTEGER :: iso = 1
      REAL YLDI,YLDXe,YLDPm
      REAL CHI(NFISS,NGP)
      REAL OVERV(NGP),BURN(NBU), STATE(NVAR)
      REAL FLX(NGP),NUSIGF_D(NDEL,NGP),NUSIGF(NGP)
      REAL BETA_D(NDEL,NFISS),LAMBDA_D(NDEL,NFISS)
      REAL NUM(NDEL)
      REAL :: DEN = 0.0
      CHARACTER*12 ISOTOPES(4)
      CHARACTER*1 JOBOPT(16)
      CHARACTER*8 NUSID
      CHARACTER*3 YLDOPT
      REAL YLDFIX(3)


      REAL, ALLOCATABLE, DIMENSION(:) :: DEPLETE_ENER,DEPLETE_DECA
      REAL, ALLOCATABLE, DIMENSION(:) :: FISSIONYIELD
      CHARACTER(len=12),ALLOCATABLE, DIMENSION(:) :: ISOTOPERNAME
      CHARACTER(len=12),ALLOCATABLE, DIMENSION(:) :: ISOTOPESDEPL,PF

      IF(IPRINT > 1)  THEN
         WRITE(6,*)
         WRITE(6,*) "**************************************************"
         WRITE(6,*) "*               T/H INVARIANT BLOCK              *"
         WRITE(6,*) "**************************************************"
         WRITE(6,*)
      ENDIF

      CALL LCMSIX(IPMIC,' ',0)
      CALL LCMSIX(IPMIC,'MACROLIB',1)

      IF(JOBOPT(13)=='T') CALL LCMGET(IPMIC,'LAMBDA-D',LAMBDA_D)



      JPMIC=LCMGID(IPMIC,'GROUP')

      IF(NBMIX.NE.1) THEN
        CALL XABORT('@D2PTH: MORE THAN ONE MIXTURE IN SAPHYB')
      ENDIF
      IF(NFISS.NE.1) THEN
        CALL XABORT('@D2PTH: MORE THAN 1 FISSILE ISOTOPE IN MACROLIB')
      ENDIF

      DO IGR=1,NGP
        KPMIC=LCMGIL(JPMIC,IGR)
        IF(JOBOPT(7)=='T')CALL LCMGET(KPMIC,'OVERV',OVERV(IGR))
        IF(JOBOPT(5)=='T')CALL LCMGET(KPMIC,'CHI',CHI(1:NFISS,IGR))
        IF(JOBOPT(12)=='T') THEN
         CALL LCMGET(KPMIC,'NUSIGF',NUSIGF(IGR))
         CALL LCMGET(KPMIC,'FLUX-INTG',FLX(IGR))
         DO ND=1,NDEL
           WRITE(NUSID,' (A6, I2.2)') 'NUSIGF', ND
           CALL LCMGET(KPMIC,NUSID,NUSIGF_D(ND,IGR))
         ENDDO
        ENDIF
      ENDDO

      IF(JOBOPT(12)=='T') THEN
        DO ND=1,NDEL

           DEN=0.
           NUM(ND)=0.0
          DO IGR= 1,NGP
           DEN=DEN+NUSIGF(IGR)*FLX(IGR)
           NUM(ND)=NUM(ND)+NUSIGF_D(ND,IGR)*FLX(IGR)
          ENDDO
           BETA_D(ND,NFISS)=NUM(ND)/DEN
         ENDDO
!        CALL XABORT ('STOP TEST')
      ENDIF
      IF(JOBOPT(9)=='T') THEN

        CALL LCMSIX(IPDAT,' ',0)
        CALL LCMSIX(IPDAT,'SAPHYB_INFO',1)
        CALL LCMGTC(IPDAT,'YLD_OPT',3,YLDOPT)

        CALL LCMGET(IPDAT,'YLD_FIX',YLDFIX)

        IF ((YLDOPT=='REF').OR.(YLDOPT=='MAN')) THEN
         CALL LCMSIX(IPMIC,' ',0)
         CALL LCMLEN(IPMIC,'ISOTOPESDENS',MI_REAL,ITYLCM)
         CALL LCMLEN(IPMIC,'ISOTOPERNAME',MI,ITYLCM)
         ALLOCATE (ISOTOPERNAME(MI))
         CALL LCMGTC(IPMIC,'ISOTOPERNAME',12,MI,ISOTOPERNAME)
         CALL LCMLEN(IPMIC,'DEPL-CHAIN',ILONG,ITYLCM)
         IF (ILONG.EQ.0) THEN
          YLDI=YLDFIX(1)
          YLDXe=YLDFIX(2)
          YLDPm=YLDFIX(3)
           WRITE(6,*)"@D2PTH : NO RECORD DEPL-CHAIN IN SAP/MCO :"
           WRITE(6,*)"=> DEFAULT VALUES FOR FISSION YLDS CONSIDERED"
         ELSE
          CALL LCMSIX(IPMIC,'DEPL-CHAIN',1)
          CALL LCMGET(IPMIC,'STATE-VECTOR',DSTATE)

          NDEPL = DSTATE(1)
          NDFI = DSTATE(2)
          NDFP = DSTATE(3)
          MR = DSTATE(8)

          ALLOCATE (FISSIONYIELD(NDFI*NDFP), DEPLETE_ENER(NDEPL*MR))
          ALLOCATE (ISOTOPESDEPL(NDEPL), PF(NDEPL),DEPLETE_DECA(NDEPL))
          CALL LCMGET(IPMIC,'DEPLETE-DECA',DEPLETE_DECA)
          CALL LCMGET(IPMIC,'DEPLETE-ENER',DEPLETE_ENER)
          CALL LCMGTC(IPMIC,'ISOTOPESDEPL',12,NDEPL,ISOTOPESDEPL)

          IF ((NDFI.EQ.0 ).OR. (NDFP .EQ. 0)) THEN
           WRITE(6,*) "@D2PTH : NUMBER OF DIRECT FISSILE ISOTOPES",
     1     " OR FISSION FRAGMENT IS ZERO"
           CALL XABORT('=> PLEASE TURN OFF THE LYLD FLAG IN JOB_OPT'
     >    //' OR USE THE "YLD FIX" OPTION' )
          ENDIF
          CALL LCMGET(IPMIC,'FISSIONYIELD',FISSIONYIELD)


          I_PF=0
          iso=1

          CALL LCMSIX(IPDAT,' ',0)
          CALL LCMSIX(IPDAT,'SAPHYB_INFO',1)
          CALL LCMGET(IPDAT,'BURN',BURN)
          CALL LCMSIX (IPDAT,'ISOTOPES',1)
          CALL LCMGTC (IPDAT,'XE135',12,ISOTOPES(1))
          CALL LCMGTC (IPDAT,'SM149',12,ISOTOPES(2))
          CALL LCMGTC (IPDAT,'I135',12,ISOTOPES(3))
          CALL LCMGTC (IPDAT,'PM149',12,ISOTOPES(4))

          DO iso=1, NDEPL
            IF(INDEX(ISOTOPESDEPL(iso), 'MACR')==0) THEN

             I_PF=I_PF+1
             PF(I_PF)=ISOTOPESDEPL(iso)
             IF(PF(I_PF)==ISOTOPES(3)) YLDI=FISSIONYIELD(I_PF)
             IF(PF(I_PF)==ISOTOPES(1)) YLDXe=FISSIONYIELD(I_PF)
             IF(PF(I_PF)==ISOTOPES(4)) YLDPm=FISSIONYIELD(I_PF)
            ENDIF
          ENDDO

          IF(IPRINT > 1)  THEN
           WRITE(6,*)"********* STATE VECTOR INFORMATION *************"
           WRITE(6,*)
           WRITE(6,*)"Number of isotopes (MI)                  : ",MI
           WRITE(6,*)"Number of groups (NGP)                   : ",NGP
           WRITE(6,*)"Number of fissile isotopes (NFISS)       : ",NFISS
           WRITE(6,*)"Number of delayed neutron groups (NDEL)  : ",NDEL
           WRITE(6,*)"Number of depleted isotopes (NDEPL)      : ",NDEPL
           WRITE(6,*)"Number of direct fissile isotopes (NDFI) : ",NDFI
           WRITE(6,*)"Number of fission fragments (NDFP)       : ",NDFP
           WRITE(6,*)"Maximum number of depleting reactions(MR): ",MR
           WRITE(6,*)
           WRITE(6,*)"**************** ISOTOPE NAME ******************"
           WRITE(6,*)
           WRITE(6,'(10A12)')ISOTOPERNAME(1:MI_REAL)
           WRITE(6,*)
          ENDIF
          DEALLOCATE (ISOTOPERNAME)
          DEALLOCATE (FISSIONYIELD,ISOTOPESDEPL,PF)
          DEALLOCATE (DEPLETE_ENER,DEPLETE_DECA)
         ENDIF
        ELSE IF (YLDOPT=='FIX') THEN
         YLDI=YLDFIX(1)
         YLDXe=YLDFIX(2)
         YLDPm=YLDFIX(3)
        ENDIF
      ENDIF

      CALL LCMSIX(IPDAT,' ',0)
      CALL LCMSIX(IPDAT,'BRANCH_INFO',1)
      CALL LCMGET(IPDAT,'STATE',STATE)
      CALL LCMSIX(IPDAT,' ',0)

      IF(STAIDX(NVAR)==1) THEN
        IPTH=LCMLID(IPDAT,'TH_DATA',NBU)
      ELSE
        IPTH=LCMGID(IPDAT,'TH_DATA')
      ENDIF

      KPTH=LCMDIL(IPTH,STAIDX(NVAR))

      IF(JOBOPT(13)=='T') THEN
        CALL LCMPUT(KPTH,'LAMBDA',NDEL*NFISS,2,LAMBDA_D)
      ENDIF
      IF(JOBOPT(9)=='T') THEN
       IF((YLDOPT.EQ.'FIX').OR.(YLDOPT.EQ.'REF')) THEN
        CALL LCMPUT(KPTH,'YLDPm',1,2,YLDPm)
        CALL LCMPUT(KPTH,'YLDXe',1,2,YLDXe)
        CALL LCMPUT(KPTH,'YLDI',1,2,YLDI)
       ELSE IF ((YLDOPT.EQ.'MAN').AND.(FLAG.EQ.-1)) THEN
        CALL LCMPUT(KPTH,'YLDPm',1,2,YLDPm)
        CALL LCMPUT(KPTH,'YLDXe',1,2,YLDXe)
        CALL LCMPUT(KPTH,'YLDI',1,2,YLDI)
       ENDIF
      ENDIF

      IF(JOBOPT(7)=='T')CALL LCMPUT(KPTH,'OVERV',NGP,2,OVERV)
      IF(JOBOPT(5)=='T')CALL LCMPUT(KPTH,'CHI',NFISS*NGP,2,CHI)
      IF(JOBOPT(12)=='T')CALL LCMPUT(KPTH,'BETA',NDEL*NFISS,2,BETA_D)
      IF(IPRINT > 1)  THEN
        WRITE(6,*) "**************** T/H INFORMATION *****************"
        IF(JOBOPT(5)=='T') WRITE(6,*) "CHI(NFISS,NGP)     :",CHI
        IF(JOBOPT(7)=='T') WRITE(6,*) "OVERV(NGP)         :",OVERV
        IF(JOBOPT(13)=='T')WRITE(6,*) "LAMBDA(NDEL,NFISS) :",LAMBDA_D
        IF(JOBOPT(12)=='T')WRITE(6,*) "BETA(NDEL,NFISS)   :",BETA_D
        IF(JOBOPT(9)=='T') WRITE(6,*) "PM-149 YIELD       :",YLDPm
        IF(JOBOPT(9)=='T') WRITE(6,*) "XE-135 YIELD       :",YLDXe
        IF(JOBOPT(9)=='T') WRITE(6,*) "I-135 YIELD        :",YLDI
        WRITE(6,*)
      ENDIF

      END