summaryrefslogtreecommitdiff
path: root/Donjon/src/FLPOW.f
blob: 7de92419ebd383b2cc58a16de13e3b1308c750c9 (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
*DECK FLPOW
      SUBROUTINE FLPOW(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY)
*
*-----------------------------------------------------------------------
*
*Purpose:
* compute and print power and flux distributions over the reactor core.
*
*Copyright:
* Copyright (C) 2007 Ecole Polytechnique de Montreal.
*
*Author(s): 
* D. Sekki
*
*Update(s):
*  M. Guyot 15/07/10 : Creation of L_FLUX object to be used by
*  module DETECT:, 
*  
*Parameters: input
* NENTRY  number of data structures transfered to this module.
* HENTRY  name of the data structures.
* IENTRY  data structure type where:
*         IENTRY=1 for LCM memory object;
*         IENTRY=2 for XSM file;
*         IENTRY=3 for sequential binary file;
*         IENTRY=4 for sequential ASCII file.
* JENTRY  access permission for the data structure where:
*         JENTRY=0 for a data structure in creation mode;
*         JENTRY=1 for a data structure in modifications mode;
*         JENTRY=2 for a data structure in read-only mode.
* KENTRY  data structure pointer.
*
*Comments:
* The FLPOW: module specifications are:
* Option 1
* POWER [ NRMFLUX ] [ FMAP ] := FLPOW:  [ POWOLD ] FMAP
*  { FLUX | KINET } TRACK MATEX [ MACRO ] :: (descflpow} ;
* Option 2
* POWER := FLPOW:  [ POWOLD ] { FLUX | KINET }  TRACK MACRO :: (descflpow) ;
* where
*   POWER   : name of the \emph{power} object that will be created by the 
*     module. It will contain the information related to the reactor fluxes 
*     and powers.
*   NRMFLUX : name of the \emph{flux} object, in creation mode. According to 
*     the chosen option, this object contains either the fluxes normalized to 
*     the given total reactor power or the fluxes per bundle. Is it useful if 
*     you want to compute the detectors readings with the DETECT: module.
*   POWOLD  : name of the read-only \emph{power} object. It must contain the 
*     previously computed flux normalization factor, which corresponds to the 
*     reactor nominal or equilibrium conditions.
*   FMAP    : name of the \emph{fmap} object containing the fuel lattice 
*     specification. When FMAP is specified on the RHS, the fluxes and powers 
*     calculations are performed over the fuel lattice as well as over the 
*     whole reactor geometry. If FMAP is specified on the LHS, its records 
*     'BUND-PW' and 'FLUX-AV' will be set according to the information present 
*     in POWER.
*   FLUX    : name of the \emph{flux} object, previously created by the 
*     FLUD: module. The numerical flux solution contained in FLUX is 
*     recovered and all flux are normalized to the given total reactor power.
*   KINET   : name of the \emph{kinet} object, previously created by the 
*     KINSOL: module. The numerical flux solution contained in KINET is 
*     recovered.
*   TRACK   : name of the \emph{track} object, created by the TRIVAT: module. 
*     The information stored in TRACK is recovered and used for the average 
*     flux calculation.
*   MATEX   : name of the \emph{matex} object, containing the reactor material 
*     index and the h-factors that will be recovered and used for the power 
*     calculation.
*   MACRO name of the \emph{macrolib} object, containing the h-factors that 
*     will be recovered and used for the power calculation.
*   (descflpow) : structure describing the input data to the FLPOW: module .
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      INTEGER      NENTRY,IENTRY(NENTRY),JENTRY(NENTRY)
      TYPE(C_PTR)  KENTRY(NENTRY)
      CHARACTER    HENTRY(NENTRY)*12
*----
*  LOCAL VARIABLES
*----
      CHARACTER HSIGN*12,TEXT*12
      LOGICAL LNEW,LMAP,LFLX,LRAT,LPOW,LFSTH,LFLU,LNRM,LBUN
      DOUBLE PRECISION DFLOT
      TYPE(C_PTR) IPPOW,IPFLX,IPKIN,IPTRK,IPMTX,IPMAP,IPMAC,IPNFX
*----
*  PARAMETER VALIDATION
*----
      LFLU=.FALSE.
      IF(NENTRY.LT.4)CALL XABORT('@FLPOW: PARAMETER EXPECTED.')
      TEXT=HENTRY(1)
      IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2))CALL XABORT('@FLPOW'
     1 //': LCM OBJECT FOR L_POWER EXPECTED AT LHS ('//TEXT//').')
      IF(JENTRY(1).NE.0)CALL XABORT('@FLPOW: CREATE MODE FOR L_POW'
     1 //'ER EXPECTED AT LHS ('//TEXT//').')
      IPPOW=KENTRY(1)
      IF(JENTRY(2).EQ.0)THEN
        LFLU=.TRUE.
        IPNFX=KENTRY(2)
      ENDIF
      IPFLX=C_NULL_PTR
      IPKIN=C_NULL_PTR
      IPTRK=C_NULL_PTR
      IPMTX=C_NULL_PTR
      IPMAP=C_NULL_PTR
      IPMAC=C_NULL_PTR
      LNEW=.FALSE.
      JMOD=0
      IF(LFLU)THEN
        NRHS=3
      ELSE
        NRHS=2
        IPNFX=C_NULL_PTR
      ENDIF
      DO 10 IEN=NRHS,NENTRY
      IF((IENTRY(IEN).NE.1).AND.(IENTRY(IEN).NE.2))CALL XABORT('@F'
     1 //'LPOW: LCM OBJECT EXPECTED AT THE RHS.')
      CALL LCMGTC(KENTRY(IEN),'SIGNATURE',12,HSIGN)
      IF(HSIGN.EQ.'L_POWER')THEN
        IF(JENTRY(IEN).NE.2)CALL XABORT('@FLPOW: READ-ONLY MODE EXPE'
     1  //'CTED FOR THE L_POWER OBJECT AT RHS.')
        IF(LNEW)CALL XABORT('@FLPOW: L_POWER ALREADY DEFINED AT RHS.')
        CALL LCMEQU(KENTRY(IEN),IPPOW)
        LNEW=.TRUE.
      ELSEIF(HSIGN.EQ.'L_MATEX')THEN
        IF(JENTRY(IEN).NE.2)CALL XABORT('@FLPOW: READ-ONLY MODE EXPE'
     1  //'CTED FOR THE L_MATEX OBJECT AT RHS.')
        IF(.NOT.C_ASSOCIATED(IPMTX))THEN
          IPMTX=KENTRY(IEN)
        ELSE
          CALL XABORT('@FLPOW: L_MATEX ALREADY DEFINED.')
        ENDIF
      ELSEIF(HSIGN.EQ.'L_FLUX')THEN
        IF(JENTRY(IEN).NE.2)CALL XABORT('@FLPOW: READ-ONLY MODE EXPE'
     1  //'CTED FOR THE L_FLUX OBJECT AT RHS.')
        IF(.NOT.C_ASSOCIATED(IPFLX))THEN
          IPFLX=KENTRY(IEN)
        ELSE
          CALL XABORT('@FLPOW: L_FLUX ALREADY DEFINED.')
        ENDIF
      ELSEIF(HSIGN.EQ.'L_KINET')THEN
        IF(JENTRY(IEN).NE.2)CALL XABORT('@FLPOW: READ-ONLY MODE EXPE'
     1  //'CTED FOR THE L_KINET OBJECT AT RHS.')
        IF(.NOT.C_ASSOCIATED(IPKIN))THEN
          IPKIN=KENTRY(IEN)
        ELSE
          CALL XABORT('@FLPOW: L_KINET ALREADY DEFINED.')
        ENDIF
      ELSEIF(HSIGN.EQ.'L_TRACK')THEN
        IF(JENTRY(IEN).NE.2)CALL XABORT('@FLPOW: READ-ONLY MODE EXPE'
     1  //'CTED FOR THE L_TRACK OBJECT AT RHS.')
        IF(.NOT.C_ASSOCIATED(IPTRK))THEN
          IPTRK=KENTRY(IEN)
        ELSE
          CALL XABORT('@FLPOW: L_TRACK ALREADY DEFINED.')
        ENDIF
      ELSEIF(HSIGN.EQ.'L_MACROLIB')THEN
        IF(JENTRY(IEN).NE.2)CALL XABORT('@FLPOW: READ-ONLY MODE EXPE'
     1  //'CTED FOR THE L_MACROLIB OBJECT AT RHS.')
        IF(.NOT.C_ASSOCIATED(IPMAC))THEN
          IPMAC=KENTRY(IEN)
        ELSE
          CALL XABORT('@FLPOW: L_MACROLIB ALREADY DEFINED.')
        ENDIF
      ELSEIF(HSIGN.EQ.'L_MAP')THEN
        IF(JENTRY(IEN).EQ.1) JMOD=1
        IF(.NOT.C_ASSOCIATED(IPMAP))THEN
          IPMAP=KENTRY(IEN)
        ELSE
          CALL XABORT('@FLPOW: L_MAP ALREADY DEFINED.')
        ENDIF
      ENDIF
   10 CONTINUE
      IF((.NOT.C_ASSOCIATED(IPFLX)).AND.(.NOT.C_ASSOCIATED(IPKIN))) THEN
         CALL XABORT('@FLPOW: MISSING L_FLUX OR L_KINET OBJECT.')
      ELSE IF((C_ASSOCIATED(IPFLX)).AND.(C_ASSOCIATED(IPKIN))) THEN
         CALL XABORT('@FLPOW: L_FLUX AND L_KINET OBJECTS BOTH DEFINED.')
      ELSE IF(.NOT.C_ASSOCIATED(IPTRK)) THEN
         CALL XABORT('@FLPOW: MISSING L_TRACK OBJECT.')
      ELSE IF((C_ASSOCIATED(IPMAP)).AND.(.NOT.C_ASSOCIATED(IPMTX))) THEN
         CALL XABORT('@FLPOW: MISSING L_MATEX OBJECT.')
      ELSE IF((.NOT.C_ASSOCIATED(IPMAP)).AND.(C_ASSOCIATED(IPMTX))) THEN
         CALL XABORT('@FLPOW: MISSING L_MAP OBJECT.')
      ELSE IF((.NOT.C_ASSOCIATED(IPMTX)).AND.
     1        (.NOT.C_ASSOCIATED(IPMAC))) THEN
         CALL XABORT('@FLPOW: MISSING L_MATEX OR L_MACROLIB OBJECT.')
      ELSE IF((.NOT.C_ASSOCIATED(IPMAP)).AND.
     1        (.NOT.C_ASSOCIATED(IPMAC))) THEN
         CALL XABORT('@FLPOW: MISSING L_MAP OR L_MACROLIB OBJECT.')
      ENDIF
*----
*  READ KEYWORD
*----
      IMPX=1
      PTOT=0.0
      LFSTH=.FALSE.
      LNRM=.FALSE.
      LBUN=.FALSE.
      FSTH=0.0
      LFLX=.FALSE.
      LPOW=.FALSE.
      LMAP=.FALSE.
      LRAT=.FALSE.
   20 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
      IF(ITYP.EQ.10) GO TO 40
   30 IF(ITYP.NE.3)CALL XABORT('@FLPOW: CHARACTER DATA EXPECTED.')
      IF(TEXT.EQ.'EDIT') THEN
*       PRINTING INDEX
        CALL REDGET(ITYP,IMPX,FLOT,TEXT,DFLOT)
        IF(ITYP.NE.1)CALL XABORT('@FLPOW: INTEGER DATA EXPECTED.')
      ELSE IF(TEXT.EQ.'P-NEW') THEN
        IF(.NOT.LNEW)CALL XABORT('@FLPOW: MISSING READ-ONLY L_POWER'
     1  //' OBJECT AT RHS.')
      ELSE IF(TEXT.EQ.'PTOT') THEN
        IF(LNEW)CALL XABORT('@FLPOW: ONLY ONE L_POWER OBJECT IN CRE'
     1  //'ATE MODE EXPECTED WITH PTOT OPTION.')
        CALL REDGET(ITYP,NITMA,PTOT,TEXT,DFLOT)
        IF(ITYP.NE.2)CALL XABORT('@FLPOW: REAL FOR PTOT EXPECTED.')
        IF(PTOT.LE.0.)CALL XABORT('@FLPOW: INVALID VALUE PTOT < 0.')
      ELSE IF(TEXT.EQ.'FSTH') THEN
        CALL REDGET(ITYP,NITMA,FSTH,TEXT,DFLOT)
        IF(ITYP.NE.2)CALL XABORT('@FLPOW: REAL DATA EXPECTED FOR FSTH.')
        IF((FSTH.GT.1.0).OR.(FSTH.LE.0.0)) CALL XABORT('@FLPOW: FSTH '
     1  //'SHOULD BE BETWEEN 0.0 AND 1.0.')
        LFSTH=.TRUE.
      ELSE IF(TEXT.EQ.'NORM') THEN
        LNRM=.TRUE.
      ELSE IF(TEXT.EQ.'BUND') THEN
        IF(.NOT.C_ASSOCIATED(IPMAP)) CALL XABORT('@FLPOW: NO RHS FUELM'
     1  //'AP DEFINED.')
        LBUN=.TRUE.
      ELSE IF(TEXT.EQ.'PRINT') THEN
        CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
        IF(TEXT.EQ.'MAP')THEN
          IF(.NOT.C_ASSOCIATED(IPMAP))CALL XABORT('@FLPOW: INVALID KEY'
     1    //'WORD MAP. MISSING L_MAP OBJECT FOR PRINT.')
          LMAP=.TRUE.
        ELSEIF(TEXT.EQ.'ALL')THEN
          LFLX=.TRUE.
          LPOW=.TRUE.
          IF(C_ASSOCIATED(IPMAP))LMAP=.TRUE.
          LRAT=.TRUE.
        ELSEIF(TEXT.EQ.'DISTR')THEN
          CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
          IF(ITYP.NE.3)CALL XABORT('@FLPOW: CHARACTER DATA EXPECTED AF'
     1    //'TER DISTR.')
          IF(TEXT.EQ.'FLUX')THEN
            IF(LFLX)CALL XABORT('@FLPOW: KEYWORD FLUX ALREADY READ.')
            LFLX=.TRUE.
          ELSEIF(TEXT.EQ.'POWER')THEN
            IF(LPOW)CALL XABORT('@FLPOW: KEYWORD POWER ALREADY READ.')
            LPOW=.TRUE.
          ELSEIF(TEXT.EQ.'RATIO')THEN
            IF(LRAT)CALL XABORT('@FLPOW: KEYWORD RATIO ALREADY READ.')
            LRAT=.TRUE.
          ELSE
            GO TO 30
          ENDIF
        ELSE
          CALL XABORT('@FLPOW: KEYWORD MAP/DISTR/ALL EXPECTED.')
        ENDIF
      ELSE IF(TEXT.EQ.'INIT') THEN
        IF(JENTRY(IEN).EQ.1) JMOD=2
      ELSE IF(TEXT.EQ.';') THEN
        GO TO 40
      ELSE
        CALL XABORT('@FLPOW: INVALID KEYWORD '//TEXT//'.')
      ENDIF
      GO TO 20
*----
*  CHECK CONSISTENCY
*----
   40 IF(LMAP) THEN
        IF(.NOT.C_ASSOCIATED(IPMAP)) THEN
           CALL XABORT('@FLPOW: MISSING L_MAP OBJECT.')
        ELSE IF(.NOT.C_ASSOCIATED(IPMTX)) THEN
           CALL XABORT('@FLPOW: MISSING L_MATEX OBJECT.')
        ELSE IF(.NOT.C_ASSOCIATED(IPMAC)) THEN
           CALL XABORT('@FLPOW: MISSING L_MACROLIB OBJECT.')
        ENDIF
      ENDIF
*----
*  PERFORM CALCULATION
*----
      CALL FLPDRV(IPPOW,IPNFX,IPFLX,IPKIN,IPTRK,IPMTX,IPMAP,IPMAC,PTOT,
     1 LNEW,LMAP,JMOD,LFLX,LPOW,LRAT,IMPX,FSTH,LFSTH,LFLU,LBUN,LNRM)
      RETURN
      END