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