1*59599516SKenneth E. Jansen subroutine itrFDI (ypre, y, ac, x, 2*59599516SKenneth E. Jansen & rmes, uBrg, BDiag, 3*59599516SKenneth E. Jansen & iBC, BC, iper, 4*59599516SKenneth E. Jansen & ilwork, shp, shgl, 5*59599516SKenneth E. Jansen & shpb, shglb) 6*59599516SKenneth E. Jansenc 7*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 8*59599516SKenneth E. Jansenc 9*59599516SKenneth E. Jansenc This subroutine computes the "optimum" finite difference 10*59599516SKenneth E. Jansenc interval eps for the forward difference scheme 11*59599516SKenneth E. Jansenc 12*59599516SKenneth E. Jansenc Rmod(y + eps u) - Rmod(y) 13*59599516SKenneth E. Jansenc --------------------------- 14*59599516SKenneth E. Jansenc eps 15*59599516SKenneth E. Jansenc 16*59599516SKenneth E. Jansenc where u is the step and Rmod is the modified residual. 17*59599516SKenneth E. Jansenc 18*59599516SKenneth E. Jansenc Note: A good theoretical reference is 'Practical Optimization' by 19*59599516SKenneth E. Jansenc P.E. Gill, W. Murray and M.H. Wright [1981]. 20*59599516SKenneth E. Jansenc 21*59599516SKenneth E. Jansenc input: 22*59599516SKenneth E. Jansenc y (nshg,ndof) : Y-variables 23*59599516SKenneth E. Jansenc ypre (nshg,ndof) : preconditioned Y-variables 24*59599516SKenneth E. Jansenc x (numnp,nsd) : node coordinates 25*59599516SKenneth E. Jansenc rmes (nshg,nflow) : modified residual 26*59599516SKenneth E. Jansenc uBrg (nshg,nflow) : step 27*59599516SKenneth E. Jansenc BDiag (nshg,nflow,nflow) : block-diagonal preconditioner 28*59599516SKenneth E. Jansenc iBC (nshg) : BC codes 29*59599516SKenneth E. Jansenc BC (nshg,ndofBC) : BC constraint parameters 30*59599516SKenneth E. Jansenc 31*59599516SKenneth E. Jansenc 32*59599516SKenneth E. Jansenc 33*59599516SKenneth E. Jansenc Zdenek Johan, Winter 1989. 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. Jansenc 39*59599516SKenneth E. Jansen dimension y(nshg,ndof), ypre(nshg,nflow), 40*59599516SKenneth E. Jansen & x(numnp,nsd), ac(nshg,ndof), 41*59599516SKenneth E. Jansen & rmes(nshg,nflow), 42*59599516SKenneth E. Jansen & uBrg(nshg,nflow), BDiag(nshg,nflow,nflow), 43*59599516SKenneth E. Jansen & iBC(nshg), BC(nshg,ndofBC), 44*59599516SKenneth E. Jansen & ilwork(nlwork), 45*59599516SKenneth E. Jansen & iper(nshg) 46*59599516SKenneth E. Jansenc 47*59599516SKenneth E. Jansen dimension ytmp(nshg,nflow), rtmp(nshg,nflow) 48*59599516SKenneth E. Jansen dimension tmpy(nshg,ndof) 49*59599516SKenneth E. Jansenc 50*59599516SKenneth E. Jansen dimension shp(MAXTOP,maxsh,MAXQPT), 51*59599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), 52*59599516SKenneth E. Jansen & shpb(MAXTOP,maxsh,MAXQPT), 53*59599516SKenneth E. Jansen & shglb(MAXTOP,nsd,maxsh,MAXQPT) 54*59599516SKenneth E. Jansenc 55*59599516SKenneth E. Jansenc.... compute the accuracy (cancellation error) -> epsA 56*59599516SKenneth E. Jansenc 57*59599516SKenneth E. Jansen rtmp = zero 58*59599516SKenneth E. Jansenc 59*59599516SKenneth E. Jansen ytmp = ypre 60*59599516SKenneth E. Jansenc 61*59599516SKenneth E. Jansenc call yshuffle(ytmp, 'new2old ') 62*59599516SKenneth E. Jansenc 63*59599516SKenneth E. Jansen call i3LU (BDiag, ytmp, 'backward') 64*59599516SKenneth E. Jansenc 65*59599516SKenneth E. Jansen call yshuffle(ytmp, 'old2new ') 66*59599516SKenneth E. Jansenc 67*59599516SKenneth E. Jansen iabres = 1 68*59599516SKenneth E. Jansenc 69*59599516SKenneth E. Jansen call itrRes (ytmp, y, 70*59599516SKenneth E. Jansen & x, shp, 71*59599516SKenneth E. Jansen & shgl, iBC, 72*59599516SKenneth E. Jansen & BC, shpb, 73*59599516SKenneth E. Jansen & shglb, rtmp, 74*59599516SKenneth E. Jansen & iper, ilwork, 75*59599516SKenneth E. Jansen & ac) 76*59599516SKenneth E. Jansenc 77*59599516SKenneth E. Jansen iabres = 0 78*59599516SKenneth E. Jansenc 79*59599516SKenneth E. Jansen call i3LU (BDiag, rtmp, 'forward ') 80*59599516SKenneth E. Jansenc 81*59599516SKenneth E. Jansen rtmp = rtmp**2 82*59599516SKenneth E. Jansen call sumgat (rtmp, nflow, summed, ilwork) 83*59599516SKenneth E. Jansen epsA = (epsM**2) * sqrt(summed) 84*59599516SKenneth E. Jansenc 85*59599516SKenneth E. Jansenc.... compute the norm of the second derivative (truncation error) 86*59599516SKenneth E. Jansenc 87*59599516SKenneth E. Jansenc.... set interval 88*59599516SKenneth E. Jansenc 89*59599516SKenneth E. Jansen epsSD = sqrt(epsM) 90*59599516SKenneth E. Jansenc 91*59599516SKenneth E. Jansenc.... compute the first residual 92*59599516SKenneth E. Jansenc 93*59599516SKenneth E. Jansen rtmp = zero 94*59599516SKenneth E. Jansenc 95*59599516SKenneth E. Jansenc call yshuffle(ypre, 'new2old ') 96*59599516SKenneth E. Jansenc 97*59599516SKenneth E. Jansen ytmp = ypre + epsSD * uBrg 98*59599516SKenneth E. Jansenc 99*59599516SKenneth E. Jansen call i3LU (BDiag, ytmp, 'backward') 100*59599516SKenneth E. Jansenc 101*59599516SKenneth E. Jansen call yshuffle(ytmp, 'old2new ') 102*59599516SKenneth E. Jansenc 103*59599516SKenneth E. Jansen call itrRes (ytmp, y, 104*59599516SKenneth E. Jansen & x, shp, 105*59599516SKenneth E. Jansen & shgl, iBC, 106*59599516SKenneth E. Jansen & BC, shpb, 107*59599516SKenneth E. Jansen & shglb, rtmp, 108*59599516SKenneth E. Jansen & iper, ilwork) 109*59599516SKenneth E. Jansenc 110*59599516SKenneth E. Jansenc.... compute the second residual and add it to the first one 111*59599516SKenneth E. Jansenc 112*59599516SKenneth E. Jansen ytmp = ypre - epsSD * uBrg 113*59599516SKenneth E. Jansenc 114*59599516SKenneth E. Jansenc call yshuffle(ypre, 'old2new ') 115*59599516SKenneth E. Jansenc 116*59599516SKenneth E. Jansen call i3LU (BDiag, ytmp, 'backward') 117*59599516SKenneth E. Jansenc 118*59599516SKenneth E. Jansen call yshuffle(ytmp, 'old2new ') 119*59599516SKenneth E. Jansen call itrRes (ytmp, y, 120*59599516SKenneth E. Jansen & x, shp, 121*59599516SKenneth E. Jansen & shgl, iBC, 122*59599516SKenneth E. Jansen & BC, shpb, 123*59599516SKenneth E. Jansen & shglb, rtmp, 124*59599516SKenneth E. Jansen & iper, ilwork) 125*59599516SKenneth E. Jansenc 126*59599516SKenneth E. Jansen call i3LU (BDiag, rtmp, 'forward ') 127*59599516SKenneth E. Jansenc 128*59599516SKenneth E. Jansenc.... compute the second derivative and its norm 129*59599516SKenneth E. Jansenc 130*59599516SKenneth E. Jansen rtmp = (( rtmp - two * rmes ) / epsM)**2 131*59599516SKenneth E. Jansenc 132*59599516SKenneth E. Jansen call sumgat (rtmp, nflow, summed, ilwork) 133*59599516SKenneth E. Jansen SDnrm = sqrt(summed) 134*59599516SKenneth E. Jansenc 135*59599516SKenneth E. Jansenc.... compute the 'optimum' interval 136*59599516SKenneth E. Jansenc 137*59599516SKenneth E. Jansen eGMRES = two * sqrt( epsA / SDnrm ) 138*59599516SKenneth E. Jansenc 139*59599516SKenneth E. Jansenc.... flop count 140*59599516SKenneth E. Jansenc 141*59599516SKenneth E. Jansen flops = flops + 10*nflow*nshg+3*nshg 142*59599516SKenneth E. Jansenc 143*59599516SKenneth E. Jansenc.... end 144*59599516SKenneth E. Jansenc 145*59599516SKenneth E. Jansen return 146*59599516SKenneth E. Jansen end 147*59599516SKenneth E. Jansen 148*59599516SKenneth E. Jansen 149*59599516SKenneth E. Jansen subroutine itrFDISclr (y, ypre, x, 150*59599516SKenneth E. Jansen & rmes, uBrg, BDiag, 151*59599516SKenneth E. Jansen & iBC, BC, engBC, iper, 152*59599516SKenneth E. Jansen & ilwork) 153*59599516SKenneth E. Jansenc 154*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 155*59599516SKenneth E. Jansenc 156*59599516SKenneth E. Jansenc This subroutine computes the "optimum" finite difference 157*59599516SKenneth E. Jansenc interval eps for the forward difference scheme 158*59599516SKenneth E. Jansenc 159*59599516SKenneth E. Jansenc Rmod(y + eps u) - Rmod(y) 160*59599516SKenneth E. Jansenc --------------------------- 161*59599516SKenneth E. Jansenc eps 162*59599516SKenneth E. Jansenc 163*59599516SKenneth E. Jansenc where u is the step and Rmod is the modified residual. 164*59599516SKenneth E. Jansenc 165*59599516SKenneth E. Jansenc Note: A good theoretical reference is 'Practical Optimization' by 166*59599516SKenneth E. Jansenc P.E. Gill, W. Murray and M.H. Wright [1981]. 167*59599516SKenneth E. Jansenc 168*59599516SKenneth E. Jansenc input: 169*59599516SKenneth E. Jansenc y (nshg,ndof) : Y-variables 170*59599516SKenneth E. Jansenc ypre (nshg,ndof) : preconditioned Y-variables 171*59599516SKenneth E. Jansenc x (numnp,nsd) : node coordinates 172*59599516SKenneth E. Jansenc rmes (nshg,nflow) : modified residual 173*59599516SKenneth E. Jansenc uBrg (nshg,nflow) : step 174*59599516SKenneth E. Jansenc BDiag (nshg,nflow,nflow) : block-diagonal preconditioner 175*59599516SKenneth E. Jansenc iBC (nshg) : BC codes 176*59599516SKenneth E. Jansenc BC (nshg,ndofBC) : BC constraint parameters 177*59599516SKenneth E. Jansenc engBC (nshg) : energy for BC on density or pressure 178*59599516SKenneth E. Jansenc 179*59599516SKenneth E. Jansenc 180*59599516SKenneth E. Jansenc Zdenek Johan, Winter 1989. 181*59599516SKenneth E. Jansenc Zdenek Johan, Winter 1991. (Fortran 90) 182*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 183*59599516SKenneth E. Jansenc 184*59599516SKenneth E. Jansen include "common.h" 185*59599516SKenneth E. Jansenc 186*59599516SKenneth E. Jansen dimension y(nshg,ndof), ypre(nshg,ndof), 187*59599516SKenneth E. Jansen & x(numnp,nsd), 188*59599516SKenneth E. Jansen & rmes(nshg,nflow), 189*59599516SKenneth E. Jansen & uBrg(nshg,nflow), BDiag(nshg,nflow,nflow), 190*59599516SKenneth E. Jansen & iBC(nshg), BC(nshg,ndofBC), 191*59599516SKenneth E. Jansen & engBC(nshg), ilwork(nlwork), 192*59599516SKenneth E. Jansen & iper(nshg) 193*59599516SKenneth E. Jansenc 194*59599516SKenneth E. Jansen dimension ytmp(nshg,ndof), rtmp(nshg,nflow) 195*59599516SKenneth E. Jansenc 196*59599516SKenneth E. Jansenc.... compute the accuracy (cancellation error) -> epsA 197*59599516SKenneth E. Jansenc 198*59599516SKenneth E. Jansen rtmp = zero 199*59599516SKenneth E. Jansenc 200*59599516SKenneth E. Jansen ytmp = ypre 201*59599516SKenneth E. Jansenc 202*59599516SKenneth E. Jansenc call tnanq(ytmp,ndof,"ytmp ") 203*59599516SKenneth E. Jansen iabres = 1 204*59599516SKenneth E. Jansenc 205*59599516SKenneth E. Jansen call itrRes (ytmp, y, 206*59599516SKenneth E. Jansen & x, a(mshp), 207*59599516SKenneth E. Jansen & a(mshgl), a(mwght), iBC, 208*59599516SKenneth E. Jansen & BC, engBC, a(mshpb), 209*59599516SKenneth E. Jansen & a(mshglb), a(mwghtb), rtmp, 210*59599516SKenneth E. Jansen & iper, ilwork) 211*59599516SKenneth E. Jansenc 212*59599516SKenneth E. Jansen iabres = 0 213*59599516SKenneth E. Jansenc 214*59599516SKenneth E. Jansen rtmp = rtmp**2 215*59599516SKenneth E. Jansen call sumgat (rtmp, nflow, summed, ilwork) 216*59599516SKenneth E. Jansen epsA = (epsM**2) * sqrt(summed) 217*59599516SKenneth E. Jansenc 218*59599516SKenneth E. Jansenc.... compute the norm of the second derivative (truncation error) 219*59599516SKenneth E. Jansenc 220*59599516SKenneth E. Jansenc.... set interval 221*59599516SKenneth E. Jansenc 222*59599516SKenneth E. Jansen epsSD = sqrt(epsM) 223*59599516SKenneth E. Jansenc 224*59599516SKenneth E. Jansenc.... compute the first residual 225*59599516SKenneth E. Jansenc 226*59599516SKenneth E. Jansen rtmp = zero 227*59599516SKenneth E. Jansenc 228*59599516SKenneth E. Jansen ytmp = ypre + epsSD * uBrg 229*59599516SKenneth E. Jansenc 230*59599516SKenneth E. Jansen call itrRes (ytmp, y, 231*59599516SKenneth E. Jansen & x, a(mshp), 232*59599516SKenneth E. Jansen & a(mshgl), a(mwght), iBC, 233*59599516SKenneth E. Jansen & BC, engBC, a(mshpb), 234*59599516SKenneth E. Jansen & a(mshglb), a(mwghtb), rtmp, 235*59599516SKenneth E. Jansen & iper, ilwork) 236*59599516SKenneth E. Jansenc 237*59599516SKenneth E. Jansenc.... compute the second residual and add it to the first one 238*59599516SKenneth E. Jansenc 239*59599516SKenneth E. Jansen ytmp = ypre - epsSD * uBrg 240*59599516SKenneth E. Jansenc 241*59599516SKenneth E. Jansen call itrRes (ytmp, y, 242*59599516SKenneth E. Jansen & x, a(mshp), 243*59599516SKenneth E. Jansen & a(mshgl), a(mwght), iBC, 244*59599516SKenneth E. Jansen & BC, engBC, a(mshpb), 245*59599516SKenneth E. Jansen & a(mshglb), a(mwghtb), rtmp, 246*59599516SKenneth E. Jansen & iper, ilwork) 247*59599516SKenneth E. Jansenc 248*59599516SKenneth E. Jansenc.... compute the second derivative and its norm 249*59599516SKenneth E. Jansenc 250*59599516SKenneth E. Jansen rtmp = (( rtmp - two * rmes ) / epsM)**2 251*59599516SKenneth E. Jansenc 252*59599516SKenneth E. Jansen call sumgat (rtmp, nflow, summed, ilwork) 253*59599516SKenneth E. Jansen SDnrm = sqrt(summed) 254*59599516SKenneth E. Jansenc 255*59599516SKenneth E. Jansenc.... compute the 'optimum' interval 256*59599516SKenneth E. Jansenc 257*59599516SKenneth E. Jansen eGMRES = two * sqrt( epsA / SDnrm ) 258*59599516SKenneth E. Jansenc 259*59599516SKenneth E. Jansenc.... flop count 260*59599516SKenneth E. Jansenc 261*59599516SKenneth E. Jansen flops = flops + 10*nflow*nshg+3*nshg 262*59599516SKenneth E. Jansenc 263*59599516SKenneth E. Jansenc.... end 264*59599516SKenneth E. Jansenc 265*59599516SKenneth E. Jansen return 266*59599516SKenneth E. Jansen end 267