xref: /phasta/phSolver/incompressible/elmgmr.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen        subroutine ElmGMR (u,         y,         ac,        x,
2*59599516SKenneth E. Jansen     &                     shp,       shgl,      iBC,
3*59599516SKenneth E. Jansen     &                     BC,        shpb,      shglb,
4*59599516SKenneth E. Jansen     &                     res,       iper,      ilwork,
5*59599516SKenneth E. Jansen     &                     rowp,      colm,     lhsK,
6*59599516SKenneth E. Jansen     &                     lhsP,      rerr,     GradV)
7*59599516SKenneth E. Jansenc
8*59599516SKenneth E. Jansenc----------------------------------------------------------------------
9*59599516SKenneth E. Jansenc
10*59599516SKenneth E. Jansenc This routine computes the LHS mass matrix, the RHS residual
11*59599516SKenneth E. Jansenc vector, and the preconditioning matrix, for use with the GMRES
12*59599516SKenneth E. Jansenc solver.
13*59599516SKenneth E. Jansenc
14*59599516SKenneth E. Jansenc Zdenek Johan, Winter 1991.      (Fortran 90)
15*59599516SKenneth E. Jansenc Chris Whiting, Winter 1998.     (Matrix EBE-GMRES)
16*59599516SKenneth E. Jansenc Alberto Figueroa, Winter 2004.  CMM-FSI
17*59599516SKenneth E. Jansenc Irene Vignon, Spring 2004.
18*59599516SKenneth E. Jansenc----------------------------------------------------------------------
19*59599516SKenneth E. Jansenc
20*59599516SKenneth E. Jansen        use pvsQbi  ! brings in NABI
21*59599516SKenneth E. Jansen        use stats   !
22*59599516SKenneth E. Jansen        use pointer_data  ! brings in the pointers for the blocked arrays
23*59599516SKenneth E. Jansen        use local_mass
24*59599516SKenneth E. Jansen        use timedata
25*59599516SKenneth E. Jansenc
26*59599516SKenneth E. Jansen        include "common.h"
27*59599516SKenneth E. Jansenc
28*59599516SKenneth E. Jansen        dimension y(nshg,ndof),         ac(nshg,ndof),
29*59599516SKenneth E. Jansen     &            u(nshg,nsd),
30*59599516SKenneth E. Jansen     &            x(numnp,nsd),
31*59599516SKenneth E. Jansen     &            iBC(nshg),
32*59599516SKenneth E. Jansen     &            BC(nshg,ndofBC),
33*59599516SKenneth E. Jansen     &            res(nshg,nflow),
34*59599516SKenneth E. Jansen     &            iper(nshg)
35*59599516SKenneth E. Jansenc
36*59599516SKenneth E. Jansen        dimension shp(MAXTOP,maxsh,MAXQPT),
37*59599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
38*59599516SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
39*59599516SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
40*59599516SKenneth E. Jansenc
41*59599516SKenneth E. Jansen        dimension qres(nshg,idflx),     rmass(nshg)
42*59599516SKenneth E. Jansen        dimension GradV(nshg,nsdsq)
43*59599516SKenneth E. Jansenc
44*59599516SKenneth E. Jansen        dimension ilwork(nlwork)
45*59599516SKenneth E. Jansen
46*59599516SKenneth E. Jansen        integer rowp(nshg*nnz),         colm(nshg+1)
47*59599516SKenneth E. Jansen
48*59599516SKenneth E. Jansen        real*8 lhsK(9,nnz_tot), lhsP(4,nnz_tot)
49*59599516SKenneth E. Jansen
50*59599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:,:,:) :: xKebe, xGoC
51*59599516SKenneth E. Jansen
52*59599516SKenneth E. Jansen        real*8  rerr(nshg,10)
53*59599516SKenneth E. Jansen
54*59599516SKenneth E. Jansen        real*8, allocatable :: tmpshp(:,:), tmpshgl(:,:,:)
55*59599516SKenneth E. Jansen        real*8, allocatable :: tmpshpb(:,:), tmpshglb(:,:,:)
56*59599516SKenneth E. Jansen
57*59599516SKenneth E. Jansen        real*8 spmasstot(20),  ebres(nshg)
58*59599516SKenneth E. Jansenc
59*59599516SKenneth E. Jansenc.... set up the timer
60*59599516SKenneth E. Jansenc
61*59599516SKenneth E. Jansen
62*59599516SKenneth E. JansenCAD        call timer ('Elm_Form')
63*59599516SKenneth E. Jansenc
64*59599516SKenneth E. Jansenc.... -------------------->   diffusive flux   <--------------------
65*59599516SKenneth E. Jansenc
66*59599516SKenneth E. Jansenc.... set up parameters
67*59599516SKenneth E. Jansenc
68*59599516SKenneth E. Jansen        ires   = 1
69*59599516SKenneth E. Jansen
70*59599516SKenneth E. Jansen        if (idiff==1 .or. idiff==3 .or. isurf==1) then ! global reconstruction
71*59599516SKenneth E. Jansen                                                       ! of qdiff
72*59599516SKenneth E. Jansenc
73*59599516SKenneth E. Jansenc loop over element blocks for the global reconstruction
74*59599516SKenneth E. Jansenc of the diffusive flux vector, q, and lumped mass matrix, rmass
75*59599516SKenneth E. Jansenc
76*59599516SKenneth E. Jansen           qres = zero
77*59599516SKenneth E. Jansen           if(iter == nitr .and. icomputevort == 1 ) then
78*59599516SKenneth E. Jansen             !write(*,*) 'iter:',iter,' - nitr:',nitr
79*59599516SKenneth E. Jansen             !write(*,*) 'Setting GradV to zero'
80*59599516SKenneth E. Jansen             GradV = zero
81*59599516SKenneth E. Jansen           endif
82*59599516SKenneth E. Jansen           rmass = zero
83*59599516SKenneth E. Jansen
84*59599516SKenneth E. Jansen           do iblk = 1, nelblk
85*59599516SKenneth E. Jansen              iel    = lcblk(1,iblk)
86*59599516SKenneth E. Jansen              lelCat = lcblk(2,iblk)
87*59599516SKenneth E. Jansen              lcsyst = lcblk(3,iblk)
88*59599516SKenneth E. Jansen              iorder = lcblk(4,iblk)
89*59599516SKenneth E. Jansen              nenl   = lcblk(5,iblk) ! no. of vertices per element
90*59599516SKenneth E. Jansen              nshl   = lcblk(10,iblk)
91*59599516SKenneth E. Jansen              mattyp = lcblk(7,iblk)
92*59599516SKenneth E. Jansen              ndofl  = lcblk(8,iblk)
93*59599516SKenneth E. Jansen              nsymdl = lcblk(9,iblk)
94*59599516SKenneth E. Jansen              npro   = lcblk(1,iblk+1) - iel
95*59599516SKenneth E. Jansen              ngauss = nint(lcsyst)
96*59599516SKenneth E. Jansenc
97*59599516SKenneth E. Jansenc.... compute and assemble diffusive flux vector residual, qres,
98*59599516SKenneth E. Jansenc     and lumped mass matrix, rmass
99*59599516SKenneth E. Jansen
100*59599516SKenneth E. Jansen            if(iter == nitr .and. icomputevort == 1 ) then
101*59599516SKenneth E. Jansen               !write(*,*) 'Calling AsIqGradV'
102*59599516SKenneth E. Jansen               call AsIqGradV (y,                x,
103*59599516SKenneth E. Jansen     &                   shp(lcsyst,1:nshl,:),
104*59599516SKenneth E. Jansen     &                   shgl(lcsyst,:,1:nshl,:),
105*59599516SKenneth E. Jansen     &                   mien(iblk)%p,
106*59599516SKenneth E. Jansen     &                   GradV)
107*59599516SKenneth E. Jansen             endif
108*59599516SKenneth E. Jansen              call AsIq (y,                x,
109*59599516SKenneth E. Jansen     &                   shp(lcsyst,1:nshl,:),
110*59599516SKenneth E. Jansen     &                   shgl(lcsyst,:,1:nshl,:),
111*59599516SKenneth E. Jansen     &                   mien(iblk)%p,     mxmudmi(iblk)%p,
112*59599516SKenneth E. Jansen     &                   qres,             rmass )
113*59599516SKenneth E. Jansen           enddo
114*59599516SKenneth E. Jansen
115*59599516SKenneth E. Jansenc
116*59599516SKenneth E. Jansenc.... form the diffusive flux approximation
117*59599516SKenneth E. Jansenc
118*59599516SKenneth E. Jansen           call qpbc( rmass, qres, iBC, iper, ilwork )
119*59599516SKenneth E. Jansen           if(iter == nitr .and. icomputevort == 1 ) then
120*59599516SKenneth E. Jansen             !write(*,*) 'Calling solveGradV'
121*59599516SKenneth E. Jansen             call solveGradV( rmass, GradV, iBC, iper, ilwork )
122*59599516SKenneth E. Jansen           endif
123*59599516SKenneth E. Jansenc
124*59599516SKenneth E. Jansen        endif
125*59599516SKenneth E. Jansenc
126*59599516SKenneth E. Jansenc.... -------------------->   interior elements   <--------------------
127*59599516SKenneth E. Jansenc
128*59599516SKenneth E. Jansen        res    = zero
129*59599516SKenneth E. Jansen        if (stsResFlg .ne. 1) then
130*59599516SKenneth E. Jansen           flxID = zero
131*59599516SKenneth E. Jansen        endif
132*59599516SKenneth E. Jansen
133*59599516SKenneth E. Jansen        if (lhs .eq. 1) then
134*59599516SKenneth E. Jansen           lhsp   = zero
135*59599516SKenneth E. Jansen           lhsk   = zero
136*59599516SKenneth E. Jansen        endif
137*59599516SKenneth E. Jansenc
138*59599516SKenneth E. Jansenc.... loop over the element-blocks
139*59599516SKenneth E. Jansenc
140*59599516SKenneth E. Jansen        do iblk = 1, nelblk
141*59599516SKenneth E. Jansen          iblock = iblk         ! used in local mass inverse (p>2)
142*59599516SKenneth E. Jansen          iblkts = iblk         ! used in timeseries
143*59599516SKenneth E. Jansen          iel    = lcblk(1,iblk)
144*59599516SKenneth E. Jansen          lelCat = lcblk(2,iblk)
145*59599516SKenneth E. Jansen          lcsyst = lcblk(3,iblk)
146*59599516SKenneth E. Jansen          iorder = lcblk(4,iblk)
147*59599516SKenneth E. Jansen          nenl   = lcblk(5,iblk) ! no. of vertices per element
148*59599516SKenneth E. Jansen          nshl   = lcblk(10,iblk)
149*59599516SKenneth E. Jansen          mattyp = lcblk(7,iblk)
150*59599516SKenneth E. Jansen          ndofl  = lcblk(8,iblk)
151*59599516SKenneth E. Jansen          nsymdl = lcblk(9,iblk)
152*59599516SKenneth E. Jansen          npro   = lcblk(1,iblk+1) - iel
153*59599516SKenneth E. Jansen          inum   = iel + npro - 1
154*59599516SKenneth E. Jansen          ngauss = nint(lcsyst)
155*59599516SKenneth E. Jansenc
156*59599516SKenneth E. Jansenc.... allocate the element matrices
157*59599516SKenneth E. Jansenc
158*59599516SKenneth E. Jansen          allocate ( xKebe(npro,9,nshl,nshl) )
159*59599516SKenneth E. Jansen          allocate ( xGoC (npro,4,nshl,nshl) )
160*59599516SKenneth E. Jansenc
161*59599516SKenneth E. Jansenc.... compute and assemble the residual and tangent matrix
162*59599516SKenneth E. Jansenc
163*59599516SKenneth E. Jansen          allocate (tmpshp(nshl,MAXQPT))
164*59599516SKenneth E. Jansen          allocate (tmpshgl(nsd,nshl,MAXQPT))
165*59599516SKenneth E. Jansen
166*59599516SKenneth E. Jansen          tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:)
167*59599516SKenneth E. Jansen          tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:)
168*59599516SKenneth E. Jansen
169*59599516SKenneth E. Jansen          call AsIGMR (y,                   ac,
170*59599516SKenneth E. Jansen     &                 x,                   mxmudmi(iblk)%p,
171*59599516SKenneth E. Jansen     &                 tmpshp,
172*59599516SKenneth E. Jansen     &                 tmpshgl,
173*59599516SKenneth E. Jansen     &                 mien(iblk)%p,
174*59599516SKenneth E. Jansen     &                 res,
175*59599516SKenneth E. Jansen     &                 qres,                xKebe,
176*59599516SKenneth E. Jansen     &                 xGoC,                rerr)
177*59599516SKenneth E. Jansenc
178*59599516SKenneth E. Jansenc.... satisfy the BC's on the implicit LHS
179*59599516SKenneth E. Jansenc
180*59599516SKenneth E. Jansen          if (impl(1) .ne. 9 .and. lhs .eq. 1) then
181*59599516SKenneth E. Jansen             if(ipord.eq.1)
182*59599516SKenneth E. Jansen     &         call bc3lhs (iBC, BC,mien(iblk)%p, xKebe)
183*59599516SKenneth E. Jansen             call fillsparseI (mien(iblk)%p,
184*59599516SKenneth E. Jansen     &                 xKebe,            lhsK,
185*59599516SKenneth E. Jansen     &                 xGoC,             lhsP,
186*59599516SKenneth E. Jansen     &                 rowp,                      colm)
187*59599516SKenneth E. Jansen          endif
188*59599516SKenneth E. Jansen
189*59599516SKenneth E. Jansen          deallocate ( xKebe )
190*59599516SKenneth E. Jansen          deallocate ( xGoC  )
191*59599516SKenneth E. Jansen          deallocate ( tmpshp )
192*59599516SKenneth E. Jansen          deallocate ( tmpshgl )
193*59599516SKenneth E. Jansenc
194*59599516SKenneth E. Jansenc.... end of interior element loop
195*59599516SKenneth E. Jansenc
196*59599516SKenneth E. Jansen       enddo
197*59599516SKenneth E. Jansenc$$$       if(ibksiz.eq.20 .and. iwrote.ne.789) then
198*59599516SKenneth E. Jansenc$$$          do i=1,nshg
199*59599516SKenneth E. Jansenc$$$             write(789,*) 'eqn block ',i
200*59599516SKenneth E. Jansenc$$$             do j=colm(i),colm(i+1)-1
201*59599516SKenneth E. Jansenc$$$                write(789,*) 'var block',rowp(j)
202*59599516SKenneth E. Jansenc$$$
203*59599516SKenneth E. Jansenc$$$                do ii=1,3
204*59599516SKenneth E. Jansenc$$$                   write(789,111) (lhsK((ii-1)*3+jj,j),jj=1,3)
205*59599516SKenneth E. Jansenc$$$                enddo
206*59599516SKenneth E. Jansenc$$$             enddo
207*59599516SKenneth E. Jansenc$$$          enddo
208*59599516SKenneth E. Jansenc$$$          close(789)
209*59599516SKenneth E. Jansenc$$$          iwrote=789
210*59599516SKenneth E. Jansenc$$$       endif
211*59599516SKenneth E. Jansenc$$$ 111   format(3(e14.7,2x))
212*59599516SKenneth E. Jansenc$$$c
213*59599516SKenneth E. Jansenc.... add in lumped mass contributions if needed
214*59599516SKenneth E. Jansenc
215*59599516SKenneth E. Jansen       if((flmpr.ne.0).or.(flmpl.ne.0)) then
216*59599516SKenneth E. Jansen          call lmassadd(ac,res,rowp,colm,lhsK,gmass)
217*59599516SKenneth E. Jansen       endif
218*59599516SKenneth E. Jansen
219*59599516SKenneth E. Jansen       have_local_mass = 1
220*59599516SKenneth E. Jansenc
221*59599516SKenneth E. Jansenc.... time average statistics
222*59599516SKenneth E. Jansenc
223*59599516SKenneth E. Jansen       if ( stsResFlg .eq. 1 ) then
224*59599516SKenneth E. Jansen
225*59599516SKenneth E. Jansen          if (numpe > 1) then
226*59599516SKenneth E. Jansen             call commu (stsVec, ilwork, nResDims  , 'in ')
227*59599516SKenneth E. Jansen          endif
228*59599516SKenneth E. Jansen          do j = 1,nshg
229*59599516SKenneth E. Jansen             if (btest(iBC(j),10)) then
230*59599516SKenneth E. Jansen                i = iper(j)
231*59599516SKenneth E. Jansen                stsVec(i,:) = stsVec(i,:) + stsVec(j,:)
232*59599516SKenneth E. Jansen             endif
233*59599516SKenneth E. Jansen          enddo
234*59599516SKenneth E. Jansenc
235*59599516SKenneth E. Jansen          do i = 1,nshg
236*59599516SKenneth E. Jansen             stsVec(i,:) = stsVec(iper(i),:)
237*59599516SKenneth E. Jansen          enddo
238*59599516SKenneth E. Jansen
239*59599516SKenneth E. Jansen          if (numpe > 1) then
240*59599516SKenneth E. Jansen             call commu (stsVec, ilwork, nResDims  , 'out')
241*59599516SKenneth E. Jansen          endif
242*59599516SKenneth E. Jansen          return
243*59599516SKenneth E. Jansen
244*59599516SKenneth E. Jansen       endif
245*59599516SKenneth E. Jansenc
246*59599516SKenneth E. Jansenc.... -------------------->   boundary elements   <--------------------
247*59599516SKenneth E. Jansenc
248*59599516SKenneth E. Jansenc.... loop over the boundary elements
249*59599516SKenneth E. Jansenc
250*59599516SKenneth E. Jansen        do iblk = 1, nelblb
251*59599516SKenneth E. Jansenc
252*59599516SKenneth E. Jansenc.... set up the parameters
253*59599516SKenneth E. Jansenc
254*59599516SKenneth E. Jansen          iel    = lcblkb(1,iblk)
255*59599516SKenneth E. Jansen          lelCat = lcblkb(2,iblk)
256*59599516SKenneth E. Jansen          lcsyst = lcblkb(3,iblk)
257*59599516SKenneth E. Jansen          iorder = lcblkb(4,iblk)
258*59599516SKenneth E. Jansen          nenl   = lcblkb(5,iblk)  ! no. of vertices per element
259*59599516SKenneth E. Jansen          nenbl  = lcblkb(6,iblk)  ! no. of vertices per bdry. face
260*59599516SKenneth E. Jansen          nshl   = lcblkb(9,iblk)
261*59599516SKenneth E. Jansen          nshlb  = lcblkb(10,iblk)
262*59599516SKenneth E. Jansen          mattyp = lcblkb(7,iblk)
263*59599516SKenneth E. Jansen          ndofl  = lcblkb(8,iblk)
264*59599516SKenneth E. Jansen          npro   = lcblkb(1,iblk+1) - iel
265*59599516SKenneth E. Jansen
266*59599516SKenneth E. Jansen
267*59599516SKenneth E. Jansen          if(lcsyst.eq.3) lcsyst=nenbl
268*59599516SKenneth E. Jansenc
269*59599516SKenneth E. Jansen          if(lcsyst.eq.3 .or. lcsyst.eq.4) then
270*59599516SKenneth E. Jansen             ngaussb = nintb(lcsyst)
271*59599516SKenneth E. Jansen          else
272*59599516SKenneth E. Jansen             ngaussb = nintb(lcsyst)
273*59599516SKenneth E. Jansen          endif
274*59599516SKenneth E. Jansenc
275*59599516SKenneth E. Jansenc.... allocate the element matrices
276*59599516SKenneth E. Jansenc
277*59599516SKenneth E. Jansen          allocate ( xKebe(npro,9,nshl,nshl) )
278*59599516SKenneth E. Jansen          allocate ( xGoC (npro,4,nshl,nshl) )
279*59599516SKenneth E. Jansen
280*59599516SKenneth E. Jansenc
281*59599516SKenneth E. Jansenc.... compute and assemble the residuals corresponding to the
282*59599516SKenneth E. Jansenc     boundary integral
283*59599516SKenneth E. Jansenc
284*59599516SKenneth E. Jansen          allocate (tmpshpb(nshl,MAXQPT))
285*59599516SKenneth E. Jansen          allocate (tmpshglb(nsd,nshl,MAXQPT))
286*59599516SKenneth E. Jansen
287*59599516SKenneth E. Jansen          tmpshpb(1:nshl,:) = shpb(lcsyst,1:nshl,:)
288*59599516SKenneth E. Jansen          tmpshglb(:,1:nshl,:) = shglb(lcsyst,:,1:nshl,:)
289*59599516SKenneth E. Jansen
290*59599516SKenneth E. Jansen          call AsBMFG (u,                       y,
291*59599516SKenneth E. Jansen     &                 ac,                      x,
292*59599516SKenneth E. Jansen     &                 tmpshpb,
293*59599516SKenneth E. Jansen     &                 tmpshglb,
294*59599516SKenneth E. Jansen     &                 mienb(iblk)%p,           mmatb(iblk)%p,
295*59599516SKenneth E. Jansen     &                 miBCB(iblk)%p,           mBCB(iblk)%p,
296*59599516SKenneth E. Jansen     &                 res,                     xKebe)
297*59599516SKenneth E. Jansen
298*59599516SKenneth E. Jansenc
299*59599516SKenneth E. Jansenc.... satisfy (again, for the vessel wall contributions) the BC's on the implicit LHS
300*59599516SKenneth E. Jansenc
301*59599516SKenneth E. Jansenc.... first, we need to make xGoC zero, since it doesn't have contributions from the
302*59599516SKenneth E. Jansenc.... vessel wall elements
303*59599516SKenneth E. Jansen
304*59599516SKenneth E. Jansen          xGoC = zero
305*59599516SKenneth E. Jansen
306*59599516SKenneth E. Jansen          if (impl(1) .ne. 9 .and. lhs .eq. 1) then
307*59599516SKenneth E. Jansen             if(ipord.eq.1)
308*59599516SKenneth E. Jansen     &         call bc3lhs (iBC, BC,mienb(iblk)%p, xKebe)
309*59599516SKenneth E. Jansen             call fillsparseI (mienb(iblk)%p,
310*59599516SKenneth E. Jansen     &                 xKebe,           lhsK,
311*59599516SKenneth E. Jansen     &                 xGoC,             lhsP,
312*59599516SKenneth E. Jansen     &                 rowp,                      colm)
313*59599516SKenneth E. Jansen          endif
314*59599516SKenneth E. Jansen
315*59599516SKenneth E. Jansen          deallocate ( xKebe )
316*59599516SKenneth E. Jansen          deallocate ( xGoC )
317*59599516SKenneth E. Jansen          deallocate (tmpshpb)
318*59599516SKenneth E. Jansen          deallocate (tmpshglb)
319*59599516SKenneth E. Jansenc
320*59599516SKenneth E. Jansenc.... end of boundary element loop
321*59599516SKenneth E. Jansenc
322*59599516SKenneth E. Jansen       enddo
323*59599516SKenneth E. Jansen
324*59599516SKenneth E. Jansen       if(ipvsq.ge.1) then
325*59599516SKenneth E. Jansenc
326*59599516SKenneth E. Jansenc....  pressure vs. resistance boundary condition sets pressure at
327*59599516SKenneth E. Jansenc      outflow to linearly increase as flow through that face increases
328*59599516SKenneth E. Jansenc      (routine is at bottom of this file)
329*59599516SKenneth E. Jansenc
330*59599516SKenneth E. Jansen          call ElmpvsQ (res,y,-1.0d0)
331*59599516SKenneth E. Jansen       endif
332*59599516SKenneth E. Jansen
333*59599516SKenneth E. Jansenc
334*59599516SKenneth E. Jansenc before the commu we need to rotate the residual vector for axisymmetric
335*59599516SKenneth E. Jansenc boundary conditions (so that off processor periodicity is a dof add instead
336*59599516SKenneth E. Jansenc of a dof combination).  Take care of all nodes now so periodicity, like
337*59599516SKenneth E. Jansenc commu is a simple dof add.
338*59599516SKenneth E. Jansenc
339*59599516SKenneth E. Jansen       if(iabc==1)              !are there any axisym bc's
340*59599516SKenneth E. Jansen     &       call rotabc(res, iBC,  'in ')
341*59599516SKenneth E. Jansenc
342*59599516SKenneth E. Jansenc
343*59599516SKenneth E. Jansenc.... -------------------->   communications <-------------------------
344*59599516SKenneth E. Jansenc
345*59599516SKenneth E. Jansen
346*59599516SKenneth E. Jansen       if (numpe > 1) then
347*59599516SKenneth E. Jansen          call commu (res  , ilwork, nflow  , 'in ')
348*59599516SKenneth E. Jansen       endif
349*59599516SKenneth E. Jansen
350*59599516SKenneth E. Jansenc
351*59599516SKenneth E. Jansenc.... ---------------------->   post processing  <----------------------
352*59599516SKenneth E. Jansenc
353*59599516SKenneth E. Jansenc.... satisfy the BCs on the residual
354*59599516SKenneth E. Jansenc
355*59599516SKenneth E. Jansen      call bc3Res (iBC,  BC,  res,  iper, ilwork)
356*59599516SKenneth E. Jansenc
357*59599516SKenneth E. Jansenc.... return
358*59599516SKenneth E. Jansenc
359*59599516SKenneth E. Jansenc      call timer ('Back    ')
360*59599516SKenneth E. Jansen      return
361*59599516SKenneth E. Jansen      end
362*59599516SKenneth E. Jansen
363*59599516SKenneth E. Jansen
364*59599516SKenneth E. Jansen!^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
365*59599516SKenneth E. Jansen!********************************************************************
366*59599516SKenneth E. Jansen!--------------------------------------------------------------------
367*59599516SKenneth E. Jansen
368*59599516SKenneth E. Jansen      subroutine ElmGMRSclr (y,         ac,        x,
369*59599516SKenneth E. Jansen     &                       shp,       shgl,      iBC,
370*59599516SKenneth E. Jansen     &                       BC,        shpb,      shglb,
371*59599516SKenneth E. Jansen     &                       res,       iper,      ilwork,
372*59599516SKenneth E. Jansen     &                       rowp,      colm,      lhsS    )
373*59599516SKenneth E. Jansenc
374*59599516SKenneth E. Jansenc----------------------------------------------------------------------
375*59599516SKenneth E. Jansenc
376*59599516SKenneth E. Jansenc This routine computes the LHS mass matrix, the RHS residual
377*59599516SKenneth E. Jansenc vector, and the preconditioning matrix, for use with the GMRES
378*59599516SKenneth E. Jansenc solver.
379*59599516SKenneth E. Jansenc
380*59599516SKenneth E. Jansenc----------------------------------------------------------------------
381*59599516SKenneth E. Jansenc
382*59599516SKenneth E. Jansen        use pointer_data
383*59599516SKenneth E. Jansen        use local_mass
384*59599516SKenneth E. Jansenc
385*59599516SKenneth E. Jansen        include "common.h"
386*59599516SKenneth E. Jansen        include "mpif.h"
387*59599516SKenneth E. Jansenc
388*59599516SKenneth E. Jansen        dimension y(nshg,ndof),         ac(nshg,ndof),
389*59599516SKenneth E. Jansen     &            x(numnp,nsd),         iBC(nshg),
390*59599516SKenneth E. Jansen     &            BC(nshg,ndofBC),      res(nshg),
391*59599516SKenneth E. Jansen     &            iper(nshg)
392*59599516SKenneth E. Jansenc
393*59599516SKenneth E. Jansen        dimension shp(MAXTOP,maxsh,MAXQPT),
394*59599516SKenneth E. Jansen     &            shgl(MAXTOP,nsd,maxsh,MAXQPT),
395*59599516SKenneth E. Jansen     &            shpb(MAXTOP,maxsh,MAXQPT),
396*59599516SKenneth E. Jansen     &            shglb(MAXTOP,nsd,maxsh,MAXQPT)
397*59599516SKenneth E. Jansenc
398*59599516SKenneth E. Jansen        dimension qres(nshg,nsd),     rmass(nshg)
399*59599516SKenneth E. Jansenc
400*59599516SKenneth E. Jansen        integer ilwork(nlwork), rowp(nshg*nnz),   colm(nshg+1)
401*59599516SKenneth E. Jansen
402*59599516SKenneth E. Jansen        real*8 lhsS(nnz_tot)
403*59599516SKenneth E. Jansen
404*59599516SKenneth E. Jansen        real*8, allocatable, dimension(:,:,:) :: xSebe
405*59599516SKenneth E. Jansenc
406*59599516SKenneth E. Jansenc.... set up the timer
407*59599516SKenneth E. Jansenc
408*59599516SKenneth E. Jansen
409*59599516SKenneth E. JansenCAD        call timer ('Elm_Form')
410*59599516SKenneth E. Jansenc
411*59599516SKenneth E. Jansenc.... -------------------->   diffusive flux   <--------------------
412*59599516SKenneth E. Jansenc
413*59599516SKenneth E. Jansen        ires   = 1
414*59599516SKenneth E. Jansen
415*59599516SKenneth E. Jansen        if (idiff==1 .or. idiff==3) then ! global reconstruction of qdiff
416*59599516SKenneth E. Jansenc
417*59599516SKenneth E. Jansenc loop over element blocks for the global reconstruction
418*59599516SKenneth E. Jansenc of the diffusive flux vector, q, and lumped mass matrix, rmass
419*59599516SKenneth E. Jansenc
420*59599516SKenneth E. Jansen           qres = zero
421*59599516SKenneth E. Jansen           rmass = zero
422*59599516SKenneth E. Jansen
423*59599516SKenneth E. Jansen           do iblk = 1, nelblk
424*59599516SKenneth E. Jansen              iel    = lcblk(1,iblk)
425*59599516SKenneth E. Jansen              lcsyst = lcblk(3,iblk)
426*59599516SKenneth E. Jansen              nenl   = lcblk(5,iblk) ! no. of vertices per element
427*59599516SKenneth E. Jansen              nshl   = lcblk(10,iblk)
428*59599516SKenneth E. Jansen              mattyp = lcblk(7,iblk)
429*59599516SKenneth E. Jansen              ndofl  = lcblk(8,iblk)
430*59599516SKenneth E. Jansen              npro   = lcblk(1,iblk+1) - iel
431*59599516SKenneth E. Jansen
432*59599516SKenneth E. Jansen              ngauss = nint(lcsyst)
433*59599516SKenneth E. Jansenc
434*59599516SKenneth E. Jansenc.... compute and assemble diffusive flux vector residual, qres,
435*59599516SKenneth E. Jansenc     and lumped mass matrix, rmass
436*59599516SKenneth E. Jansen
437*59599516SKenneth E. Jansen              call AsIqSclr (y,                   x,
438*59599516SKenneth E. Jansen     &                       shp(lcsyst,1:nshl,:),
439*59599516SKenneth E. Jansen     &                       shgl(lcsyst,:,1:nshl,:),
440*59599516SKenneth E. Jansen     &                       mien(iblk)%p,     qres,
441*59599516SKenneth E. Jansen     &                       rmass )
442*59599516SKenneth E. Jansen
443*59599516SKenneth E. Jansen           enddo
444*59599516SKenneth E. Jansen
445*59599516SKenneth E. Jansenc
446*59599516SKenneth E. Jansenc.... form the diffusive flux approximation
447*59599516SKenneth E. Jansenc
448*59599516SKenneth E. Jansen           call qpbcSclr ( rmass, qres, iBC, iper, ilwork )
449*59599516SKenneth E. Jansenc
450*59599516SKenneth E. Jansen        endif
451*59599516SKenneth E. Jansenc
452*59599516SKenneth E. Jansenc.... -------------------->   interior elements   <--------------------
453*59599516SKenneth E. Jansenc
454*59599516SKenneth E. Jansen        res    = zero
455*59599516SKenneth E. Jansen        spmass = zero
456*59599516SKenneth E. Jansen
457*59599516SKenneth E. Jansen        if (lhs .eq. 1) then
458*59599516SKenneth E. Jansen           lhsS   = zero
459*59599516SKenneth E. Jansen        endif
460*59599516SKenneth E. Jansen
461*59599516SKenneth E. Jansen        if ((impl(1)/10) .eq. 0) then   ! no flow solve so flxID was not zeroed
462*59599516SKenneth E. Jansen           flxID = zero
463*59599516SKenneth E. Jansen        endif
464*59599516SKenneth E. Jansenc
465*59599516SKenneth E. Jansenc.... loop over the element-blocks
466*59599516SKenneth E. Jansenc
467*59599516SKenneth E. Jansen        do iblk = 1, nelblk
468*59599516SKenneth E. Jansen          iblock = iblk         ! used in local mass inverse (p>2)
469*59599516SKenneth E. Jansen          iel    = lcblk(1,iblk)
470*59599516SKenneth E. Jansen          lcsyst = lcblk(3,iblk)
471*59599516SKenneth E. Jansen          nenl   = lcblk(5,iblk) ! no. of vertices per element
472*59599516SKenneth E. Jansen          nshl   = lcblk(10,iblk)
473*59599516SKenneth E. Jansen          ndofl  = lcblk(8,iblk)
474*59599516SKenneth E. Jansen          npro   = lcblk(1,iblk+1) - iel
475*59599516SKenneth E. Jansen
476*59599516SKenneth E. Jansen          ngauss = nint(lcsyst)
477*59599516SKenneth E. Jansenc
478*59599516SKenneth E. Jansenc.... allocate the element matrices
479*59599516SKenneth E. Jansenc
480*59599516SKenneth E. Jansen          allocate ( xSebe(npro,nshl,nshl) )
481*59599516SKenneth E. Jansenc
482*59599516SKenneth E. Jansenc.... compute and assemble the residual and tangent matrix
483*59599516SKenneth E. Jansenc
484*59599516SKenneth E. Jansen          call AsIGMRSclr(y,                   ac,
485*59599516SKenneth E. Jansen     &                 x,
486*59599516SKenneth E. Jansen     &                 shp(lcsyst,1:nshl,:),
487*59599516SKenneth E. Jansen     &                 shgl(lcsyst,:,1:nshl,:),
488*59599516SKenneth E. Jansen     &                 mien(iblk)%p,        res,
489*59599516SKenneth E. Jansen     &                 qres,                xSebe, mxmudmi(iblk)%p )
490*59599516SKenneth E. Jansenc
491*59599516SKenneth E. Jansenc.... satisfy the BC's on the implicit LHS
492*59599516SKenneth E. Jansenc
493*59599516SKenneth E. Jansen          if (impl(1) .ne. 9 .and. lhs .eq. 1) then
494*59599516SKenneth E. Jansen             call fillsparseSclr (mien(iblk)%p,
495*59599516SKenneth E. Jansen     &                 xSebe,             lhsS,
496*59599516SKenneth E. Jansen     &                 rowp,              colm)
497*59599516SKenneth E. Jansen          endif
498*59599516SKenneth E. Jansen
499*59599516SKenneth E. Jansen          deallocate ( xSebe )
500*59599516SKenneth E. Jansenc
501*59599516SKenneth E. Jansenc.... end of interior element loop
502*59599516SKenneth E. Jansenc
503*59599516SKenneth E. Jansen       enddo
504*59599516SKenneth E. Jansen
505*59599516SKenneth E. Jansenc
506*59599516SKenneth E. Jansenc.... add in lumped mass contributions if needed
507*59599516SKenneth E. Jansenc
508*59599516SKenneth E. Jansen       if((flmpr.ne.0).or.(flmpl.ne.0)) then
509*59599516SKenneth E. Jansen          call lmassaddSclr(ac(:,isclr), res,rowp,colm,lhsS,gmass)
510*59599516SKenneth E. Jansen       endif
511*59599516SKenneth E. Jansen
512*59599516SKenneth E. Jansen       have_local_mass = 1
513*59599516SKenneth E. Jansenc
514*59599516SKenneth E. Jansenc
515*59599516SKenneth E. Jansenc  call DtN routine which updates the flux to be consistent with the
516*59599516SKenneth E. Jansenc  current solution values.  We will put the result in the last slot of
517*59599516SKenneth E. Jansenc  BC (we added a space in input.f).  That way we can localize this
518*59599516SKenneth E. Jansenc  value to the boundary elements.  This is important to keep from calling
519*59599516SKenneth E. Jansenc  the DtN evaluator more than once per node (it can be very expensive).
520*59599516SKenneth E. Jansenc
521*59599516SKenneth E. Jansen         if(idtn.eq.1)  call DtN(iBC,BC,y)
522*59599516SKenneth E. Jansenc
523*59599516SKenneth E. Jansenc.... -------------------->   boundary elements   <--------------------
524*59599516SKenneth E. Jansenc
525*59599516SKenneth E. Jansenc
526*59599516SKenneth E. Jansenc.... loop over the boundary elements
527*59599516SKenneth E. Jansenc
528*59599516SKenneth E. Jansen        do iblk = 1, nelblb
529*59599516SKenneth E. Jansenc
530*59599516SKenneth E. Jansenc.... set up the parameters
531*59599516SKenneth E. Jansenc
532*59599516SKenneth E. Jansen          iel    = lcblkb(1,iblk)
533*59599516SKenneth E. Jansen          lcsyst = lcblkb(3,iblk)
534*59599516SKenneth E. Jansen          nenl   = lcblkb(5,iblk)  ! no. of vertices per element
535*59599516SKenneth E. Jansen          nenbl  = lcblkb(6,iblk)  ! no. of vertices per bdry. face
536*59599516SKenneth E. Jansen          nshl   = lcblkb(9,iblk)
537*59599516SKenneth E. Jansen          nshlb  = lcblkb(10,iblk)
538*59599516SKenneth E. Jansen          ndofl  = lcblkb(8,iblk)
539*59599516SKenneth E. Jansen          npro   = lcblkb(1,iblk+1) - iel
540*59599516SKenneth E. Jansen
541*59599516SKenneth E. Jansen          if(lcsyst.eq.3) lcsyst=nenbl
542*59599516SKenneth E. Jansen          if(lcsyst.eq.3 .or. lcsyst.eq.4) then
543*59599516SKenneth E. Jansen             ngaussb = nintb(lcsyst)
544*59599516SKenneth E. Jansen          else
545*59599516SKenneth E. Jansen             ngaussb = nintb(lcsyst)
546*59599516SKenneth E. Jansen          endif
547*59599516SKenneth E. Jansenc
548*59599516SKenneth E. Jansenc localize the dtn boundary condition
549*59599516SKenneth E. Jansenc
550*59599516SKenneth E. Jansen
551*59599516SKenneth E. Jansen          if(idtn.eq.1)   call dtnl(   iBC, BC, mienb(iblk)%p,
552*59599516SKenneth E. Jansen     &              miBCB(iblk)%p,  mBCB(iblk)%p)
553*59599516SKenneth E. Jansen
554*59599516SKenneth E. Jansenc
555*59599516SKenneth E. Jansenc.... compute and assemble the residuals corresponding to the
556*59599516SKenneth E. Jansenc     boundary integral
557*59599516SKenneth E. Jansenc
558*59599516SKenneth E. Jansen          call AsBSclr (y,                       x,
559*59599516SKenneth E. Jansen     &                  shpb(lcsyst,1:nshl,:),
560*59599516SKenneth E. Jansen     &                  shglb(lcsyst,:,1:nshl,:),
561*59599516SKenneth E. Jansen     &                  mienb(iblk)%p,           mmatb(iblk)%p,
562*59599516SKenneth E. Jansen     &                  miBCB(iblk)%p,           mBCB(iblk)%p,
563*59599516SKenneth E. Jansen     &                  res)
564*59599516SKenneth E. Jansenc
565*59599516SKenneth E. Jansenc.... end of boundary element loop
566*59599516SKenneth E. Jansenc
567*59599516SKenneth E. Jansen        enddo
568*59599516SKenneth E. Jansenc
569*59599516SKenneth E. Jansenc
570*59599516SKenneth E. Jansenc.... -------------------->   communications <-------------------------
571*59599516SKenneth E. Jansenc
572*59599516SKenneth E. Jansen
573*59599516SKenneth E. Jansen      if (numpe > 1) then
574*59599516SKenneth E. Jansen        call commu (res  , ilwork, 1  , 'in ')
575*59599516SKenneth E. Jansen      endif
576*59599516SKenneth E. Jansen
577*59599516SKenneth E. Jansenc
578*59599516SKenneth E. Jansenc.... ---------------------->   post processing  <----------------------
579*59599516SKenneth E. Jansenc
580*59599516SKenneth E. Jansenc.... satisfy the BCs on the residual
581*59599516SKenneth E. Jansenc
582*59599516SKenneth E. Jansen      call bc3ResSclr (iBC,  res,  iper, ilwork)
583*59599516SKenneth E. Jansenc
584*59599516SKenneth E. Jansenc.... return
585*59599516SKenneth E. Jansenc
586*59599516SKenneth E. JansenCAD      call timer ('Back    ')
587*59599516SKenneth E. Jansen      return
588*59599516SKenneth E. Jansen      end
589*59599516SKenneth E. Jansen
590*59599516SKenneth E. Jansen
591*59599516SKenneth E. Jansenc
592*59599516SKenneth E. Jansenc....routine to compute and return the flow rates for coupled surfaces of a given type
593*59599516SKenneth E. Jansenc
594*59599516SKenneth E. Jansen      subroutine GetFlowQ (qsurf,y,srfIdList,numSrfs)
595*59599516SKenneth E. Jansen
596*59599516SKenneth E. Jansen      use pvsQbi  ! brings in NABI
597*59599516SKenneth E. Jansenc
598*59599516SKenneth E. Jansen      include "common.h"
599*59599516SKenneth E. Jansen      include "mpif.h"
600*59599516SKenneth E. Jansen
601*59599516SKenneth E. Jansen      real*8  y(nshg,3)
602*59599516SKenneth E. Jansen      real*8  qsurf(0:MAXSURF),qsurfProc(0:MAXSURF)
603*59599516SKenneth E. Jansen      integer numSrfs, irankCoupled, srfIdList(0:MAXSURF)
604*59599516SKenneth E. Jansen
605*59599516SKenneth E. Jansenc note we only need the first three entries (u) from y
606*59599516SKenneth E. Jansen
607*59599516SKenneth E. Jansen      qsurfProc=zero
608*59599516SKenneth E. Jansen
609*59599516SKenneth E. Jansen      do i = 1,nshg
610*59599516SKenneth E. Jansen
611*59599516SKenneth E. Jansen        if(numSrfs.gt.zero) then
612*59599516SKenneth E. Jansen          do k = 1,numSrfs
613*59599516SKenneth E. Jansen            irankCoupled = 0
614*59599516SKenneth E. Jansen            if (srfIdList(k).eq.ndsurf(i)) then
615*59599516SKenneth E. Jansen              irankCoupled=k
616*59599516SKenneth E. Jansen              do j = 1,3
617*59599516SKenneth E. Jansen                 qsurfProc(irankCoupled) = qsurfProc(irankCoupled)
618*59599516SKenneth E. Jansen     &                            + NABI(i,j)*y(i,j)
619*59599516SKenneth E. Jansen              enddo
620*59599516SKenneth E. Jansen              exit
621*59599516SKenneth E. Jansen            endif
622*59599516SKenneth E. Jansen          enddo
623*59599516SKenneth E. Jansen        endif
624*59599516SKenneth E. Jansen
625*59599516SKenneth E. Jansen      enddo
626*59599516SKenneth E. Jansenc
627*59599516SKenneth E. Jansenc     at this point, each qsurf has its "nodes" contributions to Q
628*59599516SKenneth E. Jansenc     accumulated into qsurf. Note, because NABI is on processor this
629*59599516SKenneth E. Jansenc     will NOT be Q for the surface yet
630*59599516SKenneth E. Jansenc
631*59599516SKenneth E. Jansenc.... reduce integrated Q for each surface, push on qsurf
632*59599516SKenneth E. Jansenc
633*59599516SKenneth E. Jansen       npars=MAXSURF+1
634*59599516SKenneth E. Jansen       if(impistat.eq.1) then
635*59599516SKenneth E. Jansen         iAllR = iAllR+1
636*59599516SKenneth E. Jansen       elseif(impistat.eq.2) then
637*59599516SKenneth E. Jansen          iAllR = iAllR+1
638*59599516SKenneth E. Jansen       endif
639*59599516SKenneth E. Jansen       if(impistat2.eq.1) call MPI_BARRIER (MPI_COMM_WORLD, ierr)
640*59599516SKenneth E. Jansen       if(impistat.gt.0) rmpitmr = TMRC()
641*59599516SKenneth E. Jansen       call MPI_ALLREDUCE (qsurfProc, qsurf(:), npars,
642*59599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_SUM, MPI_COMM_WORLD,ierr)
643*59599516SKenneth E. Jansen       if(impistat.eq.1) then
644*59599516SKenneth E. Jansen         rAllR = rAllR+TMRC()-rmpitmr
645*59599516SKenneth E. Jansen       elseif(impistat.eq.2) then
646*59599516SKenneth E. Jansen         rAllRScal = rAllRScal+TMRC()-rmpitmr
647*59599516SKenneth E. Jansen       endif
648*59599516SKenneth E. Jansen
649*59599516SKenneth E. Jansenc
650*59599516SKenneth E. Jansenc.... return
651*59599516SKenneth E. Jansenc
652*59599516SKenneth E. Jansen      return
653*59599516SKenneth E. Jansen      end
654*59599516SKenneth E. Jansen
655*59599516SKenneth E. Jansen
656*59599516SKenneth E. Jansen
657*59599516SKenneth E. Jansenc
658*59599516SKenneth E. Jansenc... routine to couple pressure with flow rate for each coupled surface
659*59599516SKenneth E. Jansenc
660*59599516SKenneth E. Jansen      subroutine ElmpvsQ (res,y,sign)
661*59599516SKenneth E. Jansen
662*59599516SKenneth E. Jansen      use pvsQbi  ! brings in NABI
663*59599516SKenneth E. Jansen      use convolImpFlow !brings in the current part of convol coef for imp BC
664*59599516SKenneth E. Jansen      use convolRCRFlow !brings in the current part of convol coef for RCR BC
665*59599516SKenneth E. Jansen
666*59599516SKenneth E. Jansen      include "common.h"
667*59599516SKenneth E. Jansen      include "mpif.h"
668*59599516SKenneth E. Jansen
669*59599516SKenneth E. Jansen      real*8 res(nshg,ndof),y(nshg,3)
670*59599516SKenneth E. Jansen      real*8 p(0:MAXSURF)
671*59599516SKenneth E. Jansen      integer irankCoupled
672*59599516SKenneth E. Jansen
673*59599516SKenneth E. Jansenc
674*59599516SKenneth E. Jansenc... get p for the resistance BC
675*59599516SKenneth E. Jansenc
676*59599516SKenneth E. Jansen      if(numResistSrfs.gt.zero) then
677*59599516SKenneth E. Jansen        call GetFlowQ(p,y,nsrflistResist,numResistSrfs)  !Q pushed into p but at this point
678*59599516SKenneth E. Jansen                          ! p is just the full Q for each surface
679*59599516SKenneth E. Jansen        p(:)=sign*p(:)*ValueListResist(:) ! p=QR  now we have the true pressure on each
680*59599516SKenneth E. Jansen                                        ! outflow surface.  Note sign is -1
681*59599516SKenneth E. Jansen                                        ! for RHS, +1 for LHS
682*59599516SKenneth E. Jansenc
683*59599516SKenneth E. Jansenc....  multiply it by integral NA n_i
684*59599516SKenneth E. Jansenc
685*59599516SKenneth E. Jansen       do i = 1,nshg
686*59599516SKenneth E. Jansen          do k = 1,numResistSrfs
687*59599516SKenneth E. Jansen              irankCoupled = 0
688*59599516SKenneth E. Jansen              if (nsrflistResist(k).eq.ndsurf(i)) then
689*59599516SKenneth E. Jansen                  irankCoupled=k
690*59599516SKenneth E. Jansen                  res(i,1:3)=res(i,1:3) + p(irankCoupled)*NABI(i,1:3)
691*59599516SKenneth E. Jansen                  exit
692*59599516SKenneth E. Jansen              endif
693*59599516SKenneth E. Jansen          enddo
694*59599516SKenneth E. Jansen       enddo
695*59599516SKenneth E. Jansen
696*59599516SKenneth E. Jansen      endif !end of coupling for Resistance BC
697*59599516SKenneth E. Jansen
698*59599516SKenneth E. Jansen
699*59599516SKenneth E. Jansenc
700*59599516SKenneth E. Jansenc... get p for the impedance BC
701*59599516SKenneth E. Jansenc
702*59599516SKenneth E. Jansen      if(numImpSrfs.gt.zero) then
703*59599516SKenneth E. Jansen        call GetFlowQ(p,y,nsrflistImp,numImpSrfs)  !Q pushed into p but at this point
704*59599516SKenneth E. Jansen                          ! p is just the full Q for each surface
705*59599516SKenneth E. Jansen        do j = 1,numImpSrfs
706*59599516SKenneth E. Jansen            if(sign.lt.zero) then ! RHS so -1
707*59599516SKenneth E. Jansen               p(j)= sign*(poldImp(j) + p(j)*ImpConvCoef(ntimeptpT+2,j))  !pressure p=pold+ Qbeta
708*59599516SKenneth E. Jansen            elseif(sign.gt.zero) then ! LHS so sign is positive
709*59599516SKenneth E. Jansen                p(j)= sign*p(j)*ImpConvCoef(ntimeptpT+2,j)
710*59599516SKenneth E. Jansen            endif
711*59599516SKenneth E. Jansen        enddo
712*59599516SKenneth E. Jansen
713*59599516SKenneth E. Jansenc
714*59599516SKenneth E. Jansenc....  multiply it by integral NA n_i
715*59599516SKenneth E. Jansenc
716*59599516SKenneth E. Jansen       do i = 1,nshg
717*59599516SKenneth E. Jansen          do k = 1,numImpSrfs
718*59599516SKenneth E. Jansen              irankCoupled = 0
719*59599516SKenneth E. Jansen              if (nsrflistImp(k).eq.ndsurf(i)) then
720*59599516SKenneth E. Jansen                  irankCoupled=k
721*59599516SKenneth E. Jansen                  res(i,1:3)=res(i,1:3) + p(irankCoupled)*NABI(i,1:3)
722*59599516SKenneth E. Jansen                  exit
723*59599516SKenneth E. Jansen              endif
724*59599516SKenneth E. Jansen          enddo
725*59599516SKenneth E. Jansen       enddo
726*59599516SKenneth E. Jansen
727*59599516SKenneth E. Jansen      endif !end of coupling for Impedance BC
728*59599516SKenneth E. Jansenc
729*59599516SKenneth E. Jansenc... get p for the RCR BC
730*59599516SKenneth E. Jansenc
731*59599516SKenneth E. Jansen      if(numRCRSrfs.gt.zero) then
732*59599516SKenneth E. Jansen        call GetFlowQ(p,y,nsrflistRCR,numRCRSrfs)  !Q pushed into p but at this point
733*59599516SKenneth E. Jansen                          ! p is just the full Q for each surface
734*59599516SKenneth E. Jansen        do j = 1,numRCRSrfs
735*59599516SKenneth E. Jansen            if(sign.lt.zero) then ! RHS so -1
736*59599516SKenneth E. Jansen                p(j)= sign*(poldRCR(j) + p(j)*RCRConvCoef(lstep+2,j)) !pressure p=pold+ Qbet
737*59599516SKenneth E. Jansen                p(j)= p(j) - HopRCR(j) ! H operator contribution
738*59599516SKenneth E. Jansen            elseif(sign.gt.zero) then ! LHS so sign is positive
739*59599516SKenneth E. Jansen                p(j)= sign*p(j)*RCRConvCoef(lstep+2,j)
740*59599516SKenneth E. Jansen            endif
741*59599516SKenneth E. Jansen        enddo
742*59599516SKenneth E. Jansen
743*59599516SKenneth E. Jansenc
744*59599516SKenneth E. Jansenc....  multiply it by integral NA n_i
745*59599516SKenneth E. Jansenc
746*59599516SKenneth E. Jansen       do i = 1,nshg
747*59599516SKenneth E. Jansen          do k = 1,numRCRSrfs
748*59599516SKenneth E. Jansen              irankCoupled = 0
749*59599516SKenneth E. Jansen              if (nsrflistRCR(k).eq.ndsurf(i)) then
750*59599516SKenneth E. Jansen                  irankCoupled=k
751*59599516SKenneth E. Jansen                  res(i,1:3)=res(i,1:3) + p(irankCoupled)*NABI(i,1:3)
752*59599516SKenneth E. Jansen                  exit
753*59599516SKenneth E. Jansen              endif
754*59599516SKenneth E. Jansen          enddo
755*59599516SKenneth E. Jansen       enddo
756*59599516SKenneth E. Jansen
757*59599516SKenneth E. Jansen      endif !end of coupling for RCR BC
758*59599516SKenneth E. Jansen
759*59599516SKenneth E. Jansen      return
760*59599516SKenneth E. Jansen      end
761*59599516SKenneth E. Jansen
762*59599516SKenneth E. Jansen
763*59599516SKenneth E. Jansen
764*59599516SKenneth E. Jansen
765*59599516SKenneth E. Jansen
766*59599516SKenneth E. Jansen
767*59599516SKenneth E. Jansen
768