xref: /phasta/phSolver/incompressible/lesSparse.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansenc---------------------------------------------------------------------
2*59599516SKenneth E. Jansenc
3*59599516SKenneth E. Jansenc     drvftools.f : Bundle of Fortran driver routines for ftools.f
4*59599516SKenneth E. Jansenc
5*59599516SKenneth E. Jansenc     Each routine is to be called by les**.c
6*59599516SKenneth E. Jansenc
7*59599516SKenneth E. Jansenc---------------------------------------------------------------------
8*59599516SKenneth E. Jansenc
9*59599516SKenneth E. Jansenc----------------
10*59599516SKenneth E. Jansenc     drvLesPrepDiag
11*59599516SKenneth E. Jansenc----------------
12*59599516SKenneth E. Jansenc
13*59599516SKenneth E. Jansen      subroutine drvlesPrepDiag ( flowDiag, ilwork,
14*59599516SKenneth E. Jansen     &                            iBC,      BC,      iper,
15*59599516SKenneth E. Jansen     &                            rowp,     colm,
16*59599516SKenneth E. Jansen     &                            lhsK,     lhsP)
17*59599516SKenneth E. Jansenc
18*59599516SKenneth E. Jansen      use pointer_data
19*59599516SKenneth E. Jansen      use pvsQbi
20*59599516SKenneth E. Jansen      use convolImpFlow !brings in the current part of convol coef for imp BC
21*59599516SKenneth E. Jansen      use convolRCRFlow !brings in the current part of convol coef for RCR BC
22*59599516SKenneth E. Jansen
23*59599516SKenneth E. Jansen      include "common.h"
24*59599516SKenneth E. Jansen      include "mpif.h"
25*59599516SKenneth E. Jansenc
26*59599516SKenneth E. Jansen      dimension flowDiag(nshg,4), ilwork(nlwork)
27*59599516SKenneth E. Jansen      dimension iBC(nshg), iper(nshg), BC(nshg,ndofBC)
28*59599516SKenneth E. Jansen      real*8 lhsK(9,nnz_tot), lhsP(4,nnz_tot)
29*59599516SKenneth E. Jansen      integer rowp(nnz_tot),  colm(nshg+1)
30*59599516SKenneth E. Jansen      integer	n,	k
31*59599516SKenneth E. Jansenc
32*59599516SKenneth E. Jansen      integer sparseloc
33*59599516SKenneth E. Jansenc
34*59599516SKenneth E. Jansenc
35*59599516SKenneth E. Jansenc.... Clear the flowdiag
36*59599516SKenneth E. Jansenc
37*59599516SKenneth E. Jansen      if((flmpl.eq.1).or.(ipord.gt.1)) then
38*59599516SKenneth E. Jansen         do n = 1, nshg
39*59599516SKenneth E. Jansen	    k = sparseloc( rowp(colm(n)), colm(n+1)-colm(n), n )
40*59599516SKenneth E. Jansen     &       + colm(n)-1
41*59599516SKenneth E. Jansenc
42*59599516SKenneth E. Jansen	    flowdiag(n,1) = lhsK(1,k)
43*59599516SKenneth E. Jansen	    flowdiag(n,2) = lhsK(5,k)
44*59599516SKenneth E. Jansen	    flowdiag(n,3) = lhsK(9,k)
45*59599516SKenneth E. Jansenc
46*59599516SKenneth E. Jansen	    flowdiag(n,4) = lhsP(4,k)
47*59599516SKenneth E. Jansen         enddo
48*59599516SKenneth E. Jansen      else
49*59599516SKenneth E. Jansen	flowDiag = zero
50*59599516SKenneth E. Jansen	do n = 1, nshg  ! rowsum put on the diagonal instead of diag entry
51*59599516SKenneth E. Jansen           do k=colm(n),colm(n+1)-1
52*59599516SKenneth E. Jansen
53*59599516SKenneth E. Jansenc
54*59599516SKenneth E. Jansen              flowdiag(n,1) = flowdiag(n,1) + abs(lhsK(1,k))
55*59599516SKenneth E. Jansenc     &                          + lhsK(2,k) + lhsK(3,k)
56*59599516SKenneth E. Jansen              flowdiag(n,2) = flowdiag(n,2) + abs(lhsK(5,k))
57*59599516SKenneth E. Jansenc     &                          + lhsK(4,k) + lhsK(6,k)
58*59599516SKenneth E. Jansen              flowdiag(n,3) = flowdiag(n,3) + abs(lhsK(9,k))
59*59599516SKenneth E. Jansenc     &                          + lhsK(7,k) + lhsK(8,k)
60*59599516SKenneth E. Jansenc
61*59599516SKenneth E. Jansen              flowdiag(n,4) = flowdiag(n,4) + abs(lhsP(4,k))
62*59599516SKenneth E. Jansen           enddo
63*59599516SKenneth E. Jansen           flowdiag(n,:)=flowdiag(n,:)*pt33
64*59599516SKenneth E. Jansen	enddo
65*59599516SKenneth E. Jansen      endif
66*59599516SKenneth E. Jansen      if(ipvsq.ge.3) then ! for first cut only do diagonal extraction
67*59599516SKenneth E. Jansen ! this is not yet correct for multi procs I suspect if partition
68*59599516SKenneth E. Jansen ! boundary cuts a p=QR face
69*59599516SKenneth E. Jansen         tfact=alfi * gami * Delt(1)
70*59599516SKenneth E. Jansen         do n=1,nshg
71*59599516SKenneth E. Jansen            if(numResistSrfs.gt.zero) then
72*59599516SKenneth E. Jansen               do k = 1,numResistSrfs
73*59599516SKenneth E. Jansen                  if (nsrflistResist(k).eq.ndsurf(n)) then
74*59599516SKenneth E. Jansen                     irankCoupled=k
75*59599516SKenneth E. Jansen                     flowdiag(n,1:3) = flowdiag(n,1:3)
76*59599516SKenneth E. Jansen     &               + tfact*ValueListResist(irankCoupled)*
77*59599516SKenneth E. Jansen     &               NABI(n,:)*NABI(n,:)
78*59599516SKenneth E. Jansen                     exit
79*59599516SKenneth E. Jansen                  endif
80*59599516SKenneth E. Jansen               enddo
81*59599516SKenneth E. Jansen            elseif(numImpSrfs.gt.zero) then
82*59599516SKenneth E. Jansen               do k = 1,numImpSrfs
83*59599516SKenneth E. Jansen                  if (nsrflistImp(k).eq.ndsurf(n)) then
84*59599516SKenneth E. Jansen                     irankCoupled=k
85*59599516SKenneth E. Jansen                     flowdiag(n,1:3) = flowdiag(n,1:3)
86*59599516SKenneth E. Jansen     &               + tfact*ImpConvCoef(ntimeptpT+2,irankCoupled)*
87*59599516SKenneth E. Jansen     &               NABI(n,:)*NABI(n,:)
88*59599516SKenneth E. Jansen                     exit
89*59599516SKenneth E. Jansen                  endif
90*59599516SKenneth E. Jansen               enddo
91*59599516SKenneth E. Jansen            elseif(numRCRSrfs.gt.zero) then
92*59599516SKenneth E. Jansen               do k = 1,numRCRSrfs
93*59599516SKenneth E. Jansen                  if (nsrflistRCR(k).eq.ndsurf(n)) then
94*59599516SKenneth E. Jansen                     irankCoupled=k
95*59599516SKenneth E. Jansen                     flowdiag(n,1:3) = flowdiag(n,1:3)
96*59599516SKenneth E. Jansen     &               + tfact*RCRConvCoef(lstep+2,irankCoupled)* !check lstep+2 if restart from t.ne.0
97*59599516SKenneth E. Jansen     &               NABI(n,:)*NABI(n,:)
98*59599516SKenneth E. Jansen                     exit
99*59599516SKenneth E. Jansen                  endif
100*59599516SKenneth E. Jansen               enddo
101*59599516SKenneth E. Jansen            endif
102*59599516SKenneth E. Jansen         enddo
103*59599516SKenneth E. Jansen      endif
104*59599516SKenneth E. Jansenc
105*59599516SKenneth E. Jansen
106*59599516SKenneth E. Jansenc
107*59599516SKenneth E. Jansen      if(iabc==1)    !are there any axisym bc's
108*59599516SKenneth E. Jansen     &      call rotabc(flowdiag, iBC, 'in ')
109*59599516SKenneth E. Jansenc
110*59599516SKenneth E. Jansen
111*59599516SKenneth E. Jansenc
112*59599516SKenneth E. Jansenc.... communicate : add the slaves part to the master's part of flowDiag
113*59599516SKenneth E. Jansenc
114*59599516SKenneth E. Jansen	if (numpe > 1) then
115*59599516SKenneth E. Jansen           call commu (flowDiag, ilwork, nflow, 'in ')
116*59599516SKenneth E. Jansen        endif
117*59599516SKenneth E. Jansenc
118*59599516SKenneth E. Jansenc.... satisfy the boundary conditions on the diagonal
119*59599516SKenneth E. Jansenc
120*59599516SKenneth E. Jansen        call bc3diag(iBC, BC,  flowDiag)
121*59599516SKenneth E. Jansenc
122*59599516SKenneth E. Jansenc
123*59599516SKenneth E. Jansenc.... on processor periodicity was not taken care of in the setting of the
124*59599516SKenneth E. Jansenc     boundary conditions on the matrix.  Take care of it now.
125*59599516SKenneth E. Jansenc
126*59599516SKenneth E. Jansen        call bc3per(iBC,  flowDiag, iper, ilwork, 4)
127*59599516SKenneth E. Jansenc
128*59599516SKenneth E. Jansenc... slaves and masters have the correct values
129*59599516SKenneth E. Jansenc
130*59599516SKenneth E. Jansenc
131*59599516SKenneth E. Jansenc.... Calculate square root
132*59599516SKenneth E. Jansenc
133*59599516SKenneth E. Jansen        do i = 1, nshg
134*59599516SKenneth E. Jansen           do j = 1, nflow
135*59599516SKenneth E. Jansen              if (flowDiag(i,j).ne.0)
136*59599516SKenneth E. Jansen     &             flowDiag(i,j) = 1. / sqrt(abs(flowDiag(i,j)))
137*59599516SKenneth E. Jansen           enddo
138*59599516SKenneth E. Jansen        enddo
139*59599516SKenneth E. Jansenc
140*59599516SKenneth E. Jansen        return
141*59599516SKenneth E. Jansen        end
142*59599516SKenneth E. Jansen
143*59599516SKenneth E. Jansenc
144*59599516SKenneth E. Jansenc-------------
145*59599516SKenneth E. Jansenc     drvsclrDiag
146*59599516SKenneth E. Jansenc-------------
147*59599516SKenneth E. Jansenc
148*59599516SKenneth E. Jansen      subroutine drvsclrDiag ( sclrDiag, ilwork, iBC, BC, iper,
149*59599516SKenneth E. Jansen     &                         rowp,     colm,   lhsS )
150*59599516SKenneth E. Jansenc
151*59599516SKenneth E. Jansen      use pointer_data
152*59599516SKenneth E. Jansen      include "common.h"
153*59599516SKenneth E. Jansen      include "mpif.h"
154*59599516SKenneth E. Jansenc
155*59599516SKenneth E. Jansen      integer  ilwork(nlwork),    iBC(nshg),     iper(nshg),
156*59599516SKenneth E. Jansen     &         rowp(nnz_tot),    colm(nshg+1)
157*59599516SKenneth E. Jansen
158*59599516SKenneth E. Jansen      real*8   sclrDiag(nshg),    lhsS(nnz_tot), BC(nshg,ndofBC)
159*59599516SKenneth E. Jansen      integer sparseloc
160*59599516SKenneth E. Jansen
161*59599516SKenneth E. Jansen      sclrDiag = zero
162*59599516SKenneth E. Jansen      do n = 1, nshg
163*59599516SKenneth E. Jansen         k = sparseloc( rowp(colm(n)), colm(n+1)-colm(n), n )
164*59599516SKenneth E. Jansen     &                               + colm(n)-1
165*59599516SKenneth E. Jansenc
166*59599516SKenneth E. Jansen         sclrDiag(n) = lhsS(k)
167*59599516SKenneth E. Jansen      enddo
168*59599516SKenneth E. Jansenc
169*59599516SKenneth E. Jansenc.... communicate : add the slaves part to the master's part of sclrDiag
170*59599516SKenneth E. Jansenc
171*59599516SKenneth E. Jansen	if (numpe > 1) then
172*59599516SKenneth E. Jansen           call commu (sclrDiag, ilwork, 1, 'in ')
173*59599516SKenneth E. Jansen        endif
174*59599516SKenneth E. Jansenc
175*59599516SKenneth E. Jansenc.... satisfy the boundary conditions on the diagonal
176*59599516SKenneth E. Jansenc
177*59599516SKenneth E. Jansen        call bc3SclrDiag(iBC,  sclrDiag)
178*59599516SKenneth E. Jansenc
179*59599516SKenneth E. Jansenc
180*59599516SKenneth E. Jansenc.... on processor periodicity was not taken care of in the setting of the
181*59599516SKenneth E. Jansenc     boundary conditions on the matrix.  Take care of it now.
182*59599516SKenneth E. Jansenc
183*59599516SKenneth E. Jansen        call bc3per(iBC,  sclrDiag, iper, ilwork, 1)
184*59599516SKenneth E. Jansenc
185*59599516SKenneth E. Jansenc... slaves and masters have the correct values
186*59599516SKenneth E. Jansenc
187*59599516SKenneth E. Jansenc
188*59599516SKenneth E. Jansenc.... Calculate square root
189*59599516SKenneth E. Jansenc
190*59599516SKenneth E. Jansen        do i = 1, nshg
191*59599516SKenneth E. Jansen           if (sclrDiag(i).ne.0) then
192*59599516SKenneth E. Jansen              sclrDiag(i) = 1. / sqrt(abs(sclrDiag(i)))
193*59599516SKenneth E. Jansen           endif
194*59599516SKenneth E. Jansen        enddo
195*59599516SKenneth E. Jansenc
196*59599516SKenneth E. Jansen      return
197*59599516SKenneth E. Jansen      end
198*59599516SKenneth E. Jansen
199*59599516SKenneth E. JansenC============================================================================
200*59599516SKenneth E. JansenC
201*59599516SKenneth E. JansenC "fLesSparseApG":
202*59599516SKenneth E. JansenC
203*59599516SKenneth E. JansenC============================================================================
204*59599516SKenneth E. Jansen	subroutine fLesSparseApG(	col,	row,	pLhs,
205*59599516SKenneth E. Jansen     &					p,	q,	nNodes,
206*59599516SKenneth E. Jansen     &                                  nnz_tot )
207*59599516SKenneth E. Jansenc
208*59599516SKenneth E. Jansenc.... Data declaration
209*59599516SKenneth E. Jansenc
210*59599516SKenneth E. Jansen	implicit none
211*59599516SKenneth E. Jansen	integer	nNodes, nnz_tot
212*59599516SKenneth E. Jansen	integer	col(nNodes+1),	row(nnz_tot)
213*59599516SKenneth E. Jansen	real*8	pLhs(4,nnz_tot),	p(nNodes),	q(nNodes,3)
214*59599516SKenneth E. Jansenc
215*59599516SKenneth E. Jansen	real*8	pisave
216*59599516SKenneth E. Jansen	integer	i,	j,	k
217*59599516SKenneth E. Jansenc
218*59599516SKenneth E. Jansenc.... clear the vector
219*59599516SKenneth E. Jansenc
220*59599516SKenneth E. Jansen	do i = 1, nNodes
221*59599516SKenneth E. Jansen	    q(i,1) = 0
222*59599516SKenneth E. Jansen	    q(i,2) = 0
223*59599516SKenneth E. Jansen	    q(i,3) = 0
224*59599516SKenneth E. Jansen	enddo
225*59599516SKenneth E. Jansenc
226*59599516SKenneth E. Jansenc.... Do an AP product
227*59599516SKenneth E. Jansenc
228*59599516SKenneth E. Jansen	do i = 1, nNodes
229*59599516SKenneth E. Jansenc
230*59599516SKenneth E. Jansen	    pisave = p(i)
231*59599516SKenneth E. Jansencdir$ ivdep
232*59599516SKenneth E. Jansen	    do k = col(i), col(i+1)-1
233*59599516SKenneth E. Jansen		j = row(k)
234*59599516SKenneth E. Jansenc
235*59599516SKenneth E. Jansen		q(j,1) = q(j,1) - pLhs(1,k) * pisave
236*59599516SKenneth E. Jansen		q(j,2) = q(j,2) - pLhs(2,k) * pisave
237*59599516SKenneth E. Jansen		q(j,3) = q(j,3) - pLhs(3,k) * pisave
238*59599516SKenneth E. Jansen	    enddo
239*59599516SKenneth E. Jansen	enddo
240*59599516SKenneth E. Jansenc
241*59599516SKenneth E. Jansenc.... end
242*59599516SKenneth E. Jansenc
243*59599516SKenneth E. Jansen	return
244*59599516SKenneth E. Jansen	end
245*59599516SKenneth E. Jansen
246*59599516SKenneth E. JansenC============================================================================
247*59599516SKenneth E. JansenC
248*59599516SKenneth E. JansenC "fLesSparseApKG":
249*59599516SKenneth E. JansenC
250*59599516SKenneth E. JansenC============================================================================
251*59599516SKenneth E. Jansen
252*59599516SKenneth E. Jansen	subroutine fLesSparseApKG(	col,	row,	kLhs,	pLhs,
253*59599516SKenneth E. Jansen     1					p,	q,	nNodes,
254*59599516SKenneth E. Jansen     2                                  nnz_tot_hide )
255*59599516SKenneth E. Jansenc
256*59599516SKenneth E. Jansenc.... Data declaration
257*59599516SKenneth E. Jansenc
258*59599516SKenneth E. Jansenc	implicit none
259*59599516SKenneth E. Jansen        use pvsQbi
260*59599516SKenneth E. Jansen        include "common.h"
261*59599516SKenneth E. Jansen	integer	nNodes, nnz_tot
262*59599516SKenneth E. Jansen	integer	col(nNodes+1),	row(nnz_tot)
263*59599516SKenneth E. Jansen	real*8	kLhs(9,nnz_tot),	pLhs(4,nnz_tot)
264*59599516SKenneth E. Jansen        real*8 	p(nNodes,4),	q(nNodes,3)
265*59599516SKenneth E. Jansenc
266*59599516SKenneth E. Jansen	real*8	tmp1,	tmp2,	tmp3,	pisave
267*59599516SKenneth E. Jansen	integer	i,	j,	k
268*59599516SKenneth E. Jansenc
269*59599516SKenneth E. Jansenc.... clear the vector
270*59599516SKenneth E. Jansenc
271*59599516SKenneth E. Jansen	do i = 1, nNodes
272*59599516SKenneth E. Jansen	    q(i,1) = 0
273*59599516SKenneth E. Jansen	    q(i,2) = 0
274*59599516SKenneth E. Jansen	    q(i,3) = 0
275*59599516SKenneth E. Jansen	enddo
276*59599516SKenneth E. Jansenc
277*59599516SKenneth E. Jansenc.... Do an AP product
278*59599516SKenneth E. Jansenc
279*59599516SKenneth E. Jansen	do i = 1, nNodes
280*59599516SKenneth E. Jansenc
281*59599516SKenneth E. Jansen	    tmp1 = 0
282*59599516SKenneth E. Jansen	    tmp2 = 0
283*59599516SKenneth E. Jansen	    tmp3 = 0
284*59599516SKenneth E. Jansen	    pisave   = p(i,4)
285*59599516SKenneth E. Jansencdir$ ivdep
286*59599516SKenneth E. Jansen	    do k = col(i), col(i+1)-1
287*59599516SKenneth E. Jansen		j = row(k)
288*59599516SKenneth E. Jansen		tmp1 = tmp1
289*59599516SKenneth E. Jansen     1		     + kLhs(1,k) * p(j,1)
290*59599516SKenneth E. Jansen     2		     + kLhs(4,k) * p(j,2)
291*59599516SKenneth E. Jansen     3		     + kLhs(7,k) * p(j,3)
292*59599516SKenneth E. Jansen		tmp2 = tmp2
293*59599516SKenneth E. Jansen     1		     + kLhs(2,k) * p(j,1)
294*59599516SKenneth E. Jansen     2		     + kLhs(5,k) * p(j,2)
295*59599516SKenneth E. Jansen     3		     + kLhs(8,k) * p(j,3)
296*59599516SKenneth E. Jansen		tmp3 = tmp3
297*59599516SKenneth E. Jansen     1		     + kLhs(3,k) * p(j,1)
298*59599516SKenneth E. Jansen     2		     + kLhs(6,k) * p(j,2)
299*59599516SKenneth E. Jansen     3		     + kLhs(9,k) * p(j,3)
300*59599516SKenneth E. Jansenc
301*59599516SKenneth E. Jansen		q(j,1) = q(j,1) - pLhs(1,k) * pisave
302*59599516SKenneth E. Jansen		q(j,2) = q(j,2) - pLhs(2,k) * pisave
303*59599516SKenneth E. Jansen		q(j,3) = q(j,3) - pLhs(3,k) * pisave
304*59599516SKenneth E. Jansen	    enddo
305*59599516SKenneth E. Jansen	    q(i,1) = q(i,1) + tmp1
306*59599516SKenneth E. Jansen	    q(i,2) = q(i,2) + tmp2
307*59599516SKenneth E. Jansen	    q(i,3) = q(i,3) + tmp3
308*59599516SKenneth E. Jansen	enddo
309*59599516SKenneth E. Jansen
310*59599516SKenneth E. Jansen        if(ipvsq.ge.2) then
311*59599516SKenneth E. Jansen         tfact=alfi * gami * Delt(1)
312*59599516SKenneth E. Jansen           call ElmpvsQ(q,p,tfact)
313*59599516SKenneth E. Jansen        endif
314*59599516SKenneth E. Jansenc
315*59599516SKenneth E. Jansenc.... end
316*59599516SKenneth E. Jansenc
317*59599516SKenneth E. Jansen	return
318*59599516SKenneth E. Jansen	end
319*59599516SKenneth E. Jansen
320*59599516SKenneth E. Jansen
321*59599516SKenneth E. JansenC============================================================================
322*59599516SKenneth E. JansenC
323*59599516SKenneth E. JansenC "fLesSparseApNGt":
324*59599516SKenneth E. JansenC
325*59599516SKenneth E. JansenC============================================================================
326*59599516SKenneth E. Jansen
327*59599516SKenneth E. Jansen	subroutine fLesSparseApNGt(	col,	row,	pLhs,
328*59599516SKenneth E. Jansen     1					p,	q,	nNodes,
329*59599516SKenneth E. Jansen     2                                  nnz_tot   )
330*59599516SKenneth E. Jansenc
331*59599516SKenneth E. Jansenc.... Data declaration
332*59599516SKenneth E. Jansenc
333*59599516SKenneth E. Jansen	implicit none
334*59599516SKenneth E. Jansen	integer	nNodes, nnz_tot
335*59599516SKenneth E. Jansen	integer	col(nNodes+1),	row(nnz_tot)
336*59599516SKenneth E. Jansen	real*8	pLhs(4,nnz_tot),	p(nNodes,3),	q(nNodes)
337*59599516SKenneth E. Jansenc
338*59599516SKenneth E. Jansen	real*8	tmp
339*59599516SKenneth E. Jansen	integer	i,	j,	k
340*59599516SKenneth E. Jansenc
341*59599516SKenneth E. Jansenc.... Do an AP product
342*59599516SKenneth E. Jansenc
343*59599516SKenneth E. Jansen	do i = nNodes, 1, -1
344*59599516SKenneth E. Jansenc
345*59599516SKenneth E. Jansen	    tmp = 0
346*59599516SKenneth E. Jansen	    do k = col(i), col(i+1)-1
347*59599516SKenneth E. Jansen		j = row(k)
348*59599516SKenneth E. Jansenc
349*59599516SKenneth E. Jansen		tmp = tmp
350*59599516SKenneth E. Jansen     1		    + pLhs(1,k) * p(j,1)
351*59599516SKenneth E. Jansen     2		    + pLhs(2,k) * p(j,2)
352*59599516SKenneth E. Jansen     3		    + pLhs(3,k) * p(j,3)
353*59599516SKenneth E. Jansen	    enddo
354*59599516SKenneth E. Jansen	    q(i) = tmp
355*59599516SKenneth E. Jansen	enddo
356*59599516SKenneth E. Jansenc
357*59599516SKenneth E. Jansenc.... end
358*59599516SKenneth E. Jansenc
359*59599516SKenneth E. Jansen	return
360*59599516SKenneth E. Jansen	end
361*59599516SKenneth E. Jansen
362*59599516SKenneth E. JansenC============================================================================
363*59599516SKenneth E. JansenC
364*59599516SKenneth E. JansenC "fLesSparseApNGtC":
365*59599516SKenneth E. JansenC
366*59599516SKenneth E. JansenC============================================================================
367*59599516SKenneth E. Jansen
368*59599516SKenneth E. Jansen	subroutine fLesSparseApNGtC(	col,	row,	pLhs,
369*59599516SKenneth E. Jansen     1					p,	q,	nNodes,
370*59599516SKenneth E. Jansen     2                                  nnz_tot )
371*59599516SKenneth E. Jansenc
372*59599516SKenneth E. Jansenc.... Data declaration
373*59599516SKenneth E. Jansenc
374*59599516SKenneth E. Jansen        implicit none
375*59599516SKenneth E. Jansen        integer	nNodes, nnz_tot
376*59599516SKenneth E. Jansen        integer	col(nNodes+1),	row(nnz_tot)
377*59599516SKenneth E. Jansen        real*8	pLhs(4,nnz_tot),	p(nNodes,4),	q(nNodes)
378*59599516SKenneth E. Jansenc
379*59599516SKenneth E. Jansen	real*8	tmp
380*59599516SKenneth E. Jansen	integer	i,	j,	k
381*59599516SKenneth E. Jansenc
382*59599516SKenneth E. Jansenc.... Do an AP product
383*59599516SKenneth E. Jansenc
384*59599516SKenneth E. Jansen	do i = nNodes, 1, -1
385*59599516SKenneth E. Jansenc
386*59599516SKenneth E. Jansen	    tmp = 0
387*59599516SKenneth E. Jansen	    do k = col(i), col(i+1)-1
388*59599516SKenneth E. Jansen		j = row(k)
389*59599516SKenneth E. Jansenc
390*59599516SKenneth E. Jansen		tmp = tmp
391*59599516SKenneth E. Jansen     1		    + pLhs(1,k) * p(j,1)
392*59599516SKenneth E. Jansen     2		    + pLhs(2,k) * p(j,2)
393*59599516SKenneth E. Jansen     3		    + pLhs(3,k) * p(j,3)
394*59599516SKenneth E. Jansen     4		    + pLhs(4,k) * p(j,4)
395*59599516SKenneth E. Jansen	    enddo
396*59599516SKenneth E. Jansen	    q(i) = tmp
397*59599516SKenneth E. Jansen	enddo
398*59599516SKenneth E. Jansenc
399*59599516SKenneth E. Jansenc.... end
400*59599516SKenneth E. Jansenc
401*59599516SKenneth E. Jansen	return
402*59599516SKenneth E. Jansen	end
403*59599516SKenneth E. Jansen
404*59599516SKenneth E. JansenC============================================================================
405*59599516SKenneth E. JansenC
406*59599516SKenneth E. JansenC "fLesSparseApFull":
407*59599516SKenneth E. JansenC
408*59599516SKenneth E. JansenC============================================================================
409*59599516SKenneth E. Jansen
410*59599516SKenneth E. Jansen	subroutine fLesSparseApFull(	col,	row,	kLhs,	pLhs,
411*59599516SKenneth E. Jansen     1					p,	q,	nNodes,
412*59599516SKenneth E. Jansen     2                                  nnz_tot_hide )
413*59599516SKenneth E. Jansenc
414*59599516SKenneth E. Jansenc.... Data declaration
415*59599516SKenneth E. Jansenc
416*59599516SKenneth E. Jansenc	implicit none
417*59599516SKenneth E. Jansen        use pvsQbi
418*59599516SKenneth E. Jansen        include "common.h"
419*59599516SKenneth E. Jansen
420*59599516SKenneth E. Jansen	integer	nNodes, nnz_tot
421*59599516SKenneth E. Jansen	integer	col(nNodes+1),	row(nnz_tot)
422*59599516SKenneth E. Jansen	real*8	kLhs(9,nnz_tot),	pLhs(4,nnz_tot)
423*59599516SKenneth E. Jansen        real*8  p(nNodes,4),	q(nNodes,4)
424*59599516SKenneth E. Jansenc
425*59599516SKenneth E. Jansen	real*8	tmp1,	tmp2,	tmp3,	tmp4,	pisave
426*59599516SKenneth E. Jansen	integer	i,	j,	k
427*59599516SKenneth E. Jansenc
428*59599516SKenneth E. Jansenc.... clear the vector
429*59599516SKenneth E. Jansenc
430*59599516SKenneth E. Jansen	do i = 1, nNodes
431*59599516SKenneth E. Jansen	    q(i,1) = 0
432*59599516SKenneth E. Jansen	    q(i,2) = 0
433*59599516SKenneth E. Jansen	    q(i,3) = 0
434*59599516SKenneth E. Jansen	enddo
435*59599516SKenneth E. Jansenc
436*59599516SKenneth E. Jansenc.... Do an AP product
437*59599516SKenneth E. Jansenc
438*59599516SKenneth E. Jansen	do i = 1, nNodes
439*59599516SKenneth E. Jansenc
440*59599516SKenneth E. Jansen	    tmp1 = 0
441*59599516SKenneth E. Jansen	    tmp2 = 0
442*59599516SKenneth E. Jansen	    tmp3 = 0
443*59599516SKenneth E. Jansen	    tmp4 = 0
444*59599516SKenneth E. Jansen	    pisave   = p(i,4)
445*59599516SKenneth E. Jansencdir$ ivdep
446*59599516SKenneth E. Jansen	    do k = col(i), col(i+1)-1
447*59599516SKenneth E. Jansen		j = row(k)
448*59599516SKenneth E. Jansenc
449*59599516SKenneth E. Jansen		tmp1 = tmp1
450*59599516SKenneth E. Jansen     1		     + kLhs(1,k) * p(j,1)
451*59599516SKenneth E. Jansen     2		     + kLhs(4,k) * p(j,2)
452*59599516SKenneth E. Jansen     3		     + kLhs(7,k) * p(j,3)
453*59599516SKenneth E. Jansen		tmp2 = tmp2
454*59599516SKenneth E. Jansen     1		     + kLhs(2,k) * p(j,1)
455*59599516SKenneth E. Jansen     2		     + kLhs(5,k) * p(j,2)
456*59599516SKenneth E. Jansen     3		     + kLhs(8,k) * p(j,3)
457*59599516SKenneth E. Jansen		tmp3 = tmp3
458*59599516SKenneth E. Jansen     1		     + kLhs(3,k) * p(j,1)
459*59599516SKenneth E. Jansen     2		     + kLhs(6,k) * p(j,2)
460*59599516SKenneth E. Jansen     3		     + kLhs(9,k) * p(j,3)
461*59599516SKenneth E. Jansenc
462*59599516SKenneth E. Jansen		tmp4 = tmp4
463*59599516SKenneth E. Jansen     1		     + pLhs(1,k) * p(j,1)
464*59599516SKenneth E. Jansen     2		     + pLhs(2,k) * p(j,2)
465*59599516SKenneth E. Jansen     3		     + pLhs(3,k) * p(j,3)
466*59599516SKenneth E. Jansen     4		     + pLhs(4,k) * p(j,4)
467*59599516SKenneth E. Jansenc
468*59599516SKenneth E. Jansen		q(j,1) = q(j,1) - pLhs(1,k) * pisave
469*59599516SKenneth E. Jansen		q(j,2) = q(j,2) - pLhs(2,k) * pisave
470*59599516SKenneth E. Jansen		q(j,3) = q(j,3) - pLhs(3,k) * pisave
471*59599516SKenneth E. Jansen	    enddo
472*59599516SKenneth E. Jansen	    q(i,1) = q(i,1) + tmp1
473*59599516SKenneth E. Jansen	    q(i,2) = q(i,2) + tmp2
474*59599516SKenneth E. Jansen	    q(i,3) = q(i,3) + tmp3
475*59599516SKenneth E. Jansen	    q(i,4) = tmp4
476*59599516SKenneth E. Jansen	enddo
477*59599516SKenneth E. Jansen        if(ipvsq.ge.2) then
478*59599516SKenneth E. Jansen         tfact=alfi * gami * Delt(1)
479*59599516SKenneth E. Jansen           call ElmpvsQ(q,p,tfact)
480*59599516SKenneth E. Jansen        endif
481*59599516SKenneth E. Jansenc
482*59599516SKenneth E. Jansenc.... end
483*59599516SKenneth E. Jansenc
484*59599516SKenneth E. Jansen	return
485*59599516SKenneth E. Jansen	end
486*59599516SKenneth E. Jansen
487*59599516SKenneth E. JansenC============================================================================
488*59599516SKenneth E. JansenC
489*59599516SKenneth E. JansenC "fLesSparseApSclr":
490*59599516SKenneth E. JansenC
491*59599516SKenneth E. JansenC============================================================================
492*59599516SKenneth E. Jansen
493*59599516SKenneth E. Jansen	subroutine fLesSparseApSclr(	col,	row,	lhs,
494*59599516SKenneth E. Jansen     1					p,	q,	nNodes,
495*59599516SKenneth E. Jansen     &                                  nnz_tot)
496*59599516SKenneth E. Jansenc
497*59599516SKenneth E. Jansenc.... Data declaration
498*59599516SKenneth E. Jansenc
499*59599516SKenneth E. Jansen	implicit none
500*59599516SKenneth E. Jansen	integer	nNodes, nnz_tot
501*59599516SKenneth E. Jansen	integer	col(nNodes+1),	row(nnz_tot)
502*59599516SKenneth E. Jansen	real*8	lhs(nnz_tot),	p(nNodes),	q(nNodes)
503*59599516SKenneth E. Jansenc
504*59599516SKenneth E. Jansen	real*8	tmp
505*59599516SKenneth E. Jansen	integer	i,	j,	k
506*59599516SKenneth E. Jansenc
507*59599516SKenneth E. Jansenc.... Do an AP product
508*59599516SKenneth E. Jansenc
509*59599516SKenneth E. Jansen	do i = nNodes, 1, -1
510*59599516SKenneth E. Jansenc
511*59599516SKenneth E. Jansen	    tmp = 0
512*59599516SKenneth E. Jansen	    do k = col(i), col(i+1)-1
513*59599516SKenneth E. Jansen		tmp = tmp + lhs(k) * p(row(k))
514*59599516SKenneth E. Jansen	    enddo
515*59599516SKenneth E. Jansen	    q(i) = tmp
516*59599516SKenneth E. Jansen	enddo
517*59599516SKenneth E. Jansenc
518*59599516SKenneth E. Jansenc.... end
519*59599516SKenneth E. Jansenc
520*59599516SKenneth E. Jansen	return
521*59599516SKenneth E. Jansen	end
522*59599516SKenneth E. Jansen
523*59599516SKenneth E. JansenC============================================================================
524*59599516SKenneth E. Jansen	subroutine commOut(  global,  ilwork,  n,
525*59599516SKenneth E. Jansen     &                       iper,    iBC, BC  )
526*59599516SKenneth E. Jansen
527*59599516SKenneth E. Jansen	include "common.h"
528*59599516SKenneth E. Jansen
529*59599516SKenneth E. Jansen	real*8  global(nshg,n), BC(nshg,ndofBC)
530*59599516SKenneth E. Jansen	integer ilwork(nlwork), iper(nshg), iBC(nshg)
531*59599516SKenneth E. Jansenc
532*59599516SKenneth E. Jansen	if ( numpe .gt. 1) then
533*59599516SKenneth E. Jansen	   call commu ( global, ilwork, n, 'out')
534*59599516SKenneth E. Jansen	endif
535*59599516SKenneth E. Jansenc
536*59599516SKenneth E. Jansenc     before doing AP product P must be made periodic
537*59599516SKenneth E. Jansenc     on processor slaves did not get updated with the
538*59599516SKenneth E. Jansenc     commu (out) so do it here
539*59599516SKenneth E. Jansenc
540*59599516SKenneth E. Jansen        do i=1,n
541*59599516SKenneth E. Jansen           global(:,i) = global(iper(:),i)  ! iper(i)=i if non-slave so no danger
542*59599516SKenneth E. Jansen        enddo
543*59599516SKenneth E. Jansenc
544*59599516SKenneth E. Jansenc       slave has masters value, for abc we need to rotate it
545*59599516SKenneth E. Jansenc        (if this is a vector only no SCALARS)
546*59599516SKenneth E. Jansen        if((iabc==1) .and. (n.gt.1)) !are there any axisym bc's
547*59599516SKenneth E. Jansen     &     call rotabc(global, iBC,  'out')
548*59599516SKenneth E. Jansen
549*59599516SKenneth E. Jansen
550*59599516SKenneth E. Jansenc$$$        do j = 1,nshg
551*59599516SKenneth E. Jansenc$$$           if (btest(iBC(j),10)) then
552*59599516SKenneth E. Jansenc$$$              i = iper(j)
553*59599516SKenneth E. Jansenc$$$              res(j,:) = res(i,:)
554*59599516SKenneth E. Jansenc$$$           endif
555*59599516SKenneth E. Jansenc$$$        enddo
556*59599516SKenneth E. Jansen
557*59599516SKenneth E. Jansen	return
558*59599516SKenneth E. Jansen	end
559*59599516SKenneth E. Jansen
560*59599516SKenneth E. JansenC============================================================================
561*59599516SKenneth E. Jansen	subroutine commIn(  global,  ilwork,  n,
562*59599516SKenneth E. Jansen     &                      iper,    iBC, BC )
563*59599516SKenneth E. Jansen
564*59599516SKenneth E. Jansen	include "common.h"
565*59599516SKenneth E. Jansen
566*59599516SKenneth E. Jansen	real*8  global(nshg,n), BC(nshg,ndofBC)
567*59599516SKenneth E. Jansen	integer ilwork(nlwork), iper(nshg), iBC(nshg)
568*59599516SKenneth E. Jansenc
569*59599516SKenneth E. Jansen        if((iabc==1) .and. (n.gt.1)) !are there any axisym bc's
570*59599516SKenneth E. Jansen     &       call rotabc(global, iBC, 'in ')
571*59599516SKenneth E. Jansenc
572*59599516SKenneth E. Jansen
573*59599516SKenneth E. Jansen	if ( numpe .gt. 1 ) then
574*59599516SKenneth E. Jansen	   call commu ( global, ilwork, n, 'in ')
575*59599516SKenneth E. Jansen	endif
576*59599516SKenneth E. Jansen
577*59599516SKenneth E. Jansen	call bc3per ( iBC, global, iper, ilwork, n)
578*59599516SKenneth E. Jansen
579*59599516SKenneth E. Jansen	return
580*59599516SKenneth E. Jansen	end
581*59599516SKenneth E. Jansen
582