159599516SKenneth E. Jansen subroutine itrFDI (ypre, y, ac, x, 259599516SKenneth E. Jansen & rmes, uBrg, BDiag, 359599516SKenneth E. Jansen & iBC, BC, iper, 459599516SKenneth E. Jansen & ilwork, shp, shgl, 559599516SKenneth E. Jansen & shpb, shglb) 659599516SKenneth E. Jansenc 759599516SKenneth E. Jansenc---------------------------------------------------------------------- 859599516SKenneth E. Jansenc 959599516SKenneth E. Jansenc This subroutine computes the "optimum" finite difference 1059599516SKenneth E. Jansenc interval eps for the forward difference scheme 1159599516SKenneth E. Jansenc 1259599516SKenneth E. Jansenc Rmod(y + eps u) - Rmod(y) 1359599516SKenneth E. Jansenc --------------------------- 1459599516SKenneth E. Jansenc eps 1559599516SKenneth E. Jansenc 1659599516SKenneth E. Jansenc where u is the step and Rmod is the modified residual. 1759599516SKenneth E. Jansenc 1859599516SKenneth E. Jansenc Note: A good theoretical reference is 'Practical Optimization' by 1959599516SKenneth E. Jansenc P.E. Gill, W. Murray and M.H. Wright [1981]. 2059599516SKenneth E. Jansenc 2159599516SKenneth E. Jansenc input: 2259599516SKenneth E. Jansenc y (nshg,ndof) : Y-variables 2359599516SKenneth E. Jansenc ypre (nshg,ndof) : preconditioned Y-variables 2459599516SKenneth E. Jansenc x (numnp,nsd) : node coordinates 2559599516SKenneth E. Jansenc rmes (nshg,nflow) : modified residual 2659599516SKenneth E. Jansenc uBrg (nshg,nflow) : step 2759599516SKenneth E. Jansenc BDiag (nshg,nflow,nflow) : block-diagonal preconditioner 2859599516SKenneth E. Jansenc iBC (nshg) : BC codes 2959599516SKenneth E. Jansenc BC (nshg,ndofBC) : BC constraint parameters 3059599516SKenneth E. Jansenc 3159599516SKenneth E. Jansenc 3259599516SKenneth E. Jansenc 3359599516SKenneth E. Jansenc Zdenek Johan, Winter 1989. 3459599516SKenneth E. Jansenc Zdenek Johan, Winter 1991. (Fortran 90) 3559599516SKenneth E. Jansenc---------------------------------------------------------------------- 3659599516SKenneth E. Jansenc 3759599516SKenneth E. Jansen include "common.h" 3859599516SKenneth E. Jansenc 3959599516SKenneth E. Jansen dimension y(nshg,ndof), ypre(nshg,nflow), 4059599516SKenneth E. Jansen & x(numnp,nsd), ac(nshg,ndof), 4159599516SKenneth E. Jansen & rmes(nshg,nflow), 4259599516SKenneth E. Jansen & uBrg(nshg,nflow), BDiag(nshg,nflow,nflow), 4359599516SKenneth E. Jansen & iBC(nshg), BC(nshg,ndofBC), 4459599516SKenneth E. Jansen & ilwork(nlwork), 4559599516SKenneth E. Jansen & iper(nshg) 4659599516SKenneth E. Jansenc 4759599516SKenneth E. Jansen dimension ytmp(nshg,nflow), rtmp(nshg,nflow) 4859599516SKenneth E. Jansen dimension tmpy(nshg,ndof) 4959599516SKenneth E. Jansenc 5059599516SKenneth E. Jansen dimension shp(MAXTOP,maxsh,MAXQPT), 5159599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), 5259599516SKenneth E. Jansen & shpb(MAXTOP,maxsh,MAXQPT), 5359599516SKenneth E. Jansen & shglb(MAXTOP,nsd,maxsh,MAXQPT) 5459599516SKenneth E. Jansenc 5559599516SKenneth E. Jansenc.... compute the accuracy (cancellation error) -> epsA 5659599516SKenneth E. Jansenc 5759599516SKenneth E. Jansen rtmp = zero 5859599516SKenneth E. Jansenc 5959599516SKenneth E. Jansen ytmp = ypre 6059599516SKenneth E. Jansenc 6159599516SKenneth E. Jansenc call yshuffle(ytmp, 'new2old ') 6259599516SKenneth E. Jansenc 6359599516SKenneth E. Jansen call i3LU (BDiag, ytmp, 'backward') 6459599516SKenneth E. Jansenc 6559599516SKenneth E. Jansen call yshuffle(ytmp, 'old2new ') 6659599516SKenneth E. Jansenc 6759599516SKenneth E. Jansen iabres = 1 6859599516SKenneth E. Jansenc 6959599516SKenneth E. Jansen call itrRes (ytmp, y, 7059599516SKenneth E. Jansen & x, shp, 7159599516SKenneth E. Jansen & shgl, iBC, 7259599516SKenneth E. Jansen & BC, shpb, 7359599516SKenneth E. Jansen & shglb, rtmp, 7459599516SKenneth E. Jansen & iper, ilwork, 7559599516SKenneth E. Jansen & ac) 7659599516SKenneth E. Jansenc 7759599516SKenneth E. Jansen iabres = 0 7859599516SKenneth E. Jansenc 7959599516SKenneth E. Jansen call i3LU (BDiag, rtmp, 'forward ') 8059599516SKenneth E. Jansenc 8159599516SKenneth E. Jansen rtmp = rtmp**2 8259599516SKenneth E. Jansen call sumgat (rtmp, nflow, summed, ilwork) 8359599516SKenneth E. Jansen epsA = (epsM**2) * sqrt(summed) 8459599516SKenneth E. Jansenc 8559599516SKenneth E. Jansenc.... compute the norm of the second derivative (truncation error) 8659599516SKenneth E. Jansenc 8759599516SKenneth E. Jansenc.... set interval 8859599516SKenneth E. Jansenc 8959599516SKenneth E. Jansen epsSD = sqrt(epsM) 9059599516SKenneth E. Jansenc 9159599516SKenneth E. Jansenc.... compute the first residual 9259599516SKenneth E. Jansenc 9359599516SKenneth E. Jansen rtmp = zero 9459599516SKenneth E. Jansenc 9559599516SKenneth E. Jansenc call yshuffle(ypre, 'new2old ') 9659599516SKenneth E. Jansenc 9759599516SKenneth E. Jansen ytmp = ypre + epsSD * uBrg 9859599516SKenneth E. Jansenc 9959599516SKenneth E. Jansen call i3LU (BDiag, ytmp, 'backward') 10059599516SKenneth E. Jansenc 10159599516SKenneth E. Jansen call yshuffle(ytmp, 'old2new ') 10259599516SKenneth E. Jansenc 10359599516SKenneth E. Jansen call itrRes (ytmp, y, 10459599516SKenneth E. Jansen & x, shp, 10559599516SKenneth E. Jansen & shgl, iBC, 10659599516SKenneth E. Jansen & BC, shpb, 10759599516SKenneth E. Jansen & shglb, rtmp, 108*513954efSKenneth E. Jansen & iper, ilwork, ac) 109*513954efSKenneth E. Jansen!Added ac to the end if itrRes, but not tested - Nicholas 11059599516SKenneth E. Jansenc 11159599516SKenneth E. Jansenc.... compute the second residual and add it to the first one 11259599516SKenneth E. Jansenc 11359599516SKenneth E. Jansen ytmp = ypre - epsSD * uBrg 11459599516SKenneth E. Jansenc 11559599516SKenneth E. Jansenc call yshuffle(ypre, 'old2new ') 11659599516SKenneth E. Jansenc 11759599516SKenneth E. Jansen call i3LU (BDiag, ytmp, 'backward') 11859599516SKenneth E. Jansenc 11959599516SKenneth E. Jansen call yshuffle(ytmp, 'old2new ') 12059599516SKenneth E. Jansen call itrRes (ytmp, y, 12159599516SKenneth E. Jansen & x, shp, 12259599516SKenneth E. Jansen & shgl, iBC, 12359599516SKenneth E. Jansen & BC, shpb, 12459599516SKenneth E. Jansen & shglb, rtmp, 125*513954efSKenneth E. Jansen & iper, ilwork, ac) 126*513954efSKenneth E. Jansen!Added ac to the end if itrRes, but not tested - Nicholas 12759599516SKenneth E. Jansenc 12859599516SKenneth E. Jansen call i3LU (BDiag, rtmp, 'forward ') 12959599516SKenneth E. Jansenc 13059599516SKenneth E. Jansenc.... compute the second derivative and its norm 13159599516SKenneth E. Jansenc 13259599516SKenneth E. Jansen rtmp = (( rtmp - two * rmes ) / epsM)**2 13359599516SKenneth E. Jansenc 13459599516SKenneth E. Jansen call sumgat (rtmp, nflow, summed, ilwork) 13559599516SKenneth E. Jansen SDnrm = sqrt(summed) 13659599516SKenneth E. Jansenc 13759599516SKenneth E. Jansenc.... compute the 'optimum' interval 13859599516SKenneth E. Jansenc 13959599516SKenneth E. Jansen eGMRES = two * sqrt( epsA / SDnrm ) 14059599516SKenneth E. Jansenc 14159599516SKenneth E. Jansenc.... flop count 14259599516SKenneth E. Jansenc 14359599516SKenneth E. Jansen flops = flops + 10*nflow*nshg+3*nshg 14459599516SKenneth E. Jansenc 14559599516SKenneth E. Jansenc.... end 14659599516SKenneth E. Jansenc 14759599516SKenneth E. Jansen return 14859599516SKenneth E. Jansen end 14959599516SKenneth E. Jansen 15059599516SKenneth E. Jansen 15159599516SKenneth E. Jansen subroutine itrFDISclr (y, ypre, x, 15259599516SKenneth E. Jansen & rmes, uBrg, BDiag, 15359599516SKenneth E. Jansen & iBC, BC, engBC, iper, 15459599516SKenneth E. Jansen & ilwork) 15559599516SKenneth E. Jansenc 15659599516SKenneth E. Jansenc---------------------------------------------------------------------- 15759599516SKenneth E. Jansenc 15859599516SKenneth E. Jansenc This subroutine computes the "optimum" finite difference 15959599516SKenneth E. Jansenc interval eps for the forward difference scheme 16059599516SKenneth E. Jansenc 16159599516SKenneth E. Jansenc Rmod(y + eps u) - Rmod(y) 16259599516SKenneth E. Jansenc --------------------------- 16359599516SKenneth E. Jansenc eps 16459599516SKenneth E. Jansenc 16559599516SKenneth E. Jansenc where u is the step and Rmod is the modified residual. 16659599516SKenneth E. Jansenc 16759599516SKenneth E. Jansenc Note: A good theoretical reference is 'Practical Optimization' by 16859599516SKenneth E. Jansenc P.E. Gill, W. Murray and M.H. Wright [1981]. 16959599516SKenneth E. Jansenc 17059599516SKenneth E. Jansenc input: 17159599516SKenneth E. Jansenc y (nshg,ndof) : Y-variables 17259599516SKenneth E. Jansenc ypre (nshg,ndof) : preconditioned Y-variables 17359599516SKenneth E. Jansenc x (numnp,nsd) : node coordinates 17459599516SKenneth E. Jansenc rmes (nshg,nflow) : modified residual 17559599516SKenneth E. Jansenc uBrg (nshg,nflow) : step 17659599516SKenneth E. Jansenc BDiag (nshg,nflow,nflow) : block-diagonal preconditioner 17759599516SKenneth E. Jansenc iBC (nshg) : BC codes 17859599516SKenneth E. Jansenc BC (nshg,ndofBC) : BC constraint parameters 17959599516SKenneth E. Jansenc engBC (nshg) : energy for BC on density or pressure 18059599516SKenneth E. Jansenc 18159599516SKenneth E. Jansenc 18259599516SKenneth E. Jansenc Zdenek Johan, Winter 1989. 18359599516SKenneth E. Jansenc Zdenek Johan, Winter 1991. (Fortran 90) 18459599516SKenneth E. Jansenc---------------------------------------------------------------------- 18559599516SKenneth E. Jansenc 18659599516SKenneth E. Jansen include "common.h" 18759599516SKenneth E. Jansenc 18859599516SKenneth E. Jansen dimension y(nshg,ndof), ypre(nshg,ndof), 18959599516SKenneth E. Jansen & x(numnp,nsd), 19059599516SKenneth E. Jansen & rmes(nshg,nflow), 19159599516SKenneth E. Jansen & uBrg(nshg,nflow), BDiag(nshg,nflow,nflow), 19259599516SKenneth E. Jansen & iBC(nshg), BC(nshg,ndofBC), 19359599516SKenneth E. Jansen & engBC(nshg), ilwork(nlwork), 19459599516SKenneth E. Jansen & iper(nshg) 19559599516SKenneth E. Jansenc 19659599516SKenneth E. Jansen dimension ytmp(nshg,ndof), rtmp(nshg,nflow) 19759599516SKenneth E. Jansenc 19859599516SKenneth E. Jansenc.... compute the accuracy (cancellation error) -> epsA 19959599516SKenneth E. Jansenc 20059599516SKenneth E. Jansen rtmp = zero 20159599516SKenneth E. Jansenc 20259599516SKenneth E. Jansen ytmp = ypre 20359599516SKenneth E. Jansenc 20459599516SKenneth E. Jansenc call tnanq(ytmp,ndof,"ytmp ") 20559599516SKenneth E. Jansen iabres = 1 20659599516SKenneth E. Jansenc 20759599516SKenneth E. Jansen call itrRes (ytmp, y, 20859599516SKenneth E. Jansen & x, a(mshp), 20959599516SKenneth E. Jansen & a(mshgl), a(mwght), iBC, 21059599516SKenneth E. Jansen & BC, engBC, a(mshpb), 21159599516SKenneth E. Jansen & a(mshglb), a(mwghtb), rtmp, 212*513954efSKenneth E. Jansen & iper, ilwork, ac) 213*513954efSKenneth E. Jansen!Added ac to the end if itrRes, but not tested - Nicholas 21459599516SKenneth E. Jansenc 21559599516SKenneth E. Jansen iabres = 0 21659599516SKenneth E. Jansenc 21759599516SKenneth E. Jansen rtmp = rtmp**2 21859599516SKenneth E. Jansen call sumgat (rtmp, nflow, summed, ilwork) 21959599516SKenneth E. Jansen epsA = (epsM**2) * sqrt(summed) 22059599516SKenneth E. Jansenc 22159599516SKenneth E. Jansenc.... compute the norm of the second derivative (truncation error) 22259599516SKenneth E. Jansenc 22359599516SKenneth E. Jansenc.... set interval 22459599516SKenneth E. Jansenc 22559599516SKenneth E. Jansen epsSD = sqrt(epsM) 22659599516SKenneth E. Jansenc 22759599516SKenneth E. Jansenc.... compute the first residual 22859599516SKenneth E. Jansenc 22959599516SKenneth E. Jansen rtmp = zero 23059599516SKenneth E. Jansenc 23159599516SKenneth E. Jansen ytmp = ypre + epsSD * uBrg 23259599516SKenneth E. Jansenc 23359599516SKenneth E. Jansen call itrRes (ytmp, y, 23459599516SKenneth E. Jansen & x, a(mshp), 23559599516SKenneth E. Jansen & a(mshgl), a(mwght), iBC, 23659599516SKenneth E. Jansen & BC, engBC, a(mshpb), 23759599516SKenneth E. Jansen & a(mshglb), a(mwghtb), rtmp, 238*513954efSKenneth E. Jansen & iper, ilwork, ac) 239*513954efSKenneth E. Jansen!Added ac to the end if itrRes, but not tested - Nicholas 24059599516SKenneth E. Jansenc 24159599516SKenneth E. Jansenc.... compute the second residual and add it to the first one 24259599516SKenneth E. Jansenc 24359599516SKenneth E. Jansen ytmp = ypre - epsSD * uBrg 24459599516SKenneth E. Jansenc 24559599516SKenneth E. Jansen call itrRes (ytmp, y, 24659599516SKenneth E. Jansen & x, a(mshp), 24759599516SKenneth E. Jansen & a(mshgl), a(mwght), iBC, 24859599516SKenneth E. Jansen & BC, engBC, a(mshpb), 24959599516SKenneth E. Jansen & a(mshglb), a(mwghtb), rtmp, 250*513954efSKenneth E. Jansen & iper, ilwork, ac) 251*513954efSKenneth E. Jansen!Added ac to the end if itrRes, but not tested - Nicholas 25259599516SKenneth E. Jansenc 25359599516SKenneth E. Jansenc.... compute the second derivative and its norm 25459599516SKenneth E. Jansenc 25559599516SKenneth E. Jansen rtmp = (( rtmp - two * rmes ) / epsM)**2 25659599516SKenneth E. Jansenc 25759599516SKenneth E. Jansen call sumgat (rtmp, nflow, summed, ilwork) 25859599516SKenneth E. Jansen SDnrm = sqrt(summed) 25959599516SKenneth E. Jansenc 26059599516SKenneth E. Jansenc.... compute the 'optimum' interval 26159599516SKenneth E. Jansenc 26259599516SKenneth E. Jansen eGMRES = two * sqrt( epsA / SDnrm ) 26359599516SKenneth E. Jansenc 26459599516SKenneth E. Jansenc.... flop count 26559599516SKenneth E. Jansenc 26659599516SKenneth E. Jansen flops = flops + 10*nflow*nshg+3*nshg 26759599516SKenneth E. Jansenc 26859599516SKenneth E. Jansenc.... end 26959599516SKenneth E. Jansenc 27059599516SKenneth E. Jansen return 27159599516SKenneth E. Jansen end 272