summaryrefslogtreecommitdiff
path: root/Trivac/src/GPTDFL.f
blob: 1496d51ca5a29add57b89644b63e9ab153047e34 (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
*DECK GPTDFL
      SUBROUTINE GPTDFL (IPTRK,IPSYS0,IPFLUP,LL4,ITY,NUN,NGRP,ICL1,ICL2,
     1 NSTART,IMPX,IMPH,TITR,EPS2,MAXINR,EPSINR,NADI,MAXX0,FKEFF,EVECT,
     2 ADECT,FKEFF2,EASS,SOUR)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Solution of a multigroup fixed source eigenvalue problem for the
* calculation of a direct GPT solution in Trivac. Use the precondi-
* tioned power method.
*
*Copyright:
* Copyright (C) 1987 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
* IPSYS0  L_SYSTEM pointer to unperturbed system matrices
* IPFLUP  L_FLUX pointer to the gpt solution
* LL4     order of the system matrices.
* ITY     type of solution (2: classical Trivac; 3: Thomas-Raviart).
* NUN     number of unknowns in each energy group.
* NGRP    number of energy groups.
* ICL1    number of free iterations in one cycle of the inverse power
*         method
* ICL2    number of accelerated iterations in one cycle
* NSTART  GMRES method flag. =0: use Livolant acceleration; 
*         >0: restarts the GMRES method every NSTART iterations.
* IMPX    print parameter. =0: no print; =1: minimum printing;
*         =2: iteration history is printed; =3: solution is printed.
* IMPH    =0: no action is taken
*         =1: the flux is compared to a reference flux stored on lcm
*         =2: the convergence histogram is printed
*         =3: the convergence histogram is printed with axis and
*            titles. the plotting file is completed
*         =4: the convergence histogram is printed with axis, acce-
*            leration factors and titles. the plotting file is
*            completed.
* TITR    character*72 title
* EPS2    convergence criteria for the flux
* MAXINR  maximum number of thermal iterations.
* EPSINR  thermal iteration epsilon.
* NADI    number of inner adi iterations per outer iteration
* MAXX0   maximum number of outer iterations
* FKEFF   effective multiplication factor
* EVECT   unknown vector for the non perturbed direct flux
* ADECT   unknown vector for the non perturbed adjoint flux
* SOUR    fixed source
*
*Parameters: output
* FKEFF2  perturbed effective multiplication factor
* EASS    converged solution
*
*References:
* A. H\'ebert, 'Preconditioning the power method for reactor
* calculations', Nucl. Sci. Eng., 94, 1 (1986).
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      TYPE(C_PTR) IPTRK,IPSYS0,IPFLUP
      CHARACTER TITR*72
      INTEGER LL4,ITY,NUN,NGRP,ICL1,ICL2,NSTART,IMPX,IMPH,MAXINR,NADI,
     1 MAXX0
      REAL EPS2,EPSINR,FKEFF,EVECT(NUN,NGRP),ADECT(NUN,NGRP),FKEFF2,
     1 EASS(NUN,NGRP),SOUR(NUN,NGRP)
*----
*  LOCAL VARIABLES
*----
      CHARACTER*12 TEXT12,HSMG*131
      DOUBLE PRECISION AIL,BIL,EVAL,ZNORM,GAZ,DAZ
      REAL TKT,TKB
      REAL, DIMENSION(:), ALLOCATABLE :: WORK1,WORK3
      REAL, DIMENSION(:,:), ALLOCATABLE :: GRAD1,GAR1
      REAL, DIMENSION(:), POINTER :: AGAR
      TYPE(C_PTR) AGAR_PTR
      DATA EPS1/1.0E-4/
*----
*  SCRATCH STORAGE ALLOCATION
*----
      ALLOCATE(GRAD1(NUN,NGRP),GAR1(NUN,NGRP),WORK1(NUN))
*
      CALL MTOPEN(IMPX,IPTRK,LL4)
      IF(LL4.GT.NUN) CALL XABORT('GPTDFL: INVALID NUMBER OF UNKNOWNS.')
*----
*  UNPERTURBED EIGENVALUE CALCULATION.
*----
      AIL=0.0D0
      BIL=0.0D0
      TEST=0.0
      DO 85 IGR=1,NGRP
      WRITE(TEXT12,'(1HA,2I3.3)') IGR,IGR
      CALL MTLDLM(TEXT12,IPTRK,IPSYS0,LL4,ITY,EVECT(1,IGR),GRAD1(1,IGR))
      WORK1(:LL4)=0.0
      DO 70 JGR=1,NGRP
      IF(JGR.EQ.IGR) GO TO 40
      WRITE(TEXT12,'(1HA,2I3.3)') IGR,JGR
      CALL LCMLEN(IPSYS0,TEXT12,ILONG,ITYLCM)
      IF(ILONG.EQ.0) GO TO 40
      IF(ITY.EQ.13) THEN
         ALLOCATE(WORK3(LL4))
         CALL MTLDLM(TEXT12,IPTRK,IPSYS0,LL4,ITY,EVECT(1,JGR),WORK3(1))
         DO 20 I=1,LL4
         GRAD1(I,IGR)=GRAD1(I,IGR)-WORK3(I)
   20    CONTINUE
         DEALLOCATE(WORK3)
      ELSE
         CALL LCMGPD(IPSYS0,TEXT12,AGAR_PTR)
         CALL C_F_POINTER(AGAR_PTR,AGAR,(/ NUN /))
         DO 30 I=1,ILONG
         GRAD1(I,IGR)=GRAD1(I,IGR)-AGAR(I)*EVECT(I,JGR)
   30    CONTINUE
      ENDIF
   40 WRITE(TEXT12,'(1HB,2I3.3)') IGR,JGR
      CALL LCMLEN(IPSYS0,TEXT12,ILONG,ITYLCM)
      IF(ILONG.EQ.0) GO TO 70
      CALL LCMGPD(IPSYS0,TEXT12,AGAR_PTR)
      CALL C_F_POINTER(AGAR_PTR,AGAR,(/ NUN /))
      DO 60 I=1,ILONG
      WORK1(I)=WORK1(I)+AGAR(I)*EVECT(I,JGR)
   60 CONTINUE
   70 CONTINUE
      DO 80 I=1,LL4
      AIL=AIL+ADECT(I,IGR)*GRAD1(I,IGR)
      BIL=BIL+ADECT(I,IGR)*WORK1(I)
   80 CONTINUE
   85 CONTINUE
      EVAL=AIL/BIL
      FKEFF2=REAL(1.0D0/EVAL)
      IF(ABS(FKEFF-1.0/EVAL).GT.EPS1) CALL XABORT('GPTDFL: THE COMPUTE'
     1 //'D AND PROVIDED K-EFFECTIVES ARE INCONSISTENTS.')
*----
*  VALIDATION OF THE FIXED SOURCE TERM.
*----
      AIL=0.0D0
      BIL=0.0D0
      DO 95 IGR=1,NGRP
      DO 90 I=1,LL4
      GAZ=ADECT(I,IGR)*SOUR(I,IGR)
      DAZ=ADECT(I,IGR)**2
      AIL=AIL+GAZ
      BIL=BIL+DAZ
   90 CONTINUE
   95 CONTINUE
      IF(AIL.EQ.0.0) THEN
        EASS(:NUN,:NGRP)=0.0
        FKEFF2=0.0
        DEALLOCATE(GRAD1,GAR1,WORK1)
        RETURN
      ENDIF
      GAZ=ABS(AIL)/ABS(BIL)/REAL(LL4)
      IF(IMPX.GE.1) THEN
        WRITE(6,'(/28H GPTDFL: ORTHONORMALIZATION=,1P,E11.4)') GAZ
      ENDIF
      IF(GAZ.GT.EPS2) THEN
        WRITE(HSMG,'(46HGPTDFL: THE SOURCE TERM IS NOT ORTHOGONAL TO T,
     1  27HHE ADJOINT REFERENCE FLUX (,1P,E11.4,2H).)') GAZ
        CALL XABORT(HSMG)
      ENDIF
*----
*  ORTHONORMALIZATION OF THE SOURCE TERM.
*----
      AIL=0.0D0
      BIL=0.0D0
      GAR1(:NUN,:NGRP)=0.0
      DO 110 IGR=1,NGRP
      DO 100 JGR=1,NGRP
      WRITE(TEXT12,'(1HB,2I3.3)') JGR,IGR
      CALL LCMLEN(IPSYS0,TEXT12,ILONG,ITYLCM)
      IF(ILONG.EQ.0) GO TO 100
      CALL LCMGPD(IPSYS0,TEXT12,AGAR_PTR)
      CALL C_F_POINTER(AGAR_PTR,AGAR,(/ NUN /))
      DO I=1,ILONG
        GAR1(I,IGR)=GAR1(I,IGR)+AGAR(I)*EVECT(I,JGR)
      ENDDO
  100 CONTINUE
      DO I=1,LL4
        AIL=AIL+ADECT(I,IGR)*SOUR(I,IGR)
        BIL=BIL+ADECT(I,IGR)*GAR1(I,IGR)
      ENDDO
  110 CONTINUE
      DO 125 IGR=1,NGRP
      DO 120 I=1,LL4
      SOUR(I,IGR)=SOUR(I,IGR)-REAL(AIL/BIL)*GAR1(I,IGR)
  120 CONTINUE
  125 CONTINUE
*----
*  SCRATCH STORAGE DEALLOCATION.
*----
      DEALLOCATE(GRAD1,GAR1,WORK1)
*----
*  LIVOLANT ACCELERATION.
*----
      IF(IMPX.GE.1) WRITE (6,600) NADI
      IF(NSTART.EQ.0) THEN
        CALL GPTLIV(IPTRK,IPSYS0,IPFLUP,.FALSE.,LL4,ITY,NUN,NGRP,ICL1,
     1  ICL2,IMPX,IMPH,TITR,NADI,MAXINR,MAXX0,EPS2,EPSINR,EVAL,EVECT,
     2  ADECT,EASS,SOUR,TKT,TKB,ZNORM,M)
*----
*  GMRES.
*----
      ELSE IF(NSTART.GT.0) THEN
        CALL GPTMRA(IPTRK,IPSYS0,IPFLUP,.FALSE.,LL4,ITY,NUN,NGRP,ICL1,
     1  ICL2,IMPX,NADI,MAXINR,NSTART,MAXX0,EPS2,EPSINR,EVAL,EVECT,ADECT,
     2  EASS,SOUR,TKT,TKB,ZNORM,M)
      ENDIF
*----
*  SOLUTION EDITION.
*----
      IF(IMPX.EQ.1) WRITE (6,610) M
      IF(IMPX.GE.3) THEN
         DO 130 IGR=1,NGRP
         WRITE (6,620) IGR,(EASS(I,IGR),I=1,LL4)
  130    CONTINUE
      ENDIF
      RETURN
*
  600 FORMAT(1H1/50H GPTDFL: ITERATIVE PROCEDURE BASED ON PRECONDITION,
     1 17HED POWER METHOD (,I2,37H ADI ITERATIONS PER OUTER ITERATION)./
     2 9X,39HDIRECT FIXED SOURCE EIGENVALUE PROBLEM.)
  610 FORMAT(/23H GPTDFL: CONVERGENCE IN,I4,12H ITERATIONS.)
  620 FORMAT(//52H GPTDFL: DIRECT FIXED SOURCE PROBLEM SOLUTION CORRES,
     1 20HPONDING TO THE GROUP,I4//(5X,1P,8E14.5))
      END