summaryrefslogtreecommitdiff
path: root/Dragon/src/APXGEY.f
blob: 467ec70d7359850dcaac3735fcb61de2b81f7101 (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
*DECK APXGEY
      SUBROUTINE APXGEY(IPAPX,IPEDIT,NISO,NG,NMIL,NBISO,NDFI,NISFS,
     1 NISPS)
*
*-----------------------------------------------------------------------
*
*Purpose:
* To recover the fission yields of an elementary calculation.
*
*Copyright:
* Copyright (C) 2025 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
* IPAPX   pointer to the Apex file.
* IPEDIT  pointer to the edition object (L_EDIT signature).
* NISO    number of particularized isotopes.
* NG      number of condensed energy groups.
* NMIL    number of mixtures in the MPO file.
* NBISO   number of isotopes in the condensed microlib of the edition
*         object. A given isotope may appear in many mixtures.
* NDFI    number of fissile isotopes producing fission products in
*         the edition object.
* NISFS   number of particularized fissile isotopes.
* NISPS   number of particularized fission products.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
      USE hdf5_wrap
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) IPAPX,IPEDIT
      INTEGER NISO,NG,NMIL,NBISO,NDFI,NISFS,NISPS
*----
*  LOCAL VARIABLES
*----
      PARAMETER (MAXISO=800)
      TYPE(C_PTR) JPEDIT,KPEDIT
      CHARACTER TEXT8*8,TEXT12*12,RECNAM*80
      LOGICAL LGIMF
*----
*  ALLOCATABLE ARRAYS
*----
      INTEGER, ALLOCATABLE, DIMENSION(:) :: MIX,PIFI,ADRY
      INTEGER, ALLOCATABLE, DIMENSION(:,:) :: ISONAM
      REAL, ALLOCATABLE, DIMENSION(:) :: DEN,PYIELD,SIG,PFIRA
      REAL, ALLOCATABLE, DIMENSION(:,:) :: FLUXES
      REAL, ALLOCATABLE, DIMENSION(:,:,:) :: YLDS
      CHARACTER(LEN=4), ALLOCATABLE, DIMENSION(:) :: TYPISO
      CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:) :: NOMISO
      TYPE(C_PTR), ALLOCATABLE, DIMENSION(:) ::  IPISO
*----
*  SCRATCH STORAGE ALLOCATION
*   PFIRA   fission rate.
*   ADRY    offset in YLDS array for fissile isotopes (positive) and
*           fission products (negative).
*----
      ALLOCATE(ISONAM(3,NBISO),MIX(NBISO),PIFI(NDFI))
      ALLOCATE(YLDS(NISFS,NISPS,1),DEN(NBISO),PYIELD(NDFI),
     1 FLUXES(NMIL,NG),SIG(NG),PFIRA(NBISO),ADRY(NISO))
      ALLOCATE(IPISO(NBISO))
*----
*  RECOVER INFORMATION FROM THE /contents/isotopes GROUP.
*----
      IF(NISO.GT.0) THEN
        CALL hdf5_read_data(IPAPX,"/physconst/ISOTA",NOMISO)
        CALL hdf5_read_data(IPAPX,"/physconst/ISOTYP",TYPISO)
      ENDIF
*
      CALL LCMGET(IPEDIT,'ISOTOPESUSED',ISONAM)
      CALL LCMGET(IPEDIT,'ISOTOPESMIX',MIX)
      CALL LCMGET(IPEDIT,'ISOTOPESDENS',DEN)
      CALL LIBIPS(IPEDIT,NBISO,IPISO)
*----
*  COMPUTE ARRAY ADRY.
*----
      ISF=0
      ISP=0
      ADRY(:NISO)=0
      DO 30 ISO=1,NISO
      DO 10 IBISO=1,NBISO
      WRITE(TEXT8,'(2A4)') (ISONAM(I0,IBISO),I0=1,2)
      IF(NOMISO(ISO).EQ.TEXT8) GO TO 20
   10 CONTINUE
      GO TO 30
   20 IF(TYPISO(ISO).EQ.'FISS') THEN
         ISF=ISF+1
         ADRY(ISO)=ISF
      ELSEIF(TYPISO(ISO).EQ.'F.P.') THEN
         ISP=ISP+1
         ADRY(ISO)=-ISP
      ENDIF
   30 CONTINUE
      LGIMF=NISFS.GT.0
      IMF=0
      IF(LGIMF) IMF=ADRY(NISO)
*----
*  RECOVER THE NEUTRON FLUX.
*----
      CALL LCMSIX(IPEDIT,'MACROLIB',1)
      JPEDIT=LCMGID(IPEDIT,'GROUP')
      DO 40 IGR=1,NG
      KPEDIT=LCMGIL(JPEDIT,IGR)
      CALL LCMGET(KPEDIT,'FLUX-INTG',FLUXES(1,IGR))
   40 CONTINUE
      CALL LCMSIX(IPEDIT,' ',2)
*----
*  RECOVER THE FISSION RATES.
*----
      DO 65 IBISO=1,NBISO
      GAR=0.0
      IF(MIX(IBISO).EQ.0) GO TO 60
      KPEDIT=IPISO(IBISO)
      CALL LCMLEN(KPEDIT,'NFTOT',ILONG,ITYLCM)
      IF(ILONG.GT.0) THEN
         CALL LCMGET(KPEDIT,'NFTOT',SIG)
         DO 50 IGR=1,NG
         GAR=GAR+FLUXES(MIX(IBISO),IGR)*DEN(IBISO)*SIG(IGR)
   50    CONTINUE
      ENDIF
   60 PFIRA(IBISO)=GAR
   65 CONTINUE
*----
*  LOOP OVER MPO MIXTURES TO RECOVER THE FISSION YIELDS.
*----
      DO 140 IMIL=1,NMIL
      YLDS(:NISFS,:NISPS,1)=0.0
      DO 130 IBISO=1,NBISO
      IF(MIX(IBISO).EQ.IMIL) THEN
         WRITE(TEXT12,'(3A4)') (ISONAM(I0,IBISO),I0=1,3)
         DO 80 ISO=1,NISO
         IISO=ISO
         IF(NOMISO(ISO).EQ.TEXT12(:8)) GO TO 90
   80    CONTINUE
         GO TO 130
   90    KPEDIT=IPISO(IBISO)
*
*        RECOVER THE FISSION YIELDS.
         CALL LCMLEN(KPEDIT,'PYIELD',ILONG,ITYLCM)
         IF((ILONG.GT.0).AND.(ILONG.EQ.NDFI)) THEN
            CALL LCMGET(KPEDIT,'PIFI',PIFI)
            CALL LCMGET(KPEDIT,'PYIELD',PYIELD)
         ELSE
            GO TO 130
         ENDIF
         IFP=-ADRY(IISO)
         IF(IFP.GT.0) THEN
*           Particular fission product found.
*           If exists in medium, find position in microlib
*           and search all fissiles.
            YLDW=0.0
            DO 120 IDFI=1,NDFI
            JBISO=PIFI(IDFI)
            IF(JBISO.GT.NBISO) CALL XABORT('APXGEY: MIX OVERFLOW.')
            IF(JBISO.EQ.0) GO TO 120
            IF(MIX(JBISO).NE.IMIL) GO TO 120
            WRITE(TEXT8,'(3A4)') (ISONAM(I0,JBISO),I0=1,2)
            DO 100 JSO=1,NISO
            JISO=JSO
            IF(NOMISO(JSO).EQ.TEXT8) GO TO 110
  100       CONTINUE
*           Mother isotope is in residual macro.
            YLDW=YLDW+PFIRA(JBISO)
            IF(IMF.EQ.0) CALL XABORT('APXGEY: LGIMF IS FALSE.')
            YLDS(IMF,IFP,1)=YLDS(IMF,IFP,1)+PYIELD(IDFI)*PFIRA(JBISO)
            GO TO 120
*
*           Yield for selected isotopes.
  110       IFI=ADRY(JISO)
            IF(IFI.LE.0) CALL XABORT('APXGEY: BAD ADRY.')
            YLDS(IFI,IFP,1)=PYIELD(IDFI)
  120       CONTINUE
            IF(LGIMF) THEN
               IF(YLDW.NE.0.0) YLDS(IMF,IFP,1)=YLDS(IMF,IFP,1)/YLDW
            ENDIF
         ENDIF
      ENDIF
  130 CONTINUE
*----
*  STORE INFORMATION IN THE physconst GROUP.
*----
      IF(NMIL.EQ.1) THEN
        CALL hdf5_write_data(IPAPX,"/physconst/FYIELDS",YLDS)
      ELSE
        WRITE(RECNAM,'(18H/physconst/FYIELDS,I8)') IMIL
        CALL hdf5_write_data(IPAPX,TRIM(RECNAM),YLDS)
      ENDIF
  140 CONTINUE
      IF(NISO.GT.0) DEALLOCATE(NOMISO,TYPISO)
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(IPISO)
      DEALLOCATE(ADRY)
      DEALLOCATE(PFIRA,SIG,FLUXES,PYIELD,DEN,YLDS)
      DEALLOCATE(PIFI,MIX,ISONAM)
      RETURN
      END