summaryrefslogtreecommitdiff
path: root/Trivac/src/KINRD2.f
blob: bff9fe0cf3df396bc6cdf89a2c61c5205b0afefd (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
*DECK KINRD2
      SUBROUTINE KINRD2(NEN,KEN,CMODUL)
*
*-----------------------------------------------------------------------
*
*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; (5) L_MACROLIB.
* CMODUL  name of the assembly door ('BIVAC' or 'TRIVAC').
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      INTEGER NEN
      TYPE(C_PTR) KEN(NEN)
      CHARACTER CMODUL*12
*----
*  LOCAL VARIABLES
*----
      PARAMETER(NSTATE=40,IOS=6)
      INTEGER ISTATE(NSTATE)
      REAL EPSCON(5),POWTOT
      CHARACTER TEXT*12,FNAM*40,PNAM*40
      DOUBLE PRECISION DFLOT
      LOGICAL ADJ
*----
*  READ THE INPUT DATA
*----
      CALL LCMGET(KEN(1),'STATE-VECTOR',ISTATE)
      ITR=ISTATE(1)
      IMPX=1
      IMPH=0
      DELT=0.0
      IPICK=0
      IEXP=0
      ADJ=.FALSE.
      IF(ITR.EQ.0) THEN
        ICL1=3
        ICL2=3
        MAXINR=0
        MAXOUT=200
        NADI=2
        IFL=0
        IPR=0
        EPSINR=1.0E-2
        EPSOUT=1.0E-4
        TTF=9999.0
        TTP=9999.0
        IF(CMODUL.EQ.'TRIVAC') THEN
          CALL LCMGET(KEN(3),'STATE-VECTOR',ISTATE)
          NADI=ISTATE(33)
        ELSE
          NADI=2
        ENDIF
      ELSE
        ICL1=ISTATE(11)
        ICL2=ISTATE(12)
        MAXINR=ISTATE(14)
        MAXOUT=ISTATE(15)
        NADI=ISTATE(16)
        IFL=ISTATE(17)
        IPR=ISTATE(18)
        IEXP=ISTATE(19)
        ADJ=ISTATE(20).EQ.1
        CALL LCMGET(KEN(1),'EPS-CONVERGE',EPSCON)
        EPSINR=EPSCON(1)
        EPSOUT=EPSCON(2)
        TTF=EPSCON(3)
        TTP=EPSCON(4)
      ENDIF
   40 CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
   50 IF(ITYP.NE.3)CALL XABORT('@KINRD2: CHARACTER DATA EXPECTED(1).')
      IF(TEXT.EQ.';')THEN
        GOTO 80
      ELSE IF(TEXT.EQ.'PICK') THEN
        IPICK=1
        GOTO 80
      ELSEIF(TEXT.EQ.'EDIT') THEN
        CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
        IF(ITYP.NE.1)CALL XABORT('@KINRD2: INTEGER FOR EDIT EXPECTED.')
        IMPX=MAX(0,NITMA)
        IF(IMPX.GT.4) WRITE(IOS,1001)
      ELSEIF(TEXT.EQ.'DELTA') THEN
        CALL REDGET(ITYP,NITMA,DELT,TEXT,DFLOT)
        IF(ITYP.NE.2)CALL XABORT('@KINRD2: REAL FOR DELTA EXPECTED.')
        IF(DELT.LT.0.)CALL XABORT('@KINRD2: INVALID VALUE FOR DELTA.')
      ELSEIF(TEXT.EQ.'SCHEME') THEN
        CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
        IF(ITYP.NE.3)CALL XABORT('@KINRD2: CHARACTER DATA EXPECTED(2).')
        IF(TEXT.NE.'FLUX')CALL XABORT('@KINRD2: READ KEYWORD '//TEXT//
     1  '. KEYWORD FLUX EXPECTED.')
   55   CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
        IF(ITYP.NE.3)CALL XABORT('@KINRD2: CHARACTER DATA EXPECTED(3).')
        IF(TEXT.EQ.'IMPLIC')THEN
          FNAM='IMPLICIT EULER METHOD'
          IFL=1
        ELSEIF(TEXT.EQ.'CRANK')THEN
          FNAM='CRANK-NICHOLSON METHOD'
          IFL=2
        ELSEIF(TEXT.EQ.'THETA')THEN
          CALL REDGET(ITYP,NITMA,TTF,TEXT,DFLOT)
          IF(ITYP.NE.2)CALL XABORT('@KINRD2: REAL THETA EXPECTED(1).')
          IF(TTF.LE.0.5)CALL XABORT('@KINRD2: INVALID THETA VALUE(1).')
          IF(TTF.GE.1.0)CALL XABORT('@KINRD2: INVALID THETA VALUE(2).')
          FNAM='GENERAL THETA METHOD'
          IFL=3
        ELSEIF(TEXT.EQ.'TEXP')THEN
          IEXP=1
          GO TO 55
        ELSE
          CALL XABORT('@KINRD2: INVALID KEYWORD '//TEXT)
        ENDIF
      ELSEIF(TEXT.EQ.'PREC') THEN
        CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
        IF(ITYP.NE.3)CALL XABORT('@KINRD2: CHARACTER DATA EXPECTED(4).')
        IF(TEXT.EQ.'IMPLIC')THEN
          PNAM='IMPLICIT EULER METHOD'
          IPR=1
        ELSEIF(TEXT.EQ.'CRANK')THEN
          PNAM='CRANK-NICHOLSON METHOD'
          IPR=2
        ELSEIF(TEXT.EQ.'THETA')THEN
          CALL REDGET(ITYP,NITMA,TTP,TEXT,DFLOT)
          IF(ITYP.NE.2)CALL XABORT('@KINRD2: REAL THETA EXPECTED(2).')
          IF(TTP.LE.0.5)CALL XABORT('@KINRD2: INVALID THETA VALUE(3).')
          IF(TTP.GE.1.0)CALL XABORT('@KINRD2: INVALID THETA VALUE(4).')
          PNAM='GENERAL THETA METHOD'
          IPR=3
        ELSEIF(TEXT.EQ.'EXPON')THEN
          PNAM='ANALYTICAL INTEGRATION METHOD'
          IPR=4
        ELSE
          CALL XABORT('@KINRD2: INVALID KEYWORD '//TEXT)
        ENDIF
      ELSEIF((TEXT.EQ.'VAR1').OR.(TEXT.EQ.'ACCE')) THEN
        CALL REDGET(ITYP,ICL1,FLOT,TEXT,DFLOT)
        IF(ITYP.NE.1)
     1    CALL XABORT('@KINRD2: INTEGER DATA EXPECTED FOR ICL1.')
        CALL REDGET(ITYP,ICL2,FLOT,TEXT,DFLOT)
        IF(ITYP.NE.1)
     1    CALL XABORT('@KINRD2: INTEGER DATA EXPECTED FOR ICL2.')
      ELSEIF(TEXT.EQ.'ADI') THEN
        CALL REDGET(ITYP,NADI,FLOTT,TEXT,DFLOT)
        IF(ITYP.NE.1) CALL XABORT('@KINRD2: INTEGER DATA EXPECTED(1).')
        GO TO 40
      ELSE IF(TEXT.EQ.'ADJ') THEN
        ADJ=.TRUE.
      ELSEIF(TEXT.EQ.'EXTE') THEN
   60   CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
        IF(ITYP.EQ.1) THEN
          MAXOUT=NITMA
        ELSE IF(ITYP.EQ.2) THEN
          EPSOUT=FLOT
        ELSE
          GO TO 50
        ENDIF
        GO TO 60
      ELSEIF(TEXT.EQ.'THER') THEN
   70   CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
        IF(ITYP.EQ.1) THEN
          MAXINR=NITMA
        ELSE IF(ITYP.EQ.2) THEN
          EPSINR=FLOT
        ELSE
          GO TO 50
        ENDIF
        GO TO 70
      ELSEIF(TEXT.EQ.'HIST') THEN
        CALL REDGET(ITYP,IMPH,FLOT,TEXT,DFLOT)
        IF(ITYP.NE.1) CALL XABORT('@KINRD2: INTEGER DATA EXPECTED(2).')
      ELSE
        CALL XABORT('@KINRD2: INVALID KEYWORD '//TEXT)
      ENDIF
      GOTO 40
   80 IF(IFL.EQ.0) CALL XABORT('@KINRD2: SCHEME DATA MISSING.')
      IF(IPR.EQ.0) CALL XABORT('@KINRD2: PREC DATA MISSING.')
      IF(IMPX.GT.0) WRITE(IOS,1002) ITR+1
      CALL KINST2(NEN,KEN,CMODUL,TTF,TTP,IFL,IPR,IEXP,DELT,IMPH,ICL1,
     1 ICL2,NADI,ADJ,MAXOUT,EPSOUT,MAXINR,EPSINR,FNAM,PNAM,IMPX,POWTOT)
*----
*  RECOVER THE FINAL POWER AND SAVE IT IN A CLE-2000 VARIABLE
*----
      IF(IPICK.EQ.1) THEN
         CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
         IF(ITYP.NE.-2) CALL XABORT('KINRD2: OUTPUT REAL EXPECTED.')
         ITYP=2
         FLOT=POWTOT
         CALL REDPUT(ITYP,NITMA,FLOT,TEXT,DFLOT)
         CALL REDGET(ITYP,NITMA,FLOT,TEXT,DFLOT)
         IF((ITYP.NE.3).OR.(TEXT.NE.';')) THEN
           CALL XABORT('KINRD2: ; CHARACTER EXPECTED.')
         ENDIF      
      ENDIF      
      RETURN
*
 1001 FORMAT(/1X,'KINRD2: READING DATA FROM INPUT FILE'/)
 1002 FORMAT(1X,'KINRD2: THE INPUT DATA HAVE BEEN READ AT STEP',I5,'.')
      END