xref: /phasta/phSolver/AMG/ramg_extract.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen!************************************
2*59599516SKenneth E. Jansen!     RAMG Extract:
3*59599516SKenneth E. Jansen!      extract ppe and scale ppe
4*59599516SKenneth E. Jansen!**********************************************************
5*59599516SKenneth E. Jansen
6*59599516SKenneth E. Jansen!***********************************************************
7*59599516SKenneth E. Jansen!    ramg_extract_ppe
8*59599516SKenneth E. Jansen!    prepare PPE matrix
9*59599516SKenneth E. Jansen!     input: boundary, lhsK,lhsP
10*59599516SKenneth E. Jansen!     output: PPE & RHS at level 1
11*59599516SKenneth E. Jansen!**********************************************************
12*59599516SKenneth E. Jansen      subroutine ramg_extract_ppe(
13*59599516SKenneth E. Jansen     &              colm,rowp,lhsK,lhsP,
14*59599516SKenneth E. Jansen     &              ilwork,BC,iBC,iper)
15*59599516SKenneth E. Jansen      use ramg_data
16*59599516SKenneth E. Jansen      include "common.h"
17*59599516SKenneth E. Jansen      include "mpif.h"
18*59599516SKenneth E. Jansen      include "auxmpi.h"
19*59599516SKenneth E. Jansen!      implicit none
20*59599516SKenneth E. Jansen
21*59599516SKenneth E. Jansen
22*59599516SKenneth E. Jansen      !***********parameters**************
23*59599516SKenneth E. Jansen      !the matrix
24*59599516SKenneth E. Jansen!      integer,intent(in)                               :: nshg
25*59599516SKenneth E. Jansen!      integer,intent(in)                        :: nnz_tot
26*59599516SKenneth E. Jansen!      integer,intent(in)                               :: nflow
27*59599516SKenneth E. Jansen      !the matrix
28*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg+1)             :: colm
29*59599516SKenneth E. Jansen      integer,intent(in),dimension(nnz_tot)            :: rowp
30*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(9,nnz_tot)     :: lhsK
31*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(4,nnz_tot)     :: lhsP
32*59599516SKenneth E. Jansen!      real(kind=8),dimension(:,:),allocatable          :: lhsGP
33*59599516SKenneth E. Jansen!      integer,dimension(:),allocatable                 :: lhsGProwp
34*59599516SKenneth E. Jansen!      integer,dimension(:),allocatable                 :: lhsGPcolm
35*59599516SKenneth E. Jansen      type(r2d) :: lhsGP
36*59599516SKenneth E. Jansen      type(i1d) :: lhsGProwp,lhsGPcolm
37*59599516SKenneth E. Jansen      ! the boundary info
38*59599516SKenneth E. Jansen      integer, intent(in), dimension(nlwork)           :: ilwork
39*59599516SKenneth E. Jansen      integer, intent(in),dimension(nshg)              :: iBC,iper
40*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(nshg,ndofBC)   :: BC
41*59599516SKenneth E. Jansen
42*59599516SKenneth E. Jansen      !*********parameters end**************
43*59599516SKenneth E. Jansen
44*59599516SKenneth E. Jansen      !****** local variables **********
45*59599516SKenneth E. Jansen      real(kind=8),dimension(nshg,4)     :: mflowDiag,pflowDiag
46*59599516SKenneth E. Jansen      real(kind=8)                             :: rtemp,rt,rtp,rtn
47*59599516SKenneth E. Jansen      real(kind=8),dimension(nshg)                    :: rtest
48*59599516SKenneth E. Jansen      integer                     :: i,j,k,m,n,p,q,ki,kj,ni,nj,qq
49*59599516SKenneth E. Jansen      integer :: cki,ckj,ckk
50*59599516SKenneth E. Jansen      integer,dimension(nshg)                  :: temprow
51*59599516SKenneth E. Jansen      integer                                         :: mnnz
52*59599516SKenneth E. Jansen
53*59599516SKenneth E. Jansen      logical  :: extentri
54*59599516SKenneth E. Jansen
55*59599516SKenneth E. Jansen      character                                       :: fname*80
56*59599516SKenneth E. Jansen      !****** end local variables ******
57*59599516SKenneth E. Jansen
58*59599516SKenneth E. Jansen      if (ramg_setup_flag .ne. 0) return
59*59599516SKenneth E. Jansen
60*59599516SKenneth E. Jansen      !*** calculate memory for PPE ***
61*59599516SKenneth E. Jansen      !*** using the fact that matrix is symmetric ***
62*59599516SKenneth E. Jansen      !*** lhs = GT_ik * KI_kk * G_kj + C_ij ***
63*59599516SKenneth E. Jansen      !*** rhs = -GT_ik * KI_kk * Rm_k - Rc_k ***
64*59599516SKenneth E. Jansen      !*** where G and GT has same sparsity pattern if
65*59599516SKenneth E. Jansen      !*** only consider the main matrix (M,3)
66*59599516SKenneth E. Jansen
67*59599516SKenneth E. Jansen      if ( amg_nshg(1) .gt.0 ) then
68*59599516SKenneth E. Jansen          call ramg_deallocate(1)
69*59599516SKenneth E. Jansen          deallocate(ramg_flowDiag%p)
70*59599516SKenneth E. Jansen          deallocate(amg_cfmap)
71*59599516SKenneth E. Jansen      end if
72*59599516SKenneth E. Jansen
73*59599516SKenneth E. Jansen      ! colm
74*59599516SKenneth E. Jansen      call ramg_allocate(1,nshg,0,1)
75*59599516SKenneth E. Jansen      allocate(amg_paramap(1)%p(nshg))
76*59599516SKenneth E. Jansen      allocate(amg_paraext(1)%p(nshg))
77*59599516SKenneth E. Jansen
78*59599516SKenneth E. Jansen      mflowDiag(:,:)=0
79*59599516SKenneth E. Jansen
80*59599516SKenneth E. Jansen!      if ( (numpe.gt.1) ) then !.and.(iamg_reduce.gt.0) ) then
81*59599516SKenneth E. Jansen!          call ramg_prep_reduce_map
82*59599516SKenneth E. Jansen          !call ramg_dump_i(ncorp_map,nshg,1,'map_nproc ')
83*59599516SKenneth E. Jansen          !deallocate(ncorp_map)
84*59599516SKenneth E. Jansen!      endif
85*59599516SKenneth E. Jansen
86*59599516SKenneth E. Jansen      call drvLesPrepDiag(mflowDiag,ilwork,iBC,BC,iper,
87*59599516SKenneth E. Jansen     &                    rowp,colm,lhsK,lhsP)
88*59599516SKenneth E. Jansen
89*59599516SKenneth E. Jansen      !*** Complete diagonal values in mflowdiag,pflowdiag ***
90*59599516SKenneth E. Jansen      !*** lhs K, G, C should have "global" values on diagonal ***
91*59599516SKenneth E. Jansen      !call ramg_dump_rn_map(mflowDiag,nshg,4,'mflowDiagb')
92*59599516SKenneth E. Jansen      call commIn(mflowdiag,ilwork,4,iper,iBC,BC)
93*59599516SKenneth E. Jansen      call commOut(mflowdiag,ilwork,4,iper,iBC,BC)
94*59599516SKenneth E. Jansen      !call ramg_dump_rn_map(mflowDiag,nshg,4,'mflowDiaga')
95*59599516SKenneth E. Jansen      ! call ramg_dump(mflowDiag,nshg,'flowdiag  ')
96*59599516SKenneth E. Jansen
97*59599516SKenneth E. Jansen      allocate(ramg_flowDiag%p(nshg,4))
98*59599516SKenneth E. Jansen      allocate(amg_cfmap(nshg))
99*59599516SKenneth E. Jansen
100*59599516SKenneth E. Jansen      amg_cfmap = 1
101*59599516SKenneth E. Jansen      ! amg_cfmap is such a variable that it keeps
102*59599516SKenneth E. Jansen      ! coarsening information through the coarsest level
103*59599516SKenneth E. Jansen      ! in a finest level array to enable communication.
104*59599516SKenneth E. Jansen      ! The structure is : 111223322113231122...
105*59599516SKenneth E. Jansen      ! obviously the nodes that kept into next level got
106*59599516SKenneth E. Jansen      ! an extra 1
107*59599516SKenneth E. Jansen
108*59599516SKenneth E. Jansen      do i=1,4
109*59599516SKenneth E. Jansen      ramg_flowDiag%p(:,i) = mflowDiag(:,i)
110*59599516SKenneth E. Jansen      do j=1,nshg
111*59599516SKenneth E. Jansen         if (mflowdiag(j,4).eq.0) then
112*59599516SKenneth E. Jansen             write(*,*)'mflowdiag zero at ',j,i
113*59599516SKenneth E. Jansen             stop
114*59599516SKenneth E. Jansen         end if
115*59599516SKenneth E. Jansen      enddo
116*59599516SKenneth E. Jansen      enddo
117*59599516SKenneth E. Jansen
118*59599516SKenneth E. Jansen      call ramg_initBCflag(amg_paramap(1)%p,ilwork,BC,iBC,iper)
119*59599516SKenneth E. Jansen
120*59599516SKenneth E. Jansen      call ramg_global_lhs(colm,rowp,lhsP,nnz_tot,
121*59599516SKenneth E. Jansen     &                    lhsGPcolm,lhsGProwp,lhsGP,4,
122*59599516SKenneth E. Jansen     &                    ilwork,BC,iBC,iper)
123*59599516SKenneth E. Jansen
124*59599516SKenneth E. Jansen      ! prepare extended boundary in amg_paraext
125*59599516SKenneth E. Jansen      ni = 0
126*59599516SKenneth E. Jansen      nj = 0
127*59599516SKenneth E. Jansen      amg_paraext(1)%p = amg_paramap(1)%p
128*59599516SKenneth E. Jansen      do i=1,nshg
129*59599516SKenneth E. Jansen         if (amg_paramap(1)%p(i).ne.(myrank+1)) then
130*59599516SKenneth E. Jansen             ni = ni+1
131*59599516SKenneth E. Jansen             nj = nj+1
132*59599516SKenneth E. Jansen             do m=lhsGPcolm%p(i),lhsGPcolm%p(i+1)-1
133*59599516SKenneth E. Jansen                k = lhsGProwp%p(m)
134*59599516SKenneth E. Jansen                if (amg_paraext(1)%p(k).eq.(myrank+1)) then
135*59599516SKenneth E. Jansen                    nj = nj+1
136*59599516SKenneth E. Jansen                    amg_paraext(1)%p(k)=amg_paramap(1)%p(i)
137*59599516SKenneth E. Jansen                endif
138*59599516SKenneth E. Jansen             enddo
139*59599516SKenneth E. Jansen         endif
140*59599516SKenneth E. Jansen      enddo
141*59599516SKenneth E. Jansen      !write(*,*)'proc',myrank,ni,nj,nshg
142*59599516SKenneth E. Jansen
143*59599516SKenneth E. Jansen      ! end of preparing extended boundary
144*59599516SKenneth E. Jansen
145*59599516SKenneth E. Jansen      extentri = .false. ! HAVE extra entries
146*59599516SKenneth E. Jansen      !extentri = .true. ! NO extra entries
147*59599516SKenneth E. Jansen
148*59599516SKenneth E. Jansen      ! output K^{hat}^-1 and lhsP (G,C) to external file
149*59599516SKenneth E. Jansen      !write(fname,*)'Khatinv'
150*59599516SKenneth E. Jansen      !call ramg_dump_rn(mflowdiag,nshg,4,fname)
151*59599516SKenneth E. Jansen      !write(fname,*)'lhsP'
152*59599516SKenneth E. Jansen      !call ramg_dump_matlab_A(colm,rowp,lhsGP,nshg,nnz_tot,4,fname)
153*59599516SKenneth E. Jansen
154*59599516SKenneth E. Jansen      mnnz = 1
155*59599516SKenneth E. Jansen      temprow = 0
156*59599516SKenneth E. Jansen      do i = 1,nshg                ! each row
157*59599516SKenneth E. Jansen        amg_A_colm(1)%p(i) = mnnz
158*59599516SKenneth E. Jansen        !q = iabs(amg_paramap(1)%p(i)) ! used only in reduced serial
159*59599516SKenneth E. Jansen        do m = lhsGPcolm%p(i),lhsGPcolm%p(i+1)-1
160*59599516SKenneth E. Jansen           k = lhsGProwp%p(m)
161*59599516SKenneth E. Jansen           do j = lhsGPcolm%p(k),lhsGPcolm%p(k+1)-1
162*59599516SKenneth E. Jansen              p = lhsGProwp%p(j)
163*59599516SKenneth E. Jansen              !qq = iabs(amg_paramap(1)%p(p)) ! used only in reduced
164*59599516SKenneth E. Jansen              !serial
165*59599516SKenneth E. Jansen              if (temprow(p).ne.i) then
166*59599516SKenneth E. Jansen!        if ((iamg_reduce.gt.1).and.(numpe.eq.1).and.(extentri))then
167*59599516SKenneth E. Jansen!                     if  ( (rmap1d(1,qq).eq.rmap1d(1,q)).or.
168*59599516SKenneth E. Jansen!     &                     (rmap1d(2,qq).eq.rmap1d(2,q)).or.
169*59599516SKenneth E. Jansen!     &                     (rmap1d(1,qq).eq.rmap1d(2,q)).or.
170*59599516SKenneth E. Jansen!     &                     (rmap1d(2,qq).eq.rmap1d(1,q)) ) then
171*59599516SKenneth E. Jansen!                       temprow(p) = i
172*59599516SKenneth E. Jansen!                       mnnz = mnnz + 1
173*59599516SKenneth E. Jansen!                     endif
174*59599516SKenneth E. Jansen!                   else
175*59599516SKenneth E. Jansen                   temprow(p) = i
176*59599516SKenneth E. Jansen                   mnnz = mnnz + 1
177*59599516SKenneth E. Jansen!                   endif
178*59599516SKenneth E. Jansen              end if
179*59599516SKenneth E. Jansen           end do
180*59599516SKenneth E. Jansen        end do
181*59599516SKenneth E. Jansen      end do
182*59599516SKenneth E. Jansen      amg_A_colm(1)%p(nshg+1) = mnnz
183*59599516SKenneth E. Jansen      mnnz = mnnz - 1
184*59599516SKenneth E. Jansen      !*** now we have amg_nnz(1) as nnz_tot for PPE
185*59599516SKenneth E. Jansen      call ramg_allocate(1,0,mnnz,1)
186*59599516SKenneth E. Jansen      !allocate(levelbaseflag(mnnz))
187*59599516SKenneth E. Jansen      !levelbaseflag = 0
188*59599516SKenneth E. Jansen
189*59599516SKenneth E. Jansen      if (iamg_verb.gt.5) then
190*59599516SKenneth E. Jansen      write(6,7003) nshg,amg_nnz(1)
191*59599516SKenneth E. Jansen7003  format(/'nshg='i10',  nnz='i10)
192*59599516SKenneth E. Jansen      endif
193*59599516SKenneth E. Jansen
194*59599516SKenneth E. Jansen      !*** end of PPE memory alloc ***
195*59599516SKenneth E. Jansen
196*59599516SKenneth E. Jansen      !**** begin putting rowp and values into PPE **
197*59599516SKenneth E. Jansen      mnnz = 0
198*59599516SKenneth E. Jansen      temprow = 0
199*59599516SKenneth E. Jansen
200*59599516SKenneth E. Jansen
201*59599516SKenneth E. Jansen      ! rowp
202*59599516SKenneth E. Jansen      do i = 1,nshg
203*59599516SKenneth E. Jansen         mnnz = mnnz + 1
204*59599516SKenneth E. Jansen         amg_A_rowp(1)%p(mnnz) = i
205*59599516SKenneth E. Jansen         temprow(i) = i
206*59599516SKenneth E. Jansen         !levelbaseflag(mnnz) = 1
207*59599516SKenneth E. Jansen         !q = iabs(amg_paramap(1)%p(i)) !used in reduced serial
208*59599516SKenneth E. Jansen         do m = lhsGPcolm%p(i),lhsGPcolm%p(i+1)-1
209*59599516SKenneth E. Jansen            j = lhsGProwp%p(m)
210*59599516SKenneth E. Jansen            do n = lhsGPcolm%p(j),lhsGPcolm%p(j+1)-1
211*59599516SKenneth E. Jansen               k = lhsGProwp%p(n)
212*59599516SKenneth E. Jansen               !qq = iabs(amg_paramap(1)%p(k)) !reduced serial
213*59599516SKenneth E. Jansen               if ( temprow(k) .ne. i) then
214*59599516SKenneth E. Jansen!         if ((iamg_reduce.gt.1).and.(numpe.eq.1).and.(.true.))then
215*59599516SKenneth E. Jansen!                     if  ( (rmap1d(1,qq).eq.rmap1d(1,q)).or.
216*59599516SKenneth E. Jansen!     &                     (rmap1d(2,qq).eq.rmap1d(2,q)).or.
217*59599516SKenneth E. Jansen!     &                     (rmap1d(1,qq).eq.rmap1d(2,q)).or.
218*59599516SKenneth E. Jansen!     &                     (rmap1d(2,qq).eq.rmap1d(1,q)) ) then
219*59599516SKenneth E. Jansen!                       mnnz = mnnz + 1
220*59599516SKenneth E. Jansen!                       amg_A_rowp(1)%p(mnnz) = k
221*59599516SKenneth E. Jansen!                       temprow(k) = i
222*59599516SKenneth E. Jansen!                        levelbaseflag(mnnz+1) = 1
223*59599516SKenneth E. Jansen!                     endif
224*59599516SKenneth E. Jansen!         endif
225*59599516SKenneth E. Jansen!                   else
226*59599516SKenneth E. Jansen                   mnnz = mnnz + 1
227*59599516SKenneth E. Jansen                   amg_A_rowp(1)%p(mnnz) = k
228*59599516SKenneth E. Jansen                   temprow(k) = i
229*59599516SKenneth E. Jansen!                   endif
230*59599516SKenneth E. Jansen               end if
231*59599516SKenneth E. Jansen            enddo
232*59599516SKenneth E. Jansen         enddo
233*59599516SKenneth E. Jansen         do m=amg_A_colm(1)%p(i)+1,amg_A_colm(1)%p(i+1)-1
234*59599516SKenneth E. Jansen            ki = amg_A_rowp(1)%p(m)
235*59599516SKenneth E. Jansen            do n=m+1,amg_A_colm(1)%p(i+1)-1
236*59599516SKenneth E. Jansen               kj = amg_A_rowp(1)%p(n)
237*59599516SKenneth E. Jansen               if (kj.lt.ki) then
238*59599516SKenneth E. Jansen                   amg_A_rowp(1)%p(m) = kj
239*59599516SKenneth E. Jansen                   amg_A_rowp(1)%p(n) = ki
240*59599516SKenneth E. Jansen                   ki = kj
241*59599516SKenneth E. Jansen!                   p = levelbaseflag(n)
242*59599516SKenneth E. Jansen!                   levelbaseflag(n) = levelbaseflag(m)
243*59599516SKenneth E. Jansen!                   levelbaseflag(m) = p
244*59599516SKenneth E. Jansen               end if
245*59599516SKenneth E. Jansen            enddo
246*59599516SKenneth E. Jansen         enddo
247*59599516SKenneth E. Jansen      enddo
248*59599516SKenneth E. Jansen
249*59599516SKenneth E. Jansen!      j = 0
250*59599516SKenneth E. Jansen!      do i=1,mnnz
251*59599516SKenneth E. Jansen!         j = j + levelbaseflag(i)
252*59599516SKenneth E. Jansen!      enddo
253*59599516SKenneth E. Jansen!      write(*,*)'mcheck incomplete: ',j
254*59599516SKenneth E. Jansen
255*59599516SKenneth E. Jansen      rt = 0
256*59599516SKenneth E. Jansen
257*59599516SKenneth E. Jansen      ! matrix value
258*59599516SKenneth E. Jansen      ! cki,ckj,ckk, this is to avoid double summation on PPE,
259*59599516SKenneth E. Jansen      ! since both master and slave have complete lhsP, parts of it
260*59599516SKenneth E. Jansen      ! should be removed when constructing PPE. if (i,j) are both from
261*59599516SKenneth E. Jansen      ! slave
262*59599516SKenneth E. Jansen      do i=1,nshg
263*59599516SKenneth E. Jansen         do m = amg_A_colm(1)%p(i),amg_A_colm(1)%p(i+1)-1
264*59599516SKenneth E. Jansen            j = amg_A_rowp(1)%p(m)
265*59599516SKenneth E. Jansen            !if (levelbaseflag(m).eq.0) then
266*59599516SKenneth E. Jansen            !    amg_A_lhs(1)%p(m,1) = 0
267*59599516SKenneth E. Jansen            !    cycle
268*59599516SKenneth E. Jansen            !endif
269*59599516SKenneth E. Jansen            ki = lhsGPcolm%p(i)
270*59599516SKenneth E. Jansen            ni = lhsGPcolm%p(i+1)
271*59599516SKenneth E. Jansen            kj = lhsGPcolm%p(j)
272*59599516SKenneth E. Jansen            nj = lhsGPcolm%p(j+1)
273*59599516SKenneth E. Jansen            rtemp = 0
274*59599516SKenneth E. Jansen            ! question: the original lhsK,lhsP, are they symmetric?
275*59599516SKenneth E. Jansen            ! symmetric in nnz structure but not in value?
276*59599516SKenneth E. Jansen            kloop: do while ( ( ki.lt.ni ).and.(kj.lt.nj) )
277*59599516SKenneth E. Jansen              do while ((ki.lt.ni).and.
278*59599516SKenneth E. Jansen     &           (lhsGProwp%p(ki).lt.lhsGProwp%p(kj)) )
279*59599516SKenneth E. Jansen                 ki = ki + 1
280*59599516SKenneth E. Jansen              enddo
281*59599516SKenneth E. Jansen              if (ki.eq.ni) exit kloop
282*59599516SKenneth E. Jansen              do while ( (kj.lt.nj) .and.
283*59599516SKenneth E. Jansen     &                   (lhsGProwp%p(kj).lt.lhsGProwp%p(ki)) )
284*59599516SKenneth E. Jansen                 kj = kj + 1
285*59599516SKenneth E. Jansen              enddo
286*59599516SKenneth E. Jansen              if (kj.eq.nj) exit kloop
287*59599516SKenneth E. Jansen              p = lhsGProwp%p(ki)
288*59599516SKenneth E. Jansen              q = lhsGProwp%p(kj)
289*59599516SKenneth E. Jansen              if (p.eq.q) then
290*59599516SKenneth E. Jansenc              if (amg_paramap(1)%p(p).eq.amg_paramap(1)%p(q)) then
291*59599516SKenneth E. Jansen                  k = q
292*59599516SKenneth E. Jansen               cki = amg_paramap(1)%p(i)
293*59599516SKenneth E. Jansen               ckj = amg_paramap(1)%p(j)
294*59599516SKenneth E. Jansen               ckk = amg_paramap(1)%p(k)
295*59599516SKenneth E. Jansen               if (.not.((iabs(cki).eq.iabs(ckj)).and.
296*59599516SKenneth E. Jansen     &             (iabs(ckj).eq.iabs(ckk)).and.
297*59599516SKenneth E. Jansen     &             (cki.lt.0).and.(ckj.lt.0).and.(ckk.lt.0))) then
298*59599516SKenneth E. Jansen                  rtemp = rtemp
299*59599516SKenneth E. Jansen     &            + lhsGP%p(1,ki)*lhsGP%p(1,kj)*mflowDiag(k,1)**2
300*59599516SKenneth E. Jansen     &            + lhsGP%p(2,ki)*lhsGP%p(2,kj)*mflowDiag(k,2)**2
301*59599516SKenneth E. Jansen     &            + lhsGP%p(3,ki)*lhsGP%p(3,kj)*mflowDiag(k,3)**2
302*59599516SKenneth E. Jansen               endif
303*59599516SKenneth E. Jansen                  ki = ki+1
304*59599516SKenneth E. Jansen                  kj = kj+1
305*59599516SKenneth E. Jansenc              endif
306*59599516SKenneth E. Jansen              end if
307*59599516SKenneth E. Jansen            enddo kloop
308*59599516SKenneth E. Jansen            amg_A_lhs(1)%p(m,1)=rtemp
309*59599516SKenneth E. Jansen         enddo
310*59599516SKenneth E. Jansen      enddo
311*59599516SKenneth E. Jansen      do i=1,nshg
312*59599516SKenneth E. Jansen         ki = amg_A_colm(1)%p(i)+1
313*59599516SKenneth E. Jansen         mloop: do m=lhsGPcolm%p(i),lhsGPcolm%p(i+1)-1
314*59599516SKenneth E. Jansen            j = lhsGProwp%p(m)
315*59599516SKenneth E. Jansen            if (j.eq.i) then
316*59599516SKenneth E. Jansen            cki = amg_paramap(1)%p(i)
317*59599516SKenneth E. Jansen            ckj = amg_paramap(1)%p(j)
318*59599516SKenneth E. Jansen            if (.not.((iabs(cki).eq.iabs(ckj)).and.
319*59599516SKenneth E. Jansen     &                (cki.lt.0).and.(ckj.lt.0))) then
320*59599516SKenneth E. Jansen             amg_A_lhs(1)%p(amg_A_colm(1)%p(i),1) =
321*59599516SKenneth E. Jansen     &          + amg_A_lhs(1)%p(amg_A_colm(1)%p(i),1) + lhsGP%p(4,m)
322*59599516SKenneth E. Jansen            endif
323*59599516SKenneth E. Jansen                cycle mloop
324*59599516SKenneth E. Jansen            end if
325*59599516SKenneth E. Jansen            do while(amg_A_rowp(1)%p(ki).lt.j)
326*59599516SKenneth E. Jansen               ki = ki+1
327*59599516SKenneth E. Jansen            enddo
328*59599516SKenneth E. Jansen            cki = amg_paramap(1)%p(i)
329*59599516SKenneth E. Jansen            ckj = amg_paramap(1)%p(j)
330*59599516SKenneth E. Jansen            ckk = amg_paramap(1)%p(amg_A_rowp(1)%p(ki))
331*59599516SKenneth E. Jansen            if (.not.((iabs(cki).eq.iabs(ckj)).and.
332*59599516SKenneth E. Jansen     &                (iabs(ckj).eq.iabs(ckk)).and.
333*59599516SKenneth E. Jansen     &                (cki.lt.0).and.(ckj.lt.0).and.(ckk.lt.0))) then
334*59599516SKenneth E. Jansen            amg_A_lhs(1)%p(ki,1) = amg_A_lhs(1)%p(ki,1) + lhsGP%p(4,m)
335*59599516SKenneth E. Jansen            endif
336*59599516SKenneth E. Jansen            ki = ki+1
337*59599516SKenneth E. Jansen         enddo mloop
338*59599516SKenneth E. Jansen      enddo
339*59599516SKenneth E. Jansen
340*59599516SKenneth E. Jansen      !gtg: lhsgp(4,m), mflowdiag ignored
341*59599516SKenneth E. Jansen
342*59599516SKenneth E. Jansen      deallocate(lhsGP%p)
343*59599516SKenneth E. Jansen      deallocate(lhsGProwp%p)
344*59599516SKenneth E. Jansen      deallocate(lhsGPcolm%p)
345*59599516SKenneth E. Jansen
346*59599516SKenneth E. Jansen      if (.true.) then
347*59599516SKenneth E. Jansen
348*59599516SKenneth E. Jansen      call ramg_global_lhs(amg_A_colm(1)%p,amg_A_rowp(1)%p,
349*59599516SKenneth E. Jansen     &                    amg_A_lhs(1)%p,amg_nnz(1),
350*59599516SKenneth E. Jansen     &                    lhsGPcolm,lhsGProwp,lhsGP,1,
351*59599516SKenneth E. Jansen     &                    ilwork,BC,iBC,iper)
352*59599516SKenneth E. Jansen
353*59599516SKenneth E. Jansen      amg_A_colm(1)%p = lhsGPcolm%p
354*59599516SKenneth E. Jansen      amg_nnz(1) = lhsGPcolm%p(amg_nshg(1)+1)-1
355*59599516SKenneth E. Jansen      deallocate(amg_A_rowp(1)%p)
356*59599516SKenneth E. Jansen      deallocate(amg_A_lhs(1)%p)
357*59599516SKenneth E. Jansen      allocate(amg_A_rowp(1)%p(amg_nnz(1)))
358*59599516SKenneth E. Jansen      allocate(amg_A_lhs(1)%p(amg_nnz(1),1))
359*59599516SKenneth E. Jansen      amg_A_rowp(1)%p = lhsGProwp%p
360*59599516SKenneth E. Jansen      amg_A_lhs(1)%p = lhsGP%p
361*59599516SKenneth E. Jansen      deallocate(lhsGP%p)
362*59599516SKenneth E. Jansen      deallocate(lhsGProwp%p)
363*59599516SKenneth E. Jansen      deallocate(lhsGPcolm%p)
364*59599516SKenneth E. Jansen
365*59599516SKenneth E. Jansen      endif
366*59599516SKenneth E. Jansen
367*59599516SKenneth E. Jansen      if (.false.) then
368*59599516SKenneth E. Jansen          ! Dump for Matlab
369*59599516SKenneth E. Jansen         call ramg_dump_matlab_map(amg_A_colm(1)%p,amg_A_rowp(1)%p,
370*59599516SKenneth E. Jansen     &             amg_A_lhs(1)%p,
371*59599516SKenneth E. Jansen     &             amg_nshg(1),amg_nnz(1),1,
372*59599516SKenneth E. Jansen     &             'A0        ')
373*59599516SKenneth E. Jansen!         call ramg_dump_matlab_map(lhsGPcolm%p,lhsGProwp%p,
374*59599516SKenneth E. Jansen!     &             lhsGP%p,
375*59599516SKenneth E. Jansen!     &             amg_nshg(1),lhsGPcolm%p(amg_nshg(1)+1)-1,1,
376*59599516SKenneth E. Jansen!     &             'A0        ')
377*59599516SKenneth E. Jansen          !call ramg_dump(amg_ppeDiag(1)%p,nshg,'ppediag   ')
378*59599516SKenneth E. Jansen      end if
379*59599516SKenneth E. Jansen
380*59599516SKenneth E. Jansen
381*59599516SKenneth E. Jansen      if (.false.) then ! Check Diagonal Scaling, M-matrix
382*59599516SKenneth E. Jansen          open(264,file='mtcheck.dat',status='unknown')
383*59599516SKenneth E. Jansen          do i=1,amg_nshg(1)
384*59599516SKenneth E. Jansen             m = 0
385*59599516SKenneth E. Jansen             rtemp=amg_A_lhs(1)%p(amg_A_colm(1)%p(i),1)
386*59599516SKenneth E. Jansen             rtp = 0
387*59599516SKenneth E. Jansen             rtn = 0
388*59599516SKenneth E. Jansen             do j=amg_A_colm(1)%p(i)+1,amg_A_colm(1)%p(i+1)-1
389*59599516SKenneth E. Jansen                rtemp = rtemp + amg_A_lhs(1)%p(j,1)
390*59599516SKenneth E. Jansen                rt = amg_A_lhs(1)%p(j,1)
391*59599516SKenneth E. Jansen                if (rt.gt.0) then
392*59599516SKenneth E. Jansen                   if ( rt.gt.rtp ) rtp = rt
393*59599516SKenneth E. Jansen                end if
394*59599516SKenneth E. Jansen                if (rt.lt.0) then
395*59599516SKenneth E. Jansen                    if (rt.le.rtn) rtn = rt
396*59599516SKenneth E. Jansen                end if
397*59599516SKenneth E. Jansen             enddo
398*59599516SKenneth E. Jansen             rtp = rtp/ (amg_A_lhs(1)%p(amg_A_colm(1)%p(i),1))
399*59599516SKenneth E. Jansen             rtn = rtn/amg_A_lhs(1)%p(amg_A_colm(1)%p(i),1)
400*59599516SKenneth E. Jansen             write(264,"((I5)(A)(E9.3)(A)(E9.3)(A)(E9.3))")
401*59599516SKenneth E. Jansen     &         i,'  ',rtp,'  ',rtn,'  ',rtemp
402*59599516SKenneth E. Jansen          enddo
403*59599516SKenneth E. Jansen          close(264)
404*59599516SKenneth E. Jansen      end if
405*59599516SKenneth E. Jansen
406*59599516SKenneth E. Jansen    ! scaled by diag(PPE) 1...1
407*59599516SKenneth E. Jansen       do i=1,nshg
408*59599516SKenneth E. Jansen         amg_ppeDiag(1)%p(i) =
409*59599516SKenneth E. Jansen     &      1.0/sqrt(amg_A_lhs(1)%p(amg_A_colm(1)%p(i),1))
410*59599516SKenneth E. Jansen       enddo
411*59599516SKenneth E. Jansen
412*59599516SKenneth E. Jansen      do i=1,nshg
413*59599516SKenneth E. Jansen         do m=amg_A_colm(1)%p(i),amg_A_colm(1)%p(i+1)-1
414*59599516SKenneth E. Jansen            j = amg_A_rowp(1)%p(m)
415*59599516SKenneth E. Jansen            amg_A_lhs(1)%p(m,1) = amg_A_lhs(1)%p(m,1) *
416*59599516SKenneth E. Jansen     &      amg_ppeDiag(1)%p(i)*amg_ppeDiag(1)%p(j)
417*59599516SKenneth E. Jansen         end do
418*59599516SKenneth E. Jansen         amg_A_rhs(1)%p(i) = amg_A_rhs(1)%p(i)*amg_ppeDiag(1)%p(i)
419*59599516SKenneth E. Jansen      end do
420*59599516SKenneth E. Jansen
421*59599516SKenneth E. Jansen      ! If solve heat/scalar, should disable following 3 lines
422*59599516SKenneth E. Jansen      ! because we only have 1 scaling.
423*59599516SKenneth E. Jansen      do i=1,nshg
424*59599516SKenneth E. Jansen         amg_ppeDiag(1)%p(i) = amg_ppeDiag(1)%p(i)/mflowDiag(i,4)
425*59599516SKenneth E. Jansen      enddo
426*59599516SKenneth E. Jansen
427*59599516SKenneth E. Jansen      if (.false.) then
428*59599516SKenneth E. Jansen          ! Dump for Matlab
429*59599516SKenneth E. Jansen         call ramg_dump_matlab_map(amg_A_colm(1)%p,amg_A_rowp(1)%p,
430*59599516SKenneth E. Jansen     &             amg_A_lhs(1)%p,
431*59599516SKenneth E. Jansen     &             amg_nshg(1),amg_nnz(1),1,
432*59599516SKenneth E. Jansen     &             'A0scaled  ')
433*59599516SKenneth E. Jansen!         call ramg_dump_matlab_map(lhsGPcolm%p,lhsGProwp%p,
434*59599516SKenneth E. Jansen!     &             lhsGP%p,
435*59599516SKenneth E. Jansen!     &             amg_nshg(1),lhsGPcolm%p(amg_nshg(1)+1)-1,1,
436*59599516SKenneth E. Jansen!     &             'A0        ')
437*59599516SKenneth E. Jansen          !call ramg_dump(amg_ppeDiag(1)%p,nshg,'ppediag   ')
438*59599516SKenneth E. Jansen      end if
439*59599516SKenneth E. Jansen
440*59599516SKenneth E. Jansen
441*59599516SKenneth E. Jansen      return
442*59599516SKenneth E. Jansen
443*59599516SKenneth E. Jansen      end subroutine !ramg_extract_ppe
444*59599516SKenneth E. Jansen
445