xref: /phasta/phSolver/compressible/sparseap.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
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