1*59599516SKenneth E. Jansen subroutine SparseAp(iper, ilwork, iBC, col, row, lhsK, p) 2*59599516SKenneth E. Jansen 3*59599516SKenneth E. JansenC============================================================================ 4*59599516SKenneth E. JansenC 5*59599516SKenneth E. JansenC "SparseAp": This routine performs the product of a sparsley stored matrix 6*59599516SKenneth E. JansenC lhsK(nflow*nflow, nnz_tot) and a vector p(nshg, nflow). The 7*59599516SKenneth E. JansenC results of the product is returned in p(nshg, nflow). 8*59599516SKenneth E. JansenC 9*59599516SKenneth E. JansenC Nahid Razmara, Spring 2000. (Sparse Matrix) 10*59599516SKenneth E. JansenC============================================================================ 11*59599516SKenneth E. Jansen 12*59599516SKenneth E. Jansenc 13*59599516SKenneth E. Jansen include "common.h" 14*59599516SKenneth E. Jansenc 15*59599516SKenneth E. Jansenc 16*59599516SKenneth E. Jansenc.... Data declaration 17*59599516SKenneth E. Jansenc 18*59599516SKenneth E. Jansen integer col(nshg+1), row(nnz*nshg), 19*59599516SKenneth E. Jansen & iper(nshg), ilwork(nlwork) 20*59599516SKenneth E. Jansen real*8 lhsK(nflow*nflow,nnz_tot) 21*59599516SKenneth E. Jansen real*8 p(nshg,nflow), q(nshg,nflow) 22*59599516SKenneth E. Jansenc 23*59599516SKenneth E. Jansen real*8 tmp1, tmp2, tmp3, tmp4, tmp5 24*59599516SKenneth E. Jansenc 25*59599516SKenneth E. Jansenc.... communicate:: copy the master's portion of uBrg to each slave 26*59599516SKenneth E. Jansenc 27*59599516SKenneth E. Jansen if (numpe > 1) then 28*59599516SKenneth E. Jansen call commu (p, ilwork, nflow , 'out') 29*59599516SKenneth E. Jansen endif 30*59599516SKenneth E. Jansenc 31*59599516SKenneth E. Jansenc.... local periodic boundary conditions (no communications) 32*59599516SKenneth E. Jansenc 33*59599516SKenneth E. Jansen do j=1,nflow 34*59599516SKenneth E. Jansen p(:,j)=p(iper(:),j) 35*59599516SKenneth E. Jansen enddo 36*59599516SKenneth E. Jansenc 37*59599516SKenneth E. Jansenc slave has masters value, for abc we need to rotate it 38*59599516SKenneth E. Jansenc (if this is a vector only no SCALARS) 39*59599516SKenneth E. Jansen if((iabc==1)) !are there any axisym bc's 40*59599516SKenneth E. Jansen & call rotabc(p(1,2), iBC, 'out') 41*59599516SKenneth E. Jansenc 42*59599516SKenneth E. Jansenc.... clear the vector 43*59599516SKenneth E. Jansenc 44*59599516SKenneth E. Jansen q=zero 45*59599516SKenneth E. Jansenc 46*59599516SKenneth E. Jansenc.... Perform Matrix-Vector (AP) product 47*59599516SKenneth E. Jansenc 48*59599516SKenneth E. Jansen do i = 1, nshg 49*59599516SKenneth E. Jansenc 50*59599516SKenneth E. Jansen tmp1 = 0. 51*59599516SKenneth E. Jansen tmp2 = 0. 52*59599516SKenneth E. Jansen tmp3 = 0. 53*59599516SKenneth E. Jansen tmp4 = 0. 54*59599516SKenneth E. Jansen tmp5 = 0. 55*59599516SKenneth E. Jansenc 56*59599516SKenneth E. Jansen do k = col(i), col(i+1)-1 57*59599516SKenneth E. Jansen j = row(k) 58*59599516SKenneth E. Jansenc 59*59599516SKenneth E. Jansen tmp1 = tmp1 + lhsK(1 ,k)*p(j,1) 60*59599516SKenneth E. Jansen 1 + lhsK(6 ,k)*p(j,2) 61*59599516SKenneth E. Jansen 2 + lhsK(11,k)*p(j,3) 62*59599516SKenneth E. Jansen 3 + lhsK(16,k)*p(j,4) 63*59599516SKenneth E. Jansen 4 + lhsK(21,k)*p(j,5) 64*59599516SKenneth E. Jansen tmp2 = tmp2 + lhsK(2 ,k)*p(j,1) 65*59599516SKenneth E. Jansen 1 + lhsK(7 ,k)*p(j,2) 66*59599516SKenneth E. Jansen 2 + lhsK(12,k)*p(j,3) 67*59599516SKenneth E. Jansen 3 + lhsK(17,k)*p(j,4) 68*59599516SKenneth E. Jansen 4 + lhsK(22,k)*p(j,5) 69*59599516SKenneth E. Jansen tmp3 = tmp3 + lhsK(3 ,k)*p(j,1) 70*59599516SKenneth E. Jansen 1 + lhsK(8 ,k)*p(j,2) 71*59599516SKenneth E. Jansen 2 + lhsK(13,k)*p(j,3) 72*59599516SKenneth E. Jansen 3 + lhsK(18,k)*p(j,4) 73*59599516SKenneth E. Jansen 4 + lhsK(23,k)*p(j,5) 74*59599516SKenneth E. Jansen tmp4 = tmp4 + lhsK(4 ,k)*p(j,1) 75*59599516SKenneth E. Jansen 1 + lhsK(9 ,k)*p(j,2) 76*59599516SKenneth E. Jansen 2 + lhsK(14,k)*p(j,3) 77*59599516SKenneth E. Jansen 3 + lhsK(19,k)*p(j,4) 78*59599516SKenneth E. Jansen 4 + lhsK(24,k)*p(j,5) 79*59599516SKenneth E. Jansen tmp5 = tmp5 + lhsK(5 ,k)*p(j,1) 80*59599516SKenneth E. Jansen 1 + lhsK(10,k)*p(j,2) 81*59599516SKenneth E. Jansen 2 + lhsK(15,k)*p(j,3) 82*59599516SKenneth E. Jansen 3 + lhsK(20,k)*p(j,4) 83*59599516SKenneth E. Jansen 4 + lhsK(25,k)*p(j,5) 84*59599516SKenneth E. Jansenc 85*59599516SKenneth E. Jansen enddo 86*59599516SKenneth E. Jansen 87*59599516SKenneth E. Jansen q(i,1) = q(i,1) + tmp1 88*59599516SKenneth E. Jansen q(i,2) = q(i,2) + tmp2 89*59599516SKenneth E. Jansen q(i,3) = q(i,3) + tmp3 90*59599516SKenneth E. Jansen q(i,4) = q(i,4) + tmp4 91*59599516SKenneth E. Jansen q(i,5) = q(i,5) + tmp5 92*59599516SKenneth E. Jansen enddo 93*59599516SKenneth E. Jansen 94*59599516SKenneth E. Jansen 95*59599516SKenneth E. Jansen 96*59599516SKenneth E. Jansenc 97*59599516SKenneth E. Jansen p = q 98*59599516SKenneth E. Jansenc 99*59599516SKenneth E. Jansenc 100*59599516SKenneth E. Jansenc.... --------------------> communications <------------------------- 101*59599516SKenneth E. Jansenc 102*59599516SKenneth E. Jansenc 103*59599516SKenneth E. Jansen if((iabc==1)) !are there any axisym bc's 104*59599516SKenneth E. Jansen & call rotabc(p(1,2), iBC, 'in ') 105*59599516SKenneth E. Jansenc 106*59599516SKenneth E. Jansen if (numpe > 1) then 107*59599516SKenneth E. Jansenc 108*59599516SKenneth E. Jansenc.... send slave's copy of uBrg to the master 109*59599516SKenneth E. Jansenc 110*59599516SKenneth E. Jansen call commu (p , ilwork, nflow , 'in ') 111*59599516SKenneth E. Jansenc 112*59599516SKenneth E. Jansenc.... nodes treated on another processor are eliminated 113*59599516SKenneth E. Jansenc 114*59599516SKenneth E. Jansen numtask = ilwork(1) 115*59599516SKenneth E. Jansen itkbeg = 1 116*59599516SKenneth E. Jansen 117*59599516SKenneth E. Jansen do itask = 1, numtask 118*59599516SKenneth E. Jansen 119*59599516SKenneth E. Jansen iacc = ilwork (itkbeg + 2) 120*59599516SKenneth E. Jansen numseg = ilwork (itkbeg + 4) 121*59599516SKenneth E. Jansen 122*59599516SKenneth E. Jansen if (iacc .eq. 0) then 123*59599516SKenneth E. Jansen do is = 1,numseg 124*59599516SKenneth E. Jansen isgbeg = ilwork (itkbeg + 3 + 2*is) 125*59599516SKenneth E. Jansen lenseg = ilwork (itkbeg + 4 + 2*is) 126*59599516SKenneth E. Jansen isgend = isgbeg + lenseg - 1 127*59599516SKenneth E. Jansen p(isgbeg:isgend,:) = zero 128*59599516SKenneth E. Jansen enddo 129*59599516SKenneth E. Jansen endif 130*59599516SKenneth E. Jansen 131*59599516SKenneth E. Jansen itkbeg = itkbeg + 4 + 2*numseg 132*59599516SKenneth E. Jansen 133*59599516SKenneth E. Jansen enddo 134*59599516SKenneth E. Jansen endif 135*59599516SKenneth E. Jansenc 136*59599516SKenneth E. Jansen return 137*59599516SKenneth E. Jansen end 138*59599516SKenneth E. Jansen 139