159599516SKenneth E. Jansen subroutine Au2MFG (ypre, y, ac, x, 259599516SKenneth E. Jansen & rmes, res, Dy, 359599516SKenneth E. Jansen & uBrg, BDiag, iBC, BC, 459599516SKenneth E. Jansen & iper, ilwork, 559599516SKenneth E. Jansen & shp, shgl, 659599516SKenneth E. Jansen & shpb, shglb) 7*513954efSKenneth E. Jansen! 8*513954efSKenneth E. Jansen!---------------------------------------------------------------------- 9*513954efSKenneth E. Jansen! 10*513954efSKenneth E. Jansen! This routine performs a matrix-vector product for the Matrix-Free 11*513954efSKenneth E. Jansen! Implicit/Iterative solver using a two-sided scheme and subtracts 12*513954efSKenneth E. Jansen! it from the residual. 13*513954efSKenneth E. Jansen! 14*513954efSKenneth E. Jansen! input: 15*513954efSKenneth E. Jansen! y (nshg,ndof) : Y-variables 16*513954efSKenneth E. Jansen! ypre (nshg,ndof) : preconditioned Y-variables 17*513954efSKenneth E. Jansen! x (numnp,nsd) : node coordinates 18*513954efSKenneth E. Jansen! rmes (nshg,nflow) : modified residual 19*513954efSKenneth E. Jansen! res (nshg,nflow) : residual 20*513954efSKenneth E. Jansen! Dy (nshg,nflow) : solution step 21*513954efSKenneth E. Jansen! BDiag (nshg,nflow,nflow) : block-diagonal preconditioner 22*513954efSKenneth E. Jansen! iBC (nshg) : BC codes 23*513954efSKenneth E. Jansen! BC (nshg,ndofBC) : BC constraint parameters 24*513954efSKenneth E. Jansen! 25*513954efSKenneth E. Jansen! output: 26*513954efSKenneth E. Jansen! uBrg (nshg,nflow) : Krylov vector ( R - A x ) 27*513954efSKenneth E. Jansen! 28*513954efSKenneth E. Jansen! 29*513954efSKenneth E. Jansen! Zdenek Johan, Winter 1991. (Fortran 90) 30*513954efSKenneth E. Jansen!---------------------------------------------------------------------- 31*513954efSKenneth E. Jansen! 3259599516SKenneth E. Jansen include "common.h" 33*513954efSKenneth E. Jansen! 3459599516SKenneth E. Jansen dimension y(nshg,ndof), ypre(nshg,nflow), 3559599516SKenneth E. Jansen & x(numnp,nsd), ac(nshg,ndof), 3659599516SKenneth E. Jansen & rmes(nshg,nflow), ytmp(nshg,nflow), 3759599516SKenneth E. Jansen & res(nshg,nflow), Dy(nshg,nflow), 3859599516SKenneth E. Jansen & uBrg(nshg,nflow), BDiag(nshg,nflow,nflow), 3959599516SKenneth E. Jansen & iBC(nshg), BC(nshg,ndofBC), 4059599516SKenneth E. Jansen & iper(nshg), Dy2(nshg,nflow) 41*513954efSKenneth E. Jansen! 4259599516SKenneth E. Jansen dimension uBtmp1(nshg,nflow), uBtmp2(nshg,nflow), 4359599516SKenneth E. Jansen & tmpBC(nshg), ilwork(nlwork) 44*513954efSKenneth E. Jansen! 4559599516SKenneth E. Jansen dimension shp(MAXTOP,maxsh,MAXQPT), 4659599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), 4759599516SKenneth E. Jansen & shpb(MAXTOP,maxsh,MAXQPT), 4859599516SKenneth E. Jansen & shglb(MAXTOP,nsd,maxsh,MAXQPT) 4959599516SKenneth E. Jansen 50*513954efSKenneth E. Jansen!$$$ dimension shp(nshl,ngauss), shgl(nsd,nshl,ngauss), 51*513954efSKenneth E. Jansen!$$$ & shpb(nshl,ngaussb), shglb(nsd,nshl,ngaussb) 52*513954efSKenneth E. Jansen! 53*513954efSKenneth E. Jansen!.... compute the finite difference interval 54*513954efSKenneth E. Jansen! 5559599516SKenneth E. Jansen Dy2 = Dy**2 5659599516SKenneth E. Jansen call sumgat (Dy2, nflow, summed, ilwork) 5759599516SKenneth E. Jansen eps = epsM**pt66 / sqrt(summed) 58*513954efSKenneth E. Jansen! 59*513954efSKenneth E. Jansen!.... calculate R(y + eps x) 60*513954efSKenneth E. Jansen! 6159599516SKenneth E. Jansen uBtmp1 = zero 62*513954efSKenneth E. Jansen! 63*513954efSKenneth E. Jansen! call yshuffle(ypre, 'new2old ') 64*513954efSKenneth E. Jansen! 6559599516SKenneth E. Jansen uBrg = ypre + eps * Dy 66*513954efSKenneth E. Jansen! 6759599516SKenneth E. Jansen call i3LU (BDiag, uBrg, 'backward') 68*513954efSKenneth E. Jansen! 6959599516SKenneth E. Jansen call yshuffle(uBrg, 'old2new ') 70*513954efSKenneth E. Jansen! 7159599516SKenneth E. Jansen call itrBC (uBrg, uBrg, iBC, BC, iper, ilwork) 72*513954efSKenneth E. Jansen! 7359599516SKenneth E. Jansen call itrRes (uBrg, y, 7459599516SKenneth E. Jansen & x, shp, 7559599516SKenneth E. Jansen & shgl, iBC, 7659599516SKenneth E. Jansen & BC, shpb, 7759599516SKenneth E. Jansen & shglb, uBtmp1, 78*513954efSKenneth E. Jansen & iper, ilwork, ac) 79*513954efSKenneth E. Jansen!Added ac to the end if itrRes, but not tested - Nicholas 80*513954efSKenneth E. Jansen! 8159599516SKenneth E. Jansen call i3LU (BDiag, uBtmp1, 'forward ') 82*513954efSKenneth E. Jansen! 83*513954efSKenneth E. Jansen!.... calculate R(y - eps x) 84*513954efSKenneth E. Jansen! 8559599516SKenneth E. Jansen uBtmp2 = zero 86*513954efSKenneth E. Jansen! 87*513954efSKenneth E. Jansen! call yshuffle(ypre, 'new2old ') 88*513954efSKenneth E. Jansen! 8959599516SKenneth E. Jansen uBrg = ypre - eps * Dy 90*513954efSKenneth E. Jansen! 9159599516SKenneth E. Jansen call i3LU (BDiag, uBrg, 'backward') 92*513954efSKenneth E. Jansen! 9359599516SKenneth E. Jansen call yshuffle(uBrg, 'old2new ') 9459599516SKenneth E. Jansen 9559599516SKenneth E. Jansen call itrBC (uBrg, uBrg, iBC, BC, iper, ilwork) 96*513954efSKenneth E. Jansen! 9759599516SKenneth E. Jansen call itrRes (uBrg, y, 9859599516SKenneth E. Jansen & x, shp, 9959599516SKenneth E. Jansen & shgl, iBC, 10059599516SKenneth E. Jansen & BC, shpb, 10159599516SKenneth E. Jansen & shglb, uBtmp2, 10259599516SKenneth E. Jansen & iper, ilwork, ac) 103*513954efSKenneth E. Jansen! 10459599516SKenneth E. Jansen call i3LU (BDiag, uBtmp2, 'forward ') 105*513954efSKenneth E. Jansen! 106*513954efSKenneth E. Jansen!.... compute R(y) - ( R(y + eps x) - R(y - eps x) ) / 2 eps 107*513954efSKenneth E. Jansen! 10859599516SKenneth E. Jansen uBrg = res - ( uBtmp1 - uBtmp2 ) / (two * eps) 109*513954efSKenneth E. Jansen! 110*513954efSKenneth E. Jansen!.... flop count 111*513954efSKenneth E. Jansen! 11259599516SKenneth E. Jansen flops = flops + 8*nflow*nshg+nshg 113*513954efSKenneth E. Jansen! 114*513954efSKenneth E. Jansen!.... end 115*513954efSKenneth E. Jansen! 11659599516SKenneth E. Jansen return 11759599516SKenneth E. Jansen end 118