summaryrefslogtreecommitdiff
path: root/Trivac/src/KINST2.f
blob: 2c4337666c11895d3dc7703ea2ac3dfb4381c85a (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
*DECK KINST2
      SUBROUTINE KINST2(NEN,KEN,CMOD,TTF,TTP,IFL,IPR,IEXP,DT,IMPH,ICL1,
     1 ICL2,NADI,ADJ,MAXOUT,EPSOUT,MAXINR,EPSINR,FNAM,PNAM,IMPX,POWTOT)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Recover and validate the necessary information from the LCM objects.
*
*Copyright:
* Copyright (C) 2008 Ecole Polytechnique de Montreal.
*
*Author(s): D. Sekki
*
*Parameters: input
* NEN     number of LCM objects used in the module.
* KEN     addresses of LCM objects: (1) L_KINET; (2) L_MACROLIB;
*         (3) L_TRACK; (4) L_SYSTEM; (5) L_MACROLIB.
* CMOD    name of the assembly door (BIVAC or TRIVAC).
* TTF     value of theta-parameter for fluxes.
* TTP     value of theta-parameter for precursors.
* IFL     temporal integration scheme for fluxes.
* IPR     temporal integration scheme for precursors.
* IEXP    exponential transformation flag (=1 to activate).
* DT      current time increment.
* IMPH    management of convergence histogram.
* ICL1    number of free iterations in one cycle of the inverse power
*         method
* ICL2    number of accelerated iterations in one cycle
* NADI    number of inner adi iterations per outer iteration
* ADJ     flag for adjoint space-time kinetics calculation
* MAXOUT  maximum number of outer iterations
* EPSOUT  convergence criteria for the flux
* MAXINR  maximum number of thermal iterations.
* EPSINR  thermal iteration epsilon.
* FNAM    name of temporal scheme for fluxes.
* PNAM    name of temporal scheme for precursors.
* IMPX    printing parameter (=0 for no print).
*
*Parameter: output
* POWTOT  power.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      INTEGER NEN,IFL,IPR,IEXP,IMPH,ICL1,ICL2,NADI,MAXOUT,MAXINR,IMPX
      TYPE(C_PTR) KEN(NEN)
      REAL TTF,TTP,DT,EPSOUT,EPSINR,POWTOT
      CHARACTER CMOD*12,FNAM*30,PNAM*30
      LOGICAL ADJ
*----
*  LOCAL VARIABLES
*----
      PARAMETER(NSTATE=40,IOS=6)
      INTEGER ISTATE(NSTATE)
      REAL EPSCON(5)
      CHARACTER TEXT*12,HSMG*131
*----
*  L_MACROLIB STATE-VECTOR
*----
      ISTATE(:NSTATE)=0
      CALL LCMGET(KEN(2),'STATE-VECTOR',ISTATE)
      NGR=ISTATE(1)
      NBM=ISTATE(2)
      NLS=ISTATE(3)
      NBFIS=ISTATE(4)
      IF(IMPX.GT.9)CALL LCMLIB(KEN(2))
      IF(NEN.EQ.6)THEN
*       SECOND L_MACROLIB
        ISTATE(:NSTATE)=0
        CALL LCMGET(KEN(5),'STATE-VECTOR',ISTATE)
        IF(ISTATE(1).NE.NGR)CALL XABORT('@KINST2: FOUND DIFFERENT NUMB'
     1  //'ER OF ENERGY GROUPS IN MACROLIBS 1 AND 2.')
        IF(ISTATE(2).NE.NBM)CALL XABORT('@KINST2: FOUND DIFFERENT NUMB'
     1  //'ER OF MATERIAL MIXTURES IN MACROLIBS 1 AND 2.')
        IF(ISTATE(3).NE.NLS)CALL XABORT('@KINST2: FOUND DIFFERENT NUMB'
     1  //'ER OF LEGENDRE ORDERS IN MACROLIBS 1 AND 2.')
        IF(ISTATE(4).NE.NBFIS)CALL XABORT('@KINST2: FOUND DIFFERENT NU'
     1  //'MBER OF FISSILE ISOTOPES IN MACROLIBS 1 AND 2.')
        IF(IMPX.GT.9)CALL LCMLIB(KEN(5))
      ENDIF
*----
*  L_TRACK STATE-VECTOR
*----
      ISTATE(:NSTATE)=0
      CALL LCMGET(KEN(3),'STATE-VECTOR',ISTATE)
      IF(ISTATE(4).GT.NBM) THEN
         WRITE(HSMG,'(46H@KINST2: THE NUMBER OF MIXTURES IN THE TRACKIN,
     1   3HG (,I5,50H) IS GREATER THAN THE NUMBER OF MIXTURES IN THE MA,
     2   8HCROLIB (,I5,2H).)') ISTATE(4),NBM
         CALL XABORT(HSMG)
      ENDIF
      NEL=ISTATE(1)
      NUN=ISTATE(2)
      IGM=ISTATE(6)
      LL4=ISTATE(11)
      NLF=-1
      ISPN=-1
      ISCAT=-1
      IF(CMOD.EQ.'TRIVAC') THEN
        NLF=ISTATE(30)
        ISPN=ISTATE(31)
        ISCAT=ISTATE(32)
      ELSE IF(CMOD.EQ.'BIVAC') THEN
        NLF=ISTATE(14)
        ISPN=ISTATE(15)
        ISCAT=ISTATE(16)
      ENDIF
      IF((NLF.NE.0).AND.(ISPN.NE.1))CALL XABORT('@KINST2: ONLY SPN'
     1 //' DISCRETIZATIONS ARE ALLOWED.')
      IF(IMPX.GT.9)CALL LCMLIB(KEN(3))
*----
*  L_SYSTEM STATE-VECTOR
*----
      ISTATE(:NSTATE)=0
      CALL LCMGET(KEN(4),'STATE-VECTOR',ISTATE)
      IF(ISTATE(1).NE.NGR)CALL XABORT('@KINST2: FOUND DIFFERENT NUMBER'
     1 //' OF ENERGY GROUPS IN L_MACROLIB AND L_SYSTEM OBJECTS.')
      IF(ISTATE(2).NE.LL4)CALL XABORT('@KINST2: FOUND DIFFERENT NUMBER'
     1  //' OF UNKNOWNS PER GROUP IN L_MACROLIB AND L_SYSTEM OBJECTS.')
      IF(ISTATE(7).NE.NBM)CALL XABORT('@KINST2: FOUND DIFFERENT NUMBER'
     1  //' OF MATERIAL MIXTURES IN L_MACROLIB AND L_SYSTEM OBJECTS.')
      ITY=ISTATE(4)
      IF(NEN.EQ.6)THEN
*       SECOND L_SYSTEM
        ISTATE(:NSTATE)=0
        CALL LCMGET(KEN(6),'STATE-VECTOR',ISTATE)
        IF(ISTATE(1).NE.NGR)CALL XABORT('@KINST2: FOUND DIFFERENT NUMB'
     1  //'ER OF ENERGY GROUPS IN L_SYSTEM OBJECTS 1 AND 2.')
        IF(ISTATE(2).NE.LL4)CALL XABORT('@KINST2: FOUND DIFFERENT NUMB'
     1  //'ER OF UNKNOWNS PER GROUP IN L_SYSTEM OBJECTS 1 AND 2.')
        IF(ISTATE(4).NE.ITY)CALL XABORT('@KINST2: FOUND DIFFERENT DISC'
     1  //'RETIZATION TYPES IN L_SYSTEM OBJECTS 1 AND 2.')
        IF(ISTATE(7).NE.NBM)CALL XABORT('@KINST2: FOUND DIFFERENT NUMB'
     1  //'ER OF MATERIAL MIXTURES IN L_SYSTEM OBJECTS 1 AND 2.')
        IF(IMPX.GT.9)CALL LCMLIB(KEN(6))
      ENDIF
*----
*  L_KINET STATE-VECTOR
*----
      ISTATE(:NSTATE)=0
      CALL LCMGET(KEN(1),'STATE-VECTOR',ISTATE)
      ITR=ISTATE(1)
      NDG=ISTATE(2)
      NUP=ISTATE(8)
      INORM=ISTATE(13)
      IF(ISTATE(3).NE.NGR)CALL XABORT('@KINST2: FOUND DIFFERENT NUM'
     1 //'BER OF ENERGY GROUPS IN L_MACROLIB AND IN L_KINET.')
      IF(ISTATE(4).NE.IGM)CALL XABORT('@KINST2: INVALID L_TRACK(1).')
      IF(ISTATE(5).NE.NEL)CALL XABORT('@KINST2: INVALID L_TRACK(2).')
      IF(ISTATE(6).NE.NUN)CALL XABORT('@KINST2: INVALID L_TRACK(3).')
      IF(ISTATE(7).NE.LL4)CALL XABORT('@KINST2: INVALID L_TRACK(4).')
      IF(ISTATE(9).NE.NBFIS)CALL XABORT('@KINST2: INVALID L_TRACK(5).')
      IF(ISTATE(10).NE.ITY)CALL XABORT('@KINST2: INVALID L_SYSTEM.')
      ITR=ITR+1
      ISTATE(1)=ITR
      ISTATE(11)=ICL1
      ISTATE(12)=ICL2
      ISTATE(14)=MAXINR
      ISTATE(15)=MAXOUT
      ISTATE(16)=NADI
      ISTATE(17)=IFL
      ISTATE(18)=IPR
      ISTATE(19)=IEXP
      IF(ADJ) ISTATE(20)=1
      CALL LCMPUT(KEN(1),'STATE-VECTOR',NSTATE,1,ISTATE)
      EPSCON(1)=EPSINR
      EPSCON(2)=EPSOUT
      EPSCON(3)=TTF
      EPSCON(4)=TTP
      CALL LCMPUT(KEN(1),'EPS-CONVERGE',4,2,EPSCON)
      IF(IMPX.GT.9)CALL LCMLIB(KEN(1))
*----
*  PERFORM KINETICS CALCULATION
*----
      DTIM=0.0
      CALL LCMLEN(KEN(1),'TOTAL-TIME',LEN,ITLCM)
      IF(LEN.NE.0) CALL LCMGET(KEN(1),'TOTAL-TIME',DTIM)
      IF(.NOT.ADJ) THEN
        DTIM=DTIM+DT
      ELSE
        DTIM=DTIM-DT
      ENDIF
      CALL LCMPUT(KEN(1),'TOTAL-TIME',1,2,DTIM)
      CALL LCMPUT(KEN(1),'DELTA-T',1,2,DT)
      IF(IMPX.GT.0) THEN
        WRITE(IOS,1001)DT,DTIM
        IF(ADJ) WRITE(IOS,'(28H ADJOINT SPACE-TIME KINETICS)')
        TEXT=' TIME-STEP #'
        WRITE(IOS,*)'       CURRENT',TEXT,ITR
        WRITE(IOS,1002) FNAM,PNAM
      ENDIF
      CALL KINDRV(NEN,KEN,CMOD,NGR,NBM,NBFIS,NDG,NLF,ITY,NEL,LL4,NUN,
     1 NUP,TTF,TTP,DT,IMPH,ICL1,ICL2,NADI,ADJ,MAXOUT,EPSOUT,MAXINR,
     2 EPSINR,IFL,IPR,IEXP,INORM,IMPX,POWTOT)
      IF(IMPX.GT.3) CALL LCMLIB(KEN(1))
      RETURN
*
 1001 FORMAT(/1X,5('--o--',5X)//8X,'PERFORMING KINETICS',
     1 1X,'CALCULATION'/8X,31('-')//8X,'TIME',1X,'INCRE',
     2 'MENT',1X,'=',1X,1P,E11.4,1X,'SEC'/8X,'ELAPSED TI',
     3 'ME',3X,'=',1X,1P,E11.4,1X,'SEC')
 1002 FORMAT(/1X,5('--o--',5X)//1X,'TEMPORAL SCHEME FOR',
     1 1X,'FLUX',2X,'=>',2X,A30/1X,'TEMPORAL SCHEME FOR',
     2 1X,'PRECURSORS',2X,'=>',2X,A30/)
      END