xref: /phasta/phSolver/compressible/itrfdi.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
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