1*59599516SKenneth E. Jansen subroutine ElmGMRe (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, EGmass, rerr) 6*59599516SKenneth E. Jansenc 7*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 8*59599516SKenneth E. Jansenc 9*59599516SKenneth E. Jansenc This routine computes the LHS mass matrix, the RHS residual 10*59599516SKenneth E. Jansenc vector, and the preconditioning matrix, for use with the GMRES 11*59599516SKenneth E. Jansenc solver. 12*59599516SKenneth E. Jansenc 13*59599516SKenneth E. Jansenc Zdenek Johan, Winter 1991. (Fortran 90) 14*59599516SKenneth E. Jansenc Chris Whiting, Winter 1998. (Matrix EBE-GMRES) 15*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 16*59599516SKenneth E. Jansenc 17*59599516SKenneth E. Jansen use pointer_data 18*59599516SKenneth E. Jansen use timedata 19*59599516SKenneth E. Jansenc 20*59599516SKenneth E. Jansen include "common.h" 21*59599516SKenneth E. Jansen include "mpif.h" 22*59599516SKenneth E. Jansenc 23*59599516SKenneth E. Jansen dimension y(nshg,ndof), ac(nshg,ndof), 24*59599516SKenneth E. Jansen & x(numnp,nsd), 25*59599516SKenneth E. Jansen & iBC(nshg), 26*59599516SKenneth E. Jansen & BC(nshg,ndofBC), 27*59599516SKenneth E. Jansen & res(nshg,nflow), 28*59599516SKenneth E. Jansen & rmes(nshg,nflow), BDiag(nshg,nflow,nflow), 29*59599516SKenneth E. Jansen & iper(nshg), EGmass(numel,nedof,nedof) 30*59599516SKenneth E. Jansenc 31*59599516SKenneth E. Jansen dimension shp(MAXTOP,maxsh,MAXQPT), 32*59599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), 33*59599516SKenneth E. Jansen & shpb(MAXTOP,maxsh,MAXQPT), 34*59599516SKenneth E. Jansen & shglb(MAXTOP,nsd,maxsh,MAXQPT) 35*59599516SKenneth E. Jansenc 36*59599516SKenneth E. Jansen dimension qres(nshg, idflx), rmass(nshg) 37*59599516SKenneth E. Jansenc 38*59599516SKenneth E. Jansen dimension ilwork(nlwork) 39*59599516SKenneth E. Jansen 40*59599516SKenneth E. Jansen real*8 Bdiagvec(nshg,nflow), rerr(nshg,10) 41*59599516SKenneth E. Jansen 42*59599516SKenneth E. Jansen real*8, allocatable :: tmpshp(:,:), tmpshgl(:,:,:) 43*59599516SKenneth E. Jansen real*8, allocatable :: tmpshpb(:,:), tmpshglb(:,:,:) 44*59599516SKenneth E. Jansen 45*59599516SKenneth E. Jansen ttim(80) = ttim(80) - secs(0.0) 46*59599516SKenneth E. Jansenc 47*59599516SKenneth E. Jansenc.... set up the timer 48*59599516SKenneth E. Jansenc 49*59599516SKenneth E. Jansen 50*59599516SKenneth E. Jansen call timer ('Elm_Form') 51*59599516SKenneth E. Jansenc 52*59599516SKenneth E. Jansenc.... --------------------> interior elements <-------------------- 53*59599516SKenneth E. Jansenc 54*59599516SKenneth E. Jansenc.... set up parameters 55*59599516SKenneth E. Jansenc 56*59599516SKenneth E. Jansen ires = 1 57*59599516SKenneth E. Jansenc 58*59599516SKenneth E. Jansen if (idiff==1 .or. idiff==3 .or. isurf==1) then ! global reconstruction 59*59599516SKenneth E. Jansen ! of qdiff 60*59599516SKenneth E. Jansenc 61*59599516SKenneth E. Jansenc loop over element blocks for the global reconstruction 62*59599516SKenneth E. Jansenc of the diffusive flux vector, q, and lumped mass matrix, rmass 63*59599516SKenneth E. Jansenc 64*59599516SKenneth E. Jansen qres = zero 65*59599516SKenneth E. Jansen rmass = zero 66*59599516SKenneth E. Jansen 67*59599516SKenneth E. Jansen do iblk = 1, nelblk 68*59599516SKenneth E. Jansenc 69*59599516SKenneth E. Jansenc.... set up the parameters 70*59599516SKenneth E. Jansenc 71*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) ! no. of vertices per element 72*59599516SKenneth E. Jansen iel = lcblk(1,iblk) 73*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 74*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 75*59599516SKenneth E. Jansen iorder = lcblk(4,iblk) 76*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) ! no. of vertices per element 77*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 78*59599516SKenneth E. Jansen mattyp = lcblk(7,iblk) 79*59599516SKenneth E. Jansen ndofl = lcblk(8,iblk) 80*59599516SKenneth E. Jansen nsymdl = lcblk(9,iblk) 81*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 82*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 83*59599516SKenneth E. Jansenc 84*59599516SKenneth E. Jansenc.... compute and assemble diffusive flux vector residual, qres, 85*59599516SKenneth E. Jansenc and lumped mass matrix, rmass 86*59599516SKenneth E. Jansen 87*59599516SKenneth E. Jansen allocate (tmpshp(nshl,MAXQPT)) 88*59599516SKenneth E. Jansen allocate (tmpshgl(nsd,nshl,MAXQPT)) 89*59599516SKenneth E. Jansen 90*59599516SKenneth E. Jansen tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:) 91*59599516SKenneth E. Jansen tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:) 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 enddo 103*59599516SKenneth E. Jansen 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. Jansenc 110*59599516SKenneth E. Jansen endif ! computation of global diffusive flux 111*59599516SKenneth E. Jansenc 112*59599516SKenneth E. Jansenc.... loop over element blocks to compute element residuals 113*59599516SKenneth E. Jansenc 114*59599516SKenneth E. Jansenc 115*59599516SKenneth E. Jansenc.... initialize the arrays 116*59599516SKenneth E. Jansenc 117*59599516SKenneth E. Jansen res = zero 118*59599516SKenneth E. Jansen rmes = zero ! to avoid trap_uninitialized 119*59599516SKenneth E. Jansen if (lhs. eq. 1) EGmass = zero 120*59599516SKenneth E. Jansen if (iprec .ne. 0) BDiag = zero 121*59599516SKenneth E. Jansen flxID = zero 122*59599516SKenneth E. Jansen 123*59599516SKenneth E. Jansenc 124*59599516SKenneth E. Jansenc.... loop over the element-blocks 125*59599516SKenneth E. Jansenc 126*59599516SKenneth E. Jansen do iblk = 1, nelblk 127*59599516SKenneth E. Jansenc 128*59599516SKenneth E. Jansenc.... set up the parameters 129*59599516SKenneth E. Jansenc 130*59599516SKenneth E. Jansen iblkts = iblk ! used in timeseries 131*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) ! no. of vertices per element 132*59599516SKenneth E. Jansen iel = lcblk(1,iblk) 133*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 134*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 135*59599516SKenneth E. Jansen iorder = lcblk(4,iblk) 136*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) ! no. of vertices per element 137*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 138*59599516SKenneth E. Jansen mattyp = lcblk(7,iblk) 139*59599516SKenneth E. Jansen ndofl = lcblk(8,iblk) 140*59599516SKenneth E. Jansen nsymdl = lcblk(9,iblk) 141*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 142*59599516SKenneth E. Jansen inum = iel + npro - 1 143*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 144*59599516SKenneth E. Jansenc 145*59599516SKenneth E. Jansenc.... compute and assemble the residual and tangent matrix 146*59599516SKenneth E. Jansenc 147*59599516SKenneth E. Jansen 148*59599516SKenneth E. Jansen allocate (tmpshp(nshl,MAXQPT)) 149*59599516SKenneth E. Jansen allocate (tmpshgl(nsd,nshl,MAXQPT)) 150*59599516SKenneth E. Jansen 151*59599516SKenneth E. Jansen tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:) 152*59599516SKenneth E. Jansen tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:) 153*59599516SKenneth E. Jansen 154*59599516SKenneth E. Jansen call AsIGMR (y, ac, 155*59599516SKenneth E. Jansen & x, mxmudmi(iblk)%p, 156*59599516SKenneth E. Jansen & tmpshp, 157*59599516SKenneth E. Jansen & tmpshgl, mien(iblk)%p, 158*59599516SKenneth E. Jansen & mmat(iblk)%p, res, 159*59599516SKenneth E. Jansen & rmes, BDiag, 160*59599516SKenneth E. Jansen & qres, EGmass(iel:inum,:,:), 161*59599516SKenneth E. Jansen & rerr) 162*59599516SKenneth E. Jansenc 163*59599516SKenneth E. Jansenc.... satisfy the BC's on the implicit LHS 164*59599516SKenneth E. Jansenc 165*59599516SKenneth E. Jansen call bc3LHS (iBC, BC, mien(iblk)%p, 166*59599516SKenneth E. Jansen & EGmass(iel:inum,:,:) ) 167*59599516SKenneth E. Jansen 168*59599516SKenneth E. Jansen deallocate ( tmpshp ) 169*59599516SKenneth E. Jansen deallocate ( tmpshgl ) 170*59599516SKenneth E. Jansenc 171*59599516SKenneth E. Jansenc.... end of interior element loop 172*59599516SKenneth E. Jansenc 173*59599516SKenneth E. Jansen enddo 174*59599516SKenneth E. Jansenc 175*59599516SKenneth E. Jansenc.... --------------------> boundary elements <-------------------- 176*59599516SKenneth E. Jansenc 177*59599516SKenneth E. Jansenc.... loop over the boundary elements 178*59599516SKenneth E. Jansenc 179*59599516SKenneth E. Jansen do iblk = 1, nelblb 180*59599516SKenneth E. Jansenc 181*59599516SKenneth E. Jansenc.... set up the parameters 182*59599516SKenneth E. Jansenc 183*59599516SKenneth E. Jansen iel = lcblkb(1,iblk) 184*59599516SKenneth E. Jansen lelCat = lcblkb(2,iblk) 185*59599516SKenneth E. Jansen lcsyst = lcblkb(3,iblk) 186*59599516SKenneth E. Jansen iorder = lcblkb(4,iblk) 187*59599516SKenneth E. Jansen nenl = lcblkb(5,iblk) ! no. of vertices per element 188*59599516SKenneth E. Jansen nenbl = lcblkb(6,iblk) ! no. of vertices per bdry. face 189*59599516SKenneth E. Jansen mattyp = lcblkb(7,iblk) 190*59599516SKenneth E. Jansen ndofl = lcblkb(8,iblk) 191*59599516SKenneth E. Jansen nshl = lcblkb(9,iblk) 192*59599516SKenneth E. Jansen nshlb = lcblkb(10,iblk) 193*59599516SKenneth E. Jansen npro = lcblkb(1,iblk+1) - iel 194*59599516SKenneth E. Jansen if(lcsyst.eq.3) lcsyst=nenbl 195*59599516SKenneth E. Jansen ngaussb = nintb(lcsyst) 196*59599516SKenneth E. Jansen 197*59599516SKenneth E. Jansenc 198*59599516SKenneth E. Jansenc.... compute and assemble the residuals corresponding to the 199*59599516SKenneth E. Jansenc boundary integral 200*59599516SKenneth E. Jansenc 201*59599516SKenneth E. Jansen 202*59599516SKenneth E. Jansen allocate (tmpshpb(nshl,MAXQPT)) 203*59599516SKenneth E. Jansen allocate (tmpshglb(nsd,nshl,MAXQPT)) 204*59599516SKenneth E. Jansen 205*59599516SKenneth E. Jansen tmpshpb(1:nshl,:) = shpb(lcsyst,1:nshl,:) 206*59599516SKenneth E. Jansen tmpshglb(:,1:nshl,:) = shglb(lcsyst,:,1:nshl,:) 207*59599516SKenneth E. Jansen 208*59599516SKenneth E. Jansen call AsBMFG (y, x, 209*59599516SKenneth E. Jansen & tmpshpb, tmpshglb, 210*59599516SKenneth E. Jansen & mienb(iblk)%p, mmatb(iblk)%p, 211*59599516SKenneth E. Jansen & miBCB(iblk)%p, mBCB(iblk)%p, 212*59599516SKenneth E. Jansen & res, rmes) 213*59599516SKenneth E. Jansen 214*59599516SKenneth E. Jansen deallocate (tmpshpb) 215*59599516SKenneth E. Jansen deallocate (tmpshglb) 216*59599516SKenneth E. Jansenc 217*59599516SKenneth E. Jansenc.... end of boundary element loop 218*59599516SKenneth E. Jansenc 219*59599516SKenneth E. Jansen enddo 220*59599516SKenneth E. Jansenc 221*59599516SKenneth E. Jansen ttim(80) = ttim(80) + secs(0.0) 222*59599516SKenneth E. Jansenc 223*59599516SKenneth E. Jansenc before the commu we need to rotate the residual vector for axisymmetric 224*59599516SKenneth E. Jansenc boundary conditions (so that off processor periodicity is a dof add instead 225*59599516SKenneth E. Jansenc of a dof combination). Take care of all nodes now so periodicity, like 226*59599516SKenneth E. Jansenc commu is a simple dof add. 227*59599516SKenneth E. Jansenc 228*59599516SKenneth E. Jansenc if(iabc==1) !are there any axisym bc's 229*59599516SKenneth E. Jansenc & call rotabc(res(1,2), iBC, BC, nflow, 'in ') 230*59599516SKenneth E. Jansen if(iabc==1) then !are there any axisym bc's 231*59599516SKenneth E. Jansen call rotabc(res(1,2), iBC, 'in ') 232*59599516SKenneth E. Jansenc Bdiagvec(:,1)=BDiag(:,1,1) 233*59599516SKenneth E. Jansenc Bdiagvec(:,2)=BDiag(:,2,2) 234*59599516SKenneth E. Jansenc Bdiagvec(:,3)=BDiag(:,3,3) 235*59599516SKenneth E. Jansenc Bdiagvec(:,4)=BDiag(:,4,4) 236*59599516SKenneth E. Jansenc Bdiagvec(:,5)=BDiag(:,5,5) 237*59599516SKenneth E. Jansenc call rotabc(Bdiagvec(1,2), iBC, BC, 2, 'in ') 238*59599516SKenneth E. Jansenc BDiag(:,:,:)=zero 239*59599516SKenneth E. Jansenc BDiag(:,1,1)=Bdiagvec(:,1) 240*59599516SKenneth E. Jansenc BDiag(:,2,2)=Bdiagvec(:,2) 241*59599516SKenneth E. Jansenc BDiag(:,3,3)=Bdiagvec(:,3) 242*59599516SKenneth E. Jansenc BDiag(:,4,4)=Bdiagvec(:,4) 243*59599516SKenneth E. Jansenc BDiag(:,5,5)=Bdiagvec(:,5) 244*59599516SKenneth E. Jansen endif 245*59599516SKenneth E. Jansen 246*59599516SKenneth E. Jansenc.... --------------------> communications <------------------------- 247*59599516SKenneth E. Jansenc 248*59599516SKenneth E. Jansen 249*59599516SKenneth E. Jansen if (numpe > 1) then 250*59599516SKenneth E. Jansen call commu (res , ilwork, nflow , 'in ') 251*59599516SKenneth E. Jansen 252*59599516SKenneth E. Jansen call MPI_BARRIER (MPI_COMM_WORLD,ierr) 253*59599516SKenneth E. Jansen 254*59599516SKenneth E. Jansen if(iprec .ne. 0) call commu (BDiag, ilwork, nflow*nflow, 'in ') 255*59599516SKenneth E. Jansen endif 256*59599516SKenneth E. Jansen 257*59599516SKenneth E. Jansenc 258*59599516SKenneth E. Jansenc.... ----------------------> post processing <---------------------- 259*59599516SKenneth E. Jansenc 260*59599516SKenneth E. Jansenc.... satisfy the BCs on the residual 261*59599516SKenneth E. Jansenc 262*59599516SKenneth E. Jansen call bc3Res (y, iBC, BC, res, iper, ilwork) 263*59599516SKenneth E. Jansenc 264*59599516SKenneth E. Jansenc.... satisfy the BCs on the block-diagonal preconditioner 265*59599516SKenneth E. Jansenc 266*59599516SKenneth E. Jansen if (iprec .ne. 0) then 267*59599516SKenneth E. Jansen call bc3BDg (y, iBC, BC, BDiag, iper, ilwork) 268*59599516SKenneth E. Jansen endif 269*59599516SKenneth E. Jansenc 270*59599516SKenneth E. Jansenc.... return 271*59599516SKenneth E. Jansenc 272*59599516SKenneth E. Jansen call timer ('Back ') 273*59599516SKenneth E. Jansen return 274*59599516SKenneth E. Jansen end 275*59599516SKenneth E. Jansenc 276*59599516SKenneth E. Jansencccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 277*59599516SKenneth E. Jansenccccccccccccc SPARSE 278*59599516SKenneth E. Jansenc_______________________________________________________________ 279*59599516SKenneth E. Jansen 280*59599516SKenneth E. Jansen subroutine ElmGMRs (y, ac, x, 281*59599516SKenneth E. Jansen & shp, shgl, iBC, 282*59599516SKenneth E. Jansen & BC, shpb, shglb, 283*59599516SKenneth E. Jansen & res, rmes, BDiag, 284*59599516SKenneth E. Jansen & iper, ilwork, lhsK, 285*59599516SKenneth E. Jansen & col, row, rerr) 286*59599516SKenneth E. Jansenc 287*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 288*59599516SKenneth E. Jansenc 289*59599516SKenneth E. Jansenc This routine computes the LHS mass matrix, the RHS residual 290*59599516SKenneth E. Jansenc vector, and the preconditioning matrix, for use with the GMRES 291*59599516SKenneth E. Jansenc solver. 292*59599516SKenneth E. Jansenc 293*59599516SKenneth E. Jansenc Zdenek Johan, Winter 1991. (Fortran 90) 294*59599516SKenneth E. Jansenc Chris Whiting, Winter 1998. (Matrix EBE-GMRES) 295*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 296*59599516SKenneth E. Jansenc 297*59599516SKenneth E. Jansen use pointer_data 298*59599516SKenneth E. Jansen use timedata 299*59599516SKenneth E. Jansenc 300*59599516SKenneth E. Jansen include "common.h" 301*59599516SKenneth E. Jansen include "mpif.h" 302*59599516SKenneth E. Jansenc 303*59599516SKenneth E. Jansen integer col(nshg+1), row(nnz*nshg) 304*59599516SKenneth E. Jansen real*8 lhsK(nflow*nflow,nnz_tot) 305*59599516SKenneth E. Jansen 306*59599516SKenneth E. Jansen dimension y(nshg,ndof), ac(nshg,ndof), 307*59599516SKenneth E. Jansen & x(numnp,nsd), 308*59599516SKenneth E. Jansen & iBC(nshg), 309*59599516SKenneth E. Jansen & BC(nshg,ndofBC), 310*59599516SKenneth E. Jansen & res(nshg,nflow), 311*59599516SKenneth E. Jansen & rmes(nshg,nflow), BDiag(nshg,nflow,nflow), 312*59599516SKenneth E. Jansen & iper(nshg) 313*59599516SKenneth E. Jansenc 314*59599516SKenneth E. Jansen dimension shp(MAXTOP,maxsh,MAXQPT), 315*59599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), 316*59599516SKenneth E. Jansen & shpb(MAXTOP,maxsh,MAXQPT), 317*59599516SKenneth E. Jansen & shglb(MAXTOP,nsd,maxsh,MAXQPT) 318*59599516SKenneth E. Jansenc 319*59599516SKenneth E. Jansen dimension qres(nshg, idflx), rmass(nshg) 320*59599516SKenneth E. Jansenc 321*59599516SKenneth E. Jansen dimension ilwork(nlwork) 322*59599516SKenneth E. Jansen 323*59599516SKenneth E. Jansen real*8 Bdiagvec(nshg,nflow), rerr(nshg,10) 324*59599516SKenneth E. Jansen 325*59599516SKenneth E. Jansen real*8, allocatable :: tmpshp(:,:), tmpshgl(:,:,:) 326*59599516SKenneth E. Jansen real*8, allocatable :: tmpshpb(:,:), tmpshglb(:,:,:) 327*59599516SKenneth E. Jansen real*8, allocatable :: EGmass(:,:,:) 328*59599516SKenneth E. Jansen ttim(80) = ttim(80) - secs(0.0) 329*59599516SKenneth E. Jansenc 330*59599516SKenneth E. Jansenc.... set up the timer 331*59599516SKenneth E. Jansenc 332*59599516SKenneth E. Jansen 333*59599516SKenneth E. Jansen call timer ('Elm_Form') 334*59599516SKenneth E. Jansenc 335*59599516SKenneth E. Jansenc.... --------------------> interior elements <-------------------- 336*59599516SKenneth E. Jansenc 337*59599516SKenneth E. Jansenc.... set up parameters 338*59599516SKenneth E. Jansenc 339*59599516SKenneth E. Jansen ires = 1 340*59599516SKenneth E. Jansenc 341*59599516SKenneth E. Jansen if (idiff==1 .or. idiff==3 .or. isurf==1) then ! global reconstruction 342*59599516SKenneth E. Jansen ! of qdiff 343*59599516SKenneth E. Jansenc 344*59599516SKenneth E. Jansenc loop over element blocks for the global reconstruction 345*59599516SKenneth E. Jansenc of the diffusive flux vector, q, and lumped mass matrix, rmass 346*59599516SKenneth E. Jansenc 347*59599516SKenneth E. Jansen qres = zero 348*59599516SKenneth E. Jansen rmass = zero 349*59599516SKenneth E. Jansen 350*59599516SKenneth E. Jansen do iblk = 1, nelblk 351*59599516SKenneth E. Jansenc 352*59599516SKenneth E. Jansenc.... set up the parameters 353*59599516SKenneth E. Jansenc 354*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) ! no. of vertices per element 355*59599516SKenneth E. Jansen iel = lcblk(1,iblk) 356*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 357*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 358*59599516SKenneth E. Jansen iorder = lcblk(4,iblk) 359*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) ! no. of vertices per element 360*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 361*59599516SKenneth E. Jansen mattyp = lcblk(7,iblk) 362*59599516SKenneth E. Jansen ndofl = lcblk(8,iblk) 363*59599516SKenneth E. Jansen nsymdl = lcblk(9,iblk) 364*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 365*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 366*59599516SKenneth E. Jansenc 367*59599516SKenneth E. Jansenc.... compute and assemble diffusive flux vector residual, qres, 368*59599516SKenneth E. Jansenc and lumped mass matrix, rmass 369*59599516SKenneth E. Jansen 370*59599516SKenneth E. Jansen allocate (tmpshp(nshl,MAXQPT)) 371*59599516SKenneth E. Jansen allocate (tmpshgl(nsd,nshl,MAXQPT)) 372*59599516SKenneth E. Jansen 373*59599516SKenneth E. Jansen tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:) 374*59599516SKenneth E. Jansen tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:) 375*59599516SKenneth E. Jansen 376*59599516SKenneth E. Jansen call AsIq (y, x, 377*59599516SKenneth E. Jansen & tmpshp, 378*59599516SKenneth E. Jansen & tmpshgl, 379*59599516SKenneth E. Jansen & mien(iblk)%p, mxmudmi(iblk)%p, 380*59599516SKenneth E. Jansen & qres, 381*59599516SKenneth E. Jansen & rmass) 382*59599516SKenneth E. Jansen 383*59599516SKenneth E. Jansen deallocate ( tmpshp ) 384*59599516SKenneth E. Jansen deallocate ( tmpshgl ) 385*59599516SKenneth E. Jansen enddo 386*59599516SKenneth E. Jansen 387*59599516SKenneth E. Jansenc 388*59599516SKenneth E. Jansenc.... take care of periodic boundary conditions 389*59599516SKenneth E. Jansenc 390*59599516SKenneth E. Jansen 391*59599516SKenneth E. Jansen call qpbc( rmass, qres, iBC, iper, ilwork ) 392*59599516SKenneth E. Jansenc 393*59599516SKenneth E. Jansen endif ! computation of global diffusive flux 394*59599516SKenneth E. Jansenc 395*59599516SKenneth E. Jansenc.... loop over element blocks to compute element residuals 396*59599516SKenneth E. Jansenc 397*59599516SKenneth E. Jansenc 398*59599516SKenneth E. Jansenc.... initialize the arrays 399*59599516SKenneth E. Jansenc 400*59599516SKenneth E. Jansen res = zero 401*59599516SKenneth E. Jansen rmes = zero ! to avoid trap_uninitialized 402*59599516SKenneth E. Jansen if (lhs. eq. 1) lhsK = zero 403*59599516SKenneth E. Jansen if (iprec .ne. 0) BDiag = zero 404*59599516SKenneth E. Jansen flxID = zero 405*59599516SKenneth E. Jansenc 406*59599516SKenneth E. Jansenc.... loop over the element-blocks 407*59599516SKenneth E. Jansenc 408*59599516SKenneth E. Jansen do iblk = 1, nelblk 409*59599516SKenneth E. Jansenc 410*59599516SKenneth E. Jansenc.... set up the parameters 411*59599516SKenneth E. Jansenc 412*59599516SKenneth E. Jansen iblkts = iblk ! used in timeseries 413*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) ! no. of vertices per element 414*59599516SKenneth E. Jansen iel = lcblk(1,iblk) 415*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 416*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 417*59599516SKenneth E. Jansen iorder = lcblk(4,iblk) 418*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) ! no. of vertices per element 419*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 420*59599516SKenneth E. Jansen mattyp = lcblk(7,iblk) 421*59599516SKenneth E. Jansen ndofl = lcblk(8,iblk) 422*59599516SKenneth E. Jansen nsymdl = lcblk(9,iblk) 423*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 424*59599516SKenneth E. Jansen inum = iel + npro - 1 425*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 426*59599516SKenneth E. Jansenc 427*59599516SKenneth E. Jansenc.... compute and assemble the residual and tangent matrix 428*59599516SKenneth E. Jansenc 429*59599516SKenneth E. Jansen 430*59599516SKenneth E. Jansen if(lhs.eq.1) then 431*59599516SKenneth E. Jansen allocate (EGmass(npro,nedof,nedof)) 432*59599516SKenneth E. Jansen EGmass = zero 433*59599516SKenneth E. Jansen else 434*59599516SKenneth E. Jansen allocate (EGmass(1,1,1)) 435*59599516SKenneth E. Jansen endif 436*59599516SKenneth E. Jansen 437*59599516SKenneth E. Jansen allocate (tmpshp(nshl,MAXQPT)) 438*59599516SKenneth E. Jansen allocate (tmpshgl(nsd,nshl,MAXQPT)) 439*59599516SKenneth E. Jansen tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:) 440*59599516SKenneth E. Jansen tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:) 441*59599516SKenneth E. Jansen 442*59599516SKenneth E. Jansen call AsIGMR (y, ac, 443*59599516SKenneth E. Jansen & x, mxmudmi(iblk)%p, 444*59599516SKenneth E. Jansen & tmpshp, 445*59599516SKenneth E. Jansen & tmpshgl, mien(iblk)%p, 446*59599516SKenneth E. Jansen & mmat(iblk)%p, res, 447*59599516SKenneth E. Jansen & rmes, BDiag, 448*59599516SKenneth E. Jansen & qres, EGmass, 449*59599516SKenneth E. Jansen & rerr ) 450*59599516SKenneth E. Jansen if(lhs.eq.1) then 451*59599516SKenneth E. Jansenc 452*59599516SKenneth E. Jansenc.... satisfy the BC's on the implicit LHS 453*59599516SKenneth E. Jansenc 454*59599516SKenneth E. Jansen call bc3LHS (iBC, BC, mien(iblk)%p, 455*59599516SKenneth E. Jansen & EGmass ) 456*59599516SKenneth E. Jansen 457*59599516SKenneth E. Jansenc 458*59599516SKenneth E. Jansenc.... Fill-up the global sparse LHS mass matrix 459*59599516SKenneth E. Jansenc 460*59599516SKenneth E. Jansen call fillsparseC( mien(iblk)%p, EGmass, 461*59599516SKenneth E. Jansen 1 lhsK, row, col) 462*59599516SKenneth E. Jansen endif 463*59599516SKenneth E. Jansenc 464*59599516SKenneth E. Jansen deallocate ( EGmass ) 465*59599516SKenneth E. Jansen deallocate ( tmpshp ) 466*59599516SKenneth E. Jansen deallocate ( tmpshgl ) 467*59599516SKenneth E. Jansenc 468*59599516SKenneth E. Jansenc.... end of interior element loop 469*59599516SKenneth E. Jansenc 470*59599516SKenneth E. Jansen enddo 471*59599516SKenneth E. Jansenc 472*59599516SKenneth E. Jansenc.... --------------------> boundary elements <-------------------- 473*59599516SKenneth E. Jansenc 474*59599516SKenneth E. Jansenc.... loop over the boundary elements 475*59599516SKenneth E. Jansenc 476*59599516SKenneth E. Jansen do iblk = 1, nelblb 477*59599516SKenneth E. Jansenc 478*59599516SKenneth E. Jansenc.... set up the parameters 479*59599516SKenneth E. Jansenc 480*59599516SKenneth E. Jansen iel = lcblkb(1,iblk) 481*59599516SKenneth E. Jansen lelCat = lcblkb(2,iblk) 482*59599516SKenneth E. Jansen lcsyst = lcblkb(3,iblk) 483*59599516SKenneth E. Jansen iorder = lcblkb(4,iblk) 484*59599516SKenneth E. Jansen nenl = lcblkb(5,iblk) ! no. of vertices per element 485*59599516SKenneth E. Jansen nenbl = lcblkb(6,iblk) ! no. of vertices per bdry. face 486*59599516SKenneth E. Jansen mattyp = lcblkb(7,iblk) 487*59599516SKenneth E. Jansen ndofl = lcblkb(8,iblk) 488*59599516SKenneth E. Jansen nshl = lcblkb(9,iblk) 489*59599516SKenneth E. Jansen nshlb = lcblkb(10,iblk) 490*59599516SKenneth E. Jansen npro = lcblkb(1,iblk+1) - iel 491*59599516SKenneth E. Jansen if(lcsyst.eq.3) lcsyst=nenbl 492*59599516SKenneth E. Jansen ngaussb = nintb(lcsyst) 493*59599516SKenneth E. Jansen 494*59599516SKenneth E. Jansenc 495*59599516SKenneth E. Jansenc.... compute and assemble the residuals corresponding to the 496*59599516SKenneth E. Jansenc boundary integral 497*59599516SKenneth E. Jansenc 498*59599516SKenneth E. Jansen 499*59599516SKenneth E. Jansen allocate (tmpshpb(nshl,MAXQPT)) 500*59599516SKenneth E. Jansen allocate (tmpshglb(nsd,nshl,MAXQPT)) 501*59599516SKenneth E. Jansen 502*59599516SKenneth E. Jansen tmpshpb(1:nshl,:) = shpb(lcsyst,1:nshl,:) 503*59599516SKenneth E. Jansen tmpshglb(:,1:nshl,:) = shglb(lcsyst,:,1:nshl,:) 504*59599516SKenneth E. Jansen 505*59599516SKenneth E. Jansen call AsBMFG (y, x, 506*59599516SKenneth E. Jansen & tmpshpb, tmpshglb, 507*59599516SKenneth E. Jansen & mienb(iblk)%p, mmatb(iblk)%p, 508*59599516SKenneth E. Jansen & miBCB(iblk)%p, mBCB(iblk)%p, 509*59599516SKenneth E. Jansen & res, rmes) 510*59599516SKenneth E. Jansen 511*59599516SKenneth E. Jansen deallocate (tmpshpb) 512*59599516SKenneth E. Jansen deallocate (tmpshglb) 513*59599516SKenneth E. Jansenc 514*59599516SKenneth E. Jansenc.... end of boundary element loop 515*59599516SKenneth E. Jansenc 516*59599516SKenneth E. Jansen enddo 517*59599516SKenneth E. Jansenc 518*59599516SKenneth E. Jansen ttim(80) = ttim(80) + secs(0.0) 519*59599516SKenneth E. Jansenc 520*59599516SKenneth E. Jansenc before the commu we need to rotate the residual vector for axisymmetric 521*59599516SKenneth E. Jansenc boundary conditions (so that off processor periodicity is a dof add instead 522*59599516SKenneth E. Jansenc of a dof combination). Take care of all nodes now so periodicity, like 523*59599516SKenneth E. Jansenc commu is a simple dof add. 524*59599516SKenneth E. Jansenc 525*59599516SKenneth E. Jansen if(iabc==1) then !are there any axisym bc's 526*59599516SKenneth E. Jansen call rotabc(res(1,2), iBC, 'in ') 527*59599516SKenneth E. Jansenc Bdiagvec(:,1)=BDiag(:,1,1) 528*59599516SKenneth E. Jansenc Bdiagvec(:,2)=BDiag(:,2,2) 529*59599516SKenneth E. Jansenc Bdiagvec(:,3)=BDiag(:,3,3) 530*59599516SKenneth E. Jansenc Bdiagvec(:,4)=BDiag(:,4,4) 531*59599516SKenneth E. Jansenc Bdiagvec(:,5)=BDiag(:,5,5) 532*59599516SKenneth E. Jansenc call rotabc(Bdiagvec(1,2), iBC, 'in ') 533*59599516SKenneth E. Jansenc BDiag(:,:,:)=zero 534*59599516SKenneth E. Jansenc BDiag(:,1,1)=Bdiagvec(:,1) 535*59599516SKenneth E. Jansenc BDiag(:,2,2)=Bdiagvec(:,2) 536*59599516SKenneth E. Jansenc BDiag(:,3,3)=Bdiagvec(:,3) 537*59599516SKenneth E. Jansenc BDiag(:,4,4)=Bdiagvec(:,4) 538*59599516SKenneth E. Jansenc BDiag(:,5,5)=Bdiagvec(:,5) 539*59599516SKenneth E. Jansen endif 540*59599516SKenneth E. Jansen 541*59599516SKenneth E. Jansenc.... --------------------> communications <------------------------- 542*59599516SKenneth E. Jansenc 543*59599516SKenneth E. Jansen 544*59599516SKenneth E. Jansen if (numpe > 1) then 545*59599516SKenneth E. Jansen call commu (res , ilwork, nflow , 'in ') 546*59599516SKenneth E. Jansen 547*59599516SKenneth E. Jansen call MPI_BARRIER (MPI_COMM_WORLD,ierr) 548*59599516SKenneth E. Jansen 549*59599516SKenneth E. Jansen if(iprec .ne. 0) call commu (BDiag, ilwork, nflow*nflow, 'in ') 550*59599516SKenneth E. Jansen endif 551*59599516SKenneth E. Jansen 552*59599516SKenneth E. Jansenc 553*59599516SKenneth E. Jansenc.... ----------------------> post processing <---------------------- 554*59599516SKenneth E. Jansenc 555*59599516SKenneth E. Jansenc.... satisfy the BCs on the residual 556*59599516SKenneth E. Jansenc 557*59599516SKenneth E. Jansen call bc3Res (y, iBC, BC, res, iper, ilwork) 558*59599516SKenneth E. Jansenc 559*59599516SKenneth E. Jansenc.... satisfy the BCs on the block-diagonal preconditioner 560*59599516SKenneth E. Jansenc 561*59599516SKenneth E. Jansenc This code fragment would extract the "on processor diagonal 562*59599516SKenneth E. Jansenc blocks". lhsK alread has the BC's applied to it (using BC3lhs), 563*59599516SKenneth E. Jansenc though it was on an ebe basis. For now, we forgo this and still 564*59599516SKenneth E. Jansenc form BDiag before BC3lhs, leaving the need to still apply BC's 565*59599516SKenneth E. Jansenc below. Keep in mind that if we used the code fragment below we 566*59599516SKenneth E. Jansenc would still need to make BDiag periodic since BC3lhs did not do 567*59599516SKenneth E. Jansenc that part. 568*59599516SKenneth E. Jansenc 569*59599516SKenneth E. Jansen if (iprec .ne. 0) then 570*59599516SKenneth E. Jansenc$$$ do iaa=1,nshg 571*59599516SKenneth E. Jansenc$$$ k = sparseloc( row(col(iaa)), col(iaa+1)-colm(iaa), iaa ) 572*59599516SKenneth E. Jansenc$$$ & + colm(iaa)-1 573*59599516SKenneth E. Jansenc$$$ do idof=1,nflow 574*59599516SKenneth E. Jansenc$$$ do jdof=1,nflow 575*59599516SKenneth E. Jansenc$$$ idx=idof+(jdof-1)*nflow 576*59599516SKenneth E. Jansenc$$$ BDiag(iaa,idof,jdof)=lhsK(idx,k) 577*59599516SKenneth E. Jansenc$$$ enddo 578*59599516SKenneth E. Jansenc$$$ enddo 579*59599516SKenneth E. Jansenc$$$ enddo 580*59599516SKenneth E. Jansen call bc3BDg (y, iBC, BC, BDiag, iper, ilwork) 581*59599516SKenneth E. Jansen endif 582*59599516SKenneth E. Jansenc 583*59599516SKenneth E. Jansenc.... return 584*59599516SKenneth E. Jansenc 585*59599516SKenneth E. Jansen call timer ('Back ') 586*59599516SKenneth E. Jansen return 587*59599516SKenneth E. Jansen end 588*59599516SKenneth E. Jansenc 589*59599516SKenneth E. Jansenc 590*59599516SKenneth E. Jansen 591*59599516SKenneth E. Jansenc 592*59599516SKenneth E. Jansen subroutine ElmGMRSclr(y, ac, 593*59599516SKenneth E. Jansen & x, elDw, 594*59599516SKenneth E. Jansen & shp, shgl, iBC, 595*59599516SKenneth E. Jansen & BC, shpb, shglb, 596*59599516SKenneth E. Jansen & rest, rmest, Diag, 597*59599516SKenneth E. Jansen & iper, ilwork, EGmasst) 598*59599516SKenneth E. Jansenc 599*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 600*59599516SKenneth E. Jansenc 601*59599516SKenneth E. Jansenc This routine computes the LHS mass matrix, the RHS residual 602*59599516SKenneth E. Jansenc vector, and the preconditioning matrix, for use with the GMRES 603*59599516SKenneth E. Jansenc solver. 604*59599516SKenneth E. Jansenc 605*59599516SKenneth E. Jansenc Zdenek Johan, Winter 1991. (Fortran 90) 606*59599516SKenneth E. Jansenc Chris Whiting, Winter 1998. (Matrix EBE-GMRES) 607*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 608*59599516SKenneth E. Jansenc 609*59599516SKenneth E. Jansen use pointer_data 610*59599516SKenneth E. Jansenc 611*59599516SKenneth E. Jansen include "common.h" 612*59599516SKenneth E. Jansen include "mpif.h" 613*59599516SKenneth E. Jansenc 614*59599516SKenneth E. Jansen dimension y(nshg,ndof), ac(nshg,ndof), 615*59599516SKenneth E. Jansen & x(numnp,nsd), 616*59599516SKenneth E. Jansen & iBC(nshg), 617*59599516SKenneth E. Jansen & BC(nshg,ndofBC), 618*59599516SKenneth E. Jansen & rest(nshg), Diag(nshg), 619*59599516SKenneth E. Jansen & rmest(nshg), BDiag(nshg,nflow,nflow), 620*59599516SKenneth E. Jansen & iper(nshg), EGmasst(numel,nshape,nshape) 621*59599516SKenneth E. Jansenc 622*59599516SKenneth E. Jansen dimension shp(MAXTOP,maxsh,MAXQPT), 623*59599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), 624*59599516SKenneth E. Jansen & shpb(MAXTOP,maxsh,MAXQPT), 625*59599516SKenneth E. Jansen & shglb(MAXTOP,nsd,maxsh,MAXQPT) 626*59599516SKenneth E. Jansenc 627*59599516SKenneth E. Jansen dimension qrest(nshg), rmasst(nshg) 628*59599516SKenneth E. Jansenc 629*59599516SKenneth E. Jansen dimension ilwork(nlwork) 630*59599516SKenneth E. Jansen dimension elDw(numel) 631*59599516SKenneth E. Jansenc 632*59599516SKenneth E. Jansen real*8, allocatable :: tmpshp(:,:), tmpshgl(:,:,:) 633*59599516SKenneth E. Jansen real*8, allocatable :: tmpshpb(:,:), tmpshglb(:,:,:) 634*59599516SKenneth E. Jansen real*8, allocatable :: elDwl(:) 635*59599516SKenneth E. Jansenc 636*59599516SKenneth E. Jansen ttim(80) = ttim(80) - tmr() 637*59599516SKenneth E. Jansenc 638*59599516SKenneth E. Jansenc.... set up the timer 639*59599516SKenneth E. Jansenc 640*59599516SKenneth E. Jansen 641*59599516SKenneth E. Jansen call timer ('Elm_Form') 642*59599516SKenneth E. Jansenc 643*59599516SKenneth E. Jansenc.... --------------------> interior elements <-------------------- 644*59599516SKenneth E. Jansenc 645*59599516SKenneth E. Jansenc.... set up parameters 646*59599516SKenneth E. Jansenc 647*59599516SKenneth E. Jansen intrul = intg (1,itseq) 648*59599516SKenneth E. Jansen intind = intpt (intrul) 649*59599516SKenneth E. Jansenc 650*59599516SKenneth E. Jansen ires = 1 651*59599516SKenneth E. Jansen 652*59599516SKenneth E. Jansenc if (idiff>=1) then ! global reconstruction of qdiff 653*59599516SKenneth E. Jansenc 654*59599516SKenneth E. Jansenc loop over element blocks for the global reconstruction 655*59599516SKenneth E. Jansenc of the diffusive flux vector, q, and lumped mass matrix, rmass 656*59599516SKenneth E. Jansenc 657*59599516SKenneth E. Jansenc qrest = zero 658*59599516SKenneth E. Jansenc rmasst = zero 659*59599516SKenneth E. Jansenc 660*59599516SKenneth E. Jansenc do iblk = 1, nelblk 661*59599516SKenneth E. Jansenc 662*59599516SKenneth E. Jansenc.... set up the parameters 663*59599516SKenneth E. Jansenc 664*59599516SKenneth E. Jansenc iel = lcblk(1,iblk) 665*59599516SKenneth E. Jansenc lelCat = lcblk(2,iblk) 666*59599516SKenneth E. Jansenc lcsyst = lcblk(3,iblk) 667*59599516SKenneth E. Jansenc iorder = lcblk(4,iblk) 668*59599516SKenneth E. Jansenc nenl = lcblk(5,iblk) ! no. of vertices per element 669*59599516SKenneth E. Jansenc mattyp = lcblk(7,iblk) 670*59599516SKenneth E. Jansenc ndofl = lcblk(8,iblk) 671*59599516SKenneth E. Jansenc nsymdl = lcblk(9,iblk) 672*59599516SKenneth E. Jansenc npro = lcblk(1,iblk+1) - iel 673*59599516SKenneth E. Jansenc 674*59599516SKenneth E. Jansenc nintg = numQpt (nsd,intrul,lcsyst) 675*59599516SKenneth E. Jansenc 676*59599516SKenneth E. Jansenc 677*59599516SKenneth E. Jansenc.... compute and assemble diffusive flux vector residual, qres, 678*59599516SKenneth E. Jansenc and lumped mass matrix, rmass 679*59599516SKenneth E. Jansenc 680*59599516SKenneth E. Jansenc call AsIq (y, x, 681*59599516SKenneth E. Jansenc & shp(1,intind,lelCat), 682*59599516SKenneth E. Jansenc & shgl(1,intind,lelCat), 683*59599516SKenneth E. Jansenc & mien(iblk)%p, mxmudmi(iblk)%p, 684*59599516SKenneth E. Jansenc & qres, rmass ) 685*59599516SKenneth E. Jansenc 686*59599516SKenneth E. Jansenc enddo 687*59599516SKenneth E. Jansenc 688*59599516SKenneth E. Jansenc 689*59599516SKenneth E. Jansenc.... compute qi for node A, i.e., qres <-- qres/rmass 690*59599516SKenneth E. Jansenc 691*59599516SKenneth E. Jansenc if (numpe > 1) then 692*59599516SKenneth E. Jansenc call commu (qres , ilwork, (ndof-1)*nsd , 'in ') 693*59599516SKenneth E. Jansenc call commu (rmass , ilwork, 1 , 'in ') 694*59599516SKenneth E. Jansenc endif 695*59599516SKenneth E. Jansenc 696*59599516SKenneth E. Jansenc.... take care of periodic boundary conditions 697*59599516SKenneth E. Jansenc 698*59599516SKenneth E. Jansenc call qpbc( rmass, qres, iBC, iper ) 699*59599516SKenneth E. Jansenc 700*59599516SKenneth E. Jansenc rmass = one/rmass 701*59599516SKenneth E. Jansenc 702*59599516SKenneth E. Jansenc do i=1, (nflow-1)*nsd 703*59599516SKenneth E. Jansenc qres(:,i) = rmass*qres(:,i) 704*59599516SKenneth E. Jansenc enddo 705*59599516SKenneth E. Jansenc 706*59599516SKenneth E. Jansenc if(numpe > 1) then 707*59599516SKenneth E. Jansenc call commu (qres, ilwork, (nflow-1)*nsd, 'out') 708*59599516SKenneth E. Jansenc endif 709*59599516SKenneth E. Jansenc 710*59599516SKenneth E. Jansenc endif ! computation of global diffusive flux 711*59599516SKenneth E. Jansenc 712*59599516SKenneth E. Jansenc.... loop over element blocks to compute element residuals 713*59599516SKenneth E. Jansenc 714*59599516SKenneth E. Jansenc 715*59599516SKenneth E. Jansenc.... initialize the arrays 716*59599516SKenneth E. Jansenc 717*59599516SKenneth E. Jansen rest = zero 718*59599516SKenneth E. Jansen rmest = zero ! to avoid trap_uninitialized 719*59599516SKenneth E. Jansen if (lhs .eq. 1) EGmasst = zero 720*59599516SKenneth E. Jansen if (iprec. ne. 0) Diag = zero 721*59599516SKenneth E. Jansenc 722*59599516SKenneth E. Jansenc.... loop over the element-blocks 723*59599516SKenneth E. Jansenc 724*59599516SKenneth E. Jansen do iblk = 1, nelblk 725*59599516SKenneth E. Jansenc 726*59599516SKenneth E. Jansenc 727*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) ! no. of vertices per element 728*59599516SKenneth E. Jansen iel = lcblk(1,iblk) 729*59599516SKenneth E. Jansen lelCat = lcblk(2,iblk) 730*59599516SKenneth E. Jansen lcsyst = lcblk(3,iblk) 731*59599516SKenneth E. Jansen iorder = lcblk(4,iblk) 732*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) ! no. of vertices per element 733*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 734*59599516SKenneth E. Jansen mattyp = lcblk(7,iblk) 735*59599516SKenneth E. Jansen ndofl = lcblk(8,iblk) 736*59599516SKenneth E. Jansen nsymdl = lcblk(9,iblk) 737*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 738*59599516SKenneth E. Jansen inum = iel + npro - 1 739*59599516SKenneth E. Jansen ngauss = nint(lcsyst) 740*59599516SKenneth E. Jansenc 741*59599516SKenneth E. Jansenc.... compute and assemble the residual and tangent matrix 742*59599516SKenneth E. Jansenc 743*59599516SKenneth E. Jansen allocate (tmpshp(nshl,MAXQPT)) 744*59599516SKenneth E. Jansen allocate (tmpshgl(nsd,nshl,MAXQPT)) 745*59599516SKenneth E. Jansen 746*59599516SKenneth E. Jansen tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:) 747*59599516SKenneth E. Jansen tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:) 748*59599516SKenneth E. Jansen 749*59599516SKenneth E. Jansen allocate (elDwl(npro)) 750*59599516SKenneth E. Jansenc 751*59599516SKenneth E. Jansen call AsIGMRSclr(y, 752*59599516SKenneth E. Jansen & ac, 753*59599516SKenneth E. Jansen & x, elDwl, 754*59599516SKenneth E. Jansen & tmpshp, tmpshgl, 755*59599516SKenneth E. Jansen & mien(iblk)%p, 756*59599516SKenneth E. Jansen & mmat(iblk)%p, rest, 757*59599516SKenneth E. Jansen & rmest, 758*59599516SKenneth E. Jansen & qrest, EGmasst(iel:inum,:,:), 759*59599516SKenneth E. Jansen & Diag ) 760*59599516SKenneth E. Jansenc 761*59599516SKenneth E. Jansen 762*59599516SKenneth E. Jansenc.... satisfy the BC's on the implicit LHS 763*59599516SKenneth E. Jansenc 764*59599516SKenneth E. Jansen call bc3LHSSclr (iBC, mien(iblk)%p, EGmasst(iel:inum,:,:) ) 765*59599516SKenneth E. Jansenc 766*59599516SKenneth E. Jansen elDw(iel:iel+npro)=elDwl(1:npro) 767*59599516SKenneth E. Jansen deallocate ( elDwl ) 768*59599516SKenneth E. Jansen deallocate ( tmpshp ) 769*59599516SKenneth E. Jansen deallocate ( tmpshgl ) 770*59599516SKenneth E. Jansenc.... end of interior element loop 771*59599516SKenneth E. Jansenc 772*59599516SKenneth E. Jansen enddo 773*59599516SKenneth E. Jansenc 774*59599516SKenneth E. Jansenc.... --------------------> boundary elements <-------------------- 775*59599516SKenneth E. Jansenc 776*59599516SKenneth E. Jansenc.... set up parameters 777*59599516SKenneth E. Jansenc 778*59599516SKenneth E. Jansen intrul = intg (2,itseq) 779*59599516SKenneth E. Jansen intind = intptb (intrul) 780*59599516SKenneth E. Jansenc 781*59599516SKenneth E. Jansenc.... loop over the boundary elements 782*59599516SKenneth E. Jansenc 783*59599516SKenneth E. Jansen do iblk = 1, nelblb 784*59599516SKenneth E. Jansenc 785*59599516SKenneth E. Jansenc.... set up the parameters 786*59599516SKenneth E. Jansenc 787*59599516SKenneth E. Jansen iel = lcblkb(1,iblk) 788*59599516SKenneth E. Jansen lelCat = lcblkb(2,iblk) 789*59599516SKenneth E. Jansen lcsyst = lcblkb(3,iblk) 790*59599516SKenneth E. Jansen iorder = lcblkb(4,iblk) 791*59599516SKenneth E. Jansen nenl = lcblkb(5,iblk) ! no. of vertices per element 792*59599516SKenneth E. Jansen nenbl = lcblkb(6,iblk) ! no. of vertices per bdry. face 793*59599516SKenneth E. Jansen mattyp = lcblkb(7,iblk) 794*59599516SKenneth E. Jansen ndofl = lcblkb(8,iblk) 795*59599516SKenneth E. Jansen nshl = lcblkb(9,iblk) 796*59599516SKenneth E. Jansen nshlb = lcblkb(10,iblk) 797*59599516SKenneth E. Jansen npro = lcblkb(1,iblk+1) - iel 798*59599516SKenneth E. Jansen if(lcsyst.eq.3) lcsyst=nenbl 799*59599516SKenneth E. Jansen ngaussb = nintb(lcsyst) 800*59599516SKenneth E. Jansenc 801*59599516SKenneth E. Jansenc.... compute and assemble the residuals corresponding to the 802*59599516SKenneth E. Jansenc boundary integral 803*59599516SKenneth E. Jansenc 804*59599516SKenneth E. Jansen 805*59599516SKenneth E. Jansen allocate (tmpshpb(nshl,MAXQPT)) 806*59599516SKenneth E. Jansen allocate (tmpshglb(nsd,nshl,MAXQPT)) 807*59599516SKenneth E. Jansen 808*59599516SKenneth E. Jansen tmpshpb(1:nshl,:) = shpb(lcsyst,1:nshl,:) 809*59599516SKenneth E. Jansen tmpshglb(:,1:nshl,:) = shglb(lcsyst,:,1:nshl,:) 810*59599516SKenneth E. Jansenc 811*59599516SKenneth E. Jansen call AsBMFGSclr (y, x, 812*59599516SKenneth E. Jansen & tmpshpb, 813*59599516SKenneth E. Jansen & tmpshglb, 814*59599516SKenneth E. Jansen & mienb(iblk)%p, mmatb(iblk)%p, 815*59599516SKenneth E. Jansen & miBCB(iblk)%p, mBCB(iblk)%p, 816*59599516SKenneth E. Jansen & rest, rmest) 817*59599516SKenneth E. Jansenc 818*59599516SKenneth E. Jansen deallocate ( tmpshpb ) 819*59599516SKenneth E. Jansen deallocate ( tmpshglb ) 820*59599516SKenneth E. Jansen 821*59599516SKenneth E. Jansenc.... end of boundary element loop 822*59599516SKenneth E. Jansenc 823*59599516SKenneth E. Jansen enddo 824*59599516SKenneth E. Jansen 825*59599516SKenneth E. Jansen 826*59599516SKenneth E. Jansen ttim(80) = ttim(80) + tmr() 827*59599516SKenneth E. Jansenc 828*59599516SKenneth E. Jansenc.... --------------------> communications <------------------------- 829*59599516SKenneth E. Jansenc 830*59599516SKenneth E. Jansen 831*59599516SKenneth E. Jansen if (numpe > 1) then 832*59599516SKenneth E. Jansen call commu (rest , ilwork, 1 , 'in ') 833*59599516SKenneth E. Jansen 834*59599516SKenneth E. Jansen call MPI_BARRIER (MPI_COMM_WORLD,ierr) 835*59599516SKenneth E. Jansen 836*59599516SKenneth E. Jansen if(iprec .ne. 0) call commu (Diag, ilwork, 1, 'in ') 837*59599516SKenneth E. Jansen endif 838*59599516SKenneth E. Jansen 839*59599516SKenneth E. Jansenc 840*59599516SKenneth E. Jansenc.... ----------------------> post processing <---------------------- 841*59599516SKenneth E. Jansenc 842*59599516SKenneth E. Jansenc.... satisfy the BCs on the residual 843*59599516SKenneth E. Jansenc 844*59599516SKenneth E. Jansen call bc3ResSclr (y, iBC, BC, rest, iper, ilwork) 845*59599516SKenneth E. Jansenc 846*59599516SKenneth E. Jansenc.... satisfy the BCs on the preconditioner 847*59599516SKenneth E. Jansenc 848*59599516SKenneth E. Jansen call bc3BDgSclr (iBC, Diag, iper, ilwork) 849*59599516SKenneth E. Jansenc 850*59599516SKenneth E. Jansenc.... return 851*59599516SKenneth E. Jansenc 852*59599516SKenneth E. Jansen call timer ('Back ') 853*59599516SKenneth E. Jansen return 854*59599516SKenneth E. Jansen end 855*59599516SKenneth E. Jansen 856