1*59599516SKenneth E. Jansen subroutine Au1GMR (EGmass, uBrg, ilwork,iBC,iper ) 2*59599516SKenneth E. Jansenc 3*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 4*59599516SKenneth E. Jansenc 5*59599516SKenneth E. Jansenc This routine performs a matrix-vector product for the EBE - 6*59599516SKenneth E. Jansenc preconditioned GMRES solver. 7*59599516SKenneth E. Jansenc 8*59599516SKenneth E. Jansenc input: 9*59599516SKenneth E. Jansenc EGmass (numel, nedof, nedof) : element mass matrices 10*59599516SKenneth E. Jansenc ilwork (nlwork) : local MPI communication array 11*59599516SKenneth E. Jansenc 12*59599516SKenneth E. Jansenc output: 13*59599516SKenneth E. Jansenc uBrg (nshg,nflow) : next Krylov vector 14*59599516SKenneth E. Jansenc 15*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 16*59599516SKenneth E. Jansenc 17*59599516SKenneth E. Jansen use pointer_data 18*59599516SKenneth E. Jansen 19*59599516SKenneth E. Jansen include "common.h" 20*59599516SKenneth E. Jansen include "mpif.h" 21*59599516SKenneth E. Jansenc 22*59599516SKenneth E. Jansen dimension EGmass(numel,nedof,nedof), uBrg(nshg,nflow), 23*59599516SKenneth E. Jansen & uBtmp(nshg,nflow), ilwork(nlwork), 24*59599516SKenneth E. Jansen & iBC(nshg), 25*59599516SKenneth E. Jansen & iper(nshg) 26*59599516SKenneth E. Jansenc 27*59599516SKenneth E. Jansenc.... communicate:: copy the master's portion of uBrg to each slave 28*59599516SKenneth E. Jansenc 29*59599516SKenneth E. Jansen if (numpe > 1) then 30*59599516SKenneth E. Jansen call commu (uBrg, ilwork, nflow , 'out') 31*59599516SKenneth E. Jansen endif 32*59599516SKenneth E. Jansenc 33*59599516SKenneth E. Jansenc.... local periodic boundary conditions (no communications) 34*59599516SKenneth E. Jansenc 35*59599516SKenneth E. Jansen do j=1,nflow 36*59599516SKenneth E. Jansen uBrg(:,j)=uBrg(iper(:),j) 37*59599516SKenneth E. Jansen enddo 38*59599516SKenneth E. Jansenc 39*59599516SKenneth E. Jansenc slave has masters value, for abc we need to rotate it 40*59599516SKenneth E. Jansenc (if this is a vector only no SCALARS) 41*59599516SKenneth E. Jansen if((iabc==1)) !are there any axisym bc's 42*59599516SKenneth E. Jansen & call rotabc(uBrg(1,2), iBC, 'out') 43*59599516SKenneth E. Jansen 44*59599516SKenneth E. Jansenc 45*59599516SKenneth E. Jansenc.... initialize 46*59599516SKenneth E. Jansenc 47*59599516SKenneth E. Jansen uBtmp = zero 48*59599516SKenneth E. Jansenc 49*59599516SKenneth E. Jansenc.... loop over element blocks 50*59599516SKenneth E. Jansenc 51*59599516SKenneth E. Jansen do iblk = 1, nelblk 52*59599516SKenneth E. Jansen iel = lcblk(1,iblk) 53*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) 54*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 55*59599516SKenneth E. Jansen inum = iel + npro - 1 56*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 57*59599516SKenneth E. Jansenc 58*59599516SKenneth E. Jansenc.... compute and assemble the Au product 59*59599516SKenneth E. Jansenc 60*59599516SKenneth E. Jansen call asAuGMR (mien(iblk)%p, EGmass(iel:inum,:,:), uBrg, 61*59599516SKenneth E. Jansen & uBtmp ) 62*59599516SKenneth E. Jansenc 63*59599516SKenneth E. Jansen enddo 64*59599516SKenneth E. Jansen 65*59599516SKenneth E. Jansen uBrg = uBtmp 66*59599516SKenneth E. Jansenc 67*59599516SKenneth E. Jansenc.... --------------------> communications <------------------------- 68*59599516SKenneth E. Jansenc 69*59599516SKenneth E. Jansenc 70*59599516SKenneth E. Jansen if((iabc==1)) !are there any axisym bc's 71*59599516SKenneth E. Jansen & call rotabc(uBrg(1,2), iBC, 'in ') 72*59599516SKenneth E. Jansenc 73*59599516SKenneth E. Jansen if (numpe > 1) then 74*59599516SKenneth E. Jansenc 75*59599516SKenneth E. Jansenc.... send slave's copy of uBrg to the master 76*59599516SKenneth E. Jansenc 77*59599516SKenneth E. Jansen call commu (uBrg , ilwork, nflow , 'in ') 78*59599516SKenneth E. Jansenc 79*59599516SKenneth E. Jansenc.... nodes treated on another processor are eliminated 80*59599516SKenneth E. Jansenc 81*59599516SKenneth E. Jansen numtask = ilwork(1) 82*59599516SKenneth E. Jansen itkbeg = 1 83*59599516SKenneth E. Jansen 84*59599516SKenneth E. Jansen do itask = 1, numtask 85*59599516SKenneth E. Jansen 86*59599516SKenneth E. Jansen iacc = ilwork (itkbeg + 2) 87*59599516SKenneth E. Jansen numseg = ilwork (itkbeg + 4) 88*59599516SKenneth E. Jansen 89*59599516SKenneth E. Jansen if (iacc .eq. 0) then 90*59599516SKenneth E. Jansen do is = 1,numseg 91*59599516SKenneth E. Jansen isgbeg = ilwork (itkbeg + 3 + 2*is) 92*59599516SKenneth E. Jansen lenseg = ilwork (itkbeg + 4 + 2*is) 93*59599516SKenneth E. Jansen isgend = isgbeg + lenseg - 1 94*59599516SKenneth E. Jansen uBrg(isgbeg:isgend,:) = zero 95*59599516SKenneth E. Jansen enddo 96*59599516SKenneth E. Jansen endif 97*59599516SKenneth E. Jansen 98*59599516SKenneth E. Jansen itkbeg = itkbeg + 4 + 2*numseg 99*59599516SKenneth E. Jansen 100*59599516SKenneth E. Jansen enddo 101*59599516SKenneth E. Jansen endif 102*59599516SKenneth E. Jansenc 103*59599516SKenneth E. Jansenc.... end 104*59599516SKenneth E. Jansenc 105*59599516SKenneth E. Jansen return 106*59599516SKenneth E. Jansen end 107*59599516SKenneth E. Jansenc 108*59599516SKenneth E. Jansenc 109*59599516SKenneth E. Jansenc 110*59599516SKenneth E. Jansen subroutine Au1GMRSclr (EGmasst, uBrg, ilwork, iper ) 111*59599516SKenneth E. Jansenc 112*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 113*59599516SKenneth E. Jansenc 114*59599516SKenneth E. Jansenc This routine performs a matrix-vector product for the EBE - 115*59599516SKenneth E. Jansenc preconditioned GMRES solver. 116*59599516SKenneth E. Jansenc 117*59599516SKenneth E. Jansenc input: 118*59599516SKenneth E. Jansenc EGmasst (numel, nshape, nshape) : element mass matrices 119*59599516SKenneth E. Jansenc ilwork (nlwork) : local MPI communication array 120*59599516SKenneth E. Jansenc 121*59599516SKenneth E. Jansenc output: 122*59599516SKenneth E. Jansenc uBrg (nshg) : next Krylov vector 123*59599516SKenneth E. Jansenc 124*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 125*59599516SKenneth E. Jansenc 126*59599516SKenneth E. Jansen use pointer_data 127*59599516SKenneth E. Jansen 128*59599516SKenneth E. Jansen include "common.h" 129*59599516SKenneth E. Jansen include "mpif.h" 130*59599516SKenneth E. Jansenc 131*59599516SKenneth E. Jansen dimension EGmasst(numel,nshape,nshape),uBrg(nshg), 132*59599516SKenneth E. Jansen & uBtmp(nshg), ilwork(nlwork), iper(nshg) 133*59599516SKenneth E. Jansenc 134*59599516SKenneth E. Jansenc.... communicate:: copy the master's portion of uBrg to each slave 135*59599516SKenneth E. Jansenc 136*59599516SKenneth E. Jansen if (numpe > 1) then 137*59599516SKenneth E. Jansen call commu (uBrg, ilwork, 1, 'out') 138*59599516SKenneth E. Jansen endif 139*59599516SKenneth E. Jansenc ... changed 140*59599516SKenneth E. Jansenc.... local periodic boundary conditions (no communications) 141*59599516SKenneth E. Jansenc 142*59599516SKenneth E. Jansen uBrg(:)=uBrg(iper(:)) 143*59599516SKenneth E. Jansenc 144*59599516SKenneth E. Jansenc 145*59599516SKenneth E. Jansenc.... initialize 146*59599516SKenneth E. Jansenc 147*59599516SKenneth E. Jansen uBtmp = zero 148*59599516SKenneth E. Jansenc 149*59599516SKenneth E. Jansenc.... loop over element blocks 150*59599516SKenneth E. Jansenc 151*59599516SKenneth E. Jansen do iblk = 1, nelblk 152*59599516SKenneth E. Jansen iel = lcblk(1,iblk) 153*59599516SKenneth E. Jansen nenl = lcblk(5,iblk) 154*59599516SKenneth E. Jansen npro = lcblk(1,iblk+1) - iel 155*59599516SKenneth E. Jansen inum = iel + npro - 1 156*59599516SKenneth E. Jansen nshl = lcblk(10,iblk) 157*59599516SKenneth E. Jansenc 158*59599516SKenneth E. Jansenc.... compute and assemble the Au product 159*59599516SKenneth E. Jansenc 160*59599516SKenneth E. Jansen call asAuGMRSclr (mien(iblk)%p, EGmassT(iel:inum,:,:), uBrg, 161*59599516SKenneth E. Jansen & uBtmp ) 162*59599516SKenneth E. Jansenc 163*59599516SKenneth E. Jansen enddo 164*59599516SKenneth E. Jansen 165*59599516SKenneth E. Jansen uBrg = uBtmp 166*59599516SKenneth E. Jansenc 167*59599516SKenneth E. Jansenc.... --------------------> communications <------------------------- 168*59599516SKenneth E. Jansenc 169*59599516SKenneth E. Jansen if (numpe > 1) then 170*59599516SKenneth E. Jansenc 171*59599516SKenneth E. Jansenc.... send slave's copy of uBrg to the master 172*59599516SKenneth E. Jansenc 173*59599516SKenneth E. Jansen call commu (uBrg , ilwork, 1, 'in ') 174*59599516SKenneth E. Jansenc 175*59599516SKenneth E. Jansenc.... nodes treated on another processor are eliminated 176*59599516SKenneth E. Jansenc 177*59599516SKenneth E. Jansen numtask = ilwork(1) 178*59599516SKenneth E. Jansen itkbeg = 1 179*59599516SKenneth E. Jansen 180*59599516SKenneth E. Jansen do itask = 1, numtask 181*59599516SKenneth E. Jansen 182*59599516SKenneth E. Jansen iacc = ilwork (itkbeg + 2) 183*59599516SKenneth E. Jansen numseg = ilwork (itkbeg + 4) 184*59599516SKenneth E. Jansen 185*59599516SKenneth E. Jansen if (iacc .eq. 0) then 186*59599516SKenneth E. Jansen do is = 1,numseg 187*59599516SKenneth E. Jansen isgbeg = ilwork (itkbeg + 3 + 2*is) 188*59599516SKenneth E. Jansen lenseg = ilwork (itkbeg + 4 + 2*is) 189*59599516SKenneth E. Jansen isgend = isgbeg + lenseg - 1 190*59599516SKenneth E. Jansen uBrg(isgbeg:isgend) = zero 191*59599516SKenneth E. Jansen enddo 192*59599516SKenneth E. Jansen endif 193*59599516SKenneth E. Jansen 194*59599516SKenneth E. Jansen itkbeg = itkbeg + 4 + 2*numseg 195*59599516SKenneth E. Jansen 196*59599516SKenneth E. Jansen enddo 197*59599516SKenneth E. Jansen endif 198*59599516SKenneth E. Jansenc 199*59599516SKenneth E. Jansenc.... end 200*59599516SKenneth E. Jansenc 201*59599516SKenneth E. Jansen return 202*59599516SKenneth E. Jansen end 203*59599516SKenneth E. Jansen 204*59599516SKenneth E. Jansen 205