summaryrefslogtreecommitdiff
path: root/Dragon/src/APXTOC.f
blob: 8829d5e60aaf38acc91fe7915ec341afed11db00 (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
*DECK APXTOC
      SUBROUTINE APXTOC(IPAPX,IMPX,NLAM,NREA,NBISO,NBMAC,NMIL,NPAR,
     1 NVP,NISOF,NISOP,NISOS,NCAL,NGRP,NISOTS,NSURFD,NPRC)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Recover the table of content of an Apex file.
*
*Copyright:
* Copyright (C) 2021 Ecole Polytechnique de Montreal
*
*Author(s): 
* A. Hebert
*
*Parameters: input
* IPAPX   address of the Apex file.
* IMPX    print parameter (equal to zero for no print).
*
*Parameters: output
* NLAM    number of types of radioactive decay reactions
* NREA    number of neutron-induced reaction
* NBISO   number of particularized isotopes
* NBMAC   number of macroscopic sets
* NMIL    number of mixtures in the APEX
* NPAR    number of parameters
* NVP     number of nodes in the global parameter tree
* NISOF   number of particularized fissile isotopes
* NISOP   number of particularized fission products
* NISOS   number of particularized stable isotopes
* NCAL    number of elementary calculations
* NGRP    number of energy groups
* NISOTS  maximum number of isotopes in output tables
* NSURFD  number of discontinuity factors values in the Apex file
* NPRC    number of precursors
*
*-----------------------------------------------------------------------
*
      USE GANLIB
      USE hdf5_wrap
      IMPLICIT NONE
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) IPAPX
      INTEGER IMPX,NLAM,NREA,NBISO,NBMAC,NMIL,NPAR,NVP,NISOF,NISOP,
     1 NISOS,NCAL,NGRP,NISOTS,NSURFD,NPRC
*----
*  LOCAL VARIABLES
*----
      INTEGER, PARAMETER::IOUT=6
      INTEGER I,II,RANK,TYPE,NBYTE,DIMSR(5)
      CHARACTER HSMG*131,RECNAM*80
      CHARACTER(LEN=100), ALLOCATABLE, DIMENSION(:) :: LIST
      INTEGER, ALLOCATABLE, DIMENSION(:) :: DIMS_APX
      CHARACTER(LEN=4), ALLOCATABLE, DIMENSION(:) :: TYPISO
*----
*  LIST GROUPS AND DATASETS ON THE ROOT FILE
*----
      IF(IMPX.GT.0) THEN
        CALL hdf5_list_groups(IPAPX, '/', LIST)
        WRITE(*,*)
        WRITE(*,*) 'APXTOC: GROUP TABLE OF CONTENTS'
        DO I=1,SIZE(LIST)
          WRITE(*,*) TRIM(LIST(I))
        ENDDO
        DEALLOCATE(LIST)
        CALL hdf5_list_datasets(IPAPX, '/', LIST)
        WRITE(*,*)
        WRITE(*,*) 'APXTOC: DATASET TABLE OF CONTENTS'
        DO I=1,SIZE(LIST)
          WRITE(*,*) TRIM(LIST(I))
        ENDDO
        DEALLOCATE(LIST)
      ENDIF
*----
*  RECOVER APEX PARAMETERS
*----
      NMIL=1
      NGRP=0
      CALL hdf5_read_data(IPAPX,"NCALS",NCAL)
      IF(hdf5_group_exists(IPAPX,"/physconst/")) THEN
        CALL hdf5_info(IPAPX,"/physconst/ENRGS",RANK,TYPE,NBYTE,DIMSR)
        IF(TYPE.NE.99) THEN
          CALL hdf5_get_shape(IPAPX,"/physconst/ENRGS",DIMS_APX)
        ELSE
          GO TO 10
        ENDIF
      ELSE IF(hdf5_group_exists(IPAPX,"/physco001/")) THEN
        CALL hdf5_info(IPAPX,"/physc001/ENRGS",RANK,TYPE,NBYTE,DIMSR)
        IF(TYPE.NE.99) THEN
          CALL hdf5_get_shape(IPAPX,"/physc001/ENRGS",DIMS_APX)
        ELSE
          GO TO 10
        ENDIF
      ELSE
        CALL XABORT('APXTOC: GROUP physconst NOT FOUND IN HDF5 FILE.')
      ENDIF
      IF(NGRP.EQ.0) THEN
        NGRP=DIMS_APX(1)-1
      ELSE IF(NGRP.NE.DIMS_APX(1)-1) THEN
        WRITE(HSMG,'(46H APXTOC: THE APEX FILE HAS AN INVALID NUMBER O,
     1  17HF ENERGY GROUPS (,I4,3H VS,I5,2H).)') NGRP,DIMS_APX(1)-1
        CALL XABORT(HSMG)
      ENDIF
      DEALLOCATE(DIMS_APX)
  10  NBMAC=0
      NREA=0
      IF(hdf5_group_exists(IPAPX,"/explicit/")) THEN
        NBISO=0
        CALL hdf5_info(IPAPX,"/explicit/ISONAME",RANK,TYPE,NBYTE,DIMSR)
        IF(RANK.NE.99) NBISO=DIMSR(1)
        NBMAC=0
        CALL hdf5_info(IPAPX,"/explicit/MACNAME",RANK,TYPE,NBYTE,DIMSR)
        IF(RANK.NE.99) NBMAC=DIMSR(1)
        NREA=0
        CALL hdf5_info(IPAPX,"/explicit/REANAME",RANK,TYPE,NBYTE,DIMSR)
        IF(RANK.NE.99) NREA=DIMSR(1)
      ELSE IF(hdf5_group_exists(IPAPX,"/expli001/")) THEN
        NBISO=0
        CALL hdf5_info(IPAPX,"/expli001/ISONAME",RANK,TYPE,NBYTE,DIMSR)
        IF(RANK.NE.99) NBISO=DIMSR(1)
        NBMAC=0
        CALL hdf5_info(IPAPX,"/expli001/MACNAME",RANK,TYPE,NBYTE,DIMSR)
        IF(RANK.NE.99) NBMAC=DIMSR(1)
        NREA=0
        CALL hdf5_info(IPAPX,"/expli001/REANAME",RANK,TYPE,NBYTE,DIMSR)
        IF(RANK.NE.99) NREA=DIMSR(1)
      ELSE
        CALL XABORT('APXTOC: GROUP explicit NOT FOUND IN APEX FILE.')
      ENDIF
*----
*  SET NISOF AND NISOP
*----
      NISOF=0
      NISOP=0
      NISOS=0
      NSURFD=0
      IF(NBISO.GT.0) THEN
        IF(hdf5_group_exists(IPAPX,"/physconst/")) THEN
          CALL hdf5_get_shape(IPAPX,"/physconst/ISOTA",DIMS_APX)
        ELSE IF(hdf5_group_exists(IPAPX,"/physco001/")) THEN
          CALL hdf5_get_shape(IPAPX,"/physc001/ISOTA",DIMS_APX)
        ENDIF
        IF(DIMS_APX(1).NE.NBISO) THEN
          WRITE(HSMG,'(44H APXTOC: INCONSISTENT number of ISOTOPES IN ,
     1    31Hexplicit AND physconst GROUPS (,I4,3H VS,I5,2H).)') NBISO,
     2    DIMS_APX(1)
          CALL XABORT(HSMG)
        ENDIF
        DEALLOCATE(DIMS_APX)
        IF(hdf5_group_exists(IPAPX,"/physconst/")) THEN
          CALL hdf5_read_data(IPAPX,"/physconst/ISOTYP",TYPISO)
        ELSE IF(hdf5_group_exists(IPAPX,"/physco001/")) THEN
          CALL hdf5_read_data(IPAPX,"/physc001/ISOTYP",TYPISO)
        ENDIF
        DO I=1,NBISO
          IF(TYPISO(I).EQ.'FISS') NISOF=NISOF+1
          IF(TYPISO(I).EQ.'F.P.') NISOP=NISOP+1
          IF(TYPISO(I).EQ.'OTHE') NISOS=NISOS+1
        ENDDO
        DEALLOCATE(TYPISO)
      ENDIF
      IF(NCAL.EQ.0) GO TO 20
*----
*  SET DECAYC, NVALUE AND TREEVAL
*----
      NLAM=0
      NISOTS=0
      IF(hdf5_group_exists(IPAPX,"/physconst/")) THEN
        CALL hdf5_info(IPAPX,"/physconst/DECAYC",RANK,TYPE,NBYTE,DIMSR)
      ELSE IF(hdf5_group_exists(IPAPX,"/physco001/")) THEN
        CALL hdf5_info(IPAPX,"/physc001/DECAYC",RANK,TYPE,NBYTE,DIMSR)
      ENDIF
      IF(RANK.NE.99) THEN
        NLAM=DIMSR(1)
        NISOTS=DIMSR(2)
      ENDIF
      NPAR=0
      CALL hdf5_info(IPAPX,"/paramdescrip/NVALUE",RANK,TYPE,NBYTE,DIMSR)
      IF(RANK.NE.99) NPAR=DIMSR(1)
      NVP=0
      IF(hdf5_group_exists(IPAPX,"/paramtree")) THEN
        CALL hdf5_info(IPAPX,"/paramtree/TREEVAL",RANK,TYPE,NBYTE,DIMSR)
        IF(RANK.NE.99) NVP=DIMSR(1)
      ENDIF
*----
*  SET NSURFD
*----
      RECNAM='calc       1/miscellaneous/'
      CALL hdf5_info(IPAPX,TRIM(RECNAM)//"ADF",RANK,TYPE,NBYTE,DIMSR)
      IF(TYPE.NE.99) NSURFD=NSURFD+DIMSR(1)
      CALL hdf5_info(IPAPX,TRIM(RECNAM)//"CPDF",RANK,TYPE,NBYTE,DIMSR)
      IF(TYPE.NE.99) NSURFD=NSURFD+DIMSR(1)
      CALL hdf5_info(IPAPX,TRIM(RECNAM)//"INTERNAL_ADF",RANK,TYPE,NBYTE,
     1 DIMSR)
      IF(TYPE.NE.99) NSURFD=NSURFD+DIMSR(1)
      CALL hdf5_info(IPAPX,TRIM(RECNAM)//"INTERNAL_CPDF",RANK,TYPE,
     1 NBYTE,DIMSR)
      IF(TYPE.NE.99) NSURFD=NSURFD+DIMSR(1)
*----
*  SET NPRC
*----
      NPRC=0
      CALL hdf5_list_groups(IPAPX, "calc       1", LIST)
      DO I=1,SIZE(LIST)
        IF(TRIM(LIST(I)).EQ.'kinetics') THEN
          RECNAM='calc       1/kinetics/LAMBDA'
          CALL hdf5_info(IPAPX,TRIM(RECNAM)//"INTERNAL_ADF",RANK,TYPE,
     1    NBYTE,DIMSR)
          IF(TYPE.NE.99) NPRC=DIMSR(1)
          EXIT
        ENDIF
*----
*  SET NMIL
*---- 
        IF(LIST(I)(:2).EQ.'xs') THEN
          IF(LEN(LIST(I)).EQ.2) CYCLE
          READ(LIST(I),'(2X,I8)') II
          NMIL=MAX(II,NMIL)
        ENDIF
      ENDDO
      DEALLOCATE(LIST)
*----
*  PRINT APEX PARAMETERS
*----
   20 IF(IMPX.GT.0) THEN
        WRITE(IOUT,'(/38H APXTOC: table of content information:)')
        WRITE(IOUT,'(32H   nb of radioactive reactions =,I3)') NLAM
        WRITE(IOUT,'(36H   nb of neutron-induced reactions =,I3)') NREA
        WRITE(IOUT,'(34H   nb of particularized isotopes =,I4)') NBISO
        WRITE(IOUT,'(27H   nb of macroscopic sets =,I2)') NBMAC
        WRITE(IOUT,'(19H   nb of mixtures =,I5)') NMIL
        WRITE(IOUT,'(28H   nb of global parameters =,I4)') NPAR
        WRITE(IOUT,'(38H   nb of nodes in the parameter tree =,I4)') NVP
        WRITE(IOUT,'(42H   nb of particularized fissile isotopes =,I4)')
     1  NISOF
        WRITE(IOUT,'(42H   nb of particularized fission products =,I4)')
     1  NISOP
        WRITE(IOUT,'(41H   nb of particularized stable isotopes =,I4)')
     1  NISOS
        WRITE(IOUT,'(23H   nb of calculations =,I9)') NCAL
        WRITE(IOUT,'(24H   nb of energy groups =,I4)') NGRP
        WRITE(IOUT,'(44H   maximum nb of isotopes in output tables =,
     1  I4)') NISOTS
        WRITE(IOUT,'(39H   nb of discontinuity factors values =,I4)')
     1  NSURFD
        WRITE(IOUT,'(21H   nb of precursors =,I4/)') NPRC
      ENDIF
      RETURN
      END