summaryrefslogtreecommitdiff
path: root/Trivac/src/FLDBMX.f
blob: 8aaa0754f4eee76d603f1cc31cdfbd50d1862b88 (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
*DECK FLDBMX
      FUNCTION FLDBMX(F,N,IBLSZ,ITER,IPTRK,IPSYS,IPFLUX) RESULT(X)
*
*-----------------------------------------------------------------------
*
*Purpose:
* Multiplication of A^(-1)B times the harmonic flux in BIVAC.
*
*Copyright:
* Copyright (C) 2020 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
* F       harmonic flux vector.
* N       number of unknowns in one harmonic.
* IBLSZ   block size of the Arnoldi Hessenberg matrix.
* ITER    Arnoldi iteration index.
* IPTRK   L_TRACK pointer to the tracking information.
* IPSYS   L_SYSTEM pointer to system matrices.
* IPFLUX  L_FLUX pointer to the solution.
*
*Parameters: output
* X       result of the multiplication.
*
*-----------------------------------------------------------------------
*
      USE GANLIB
*----
*  SUBROUTINE ARGUMENTS
*----
      INTEGER, INTENT(IN) :: N,IBLSZ,ITER
      COMPLEX(KIND=8), DIMENSION(N,IBLSZ), INTENT(IN) :: F
      COMPLEX(KIND=8), DIMENSION(N,IBLSZ) :: X
      TYPE(C_PTR) IPTRK,IPSYS,IPFLUX
*----
*  LOCAL VARIABLES
*----
      PARAMETER(NSTATE=40)
      INTEGER ISTATE(NSTATE)
      REAL EPSCON(5),TIME(2)
      CHARACTER TEXT12*12,HSMG*131
      LOGICAL LUPS
*----
*  ALLOCATABLE ARRAYS
*----
      REAL, DIMENSION(:), ALLOCATABLE :: WORK1,WORK2
      REAL, DIMENSION(:,:), ALLOCATABLE :: GAF1,GRAD
*
*     TIME(1) : CPU TIME FOR THE SOLUTION OF LINEAR SYSTEMS.
*     TIME(2) : CPU TIME FOR BILINEAR PRODUCT EVALUATIONS.
      CALL LCMGET(IPFLUX,'CPU-TIME',TIME)
      CALL KDRCPU(TK1)
*----
*  RECOVER INFORMATION FROM IPTRK, IPSYS AND IPFLUX
*----
      CALL LCMGET(IPTRK,'STATE-VECTOR',ISTATE)
      NEL=ISTATE(1)
      NUN=ISTATE(2)
      NLF=ISTATE(14)
      CALL LCMGET(IPSYS,'STATE-VECTOR',ISTATE)
      NGRP=ISTATE(1)
      LL4=ISTATE(2)
      ITY=ISTATE(4)
      NBMIX=ISTATE(7)
      NAN=ISTATE(8)
      IF(ITY.EQ.11) LL4=LL4*NLF/2 ! SPN cases
      CALL LCMGET(IPFLUX,'STATE-VECTOR',ISTATE)
      ICL1=ISTATE(8)
      ICL2=ISTATE(9)
      IREBAL=ISTATE(10)
      MAXINR=ISTATE(11)
      NADI=ISTATE(13)
      IMPX=ISTATE(40)
      CALL LCMGET(IPFLUX,'EPS-CONVERGE',EPSCON)
      EPSINR=EPSCON(1)
      IF(LL4*NGRP.NE.N) CALL XABORT('FLDBMX: INCONSISTENT UNKNOWNS.')
*----
*  SCRATCH STORAGE ALLOCATION
*----
      ALLOCATE(WORK1(NUN),WORK2(NUN),GAF1(NUN,NGRP),GRAD(NUN,NGRP))
*----
*  CHECK FOR UP-SCATTERING.
*----
      LUPS=.FALSE.
      DO 20 IGR=1,NGRP-1
      DO 10 JGR=IGR+1,NGRP
      WRITE(TEXT12,'(1HA,2I3.3)') IGR,JGR
      CALL LCMLEN(IPSYS,TEXT12,ILONG,ITYLCM)
      IF(ILONG.GT.0) THEN
        LUPS=.TRUE.
        MAXINR=MAX(MAXINR,10)
        GO TO 30
      ENDIF
   10 CONTINUE
   20 CONTINUE
*----
*  MAIN LOOP OVER MODES.
*----
   30 DO 150 IMOD=1,IBLSZ
*----
*  COMPUTE B TIMES THE FLUX.
*----
      DO 80 IGR=1,NGRP
      DO 40 I=1,LL4
      GAF1(I,IGR)=0.0
   40 CONTINUE
      DO 70 JGR=1,NGRP
      WRITE(TEXT12,'(1HB,2I3.3)') IGR,JGR
      CALL LCMLEN(IPSYS,TEXT12,ILONG,ITYLCM)
      IF(ILONG.EQ.0) GO TO 70
      DO 50 I=1,LL4
      IOF=(JGR-1)*LL4+I
      WORK1(I)=REAL(F(IOF,IMOD),KIND=4)
      IF(ABS(AIMAG(F(IOF,IMOD))).GT.1.0E-8) THEN
        WRITE(HSMG,'(13HFLDBMX: FLUX(,2I8,2H)=,1P,2E12.4,
     1  12H IS COMPLEX.)') IOF,IMOD,F(IOF,IMOD)
        CALL XABORT(HSMG)
      ENDIF
   50 CONTINUE
      CALL MTLDLM(TEXT12,IPTRK,IPSYS,LL4,ITY,WORK1(1),WORK2(1))
      DO 60 I=1,LL4
      GAF1(I,IGR)=GAF1(I,IGR)+WORK2(I)
   60 CONTINUE
   70 CONTINUE
   80 CONTINUE
      CALL KDRCPU(TK2)
      TIME(2)=TIME(2)+(TK2-TK1)
*----
*  COMPUTE A^(-1)B WITHOUT UP-SCATTERING.
*----
      DO 120 IGR=1,NGRP
      CALL KDRCPU(TK1)
      DO 90 I=1,LL4
      GRAD(I,IGR)=GAF1(I,IGR)
   90 CONTINUE
      DO 110 JGR=1,IGR-1
      WRITE(TEXT12,'(1HA,2I3.3)') IGR,JGR
      CALL LCMLEN(IPSYS,TEXT12,ILONG,ITYLCM)
      IF(ILONG.EQ.0) GO TO 110
      CALL MTLDLM(TEXT12,IPTRK,IPSYS,LL4,ITY,GRAD(1,JGR),WORK2(1))
      DO 100 I=1,LL4
      GRAD(I,IGR)=GRAD(I,IGR)+WORK2(I)
  100 CONTINUE
  110 CONTINUE
      CALL KDRCPU(TK2)
      TIME(2)=TIME(2)+(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('FLDBMX: SPN-ONLY ALGORITHM.')
        CALL FLDBSS(TEXT12,IPTRK,IPSYS,LL4,NBMIX,NAN,GRAD(1,IGR),NADI)
      ELSE
        CALL MTLDLS(TEXT12,IPTRK,IPSYS,LL4,ITY,GRAD(1,IGR))
      ENDIF
      CALL KDRCPU(TK2)
      TIME(1)=TIME(1)+(TK2-TK1)
  120 CONTINUE
*----
*  PERFORM THERMAL (UP-SCATTERING) ITERATIONS.
*----
      KTER=0
      IF((IREBAL.EQ.1).OR.LUPS) THEN
        CALL FLDBHR(IPTRK,IPSYS,.FALSE.,LL4,ITY,NUN,NGRP,ICL1,ICL2,IMPX,
     1  MAXINR,EPSINR,KTER,TIME(1),TIME(2),GRAD)
      ENDIF
      DO 140 IGR=1,NGRP
      DO 130 I=1,LL4
      IOF=(IGR-1)*LL4+I
      X(IOF,IMOD)=GRAD(I,IGR)
  130 CONTINUE
  140 CONTINUE
*----
*  END OF LOOP OVER MODES.
*----
  150 CONTINUE
      CALL LCMPUT(IPFLUX,'CPU-TIME',2,2,TIME)
      IF(IMPX.GT.10) WRITE(6,200) ITER,KTER
*----
*  SCRATCH STORAGE DEALLOCATION
*----
      DEALLOCATE(GRAD,GAF1,WORK2,WORK1)
      RETURN
  200 FORMAT(49H FLDBMX: MATRIX MULTIPLICATION AT IRAM ITERATION=,I5,
     1 20H THERMAL ITERATIONS=,I5)
      END FUNCTION FLDBMX