1*10167291SKenneth E. Jansenc 2*10167291SKenneth E. Jansencccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 3*10167291SKenneth E. Jansenccccccccccccc SPARSE 4*10167291SKenneth E. Jansenc_______________________________________________________________ 5*10167291SKenneth E. Jansen 6*10167291SKenneth E. Jansen subroutine ElmGMRPETSc (y, ac, x, 7*10167291SKenneth E. Jansen & shp, shgl, iBC, 8*10167291SKenneth E. Jansen & BC, shpb, shglb, 9*10167291SKenneth E. Jansen & res, rmes, 10*10167291SKenneth E. Jansen & iper, ilwork, 11*10167291SKenneth E. Jansen & rerr, lhsP) 12*10167291SKenneth E. Jansenc 13*10167291SKenneth E. Jansenc---------------------------------------------------------------------- 14*10167291SKenneth E. Jansenc 15*10167291SKenneth E. Jansenc This routine computes the LHS mass matrix, the RHS residual 16*10167291SKenneth E. Jansenc vector, for use with the GMRES 17*10167291SKenneth E. Jansenc solver. 18*10167291SKenneth E. Jansenc 19*10167291SKenneth E. Jansenc Zdenek Johan, Winter 1991. (Fortran 90) 20*10167291SKenneth E. Jansenc Chris Whiting, Winter 1998. (Matrix EBE-GMRES) 21*10167291SKenneth E. Jansenc---------------------------------------------------------------------- 22*10167291SKenneth E. Jansenc 23*10167291SKenneth E. Jansen use pointer_data 24*10167291SKenneth E. Jansen use timedata 25*10167291SKenneth E. Jansenc 26*10167291SKenneth E. Jansen include "common.h" 27*10167291SKenneth E. Jansen include "mpif.h" 28*10167291SKenneth E. Jansenc 29*10167291SKenneth E. Jansen! integer col(nshg+1), row(nnz*nshg) 30*10167291SKenneth E. Jansen! real*8 lhsK(nflow*nflow,nnz_tot) 31*10167291SKenneth E. Jansen real*8 BDiag(1,1,1) 32*10167291SKenneth E. Jansen 33*10167291SKenneth E. Jansen dimension y(nshg,ndof), ac(nshg,ndof), 34*10167291SKenneth E. Jansen & x(numnp,nsd), 35*10167291SKenneth E. Jansen & iBC(nshg), 36*10167291SKenneth E. Jansen & BC(nshg,ndofBC), 37*10167291SKenneth E. Jansen & res(nshg,nflow), 38*10167291SKenneth E. Jansen & rmes(nshg,nflow), 39*10167291SKenneth E. Jansen & iper(nshg) 40*10167291SKenneth E. Jansenc 41*10167291SKenneth E. Jansen dimension shp(MAXTOP,maxsh,MAXQPT), 42*10167291SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), 43*10167291SKenneth E. Jansen & shpb(MAXTOP,maxsh,MAXQPT), 44*10167291SKenneth E. Jansen & shglb(MAXTOP,nsd,maxsh,MAXQPT) 45*10167291SKenneth E. Jansenc 46*10167291SKenneth E. Jansen dimension qres(nshg, idflx), rmass(nshg) 47*10167291SKenneth E. Jansenc 48*10167291SKenneth E. Jansen dimension ilwork(nlwork) 49*10167291SKenneth E. Jansen 50*10167291SKenneth E. Jansen real*8 Bdiagvec(nshg,nflow), rerr(nshg,10) 51*10167291SKenneth E. Jansen 52*10167291SKenneth E. Jansen real*8, allocatable :: tmpshp(:,:), tmpshgl(:,:,:) 53*10167291SKenneth E. Jansen real*8, allocatable :: tmpshpb(:,:), tmpshglb(:,:,:) 54*10167291SKenneth E. Jansen real*8, allocatable :: EGmass(:,:,:) 55*10167291SKenneth E. Jansen integer gnode(numnp) 56*10167291SKenneth E. Jansen ttim(80) = ttim(80) - secs(0.0) 57*10167291SKenneth E. Jansen iprec=0 58*10167291SKenneth E. Jansenc 59*10167291SKenneth E. Jansenc.... set up the timer 60*10167291SKenneth E. Jansenc 61*10167291SKenneth E. Jansen! call MPI_BARRIER (MPI_COMM_WORLD,ierr) 62*10167291SKenneth E. Jansen! if(myrank.eq.0) write (*,*) 'top of elmgmrpetsc ' 63*10167291SKenneth E. Jansen 64*10167291SKenneth E. Jansen call timer ('Elm_Form') 65*10167291SKenneth E. Jansenc 66*10167291SKenneth E. Jansenc.... --------------------> interior elements <-------------------- 67*10167291SKenneth E. Jansenc 68*10167291SKenneth E. Jansenc.... set up parameters 69*10167291SKenneth E. Jansenc 70*10167291SKenneth E. Jansen ires = 1 71*10167291SKenneth E. Jansenc 72*10167291SKenneth E. Jansen if (idiff==1 .or. idiff==3 .or. isurf==1) then ! global reconstruction 73*10167291SKenneth E. Jansen ! of qdiff 74*10167291SKenneth E. Jansenc 75*10167291SKenneth E. Jansenc loop over element blocks for the global reconstruction 76*10167291SKenneth E. Jansenc of the diffusive flux vector, q, and lumped mass matrix, rmass 77*10167291SKenneth E. Jansenc 78*10167291SKenneth E. Jansen qres = zero 79*10167291SKenneth E. Jansen rmass = zero 80*10167291SKenneth E. Jansen 81*10167291SKenneth E. Jansen do iblk = 1, nelblk 82*10167291SKenneth E. Jansenc 83*10167291SKenneth E. Jansenc.... set up the parameters 84*10167291SKenneth E. Jansenc 85*10167291SKenneth E. Jansen nenl = lcblk(5,iblk) ! no. of vertices per element 86*10167291SKenneth E. Jansen iel = lcblk(1,iblk) 87*10167291SKenneth E. Jansen lelCat = lcblk(2,iblk) 88*10167291SKenneth E. Jansen lcsyst = lcblk(3,iblk) 89*10167291SKenneth E. Jansen iorder = lcblk(4,iblk) 90*10167291SKenneth E. Jansen nenl = lcblk(5,iblk) ! no. of vertices per element 91*10167291SKenneth E. Jansen nshl = lcblk(10,iblk) 92*10167291SKenneth E. Jansen mattyp = lcblk(7,iblk) 93*10167291SKenneth E. Jansen ndofl = lcblk(8,iblk) 94*10167291SKenneth E. Jansen nsymdl = lcblk(9,iblk) 95*10167291SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 96*10167291SKenneth E. Jansen ngauss = nint(lcsyst) 97*10167291SKenneth E. Jansenc 98*10167291SKenneth E. Jansenc.... compute and assemble diffusive flux vector residual, qres, 99*10167291SKenneth E. Jansenc and lumped mass matrix, rmass 100*10167291SKenneth E. Jansen 101*10167291SKenneth E. Jansen allocate (tmpshp(nshl,MAXQPT)) 102*10167291SKenneth E. Jansen allocate (tmpshgl(nsd,nshl,MAXQPT)) 103*10167291SKenneth E. Jansen 104*10167291SKenneth E. Jansen tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:) 105*10167291SKenneth E. Jansen tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:) 106*10167291SKenneth E. Jansen 107*10167291SKenneth E. Jansen call AsIq (y, x, 108*10167291SKenneth E. Jansen & tmpshp, 109*10167291SKenneth E. Jansen & tmpshgl, 110*10167291SKenneth E. Jansen & mien(iblk)%p, mxmudmi(iblk)%p, 111*10167291SKenneth E. Jansen & qres, 112*10167291SKenneth E. Jansen & rmass) 113*10167291SKenneth E. Jansen 114*10167291SKenneth E. Jansen deallocate ( tmpshp ) 115*10167291SKenneth E. Jansen deallocate ( tmpshgl ) 116*10167291SKenneth E. Jansen enddo 117*10167291SKenneth E. Jansen 118*10167291SKenneth E. Jansenc 119*10167291SKenneth E. Jansenc.... take care of periodic boundary conditions 120*10167291SKenneth E. Jansenc 121*10167291SKenneth E. Jansen 122*10167291SKenneth E. Jansen call qpbc( rmass, qres, iBC, iper, ilwork ) 123*10167291SKenneth E. Jansenc 124*10167291SKenneth E. Jansen endif ! computation of global diffusive flux 125*10167291SKenneth E. Jansenc 126*10167291SKenneth E. Jansenc.... loop over element blocks to compute element residuals 127*10167291SKenneth E. Jansenc 128*10167291SKenneth E. Jansenc 129*10167291SKenneth E. Jansenc.... initialize the arrays 130*10167291SKenneth E. Jansenc 131*10167291SKenneth E. Jansen res = zero 132*10167291SKenneth E. Jansen rmes = zero ! to avoid trap_uninitialized 133*10167291SKenneth E. Jansen !if (lhs. eq. 1) lhsK = zero 134*10167291SKenneth E. Jansen flxID = zero 135*10167291SKenneth E. Jansenc 136*10167291SKenneth E. Jansenc.... loop over the element-blocks 137*10167291SKenneth E. Jansenc 138*10167291SKenneth E. Jansen! call commu (res , ilwork, nflow , 'in ') !FOR TEST 139*10167291SKenneth E. Jansen! call MPI_BARRIER (MPI_COMM_WORLD,ierr) 140*10167291SKenneth E. Jansen! if(myrank.eq.0) write (*,*) 'after res zeroed ' 141*10167291SKenneth E. Jansen do iblk = 1, nelblk 142*10167291SKenneth E. Jansenc 143*10167291SKenneth E. Jansenc.... set up the parameters 144*10167291SKenneth E. Jansenc 145*10167291SKenneth E. Jansen iblkts = iblk ! used in timeseries 146*10167291SKenneth E. Jansen nenl = lcblk(5,iblk) ! no. of vertices per element 147*10167291SKenneth E. Jansen iel = lcblk(1,iblk) 148*10167291SKenneth E. Jansen lelCat = lcblk(2,iblk) 149*10167291SKenneth E. Jansen lcsyst = lcblk(3,iblk) 150*10167291SKenneth E. Jansen iorder = lcblk(4,iblk) 151*10167291SKenneth E. Jansen nenl = lcblk(5,iblk) ! no. of vertices per element 152*10167291SKenneth E. Jansen nshl = lcblk(10,iblk) 153*10167291SKenneth E. Jansen mattyp = lcblk(7,iblk) 154*10167291SKenneth E. Jansen ndofl = lcblk(8,iblk) 155*10167291SKenneth E. Jansen nsymdl = lcblk(9,iblk) 156*10167291SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 157*10167291SKenneth E. Jansen inum = iel + npro - 1 158*10167291SKenneth E. Jansen ngauss = nint(lcsyst) 159*10167291SKenneth E. Jansenc 160*10167291SKenneth E. Jansenc.... compute and assemble the residual and tangent matrix 161*10167291SKenneth E. Jansenc 162*10167291SKenneth E. Jansen 163*10167291SKenneth E. Jansen if(lhs.eq.1) then 164*10167291SKenneth E. Jansen allocate (EGmass(npro,nedof,nedof)) 165*10167291SKenneth E. Jansen EGmass = zero 166*10167291SKenneth E. Jansen else 167*10167291SKenneth E. Jansen allocate (EGmass(1,1,1)) 168*10167291SKenneth E. Jansen endif 169*10167291SKenneth E. Jansen 170*10167291SKenneth E. Jansen allocate (tmpshp(nshl,MAXQPT)) 171*10167291SKenneth E. Jansen allocate (tmpshgl(nsd,nshl,MAXQPT)) 172*10167291SKenneth E. Jansen tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:) 173*10167291SKenneth E. Jansen tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:) 174*10167291SKenneth E. Jansen 175*10167291SKenneth E. Jansen call AsIGMR (y, ac, 176*10167291SKenneth E. Jansen & x, mxmudmi(iblk)%p, 177*10167291SKenneth E. Jansen & tmpshp, 178*10167291SKenneth E. Jansen & tmpshgl, mien(iblk)%p, 179*10167291SKenneth E. Jansen & mmat(iblk)%p, res, 180*10167291SKenneth E. Jansen & rmes, BDiag, 181*10167291SKenneth E. Jansen & qres, EGmass, 182*10167291SKenneth E. Jansen & rerr ) 183*10167291SKenneth E. Jansen if(lhs.eq.1) then 184*10167291SKenneth E. Jansenc 185*10167291SKenneth E. Jansenc.... satisfy the BCs on the implicit LHS 186*10167291SKenneth E. Jansenc 187*10167291SKenneth E. Jansen call bc3LHS (iBC, BC, mien(iblk)%p, 188*10167291SKenneth E. Jansen & EGmass ) 189*10167291SKenneth E. Jansen 190*10167291SKenneth E. Jansenc 191*10167291SKenneth E. Jansenc.... Fill-up the global sparse LHS mass matrix 192*10167291SKenneth E. Jansenc 193*10167291SKenneth E. Jansen! if(myrank.eq.0) write (*,*) 'before fillsparsepetscc ',iblk 194*10167291SKenneth E. Jansen call cycle_count_start() 195*10167291SKenneth E. Jansen call fillsparsecpetscc( mieng(iblk)%p, EGmass, lhsP) 196*10167291SKenneth E. Jansen call cycle_count_stop() 197*10167291SKenneth E. Jansen endif 198*10167291SKenneth E. Jansenc 199*10167291SKenneth E. Jansen deallocate ( EGmass ) 200*10167291SKenneth E. Jansen deallocate ( tmpshp ) 201*10167291SKenneth E. Jansen deallocate ( tmpshgl ) 202*10167291SKenneth E. Jansenc 203*10167291SKenneth E. Jansenc.... end of interior element loop 204*10167291SKenneth E. Jansenc 205*10167291SKenneth E. Jansen enddo 206*10167291SKenneth E. Jansen if(lhs.eq.1) call cycle_count_print() 207*10167291SKenneth E. Jansen! call commu (res , ilwork, nflow , 'in ') !FOR TEST 208*10167291SKenneth E. Jansen! call MPI_BARRIER (MPI_COMM_WORLD,ierr) 209*10167291SKenneth E. Jansen! if(myrank.eq.0) write (*,*) 'after fillsparsepetscc ' 210*10167291SKenneth E. Jansenc 211*10167291SKenneth E. Jansenc.... --------------------> boundary elements <-------------------- 212*10167291SKenneth E. Jansenc 213*10167291SKenneth E. Jansenc.... loop over the boundary elements 214*10167291SKenneth E. Jansenc 215*10167291SKenneth E. Jansen do iblk = 1, nelblb 216*10167291SKenneth E. Jansenc 217*10167291SKenneth E. Jansenc.... set up the parameters 218*10167291SKenneth E. Jansenc 219*10167291SKenneth E. Jansen iel = lcblkb(1,iblk) 220*10167291SKenneth E. Jansen lelCat = lcblkb(2,iblk) 221*10167291SKenneth E. Jansen lcsyst = lcblkb(3,iblk) 222*10167291SKenneth E. Jansen iorder = lcblkb(4,iblk) 223*10167291SKenneth E. Jansen nenl = lcblkb(5,iblk) ! no. of vertices per element 224*10167291SKenneth E. Jansen nenbl = lcblkb(6,iblk) ! no. of vertices per bdry. face 225*10167291SKenneth E. Jansen mattyp = lcblkb(7,iblk) 226*10167291SKenneth E. Jansen ndofl = lcblkb(8,iblk) 227*10167291SKenneth E. Jansen nshl = lcblkb(9,iblk) 228*10167291SKenneth E. Jansen nshlb = lcblkb(10,iblk) 229*10167291SKenneth E. Jansen npro = lcblkb(1,iblk+1) - iel 230*10167291SKenneth E. Jansen if(lcsyst.eq.3) lcsyst=nenbl 231*10167291SKenneth E. Jansen ngaussb = nintb(lcsyst) 232*10167291SKenneth E. Jansen 233*10167291SKenneth E. Jansenc 234*10167291SKenneth E. Jansenc.... compute and assemble the residuals corresponding to the 235*10167291SKenneth E. Jansenc boundary integral 236*10167291SKenneth E. Jansenc 237*10167291SKenneth E. Jansen 238*10167291SKenneth E. Jansen allocate (tmpshpb(nshl,MAXQPT)) 239*10167291SKenneth E. Jansen allocate (tmpshglb(nsd,nshl,MAXQPT)) 240*10167291SKenneth E. Jansen 241*10167291SKenneth E. Jansen tmpshpb(1:nshl,:) = shpb(lcsyst,1:nshl,:) 242*10167291SKenneth E. Jansen tmpshglb(:,1:nshl,:) = shglb(lcsyst,:,1:nshl,:) 243*10167291SKenneth E. Jansen 244*10167291SKenneth E. Jansen call AsBMFG (y, x, 245*10167291SKenneth E. Jansen & tmpshpb, tmpshglb, 246*10167291SKenneth E. Jansen & mienb(iblk)%p, mmatb(iblk)%p, 247*10167291SKenneth E. Jansen & miBCB(iblk)%p, mBCB(iblk)%p, 248*10167291SKenneth E. Jansen & res, rmes) 249*10167291SKenneth E. Jansen 250*10167291SKenneth E. Jansen deallocate (tmpshpb) 251*10167291SKenneth E. Jansen deallocate (tmpshglb) 252*10167291SKenneth E. Jansenc 253*10167291SKenneth E. Jansenc.... end of boundary element loop 254*10167291SKenneth E. Jansenc 255*10167291SKenneth E. Jansen enddo 256*10167291SKenneth E. Jansenc 257*10167291SKenneth E. Jansen ttim(80) = ttim(80) + secs(0.0) 258*10167291SKenneth E. Jansenc 259*10167291SKenneth E. Jansenc before the commu we need to rotate the residual vector for axisymmetric 260*10167291SKenneth E. Jansenc boundary conditions (so that off processor periodicity is a dof add instead 261*10167291SKenneth E. Jansenc of a dof combination). Take care of all nodes now so periodicity, like 262*10167291SKenneth E. Jansenc commu is a simple dof add. 263*10167291SKenneth E. Jansenc 264*10167291SKenneth E. Jansen if(iabc==1) then !are there any axisym bc's 265*10167291SKenneth E. Jansen call rotabc(res(1,2), iBC, 'in ') 266*10167291SKenneth E. Jansen endif 267*10167291SKenneth E. Jansen 268*10167291SKenneth E. Jansenc.... --------------------> communications <------------------------- 269*10167291SKenneth E. Jansenc 270*10167291SKenneth E. Jansen 271*10167291SKenneth E. Jansen if (numpe > 1) then 272*10167291SKenneth E. Jansen call commu (res , ilwork, nflow , 'in ') 273*10167291SKenneth E. Jansen 274*10167291SKenneth E. Jansen call MPI_BARRIER (MPI_COMM_WORLD,ierr) 275*10167291SKenneth E. Jansen endif 276*10167291SKenneth E. Jansen 277*10167291SKenneth E. Jansenc 278*10167291SKenneth E. Jansenc.... ----------------------> post processing <---------------------- 279*10167291SKenneth E. Jansenc 280*10167291SKenneth E. Jansenc.... satisfy the BCs on the residual 281*10167291SKenneth E. Jansenc 282*10167291SKenneth E. Jansen call bc3Res (y, iBC, BC, res, iper, ilwork) 283*10167291SKenneth E. Jansenc 284*10167291SKenneth E. Jansenc 285*10167291SKenneth E. Jansenc.... return 286*10167291SKenneth E. Jansenc 287*10167291SKenneth E. Jansen if (numpe > 1) then 288*10167291SKenneth E. Jansen call commu (res , ilwork, nflow , 'out') 289*10167291SKenneth E. Jansen call MPI_BARRIER (MPI_COMM_WORLD,ierr) 290*10167291SKenneth E. Jansen endif 291*10167291SKenneth E. Jansen call timer ('Back ') 292*10167291SKenneth E. Jansen return 293*10167291SKenneth E. Jansen end 294*10167291SKenneth E. Jansenc 295*10167291SKenneth E. Jansenc 296*10167291SKenneth E. Jansen 297*10167291SKenneth E. Jansenc 298*10167291SKenneth E. Jansen 299*10167291SKenneth E. Jansen subroutine ElmGMRPETScSclr(y, ac, 300*10167291SKenneth E. Jansen & x, elDw, 301*10167291SKenneth E. Jansen & shp, shgl, iBC, 302*10167291SKenneth E. Jansen & BC, shpb, shglb, 303*10167291SKenneth E. Jansen & rest, rmest, 304*10167291SKenneth E. Jansen & iper, ilwork, lhsPs) 305*10167291SKenneth E. Jansenc 306*10167291SKenneth E. Jansenc---------------------------------------------------------------------- 307*10167291SKenneth E. Jansenc 308*10167291SKenneth E. Jansenc This routine computes the LHS mass matrix, the RHS residual 309*10167291SKenneth E. Jansenc vector, and the preconditioning matrix, for use with the GMRES 310*10167291SKenneth E. Jansenc solver. 311*10167291SKenneth E. Jansenc 312*10167291SKenneth E. Jansenc Zdenek Johan, Winter 1991. (Fortran 90) 313*10167291SKenneth E. Jansenc Chris Whiting, Winter 1998. (Matrix EBE-GMRES) 314*10167291SKenneth E. Jansenc---------------------------------------------------------------------- 315*10167291SKenneth E. Jansenc 316*10167291SKenneth E. Jansen use pointer_data 317*10167291SKenneth E. Jansenc 318*10167291SKenneth E. Jansen include "common.h" 319*10167291SKenneth E. Jansen include "mpif.h" 320*10167291SKenneth E. Jansenc 321*10167291SKenneth E. Jansen dimension y(nshg,ndof), ac(nshg,ndof), 322*10167291SKenneth E. Jansen & x(numnp,nsd), 323*10167291SKenneth E. Jansen & iBC(nshg), 324*10167291SKenneth E. Jansen & BC(nshg,ndofBC), 325*10167291SKenneth E. Jansen & rest(nshg), Diag(1), 326*10167291SKenneth E. Jansen & rmest(nshg), 327*10167291SKenneth E. Jansen & iper(nshg) 328*10167291SKenneth E. Jansenc 329*10167291SKenneth E. Jansen dimension shp(MAXTOP,maxsh,MAXQPT), 330*10167291SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), 331*10167291SKenneth E. Jansen & shpb(MAXTOP,maxsh,MAXQPT), 332*10167291SKenneth E. Jansen & shglb(MAXTOP,nsd,maxsh,MAXQPT) 333*10167291SKenneth E. Jansenc 334*10167291SKenneth E. Jansen dimension qrest(nshg), rmasst(nshg) 335*10167291SKenneth E. Jansen real*8 elDw(numel) 336*10167291SKenneth E. Jansenc 337*10167291SKenneth E. Jansen dimension ilwork(nlwork) 338*10167291SKenneth E. Jansenc 339*10167291SKenneth E. Jansen real*8, allocatable :: tmpshp(:,:), tmpshgl(:,:,:) 340*10167291SKenneth E. Jansen real*8, allocatable :: tmpshpb(:,:), tmpshglb(:,:,:) 341*10167291SKenneth E. Jansen real*8, allocatable :: EGMasst(:,:,:) 342*10167291SKenneth E. Jansen real*8, allocatable :: ElDwl(:) 343*10167291SKenneth E. Jansenc 344*10167291SKenneth E. Jansen ttim(80) = ttim(80) - tmr() 345*10167291SKenneth E. Jansen iprec=0 346*10167291SKenneth E. Jansenc 347*10167291SKenneth E. Jansenc.... set up the timer 348*10167291SKenneth E. Jansenc 349*10167291SKenneth E. Jansen 350*10167291SKenneth E. Jansen call timer ('Elm_Form') 351*10167291SKenneth E. Jansenc 352*10167291SKenneth E. Jansenc.... --------------------> interior elements <-------------------- 353*10167291SKenneth E. Jansenc 354*10167291SKenneth E. Jansenc.... set up parameters 355*10167291SKenneth E. Jansenc 356*10167291SKenneth E. Jansen intrul = intg (1,itseq) 357*10167291SKenneth E. Jansen intind = intpt (intrul) 358*10167291SKenneth E. Jansenc 359*10167291SKenneth E. Jansen ires = 1 360*10167291SKenneth E. Jansen 361*10167291SKenneth E. Jansenc 362*10167291SKenneth E. Jansenc.... initialize the arrays 363*10167291SKenneth E. Jansenc 364*10167291SKenneth E. Jansen rest = zero 365*10167291SKenneth E. Jansen rmest = zero ! to avoid trap_uninitialized 366*10167291SKenneth E. Jansenc 367*10167291SKenneth E. Jansenc.... loop over the element-blocks 368*10167291SKenneth E. Jansenc 369*10167291SKenneth E. Jansen do iblk = 1, nelblk 370*10167291SKenneth E. Jansenc 371*10167291SKenneth E. Jansenc 372*10167291SKenneth E. Jansen nenl = lcblk(5,iblk) ! no. of vertices per element 373*10167291SKenneth E. Jansen iel = lcblk(1,iblk) 374*10167291SKenneth E. Jansen lelCat = lcblk(2,iblk) 375*10167291SKenneth E. Jansen lcsyst = lcblk(3,iblk) 376*10167291SKenneth E. Jansen iorder = lcblk(4,iblk) 377*10167291SKenneth E. Jansen nshl = lcblk(10,iblk) 378*10167291SKenneth E. Jansen mattyp = lcblk(7,iblk) 379*10167291SKenneth E. Jansen ndofl = lcblk(8,iblk) 380*10167291SKenneth E. Jansen nsymdl = lcblk(9,iblk) 381*10167291SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 382*10167291SKenneth E. Jansen inum = iel + npro - 1 383*10167291SKenneth E. Jansen ngauss = nint(lcsyst) 384*10167291SKenneth E. Jansenc 385*10167291SKenneth E. Jansenc.... compute and assemble the residual and tangent matrix 386*10167291SKenneth E. Jansenc 387*10167291SKenneth E. Jansen allocate (tmpshp(nshl,MAXQPT)) 388*10167291SKenneth E. Jansen allocate (tmpshgl(nsd,nshl,MAXQPT)) 389*10167291SKenneth E. Jansen if(lhs.eq.1) then 390*10167291SKenneth E. Jansen allocate (EGMasst(npro,nshl,nshl)) 391*10167291SKenneth E. Jansen EGMasst=zero 392*10167291SKenneth E. Jansen endif 393*10167291SKenneth E. Jansen 394*10167291SKenneth E. Jansen tmpshp(1:nshl,:) = shp(lcsyst,1:nshl,:) 395*10167291SKenneth E. Jansen tmpshgl(:,1:nshl,:) = shgl(lcsyst,:,1:nshl,:) 396*10167291SKenneth E. Jansen 397*10167291SKenneth E. Jansen allocate (elDwl(npro)) 398*10167291SKenneth E. Jansenc 399*10167291SKenneth E. Jansen call AsIGMRSclr(y, 400*10167291SKenneth E. Jansen & ac, 401*10167291SKenneth E. Jansen & x, elDwl, 402*10167291SKenneth E. Jansen & tmpshp, tmpshgl, 403*10167291SKenneth E. Jansen & mien(iblk)%p, 404*10167291SKenneth E. Jansen & mmat(iblk)%p, rest, 405*10167291SKenneth E. Jansen & rmest, 406*10167291SKenneth E. Jansen & qrest, EGmasst, 407*10167291SKenneth E. Jansen & Diag ) 408*10167291SKenneth E. Jansenc 409*10167291SKenneth E. Jansen elDw(iel:inum) = elDwl(1:npro) 410*10167291SKenneth E. Jansen deallocate ( elDwl ) 411*10167291SKenneth E. Jansen 412*10167291SKenneth E. Jansen if(lhs.eq.1) then 413*10167291SKenneth E. Jansenc.... satisfy the BCs on the implicit LHS 414*10167291SKenneth E. Jansenc 415*10167291SKenneth E. Jansen call bc3LHSSclr (iBC, mien(iblk)%p, EGmasst ) 416*10167291SKenneth E. Jansenc 417*10167291SKenneth E. Jansenc 418*10167291SKenneth E. Jansenc.... Fill-up the global sparse LHS mass matrix 419*10167291SKenneth E. Jansenc 420*10167291SKenneth E. Jansen call fillsparsecpetscs( mieng(iblk)%p, EGmasst, lhsPs) 421*10167291SKenneth E. Jansen endif 422*10167291SKenneth E. Jansen if(lhs.eq.1) deallocate ( EGmasst ) 423*10167291SKenneth E. Jansen deallocate ( tmpshp ) 424*10167291SKenneth E. Jansen deallocate ( tmpshgl ) 425*10167291SKenneth E. Jansenc.... end of interior element loop 426*10167291SKenneth E. Jansenc 427*10167291SKenneth E. Jansen enddo 428*10167291SKenneth E. Jansenc 429*10167291SKenneth E. Jansenc.... --------------------> boundary elements <-------------------- 430*10167291SKenneth E. Jansenc 431*10167291SKenneth E. Jansenc.... set up parameters 432*10167291SKenneth E. Jansenc 433*10167291SKenneth E. Jansen intrul = intg (2,itseq) 434*10167291SKenneth E. Jansen intind = intptb (intrul) 435*10167291SKenneth E. Jansenc 436*10167291SKenneth E. Jansenc.... loop over the boundary elements 437*10167291SKenneth E. Jansenc 438*10167291SKenneth E. Jansen do iblk = 1, nelblb 439*10167291SKenneth E. Jansenc 440*10167291SKenneth E. Jansenc.... set up the parameters 441*10167291SKenneth E. Jansenc 442*10167291SKenneth E. Jansen iel = lcblkb(1,iblk) 443*10167291SKenneth E. Jansen lelCat = lcblkb(2,iblk) 444*10167291SKenneth E. Jansen lcsyst = lcblkb(3,iblk) 445*10167291SKenneth E. Jansen iorder = lcblkb(4,iblk) 446*10167291SKenneth E. Jansen nenl = lcblkb(5,iblk) ! no. of vertices per element 447*10167291SKenneth E. Jansen nenbl = lcblkb(6,iblk) ! no. of vertices per bdry. face 448*10167291SKenneth E. Jansen mattyp = lcblkb(7,iblk) 449*10167291SKenneth E. Jansen ndofl = lcblkb(8,iblk) 450*10167291SKenneth E. Jansen nshl = lcblkb(9,iblk) 451*10167291SKenneth E. Jansen nshlb = lcblkb(10,iblk) 452*10167291SKenneth E. Jansen npro = lcblkb(1,iblk+1) - iel 453*10167291SKenneth E. Jansen if(lcsyst.eq.3) lcsyst=nenbl 454*10167291SKenneth E. Jansen ngaussb = nintb(lcsyst) 455*10167291SKenneth E. Jansenc 456*10167291SKenneth E. Jansenc.... compute and assemble the residuals corresponding to the 457*10167291SKenneth E. Jansenc boundary integral 458*10167291SKenneth E. Jansenc 459*10167291SKenneth E. Jansen 460*10167291SKenneth E. Jansen allocate (tmpshpb(nshl,MAXQPT)) 461*10167291SKenneth E. Jansen allocate (tmpshglb(nsd,nshl,MAXQPT)) 462*10167291SKenneth E. Jansen 463*10167291SKenneth E. Jansen tmpshpb(1:nshl,:) = shpb(lcsyst,1:nshl,:) 464*10167291SKenneth E. Jansen tmpshglb(:,1:nshl,:) = shglb(lcsyst,:,1:nshl,:) 465*10167291SKenneth E. Jansenc 466*10167291SKenneth E. Jansen call AsBMFGSclr (y, x, 467*10167291SKenneth E. Jansen & tmpshpb, 468*10167291SKenneth E. Jansen & tmpshglb, 469*10167291SKenneth E. Jansen & mienb(iblk)%p, mmatb(iblk)%p, 470*10167291SKenneth E. Jansen & miBCB(iblk)%p, mBCB(iblk)%p, 471*10167291SKenneth E. Jansen & rest, rmest) 472*10167291SKenneth E. Jansenc 473*10167291SKenneth E. Jansen deallocate ( tmpshpb ) 474*10167291SKenneth E. Jansen deallocate ( tmpshglb ) 475*10167291SKenneth E. Jansen 476*10167291SKenneth E. Jansenc.... end of boundary element loop 477*10167291SKenneth E. Jansenc 478*10167291SKenneth E. Jansen enddo 479*10167291SKenneth E. Jansen 480*10167291SKenneth E. Jansen 481*10167291SKenneth E. Jansen ttim(80) = ttim(80) + tmr() 482*10167291SKenneth E. Jansenc 483*10167291SKenneth E. Jansenc.... --------------------> communications <------------------------- 484*10167291SKenneth E. Jansenc 485*10167291SKenneth E. Jansen 486*10167291SKenneth E. Jansen if (numpe > 1) then 487*10167291SKenneth E. Jansen call commu (rest , ilwork, 1 , 'in ') 488*10167291SKenneth E. Jansen 489*10167291SKenneth E. Jansen call MPI_BARRIER (MPI_COMM_WORLD,ierr) 490*10167291SKenneth E. Jansen 491*10167291SKenneth E. Jansen endif 492*10167291SKenneth E. Jansen 493*10167291SKenneth E. Jansenc 494*10167291SKenneth E. Jansenc.... ----------------------> post processing <---------------------- 495*10167291SKenneth E. Jansenc 496*10167291SKenneth E. Jansenc.... satisfy the BCs on the residual 497*10167291SKenneth E. Jansenc 498*10167291SKenneth E. Jansen call bc3ResSclr (y, iBC, BC, rest, iper, ilwork) 499*10167291SKenneth E. Jansen if (numpe > 1) then 500*10167291SKenneth E. Jansen call commu (rest , ilwork, 1 , 'out') 501*10167291SKenneth E. Jansen call MPI_BARRIER (MPI_COMM_WORLD,ierr) 502*10167291SKenneth E. Jansen endif 503*10167291SKenneth E. Jansenc 504*10167291SKenneth E. Jansenc.... return 505*10167291SKenneth E. Jansenc 506*10167291SKenneth E. Jansen call timer ('Back ') 507*10167291SKenneth E. Jansen return 508*10167291SKenneth E. Jansen end 509