1*59599516SKenneth E. Jansen subroutine i3pre (BDtmp, Binv, EGmass, ilwork ) 2*59599516SKenneth E. Jansenc 3*59599516SKenneth E. Jansenc--------------------------------------------------------------------- 4*59599516SKenneth E. Jansenc This is the initialization routine for the EBE-GMRES solver. 5*59599516SKenneth E. Jansenc It pre-preconditions the LHS mass matrix and sets up the 6*59599516SKenneth E. Jansenc EBE preconditioners. (pre-preconditioning is block diagonal 7*59599516SKenneth E. Jansenc scaling). 8*59599516SKenneth E. Jansenc 9*59599516SKenneth E. Jansenc input: 10*59599516SKenneth E. Jansenc BDtmp (nshg,nflow,nflow) : block diagonal scaling matrix 11*59599516SKenneth E. Jansenc which is already LU factored. 12*59599516SKenneth E. Jansenc EGmass (numel,nedof,nedof) : element mass matrix 13*59599516SKenneth E. Jansenc 14*59599516SKenneth E. Jansenc output: 15*59599516SKenneth E. Jansenc EGmass (numel,nedof,nedof) : pre-preconditioned (scaled) mass matrix 16*59599516SKenneth E. Jansenc Binv (numel,nedof,nedof) : EBE preconditioner for each element 17*59599516SKenneth E. Jansenc 18*59599516SKenneth E. Jansenc--------------------------------------------------------------------- 19*59599516SKenneth E. Jansenc 20*59599516SKenneth E. Jansen use pointer_data 21*59599516SKenneth E. Jansen 22*59599516SKenneth E. Jansen include "common.h" 23*59599516SKenneth E. Jansen 24*59599516SKenneth E. Jansen dimension BDtmp(nshg,nflow,nflow), 25*59599516SKenneth E. Jansen & EGmass(numel,nedof,nedof), 26*59599516SKenneth E. Jansenctoomuchmemory & Binv(numel,nedof,nedof), 27*59599516SKenneth E. Jansen & ilwork(nlwork) 28*59599516SKenneth E. Jansenc 29*59599516SKenneth E. Jansen dimension BDiagl(numel,nshape,nflow,nflow), 30*59599516SKenneth E. Jansen & BDiag(nshg,nflow,nflow) 31*59599516SKenneth E. Jansen 32*59599516SKenneth E. Jansen BDiag = BDtmp 33*59599516SKenneth E. Jansen 34*59599516SKenneth E. Jansen if (numpe > 1) then 35*59599516SKenneth E. Jansen call commu (BDiag , ilwork, nflow*nflow , 'out') 36*59599516SKenneth E. Jansen endif 37*59599516SKenneth E. Jansenc 38*59599516SKenneth E. Jansenc.... block-diagonal pre-precondition LHS 39*59599516SKenneth E. Jansenc 40*59599516SKenneth E. Jansenc 41*59599516SKenneth E. Jansenc.... loop over element blocks 42*59599516SKenneth E. Jansenc 43*59599516SKenneth E. Jansen do iblk = 1, nelblk 44*59599516SKenneth E. Jansen iel = lcblk(1,iblk) 45*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) 46*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 47*59599516SKenneth E. Jansen n = iel - 1 48*59599516SKenneth E. Jansen inum = iel + npro - 1 49*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 50*59599516SKenneth E. Jansenc 51*59599516SKenneth E. Jansenc.... localize block diagonal scaling matrices 52*59599516SKenneth E. Jansenc 53*59599516SKenneth E. Jansen call local (BDiag, BDiagl(iel:inum,:,:,:), abs(mien(iblk)%p), 54*59599516SKenneth E. Jansen & nflow*nflow, 'gather ' ) 55*59599516SKenneth E. Jansenc 56*59599516SKenneth E. Jansenc.... loop through local nodes and reduce all columns and rows 57*59599516SKenneth E. Jansenc 58*59599516SKenneth E. Jansen do inode = 1, nshl 59*59599516SKenneth E. Jansen i = (inode - 1) * nflow ! EGmass dof offset 60*59599516SKenneth E. Jansenc 61*59599516SKenneth E. Jansenc.... reduce by columns, (left block diagonal preconditioning) 62*59599516SKenneth E. Jansenc 63*59599516SKenneth E. Jansenc EGmass <-- inverse(L^tilde) EGmass 64*59599516SKenneth E. Jansenc 65*59599516SKenneth E. Jansen do j = 1, nedof 66*59599516SKenneth E. Jansen do iv = 1, npro 67*59599516SKenneth E. Jansen EGmass(n+iv,i+1,j) = EGmass(n+iv,i+1,j) 68*59599516SKenneth E. Jansenc 69*59599516SKenneth E. Jansen EGmass(n+iv,i+2,j) = (EGmass(n+iv,i+2,j) 70*59599516SKenneth E. Jansen & - BDiagl(n+iv,inode,2,1) * EGmass(n+iv,i+1,j)) 71*59599516SKenneth E. Jansenc 72*59599516SKenneth E. Jansen EGmass(n+iv,i+3,j) = (EGmass(n+iv,i+3,j) 73*59599516SKenneth E. Jansen & - BDiagl(n+iv,inode,3,1) * EGmass(n+iv,i+1,j) 74*59599516SKenneth E. Jansen & - BDiagl(n+iv,inode,3,2) * EGmass(n+iv,i+2,j)) 75*59599516SKenneth E. Jansenc 76*59599516SKenneth E. Jansen EGmass(n+iv,i+4,j) = (EGmass(n+iv,i+4,j) 77*59599516SKenneth E. Jansen & - BDiagl(n+iv,inode,4,1) * EGmass(n+iv,i+1,j) 78*59599516SKenneth E. Jansen & - BDiagl(n+iv,inode,4,2) * EGmass(n+iv,i+2,j) 79*59599516SKenneth E. Jansen & - BDiagl(n+iv,inode,4,3) * EGmass(n+iv,i+3,j)) 80*59599516SKenneth E. Jansenc 81*59599516SKenneth E. Jansen EGmass(n+iv,i+5,j) = (EGmass(n+iv,i+5,j) 82*59599516SKenneth E. Jansen & - BDiagl(n+iv,inode,5,1) * EGmass(n+iv,i+1,j) 83*59599516SKenneth E. Jansen & - BDiagl(n+iv,inode,5,2) * EGmass(n+iv,i+2,j) 84*59599516SKenneth E. Jansen & - BDiagl(n+iv,inode,5,3) * EGmass(n+iv,i+3,j) 85*59599516SKenneth E. Jansen & - BDiagl(n+iv,inode,5,4) * EGmass(n+iv,i+4,j)) 86*59599516SKenneth E. Jansen enddo 87*59599516SKenneth E. Jansen enddo 88*59599516SKenneth E. Jansen enddo 89*59599516SKenneth E. Jansen 90*59599516SKenneth E. Jansen do inode = 1, nshl 91*59599516SKenneth E. Jansen i = (inode - 1) * nflow ! EGmass dof offset 92*59599516SKenneth E. Jansen 93*59599516SKenneth E. Jansenc 94*59599516SKenneth E. Jansenc.... reduce by rows, (right block diagonal preconditioning) 95*59599516SKenneth E. Jansenc 96*59599516SKenneth E. Jansenc EGmass <-- EGmass inverse(U^tilde) 97*59599516SKenneth E. Jansenc 98*59599516SKenneth E. Jansen do j = 1, nedof 99*59599516SKenneth E. Jansen do iv = 1, npro 100*59599516SKenneth E. Jansen EGmass(n+iv,j,i+1) = BDiagl(n+iv,inode,1,1) * 101*59599516SKenneth E. Jansen & (EGmass(n+iv,j,i+1)) 102*59599516SKenneth E. Jansenc 103*59599516SKenneth E. Jansen EGmass(n+iv,j,i+2) = BDiagl(n+iv,inode,2,2) * ( 104*59599516SKenneth E. Jansen & EGmass(n+iv,j,i+2) 105*59599516SKenneth E. Jansen & - BDiagl(n+iv,inode,1,2) * EGmass(n+iv,j,i+1)) 106*59599516SKenneth E. Jansenc 107*59599516SKenneth E. Jansen EGmass(n+iv,j,i+3) = BDiagl(n+iv,inode,3,3) * ( 108*59599516SKenneth E. Jansen & EGmass(n+iv,j,i+3) 109*59599516SKenneth E. Jansen & - BDiagl(n+iv,inode,1,3) * EGmass(n+iv,j,i+1) 110*59599516SKenneth E. Jansen & - BDiagl(n+iv,inode,2,3) * EGmass(n+iv,j,i+2)) 111*59599516SKenneth E. Jansenc 112*59599516SKenneth E. Jansen EGmass(n+iv,j,i+4) = BDiagl(n+iv,inode,4,4) * ( 113*59599516SKenneth E. Jansen & EGmass(n+iv,j,i+4) 114*59599516SKenneth E. Jansen & - BDiagl(n+iv,inode,1,4) * EGmass(n+iv,j,i+1) 115*59599516SKenneth E. Jansen & - BDiagl(n+iv,inode,2,4) * EGmass(n+iv,j,i+2) 116*59599516SKenneth E. Jansen & - BDiagl(n+iv,inode,3,4) * EGmass(n+iv,j,i+3)) 117*59599516SKenneth E. Jansenc 118*59599516SKenneth E. Jansen EGmass(n+iv,j,i+5) = BDiagl(n+iv,inode,5,5) * ( 119*59599516SKenneth E. Jansen & EGmass(n+iv,j,i+5) 120*59599516SKenneth E. Jansen & - BDiagl(n+iv,inode,1,5) * EGmass(n+iv,j,i+1) 121*59599516SKenneth E. Jansen & - BDiagl(n+iv,inode,2,5) * EGmass(n+iv,j,i+2) 122*59599516SKenneth E. Jansen & - BDiagl(n+iv,inode,3,5) * EGmass(n+iv,j,i+3) 123*59599516SKenneth E. Jansen & - BDiagl(n+iv,inode,4,5) * EGmass(n+iv,j,i+4)) 124*59599516SKenneth E. Jansen enddo 125*59599516SKenneth E. Jansen enddo 126*59599516SKenneth E. Jansenc 127*59599516SKenneth E. Jansenc.... end loops over row and column nodes 128*59599516SKenneth E. Jansenc 129*59599516SKenneth E. Jansen enddo 130*59599516SKenneth E. Jansenc 131*59599516SKenneth E. Jansenc.... end of element blocks loop 132*59599516SKenneth E. Jansenc 133*59599516SKenneth E. Jansen enddo 134*59599516SKenneth E. Jansenc 135*59599516SKenneth E. Jansenc.... calculate non-symmetric Cholesky EBE preconditioners 136*59599516SKenneth E. Jansenc 137*59599516SKenneth E. Jansenctoomuchmemory Binv = EGmass 138*59599516SKenneth E. Jansenc$$$ if (iPcond .eq. 2) then 139*59599516SKenneth E. Jansenc$$$ call itrPr2 (ieneg, lcblk, Binv, ubBgl, ubBgl, 'LDU_Fact') 140*59599516SKenneth E. Jansenc$$$ endif 141*59599516SKenneth E. Jansenc 142*59599516SKenneth E. Jansenc.... end of (pre process), return 143*59599516SKenneth E. Jansenc 144*59599516SKenneth E. Jansen return 145*59599516SKenneth E. Jansen 146*59599516SKenneth E. Jansen end 147*59599516SKenneth E. Jansenc 148*59599516SKenneth E. Jansenc 149*59599516SKenneth E. Jansenc 150*59599516SKenneth E. Jansen subroutine i3preSclr (Diag, Dinv, EGmassT, ilwork ) 151*59599516SKenneth E. Jansenc 152*59599516SKenneth E. Jansenc--------------------------------------------------------------------- 153*59599516SKenneth E. Jansenc This is the initialization routine for the EBE-GMRES solver. 154*59599516SKenneth E. Jansenc It pre-preconditions the LHS mass matrix and sets up the 155*59599516SKenneth E. Jansenc EBE preconditioners. (pre-preconditioning is block diagonal 156*59599516SKenneth E. Jansenc scaling). 157*59599516SKenneth E. Jansenc 158*59599516SKenneth E. Jansenc input: 159*59599516SKenneth E. Jansenc Diag (numnp,nflow,nflow) : diagonal scaling matrix 160*59599516SKenneth E. Jansenc EGmass (numel,nedof,nedof) : element mass matrix 161*59599516SKenneth E. Jansenc 162*59599516SKenneth E. Jansenc output: 163*59599516SKenneth E. Jansenc EGmass (numel,nedof,nedof) : pre-preconditioned (scaled) mass matrix 164*59599516SKenneth E. Jansenc Dinv (numel,nedof,nedof) : EBE preconditioner for each element 165*59599516SKenneth E. Jansenc 166*59599516SKenneth E. Jansenc--------------------------------------------------------------------- 167*59599516SKenneth E. Jansenc 168*59599516SKenneth E. Jansen use pointer_data 169*59599516SKenneth E. Jansen 170*59599516SKenneth E. Jansen include "common.h" 171*59599516SKenneth E. Jansen 172*59599516SKenneth E. Jansen dimension EGmassT(numel,nshape,nshape), 173*59599516SKenneth E. Jansen & Dinv(nshg), ilwork(nlwork) 174*59599516SKenneth E. Jansenc 175*59599516SKenneth E. Jansen dimension Dinvl(numel,nshl), Diag(nshg) 176*59599516SKenneth E. Jansenc 177*59599516SKenneth E. Jansen Dinv = one/Diag 178*59599516SKenneth E. Jansenc 179*59599516SKenneth E. Jansen if (numpe > 1) then 180*59599516SKenneth E. Jansen call commu (Dinv , ilwork, 1 , 'out') 181*59599516SKenneth E. Jansen endif 182*59599516SKenneth E. Jansenc 183*59599516SKenneth E. Jansenc.... loop over element blocks 184*59599516SKenneth E. Jansenc 185*59599516SKenneth E. Jansen do iblk = 1, nelblk 186*59599516SKenneth E. Jansen iel = lcblk(1,iblk) 187*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) 188*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 189*59599516SKenneth E. Jansen n = iel - 1 190*59599516SKenneth E. Jansen inum = iel + npro - 1 191*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 192*59599516SKenneth E. Jansenc 193*59599516SKenneth E. Jansenc.... localize diagonal scaling matrices 194*59599516SKenneth E. Jansenc 195*59599516SKenneth E. Jansen call local (Dinv, Dinvl(iel:inum,:), mien(iblk)%p, 196*59599516SKenneth E. Jansen & 1, 'gather ' ) 197*59599516SKenneth E. Jansenc 198*59599516SKenneth E. Jansenc.... loop through and reduce all columns 199*59599516SKenneth E. Jansenc 200*59599516SKenneth E. Jansen do icol = 1, nshl 201*59599516SKenneth E. Jansen do irow = 1, nshl 202*59599516SKenneth E. Jansen do iv = 1, npro 203*59599516SKenneth E. Jansen EGmassT(n+iv,irow,icol) = EGmassT(n+iv,irow,icol) 204*59599516SKenneth E. Jansen & *Dinvl(n+iv,icol) 205*59599516SKenneth E. Jansen enddo 206*59599516SKenneth E. Jansen enddo 207*59599516SKenneth E. Jansen enddo 208*59599516SKenneth E. Jansenc 209*59599516SKenneth E. Jansenc.... end of element blocks loop 210*59599516SKenneth E. Jansenc 211*59599516SKenneth E. Jansen enddo 212*59599516SKenneth E. Jansenc 213*59599516SKenneth E. Jansenc.... end of (pre process), return 214*59599516SKenneth E. Jansenc 215*59599516SKenneth E. Jansen return 216*59599516SKenneth E. Jansen 217*59599516SKenneth E. Jansen end 218*59599516SKenneth E. Jansen 219*59599516SKenneth E. Jansen 220*59599516SKenneth E. Jansen 221*59599516SKenneth E. Jansen 222