summaryrefslogtreecommitdiff
path: root/Dragon/src/APXIDF.f
blob: 84ecc91abfe1580e074c02a3ff3c3b5eb4e53d80 (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
*DECK APXIDF
      SUBROUTINE APXIDF(IPAPX,IPEDIT,NG,NMIL,ICAL,IDF,NALBP,FNORM,
     1 VOLMIL,FLXMIL)
*
*-----------------------------------------------------------------------
*
*Purpose:
* To store discontinuity factor and albedo information in the Apex file.
*
*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).
* NG      number of condensed energy groups.
* NMIL    number of mixtures.
* ICAL    index of the current elementary calculation.
* IDF     type of surfacic information (2/3: boundary flux/DF).
* NALBP   number of physical albedos per energy group.
* FNORM   flux normalization factor.
* VOLMIL  mixture volumes.
* FLXMIL  averaged flux of mixtures.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
      USE hdf5_wrap
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) IPAPX,IPEDIT
      INTEGER NG,NMIL,ICAL,IDF,NALBP
      REAL FNORM,VOLMIL(NMIL),FLXMIL(NMIL,NG)
*----
*  LOCAL VARIABLES
*----
      CHARACTER HSMG*131,RECNAM*80,RECNAM2*80
*----
*  ALLOCATABLE ARRAYS
*----
      REAL, ALLOCATABLE, DIMENSION(:) :: SURF
      REAL, ALLOCATABLE, DIMENSION(:,:) :: VREAL,ALBP
      REAL, ALLOCATABLE, DIMENSION(:,:,:) :: DISFAC
      CHARACTER(LEN=8), ALLOCATABLE, DIMENSION(:) :: HADF
*----
*  RECOVER DISCONTINUITY FACTOR INFORMATION FROM MACROLIB
*----
      CALL LCMSIX(IPEDIT,'MACROLIB',1)
      CALL LCMLEN(IPEDIT,'ADF',ILONG,ITYLCM)
      IF(ILONG.NE.0) THEN
        CALL LCMSIX(IPEDIT,'ADF',1)
        CALL LCMGET(IPEDIT,'NTYPE',NSURFD)
        NGG=0
        IF((IDF.EQ.2).OR.(IDF.EQ.3)) THEN
          NGG=NG
        ELSE
          CALL XABORT('APXIDF: INVALID ADF OPTION.')
        ENDIF
        ALLOCATE(DISFAC(NSURFD,NGG,NMIL),SURF(NMIL*NGG),HADF(NSURFD))
        CALL LCMGTC(IPEDIT,'HADF',8,NSURFD,HADF)
        DO I=1,NSURFD
          CALL LCMLEN(IPEDIT,HADF(I),ILONG,ITYLCM)
          IF(IDF.EQ.2) THEN
*           boundary flux information
            IF(ILONG.NE.NMIL*NG) THEN
              WRITE(HSMG,'(16HAPXIDF: INVALID ,A,8H LENGTH=,I5,
     1        10H EXPECTED=,I5,4H.(1))') HADF(I),ILONG,NMIL*NG
              CALL XABORT(HSMG)
            ENDIF
            CALL LCMGET(IPEDIT,HADF(I),SURF)
            DO IMIL=1,NMIL
              DO IGR=1,NG
                IF(FNORM.NE.1.0) THEN
                  DISFAC(I,IGR,IMIL)=SURF((IGR-1)*NMIL+IMIL)*
     1            FNORM*1.0E13*VOLMIL(IMIL)/FLXMIL(IMIL,IGR)
                ELSE
                  DISFAC(I,IGR,IMIL)=SURF((IGR-1)*NMIL+IMIL)*
     1            VOLMIL(IMIL)/FLXMIL(IMIL,IGR)
                ENDIF
              ENDDO
            ENDDO
          ELSE IF(IDF.EQ.3) THEN
*           discontinuity factor information
            IF(ILONG.NE.NMIL*NG) THEN
              WRITE(HSMG,'(16HAPXIDF: INVALID ,A,8H LENGTH=,I5,
     1        10H EXPECTED=,I5,4H.(2))') HADF(I),ILONG,NMIL*NG
              CALL XABORT(HSMG)
            ENDIF
            CALL LCMGET(IPEDIT,HADF(I),SURF)
            DO IMIL=1,NMIL
              DO IGR=1,NG
                IOF=(IGR-1)*NMIL+IMIL
                DISFAC(I,IGR,IMIL)=SURF(IOF)
              ENDDO
            ENDDO
          ENDIF
        ENDDO
        DEALLOCATE(HADF,SURF)
        CALL LCMSIX(IPEDIT,' ',2)
*----
*  MOVE TO THE /calc_id/miscellaneous/ GROUP.
*----
        WRITE(RECNAM,'(4Hcalc,I8,15H/miscellaneous/)') ICAL
        IF((IDF.EQ.2).OR.(IDF.EQ.3)) THEN
          IF(NMIL.EQ.1) THEN
            ALLOCATE(VREAL(NSURFD,NG))
            VREAL(:NSURFD,:NG)=DISFAC(:NSURFD,:NG,1)
            CALL hdf5_write_data(IPAPX,TRIM(RECNAM)//"ADF",VREAL)
            DEALLOCATE(VREAL)
          ELSE
            DO IMIL=1,NMIL
              WRITE(RECNAM2,'(A,3HADF,I8)') TRIM(RECNAM),IMIL
              ALLOCATE(VREAL(NSURFD,NG))
              VREAL(:NSURFD,:NG)=DISFAC(:NSURFD,:NG,IMIL)
              CALL hdf5_write_data(IPAPX,TRIM(RECNAM2),VREAL)
              DEALLOCATE(VREAL)
            ENDDO
          ENDIF
        ENDIF
        DEALLOCATE(DISFAC)
      ENDIF
*----
*  RECOVER AND SAVE ALBEDO INFORMATION
*----
      IF(NALBP.NE.0) THEN
        WRITE(RECNAM,'(4Hcalc,I8,15H/miscellaneous/)') ICAL
        CALL LCMLEN(IPEDIT,'ALBEDO',ILONG,ITYLCM)
        IF(ILONG.EQ.NALBP*NG) THEN
          ALLOCATE(ALBP(NALBP,NG))
          CALL LCMGET(IPEDIT,'ALBEDO',ALBP)
          CALL hdf5_write_data(IPAPX,TRIM(RECNAM)//"ALBEDO",ALBP)
          DEALLOCATE(ALBP)
        ELSE
          CALL XABORT('APXIDF: INCONSISTENT ALBEDO INFORMATION.')
        ENDIF
      ENDIF
      CALL LCMSIX(IPEDIT,' ',2)
      RETURN
      END