summaryrefslogtreecommitdiff
path: root/Donjon/src/D2PSEL.f
blob: 2e459bc392f6ea34446f2a85b68c55ee28a1825a (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
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
*DECK D2PSEL
      SUBROUTINE D2PSEL( IPDAT,  IPINP, STAVEC,BRANCH,  ITBRAN, STAIDX,
     >                    NVAR, JOBOPT,    DEB,  FC1  ,    FC2,    FC3,
     >                    FC4,   XSC,   IPRINT                        )
*
*-----------------------------------------------------------------------
*
*Purpose:
* Select the next branch calculation . This routine determines also
* when to stop the calculation and updates the INFO data block.
*
*Author(s): 
* J. Taforeau
*
*Parameters: input
* IPDAT   address of info data block
* IPINP   file unit of the GENPMAXS input file
* JOBOPT  array for JOBOPT configuration
* NGP     number of energy groups
* BRANCH  nature of the current branch ( CR, DC, CB, TC, TM etc )
* ITBRAN  index of the current branch
* STAIDX  array of state variables index
* NVAR    number of state variables
* STAVEC  various parameters associated with the IPDAT structure
* DEB     flag for D2PGEN
*
*Parameters: 
* FC1     
* FC2     
* FC3     
* FC4     
* XSC     
* IPRINT  
* X       
* 
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) IPDAT
      INTEGER IPINP,STAVEC(40),NVAR,ITBRAN,IPRINT,DEB
      INTEGER STAIDX(NVAR)
      CHARACTER*4 BRANCH
      CHARACTER JOBOPT(16)
*----
*  LOCAL VRAIABLES
*----
      TYPE(C_PTR) IPTH,KPTH
      INTEGER CHANGE,ITYLCM,BRAIDX,PK
      INTEGER FA_K
      INTEGER :: IP = 0
      INTEGER NVAL(NVAR),REFIDX(NVAR)
      ! VALUES OF CURRENT STATE VARIABLE ( IE FOR THE CURRENT BRANCH
      ! CALCULATION)
      REAL  STATE(NVAR)
      ! VALUES OF THE CHOOSEN REFERENCE STATE VARIABLES
      REAL  REFSTA(NVAR)
      ! VALUES OF STATES VARIABLES IN SAPHYB
      REAL  VALPAR(NVAR,100)
      REAL SFAC,BFAC,IUPS,VERS,XESM
      CHARACTER*12 BARNAM
      CHARACTER*12 PKEY(NVAR),PKNAM(6)
      CHARACTER FILNAM*12,COM*40
      CHARACTER*16 JOBTIT
      CHARACTER*1 DER
      CHARACTER*12,DIMENSION(6) :: PKREF
      DATA PKREF/ "BARR","DMOD","CBOR","TCOM","TMOD","BURN"/
      LOGICAL :: BRANCH_STOP = .FALSE.
      LOGICAL :: ONE_VAL = .FALSE.
      LOGICAL LFLAG(6)

      VALPAR(:NVAR,:100)=0.0
      ! RECOVER INFORMATION FROM INFO data block
      CALL LCMSIX(IPDAT,' ',0)
      CALL LCMSIX(IPDAT,'SAPHYB_INFO',1)
      CALL LCMGTC(IPDAT,'STATE_VAR',12,NVAR,PKEY)
      DO PK=1, 6
        IPTH=LCMGID(IPDAT,'PKEY_INFO')
        KPTH=LCMDIL(IPTH,PK)
        CALL LCMGET(KPTH,'LFLAG',LFLAG(PK))
        IF (PK == 1 .OR. PK==6)THEN
         CALL LCMGTC(KPTH,'NAME',12,PKNAM(PK))
        ELSE
         IF(LFLAG(PK)) CALL LCMGTC(KPTH,'NAME',12,PKNAM(PK))
        ENDIF
      ENDDO

      BARNAM=PKNAM(1)
      IP=0
      IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 0'
      ! RECOVER VALUES FOR STATE VARIABLES
      DO i=1,6
         IF (LFLAG(i).OR. i==1 .OR. i==6) THEN
          IP=IP+1
          CALL LCMLEN(IPDAT,PKREF(i),NVAL(IP),ITYLCM)
          CALL LCMGET(IPDAT,PKREF(i),VALPAR(IP,1:NVAL(IP)))
         ENDIF
      ENDDO

      ! RECOVER INFORMATION ABOUT THE CURRENT BRANCH CALCULATION
      CALL LCMSIX(IPDAT,' ',0)
      CALL LCMSIX(IPDAT,'BRANCH_INFO',1)
      CALL LCMGET(IPDAT,'STATE',STATE)
      CALL LCMGET(IPDAT,'REF_INDEX',REFIDX)
      CALL LCMGET(IPDAT,'REF_STATE',REFSTA)
      CALL LCMGET(IPDAT,'BRANCH_INDEX',BRAIDX)

      DO i=1, NVAR

        IF(BRANCH==PKEY(i)(:4)) THEN
        BRAIDX=i
!        IF (PKEY(i)(:4) == 'C-BO') CALL XABORT( 'STOP BRANCH')
        ENDIF
      ENDDO

      ! initialization of the flag: CHANGE
      CHANGE=1
   30 DO i=1, NVAR
       IF(i<=BRAIDX) THEN

        IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 1'
        ! A NEW BRANCH TYPE MUST BE SET IF THE CURRENT VALUE OF A
        ! GIVEN STATE VARIABLE IS THE LAST OF THE LIST
        IF(STAIDX(i)==NVAL(i)) THEN
           IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 2'
           ! WE KEEP THE FLAG CHANGE TO 1
           CHANGE=CHANGE*1
        ELSE
          IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 3'
          ! IF THE BRANCH INDEX CORREPOND TO THE LAST "REAL" STATE
          ! VARIABLE (IE THE STATE VARIABLE BEFORE BURN)
         IF((BRAIDX==NVAR-1)) THEN
            IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 4'
            ! THE CHANGE FLAG MUST BE SET TO FALSE
           CHANGE=0
           IF(NVAL(BRAIDX)==1) THEN
             IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 5'
             ! EXCEPT IF THERE IS ONLY ONE VALUE FOR THE STATE VARIABLE
             ! IN THIS CASE THE CHANGE FLAG IS RESET TO 1
             CHANGE=1
           ENDIF
         ELSE
           ! IN OTHER CASE WE CONTINUE THE CURRENT BRANCH TYPE
           ! CALCULATION
           IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 6'
           CHANGE=0
           IF(NVAL(BRAIDX)==1) THEN
             ! EXCEPT IF THERE IS ONLY ONE VALUE FOR THE STATE VARIABLE
             ! IN THIS CASE THE CHANGE FLAG IS RESET TO 1
             CHANGE=1
           IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 7'
           ENDIF
         ENDIF
        ENDIF
       ENDIF
      ENDDO
      ONE_VAL=.FALSE.

      IF(CHANGE==1) THEN
         IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 8'
         IF(NVAL(BRAIDX+1)==1 .and. (BRAIDX >.1))THEN
          IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 9'
          IF((BRAIDX+1)<(NVAR)) THEN
           IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 10'
           BRAIDX=BRAIDX+1
           IF(NVAL(BRAIDX)==1) THEN
             IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 11'
            IF(BRAIDX==NVAR-1) THEN
             IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 12'
             BRANCH_STOP=.TRUE.
            ELSE
              IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 13'
              ONE_VAL=.TRUE.
            ENDIF
           ENDIF
          ELSE
           IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 14'
           BRANCH_STOP=.TRUE.
          ENDIF
         ENDIF

         IF(ONE_VAL) GO TO 30

         IF((BRAIDX+1)<(NVAR)) THEN
          IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 15'
          ! UPDATE OF THE INDEX OF THE BRANCH TYPE
          BRAIDX=BRAIDX+1
          ! UPDATE OF THE BRANCH TYPE
          BRANCH=PKEY(BRAIDX) (:4)
          ! INITIALIZATION OF THE INDEX OF THE BRANCH TYPE
          ITBRAN=1
          DO i=1,NVAR
           IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 16'
           IF(i<=BRAIDX) THEN
            IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 17'
            !INITIALIZATION AT THE FIRST VALUE OF STATE PARAMETERS
            STATE(i)=VALPAR(i,1)
            ! INITIALIZATION AT THE FIRST ORDER NUMBERS OF STATE
            ! PARAMETERS
            STAIDX(i)=1
            ! CASE WHERE THE REFERENCE VALUE IS THE FIRST VALUE
            ! (IE WHEN NVAL(BRAIDX) = 2)
            IF(i==BRAIDX) THEN
             IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 18'
             IF(STAIDX(i)==REFIDX(i)) THEN
              IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 19'
              STAIDX(i)=2
              STATE(i)=VALPAR(i,2)
             ENDIF
            ENDIF
           ELSE
            IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 20'
            ! INITIALIZATION AT REFERENCE VALUES OF STATE PARAMETERS
            STATE(i)=VALPAR(i,REFIDX(i))
            ! INITIALIZATION AT REFERENCE ORDER NUMBERS OF STATE
            ! PARAMETERS
            STAIDX(i)=REFIDX(i)
           ENDIF
          ENDDO
          IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 21'
          CALL LCMSIX(IPDAT,' ',0)
          CALL LCMSIX(IPDAT,'BRANCH_INFO',1)
          ! THE FLAG STOP IS SET TO FALSE (IE THE BRANCHING CALCULATION
          ! MUST CONTINUE)
          CALL LCMPUT(IPDAT,'STOP',1,1,0)
        ELSE
          IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 22'
          BRANCH_STOP=.TRUE.
        ENDIF

        IF(BRANCH_STOP) THEN
         IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 23'
         CALL LCMSIX(IPDAT,' ',0)
         CALL LCMSIX(IPDAT,'BRANCH_INFO',1)
         ! THE FLAG STOP IS SET TO TRUE (IE THE BRANCHING CALCULATION
         ! MUST STOP)
         CALL LCMPUT(IPDAT,'STOP',1,1,1)
         CALL LCMSIX(IPDAT,' ',0)
         CALL LCMSIX(IPDAT,'GENPMAXS_INP',1)
         ! THE FLAG FOR WRITTING THE GENPMAXS.INP IS SET TO 2
         CALL LCMPUT(IPDAT,'FLAG',1,1,2)
         ! UPDATE OF THE GENPMAXS.INP FILE (MANY ARGUMENTS IN THIS CALL
         ! ARE NOT USED IN D2PGEN)
      CALL      D2PGEN( IPINP, IPDAT,   STAVEC, JOBTIT, FILNAM,    DER,
     >                   VERS,   COM,   JOBOPT,   IUPS,   FA_K,   SFAC,
     >                   BFAC,   DEB,     XESM,  FC1  ,    FC2,    FC3,
     >                    FC4,   XSC,   IPRINT                        )

        ENDIF
      ELSE
        ! update of the index of the branch type
        IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 24'
        ITBRAN=ITBRAN+1
        ! CASE WHERE THE STATE VARIABLE VALUE CORRESPOND TO THE
        ! REFERENCE STATE VALUE
        IF(STATE(BRAIDX)==REFSTA(BRAIDX)) THEN
          IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 25'
          ! we skip the reference value'
          STAIDX(BRAIDX)=STAIDX(BRAIDX)+1
          IF(NVAL(BRAIDX)>=1) THEN
           IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 26'
           ! the new value for the state variable is the next in the
           ! list
           STATE(BRAIDX)=VALPAR(BRAIDX,STAIDX(BRAIDX))
          ENDIF
        ELSE

          IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 27'
          ! POSITIONNING OF THE LOOP INDEX AT THE CURRENT BRANCH TYPE
          ! CALCULATION
          i=BRAIDX
          ! DECREASE THE INDEX WHILE THE STATE VARIABLE IS BARR
          DO WHILE (i>0)
          IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 28'
          ! IF THE CURRENT VALUE OF STATE VARIABLE IS THE LAST OF THE
          ! LIST
           IF(STAIDX(i)==NVAL(i)) THEN
            IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 29'
            IF(NVAL(i)>2) THEN
             IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 30'
             ! RESET OF THE ORDER NUMBERS FOR THE STATE VALUE
             STAIDX(i)=1
             ! ATTRIBUTION OF THE FIRST VALUE OF THE LIST TO THE STATE
             STATE(i)=VALPAR(i,STAIDX(i))
            ELSE
             IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 31'
             j=i-1
             ! INCREASE THE ORDER NUMBERS OF THE VALUE OF THIS STATE
             STAIDX(j)=STAIDX(j)+1
             ! ATTRIBUTION OF THE STATE(J) VALUES
             STATE(j)=VALPAR(j,STAIDX(j))
             ! WHILE J>0 (IE THE STATE VARIABLE EXISTS)
             DO WHILE (STAIDX(j)>NVAL(j).and.j>0)
              IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 32'
              ! IF THE STATE VARAIBLE IS NOT BARR: INITIALIZATION OF THE
              ! ORDER NUMBERS
              IF(j>1)STAIDX(j)=1
              ! IF THE STATE VARAIBLE IS NOT BARR: ATTRIBUTION OF THE
              ! STATE VARIABLE VALUE
              IF(j>1)STATE(j)=VALPAR(j,STAIDX(j))
              ! DECREASE THE J PARAMETERS
              j=j-1
              ! IF THE STATE PRAMETER EXISTS: UPDATE THE ORDER NUMBERS
              IF(j>0)STAIDX(j)=STAIDX(j)+1
              ! IF THE STATE PRAMETER EXISTS: ATTRIBUTION OF THE STATE
              ! VARIABLE VALUE
              IF(j>0)STATE(j)=VALPAR(j,STAIDX(j))
              ! EXIT OF THE IF CONDITION
             ENDDO
             IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 33'
             EXIT
            ENDIF
           ELSE IF(NVAL(i)==2) THEN
            IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 34'
            IF(PKEY(i).NE.BARNAM)THEN
             IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 35'
             IF(STAIDX(i-1).NE.NVAL(i-1)) THEN
              IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 36'
              j=i-1
              ! INCREASE THE ORDER NUMBERS OF THE VALUE OF THIS STATE
              STAIDX(j)=STAIDX(j)+1
              ! ATTRIBUTION OF THE STATE(J) VALUES
              STATE(j)=VALPAR(j,STAIDX(j))
              EXIT
             ELSE
              IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 37'
              ! IF THE BRANCH TYPE IS BARR OR THE CURRENT STATE VALUE I$
              STAIDX(i)=STAIDX(i)+1
              IF(i>1)STAIDX(i-1)=1
              STATE(i)=VALPAR(i,STAIDX(i))
              IF(i>1)STATE(i-1)=VALPAR(i-1,STAIDX(i-1))
              EXIT
             ENDIF
            ELSE
             IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 38'
             IF(STAIDX(i).NE.NVAL(i)) THEN
              IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 39'
              j=i
              ! INCREASE THE ORDER NUMBERS OF THE VALUE OF THIS STATE
              STAIDX(j)=STAIDX(j)+1
              ! ATTRIBUTION OF THE STATE(J) VALUES
              STATE(j)=VALPAR(j,STAIDX(j))
              EXIT
             ENDIF
            ENDIF
           ELSE

            ! IF THE BRANCH TYPE IS BARR OR THE CURRENT STATE VALUE IS
            ! NOT THE LAST OF THE LIST
            STAIDX(i)=STAIDX(i)+1
            IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 40'
            IF((STAIDX(i)==REFIDX(i)).and.(BRANCH.NE.BARNAM)) THEN
             IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 41'
             ! IF IT IS THE REFERENCE VALUE BUT NOT THE BARR REF VALUE
             ! UPDATE THE ORDER NUMBERS OF STATE VARIABLE VALUE
             IF(i==BRAIDX) STAIDX(i)=STAIDX(i)+1
            ENDIF
            ! ATTRIBUTION OF THE STATE VARIABLE VALUE
            STATE(i)=VALPAR(i,STAIDX(i))
            EXIT
           ENDIF
           IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 42'
           i=i-1
          ENDDO
        ENDIF
      ENDIF
      IF (IPRINT>100) WRITE(6,*) '@D2PSEL : STEP 43'
      CALL LCMSIX(IPDAT,' ',0)
      CALL LCMSIX(IPDAT,'BRANCH_INFO',1)
      IF((BRANCH .NE.BARNAM(:4)).and.NVAL(BRAIDX)==1) THEN
        CALL LCMPUT(IPDAT,'PRINT',1,1,0)
      ELSE
        CALL LCMPUT(IPDAT,'PRINT',1,1,1)
      ENDIF

      CALL LCMPTC(IPDAT,'BRANCH',4,BRANCH)
      CALL LCMPUT(IPDAT,'BRANCH_IT',1,1,ITBRAN)
      CALL LCMPUT(IPDAT,'STATE',NVAR,2,STATE)
      CALL LCMPUT(IPDAT,'STATE_INDEX',NVAR,1,STAIDX)
      CALL LCMPUT(IPDAT,'BRANCH_INDEX',1,1,BRAIDX)

      IF(IPRINT > 0)  THEN
         WRITE(6,*)
         WRITE(6,*) "**** SELECTING THE NEXT BRANCH CALCULATION ****"
         WRITE(6,*) "******     NEXT BRANCH CHARACTERISTICS    *****"
         WRITE(6,*) "BRANCH TYPE         :",BRANCH
         WRITE(6,*) "BRANCH INDEX        :",BRAIDX
         WRITE(6,*) "BRANCH ITERATION    :",ITBRAN
         WRITE(6,*) "STATE VARIABLE NAME :",PKEY
         WRITE(6,*) "BRANCH STATE VALUES :",STATE
         WRITE(6,*) "BRANCH STATE INDEX  :",STAIDX
      ENDIF
      CALL LCMSIX(IPDAT,' ',0)

      END