xref: /phasta/phSolver/compressible/elmmfg.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen        subroutine ElmMFG (y,         ac,        x,
2*59599516SKenneth E. Jansen     &                     shp,       shgl,      iBC,
3*59599516SKenneth E. Jansen     &                     BC,        shpb,      shglb,
4*59599516SKenneth E. Jansen     &                     res,       rmes,      BDiag,
5*59599516SKenneth E. Jansen     &                     iper,      ilwork,    rerr)
6*59599516SKenneth E. Jansenc
7*59599516SKenneth E. Jansenc----------------------------------------------------------------------
8*59599516SKenneth E. Jansenc
9*59599516SKenneth E. Jansenc This routine calculates the preconditioning matrix and the
10*59599516SKenneth E. Jansenc R.H.S. residual vector for the Matrix-free Iterative solver.
11*59599516SKenneth E. Jansenc
12*59599516SKenneth E. Jansenc
13*59599516SKenneth E. Jansenc Zdenek Johan, Winter 1991.  (Fortran 90)
14*59599516SKenneth E. Jansenc----------------------------------------------------------------------
15*59599516SKenneth E. Jansenc
16*59599516SKenneth E. Jansen        use pointer_data
17*59599516SKenneth E. Jansenc
18*59599516SKenneth E. Jansen        include "common.h"
19*59599516SKenneth E. Jansen        include "mpif.h"
20*59599516SKenneth E. Jansenc
21*59599516SKenneth E. Jansen        dimension y(nshg,ndof),         ac(nshg,ndof),
22*59599516SKenneth E. Jansen     &            x(numnp,nsd),
23*59599516SKenneth E. Jansen     &            iBC(nshg),
24*59599516SKenneth E. Jansen     &            BC(nshg,ndofBC),
25*59599516SKenneth E. Jansen     &            res(nshg,nflow),
26*59599516SKenneth E. Jansen     &            rmes(nshg,nflow),      BDiag(nshg,nflow,nflow),
27*59599516SKenneth E. Jansen     &            iper(nshg)
28*59599516SKenneth E. Jansenc
29*59599516SKenneth E. Jansen        dimension shp(MAXTOP,maxsh,MAXQPT),
30*59599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
31*59599516SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
32*59599516SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
33*59599516SKenneth E. Jansenc
34*59599516SKenneth E. Jansen        dimension qres(nshg,idflx),     rmass(nshg),
35*59599516SKenneth E. Jansen     &            tmp(nshg)
36*59599516SKenneth E. Jansenc
37*59599516SKenneth E. Jansen        dimension ilwork(nlwork)
38*59599516SKenneth E. Jansen
39*59599516SKenneth E. Jansen        real*8  rerr(nshg,10)
40*59599516SKenneth E. Jansen	real*8, allocatable :: tmpshp(:,:), tmpshgl(:,:,:)
41*59599516SKenneth E. Jansen	real*8, allocatable :: tmpshpb(:,:), tmpshglb(:,:,:)
42*59599516SKenneth E. Jansen
43*59599516SKenneth E. Jansen	ttim(80) = ttim(80) - secs(0.0)
44*59599516SKenneth E. Jansenc
45*59599516SKenneth E. Jansenc.... set up the timer
46*59599516SKenneth E. Jansenc
47*59599516SKenneth E. Jansen
48*59599516SKenneth E. Jansen        call timer ('Elm_Form')
49*59599516SKenneth E. Jansenc
50*59599516SKenneth E. Jansenc.... -------------------->   interior elements   <--------------------
51*59599516SKenneth E. Jansenc
52*59599516SKenneth E. Jansenc.... set up parameters
53*59599516SKenneth E. Jansenc
54*59599516SKenneth E. Jansen        ires   = 3
55*59599516SKenneth E. Jansen
56*59599516SKenneth E. Jansen        if (idiff==1 .or. idiff==3 .or. isurf==1) then ! global reconstruction
57*59599516SKenneth E. Jansen                                                       ! of qdiff
58*59599516SKenneth E. Jansenc
59*59599516SKenneth E. Jansenc     loop over element blocks for the global reconstruction
60*59599516SKenneth E. Jansenc     of the diffusive flux vector, q, and lumped mass matrix, rmass
61*59599516SKenneth E. Jansenc
62*59599516SKenneth E. Jansen           qres = zero
63*59599516SKenneth E. Jansen           rmass = zero
64*59599516SKenneth E. Jansen
65*59599516SKenneth E. Jansen           do iblk = 1, nelblk
66*59599516SKenneth E. Jansenc
67*59599516SKenneth E. Jansenc.... set up the parameters
68*59599516SKenneth E. Jansenc
69*59599516SKenneth E. Jansenc
70*59599516SKenneth E. Jansen          nenl   = lcblk(5,iblk)   ! no. of vertices per element
71*59599516SKenneth E. Jansen          iel    = lcblk(1,iblk)
72*59599516SKenneth E. Jansen          lelCat = lcblk(2,iblk)
73*59599516SKenneth E. Jansen          lcsyst = lcblk(3,iblk)
74*59599516SKenneth E. Jansen          iorder = lcblk(4,iblk)
75*59599516SKenneth E. Jansen          nenl   = lcblk(5,iblk)   ! no. of vertices per element
76*59599516SKenneth E. Jansen          nshl   = lcblk(10,iblk)
77*59599516SKenneth E. Jansen          mattyp = lcblk(7,iblk)
78*59599516SKenneth E. Jansen          ndofl  = lcblk(8,iblk)
79*59599516SKenneth E. Jansen          nsymdl = lcblk(9,iblk)
80*59599516SKenneth E. Jansen          npro   = lcblk(1,iblk+1) - iel
81*59599516SKenneth E. Jansen          ngauss = nint(lcsyst)
82*59599516SKenneth E. Jansenc
83*59599516SKenneth E. Jansenc.... compute and assemble diffusive flux vector residual, qres,
84*59599516SKenneth E. Jansenc     and lumped mass matrix, rmass
85*59599516SKenneth E. Jansen
86*59599516SKenneth E. Jansen	      allocate (tmpshp(nshl,MAXQPT))
87*59599516SKenneth E. Jansen              allocate (tmpshgl(nsd,nshl,MAXQPT))
88*59599516SKenneth E. Jansen
89*59599516SKenneth E. Jansen	      tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:)
90*59599516SKenneth E. Jansen	      tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:)
91*59599516SKenneth E. Jansen
92*59599516SKenneth E. Jansen
93*59599516SKenneth E. Jansen              call AsIq (y,                x,
94*59599516SKenneth E. Jansen     &             tmpshp,
95*59599516SKenneth E. Jansen     &             tmpshgl,
96*59599516SKenneth E. Jansen     &             mien(iblk)%p,      mxmudmi(iblk)%p,
97*59599516SKenneth E. Jansen     &             qres,
98*59599516SKenneth E. Jansen     &             rmass)
99*59599516SKenneth E. Jansen
100*59599516SKenneth E. Jansen	      deallocate (tmpshp)
101*59599516SKenneth E. Jansen	      deallocate (tmpshgl)
102*59599516SKenneth E. Jansen
103*59599516SKenneth E. Jansen           enddo
104*59599516SKenneth E. Jansenc
105*59599516SKenneth E. Jansenc.... take care of periodic boundary conditions
106*59599516SKenneth E. Jansenc
107*59599516SKenneth E. Jansen
108*59599516SKenneth E. Jansen       call qpbc( rmass, qres, iBC,  iper, ilwork )
109*59599516SKenneth E. Jansen
110*59599516SKenneth E. Jansenc
111*59599516SKenneth E. Jansen        endif                   ! computation of global diffusive flux
112*59599516SKenneth E. Jansenc
113*59599516SKenneth E. Jansenc.... loop over element blocks to compute element residuals
114*59599516SKenneth E. Jansenc
115*59599516SKenneth E. Jansenc
116*59599516SKenneth E. Jansenc.... initialize the arrays
117*59599516SKenneth E. Jansenc
118*59599516SKenneth E. Jansen        res  = zero
119*59599516SKenneth E. Jansen        rmes = zero
120*59599516SKenneth E. Jansenc
121*59599516SKenneth E. Jansen        if (iprec .ne. 0) BDiag = zero
122*59599516SKenneth E. Jansenc
123*59599516SKenneth E. Jansenc.... loop over the element-blocks
124*59599516SKenneth E. Jansenc
125*59599516SKenneth E. Jansen        do iblk = 1, nelblk
126*59599516SKenneth E. Jansenc
127*59599516SKenneth E. Jansenc.... set up the parameters
128*59599516SKenneth E. Jansenc
129*59599516SKenneth E. Jansen          nenl   = lcblk(5,iblk) ! no. of vertices per element
130*59599516SKenneth E. Jansen          iel    = lcblk(1,iblk)
131*59599516SKenneth E. Jansen          lelCat = lcblk(2,iblk)
132*59599516SKenneth E. Jansen          lcsyst = lcblk(3,iblk)
133*59599516SKenneth E. Jansen          iorder = lcblk(4,iblk)
134*59599516SKenneth E. Jansen          nenl   = lcblk(5,iblk)   ! no. of vertices per element
135*59599516SKenneth E. Jansen          nshl   = lcblk(10,iblk)
136*59599516SKenneth E. Jansen          mattyp = lcblk(7,iblk)
137*59599516SKenneth E. Jansen          ndofl  = lcblk(8,iblk)
138*59599516SKenneth E. Jansen          nsymdl = lcblk(9,iblk)
139*59599516SKenneth E. Jansen          npro   = lcblk(1,iblk+1) - iel
140*59599516SKenneth E. Jansen          inum   = iel + npro - 1
141*59599516SKenneth E. Jansen          ngauss = nint(lcsyst)
142*59599516SKenneth E. Jansenc
143*59599516SKenneth E. Jansenc.... compute and assemble the residuals and the preconditioner
144*59599516SKenneth E. Jansenc
145*59599516SKenneth E. Jansen	   allocate (tmpshp(nshl,MAXQPT))
146*59599516SKenneth E. Jansen	   allocate (tmpshgl(nsd,nshl,MAXQPT))
147*59599516SKenneth E. Jansen
148*59599516SKenneth E. Jansen	   tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:)
149*59599516SKenneth E. Jansen	   tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:)
150*59599516SKenneth E. Jansen
151*59599516SKenneth E. Jansen           call AsIMFG (y,                       ac,
152*59599516SKenneth E. Jansen     &                  x,                       mxmudmi(iblk)%p,
153*59599516SKenneth E. Jansen     &                  tmpshp,                  tmpshgl,
154*59599516SKenneth E. Jansen     &                  mien(iblk)%p,
155*59599516SKenneth E. Jansen     &                  mmat(iblk)%p,            res,
156*59599516SKenneth E. Jansen     &                  rmes,                    BDiag,
157*59599516SKenneth E. Jansen     &                  qres,                    rerr )
158*59599516SKenneth E. Jansen
159*59599516SKenneth E. Jansen	   deallocate (tmpshp)
160*59599516SKenneth E. Jansen	   deallocate (tmpshgl)
161*59599516SKenneth E. Jansen
162*59599516SKenneth E. Jansenc
163*59599516SKenneth E. Jansenc.... end of interior element loop
164*59599516SKenneth E. Jansenc
165*59599516SKenneth E. Jansen        enddo
166*59599516SKenneth E. Jansenc
167*59599516SKenneth E. Jansenc.... -------------------->   boundary elements   <--------------------
168*59599516SKenneth E. Jansenc
169*59599516SKenneth E. Jansenc.... loop over the elements
170*59599516SKenneth E. Jansenc
171*59599516SKenneth E. Jansen        do iblk = 1, nelblb
172*59599516SKenneth E. Jansenc
173*59599516SKenneth E. Jansenc.... set up the parameters
174*59599516SKenneth E. Jansenc
175*59599516SKenneth E. Jansenc
176*59599516SKenneth E. Jansen          iel    = lcblkb(1,iblk)
177*59599516SKenneth E. Jansen          lelCat = lcblkb(2,iblk)
178*59599516SKenneth E. Jansen          lcsyst = lcblkb(3,iblk)
179*59599516SKenneth E. Jansen          iorder = lcblkb(4,iblk)
180*59599516SKenneth E. Jansen          nenl   = lcblkb(5,iblk)  ! no. of vertices per element
181*59599516SKenneth E. Jansen          nenbl  = lcblkb(6,iblk)  ! no. of vertices per bdry. face
182*59599516SKenneth E. Jansen          mattyp = lcblkb(7,iblk)
183*59599516SKenneth E. Jansen          ndofl  = lcblkb(8,iblk)
184*59599516SKenneth E. Jansen          nshl   = lcblkb(9,iblk)
185*59599516SKenneth E. Jansen          nshlb  = lcblkb(10,iblk)
186*59599516SKenneth E. Jansen          npro   = lcblkb(1,iblk+1) - iel
187*59599516SKenneth E. Jansen          if(lcsyst.eq.3) lcsyst=nenbl
188*59599516SKenneth E. Jansen          ngaussb = nintb(lcsyst)
189*59599516SKenneth E. Jansenc
190*59599516SKenneth E. Jansenc.... compute and assemble the residuals corresponding to the
191*59599516SKenneth E. Jansenc     boundary integral
192*59599516SKenneth E. Jansenc
193*59599516SKenneth E. Jansen
194*59599516SKenneth E. Jansen	   allocate (tmpshpb(nshl,MAXQPT))
195*59599516SKenneth E. Jansen	   allocate (tmpshglb(nsd,nshl,MAXQPT))
196*59599516SKenneth E. Jansen
197*59599516SKenneth E. Jansen	   tmpshpb(1:nshl,:) = shpb(lcsyst,1:nshl,:)
198*59599516SKenneth E. Jansen	   tmpshglb(:,1:nshl,:) = shglb(lcsyst,:,1:nshl,:)
199*59599516SKenneth E. Jansen
200*59599516SKenneth E. Jansen           call AsBMFG (y,                       x,
201*59599516SKenneth E. Jansen     &          tmpshpb,                 tmpshglb,
202*59599516SKenneth E. Jansen     &          mienb(iblk)%p,           mmatb(iblk)%p,
203*59599516SKenneth E. Jansen     &          miBCB(iblk)%p,           mBCB(iblk)%p,
204*59599516SKenneth E. Jansen     &          res,                     rmes)
205*59599516SKenneth E. Jansen
206*59599516SKenneth E. Jansen	   deallocate (tmpshpb)
207*59599516SKenneth E. Jansen	   deallocate (tmpshglb)
208*59599516SKenneth E. Jansenc
209*59599516SKenneth E. Jansenc.... end of boundary element loop
210*59599516SKenneth E. Jansenc
211*59599516SKenneth E. Jansen        enddo
212*59599516SKenneth E. Jansenc
213*59599516SKenneth E. Jansen        ttim(80) = ttim(80) + secs(0.0)
214*59599516SKenneth E. Jansenc
215*59599516SKenneth E. Jansenc.... -------------------->   communications <-------------------------
216*59599516SKenneth E. Jansenc
217*59599516SKenneth E. Jansen        if((iabc==1)) then      !are there any axisym bc's
218*59599516SKenneth E. Jansen           call rotabc(res(1,2), iBC, 'in ')
219*59599516SKenneth E. Jansen           call rotabc(rmes(1,2), iBC, 'in ')
220*59599516SKenneth E. Jansen        endif
221*59599516SKenneth E. Jansen
222*59599516SKenneth E. Jansen        if (numpe > 1) then
223*59599516SKenneth E. Jansenc
224*59599516SKenneth E. Jansen
225*59599516SKenneth E. Jansen            call commu (res  , ilwork, nflow  , 'in ')
226*59599516SKenneth E. Jansen
227*59599516SKenneth E. Jansen            call MPI_BARRIER (MPI_COMM_WORLD,ierr)
228*59599516SKenneth E. Jansen
229*59599516SKenneth E. Jansen            call commu (rmes , ilwork, nflow  , 'in ')
230*59599516SKenneth E. Jansen            if(iprec.ne.0) call commu(BDiag,ilwork, nflow*nflow, 'in ')
231*59599516SKenneth E. Jansen        endif
232*59599516SKenneth E. Jansen
233*59599516SKenneth E. Jansenc
234*59599516SKenneth E. Jansenc.... ---------------------->   post processing  <----------------------
235*59599516SKenneth E. Jansenc
236*59599516SKenneth E. Jansenc.... satisfy the BCs on the residual and the modified residual
237*59599516SKenneth E. Jansenc
238*59599516SKenneth E. Jansen        call bc3Res (y,  iBC,  BC,  res,  iper, ilwork)
239*59599516SKenneth E. Jansen        call bc3Res (y,  iBC,  BC,  rmes, iper, ilwork)
240*59599516SKenneth E. Jansen
241*59599516SKenneth E. Jansenc
242*59599516SKenneth E. Jansenc.... satisfy the BCs on the block-diagonal preconditioner
243*59599516SKenneth E. Jansenc
244*59599516SKenneth E. Jansen        if (iprec .ne. 0) then
245*59599516SKenneth E. Jansen           call bc3BDg (y,  iBC,  BC,  BDiag, iper, ilwork)
246*59599516SKenneth E. Jansen        endif
247*59599516SKenneth E. Jansen
248*59599516SKenneth E. Jansen
249*59599516SKenneth E. Jansenc
250*59599516SKenneth E. Jansenc.... return
251*59599516SKenneth E. Jansenc
252*59599516SKenneth E. Jansen        call timer ('Back    ')
253*59599516SKenneth E. Jansen        return
254*59599516SKenneth E. Jansen        end
255*59599516SKenneth E. Jansen
256*59599516SKenneth E. Jansen
257