summaryrefslogtreecommitdiff
path: root/Donjon/src/AFM.f
blob: a835024cda420243a9be294c6e9f320693f5e722 (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
*DECK AFM
      SUBROUTINE AFM(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Generate a macrolib using the AFM feedback model
*
*Copyright:
* Copyright (C) 2002 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):  
* M.T. Sissaoui
*
*Update(s):
*  E. Varin, B. Dionne
*
*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.
*
*Reference:
* M. T. Sissaoui, G. Marleau and D. Rozon, "CANDU Reactor Simulations
* Using the Feedback Model with Actinide Burnup History," Nucl.
* Technology, 125, 197 (1999).
*
*Comments:
* The AFM: calling specifications are:
* MACRO := AFM: [ MACRO ] DBASE [ MAPFL ] :: (descafm) ;
* where
*   MACRO : name of the extended \emph{macrolib}
*   DBASE : name of the \emph{database} object containing fuel properties with 
*     respect to local parameters.
*   MAPFL : name of the \emph{map} object containing fuel regions description 
*     and burnupinformations. This file is only required when a \emph{MACRO is 
*     created for fuel area.
*   (descafm) : structure containing the data to module AFM:.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      INTEGER      NENTRY,IENTRY(NENTRY),JENTRY(NENTRY)
      TYPE(C_PTR)  KENTRY(NENTRY)
      CHARACTER    HENTRY(NENTRY)*12
*----
*  LOCAL VARIABLES
*----
      PARAMETER (NSTATE=40) 
      CHARACTER TEXT12*12,HSMG*131,HSIGN*12,TEXT*5,CTITRE*72,TINFO*72
      LOGICAL LMCR,LMAP
      DOUBLE PRECISION DFLOTT
      INTEGER  IPAR(NSTATE),IDATA(NSTATE)
      TYPE(C_PTR) IPLIST
*
      LMCR=.FALSE.
      LMAP=.FALSE.
      MSFT=0
*
* PARAMETER VALIDATION.
      IF(NENTRY.LE.1) CALL XABORT('AFM: 2 PARAMETER EXPECTED.')
      IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2)) CALL XABORT('AFM:'
     1 //'  MACROLIB LINKED LIST OR XSM FILE EXPECTED AT LHS.')
*
      IF((IENTRY(2).NE.1).AND.(IENTRY(2).NE.2)) CALL XABORT('AFM:'
     1 //' DATABASE LINKED LIST OR XSM FILE EXPECTED AT RHS.')
      IF(JENTRY(2).NE.2) CALL XABORT('AFM: DATABASE IN READ-ONLY '
     1 //'MODE EXPECTED AT RHS.')
*
      CALL REDGET (INDIC,NITMA,FLOTT,TEXT,DFLOTT)
      IF(INDIC.NE.3) CALL XABORT('AFM: CHARACTER DATA EXPECTED.')
      IF(TEXT.EQ.'MCR') THEN
        LMCR=.TRUE.
        WRITE(6,'(A37)') 'AFM: GENERATION OF A SINGLE MACROLIB'
        CALL REDGET (INDIC,MXSH,FLOTT,TEXT,DFLOTT)
        IF(INDIC.NE.1) CALL XABORT('AFM: INTEGER DATA EXPECTED.')
      ELSEIF(TEXT.EQ.'MAP') THEN
        LMAP=.TRUE.
        IF((IENTRY(3).NE.1).AND.(IENTRY(3).NE.2)) CALL XABORT('AFM:'
     1    //' FUEL MAP LINKED LIST OR XSM FILE EXPECTED AT RHS.')
        IF(JENTRY(3).NE.2) CALL XABORT('AFM: COMPO IN READ-ONLY '
     1    //'MODE EXPECTED AT RHS.')
      ELSE
         CALL XABORT('AFM: MAP OR MCR KEY WORD EXPECTED')
      ENDIF
*
      ITYPE=JENTRY(1)
      IPLIST=KENTRY(1)
      MMIX=1
*---------------------------------------------------------------*
* CHECK THE SIGNTURE OF THE LINKED LIST OR XSM FILE
      CALL LCMGTC(KENTRY(2),'SIGNATURE',12,HSIGN)
      IF(HSIGN.NE.'REACTOR_XSDB') THEN
         TEXT12=HENTRY(2)
         CALL XABORT('AFM: SIGNATURE OF '//TEXT12//' IS '//HSIGN//
     1   '. REACTOR_XSDB EXPECTED.')
      ENDIF
*---------------------------------------------------------------*
* IF L_MAP IS NOT AVAILABLE AFM GENERATE ONLY A TABLE
      IF(LMAP) THEN
        CALL LCMGTC(KENTRY(3),'SIGNATURE',12,HSIGN)
        IF(HSIGN.NE.'L_MAP') THEN
          TEXT12=HENTRY(3)
          CALL XABORT('AFM: SIGNATURE OF '//TEXT12//' IS '//HSIGN//
     1   '. L_MAP EXPECTED.')
        ENDIF
        WRITE(6,'(A42)') 'AFM: GENARATION OF A MACROLIB USING L_MAP'
      ENDIF
*---------------------------------------------------------------*
*        READ THE INFORMATION TITLE.
      CALL REDGET (INDIC,NITMA,FLOTT,TEXT,DFLOTT)
      IF(INDIC.NE.3) CALL XABORT('AFM: CHARACTER DATA EXPECTED.')
      IF(TEXT.EQ.'INFOR') THEN
         CALL REDGET(INDIC,NITMA,FLOTT,TINFO,DFLOTT)
         IF(INDIC.NE.3) CALL XABORT('AFM: CHARACTER DATA EXPECTED.')
      ELSE
          CALL XABORT('AFM:KEY WORD INFOR EXPECTED.')
      ENDIF
*
* RECOVER SOME INFORMATIONS FROM THE DATABASE.
      TEXT12='INFORMATION'
      CALL LCMLEN(KENTRY(2),TEXT12,LENGT,ITYLCM)
      IF(LENGT.GT.0) THEN
        CALL LCMGTC(KENTRY(2),'INFORMATION',72,CTITRE)
        WRITE(6,*)'INFORMATION TITLE ',TINFO
*
        IF(CTITRE.NE.TINFO) THEN
            CALL XABORT('AFM: INCONSISTENT TITLES  '//CTITRE//
     1      '  EXPECTED. INSTEAD OF ' //TINFO// ' ')
        ENDIF
      ELSE
        CALL XABORT('AFM: DATA BASE TITLE IS NOT PROVIDED ')
      ENDIF
*---------------------------------------------------------------*
*        CHECK THE NAMES OF THE DIFFERENTS DIRECTORIES
      CALL REDGET (INDIC,NITMA,FLOTT,TEXT,DFLOTT)
      IF(INDIC.NE.3) CALL XABORT('AFM: CHARACTER DATA EXPECTED.')
      IF(TEXT.NE.'DNAME') CALL XABORT('AFM:KEY WORD DNAME EXPECTED.')
      CALL REDGET(INDIC,NUT,FLOTT,TEXT,DFLOTT)
      IF(INDIC.NE.1) CALL XABORT('AFM: INTEGER DATA EXPECTED.')
      IF(NUT.GT.1.AND.LMCR) CALL XABORT('AFM: INVALID NUMBER.')
      DO 100 IJ=1,NUT
        CALL REDGET (INDIC,NITMA,FLOTT,TEXT12,DFLOTT)
        IF(INDIC.NE.3) CALL XABORT('AFM: CHARACTER DATA EXPECTED.')
        CALL LCMLEN(KENTRY(2),TEXT12,LENGT,ITYLCM)
        IF(LENGT.EQ.0) THEN
           CALL XABORT('AFM: DATA NAME  '//TEXT12//
     1        '  DO NOT EXIST ')
         ENDIF
 100  CONTINUE
*---------------------------------------------------------------*
*     RECOVER SOME INFORMATIONS FROM DATABASE.
*     TEXT12='SIGNATURE'
      CALL LCMSIX(KENTRY(2),TEXT12,1)
*     RECOVER THE TITLE.
      CALL LCMLEN(KENTRY(2),'TITLE',LENGT,ITYLCM)
      IF(LENGT.GT.0) THEN
         CALL LCMGTC(KENTRY(2),'TITLE',72,CTITRE)
      ELSE
         CTITRE='*** NO TITLE PROVIDED ***'
      ENDIF
*     READ PARAMETERS DANS L_FBM 
      CALL LCMGET(KENTRY(2),'PARAM',IPAR)
      CALL LCMSIX(KENTRY(2),' ',2)
      NGRP =IPAR(1)
      NISO =IPAR(2)
      NL   =IPAR(3)
      NBURN=IPAR(4)
      IXYZ =IPAR(5)
*---------------------------------------------------------------*
      IF(LMCR) THEN
        NBCH=MXSH
        NCCO=1
        NCZO=1
        ISC=4
        MMIX=NBCH*NCCO
        MSFT =0
      ELSEIF (LMAP) THEN
* RECOVER INFORMATIONS FROM L_MAP.
*     READ PARAMETERS
        CALL LCMGET(KENTRY(3),'STATE-VECTOR',IPAR)
        NBCH =IPAR(1)
        NCCO =IPAR(2)
        NCZO =IPAR(3)
        ISC  =IPAR(5)
        MSFT =IPAR(6)
        NPARM =IPAR(8)
        MMIX=NBCH*NCCO
C HISTORY PARAMETER
        IF(IPAR(4).NE.NGRP) THEN
            WRITE(HSMG,'(A40,I5,A18,I5)') 'AFM: INCONSISTENT NB OF '
     1        //'GROUPS. IN MAP =',IPAR(4),' IN REACTOR_XSDB =',NGRP
            CALL XABORT(HSMG)
        ENDIF
      ENDIF
*  MSFT IS THE TOTAL NUMBER OF SHIFT
      MNPS=MSFT+2
*  READ THE INPUT DATA.
*  TO USE THE SAME VECTOR TO GET THE REFERENCE LOCAL PARAMETER
*      IF(NISO.LT.8) THEN
*        NISM=8
      IF(NISO.LT.7) THEN
        NISM=7
      ELSE
        NISM=NISO
      ENDIF
      IF(ITYPE.NE.0) THEN
         CALL LCMGET(IPLIST,'STATE-VECTOR',IDATA)
         IF(NGRP.NE.IDATA(1)) CALL XABORT('WRONG NUMBER OF ENERGY'
     1   //' GROUPS IN UPDATED MACROLIB')
         IF(MMIX.NE.IDATA(2)) CALL XABORT('WRONG NUMBER OF MATER'
     1   //'IAL MIXTURES IN UPDATED MACROLIB')
         IF(NL.NE.IDATA(3)) CALL XABORT('WRONG ORDER OF ANISOTROPY'
     1   //'IN UPDATED MACROLIB')
      ENDIF
*---------------------------------------------------------------*
*        NTYP TYPE OF CROSS-SECTIONS CONSIDERED
         NTYP=5+NL+IXYZ*2
*---------------------------------------------------------------*
*        DRIVER TO COMPUTE THE FEEDBACK COEFFICIENTS.
*---------------------------------------------------------------*
      CALL AFMDRV(KENTRY,NENTRY,NPARM,ITYPE,NBURN,NGRP,NISO,ISC,MNPS,
     1 NL,ILEAK,NTYP,NBCH,NCCO,NCZO,NUT,CTITRE,LMCR,IXYZ,MMIX,MSFT,
     2 NISM)
*---------------------------------------------------------------*
      IF(JENTRY(1).EQ.0) THEN
        IDATA(:NSTATE)=0
        HSIGN='L_MACROLIB'
        CALL LCMPTC(IPLIST,'SIGNATURE',12,HSIGN)
        IDATA(1)=NGRP
        IDATA(2)=MMIX
        IDATA(3)=NL
        IDATA(4)=1
        IDATA(9)=ILEAK
        CALL LCMPUT(IPLIST,'STATE-VECTOR',NSTATE,1,IDATA)
      ELSE
        IDATA(1)=NGRP
        IDATA(2)=MMIX
        IDATA(3)=1
        IDATA(4)=1
        IDATA(9)=ILEAK
        CALL LCMPUT(IPLIST,'STATE-VECTOR',NSTATE,1,IDATA)
      ENDIF
      RETURN
      END