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