summaryrefslogtreecommitdiff
path: root/Trivac/src/KINRD1.f
blob: 42519592df5f21310df31c8169b6ff16770926fb (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
*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