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) 7513954efSKenneth E. Jansen! 8513954efSKenneth E. Jansen!---------------------------------------------------------------------- 9513954efSKenneth E. Jansen! 10513954efSKenneth E. Jansen! This routine performs a matrix-vector product for the Matrix-Free 11513954efSKenneth E. Jansen! Implicit/Iterative solver using a two-sided scheme and subtracts 12513954efSKenneth E. Jansen! it from the residual. 13513954efSKenneth E. Jansen! 14513954efSKenneth E. Jansen! input: 15513954efSKenneth E. Jansen! y (nshg,ndof) : Y-variables 16513954efSKenneth E. Jansen! ypre (nshg,ndof) : preconditioned Y-variables 17513954efSKenneth E. Jansen! x (numnp,nsd) : node coordinates 18513954efSKenneth E. Jansen! rmes (nshg,nflow) : modified residual 19513954efSKenneth E. Jansen! res (nshg,nflow) : residual 20513954efSKenneth E. Jansen! Dy (nshg,nflow) : solution step 21513954efSKenneth E. Jansen! BDiag (nshg,nflow,nflow) : block-diagonal preconditioner 22513954efSKenneth E. Jansen! iBC (nshg) : BC codes 23513954efSKenneth E. Jansen! BC (nshg,ndofBC) : BC constraint parameters 24513954efSKenneth E. Jansen! 25513954efSKenneth E. Jansen! output: 26513954efSKenneth E. Jansen! uBrg (nshg,nflow) : Krylov vector ( R - A x ) 27513954efSKenneth E. Jansen! 28513954efSKenneth E. Jansen! 29513954efSKenneth E. Jansen! Zdenek Johan, Winter 1991. (Fortran 90) 30513954efSKenneth E. Jansen!---------------------------------------------------------------------- 31513954efSKenneth E. Jansen! 3259599516SKenneth E. Jansen include "common.h" 33513954efSKenneth 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) 41513954efSKenneth E. Jansen! 4259599516SKenneth E. Jansen dimension uBtmp1(nshg,nflow), uBtmp2(nshg,nflow), 4359599516SKenneth E. Jansen & tmpBC(nshg), ilwork(nlwork) 44513954efSKenneth 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 50513954efSKenneth E. Jansen!$$$ dimension shp(nshl,ngauss), shgl(nsd,nshl,ngauss), 51513954efSKenneth E. Jansen!$$$ & shpb(nshl,ngaussb), shglb(nsd,nshl,ngaussb) 52513954efSKenneth E. Jansen! 53513954efSKenneth E. Jansen!.... compute the finite difference interval 54513954efSKenneth 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) 58513954efSKenneth E. Jansen! 59513954efSKenneth E. Jansen!.... calculate R(y + eps x) 60513954efSKenneth E. Jansen! 6159599516SKenneth E. Jansen uBtmp1 = zero 62513954efSKenneth E. Jansen! 63513954efSKenneth E. Jansen! call yshuffle(ypre, 'new2old ') 64513954efSKenneth E. Jansen! 6559599516SKenneth E. Jansen uBrg = ypre + eps * Dy 66513954efSKenneth E. Jansen! 6759599516SKenneth E. Jansen call i3LU (BDiag, uBrg, 'backward') 68513954efSKenneth E. Jansen! 6959599516SKenneth E. Jansen call yshuffle(uBrg, 'old2new ') 70513954efSKenneth E. Jansen! 7159599516SKenneth E. Jansen call itrBC (uBrg, uBrg, iBC, BC, iper, ilwork) 72513954efSKenneth 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, 78513954efSKenneth E. Jansen & iper, ilwork, ac) 79513954efSKenneth E. Jansen!Added ac to the end if itrRes, but not tested - Nicholas 80513954efSKenneth E. Jansen! 8159599516SKenneth E. Jansen call i3LU (BDiag, uBtmp1, 'forward ') 82513954efSKenneth E. Jansen! 83513954efSKenneth E. Jansen!.... calculate R(y - eps x) 84513954efSKenneth E. Jansen! 8559599516SKenneth E. Jansen uBtmp2 = zero 86513954efSKenneth E. Jansen! 87513954efSKenneth E. Jansen! call yshuffle(ypre, 'new2old ') 88513954efSKenneth E. Jansen! 8959599516SKenneth E. Jansen uBrg = ypre - eps * Dy 90513954efSKenneth E. Jansen! 9159599516SKenneth E. Jansen call i3LU (BDiag, uBrg, 'backward') 92513954efSKenneth E. Jansen! 9359599516SKenneth E. Jansen call yshuffle(uBrg, 'old2new ') 9459599516SKenneth E. Jansen 9559599516SKenneth E. Jansen call itrBC (uBrg, uBrg, iBC, BC, iper, ilwork) 96513954efSKenneth 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) 103513954efSKenneth E. Jansen! 10459599516SKenneth E. Jansen call i3LU (BDiag, uBtmp2, 'forward ') 105513954efSKenneth E. Jansen! 106513954efSKenneth E. Jansen!.... compute R(y) - ( R(y + eps x) - R(y - eps x) ) / 2 eps 107513954efSKenneth E. Jansen! 10859599516SKenneth E. Jansen uBrg = res - ( uBtmp1 - uBtmp2 ) / (two * eps) 109513954efSKenneth E. Jansen! 110513954efSKenneth E. Jansen!.... flop count 111513954efSKenneth E. Jansen! 112*f4d0b58bSKenneth E. Jansen ! flops = flops + 8*nflow*nshg+nshg 113513954efSKenneth E. Jansen! 114513954efSKenneth E. Jansen!.... end 115513954efSKenneth E. Jansen! 11659599516SKenneth E. Jansen return 11759599516SKenneth E. Jansen end 118