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