xref: /phasta/phSolver/compressible/solmfg.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen        subroutine SolMFG (y,         ac,        yold,      acold,
2*59599516SKenneth E. Jansen     &			   x,
3*59599516SKenneth E. Jansen     &                     iBC,       BC,        res,
4*59599516SKenneth E. Jansen     &                     BDiag,     HBrg,      eBrg,
5*59599516SKenneth E. Jansen     &                     yBrg,      Rcos,      Rsin,      iper,
6*59599516SKenneth E. Jansen     &                     ilwork,    shp,       shgl,
7*59599516SKenneth E. Jansen     &                     shpb,      shglb,     Dy, rerr)
8*59599516SKenneth E. Jansenc
9*59599516SKenneth E. Jansenc----------------------------------------------------------------------
10*59599516SKenneth E. Jansenc
11*59599516SKenneth E. Jansenc  This is the preconditioned matrix-free GMRES driver routine.
12*59599516SKenneth E. Jansenc
13*59599516SKenneth E. Jansenc input:
14*59599516SKenneth E. Jansenc  y      (nshg,ndof)           : Y-variables at n+alpha_v
15*59599516SKenneth E. Jansenc  ac     (nshg,ndof)           : Primvar. accel. variable n+alpha_m
16*59599516SKenneth E. Jansenc  yold   (nshg,ndof)           : Y-variables at beginning of step
17*59599516SKenneth E. Jansenc  acold  (nshg,ndof)           : Primvar. accel. variable at begng step
18*59599516SKenneth E. Jansenc  x      (numnp,nsd)            : node coordinates
19*59599516SKenneth E. Jansenc  iBC    (nshg)                : BC codes
20*59599516SKenneth E. Jansenc  BC     (nshg,ndofBC)         : BC constraint parameters
21*59599516SKenneth E. Jansenc  HBrg   (Kspace+1,Kspace)      : Hessenberg matrix (LHS matrix)
22*59599516SKenneth E. Jansenc  eBrg   (Kspace+1)             : RHS      of Hessenberg minim. problem
23*59599516SKenneth E. Jansenc  yBrg   (Kspace)               : solution of Hessenberg minim. problem
24*59599516SKenneth E. Jansenc  Rcos   (Kspace)               : Rotational cosine of QR algorithm
25*59599516SKenneth E. Jansenc  Rsin   (Kspace)               : Rotational sine   of QR algorithm
26*59599516SKenneth E. Jansenc  shp(b) (nen,maxsh,melCat)     : element shape functions (boundary)
27*59599516SKenneth E. Jansenc  shgl(b)(nsd,nen,maxsh,melCat) : local gradients of shape functions
28*59599516SKenneth E. Jansenc
29*59599516SKenneth E. Jansenc output:
30*59599516SKenneth E. Jansenc  res    (nshg,ndof)           : preconditioned residual
31*59599516SKenneth E. Jansenc  BDiag  (nshg,ndof,ndof)      : block-diagonal preconditioner
32*59599516SKenneth E. Jansenc
33*59599516SKenneth E. Jansenc
34*59599516SKenneth E. Jansenc Zdenek Johan,  Winter 1991.  (Fortran 90)
35*59599516SKenneth E. Jansenc----------------------------------------------------------------------
36*59599516SKenneth E. Jansenc
37*59599516SKenneth E. Jansen        include "common.h"
38*59599516SKenneth E. Jansen        include "mpif.h"
39*59599516SKenneth E. Jansen        include "auxmpi.h"
40*59599516SKenneth E. Jansenc
41*59599516SKenneth E. Jansen        dimension y(nshg,ndof),             ac(nshg,ndof),
42*59599516SKenneth E. Jansen     &            yold(nshg,ndof),          acold(nshg,ndof),
43*59599516SKenneth E. Jansen     &            x(numnp,nsd),
44*59599516SKenneth E. Jansen     &            iBC(nshg),                BC(nshg,ndofBC),
45*59599516SKenneth E. Jansen     &            res(nshg,nflow),
46*59599516SKenneth E. Jansen     &            BDiag(nshg,nflow,nflow),
47*59599516SKenneth E. Jansen     &            HBrg(Kspace+1,Kspace),    eBrg(Kspace+1),
48*59599516SKenneth E. Jansen     &            yBrg(Kspace),             Rcos(Kspace),
49*59599516SKenneth E. Jansen     &            Rsin(Kspace),             ilwork(nlwork),
50*59599516SKenneth E. Jansen     &            iper(nshg)
51*59599516SKenneth E. Jansenc
52*59599516SKenneth E. Jansen        dimension Dy(nshg,nflow),            rmes(nshg,nflow),
53*59599516SKenneth E. Jansen     &            ypre(nshg,nflow),          temp(nshg,nflow),
54*59599516SKenneth E. Jansen     &            uBrg(nshg,nflow,Kspace+1),  ytmp(nshg,nflow)
55*59599516SKenneth E. Jansen
56*59599516SKenneth E. Jansenc
57*59599516SKenneth E. Jansen        dimension shp(MAXTOP,maxsh,MAXQPT),
58*59599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
59*59599516SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
60*59599516SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
61*59599516SKenneth E. Jansenc
62*59599516SKenneth E. Jansenc.... *******************>> Element Data Formation <<******************
63*59599516SKenneth E. Jansenc
64*59599516SKenneth E. Jansenc
65*59599516SKenneth E. Jansenc.... set the parameters for flux and surface tension calculations
66*59599516SKenneth E. Jansenc
67*59599516SKenneth E. Jansen        idflx = zero
68*59599516SKenneth E. Jansen        if(idiff >= 1)  idflx= idflx + (nflow-1) * nsd
69*59599516SKenneth E. Jansen        if (isurf == 1) idflx=idflx + nsd
70*59599516SKenneth E. Jansenc
71*59599516SKenneth E. Jansen        call ElmMFG (y,             ac,            x,
72*59599516SKenneth E. Jansen     &               shp,           shgl,
73*59599516SKenneth E. Jansen     &               iBC,           BC,
74*59599516SKenneth E. Jansen     &               shpb,          shglb,
75*59599516SKenneth E. Jansen     &               res,           rmes,
76*59599516SKenneth E. Jansen     &               BDiag,         iper,          ilwork,
77*59599516SKenneth E. Jansen     &               rerr)
78*59599516SKenneth E. Jansenc
79*59599516SKenneth E. Jansenc.... **********************>> Matrix-Free GMRES <<********************
80*59599516SKenneth E. Jansenc
81*59599516SKenneth E. Jansenc
82*59599516SKenneth E. Jansenc.... start the timer
83*59599516SKenneth E. Jansenc
84*59599516SKenneth E. Jansen        call timer ('Solver  ')
85*59599516SKenneth E. Jansenc
86*59599516SKenneth E. Jansenc.... ------------------------> Initialization <-----------------------
87*59599516SKenneth E. Jansenc
88*59599516SKenneth E. Jansen
89*59599516SKenneth E. Jansenc
90*59599516SKenneth E. Jansenc.... LU decompose the block diagonals
91*59599516SKenneth E. Jansenc
92*59599516SKenneth E. Jansen        if (iprec .ne. 0)
93*59599516SKenneth E. Jansen     &  call i3LU (BDiag, res,  'LU_Fact ')
94*59599516SKenneth E. Jansen
95*59599516SKenneth E. Jansenc
96*59599516SKenneth E. Jansenc.... block diagonal precondition residual
97*59599516SKenneth E. Jansenc
98*59599516SKenneth E. Jansen        call i3LU (BDiag, res,  'forward ')
99*59599516SKenneth E. Jansenc
100*59599516SKenneth E. Jansenc  This is a feature that allows one to take an extra pass just to
101*59599516SKenneth E. Jansenc  find the residual at the end of the last solve.
102*59599516SKenneth E. Jansenc
103*59599516SKenneth E. Jansenc$$$        if(iter.ge.(press*nitr) ) then
104*59599516SKenneth E. Jansenc$$$          iKs=0
105*59599516SKenneth E. Jansenc$$$          lGMRES=0
106*59599516SKenneth E. Jansenc$$$          goto 3002
107*59599516SKenneth E. Jansenc$$$        endif
108*59599516SKenneth E. Jansen
109*59599516SKenneth E. Jansenc
110*59599516SKenneth E. Jansenc.... block diagonal precondition modified residual
111*59599516SKenneth E. Jansenc
112*59599516SKenneth E. Jansen        call i3LU (BDiag, rmes, 'forward ')
113*59599516SKenneth E. Jansen
114*59599516SKenneth E. Jansenc
115*59599516SKenneth E. Jansenc.... copy res in uBrg(1)
116*59599516SKenneth E. Jansenc
117*59599516SKenneth E. Jansen        uBrg(:,:,1) = res
118*59599516SKenneth E. Jansenc
119*59599516SKenneth E. Jansenc.... initialize Dy
120*59599516SKenneth E. Jansenc
121*59599516SKenneth E. Jansen        Dy = zero
122*59599516SKenneth E. Jansenc
123*59599516SKenneth E. Jansenc.... block diagonal precondition y-variables
124*59599516SKenneth E. Jansenc
125*59599516SKenneth E. Jansen        ypre(:,:) = y(:,1:nflow) ! ypre is the pre-conditioned,
126*59599516SKenneth E. Jansen                                 ! unperturbed, base vector
127*59599516SKenneth E. Jansenc
128*59599516SKenneth E. Jansen        call yshuffle(ypre,'new2old ')
129*59599516SKenneth E. Jansenc
130*59599516SKenneth E. Jansen        call i3LU (BDiag, ypre,   'product ')
131*59599516SKenneth E. Jansenc
132*59599516SKenneth E. Jansenc  since we will never use ypre in the "new" form again, leave it
133*59599516SKenneth E. Jansenc  shuffled
134*59599516SKenneth E. Jansenc
135*59599516SKenneth E. Jansenc        call yshuffle(ypre, 'old2new ')
136*59599516SKenneth E. Jansenc
137*59599516SKenneth E. Jansenc.... calculate norm of residual
138*59599516SKenneth E. Jansenc
139*59599516SKenneth E. Jansen        temp  = res**2
140*59599516SKenneth E. Jansen
141*59599516SKenneth E. Jansenc        call tnanq(temp,5,"res**2  ")
142*59599516SKenneth E. Jansen
143*59599516SKenneth E. Jansen        call sumgat (temp, nflow, summed, ilwork)
144*59599516SKenneth E. Jansen        unorm = sqrt(summed)
145*59599516SKenneth E. Jansenc
146*59599516SKenneth E. Jansenc.... flop count
147*59599516SKenneth E. Jansenc
148*59599516SKenneth E. Jansen        flops = flops + ndof*nshg+nshg
149*59599516SKenneth E. Jansenc
150*59599516SKenneth E. Jansenc.... check if GMRES iterations are required
151*59599516SKenneth E. Jansenc
152*59599516SKenneth E. Jansen        iKs    = 0
153*59599516SKenneth E. Jansen        lGMRES = 0
154*59599516SKenneth E. Jansenc
155*59599516SKenneth E. Jansenc.... if we are down to machine precision, don't bother solving
156*59599516SKenneth E. Jansenc
157*59599516SKenneth E. Jansen        if (unorm .lt. 100.*epsM**2) goto 3000
158*59599516SKenneth E. Jansenc
159*59599516SKenneth E. Jansenc.... set up tolerance of the Hessenberg's problem
160*59599516SKenneth E. Jansenc
161*59599516SKenneth E. Jansen        epsnrm = etol * unorm
162*59599516SKenneth E. Jansenc
163*59599516SKenneth E. Jansenc.... compute the finite difference interval
164*59599516SKenneth E. Jansenc
165*59599516SKenneth E. Jansen        if ((iter .eq. 1) .and. (mod(istep,20) .eq. 0)) then
166*59599516SKenneth E. Jansen           call itrFDI (ypre,            y,            ac,
167*59599516SKenneth E. Jansen     &                  x,               rmes,
168*59599516SKenneth E. Jansen     &                  res,             BDiag,         iBC,
169*59599516SKenneth E. Jansen     &                  BC,              iper,
170*59599516SKenneth E. Jansen     &                  ilwork,          shp,           shgl,
171*59599516SKenneth E. Jansen     &                  shpb,            shglb)
172*59599516SKenneth E. Jansen        endif
173*59599516SKenneth E. Jansen        ires=2
174*59599516SKenneth E. Jansenc
175*59599516SKenneth E. Jansenc.... ------------------------>  GMRES Loop  <-------------------------
176*59599516SKenneth E. Jansenc
177*59599516SKenneth E. Jansenc.... loop through GMRES cycles
178*59599516SKenneth E. Jansenc
179*59599516SKenneth E. Jansen        do 2000 mGMRES = 1, nGMRES
180*59599516SKenneth E. Jansen        lGMRES = mGMRES - 1
181*59599516SKenneth E. Jansenc
182*59599516SKenneth E. Jansen        if (lGMRES .gt. 0) then
183*59599516SKenneth E. Jansenc
184*59599516SKenneth E. Jansenc.... calculate  R - A u
185*59599516SKenneth E. Jansenc
186*59599516SKenneth E. Jansen          call Au2MFG (ypre,        y,        ac,
187*59599516SKenneth E. Jansen     &                 x,           rmes,
188*59599516SKenneth E. Jansen     &                 res,         Dy,          temp,
189*59599516SKenneth E. Jansen     &                 BDiag,       iBC,         BC,
190*59599516SKenneth E. Jansen     &                 iper,        ilwork,
191*59599516SKenneth E. Jansen     &                 shp,         shgl,
192*59599516SKenneth E. Jansen     &                 shpb,        shglb)
193*59599516SKenneth E. Jansen
194*59599516SKenneth E. Jansenc
195*59599516SKenneth E. Jansen          uBrg(:,:,1) = temp
196*59599516SKenneth E. Jansenc
197*59599516SKenneth E. Jansenc.... calculate the norm
198*59599516SKenneth E. Jansenc
199*59599516SKenneth E. Jansen          temp  = temp**2
200*59599516SKenneth E. Jansen          call sumgat (temp, ndof, summed, ilwork)
201*59599516SKenneth E. Jansen          unorm = sqrt(summed)
202*59599516SKenneth E. Jansen
203*59599516SKenneth E. Jansenc
204*59599516SKenneth E. Jansenc.... flop count
205*59599516SKenneth E. Jansenc
206*59599516SKenneth E. Jansen          flops = flops + ndof*nshg+nshg
207*59599516SKenneth E. Jansenc
208*59599516SKenneth E. Jansen        endif
209*59599516SKenneth E. Jansenc
210*59599516SKenneth E. Jansenc.... set up RHS of the Hessenberg's problem
211*59599516SKenneth E. Jansenc
212*59599516SKenneth E. Jansen        call clear (eBrg, Kspace+1)
213*59599516SKenneth E. Jansen        eBrg(1) = unorm
214*59599516SKenneth E. Jansenc
215*59599516SKenneth E. Jansenc.... normalize the first Krylov vector
216*59599516SKenneth E. Jansenc
217*59599516SKenneth E. Jansen        uBrg(:,:,1) = uBrg(:,:,1) / unorm
218*59599516SKenneth E. Jansenc
219*59599516SKenneth E. Jansenc.... loop through GMRES iterations
220*59599516SKenneth E. Jansenc
221*59599516SKenneth E. Jansen        do 1000 iK = 1, Kspace
222*59599516SKenneth E. Jansen        iKs = iK
223*59599516SKenneth E. Jansenc
224*59599516SKenneth E. Jansenc.... Au product
225*59599516SKenneth E. Jansenc
226*59599516SKenneth E. Jansen        temp = uBrg(:,:,iKs)
227*59599516SKenneth E. Jansenc
228*59599516SKenneth E. Jansen        call Au1MFG (ypre,        y,           ac,
229*59599516SKenneth E. Jansen     &               x,           rmes,
230*59599516SKenneth E. Jansen     &               res,         temp,        BDiag,
231*59599516SKenneth E. Jansen     &               iBC,         BC,
232*59599516SKenneth E. Jansen     &               iper,        ilwork,
233*59599516SKenneth E. Jansen     &               shp,         shgl,
234*59599516SKenneth E. Jansen     &               shpb,        shglb)
235*59599516SKenneth E. Jansenc
236*59599516SKenneth E. Jansen        uBrg(:,:,iKs+1) = temp   ! u_{i+1}= J u_i  In Johan Thesis p 15c
237*59599516SKenneth E. Jansenc$$$c
238*59599516SKenneth E. Jansenc$$$c.... debug
239*59599516SKenneth E. Jansenc$$$c
240*59599516SKenneth E. Jansenc$$$           do i=1,nshg
241*59599516SKenneth E. Jansenc$$$              write(78,'(5(f14.7))')(uBrg(i,j,iKs+1),j=1,5)
242*59599516SKenneth E. Jansenc$$$           enddo
243*59599516SKenneth E. Jansenc$$$           stop
244*59599516SKenneth E. Jansenc
245*59599516SKenneth E. Jansenc.... orthogonalize and get the norm
246*59599516SKenneth E. Jansenc
247*59599516SKenneth E. Jansen        do jK = 1, iKs+1
248*59599516SKenneth E. Jansenc
249*59599516SKenneth E. Jansen          if (jK .eq. 1) then
250*59599516SKenneth E. Jansenc
251*59599516SKenneth E. Jansen            temp = uBrg(:,:,iKs+1) * uBrg(:,:,1)  ! {u_{i+1}*u_1} vector
252*59599516SKenneth E. Jansen            call sumgat (temp, nflow, beta, ilwork) ! sum vector=(u_{i+1},u_1)
253*59599516SKenneth E. Jansenc
254*59599516SKenneth E. Jansen          else
255*59599516SKenneth E. Jansenc
256*59599516SKenneth E. Jansenc project off jK-1 vector
257*59599516SKenneth E. Jansenc
258*59599516SKenneth E. Jansen            uBrg(:,:,iKs+1) = uBrg(:,:,iKs+1) - beta * uBrg(:,:,jK-1)
259*59599516SKenneth E. Jansenc
260*59599516SKenneth E. Jansen            temp = uBrg(:,:,iKs+1) * uBrg(:,:,jK) !{u_{i+1}*u_j} vector
261*59599516SKenneth E. Jansen            call sumgat (temp, nflow, beta, ilwork) ! sum vector=(u_{i+1},u_j)
262*59599516SKenneth E. Jansenc
263*59599516SKenneth E. Jansen          endif
264*59599516SKenneth E. Jansenc
265*59599516SKenneth E. Jansen          HBrg(jK,iKs) = beta   ! put this in the Hessenberg Matrix
266*59599516SKenneth E. Jansenc
267*59599516SKenneth E. Jansen        enddo
268*59599516SKenneth E. Jansenc
269*59599516SKenneth E. Jansen        flops = flops + (3*iKs+1)*nflow*nshg+(iKs+1)*nshg
270*59599516SKenneth E. Jansenc
271*59599516SKenneth E. Jansenc  the last inner product was with what was left of the vector (after
272*59599516SKenneth E. Jansenc  projecting off all of the previous vectors
273*59599516SKenneth E. Jansenc
274*59599516SKenneth E. Jansen        unorm           = sqrt(beta)
275*59599516SKenneth E. Jansen        HBrg(iKs+1,iKs) = unorm   ! this fills the 1 sub diagonal band
276*59599516SKenneth E. Jansenc
277*59599516SKenneth E. Jansenc.... normalize the Krylov vector
278*59599516SKenneth E. Jansenc
279*59599516SKenneth E. Jansen        uBrg(:,:,iKs+1) = uBrg(:,:,iKs+1) / unorm  ! normalize the next Krylov
280*59599516SKenneth E. Jansenc vector
281*59599516SKenneth E. Jansenc
282*59599516SKenneth E. Jansenc.... construct and reduce the Hessenberg Matrix
283*59599516SKenneth E. Jansenc  since there is only one subdiagonal we can use a Givens rotation to
284*59599516SKenneth E. Jansenc  rotate off each subdiagonal AS IT IS FORMED.   We do this because it
285*59599516SKenneth E. Jansenc  allows us to check progress of solution and quit when satisfied.  Note
286*59599516SKenneth E. Jansenc  that all future K vects will put a subdiagonal in the next column so
287*59599516SKenneth E. Jansenc  there is no penalty to work ahead as  the rotation for the next vector
288*59599516SKenneth E. Jansenc   will be unaffected by this rotation.
289*59599516SKenneth E. Jansen
290*59599516SKenneth E. Jansenc
291*59599516SKenneth E. Jansenc   H Y = E ========>   R_i H Y = R_i E
292*59599516SKenneth E. Jansenc
293*59599516SKenneth E. Jansen        do jK = 1, iKs-1
294*59599516SKenneth E. Jansen          tmp            =  Rcos(jK) * HBrg(jK,  iKs) +
295*59599516SKenneth E. Jansen     &                      Rsin(jK) * HBrg(jK+1,iKs)
296*59599516SKenneth E. Jansen          HBrg(jK+1,iKs) = -Rsin(jK) * HBrg(jK,  iKs) +
297*59599516SKenneth E. Jansen     &                      Rcos(jK) * HBrg(jK+1,iKs)
298*59599516SKenneth E. Jansen          HBrg(jK,  iKs) =  tmp
299*59599516SKenneth E. Jansen        enddo
300*59599516SKenneth E. Jansenc
301*59599516SKenneth E. Jansen        tmp             = sqrt(HBrg(iKs,iKs)**2 + HBrg(iKs+1,iKs)**2)
302*59599516SKenneth E. Jansen        Rcos(iKs)       = HBrg(iKs,  iKs) / tmp
303*59599516SKenneth E. Jansen        Rsin(iKs)       = HBrg(iKs+1,iKs) / tmp
304*59599516SKenneth E. Jansen        HBrg(iKs,  iKs) = tmp
305*59599516SKenneth E. Jansen        HBrg(iKs+1,iKs) = zero
306*59599516SKenneth E. Jansenc
307*59599516SKenneth E. Jansenc.... rotate eBrg    R_i E
308*59599516SKenneth E. Jansenc
309*59599516SKenneth E. Jansen        tmp         =  Rcos(iKs) * eBrg(iKs) + Rsin(iKs) * eBrg(iKs+1)
310*59599516SKenneth E. Jansen        eBrg(iKs+1) = -Rsin(iKs) * eBrg(iKs) + Rcos(iKs) * eBrg(iKs+1)
311*59599516SKenneth E. Jansen        eBrg(iKs)   =  tmp
312*59599516SKenneth E. Jansenc
313*59599516SKenneth E. Jansenc.... check for convergence
314*59599516SKenneth E. Jansenc
315*59599516SKenneth E. Jansen        ercheck=eBrg(iKs+1)
316*59599516SKenneth E. Jansen        ntotGM = ntotGM + 1
317*59599516SKenneth E. Jansen        if (abs(eBrg(iKs+1)) .le. epsnrm) exit
318*59599516SKenneth E. Jansenc
319*59599516SKenneth E. Jansenc.... end of GMRES iteration loop
320*59599516SKenneth E. Jansenc
321*59599516SKenneth E. Jansen1000    continue
322*59599516SKenneth E. Jansenc
323*59599516SKenneth E. Jansenc.... ------------------------->   Solution   <------------------------
324*59599516SKenneth E. Jansenc
325*59599516SKenneth E. Jansenc.... if converged or end of Krylov space
326*59599516SKenneth E. Jansenc
327*59599516SKenneth E. Jansenc.... solve for yBrg
328*59599516SKenneth E. Jansenc
329*59599516SKenneth E. Jansen        do jK = iKs, 1, -1
330*59599516SKenneth E. Jansen          yBrg(jK) = eBrg(jK) / HBrg(jK,jK)
331*59599516SKenneth E. Jansen          do lK = 1, jK-1
332*59599516SKenneth E. Jansen            eBrg(lK) = eBrg(lK) - yBrg(jK) * HBrg(lK,jK)
333*59599516SKenneth E. Jansen          enddo
334*59599516SKenneth E. Jansen        enddo
335*59599516SKenneth E. Jansenc
336*59599516SKenneth E. Jansenc.... update Dy
337*59599516SKenneth E. Jansenc
338*59599516SKenneth E. Jansen        do jK = 1, iKs
339*59599516SKenneth E. Jansen          Dy = Dy + yBrg(jK) * uBrg(:,:,jK)
340*59599516SKenneth E. Jansen        enddo
341*59599516SKenneth E. Jansenc
342*59599516SKenneth E. Jansenc.... flop count
343*59599516SKenneth E. Jansenc
344*59599516SKenneth E. Jansen        flops = flops + (3*iKs+1)*nflow*nshg
345*59599516SKenneth E. Jansenc
346*59599516SKenneth E. Jansenc.... check for convergence
347*59599516SKenneth E. Jansenc
348*59599516SKenneth E. Jansen        if (abs(eBrg(iKs+1)) .le. epsnrm) exit
349*59599516SKenneth E. Jansenc
350*59599516SKenneth E. Jansenc.... end of mGMRES loop
351*59599516SKenneth E. Jansenc
352*59599516SKenneth E. Jansen2000    continue
353*59599516SKenneth E. Jansenc
354*59599516SKenneth E. Jansenc.... ------------------------>   Converged   <------------------------
355*59599516SKenneth E. Jansenc
356*59599516SKenneth E. Jansenc.... if converged
357*59599516SKenneth E. Jansenc
358*59599516SKenneth E. Jansen3000    continue
359*59599516SKenneth E. Jansen
360*59599516SKenneth E. Jansenc
361*59599516SKenneth E. Jansenc.... back precondition the results
362*59599516SKenneth E. Jansenc
363*59599516SKenneth E. Jansen        call i3LU (BDiag, Dy, 'backward')
364*59599516SKenneth E. Jansenc
365*59599516SKenneth E. Jansenc.... output the statistics
366*59599516SKenneth E. Jansenc
367*59599516SKenneth E. Jansen              call rstat (res, ilwork)
368*59599516SKenneth E. Jansenc
369*59599516SKenneth E. Jansenc ... reset ires to 3 again (asires changed ires to 2)
370*59599516SKenneth E. Jansenc
371*59599516SKenneth E. Jansen              ires = 3
372*59599516SKenneth E. Jansenc
373*59599516SKenneth E. Jansenc.... stop the timer
374*59599516SKenneth E. Jansenc
375*59599516SKenneth E. Jansen3002    continue  ! no solve just res.
376*59599516SKenneth E. Jansen        call timer ('Back    ')
377*59599516SKenneth E. Jansenc
378*59599516SKenneth E. Jansenc.... end
379*59599516SKenneth E. Jansenc
380*59599516SKenneth E. Jansen        return
381*59599516SKenneth E. Jansen        end
382