1*59599516SKenneth E. Jansen subroutine Au2MFG (ypre, y, ac, x, 2*59599516SKenneth E. Jansen & rmes, res, Dy, 3*59599516SKenneth E. Jansen & uBrg, BDiag, iBC, BC, 4*59599516SKenneth E. Jansen & iper, ilwork, 5*59599516SKenneth E. Jansen & shp, shgl, 6*59599516SKenneth E. Jansen & shpb, shglb) 7*59599516SKenneth E. Jansenc 8*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 9*59599516SKenneth E. Jansenc 10*59599516SKenneth E. Jansenc This routine performs a matrix-vector product for the Matrix-Free 11*59599516SKenneth E. Jansenc Implicit/Iterative solver using a two-sided scheme and subtracts 12*59599516SKenneth E. Jansenc it from the residual. 13*59599516SKenneth E. Jansenc 14*59599516SKenneth E. Jansenc input: 15*59599516SKenneth E. Jansenc y (nshg,ndof) : Y-variables 16*59599516SKenneth E. Jansenc ypre (nshg,ndof) : preconditioned Y-variables 17*59599516SKenneth E. Jansenc x (numnp,nsd) : node coordinates 18*59599516SKenneth E. Jansenc rmes (nshg,nflow) : modified residual 19*59599516SKenneth E. Jansenc res (nshg,nflow) : residual 20*59599516SKenneth E. Jansenc Dy (nshg,nflow) : solution step 21*59599516SKenneth E. Jansenc BDiag (nshg,nflow,nflow) : block-diagonal preconditioner 22*59599516SKenneth E. Jansenc iBC (nshg) : BC codes 23*59599516SKenneth E. Jansenc BC (nshg,ndofBC) : BC constraint parameters 24*59599516SKenneth E. Jansenc 25*59599516SKenneth E. Jansenc output: 26*59599516SKenneth E. Jansenc uBrg (nshg,nflow) : Krylov vector ( R - A x ) 27*59599516SKenneth E. Jansenc 28*59599516SKenneth E. Jansenc 29*59599516SKenneth E. Jansenc Zdenek Johan, Winter 1991. (Fortran 90) 30*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 31*59599516SKenneth E. Jansenc 32*59599516SKenneth E. Jansen include "common.h" 33*59599516SKenneth E. Jansenc 34*59599516SKenneth E. Jansen dimension y(nshg,ndof), ypre(nshg,nflow), 35*59599516SKenneth E. Jansen & x(numnp,nsd), ac(nshg,ndof), 36*59599516SKenneth E. Jansen & rmes(nshg,nflow), ytmp(nshg,nflow), 37*59599516SKenneth E. Jansen & res(nshg,nflow), Dy(nshg,nflow), 38*59599516SKenneth E. Jansen & uBrg(nshg,nflow), BDiag(nshg,nflow,nflow), 39*59599516SKenneth E. Jansen & iBC(nshg), BC(nshg,ndofBC), 40*59599516SKenneth E. Jansen & iper(nshg), Dy2(nshg,nflow) 41*59599516SKenneth E. Jansenc 42*59599516SKenneth E. Jansen dimension uBtmp1(nshg,nflow), uBtmp2(nshg,nflow), 43*59599516SKenneth E. Jansen & tmpBC(nshg), ilwork(nlwork) 44*59599516SKenneth E. Jansenc 45*59599516SKenneth E. Jansen dimension shp(MAXTOP,maxsh,MAXQPT), 46*59599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), 47*59599516SKenneth E. Jansen & shpb(MAXTOP,maxsh,MAXQPT), 48*59599516SKenneth E. Jansen & shglb(MAXTOP,nsd,maxsh,MAXQPT) 49*59599516SKenneth E. Jansen 50*59599516SKenneth E. Jansenc$$$ dimension shp(nshl,ngauss), shgl(nsd,nshl,ngauss), 51*59599516SKenneth E. Jansenc$$$ & shpb(nshl,ngaussb), shglb(nsd,nshl,ngaussb) 52*59599516SKenneth E. Jansenc 53*59599516SKenneth E. Jansenc.... compute the finite difference interval 54*59599516SKenneth E. Jansenc 55*59599516SKenneth E. Jansen Dy2 = Dy**2 56*59599516SKenneth E. Jansen call sumgat (Dy2, nflow, summed, ilwork) 57*59599516SKenneth E. Jansen eps = epsM**pt66 / sqrt(summed) 58*59599516SKenneth E. Jansenc 59*59599516SKenneth E. Jansenc.... calculate R(y + eps x) 60*59599516SKenneth E. Jansenc 61*59599516SKenneth E. Jansen uBtmp1 = zero 62*59599516SKenneth E. Jansenc 63*59599516SKenneth E. Jansenc call yshuffle(ypre, 'new2old ') 64*59599516SKenneth E. Jansenc 65*59599516SKenneth E. Jansen uBrg = ypre + eps * Dy 66*59599516SKenneth E. Jansenc 67*59599516SKenneth E. Jansen call i3LU (BDiag, uBrg, 'backward') 68*59599516SKenneth E. Jansenc 69*59599516SKenneth E. Jansen call yshuffle(uBrg, 'old2new ') 70*59599516SKenneth E. Jansenc 71*59599516SKenneth E. Jansen call itrBC (uBrg, uBrg, iBC, BC, iper, ilwork) 72*59599516SKenneth E. Jansenc 73*59599516SKenneth E. Jansen call itrRes (uBrg, y, 74*59599516SKenneth E. Jansen & x, shp, 75*59599516SKenneth E. Jansen & shgl, iBC, 76*59599516SKenneth E. Jansen & BC, shpb, 77*59599516SKenneth E. Jansen & shglb, uBtmp1, 78*59599516SKenneth E. Jansen & iper, ilwork) 79*59599516SKenneth E. Jansenc 80*59599516SKenneth E. Jansen call i3LU (BDiag, uBtmp1, 'forward ') 81*59599516SKenneth E. Jansenc 82*59599516SKenneth E. Jansenc.... calculate R(y - eps x) 83*59599516SKenneth E. Jansenc 84*59599516SKenneth E. Jansen uBtmp2 = zero 85*59599516SKenneth E. Jansenc 86*59599516SKenneth E. Jansenc call yshuffle(ypre, 'new2old ') 87*59599516SKenneth E. Jansenc 88*59599516SKenneth E. Jansen uBrg = ypre - eps * Dy 89*59599516SKenneth E. Jansenc 90*59599516SKenneth E. Jansen call i3LU (BDiag, uBrg, 'backward') 91*59599516SKenneth E. Jansenc 92*59599516SKenneth E. Jansen call yshuffle(uBrg, 'old2new ') 93*59599516SKenneth E. Jansen 94*59599516SKenneth E. Jansen call itrBC (uBrg, uBrg, iBC, BC, iper, ilwork) 95*59599516SKenneth E. Jansenc 96*59599516SKenneth E. Jansen call itrRes (uBrg, y, 97*59599516SKenneth E. Jansen & x, shp, 98*59599516SKenneth E. Jansen & shgl, iBC, 99*59599516SKenneth E. Jansen & BC, shpb, 100*59599516SKenneth E. Jansen & shglb, uBtmp2, 101*59599516SKenneth E. Jansen & iper, ilwork, ac) 102*59599516SKenneth E. Jansenc 103*59599516SKenneth E. Jansen call i3LU (BDiag, uBtmp2, 'forward ') 104*59599516SKenneth E. Jansenc 105*59599516SKenneth E. Jansenc.... compute R(y) - ( R(y + eps x) - R(y - eps x) ) / 2 eps 106*59599516SKenneth E. Jansenc 107*59599516SKenneth E. Jansen uBrg = res - ( uBtmp1 - uBtmp2 ) / (two * eps) 108*59599516SKenneth E. Jansenc 109*59599516SKenneth E. Jansenc.... flop count 110*59599516SKenneth E. Jansenc 111*59599516SKenneth E. Jansen flops = flops + 8*nflow*nshg+nshg 112*59599516SKenneth E. Jansenc 113*59599516SKenneth E. Jansenc.... end 114*59599516SKenneth E. Jansenc 115*59599516SKenneth E. Jansen return 116*59599516SKenneth E. Jansen end 117