xref: /phasta/phSolver/compressible/au2mfg.f (revision 513954ef803c300cddba2bb96b4a5dac0b93489a)
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)
7*513954efSKenneth E. Jansen!
8*513954efSKenneth E. Jansen!----------------------------------------------------------------------
9*513954efSKenneth E. Jansen!
10*513954efSKenneth E. Jansen! This routine performs a matrix-vector product for the Matrix-Free
11*513954efSKenneth E. Jansen!  Implicit/Iterative solver using a two-sided scheme and subtracts
12*513954efSKenneth E. Jansen!  it from the residual.
13*513954efSKenneth E. Jansen!
14*513954efSKenneth E. Jansen! input:
15*513954efSKenneth E. Jansen!  y      (nshg,ndof)           : Y-variables
16*513954efSKenneth E. Jansen!  ypre   (nshg,ndof)           : preconditioned Y-variables
17*513954efSKenneth E. Jansen!  x      (numnp,nsd)            : node coordinates
18*513954efSKenneth E. Jansen!  rmes   (nshg,nflow)           : modified residual
19*513954efSKenneth E. Jansen!  res    (nshg,nflow)           : residual
20*513954efSKenneth E. Jansen!  Dy     (nshg,nflow)           : solution step
21*513954efSKenneth E. Jansen!  BDiag  (nshg,nflow,nflow)         : block-diagonal preconditioner
22*513954efSKenneth E. Jansen!  iBC    (nshg)                : BC codes
23*513954efSKenneth E. Jansen!  BC     (nshg,ndofBC)         : BC constraint parameters
24*513954efSKenneth E. Jansen!
25*513954efSKenneth E. Jansen! output:
26*513954efSKenneth E. Jansen!  uBrg   (nshg,nflow)           : Krylov vector ( R - A x )
27*513954efSKenneth E. Jansen!
28*513954efSKenneth E. Jansen!
29*513954efSKenneth E. Jansen! Zdenek Johan, Winter 1991.  (Fortran 90)
30*513954efSKenneth E. Jansen!----------------------------------------------------------------------
31*513954efSKenneth E. Jansen!
3259599516SKenneth E. Jansen        include "common.h"
33*513954efSKenneth 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)
41*513954efSKenneth E. Jansen!
4259599516SKenneth E. Jansen        dimension uBtmp1(nshg,nflow),          uBtmp2(nshg,nflow),
4359599516SKenneth E. Jansen     &            tmpBC(nshg),                ilwork(nlwork)
44*513954efSKenneth 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
50*513954efSKenneth E. Jansen!$$$        dimension shp(nshl,ngauss),    shgl(nsd,nshl,ngauss),
51*513954efSKenneth E. Jansen!$$$     &            shpb(nshl,ngaussb), shglb(nsd,nshl,ngaussb)
52*513954efSKenneth E. Jansen!
53*513954efSKenneth E. Jansen!.... compute the finite difference interval
54*513954efSKenneth 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)
58*513954efSKenneth E. Jansen!
59*513954efSKenneth E. Jansen!.... calculate R(y + eps x)
60*513954efSKenneth E. Jansen!
6159599516SKenneth E. Jansen        uBtmp1 = zero
62*513954efSKenneth E. Jansen!
63*513954efSKenneth E. Jansen!        call yshuffle(ypre, 'new2old ')
64*513954efSKenneth E. Jansen!
6559599516SKenneth E. Jansen        uBrg = ypre + eps * Dy
66*513954efSKenneth E. Jansen!
6759599516SKenneth E. Jansen        call i3LU (BDiag,  uBrg,  'backward')
68*513954efSKenneth E. Jansen!
6959599516SKenneth E. Jansen        call yshuffle(uBrg, 'old2new ')
70*513954efSKenneth E. Jansen!
7159599516SKenneth E. Jansen        call itrBC (uBrg, uBrg, iBC,  BC,   iper, ilwork)
72*513954efSKenneth 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,
78*513954efSKenneth E. Jansen     &               iper,            ilwork, ac)
79*513954efSKenneth E. Jansen!Added ac to the end if itrRes, but not tested - Nicholas
80*513954efSKenneth E. Jansen!
8159599516SKenneth E. Jansen        call i3LU (BDiag,  uBtmp1,  'forward ')
82*513954efSKenneth E. Jansen!
83*513954efSKenneth E. Jansen!.... calculate R(y - eps x)
84*513954efSKenneth E. Jansen!
8559599516SKenneth E. Jansen        uBtmp2 = zero
86*513954efSKenneth E. Jansen!
87*513954efSKenneth E. Jansen!        call yshuffle(ypre, 'new2old ')
88*513954efSKenneth E. Jansen!
8959599516SKenneth E. Jansen        uBrg = ypre - eps * Dy
90*513954efSKenneth E. Jansen!
9159599516SKenneth E. Jansen        call i3LU (BDiag,  uBrg,  'backward')
92*513954efSKenneth E. Jansen!
9359599516SKenneth E. Jansen        call yshuffle(uBrg, 'old2new ')
9459599516SKenneth E. Jansen
9559599516SKenneth E. Jansen        call itrBC (uBrg, uBrg, iBC,  BC,   iper, ilwork)
96*513954efSKenneth 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)
103*513954efSKenneth E. Jansen!
10459599516SKenneth E. Jansen        call i3LU (BDiag,  uBtmp2,  'forward ')
105*513954efSKenneth E. Jansen!
106*513954efSKenneth E. Jansen!.... compute  R(y) - ( R(y + eps x) - R(y - eps x) ) / 2 eps
107*513954efSKenneth E. Jansen!
10859599516SKenneth E. Jansen        uBrg = res - ( uBtmp1 - uBtmp2 ) / (two * eps)
109*513954efSKenneth E. Jansen!
110*513954efSKenneth E. Jansen!.... flop count
111*513954efSKenneth E. Jansen!
11259599516SKenneth E. Jansen        flops = flops + 8*nflow*nshg+nshg
113*513954efSKenneth E. Jansen!
114*513954efSKenneth E. Jansen!.... end
115*513954efSKenneth E. Jansen!
11659599516SKenneth E. Jansen        return
11759599516SKenneth E. Jansen        end
118