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