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
|
*DECK KINRD1
SUBROUTINE KINRD1(NEN,KEN,CMOD,NGR,NBM,NBFIS,NEL,NUN,NDG)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Read and validate the module options from the input file.
*
*Copyright:
* Copyright (C) 2008 Ecole Polytechnique de Montreal.
*
*Author(s): D. Sekki
*
*Parameters: input/output
* 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; (6) L_FLUX.
* CMOD name of the assembly door (BIVAC or TRIVAC).
* NGR number of energy groups.
* NBM number of material mixtures.
* NBFIS number of fissile isotopes.
* NEL total number of finite elements.
* NUN total number of unknowns per energy group.
* NDG number of delayed-neutron groups (=0 if not in macrolib).
*
*-----------------------------------------------------------------------
*
USE GANLIB
*----
* SUBROUTINE ARGUMENTS
*----
INTEGER NEN,NGR,NBM,NBFIS,NEL,NUN,NDG
TYPE(C_PTR) KEN(NEN)
CHARACTER CMOD*12
*----
* LOCAL VARIABLES
*----
PARAMETER(NSTATE=40,IOS=6)
INTEGER ISTATE(NSTATE),MAT(NEL),IDLPC(NEL)
DOUBLE PRECISION DFLOT
CHARACTER TEXT*12
LOGICAL LNUD,LCHD,LLAD,LPRIMA
REAL, DIMENSION(:), ALLOCATABLE :: DNF,PD
REAL, DIMENSION(:,:), ALLOCATABLE :: DNS
*----
* READ THE INPUT DATA
*----
IMPX=1
LNUD=.FALSE.
LCHD=.FALSE.
LLAD=.FALSE.
INORM=0
FNORM=1.0
POWER=0.0
IELEM=-1
NLF=-1
LPRIMA=.FALSE.
10 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
IF(ITYP.NE.3)CALL XABORT('@KINRD1: CHARACTER DATA EXPECTED(1).')
IF(TEXT.EQ.';')THEN
GOTO 60
ELSEIF(TEXT.EQ.'EDIT') THEN
CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
IF(ITYP.NE.1)CALL XABORT('@KINRD1: INTEGER FOR EDIT EXPECTED.')
IMPX=MAX(0,NITMA)
IF(IMPX.GT.9)WRITE(IOS,1001)
ELSEIF(TEXT.EQ.'NGRP') THEN
CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
IF(ITYP.NE.1)CALL XABORT('@KINRD1: INTEGER FOR NGRP EXPECTED.')
IF(NGR.NE.NITMA)CALL XABORT('@KINRD1: INVALID INPUT FOR NGRP.')
ELSEIF(TEXT.EQ.'NDEL') THEN
CALL REDGET(ITYP,NDG,FLOT,TEXT,DFLOT)
IF(ITYP.NE.1)CALL XABORT('@KINRD1: INTEGER FOR NDEL EXPECTED.')
ELSEIF(TEXT.EQ.'BETA')THEN
LNUD=.TRUE.
ALLOCATE(DNF(NDG))
DO 20 IDG=1,NDG
CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
IF(ITYP.NE.2)CALL XABORT('@KINRD1: REAL DATA EXPECTED(1).')
IF(FLOT.LE.0.)CALL XABORT('@KINRD1: INVALID BETA VALUE.')
DNF(IDG)=FLOT
20 CONTINUE
ELSEIF(TEXT.EQ.'LAMBDA')THEN
LLAD=.TRUE.
ALLOCATE(PD(NDG))
DO 30 IDG=1,NDG
CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
IF(ITYP.NE.2)CALL XABORT('@KINRD1: REAL DATA EXPECTED(2).')
IF(FLOT.LE.0.)CALL XABORT('@KINRD1: INVALID LAMBDA VALUE.')
PD(IDG)=FLOT
30 CONTINUE
ELSEIF(TEXT.EQ.'CHID')THEN
LCHD=.TRUE.
ALLOCATE(DNS(NDG,NGR))
DO 55 JGR=1,NGR
DO 50 IDG=1,NDG
CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
IF(ITYP.NE.2)CALL XABORT('@KINRD1: REAL DATA EXPECTED(3).')
DNS(IDG,JGR)=FLOT
50 CONTINUE
55 CONTINUE
ELSEIF(TEXT.EQ.'NORM')THEN
CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
IF(ITYP.EQ.2) THEN
INORM=1
FNORM=FLOT
ELSE IF((ITYP.EQ.3).AND.(TEXT.EQ.'MAX')) THEN
INORM=2
FNORM=0.0
ELSE IF((ITYP.EQ.3).AND.(TEXT.EQ.'POWER-INI')) THEN
INORM=3
FNORM=0.0
CALL REDGET(ITYP,NITMA,POWER,TEXT,DFLOT)
IF(ITYP.NE.2)CALL XABORT('@KINRD1: REAL FOR POWER EXPECTED.')
IF(POWER.LT.0.)CALL XABORT('@KINRD1: INVALID POWER VALUE.')
ELSE
CALL XABORT('@KINRD1: ''MAX'', ''POWER-INI'' OR REAL DATA EX'
1 //'PECTED')
ENDIF
ELSE
CALL XABORT('@KINRD1: INVALID KEYWORD '//TEXT//'.')
ENDIF
GO TO 10
60 IF(NEN.NE.5)CALL XABORT('@KINRD1: INVALID NUMBER'
1 //' OF MODULE PARAMETERS.')
IF(IMPX.GT.9)WRITE(IOS,1002)
*----
* RECOVER DELAYED NEUTRON DATA FROM MICROLIB
*----
IF(.NOT.LNUD) THEN
ALLOCATE(DNF(NDG))
CALL LCMLEN(KEN(2),'BETA-D',LEN,ITLCM)
IF(LEN.GT.0) CALL LCMGET(KEN(2),'BETA-D',DNF)
ENDIF
IF(.NOT.LLAD) THEN
ALLOCATE(PD(NDG))
CALL LCMLEN(KEN(2),'LAMBDA-D',LEN,ITLCM)
IF(LEN.EQ.0)CALL XABORT('@KINRD1: MISSING DATA FOR THE PRECURS'
1 //'OR DECAY CONSTANTS.')
CALL LCMGET(KEN(2),'LAMBDA-D',PD)
ENDIF
IF(.NOT.LCHD) ALLOCATE(DNS(NDG,NGR))
*----
* RECOVER THE INITIAL STATE
*----
IF(IMPX.GT.0)WRITE(IOS,1003)
ISTATE(:NSTATE)=0
CALL LCMGET(KEN(3),'STATE-VECTOR',ISTATE)
LL4=ISTATE(11)
NUP=LL4
IF(CMOD.EQ.'BIVAC')THEN
IELEM=ISTATE(8)
NLF=ISTATE(14)
LPRIMA=(IELEM.LT.0)
ELSEIF(CMOD.EQ.'TRIVAC')THEN
IELEM=ISTATE(9)
ICHX=ISTATE(12)
NLF=ISTATE(30)
LPRIMA=(ICHX.EQ.1)
IF(ICHX.EQ.2) NUP=ISTATE(25)
ENDIF
IF(LPRIMA) THEN
CALL LCMGET(KEN(3),'MATCOD',MAT)
DO 70 K=1,NEL
IF(MAT(K).EQ.0) THEN
IDLPC(K)=0
ELSE
NUP=NUP+1
IDLPC(K)=NUP
ENDIF
70 CONTINUE
ELSE
CALL LCMGET(KEN(3),'KEYFLX',IDLPC)
ENDIF
IF(IMPX.GT.0) WRITE(IOS,1004) NEL,NUN,NUP,CMOD
IF(LL4*NLF/2.GT.NUN)
1 CALL XABORT('@KINRD1: INVALID NUMBER OF UNKNOWNS.')
CALL KINST1(NEN,KEN,CMOD,NGR,NBM,NBFIS,NDG,NEL,NUN,LL4,NUP,IDLPC,
1 INORM,POWER,FNORM,DNF,DNS,PD,LNUD,LCHD,IMPX)
DEALLOCATE(DNS,PD,DNF)
RETURN
*
1001 FORMAT(/1X,'KINRD1: READING DATA FROM INPUT FILE')
1002 FORMAT(1X,'KINRD1: THE INPUT DATA HAVE BEEN READ.')
1003 FORMAT(/1X,'RECOVERING THE INITIAL STEADY-STATE'/)
1004 FORMAT(1X,'TOTAL NUMBER OF ELEMENTS',1X,I6/1X,'NU',
1 'MBER OF FLUX UNKNOWNS PER ENERGY GROUP',1X,I6/1X,
2 'NUMBER OF PRECURSOR UNKNOWNS PER DELAYED GROUP',
3 1X,I6/1X,'USING TRACKING TYPE:',1X,A6)
END
|