xref: /phasta/phSolver/incompressible/lesSparse.f (revision 712d3df0b59ebebaaeaea358162c8d2c043c6e08)
159599516SKenneth E. Jansenc---------------------------------------------------------------------
259599516SKenneth E. Jansenc
359599516SKenneth E. Jansenc     drvftools.f : Bundle of Fortran driver routines for ftools.f
459599516SKenneth E. Jansenc
559599516SKenneth E. Jansenc     Each routine is to be called by les**.c
659599516SKenneth E. Jansenc
759599516SKenneth E. Jansenc---------------------------------------------------------------------
859599516SKenneth E. Jansenc
959599516SKenneth E. Jansenc----------------
1059599516SKenneth E. Jansenc     drvLesPrepDiag
1159599516SKenneth E. Jansenc----------------
1259599516SKenneth E. Jansenc
1359599516SKenneth E. Jansen      subroutine drvlesPrepDiag ( flowDiag, ilwork,
1459599516SKenneth E. Jansen     &                            iBC,      BC,      iper,
1559599516SKenneth E. Jansen     &                            rowp,     colm,
1659599516SKenneth E. Jansen     &                            lhsK,     lhsP)
1759599516SKenneth E. Jansenc
1859599516SKenneth E. Jansen      use pointer_data
1959599516SKenneth E. Jansen      use pvsQbi
2059599516SKenneth E. Jansen      use convolImpFlow !brings in the current part of convol coef for imp BC
2159599516SKenneth E. Jansen      use convolRCRFlow !brings in the current part of convol coef for RCR BC
2259599516SKenneth E. Jansen
2359599516SKenneth E. Jansen      include "common.h"
2459599516SKenneth E. Jansen      include "mpif.h"
2559599516SKenneth E. Jansenc
2659599516SKenneth E. Jansen      dimension flowDiag(nshg,4), ilwork(nlwork)
2759599516SKenneth E. Jansen      dimension iBC(nshg), iper(nshg), BC(nshg,ndofBC)
2859599516SKenneth E. Jansen      real*8 lhsK(9,nnz_tot), lhsP(4,nnz_tot)
2959599516SKenneth E. Jansen      integer rowp(nnz_tot),  colm(nshg+1)
3059599516SKenneth E. Jansen      integer	n,	k
3159599516SKenneth E. Jansenc
3259599516SKenneth E. Jansen      integer sparseloc
3359599516SKenneth E. Jansenc
3459599516SKenneth E. Jansenc
3559599516SKenneth E. Jansenc.... Clear the flowdiag
3659599516SKenneth E. Jansenc
3759599516SKenneth E. Jansen      if((flmpl.eq.1).or.(ipord.gt.1)) then
3859599516SKenneth E. Jansen         do n = 1, nshg
3959599516SKenneth E. Jansen	    k = sparseloc( rowp(colm(n)), colm(n+1)-colm(n), n )
4059599516SKenneth E. Jansen     &       + colm(n)-1
4159599516SKenneth E. Jansenc
4259599516SKenneth E. Jansen	    flowdiag(n,1) = lhsK(1,k)
4359599516SKenneth E. Jansen	    flowdiag(n,2) = lhsK(5,k)
4459599516SKenneth E. Jansen	    flowdiag(n,3) = lhsK(9,k)
4559599516SKenneth E. Jansenc
4659599516SKenneth E. Jansen	    flowdiag(n,4) = lhsP(4,k)
4759599516SKenneth E. Jansen         enddo
4859599516SKenneth E. Jansen      else
4959599516SKenneth E. Jansen	flowDiag = zero
5059599516SKenneth E. Jansen	do n = 1, nshg  ! rowsum put on the diagonal instead of diag entry
5159599516SKenneth E. Jansen           do k=colm(n),colm(n+1)-1
5259599516SKenneth E. Jansen
5359599516SKenneth E. Jansenc
5459599516SKenneth E. Jansen              flowdiag(n,1) = flowdiag(n,1) + abs(lhsK(1,k))
5559599516SKenneth E. Jansenc     &                          + lhsK(2,k) + lhsK(3,k)
5659599516SKenneth E. Jansen              flowdiag(n,2) = flowdiag(n,2) + abs(lhsK(5,k))
5759599516SKenneth E. Jansenc     &                          + lhsK(4,k) + lhsK(6,k)
5859599516SKenneth E. Jansen              flowdiag(n,3) = flowdiag(n,3) + abs(lhsK(9,k))
5959599516SKenneth E. Jansenc     &                          + lhsK(7,k) + lhsK(8,k)
6059599516SKenneth E. Jansenc
6159599516SKenneth E. Jansen              flowdiag(n,4) = flowdiag(n,4) + abs(lhsP(4,k))
6259599516SKenneth E. Jansen           enddo
6359599516SKenneth E. Jansen           flowdiag(n,:)=flowdiag(n,:)*pt33
6459599516SKenneth E. Jansen	enddo
6559599516SKenneth E. Jansen      endif
6659599516SKenneth E. Jansen      if(ipvsq.ge.3) then ! for first cut only do diagonal extraction
6759599516SKenneth E. Jansen ! this is not yet correct for multi procs I suspect if partition
6859599516SKenneth E. Jansen ! boundary cuts a p=QR face
6959599516SKenneth E. Jansen         tfact=alfi * gami * Delt(1)
7059599516SKenneth E. Jansen         do n=1,nshg
7159599516SKenneth E. Jansen            if(numResistSrfs.gt.zero) then
7259599516SKenneth E. Jansen               do k = 1,numResistSrfs
7359599516SKenneth E. Jansen                  if (nsrflistResist(k).eq.ndsurf(n)) then
7459599516SKenneth E. Jansen                     irankCoupled=k
7559599516SKenneth E. Jansen                     flowdiag(n,1:3) = flowdiag(n,1:3)
7659599516SKenneth E. Jansen     &               + tfact*ValueListResist(irankCoupled)*
7759599516SKenneth E. Jansen     &               NABI(n,:)*NABI(n,:)
7859599516SKenneth E. Jansen                     exit
7959599516SKenneth E. Jansen                  endif
8059599516SKenneth E. Jansen               enddo
8159599516SKenneth E. Jansen            elseif(numImpSrfs.gt.zero) then
8259599516SKenneth E. Jansen               do k = 1,numImpSrfs
8359599516SKenneth E. Jansen                  if (nsrflistImp(k).eq.ndsurf(n)) then
8459599516SKenneth E. Jansen                     irankCoupled=k
8559599516SKenneth E. Jansen                     flowdiag(n,1:3) = flowdiag(n,1:3)
8659599516SKenneth E. Jansen     &               + tfact*ImpConvCoef(ntimeptpT+2,irankCoupled)*
8759599516SKenneth E. Jansen     &               NABI(n,:)*NABI(n,:)
8859599516SKenneth E. Jansen                     exit
8959599516SKenneth E. Jansen                  endif
9059599516SKenneth E. Jansen               enddo
9159599516SKenneth E. Jansen            elseif(numRCRSrfs.gt.zero) then
9259599516SKenneth E. Jansen               do k = 1,numRCRSrfs
9359599516SKenneth E. Jansen                  if (nsrflistRCR(k).eq.ndsurf(n)) then
9459599516SKenneth E. Jansen                     irankCoupled=k
9559599516SKenneth E. Jansen                     flowdiag(n,1:3) = flowdiag(n,1:3)
9659599516SKenneth E. Jansen     &               + tfact*RCRConvCoef(lstep+2,irankCoupled)* !check lstep+2 if restart from t.ne.0
9759599516SKenneth E. Jansen     &               NABI(n,:)*NABI(n,:)
9859599516SKenneth E. Jansen                     exit
9959599516SKenneth E. Jansen                  endif
10059599516SKenneth E. Jansen               enddo
10159599516SKenneth E. Jansen            endif
10259599516SKenneth E. Jansen         enddo
10359599516SKenneth E. Jansen      endif
10459599516SKenneth E. Jansenc
10559599516SKenneth E. Jansen
10659599516SKenneth E. Jansenc
10759599516SKenneth E. Jansen      if(iabc==1)    !are there any axisym bc's
10859599516SKenneth E. Jansen     &      call rotabc(flowdiag, iBC, 'in ')
10959599516SKenneth E. Jansenc
11059599516SKenneth E. Jansen
11159599516SKenneth E. Jansenc
11259599516SKenneth E. Jansenc.... communicate : add the slaves part to the master's part of flowDiag
11359599516SKenneth E. Jansenc
11459599516SKenneth E. Jansen	if (numpe > 1) then
11559599516SKenneth E. Jansen           call commu (flowDiag, ilwork, nflow, 'in ')
11659599516SKenneth E. Jansen        endif
11759599516SKenneth E. Jansenc
11859599516SKenneth E. Jansenc.... satisfy the boundary conditions on the diagonal
11959599516SKenneth E. Jansenc
12059599516SKenneth E. Jansen        call bc3diag(iBC, BC,  flowDiag)
12159599516SKenneth E. Jansenc
12259599516SKenneth E. Jansenc
12359599516SKenneth E. Jansenc.... on processor periodicity was not taken care of in the setting of the
12459599516SKenneth E. Jansenc     boundary conditions on the matrix.  Take care of it now.
12559599516SKenneth E. Jansenc
12659599516SKenneth E. Jansen        call bc3per(iBC,  flowDiag, iper, ilwork, 4)
12759599516SKenneth E. Jansenc
12859599516SKenneth E. Jansenc... slaves and masters have the correct values
12959599516SKenneth E. Jansenc
13059599516SKenneth E. Jansenc
13159599516SKenneth E. Jansenc.... Calculate square root
13259599516SKenneth E. Jansenc
13359599516SKenneth E. Jansen        do i = 1, nshg
13459599516SKenneth E. Jansen           do j = 1, nflow
13559599516SKenneth E. Jansen              if (flowDiag(i,j).ne.0)
13659599516SKenneth E. Jansen     &             flowDiag(i,j) = 1. / sqrt(abs(flowDiag(i,j)))
13759599516SKenneth E. Jansen           enddo
13859599516SKenneth E. Jansen        enddo
13959599516SKenneth E. Jansenc
14059599516SKenneth E. Jansen        return
14159599516SKenneth E. Jansen        end
14259599516SKenneth E. Jansen
14359599516SKenneth E. Jansenc
14459599516SKenneth E. Jansenc-------------
14559599516SKenneth E. Jansenc     drvsclrDiag
14659599516SKenneth E. Jansenc-------------
14759599516SKenneth E. Jansenc
14859599516SKenneth E. Jansen      subroutine drvsclrDiag ( sclrDiag, ilwork, iBC, BC, iper,
14959599516SKenneth E. Jansen     &                         rowp,     colm,   lhsS )
15059599516SKenneth E. Jansenc
15159599516SKenneth E. Jansen      use pointer_data
15259599516SKenneth E. Jansen      include "common.h"
15359599516SKenneth E. Jansen      include "mpif.h"
15459599516SKenneth E. Jansenc
15559599516SKenneth E. Jansen      integer  ilwork(nlwork),    iBC(nshg),     iper(nshg),
15659599516SKenneth E. Jansen     &         rowp(nnz_tot),    colm(nshg+1)
15759599516SKenneth E. Jansen
15859599516SKenneth E. Jansen      real*8   sclrDiag(nshg),    lhsS(nnz_tot), BC(nshg,ndofBC)
15959599516SKenneth E. Jansen      integer sparseloc
16059599516SKenneth E. Jansen
16159599516SKenneth E. Jansen      sclrDiag = zero
16259599516SKenneth E. Jansen      do n = 1, nshg
16359599516SKenneth E. Jansen         k = sparseloc( rowp(colm(n)), colm(n+1)-colm(n), n )
16459599516SKenneth E. Jansen     &                               + colm(n)-1
16559599516SKenneth E. Jansenc
16659599516SKenneth E. Jansen         sclrDiag(n) = lhsS(k)
16759599516SKenneth E. Jansen      enddo
16859599516SKenneth E. Jansenc
16959599516SKenneth E. Jansenc.... communicate : add the slaves part to the master's part of sclrDiag
17059599516SKenneth E. Jansenc
17159599516SKenneth E. Jansen	if (numpe > 1) then
17259599516SKenneth E. Jansen           call commu (sclrDiag, ilwork, 1, 'in ')
17359599516SKenneth E. Jansen        endif
17459599516SKenneth E. Jansenc
17559599516SKenneth E. Jansenc.... satisfy the boundary conditions on the diagonal
17659599516SKenneth E. Jansenc
17759599516SKenneth E. Jansen        call bc3SclrDiag(iBC,  sclrDiag)
17859599516SKenneth E. Jansenc
17959599516SKenneth E. Jansenc
18059599516SKenneth E. Jansenc.... on processor periodicity was not taken care of in the setting of the
18159599516SKenneth E. Jansenc     boundary conditions on the matrix.  Take care of it now.
18259599516SKenneth E. Jansenc
18359599516SKenneth E. Jansen        call bc3per(iBC,  sclrDiag, iper, ilwork, 1)
18459599516SKenneth E. Jansenc
18559599516SKenneth E. Jansenc... slaves and masters have the correct values
18659599516SKenneth E. Jansenc
18759599516SKenneth E. Jansenc
18859599516SKenneth E. Jansenc.... Calculate square root
18959599516SKenneth E. Jansenc
19059599516SKenneth E. Jansen        do i = 1, nshg
19159599516SKenneth E. Jansen           if (sclrDiag(i).ne.0) then
19259599516SKenneth E. Jansen              sclrDiag(i) = 1. / sqrt(abs(sclrDiag(i)))
19359599516SKenneth E. Jansen           endif
19459599516SKenneth E. Jansen        enddo
19559599516SKenneth E. Jansenc
19659599516SKenneth E. Jansen      return
19759599516SKenneth E. Jansen      end
19859599516SKenneth E. Jansen
19959599516SKenneth E. JansenC============================================================================
20059599516SKenneth E. JansenC
20159599516SKenneth E. JansenC "fLesSparseApG":
20259599516SKenneth E. JansenC
20359599516SKenneth E. JansenC============================================================================
20459599516SKenneth E. Jansen	subroutine fLesSparseApG(	col,	row,	pLhs,
20559599516SKenneth E. Jansen     &					p,	q,	nNodes,
20659599516SKenneth E. Jansen     &                                  nnz_tot )
20759599516SKenneth E. Jansenc
20859599516SKenneth E. Jansenc.... Data declaration
20959599516SKenneth E. Jansenc
21059599516SKenneth E. Jansen	implicit none
21159599516SKenneth E. Jansen	integer	nNodes, nnz_tot
21259599516SKenneth E. Jansen	integer	col(nNodes+1),	row(nnz_tot)
21359599516SKenneth E. Jansen	real*8	pLhs(4,nnz_tot),	p(nNodes),	q(nNodes,3)
21459599516SKenneth E. Jansenc
21559599516SKenneth E. Jansen	real*8	pisave
21659599516SKenneth E. Jansen	integer	i,	j,	k
21759599516SKenneth E. Jansenc
21859599516SKenneth E. Jansenc.... clear the vector
21959599516SKenneth E. Jansenc
22059599516SKenneth E. Jansen	do i = 1, nNodes
22159599516SKenneth E. Jansen	    q(i,1) = 0
22259599516SKenneth E. Jansen	    q(i,2) = 0
22359599516SKenneth E. Jansen	    q(i,3) = 0
22459599516SKenneth E. Jansen	enddo
22559599516SKenneth E. Jansenc
22659599516SKenneth E. Jansenc.... Do an AP product
22759599516SKenneth E. Jansenc
22859599516SKenneth E. Jansen	do i = 1, nNodes
22959599516SKenneth E. Jansenc
23059599516SKenneth E. Jansen	    pisave = p(i)
23159599516SKenneth E. Jansencdir$ ivdep
23259599516SKenneth E. Jansen	    do k = col(i), col(i+1)-1
23359599516SKenneth E. Jansen		j = row(k)
23459599516SKenneth E. Jansenc
23559599516SKenneth E. Jansen		q(j,1) = q(j,1) - pLhs(1,k) * pisave
23659599516SKenneth E. Jansen		q(j,2) = q(j,2) - pLhs(2,k) * pisave
23759599516SKenneth E. Jansen		q(j,3) = q(j,3) - pLhs(3,k) * pisave
23859599516SKenneth E. Jansen	    enddo
23959599516SKenneth E. Jansen	enddo
24059599516SKenneth E. Jansenc
24159599516SKenneth E. Jansenc.... end
24259599516SKenneth E. Jansenc
24359599516SKenneth E. Jansen	return
24459599516SKenneth E. Jansen	end
24559599516SKenneth E. Jansen
24659599516SKenneth E. JansenC============================================================================
24759599516SKenneth E. JansenC
24859599516SKenneth E. JansenC "fLesSparseApKG":
24959599516SKenneth E. JansenC
25059599516SKenneth E. JansenC============================================================================
25159599516SKenneth E. Jansen
25259599516SKenneth E. Jansen	subroutine fLesSparseApKG(	col,	row,	kLhs,	pLhs,
25359599516SKenneth E. Jansen     1					p,	q,	nNodes,
25459599516SKenneth E. Jansen     2                                  nnz_tot_hide )
25559599516SKenneth E. Jansenc
25659599516SKenneth E. Jansenc.... Data declaration
25759599516SKenneth E. Jansenc
25859599516SKenneth E. Jansenc	implicit none
25959599516SKenneth E. Jansen        use pvsQbi
26059599516SKenneth E. Jansen        include "common.h"
261*9a6935e5SKenneth E. Jansen	integer	nNodes
26259599516SKenneth E. Jansen	integer	col(nNodes+1),	row(nnz_tot)
26359599516SKenneth E. Jansen	real*8	kLhs(9,nnz_tot),	pLhs(4,nnz_tot)
26459599516SKenneth E. Jansen        real*8 	p(nNodes,4),	q(nNodes,3)
26559599516SKenneth E. Jansenc
26659599516SKenneth E. Jansen	real*8	tmp1,	tmp2,	tmp3,	pisave
26759599516SKenneth E. Jansen	integer	i,	j,	k
26859599516SKenneth E. Jansenc
26959599516SKenneth E. Jansenc.... clear the vector
27059599516SKenneth E. Jansenc
27159599516SKenneth E. Jansen	do i = 1, nNodes
27259599516SKenneth E. Jansen	    q(i,1) = 0
27359599516SKenneth E. Jansen	    q(i,2) = 0
27459599516SKenneth E. Jansen	    q(i,3) = 0
27559599516SKenneth E. Jansen	enddo
27659599516SKenneth E. Jansenc
27759599516SKenneth E. Jansenc.... Do an AP product
27859599516SKenneth E. Jansenc
27959599516SKenneth E. Jansen	do i = 1, nNodes
28059599516SKenneth E. Jansenc
28159599516SKenneth E. Jansen	    tmp1 = 0
28259599516SKenneth E. Jansen	    tmp2 = 0
28359599516SKenneth E. Jansen	    tmp3 = 0
28459599516SKenneth E. Jansen	    pisave   = p(i,4)
28559599516SKenneth E. Jansencdir$ ivdep
28659599516SKenneth E. Jansen	    do k = col(i), col(i+1)-1
28759599516SKenneth E. Jansen		j = row(k)
28859599516SKenneth E. Jansen		tmp1 = tmp1
28959599516SKenneth E. Jansen     1		     + kLhs(1,k) * p(j,1)
29059599516SKenneth E. Jansen     2		     + kLhs(4,k) * p(j,2)
29159599516SKenneth E. Jansen     3		     + kLhs(7,k) * p(j,3)
29259599516SKenneth E. Jansen		tmp2 = tmp2
29359599516SKenneth E. Jansen     1		     + kLhs(2,k) * p(j,1)
29459599516SKenneth E. Jansen     2		     + kLhs(5,k) * p(j,2)
29559599516SKenneth E. Jansen     3		     + kLhs(8,k) * p(j,3)
29659599516SKenneth E. Jansen		tmp3 = tmp3
29759599516SKenneth E. Jansen     1		     + kLhs(3,k) * p(j,1)
29859599516SKenneth E. Jansen     2		     + kLhs(6,k) * p(j,2)
29959599516SKenneth E. Jansen     3		     + kLhs(9,k) * p(j,3)
30059599516SKenneth E. Jansenc
30159599516SKenneth E. Jansen		q(j,1) = q(j,1) - pLhs(1,k) * pisave
30259599516SKenneth E. Jansen		q(j,2) = q(j,2) - pLhs(2,k) * pisave
30359599516SKenneth E. Jansen		q(j,3) = q(j,3) - pLhs(3,k) * pisave
30459599516SKenneth E. Jansen	    enddo
30559599516SKenneth E. Jansen	    q(i,1) = q(i,1) + tmp1
30659599516SKenneth E. Jansen	    q(i,2) = q(i,2) + tmp2
30759599516SKenneth E. Jansen	    q(i,3) = q(i,3) + tmp3
30859599516SKenneth E. Jansen	enddo
30959599516SKenneth E. Jansen
31059599516SKenneth E. Jansen        if(ipvsq.ge.2) then
31159599516SKenneth E. Jansen         tfact=alfi * gami * Delt(1)
31259599516SKenneth E. Jansen           call ElmpvsQ(q,p,tfact)
31359599516SKenneth E. Jansen        endif
31459599516SKenneth E. Jansenc
31559599516SKenneth E. Jansenc.... end
31659599516SKenneth E. Jansenc
31759599516SKenneth E. Jansen	return
31859599516SKenneth E. Jansen	end
31959599516SKenneth E. Jansen
32059599516SKenneth E. Jansen
32159599516SKenneth E. JansenC============================================================================
32259599516SKenneth E. JansenC
32359599516SKenneth E. JansenC "fLesSparseApNGt":
32459599516SKenneth E. JansenC
32559599516SKenneth E. JansenC============================================================================
32659599516SKenneth E. Jansen
32759599516SKenneth E. Jansen	subroutine fLesSparseApNGt(	col,	row,	pLhs,
32859599516SKenneth E. Jansen     1					p,	q,	nNodes,
32959599516SKenneth E. Jansen     2                                  nnz_tot   )
33059599516SKenneth E. Jansenc
33159599516SKenneth E. Jansenc.... Data declaration
33259599516SKenneth E. Jansenc
33359599516SKenneth E. Jansen	implicit none
33459599516SKenneth E. Jansen	integer	nNodes, nnz_tot
33559599516SKenneth E. Jansen	integer	col(nNodes+1),	row(nnz_tot)
33659599516SKenneth E. Jansen	real*8	pLhs(4,nnz_tot),	p(nNodes,3),	q(nNodes)
33759599516SKenneth E. Jansenc
33859599516SKenneth E. Jansen	real*8	tmp
33959599516SKenneth E. Jansen	integer	i,	j,	k
34059599516SKenneth E. Jansenc
34159599516SKenneth E. Jansenc.... Do an AP product
34259599516SKenneth E. Jansenc
34359599516SKenneth E. Jansen	do i = nNodes, 1, -1
34459599516SKenneth E. Jansenc
34559599516SKenneth E. Jansen	    tmp = 0
34659599516SKenneth E. Jansen	    do k = col(i), col(i+1)-1
34759599516SKenneth E. Jansen		j = row(k)
34859599516SKenneth E. Jansenc
34959599516SKenneth E. Jansen		tmp = tmp
35059599516SKenneth E. Jansen     1		    + pLhs(1,k) * p(j,1)
35159599516SKenneth E. Jansen     2		    + pLhs(2,k) * p(j,2)
35259599516SKenneth E. Jansen     3		    + pLhs(3,k) * p(j,3)
35359599516SKenneth E. Jansen	    enddo
35459599516SKenneth E. Jansen	    q(i) = tmp
35559599516SKenneth E. Jansen	enddo
35659599516SKenneth E. Jansenc
35759599516SKenneth E. Jansenc.... end
35859599516SKenneth E. Jansenc
35959599516SKenneth E. Jansen	return
36059599516SKenneth E. Jansen	end
36159599516SKenneth E. Jansen
36259599516SKenneth E. JansenC============================================================================
36359599516SKenneth E. JansenC
36459599516SKenneth E. JansenC "fLesSparseApNGtC":
36559599516SKenneth E. JansenC
36659599516SKenneth E. JansenC============================================================================
36759599516SKenneth E. Jansen
36859599516SKenneth E. Jansen	subroutine fLesSparseApNGtC(	col,	row,	pLhs,
36959599516SKenneth E. Jansen     1					p,	q,	nNodes,
37059599516SKenneth E. Jansen     2                                  nnz_tot )
37159599516SKenneth E. Jansenc
37259599516SKenneth E. Jansenc.... Data declaration
37359599516SKenneth E. Jansenc
37459599516SKenneth E. Jansen        implicit none
37559599516SKenneth E. Jansen        integer	nNodes, nnz_tot
37659599516SKenneth E. Jansen        integer	col(nNodes+1),	row(nnz_tot)
37759599516SKenneth E. Jansen        real*8	pLhs(4,nnz_tot),	p(nNodes,4),	q(nNodes)
37859599516SKenneth E. Jansenc
37959599516SKenneth E. Jansen	real*8	tmp
38059599516SKenneth E. Jansen	integer	i,	j,	k
38159599516SKenneth E. Jansenc
38259599516SKenneth E. Jansenc.... Do an AP product
38359599516SKenneth E. Jansenc
38459599516SKenneth E. Jansen	do i = nNodes, 1, -1
38559599516SKenneth E. Jansenc
38659599516SKenneth E. Jansen	    tmp = 0
38759599516SKenneth E. Jansen	    do k = col(i), col(i+1)-1
38859599516SKenneth E. Jansen		j = row(k)
38959599516SKenneth E. Jansenc
39059599516SKenneth E. Jansen		tmp = tmp
39159599516SKenneth E. Jansen     1		    + pLhs(1,k) * p(j,1)
39259599516SKenneth E. Jansen     2		    + pLhs(2,k) * p(j,2)
39359599516SKenneth E. Jansen     3		    + pLhs(3,k) * p(j,3)
39459599516SKenneth E. Jansen     4		    + pLhs(4,k) * p(j,4)
39559599516SKenneth E. Jansen	    enddo
39659599516SKenneth E. Jansen	    q(i) = tmp
39759599516SKenneth E. Jansen	enddo
39859599516SKenneth E. Jansenc
39959599516SKenneth E. Jansenc.... end
40059599516SKenneth E. Jansenc
40159599516SKenneth E. Jansen	return
40259599516SKenneth E. Jansen	end
40359599516SKenneth E. Jansen
40459599516SKenneth E. JansenC============================================================================
40559599516SKenneth E. JansenC
40659599516SKenneth E. JansenC "fLesSparseApFull":
40759599516SKenneth E. JansenC
40859599516SKenneth E. JansenC============================================================================
40959599516SKenneth E. Jansen
41059599516SKenneth E. Jansen	subroutine fLesSparseApFull(	col,	row,	kLhs,	pLhs,
41159599516SKenneth E. Jansen     1					p,	q,	nNodes,
41259599516SKenneth E. Jansen     2                                  nnz_tot_hide )
41359599516SKenneth E. Jansenc
41459599516SKenneth E. Jansenc.... Data declaration
41559599516SKenneth E. Jansenc
41659599516SKenneth E. Jansenc	implicit none
41759599516SKenneth E. Jansen        use pvsQbi
41859599516SKenneth E. Jansen        include "common.h"
41959599516SKenneth E. Jansen
42059599516SKenneth E. Jansen	integer	nNodes, nnz_tot
42159599516SKenneth E. Jansen	integer	col(nNodes+1),	row(nnz_tot)
42259599516SKenneth E. Jansen	real*8	kLhs(9,nnz_tot),	pLhs(4,nnz_tot)
42359599516SKenneth E. Jansen        real*8  p(nNodes,4),	q(nNodes,4)
42459599516SKenneth E. Jansenc
42559599516SKenneth E. Jansen	real*8	tmp1,	tmp2,	tmp3,	tmp4,	pisave
42659599516SKenneth E. Jansen	integer	i,	j,	k
42759599516SKenneth E. Jansenc
42859599516SKenneth E. Jansenc.... clear the vector
42959599516SKenneth E. Jansenc
43059599516SKenneth E. Jansen	do i = 1, nNodes
43159599516SKenneth E. Jansen	    q(i,1) = 0
43259599516SKenneth E. Jansen	    q(i,2) = 0
43359599516SKenneth E. Jansen	    q(i,3) = 0
43459599516SKenneth E. Jansen	enddo
43559599516SKenneth E. Jansenc
43659599516SKenneth E. Jansenc.... Do an AP product
43759599516SKenneth E. Jansenc
43859599516SKenneth E. Jansen	do i = 1, nNodes
43959599516SKenneth E. Jansenc
44059599516SKenneth E. Jansen	    tmp1 = 0
44159599516SKenneth E. Jansen	    tmp2 = 0
44259599516SKenneth E. Jansen	    tmp3 = 0
44359599516SKenneth E. Jansen	    tmp4 = 0
44459599516SKenneth E. Jansen	    pisave   = p(i,4)
44559599516SKenneth E. Jansencdir$ ivdep
44659599516SKenneth E. Jansen	    do k = col(i), col(i+1)-1
44759599516SKenneth E. Jansen		j = row(k)
44859599516SKenneth E. Jansenc
44959599516SKenneth E. Jansen		tmp1 = tmp1
45059599516SKenneth E. Jansen     1		     + kLhs(1,k) * p(j,1)
45159599516SKenneth E. Jansen     2		     + kLhs(4,k) * p(j,2)
45259599516SKenneth E. Jansen     3		     + kLhs(7,k) * p(j,3)
45359599516SKenneth E. Jansen		tmp2 = tmp2
45459599516SKenneth E. Jansen     1		     + kLhs(2,k) * p(j,1)
45559599516SKenneth E. Jansen     2		     + kLhs(5,k) * p(j,2)
45659599516SKenneth E. Jansen     3		     + kLhs(8,k) * p(j,3)
45759599516SKenneth E. Jansen		tmp3 = tmp3
45859599516SKenneth E. Jansen     1		     + kLhs(3,k) * p(j,1)
45959599516SKenneth E. Jansen     2		     + kLhs(6,k) * p(j,2)
46059599516SKenneth E. Jansen     3		     + kLhs(9,k) * p(j,3)
46159599516SKenneth E. Jansenc
46259599516SKenneth E. Jansen		tmp4 = tmp4
46359599516SKenneth E. Jansen     1		     + pLhs(1,k) * p(j,1)
46459599516SKenneth E. Jansen     2		     + pLhs(2,k) * p(j,2)
46559599516SKenneth E. Jansen     3		     + pLhs(3,k) * p(j,3)
46659599516SKenneth E. Jansen     4		     + pLhs(4,k) * p(j,4)
46759599516SKenneth E. Jansenc
46859599516SKenneth E. Jansen		q(j,1) = q(j,1) - pLhs(1,k) * pisave
46959599516SKenneth E. Jansen		q(j,2) = q(j,2) - pLhs(2,k) * pisave
47059599516SKenneth E. Jansen		q(j,3) = q(j,3) - pLhs(3,k) * pisave
47159599516SKenneth E. Jansen	    enddo
47259599516SKenneth E. Jansen	    q(i,1) = q(i,1) + tmp1
47359599516SKenneth E. Jansen	    q(i,2) = q(i,2) + tmp2
47459599516SKenneth E. Jansen	    q(i,3) = q(i,3) + tmp3
47559599516SKenneth E. Jansen	    q(i,4) = tmp4
47659599516SKenneth E. Jansen	enddo
47759599516SKenneth E. Jansen        if(ipvsq.ge.2) then
47859599516SKenneth E. Jansen         tfact=alfi * gami * Delt(1)
47959599516SKenneth E. Jansen           call ElmpvsQ(q,p,tfact)
48059599516SKenneth E. Jansen        endif
48159599516SKenneth E. Jansenc
48259599516SKenneth E. Jansenc.... end
48359599516SKenneth E. Jansenc
48459599516SKenneth E. Jansen	return
48559599516SKenneth E. Jansen	end
48659599516SKenneth E. Jansen
48759599516SKenneth E. JansenC============================================================================
48859599516SKenneth E. JansenC
48959599516SKenneth E. JansenC "fLesSparseApSclr":
49059599516SKenneth E. JansenC
49159599516SKenneth E. JansenC============================================================================
49259599516SKenneth E. Jansen
49359599516SKenneth E. Jansen	subroutine fLesSparseApSclr(	col,	row,	lhs,
49459599516SKenneth E. Jansen     1					p,	q,	nNodes,
49559599516SKenneth E. Jansen     &                                  nnz_tot)
49659599516SKenneth E. Jansenc
49759599516SKenneth E. Jansenc.... Data declaration
49859599516SKenneth E. Jansenc
49959599516SKenneth E. Jansen	implicit none
50059599516SKenneth E. Jansen	integer	nNodes, nnz_tot
50159599516SKenneth E. Jansen	integer	col(nNodes+1),	row(nnz_tot)
50259599516SKenneth E. Jansen	real*8	lhs(nnz_tot),	p(nNodes),	q(nNodes)
50359599516SKenneth E. Jansenc
50459599516SKenneth E. Jansen	real*8	tmp
50559599516SKenneth E. Jansen	integer	i,	j,	k
50659599516SKenneth E. Jansenc
50759599516SKenneth E. Jansenc.... Do an AP product
50859599516SKenneth E. Jansenc
50959599516SKenneth E. Jansen	do i = nNodes, 1, -1
51059599516SKenneth E. Jansenc
51159599516SKenneth E. Jansen	    tmp = 0
51259599516SKenneth E. Jansen	    do k = col(i), col(i+1)-1
51359599516SKenneth E. Jansen		tmp = tmp + lhs(k) * p(row(k))
51459599516SKenneth E. Jansen	    enddo
51559599516SKenneth E. Jansen	    q(i) = tmp
51659599516SKenneth E. Jansen	enddo
51759599516SKenneth E. Jansenc
51859599516SKenneth E. Jansenc.... end
51959599516SKenneth E. Jansenc
52059599516SKenneth E. Jansen	return
52159599516SKenneth E. Jansen	end
52259599516SKenneth E. JansenC============================================================================
52359599516SKenneth E. Jansen	subroutine commOut(  global,  ilwork,  n,
52459599516SKenneth E. Jansen     &                       iper,    iBC, BC  )
52559599516SKenneth E. Jansen
52659599516SKenneth E. Jansen	include "common.h"
52759599516SKenneth E. Jansen
52859599516SKenneth E. Jansen	real*8  global(nshg,n), BC(nshg,ndofBC)
52959599516SKenneth E. Jansen	integer ilwork(nlwork), iper(nshg), iBC(nshg)
53059599516SKenneth E. Jansenc
53159599516SKenneth E. Jansen	if ( numpe .gt. 1) then
53259599516SKenneth E. Jansen	   call commu ( global, ilwork, n, 'out')
53359599516SKenneth E. Jansen	endif
53459599516SKenneth E. Jansenc
53559599516SKenneth E. Jansenc     before doing AP product P must be made periodic
53659599516SKenneth E. Jansenc     on processor slaves did not get updated with the
53759599516SKenneth E. Jansenc     commu (out) so do it here
53859599516SKenneth E. Jansenc
53959599516SKenneth E. Jansen        do i=1,n
54059599516SKenneth E. Jansen           global(:,i) = global(iper(:),i)  ! iper(i)=i if non-slave so no danger
54159599516SKenneth E. Jansen        enddo
54259599516SKenneth E. Jansenc
54359599516SKenneth E. Jansenc       slave has masters value, for abc we need to rotate it
54459599516SKenneth E. Jansenc        (if this is a vector only no SCALARS)
54559599516SKenneth E. Jansen        if((iabc==1) .and. (n.gt.1)) !are there any axisym bc's
54659599516SKenneth E. Jansen     &     call rotabc(global, iBC,  'out')
54759599516SKenneth E. Jansen
54859599516SKenneth E. Jansen
54959599516SKenneth E. Jansenc$$$        do j = 1,nshg
55059599516SKenneth E. Jansenc$$$           if (btest(iBC(j),10)) then
55159599516SKenneth E. Jansenc$$$              i = iper(j)
55259599516SKenneth E. Jansenc$$$              res(j,:) = res(i,:)
55359599516SKenneth E. Jansenc$$$           endif
55459599516SKenneth E. Jansenc$$$        enddo
55559599516SKenneth E. Jansen
55659599516SKenneth E. Jansen	return
55759599516SKenneth E. Jansen	end
55859599516SKenneth E. Jansen
55959599516SKenneth E. JansenC============================================================================
56059599516SKenneth E. Jansen	subroutine commIn(  global,  ilwork,  n,
56159599516SKenneth E. Jansen     &                      iper,    iBC, BC )
56259599516SKenneth E. Jansen
56359599516SKenneth E. Jansen	include "common.h"
56459599516SKenneth E. Jansen
56559599516SKenneth E. Jansen	real*8  global(nshg,n), BC(nshg,ndofBC)
56659599516SKenneth E. Jansen	integer ilwork(nlwork), iper(nshg), iBC(nshg)
56759599516SKenneth E. Jansenc
56859599516SKenneth E. Jansen        if((iabc==1) .and. (n.gt.1)) !are there any axisym bc's
56959599516SKenneth E. Jansen     &       call rotabc(global, iBC, 'in ')
57059599516SKenneth E. Jansenc
57159599516SKenneth E. Jansen
57259599516SKenneth E. Jansen	if ( numpe .gt. 1 ) then
57359599516SKenneth E. Jansen	   call commu ( global, ilwork, n, 'in ')
57459599516SKenneth E. Jansen	endif
57559599516SKenneth E. Jansen
57659599516SKenneth E. Jansen	call bc3per ( iBC, global, iper, ilwork, n)
57759599516SKenneth E. Jansen
57859599516SKenneth E. Jansen	return
57959599516SKenneth E. Jansen	end
58059599516SKenneth E. Jansen
581