summaryrefslogtreecommitdiff
path: root/Trivac/src/FLDBHR.f
blob: b04b8ce66a75f168191cb6337b20924d3118267c (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
*DECK FLDBHR
      SUBROUTINE FLDBHR(IPTRK,IPSYS,LADJ,LL4,ITY,NUN,NGRP,ICL1,ICL2,
     1 IMPX,NADI,MAXINR,EPSINR,ITER,TKT,TKB,GRAD1)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Perform thermal (up-scattering) iterations in Bivac.
*
*Copyright:
* Copyright (C) 2002 Ecole Polytechnique de Montreal
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version
*
*Author(s): A. Hebert
*
*Parameters: input
* IPTRK   L_TRACK pointer to the tracking information.
* IPSYS   L_SYSTEM pointer to system matrices.
* LADJ    flag set to .TRUE. for adjoint solution acceleration.
* LL4     order of the system matrices.
* ITY     type of solution (2: classical Bivac; 3: Thomas-Raviart).
* NUN     number of unknowns in each energy group.
* NGRP    number of energy groups.
* ICL1    number of free iretations in one cycle of the up-scattering
*         iterations.
* ICL2    number of accelerated up-scattering iterations in one cycle.
* IMPX    print parameter (set to 0 for no printing).
* NADI    number of inner ADI iterations per outer iteration (used with
*         SPN approximations).
* MAXINR  maximum number of thermal iterations.
* EPSINR  thermal iteration epsilon.
*
*Parameters: input/output
* ITER    actual number of thermal iterations.
* TKT     CPU time spent to compute the solution of linear systems.
* TKB     CPU time spent to compute the bilinear products.
* GRAD1   delta flux for this outer iteration.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) IPTRK,IPSYS
      INTEGER LL4,ITY,NUN,NGRP,ICL1,ICL2,IMPX,NADI,MAXINR,ITER
      REAL EPSINR,TKT,TKB,GRAD1(NUN,NGRP)
      LOGICAL LADJ
*----
*  LOCAL VARIABLES
*----
      PARAMETER(NSTATE=40)
      INTEGER ISTATE(NSTATE)
      CHARACTER TEXT12*12,TEXT3*3
*----
*  ALLOCATABLE ARRAYS
*----
      REAL, DIMENSION(:), ALLOCATABLE :: WORK2
      REAL, DIMENSION(:,:), ALLOCATABLE :: GAR2
      REAL, DIMENSION(:,:,:), ALLOCATABLE :: WORK
*----
*  SCRATCH STORAGE ALLOCATION
*----
      IF(MAXINR.EQ.0) RETURN
      ALLOCATE(GAR2(NUN,NGRP),WORK(LL4,NGRP,3),WORK2(LL4))
*
      CALL LCMGET(IPSYS,'STATE-VECTOR',ISTATE)
      NAN=ISTATE(8)
      NCTOT=ICL1+ICL2
      IF(ICL2.EQ.0) THEN
         NCPTM=NCTOT+1
      ELSE
         NCPTM=ICL1
      ENDIF
      DO 15 IGR=1,NGRP
      DO 10 I=1,LL4
      WORK(I,IGR,1)=0.0
      WORK(I,IGR,2)=0.0
      WORK(I,IGR,3)=GRAD1(I,IGR)
   10 CONTINUE
   15 CONTINUE
      IGDEB=1
*----
*  PERFORM THERMAL (UP-SCATTERING) ITERATIONS
*----
      TEXT3='NO '
      ITER=2
      DO
        CALL KDRCPU(TK1)
        IF(LADJ) THEN
*         ADJOINT SOLUTION
          DO 35 IGR=IGDEB,NGRP
          WRITE(TEXT12,'(1HA,2I3.3)') IGR,IGR
          CALL MTLDLM(TEXT12,IPTRK,IPSYS,LL4,ITY,WORK(1,IGR,3),
     1    GAR2(1,IGR))
          DO 30 JGR=1,NGRP
          IF(JGR.EQ.IGR) GO TO 30
          WRITE(TEXT12,'(1HA,2I3.3)') JGR,IGR
          CALL LCMLEN(IPSYS,TEXT12,ILONG,ITYLCM)
          IF(ILONG.EQ.0) GO TO 30
          CALL MTLDLM(TEXT12,IPTRK,IPSYS,LL4,ITY,WORK(1,JGR,3),WORK2(1))
          DO 20 I=1,LL4
          GAR2(I,IGR)=GAR2(I,IGR)-WORK2(I)
   20     CONTINUE
   30     CONTINUE
   35     CONTINUE
          DO 65 IGR=NGRP,IGDEB,-1
          DO 50 JGR=NGRP,IGR+1,-1
          WRITE(TEXT12,'(1HA,2I3.3)') JGR,IGR
          CALL LCMLEN(IPSYS,TEXT12,ILONG,ITYLCM)
          IF(ILONG.EQ.0) GO TO 50
          CALL MTLDLM(TEXT12,IPTRK,IPSYS,LL4,ITY,GAR2(1,JGR),WORK2(1))
          DO 40 I=1,LL4
          GAR2(I,IGR)=GAR2(I,IGR)+WORK2(I)
   40     CONTINUE
   50     CONTINUE
          CALL KDRCPU(TK2)
          TKB=TKB+(TK2-TK1)
*
          CALL KDRCPU(TK1)
          WRITE(TEXT12,'(1HA,2I3.3)') IGR,IGR
          IF(ITY.EQ.11) THEN
*           SIMPLIFIED PN BIVAC TRACKING.
            IF(NAN.EQ.0) CALL XABORT('FLDBHR: SPN-ONLY ALGORITHM.')
            CALL FLDBSS(TEXT12,IPTRK,IPSYS,LL4,NBMIX,NAN,GAR2(1,IGR),
     1      NADI)
          ELSE
            CALL MTLDLS(TEXT12,IPTRK,IPSYS,LL4,ITY,GAR2(1,IGR))
          ENDIF
          DO 60 I=1,LL4
          WORK(I,IGR,1)=WORK(I,IGR,2)
          WORK(I,IGR,2)=WORK(I,IGR,3)
          WORK(I,IGR,3)=GRAD1(I,IGR)+(WORK(I,IGR,2)-GAR2(I,IGR))
   60     CONTINUE
   65     CONTINUE
        ELSE
*         DIRECT SOLUTION
          DO 85 IGR=IGDEB,NGRP
          WRITE(TEXT12,'(1HA,2I3.3)') IGR,IGR
          CALL MTLDLM(TEXT12,IPTRK,IPSYS,LL4,ITY,WORK(1,IGR,3),
     1    GAR2(1,IGR))
          DO 80 JGR=1,NGRP
          IF(JGR.EQ.IGR) GO TO 80
          WRITE(TEXT12,'(1HA,2I3.3)') IGR,JGR
          CALL LCMLEN(IPSYS,TEXT12,ILONG,ITYLCM)
          IF(ILONG.EQ.0) GO TO 80
          CALL MTLDLM(TEXT12,IPTRK,IPSYS,LL4,ITY,WORK(1,JGR,3),WORK2(1))
          DO 70 I=1,LL4
          GAR2(I,IGR)=GAR2(I,IGR)-WORK2(I)
   70     CONTINUE
   80     CONTINUE
   85     CONTINUE
          DO 115 IGR=IGDEB,NGRP
          DO 100 JGR=1,IGR-1
          WRITE(TEXT12,'(1HA,2I3.3)') IGR,JGR
          CALL LCMLEN(IPSYS,TEXT12,ILONG,ITYLCM)
          IF(ILONG.EQ.0) GO TO 100
          CALL MTLDLM(TEXT12,IPTRK,IPSYS,LL4,ITY,GAR2(1,JGR),WORK2(1))
          DO 90 I=1,LL4
          GAR2(I,IGR)=GAR2(I,IGR)+WORK2(I)
   90     CONTINUE
  100     CONTINUE
          CALL KDRCPU(TK2)
          TKB=TKB+(TK2-TK1)
*
          CALL KDRCPU(TK1)
          WRITE(TEXT12,'(1HA,2I3.3)') IGR,IGR
          IF(ITY.EQ.11) THEN
*           SIMPLIFIED PN BIVAC TRACKING.
            IF(NAN.EQ.0) CALL XABORT('FLDBHR: SPN-ONLY ALGORITHM.')
            CALL FLDBSS(TEXT12,IPTRK,IPSYS,LL4,NBMIX,NAN,GAR2(1,IGR),
     1      NADI)
          ELSE
            CALL MTLDLS(TEXT12,IPTRK,IPSYS,LL4,ITY,GAR2(1,IGR))
          ENDIF
          DO 110 I=1,LL4
          WORK(I,IGR,1)=WORK(I,IGR,2)
          WORK(I,IGR,2)=WORK(I,IGR,3)
          WORK(I,IGR,3)=GRAD1(I,IGR)+(WORK(I,IGR,2)-GAR2(I,IGR))
  110     CONTINUE
  115     CONTINUE
        ENDIF
        IF(MOD(ITER-2,NCTOT).GE.NCPTM) THEN
          CALL FLD2AC(NGRP,LL4,IGDEB,WORK,ZMU)
        ELSE
          ZMU=1.0
        ENDIF
        IGDEBO=IGDEB
        DO 130 IGR=IGDEBO,NGRP
        GINN=0.0
        FINN=0.0
        DO 120 I=1,LL4
        GINN=MAX(GINN,ABS(WORK(I,IGR,2)-WORK(I,IGR,3)))
        FINN=MAX(FINN,ABS(WORK(I,IGR,3)))
  120   CONTINUE
        GINN=GINN/FINN
        IF((GINN.LT.EPSINR).AND.(IGDEB.EQ.IGR)) IGDEB=IGDEB+1
  130   CONTINUE
        CALL KDRCPU(TK2)
        TKT=TKT+(TK2-TK1)
        IF(GINN.LT.EPSINR) TEXT3='YES'
        IF(IMPX.GT.2) WRITE(6,1000) ITER,GINN,EPSINR,IGDEB,ZMU,TEXT3
        IF((GINN.LT.EPSINR).OR.(ITER.EQ.MAXINR)) GO TO 160
        ITER=ITER+1
      ENDDO
*----
*  END OF THERMAL ITERATIONS
*----
  160 DO 175 I=1,LL4
      DO 170 IGR=1,NGRP
      GRAD1(I,IGR)=WORK(I,IGR,3)
  170 CONTINUE
  175 CONTINUE
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(GAR2,WORK,WORK2)
      RETURN
*
 1000 FORMAT (10X,3HIN(,I3,6H) FLX:,5H PRC=,1P,E9.2,5H TAR=,E9.2,
     1 7H IGDEB=, I13,6H ACCE=,0P,F12.5,12H  CONVERGED=,A3)
      END