1*59599516SKenneth E. Jansen!********************************************************** 2*59599516SKenneth E. Jansen! RAMG tools, functions needed in ramg_driver and 3*59599516SKenneth E. Jansen! ramg_interface. 4*59599516SKenneth E. Jansen! Module defined in ramg_data.f 5*59599516SKenneth E. Jansen! 6*59599516SKenneth E. Jansen! ramg_calcIAI 7*59599516SKenneth E. Jansen! ramg_calcIvFC/CF 8*59599516SKenneth E. Jansen! ramg_direct 9*59599516SKenneth E. Jansen! ramg_allocate 10*59599516SKenneth E. Jansen! ramg_deallocate 11*59599516SKenneth E. Jansen! ramg_dump 12*59599516SKenneth E. Jansen! 13*59599516SKenneth E. Jansen!*********************************************************** 14*59599516SKenneth E. Jansen 15*59599516SKenneth E. Jansen 16*59599516SKenneth E. Jansen!!*********************************************************** 17*59599516SKenneth E. Jansen! ramg_calcIvCF 18*59599516SKenneth E. Jansen! calculate V coarse to fine, 19*59599516SKenneth E. Jansen! v = I * VC 20*59599516SKenneth E. Jansen!*********************************************************** 21*59599516SKenneth E. Jansen subroutine ramg_calcIvCF(level1,level2,VC,vf, 22*59599516SKenneth E. Jansen & ilwork,BC,iBC,iper) 23*59599516SKenneth E. Jansen use ramg_data 24*59599516SKenneth E. Jansen include "common.h" 25*59599516SKenneth E. Jansen include "mpif.h" 26*59599516SKenneth E. Jansen 27*59599516SKenneth E. Jansen !implicit none 28*59599516SKenneth E. Jansen integer,intent(in) :: level1,level2 29*59599516SKenneth E. Jansen real(kind=8),intent(inout),dimension(amg_nshg(level1)) :: vf 30*59599516SKenneth E. Jansen real(kind=8),intent(in),dimension(amg_nshg(level2)) :: VC 31*59599516SKenneth E. Jansen 32*59599516SKenneth E. Jansen integer,intent(in),dimension(nlwork) :: ilwork 33*59599516SKenneth E. Jansen integer,intent(in),dimension(nshg) :: iBC,iper 34*59599516SKenneth E. Jansen real(kind=8),intent(in),dimension(nshg,ndofBC) :: BC 35*59599516SKenneth E. Jansen 36*59599516SKenneth E. Jansen integer :: i,j,k,p 37*59599516SKenneth E. Jansen 38*59599516SKenneth E. Jansen real(kind=8) :: cpusec(2) 39*59599516SKenneth E. Jansen 40*59599516SKenneth E. Jansen call cpu_time(cpusec(1)) 41*59599516SKenneth E. Jansen 42*59599516SKenneth E. Jansen vf = 0 43*59599516SKenneth E. Jansen do i=1,amg_nshg(level1) 44*59599516SKenneth E. Jansen do k=I_cf_colm(level1)%p(i),I_cf_colm(level1)%p(i+1)-1 45*59599516SKenneth E. Jansen j = I_cf_rowp(level1)%p(k) 46*59599516SKenneth E. Jansen vf(i) = vf(i) + VC(j)*I_cf(level1)%p(k) 47*59599516SKenneth E. Jansen enddo 48*59599516SKenneth E. Jansen enddo 49*59599516SKenneth E. Jansen 50*59599516SKenneth E. Jansen if ( level1 .eq. -1 ) then 51*59599516SKenneth E. Jansen call commIn(vf,ilwork,1,iper,iBC,BC) 52*59599516SKenneth E. Jansen call commOut(vf,ilwork,1,iper,iBC,BC) 53*59599516SKenneth E. Jansen end if 54*59599516SKenneth E. Jansen 55*59599516SKenneth E. Jansen call cpu_time(cpusec(2)) 56*59599516SKenneth E. Jansen ramg_time(13)=ramg_time(13)+cpusec(2)-cpusec(1) 57*59599516SKenneth E. Jansen 58*59599516SKenneth E. Jansen end subroutine ! ramg_calcIvCF 59*59599516SKenneth E. Jansen 60*59599516SKenneth E. Jansen!*********************************************************** 61*59599516SKenneth E. Jansen! ramg_calcIvFC 62*59599516SKenneth E. Jansen! calculate v fine to coarse, 63*59599516SKenneth E. Jansen! VC = IT * v 64*59599516SKenneth E. Jansen!*********************************************************** 65*59599516SKenneth E. Jansen subroutine ramg_calcIvFC(level1,level2,vf,VC) 66*59599516SKenneth E. Jansen use ramg_data 67*59599516SKenneth E. Jansen implicit none 68*59599516SKenneth E. Jansen integer,intent(in) :: level1,level2 69*59599516SKenneth E. Jansen real(kind=8),intent(in),dimension(amg_nshg(level1)) :: vf 70*59599516SKenneth E. Jansen real(kind=8),intent(inout),dimension(amg_nshg(level2)) :: VC 71*59599516SKenneth E. Jansen 72*59599516SKenneth E. Jansen integer :: i,j,k,p 73*59599516SKenneth E. Jansen real(kind=8) :: cpusec(2) 74*59599516SKenneth E. Jansen 75*59599516SKenneth E. Jansen call cpu_time(cpusec(1)) 76*59599516SKenneth E. Jansen 77*59599516SKenneth E. Jansen 78*59599516SKenneth E. Jansen VC = 0 79*59599516SKenneth E. Jansen do i=1,amg_nshg(level2) 80*59599516SKenneth E. Jansen do k=I_fc_colm(level1)%p(i),I_fc_colm(level1)%p(i+1)-1 81*59599516SKenneth E. Jansen j = I_fc_rowp(level1)%p(k) 82*59599516SKenneth E. Jansen VC(i) = VC(i) + vf(j)*I_fc(level1)%p(k) 83*59599516SKenneth E. Jansen enddo 84*59599516SKenneth E. Jansen enddo 85*59599516SKenneth E. Jansen call cpu_time(cpusec(2)) 86*59599516SKenneth E. Jansen ramg_time(13)=ramg_time(13)+cpusec(2)-cpusec(1) 87*59599516SKenneth E. Jansen 88*59599516SKenneth E. Jansen end subroutine ! ramg_calcIvFC 89*59599516SKenneth E. Jansen 90*59599516SKenneth E. Jansen!!*********************************************************** 91*59599516SKenneth E. Jansen! ramg_calcSvCF 92*59599516SKenneth E. Jansen! calculate V coarse to fine, 93*59599516SKenneth E. Jansen! v = S * VC 94*59599516SKenneth E. Jansen!*********************************************************** 95*59599516SKenneth E. Jansen 96*59599516SKenneth E. Jansen!*********************************************************** 97*59599516SKenneth E. Jansen! ramg_calcIvFC 98*59599516SKenneth E. Jansen! calculate v fine to coarse, 99*59599516SKenneth E. Jansen! VC = ST * v 100*59599516SKenneth E. Jansen!*********************************************************** 101*59599516SKenneth E. Jansen 102*59599516SKenneth E. Jansen!************************************************************ 103*59599516SKenneth E. Jansen! ramg_calcAv 104*59599516SKenneth E. Jansen! calculate u = A*v 105*59599516SKenneth E. Jansen!************************************************************ 106*59599516SKenneth E. Jansen subroutine ramg_calcAv(gcolm,growp,glhs,gnshg,gnnz_tot, 107*59599516SKenneth E. Jansen & u,v,gcomm) 108*59599516SKenneth E. Jansen use ramg_data 109*59599516SKenneth E. Jansen integer,intent(in) :: gnshg,gnnz_tot 110*59599516SKenneth E. Jansen integer,intent(in),dimension(gnshg+1) :: gcolm 111*59599516SKenneth E. Jansen integer,intent(in),dimension(gnnz_tot) :: growp 112*59599516SKenneth E. Jansen real(kind=8),intent(in),dimension(gnnz_tot) :: glhs 113*59599516SKenneth E. Jansen real(kind=8),intent(in),dimension(gnshg) :: v 114*59599516SKenneth E. Jansen real(kind=8),intent(inout),dimension(gnshg) :: u 115*59599516SKenneth E. Jansen integer,intent(in) :: gcomm 116*59599516SKenneth E. Jansen 117*59599516SKenneth E. Jansen integer :: i,j,k,p 118*59599516SKenneth E. Jansen 119*59599516SKenneth E. Jansen u = 0 120*59599516SKenneth E. Jansen do i=1,gnshg 121*59599516SKenneth E. Jansen do k=gcolm(i),gcolm(i+1)-1 122*59599516SKenneth E. Jansen j = growp(k) 123*59599516SKenneth E. Jansen u(i) = u(i)+glhs(k)*v(j) 124*59599516SKenneth E. Jansen enddo 125*59599516SKenneth E. Jansen enddo 126*59599516SKenneth E. Jansen 127*59599516SKenneth E. Jansen! if (gcomm.eq.1) then 128*59599516SKenneth E. Jansen! end if 129*59599516SKenneth E. Jansen 130*59599516SKenneth E. Jansen end subroutine ! ramg_calcAv 131*59599516SKenneth E. Jansen 132*59599516SKenneth E. Jansen!************************************************************ 133*59599516SKenneth E. Jansen! ramg_calcAv_g 134*59599516SKenneth E. Jansen! calculate u = A*v 135*59599516SKenneth E. Jansen! Globally: commout, do product, commin, (zeroout) 136*59599516SKenneth E. Jansen!************************************************************ 137*59599516SKenneth E. Jansen subroutine ramg_calcAv_g(level,u,v,colm,rowp,lhsK,lhsP, 138*59599516SKenneth E. Jansen & ilwork,BC,iBC,iper,gcomm) 139*59599516SKenneth E. Jansen use ramg_data 140*59599516SKenneth E. Jansen include "common.h" 141*59599516SKenneth E. Jansen include "mpif.h" 142*59599516SKenneth E. Jansen include "auxmpi.h" 143*59599516SKenneth E. Jansen 144*59599516SKenneth E. Jansen integer,intent(in),dimension(nlwork) :: ilwork 145*59599516SKenneth E. Jansen integer,intent(in),dimension(nshg) :: iBC,iper 146*59599516SKenneth E. Jansen real(kind=8),intent(in),dimension(nshg,ndofBC) :: BC 147*59599516SKenneth E. Jansen integer,intent(in),dimension(nshg+1) :: colm 148*59599516SKenneth E. Jansen integer,intent(in),dimension(nnz_tot) :: rowp 149*59599516SKenneth E. Jansen 150*59599516SKenneth E. Jansen real(kind=8),intent(in),dimension(9,nnz_tot) :: lhsK 151*59599516SKenneth E. Jansen real(kind=8),intent(in),dimension(4,nnz_tot) :: lhsP 152*59599516SKenneth E. Jansen integer,intent(in) :: level 153*59599516SKenneth E. Jansen real(kind=8),intent(inout),dimension(amg_nshg(level)) :: v 154*59599516SKenneth E. Jansen real(kind=8),intent(inout),dimension(amg_nshg(level)) :: u 155*59599516SKenneth E. Jansen integer,intent(in) :: gcomm 156*59599516SKenneth E. Jansen 157*59599516SKenneth E. Jansen integer :: i,j,k,p,mi,mj 158*59599516SKenneth E. Jansen real(kind=8) :: cpusec(2) 159*59599516SKenneth E. Jansen 160*59599516SKenneth E. Jansen call cpu_time(cpusec(1)) 161*59599516SKenneth E. Jansen 162*59599516SKenneth E. Jansen IF (level.eq.1) THEN 163*59599516SKenneth E. Jansen !IF (.FALSE.) THEN 164*59599516SKenneth E. Jansen call ramg_PPEAp(u,v,colm,rowp,lhsK,lhsP,ilwork,BC,iBC,iper) 165*59599516SKenneth E. Jansen ELSE 166*59599516SKenneth E. Jansen if (gcomm.eq.1) then 167*59599516SKenneth E. Jansen call ramg_commOut(v,level,ilwork,1,iper,iBC,BC) 168*59599516SKenneth E. Jansen endif 169*59599516SKenneth E. Jansen u = 0 170*59599516SKenneth E. Jansen do i=1,amg_nshg(level) 171*59599516SKenneth E. Jansen mi = amg_paramap(level)%p(i) 172*59599516SKenneth E. Jansen do k=amg_A_colm(level)%p(i),amg_A_colm(level)%p(i+1)-1 173*59599516SKenneth E. Jansen j = amg_A_rowp(level)%p(k) 174*59599516SKenneth E. Jansen mj = amg_paramap(level)%p(j) 175*59599516SKenneth E. Jansen if (.not.( (mi.eq.mj).and.(mi.lt.0) )) then 176*59599516SKenneth E. Jansen u(i) = u(i)+amg_A_lhs(level)%p(k,1)*v(j) 177*59599516SKenneth E. Jansen endif 178*59599516SKenneth E. Jansen enddo 179*59599516SKenneth E. Jansen enddo 180*59599516SKenneth E. Jansen if (gcomm.eq.1) then 181*59599516SKenneth E. Jansen call ramg_commIn(u,level,ilwork,1,iper,iBC,BC) 182*59599516SKenneth E. Jansen endif 183*59599516SKenneth E. Jansen ENDIF 184*59599516SKenneth E. Jansen call cpu_time(cpusec(2)) 185*59599516SKenneth E. Jansen if (level.eq.1) then 186*59599516SKenneth E. Jansen ramg_time(11) = ramg_time(11) + cpusec(2)-cpusec(1) 187*59599516SKenneth E. Jansen else 188*59599516SKenneth E. Jansen ramg_time(12) = ramg_time(12) + cpusec(2)-cpusec(1) 189*59599516SKenneth E. Jansen endif 190*59599516SKenneth E. Jansen 191*59599516SKenneth E. Jansen end subroutine ! ramg_calcAv_g 192*59599516SKenneth E. Jansen 193*59599516SKenneth E. Jansen!************************************************************ 194*59599516SKenneth E. Jansen! ramg_calcAv_b: same as calcAv_g, but only apply 195*59599516SKenneth E. Jansen! on boundary nodes. 196*59599516SKenneth E. Jansen! calculate u = A*v 197*59599516SKenneth E. Jansen! Globally: commout, do product, commin, (zeroout) 198*59599516SKenneth E. Jansen!************************************************************ 199*59599516SKenneth E. Jansen subroutine ramg_calcAv_b(level,u,v, 200*59599516SKenneth E. Jansen & ilwork,BC,iBC,iper,gcomm,diag) 201*59599516SKenneth E. Jansen use ramg_data 202*59599516SKenneth E. Jansen include "common.h" 203*59599516SKenneth E. Jansen include "mpif.h" 204*59599516SKenneth E. Jansen include "auxmpi.h" 205*59599516SKenneth E. Jansen 206*59599516SKenneth E. Jansen integer,intent(in),dimension(nlwork) :: ilwork 207*59599516SKenneth E. Jansen integer,intent(in),dimension(nshg) :: iBC,iper 208*59599516SKenneth E. Jansen real(kind=8),intent(in),dimension(nshg,ndofBC) :: BC 209*59599516SKenneth E. Jansen 210*59599516SKenneth E. Jansen integer,intent(in) :: level 211*59599516SKenneth E. Jansen real(kind=8),intent(inout),dimension(amg_nshg(level)) :: v 212*59599516SKenneth E. Jansen real(kind=8),intent(inout),dimension(amg_nshg(level)) :: u 213*59599516SKenneth E. Jansen integer,intent(in) :: gcomm 214*59599516SKenneth E. Jansen integer,intent(in) :: diag !=1: NOT include diagonal A_(i,i) 215*59599516SKenneth E. Jansen !=0: include diagonal 216*59599516SKenneth E. Jansen 217*59599516SKenneth E. Jansen integer :: i,j,k,p,mi,mj,mk 218*59599516SKenneth E. Jansen real(kind=8) :: cpusec(2) 219*59599516SKenneth E. Jansen 220*59599516SKenneth E. Jansen call cpu_time(cpusec(1)) 221*59599516SKenneth E. Jansen 222*59599516SKenneth E. Jansen if (gcomm.eq.1) then 223*59599516SKenneth E. Jansen call ramg_commOut(v,level,ilwork,1,iper,iBC,BC) 224*59599516SKenneth E. Jansen endif 225*59599516SKenneth E. Jansen u = 0 226*59599516SKenneth E. Jansen do i=1,amg_nshg(level) 227*59599516SKenneth E. Jansen mi = amg_paramap(level)%p(i) 228*59599516SKenneth E. Jansen mk = amg_paraext(level)%p(i) 229*59599516SKenneth E. Jansen IF (mk.ne.(myrank+1)) THEN ! only treat boundary nodes 230*59599516SKenneth E. Jansen do k=amg_A_colm(level)%p(i)+diag,amg_A_colm(level)%p(i+1)-1 231*59599516SKenneth E. Jansen j = amg_A_rowp(level)%p(k) 232*59599516SKenneth E. Jansen mj = amg_paramap(level)%p(j) 233*59599516SKenneth E. Jansen if (.not.( (mi.eq.mj).and.(mi.lt.0) )) then 234*59599516SKenneth E. Jansen u(i) = u(i)+amg_A_lhs(level)%p(k,1)*v(j) 235*59599516SKenneth E. Jansen endif 236*59599516SKenneth E. Jansen enddo 237*59599516SKenneth E. Jansen ELSE 238*59599516SKenneth E. Jansen u(i) = v(i) 239*59599516SKenneth E. Jansen ENDIF 240*59599516SKenneth E. Jansen enddo 241*59599516SKenneth E. Jansen if (gcomm.eq.1) then 242*59599516SKenneth E. Jansen call ramg_commIn(u,level,ilwork,1,iper,iBC,BC) 243*59599516SKenneth E. Jansen endif 244*59599516SKenneth E. Jansen 245*59599516SKenneth E. Jansen end subroutine ! ramg_calcAv_b 246*59599516SKenneth E. Jansen 247*59599516SKenneth E. Jansen 248*59599516SKenneth E. Jansen!************************************************* 249*59599516SKenneth E. Jansen! check_paracomm 250*59599516SKenneth E. Jansen!************************************************* 251*59599516SKenneth E. Jansen subroutine ramg_check_paracomm(ilwork,BC,iBC,iper) 252*59599516SKenneth E. Jansen use ramg_data 253*59599516SKenneth E. Jansen include "common.h" 254*59599516SKenneth E. Jansen include "mpif.h" 255*59599516SKenneth E. Jansen include "auxmpi.h" 256*59599516SKenneth E. Jansen 257*59599516SKenneth E. Jansen integer,intent(in),dimension(nlwork) :: ilwork 258*59599516SKenneth E. Jansen integer,intent(in),dimension(nshg) :: iBC,iper 259*59599516SKenneth E. Jansen real(kind=8),intent(in),dimension(nshg,ndofBC) :: BC 260*59599516SKenneth E. Jansen 261*59599516SKenneth E. Jansen integer i,j 262*59599516SKenneth E. Jansen type(r1d),dimension(ramg_levelx) :: tarray 263*59599516SKenneth E. Jansen character :: fname*80 264*59599516SKenneth E. Jansen 265*59599516SKenneth E. Jansen do i=1,ramg_levelx 266*59599516SKenneth E. Jansen allocate(tarray(i)%p(amg_nshg(i))) 267*59599516SKenneth E. Jansen do j=1,amg_nshg(i) 268*59599516SKenneth E. Jansen call random_number(tarray(i)%p) 269*59599516SKenneth E. Jansen enddo 270*59599516SKenneth E. Jansen enddo 271*59599516SKenneth E. Jansen 272*59599516SKenneth E. Jansen do i=1,ramg_levelx 273*59599516SKenneth E. Jansen write(fname,'((A8)(I1))')'tarray_a',i 274*59599516SKenneth E. Jansen call ramg_dump(tarray(i)%p,amg_nshg(i),fname) 275*59599516SKenneth E. Jansen enddo 276*59599516SKenneth E. Jansen 277*59599516SKenneth E. Jansen do i=1,ramg_levelx 278*59599516SKenneth E. Jansen call ramg_commIn(tarray(i)%p,i,ilwork,1,iper,iBC,BC) 279*59599516SKenneth E. Jansen write(fname,'((A8)(I1))')'tarray_i',i 280*59599516SKenneth E. Jansen call ramg_dump(tarray(i)%p,amg_nshg(i),fname) 281*59599516SKenneth E. Jansen enddo 282*59599516SKenneth E. Jansen 283*59599516SKenneth E. Jansen do i=1,ramg_levelx 284*59599516SKenneth E. Jansen call ramg_commOut(tarray(i)%p,i,ilwork,1,iper,iBC,BC) 285*59599516SKenneth E. Jansen write(fname,'((A8)(I1))')'tarray_b',i 286*59599516SKenneth E. Jansen call ramg_dump(tarray(i)%p,amg_nshg(i),fname) 287*59599516SKenneth E. Jansen enddo 288*59599516SKenneth E. Jansen 289*59599516SKenneth E. Jansen! call commOut(tarray(1)%p,ilwork,1,iper,iBC,BC) 290*59599516SKenneth E. Jansen 291*59599516SKenneth E. Jansen! do i=1,ramg_levelx 292*59599516SKenneth E. Jansen! write(fname,'((A8)(I1))')'tarray_i',i 293*59599516SKenneth E. Jansen! call ramg_dump_rn_map(tarray(i)%p,amg_nshg(i),1,fname) 294*59599516SKenneth E. Jansen! enddo 295*59599516SKenneth E. Jansen 296*59599516SKenneth E. Jansen 297*59599516SKenneth E. Jansen do i=1,ramg_levelx 298*59599516SKenneth E. Jansen deallocate(tarray(i)%p) 299*59599516SKenneth E. Jansen enddo 300*59599516SKenneth E. Jansen 301*59599516SKenneth E. Jansen end subroutine ! ramg_check_paracomm 302*59599516SKenneth E. Jansen 303*59599516SKenneth E. Jansen!************************************************** 304*59599516SKenneth E. Jansen! ramg_zeroOut: zero out slave values 305*59599516SKenneth E. Jansen!************************************************** 306*59599516SKenneth E. Jansen subroutine ramg_zeroOut(u,ilwork,BC,iBC,iper) 307*59599516SKenneth E. Jansen include "common.h" 308*59599516SKenneth E. Jansen include "auxmpi.h" 309*59599516SKenneth E. Jansen include "mpif.h" 310*59599516SKenneth E. Jansen 311*59599516SKenneth E. Jansen real(kind=8),dimension(nshg),intent(inout) :: u 312*59599516SKenneth E. Jansen integer,intent(in),dimension(nlwork) :: ilwork 313*59599516SKenneth E. Jansen integer,intent(in),dimension(nshg) :: iBC,iper 314*59599516SKenneth E. Jansen real(kind=8),intent(in),dimension(nshg,ndofBC) :: BC 315*59599516SKenneth E. Jansen 316*59599516SKenneth E. Jansen integer i,j,k,p 317*59599516SKenneth E. Jansen integer :: itag,iacc,iother,numseg,isgbeg,itkbeg 318*59599516SKenneth E. Jansen integer :: numtask,lenseg 319*59599516SKenneth E. Jansen 320*59599516SKenneth E. Jansen if (numpe.lt.2) return 321*59599516SKenneth E. Jansen !call commOut(u,ilwork,1,iper,iBC,BC) 322*59599516SKenneth E. Jansen numtask = ilwork(1) 323*59599516SKenneth E. Jansen itkbeg = 1 324*59599516SKenneth E. Jansen do i=1,numtask 325*59599516SKenneth E. Jansen iacc = ilwork(itkbeg+2) 326*59599516SKenneth E. Jansen numseg = ilwork(itkbeg+4) 327*59599516SKenneth E. Jansen if (iacc.eq.0) then 328*59599516SKenneth E. Jansen do j=1,numseg 329*59599516SKenneth E. Jansen isgbeg = ilwork(itkbeg+3+j*2) 330*59599516SKenneth E. Jansen lenseg = ilwork(itkbeg+4+j*2) 331*59599516SKenneth E. Jansen isgend = isgbeg + lenseg -1 332*59599516SKenneth E. Jansen u(isgbeg:isgend) = 0 333*59599516SKenneth E. Jansen enddo 334*59599516SKenneth E. Jansen endif 335*59599516SKenneth E. Jansen itkbeg = itkbeg+4+2*numseg 336*59599516SKenneth E. Jansen enddo 337*59599516SKenneth E. Jansen 338*59599516SKenneth E. Jansen end subroutine ! ramg_zeroOut 339*59599516SKenneth E. Jansen 340*59599516SKenneth E. Jansen!************************************************ 341*59599516SKenneth E. Jansen! ramg_freeBC: set "fine" on boundary nodes 342*59599516SKenneth E. Jansen!************************************************ 343*59599516SKenneth E. Jansen subroutine ramg_freeBC(amg_F,ilwork,BC,iBC,iper) 344*59599516SKenneth E. Jansen use ramg_data 345*59599516SKenneth E. Jansen include "common.h" 346*59599516SKenneth E. Jansen include "auxmpi.h" 347*59599516SKenneth E. Jansen include "mpif.h" 348*59599516SKenneth E. Jansen integer,intent(inout),dimension(nshg) :: amg_F 349*59599516SKenneth E. Jansen integer,intent(in),dimension(nlwork) :: ilwork 350*59599516SKenneth E. Jansen integer,intent(in),dimension(nshg) :: iBC,iper 351*59599516SKenneth E. Jansen real(kind=8),intent(in),dimension(nshg,ndofBC) :: BC 352*59599516SKenneth E. Jansen integer :: itag,iacc,iother,numseg,isgbeg,itkbeg,numtask 353*59599516SKenneth E. Jansen integer :: i,p 354*59599516SKenneth E. Jansen integer,dimension(nshg,2) :: tmpout 355*59599516SKenneth E. Jansen 356*59599516SKenneth E. Jansen character :: filename*80 357*59599516SKenneth E. Jansen integer :: nentry,nshg,iglobal,ilocal,icf,iproc 358*59599516SKenneth E. Jansen 359*59599516SKenneth E. Jansen return 360*59599516SKenneth E. Jansen 361*59599516SKenneth E. Jansen if (numpe.ge.2) then 362*59599516SKenneth E. Jansen 363*59599516SKenneth E. Jansen numtask = ilwork(1) 364*59599516SKenneth E. Jansen itkbeg = 1 365*59599516SKenneth E. Jansen do i=1,numtask 366*59599516SKenneth E. Jansen itag = ilwork(itkbeg+1) 367*59599516SKenneth E. Jansen iacc = ilwork(itkbeg+2) 368*59599516SKenneth E. Jansen iother = ilwork(itkbeg+3) 369*59599516SKenneth E. Jansen numseg = ilwork(itkbeg+4) 370*59599516SKenneth E. Jansen isgbeg = ilwork(itkbeg+5) 371*59599516SKenneth E. Jansen do j=1,numseg 372*59599516SKenneth E. Jansen p = ilwork(itkbeg+3+j*2) 373*59599516SKenneth E. Jansen amg_F(p) = 2 374*59599516SKenneth E. Jansen enddo 375*59599516SKenneth E. Jansen enddo 376*59599516SKenneth E. Jansen 377*59599516SKenneth E. Jansen tmpout(:,1) = ncorp_map 378*59599516SKenneth E. Jansen tmpout(:,2) = amg_F 379*59599516SKenneth E. Jansen 380*59599516SKenneth E. Jansen call ramg_dump_i(tmpout,nshg,2,'CFsplit ') 381*59599516SKenneth E. Jansen else ! DEBUGGING PART, READ 2-PROC CASE INTO 1-proc 382*59599516SKenneth E. Jansen filename = "cfs.dat" 383*59599516SKenneth E. Jansen filename = trim(filename) 384*59599516SKenneth E. Jansen open(unit=999,file=filename,status='unknown') 385*59599516SKenneth E. Jansen read(999,*)nentry 386*59599516SKenneth E. Jansen do i=1,nentry 387*59599516SKenneth E. Jansen read(999,*)iglobal,ilocal,icf,iproc 388*59599516SKenneth E. Jansen !amg_F(iglobal) = icf 389*59599516SKenneth E. Jansen enddo 390*59599516SKenneth E. Jansen close(999) 391*59599516SKenneth E. Jansen end if 392*59599516SKenneth E. Jansen 393*59599516SKenneth E. Jansen end subroutine ! ramg_freeBC 394*59599516SKenneth E. Jansen 395*59599516SKenneth E. Jansen 396*59599516SKenneth E. Jansen!********************************************** 397*59599516SKenneth E. Jansen! ramg_read_map: 398*59599516SKenneth E. Jansen! read in ncorp array from local to global 399*59599516SKenneth E. Jansen! mapping 400*59599516SKenneth E. Jansen!********************************************** 401*59599516SKenneth E. Jansen subroutine ramg_prep_reduce_map 402*59599516SKenneth E. Jansen use ramg_data 403*59599516SKenneth E. Jansen include "common.h" 404*59599516SKenneth E. Jansen include "mpif.h" 405*59599516SKenneth E. Jansen include "auxmpi.h" 406*59599516SKenneth E. Jansen 407*59599516SKenneth E. Jansen character*5 cname 408*59599516SKenneth E. Jansen character*255 fname1 409*59599516SKenneth E. Jansen integer igeom,map_nshg,i 410*59599516SKenneth E. Jansen 411*59599516SKenneth E. Jansen allocate(ncorp_map(nshg)) 412*59599516SKenneth E. Jansen if (numpe.lt.2) then! construct dummy-array 413*59599516SKenneth E. Jansen do i=1,nshg 414*59599516SKenneth E. Jansen ncorp_map(i) = i 415*59599516SKenneth E. Jansen enddo 416*59599516SKenneth E. Jansen else 417*59599516SKenneth E. Jansen fname1='geombc.dat' 418*59599516SKenneth E. Jansen fname1=trim(fname1)//cname(myrank+1) 419*59599516SKenneth E. Jansen 420*59599516SKenneth E. Jansen call openfile(fname1,"read",igeom) 421*59599516SKenneth E. Jansen !write(*,*)'mcheck:',myrank,fname1,igeom 422*59599516SKenneth E. Jansen 423*59599516SKenneth E. Jansen fname1="mode number map from partition to global" 424*59599516SKenneth E. Jansen ione=1 425*59599516SKenneth E. Jansen call readheader(igeom,fname1,map_nshg,ione,"integer",iotype) 426*59599516SKenneth E. Jansen 427*59599516SKenneth E. Jansen call readdatablock(igeom,fname1,ncorp_map,map_nshg, 428*59599516SKenneth E. Jansen & "integer",iotype) 429*59599516SKenneth E. Jansen 430*59599516SKenneth E. Jansen call closefile(igeom,"read") 431*59599516SKenneth E. Jansen 432*59599516SKenneth E. Jansen endif 433*59599516SKenneth E. Jansen 434*59599516SKenneth E. Jansen end subroutine ! ramg_read_map 435*59599516SKenneth E. Jansen 436*59599516SKenneth E. Jansen!*********************************************** 437*59599516SKenneth E. Jansen! ramg_check_diag 438*59599516SKenneth E. Jansen!*********************************************** 439*59599516SKenneth E. Jansen subroutine ramg_check_diag(colm,rowp,lhs,nshg,nnz_tot) 440*59599516SKenneth E. Jansen implicit none 441*59599516SKenneth E. Jansen integer,intent(in) :: nshg,nnz_tot 442*59599516SKenneth E. Jansen integer,intent(in),dimension(nshg+1) :: colm 443*59599516SKenneth E. Jansen integer,intent(in),dimension(nnz_tot) :: rowp 444*59599516SKenneth E. Jansen real(kind=8),intent(in),dimension(nnz_tot) :: lhs 445*59599516SKenneth E. Jansen 446*59599516SKenneth E. Jansen integer :: i,j,p 447*59599516SKenneth E. Jansen real(kind=8) :: diagrow 448*59599516SKenneth E. Jansen logical :: diagokay 449*59599516SKenneth E. Jansen 450*59599516SKenneth E. Jansen diagokay = .true. 451*59599516SKenneth E. Jansen 452*59599516SKenneth E. Jansen do i=1,nshg 453*59599516SKenneth E. Jansen p = colm(i) 454*59599516SKenneth E. Jansen if (rowp(p).ne.i) then 455*59599516SKenneth E. Jansen write(*,*)'matrix first row entry is not diagonal',i 456*59599516SKenneth E. Jansen diagokay = .false. 457*59599516SKenneth E. Jansen end if 458*59599516SKenneth E. Jansen diagrow = lhs(p) 459*59599516SKenneth E. Jansen if (diagrow.lt.0) then 460*59599516SKenneth E. Jansen write(*,*)'matrix diagonal < 0 at',i,diagrow 461*59599516SKenneth E. Jansen diagokay = .false. 462*59599516SKenneth E. Jansen end if 463*59599516SKenneth E. Jansen do j = colm(i)+1,colm(i+1)-1 464*59599516SKenneth E. Jansen p = rowp(j) 465*59599516SKenneth E. Jansen if (lhs(p).gt.diagrow) then 466*59599516SKenneth E. Jansen write(*,*)'matrix not diagonal dominant at row',i 467*59599516SKenneth E. Jansen diagokay = .false. 468*59599516SKenneth E. Jansen write(*,*)'diag:',diagrow,p,lhs(p) 469*59599516SKenneth E. Jansen exit 470*59599516SKenneth E. Jansen end if 471*59599516SKenneth E. Jansen end do 472*59599516SKenneth E. Jansen enddo 473*59599516SKenneth E. Jansen 474*59599516SKenneth E. Jansen if (diagokay) then 475*59599516SKenneth E. Jansen write(*,*)'matrix check diagonal dominance okay' 476*59599516SKenneth E. Jansen end if 477*59599516SKenneth E. Jansen 478*59599516SKenneth E. Jansen end subroutine 479*59599516SKenneth E. Jansen 480*59599516SKenneth E. Jansen subroutine ramg_dot_p(level,v,u,redun,norm) 481*59599516SKenneth E. Jansen use ramg_data 482*59599516SKenneth E. Jansen include "common.h" 483*59599516SKenneth E. Jansen include "mpif.h" 484*59599516SKenneth E. Jansen include "auxmpi.h" 485*59599516SKenneth E. Jansen 486*59599516SKenneth E. Jansen integer :: redun,level 487*59599516SKenneth E. Jansen real(kind=8),intent(in),dimension(amg_nshg(level),redun) ::v,u 488*59599516SKenneth E. Jansen real(kind=8),intent(inout) :: norm 489*59599516SKenneth E. Jansen integer :: i,k 490*59599516SKenneth E. Jansen real(kind=8) :: normt 491*59599516SKenneth E. Jansen normt = 0 492*59599516SKenneth E. Jansen do i=1,amg_nshg(level) 493*59599516SKenneth E. Jansen do k=1,redun 494*59599516SKenneth E. Jansen normt = normt + v(i,k)*u(i,k) 495*59599516SKenneth E. Jansen enddo 496*59599516SKenneth E. Jansen enddo 497*59599516SKenneth E. Jansen if (numpe.gt.1) then 498*59599516SKenneth E. Jansen call MPI_AllReduce(normt,norm,1,MPI_DOUBLE_PRECISION,MPI_SUM, 499*59599516SKenneth E. Jansen & MPI_COMM_WORLD,ierr) 500*59599516SKenneth E. Jansen else 501*59599516SKenneth E. Jansen norm=normt 502*59599516SKenneth E. Jansen endif 503*59599516SKenneth E. Jansen end subroutine !ramg_dot_p 504*59599516SKenneth E. Jansen 505*59599516SKenneth E. Jansen!************************************************************ 506*59599516SKenneth E. Jansen! ramg_L2_norm 507*59599516SKenneth E. Jansen! calculate norm = | r | 508*59599516SKenneth E. Jansen!************************************************************ 509*59599516SKenneth E. Jansen subroutine ramg_L2_norm(nshg,v,norm) 510*59599516SKenneth E. Jansen implicit none 511*59599516SKenneth E. Jansen integer,intent(in) :: nshg 512*59599516SKenneth E. Jansen real(kind=8),intent(in),dimension(nshg) :: v 513*59599516SKenneth E. Jansen real(kind=8),intent(inout) :: norm 514*59599516SKenneth E. Jansen integer :: i 515*59599516SKenneth E. Jansen norm = 0 516*59599516SKenneth E. Jansen do i=1,nshg 517*59599516SKenneth E. Jansen norm = norm + v(i)*v(i) 518*59599516SKenneth E. Jansen enddo 519*59599516SKenneth E. Jansen norm = sqrt(norm) 520*59599516SKenneth E. Jansen end subroutine !ramg_L2_norm 521*59599516SKenneth E. Jansen 522*59599516SKenneth E. Jansen subroutine ramg_L2_norm_p(level,v,vflow,norm) 523*59599516SKenneth E. Jansen use ramg_data 524*59599516SKenneth E. Jansen include "common.h" 525*59599516SKenneth E. Jansen include "mpif.h" 526*59599516SKenneth E. Jansen include "auxmpi.h" 527*59599516SKenneth E. Jansen 528*59599516SKenneth E. Jansen integer,intent(in) :: vflow,level 529*59599516SKenneth E. Jansen real(kind=8),intent(in),dimension(amg_nshg(level),vflow) :: v 530*59599516SKenneth E. Jansen real(kind=8),intent(inout) :: norm 531*59599516SKenneth E. Jansen integer :: i,k 532*59599516SKenneth E. Jansen real(kind=8) :: normt 533*59599516SKenneth E. Jansen normt = 0 534*59599516SKenneth E. Jansen do i=1,amg_nshg(level) 535*59599516SKenneth E. Jansen do k=1,vflow 536*59599516SKenneth E. Jansen normt = normt + v(i,k)*v(i,k) 537*59599516SKenneth E. Jansen enddo 538*59599516SKenneth E. Jansen enddo 539*59599516SKenneth E. Jansen if (numpe.gt.1) then 540*59599516SKenneth E. Jansen call MPI_AllReduce(normt,norm,1,MPI_DOUBLE_PRECISION,MPI_SUM, 541*59599516SKenneth E. Jansen & MPI_COMM_WORLD,ierr) 542*59599516SKenneth E. Jansen else 543*59599516SKenneth E. Jansen norm = normt 544*59599516SKenneth E. Jansen endif 545*59599516SKenneth E. Jansen norm = sqrt(norm) 546*59599516SKenneth E. Jansen end subroutine !ramg_L2_norm_p 547*59599516SKenneth E. Jansen 548*59599516SKenneth E. Jansen!************************************************************ 549*59599516SKenneth E. Jansen! ramg_allocate & deallocate 550*59599516SKenneth E. Jansen! (de)allocate memory for level l, lhs matrix, rhs vector 551*59599516SKenneth E. Jansen!************************************************************ 552*59599516SKenneth E. Jansen subroutine ramg_allocate( 553*59599516SKenneth E. Jansen & level,lnshg,lnnz_tot,n_sol) 554*59599516SKenneth E. Jansen use ramg_data 555*59599516SKenneth E. Jansen implicit none 556*59599516SKenneth E. Jansen 557*59599516SKenneth E. Jansen integer,intent(in) :: level,lnshg,lnnz_tot 558*59599516SKenneth E. Jansen integer,intent(in) :: n_sol 559*59599516SKenneth E. Jansen integer :: mem_err,mem_err_s 560*59599516SKenneth E. Jansen mem_err_s = 0 561*59599516SKenneth E. Jansen if (lnnz_tot.ne.0) then ! zero means manual alloc later 562*59599516SKenneth E. Jansen amg_nnz(level) = lnnz_tot 563*59599516SKenneth E. Jansen allocate(amg_A_lhs(level)%p(amg_nnz(level),n_sol), 564*59599516SKenneth E. Jansen & stat=mem_err) 565*59599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 566*59599516SKenneth E. Jansen allocate(amg_A_rowp(level)%p(amg_nnz(level)), 567*59599516SKenneth E. Jansen & stat=mem_err) 568*59599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 569*59599516SKenneth E. Jansen endif 570*59599516SKenneth E. Jansen if (lnshg.ne.0) then 571*59599516SKenneth E. Jansen amg_nshg(level) = lnshg 572*59599516SKenneth E. Jansen allocate(amg_A_colm(level)%p(amg_nshg(level)+1), 573*59599516SKenneth E. Jansen & stat=mem_err) 574*59599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 575*59599516SKenneth E. Jansen allocate(amg_A_rhs(level)%p(amg_nshg(level)), 576*59599516SKenneth E. Jansen & stat=mem_err) 577*59599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 578*59599516SKenneth E. Jansen allocate(amg_ppeDiag(level)%p(amg_nshg(level)), 579*59599516SKenneth E. Jansen & stat=mem_err) 580*59599516SKenneth E. Jansen endif 581*59599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 582*59599516SKenneth E. Jansen if (mem_err_s .ne. 0 ) then 583*59599516SKenneth E. Jansen write(6,7001)level 584*59599516SKenneth E. Jansen end if 585*59599516SKenneth E. Jansen7001 format(/' **** ramg: Allocation error at level',i5) 586*59599516SKenneth E. Jansen ! zero out 587*59599516SKenneth E. Jansen if (lnnz_tot.ne.0) then 588*59599516SKenneth E. Jansen amg_A_lhs(level)%p(:,:) = 0 589*59599516SKenneth E. Jansen amg_A_rowp(level)%p(:) = 0 590*59599516SKenneth E. Jansen endif 591*59599516SKenneth E. Jansen if (lnshg.ne.0) then 592*59599516SKenneth E. Jansen amg_A_colm(level)%p(:) = 0 593*59599516SKenneth E. Jansen amg_A_rhs(level)%p(:) = 0 594*59599516SKenneth E. Jansen endif 595*59599516SKenneth E. Jansen return 596*59599516SKenneth E. Jansen 597*59599516SKenneth E. Jansen end subroutine ! ramg_allocate 598*59599516SKenneth E. Jansen 599*59599516SKenneth E. Jansen subroutine ramg_deallocate(level) 600*59599516SKenneth E. Jansen 601*59599516SKenneth E. Jansen use ramg_data 602*59599516SKenneth E. Jansen include "common.h" 603*59599516SKenneth E. Jansen 604*59599516SKenneth E. Jansen integer,intent(inout) :: level 605*59599516SKenneth E. Jansen integer :: mem_err,mem_err_s,i 606*59599516SKenneth E. Jansen 607*59599516SKenneth E. Jansen 608*59599516SKenneth E. Jansen if (level.eq.1) then 609*59599516SKenneth E. Jansen 610*59599516SKenneth E. Jansen if (maxnev.gt.0) then 611*59599516SKenneth E. Jansen deallocate(ramg_ggb_ev) 612*59599516SKenneth E. Jansen deallocate(ramg_ggb_eA) 613*59599516SKenneth E. Jansen deallocate(cmtxA) 614*59599516SKenneth E. Jansen deallocate(cindx) 615*59599516SKenneth E. Jansen endif 616*59599516SKenneth E. Jansen 617*59599516SKenneth E. Jansen 618*59599516SKenneth E. Jansen if (iamg_reduce.gt.1) then 619*59599516SKenneth E. Jansen deallocate(reducemap) 620*59599516SKenneth E. Jansen deallocate(rmap1d) 621*59599516SKenneth E. Jansen endif 622*59599516SKenneth E. Jansen 623*59599516SKenneth E. Jansen end if 624*59599516SKenneth E. Jansen 625*59599516SKenneth E. Jansen 626*59599516SKenneth E. Jansen level = abs(level) 627*59599516SKenneth E. Jansen 628*59599516SKenneth E. Jansen mem_err_s = 0 629*59599516SKenneth E. Jansen if (associated(amg_A_lhs(level)%p)) then 630*59599516SKenneth E. Jansen deallocate(amg_A_lhs(level)%p, 631*59599516SKenneth E. Jansen & stat=mem_err) 632*59599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 633*59599516SKenneth E. Jansen endif 634*59599516SKenneth E. Jansen if (associated(amg_A_rowp(level)%p)) then 635*59599516SKenneth E. Jansen deallocate(amg_A_rowp(level)%p, 636*59599516SKenneth E. Jansen & stat=mem_err) 637*59599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 638*59599516SKenneth E. Jansen endif 639*59599516SKenneth E. Jansen if (associated(amg_A_colm(level)%p)) then 640*59599516SKenneth E. Jansen deallocate(amg_A_colm(level)%p, 641*59599516SKenneth E. Jansen & stat=mem_err) 642*59599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 643*59599516SKenneth E. Jansen endif 644*59599516SKenneth E. Jansen if (associated(amg_ppeDiag(level)%p)) then 645*59599516SKenneth E. Jansen deallocate(amg_ppeDiag(level)%p, 646*59599516SKenneth E. Jansen & stat=mem_err) 647*59599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 648*59599516SKenneth E. Jansen endif 649*59599516SKenneth E. Jansen if (associated(amg_A_rhs(level)%p)) then 650*59599516SKenneth E. Jansen deallocate(amg_A_rhs(level)%p, 651*59599516SKenneth E. Jansen & stat=mem_err) 652*59599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 653*59599516SKenneth E. Jansen endif 654*59599516SKenneth E. Jansen if (associated(amg_ilwork(level)%p)) then 655*59599516SKenneth E. Jansen deallocate(amg_ilwork(level)%p, 656*59599516SKenneth E. Jansen & stat=mem_err) 657*59599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 658*59599516SKenneth E. Jansen write(*,*)'mcheck deallocate ilwork,',level,myrank 659*59599516SKenneth E. Jansen endif 660*59599516SKenneth E. Jansen 661*59599516SKenneth E. Jansen if (associated(amg_paramap(level)%p)) then 662*59599516SKenneth E. Jansen deallocate(amg_paramap(level)%p, 663*59599516SKenneth E. Jansen & stat=mem_err) 664*59599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 665*59599516SKenneth E. Jansen endif 666*59599516SKenneth E. Jansen if (associated(amg_paraext(level)%p)) then 667*59599516SKenneth E. Jansen deallocate(amg_paraext(level)%p, 668*59599516SKenneth E. Jansen & stat=mem_err) 669*59599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 670*59599516SKenneth E. Jansen endif 671*59599516SKenneth E. Jansen 672*59599516SKenneth E. Jansen if (mem_err_s .ne. 0 ) then 673*59599516SKenneth E. Jansen write(6,7002)level 674*59599516SKenneth E. Jansen end if 675*59599516SKenneth E. Jansen 676*59599516SKenneth E. Jansen if (associated(I_fc_colm(level)%p)) then 677*59599516SKenneth E. Jansen deallocate(CF_map(level)%p,stat=mem_err) 678*59599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 679*59599516SKenneth E. Jansen deallocate(CF_revmap(level)%p,stat=mem_err) 680*59599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 681*59599516SKenneth E. Jansen deallocate(I_cf_colm(level)%p,stat=mem_err) 682*59599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 683*59599516SKenneth E. Jansen deallocate(I_cf_rowp(level)%p,stat=mem_err) 684*59599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 685*59599516SKenneth E. Jansen deallocate(I_cf(level)%p,stat=mem_err) 686*59599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 687*59599516SKenneth E. Jansen deallocate(I_fc_colm(level)%p,stat=mem_err) 688*59599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 689*59599516SKenneth E. Jansen deallocate(I_fc_rowp(level)%p,stat=mem_err) 690*59599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 691*59599516SKenneth E. Jansen deallocate(I_fc(level)%p,stat=mem_err) 692*59599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 693*59599516SKenneth E. Jansen end if 694*59599516SKenneth E. Jansen amg_nnz(level) = 0 695*59599516SKenneth E. Jansen amg_nshg(level) = 0 696*59599516SKenneth E. Jansen7002 format(/' **** ramg: Deallocation error at level',i5) 697*59599516SKenneth E. Jansen 698*59599516SKenneth E. Jansen return 699*59599516SKenneth E. Jansen 700*59599516SKenneth E. Jansen end subroutine ! ramg_deallocate 701*59599516SKenneth E. Jansen 702*59599516SKenneth E. Jansen subroutine ramg_readin_i(iarray,rn1,rfname) 703*59599516SKenneth E. Jansen include "common.h" 704*59599516SKenneth E. Jansen include "mpif.h" 705*59599516SKenneth E. Jansen include "auxmpi.h" 706*59599516SKenneth E. Jansen integer rn1 707*59599516SKenneth E. Jansen integer,dimension(rn1) :: iarray 708*59599516SKenneth E. Jansen character*10 rfname 709*59599516SKenneth E. Jansen character*5 cname 710*59599516SKenneth E. Jansen 711*59599516SKenneth E. Jansen character*20 mfname 712*59599516SKenneth E. Jansen 713*59599516SKenneth E. Jansen integer i,t 714*59599516SKenneth E. Jansen mfname = trim(rfname)//'.dat'//cname(myrank+1) 715*59599516SKenneth E. Jansen 716*59599516SKenneth E. Jansen write(*,*)'RAMG READ: ',mfname 717*59599516SKenneth E. Jansen open(264,file=trim(mfname),status='unknown') 718*59599516SKenneth E. Jansen do i=1,rn1 719*59599516SKenneth E. Jansen read(264,*)t,iarray(i) 720*59599516SKenneth E. Jansen enddo 721*59599516SKenneth E. Jansen close(264) 722*59599516SKenneth E. Jansen end subroutine ! ramg_readin_i 723*59599516SKenneth E. Jansen 724*59599516SKenneth E. Jansen 725*59599516SKenneth E. Jansen subroutine ramg_dump(rarray,rn1,rfname) 726*59599516SKenneth E. Jansen include "common.h" 727*59599516SKenneth E. Jansen include "mpif.h" 728*59599516SKenneth E. Jansen include "auxmpi.h" 729*59599516SKenneth E. Jansen integer rn1 730*59599516SKenneth E. Jansen real(kind=8),dimension(rn1) :: rarray 731*59599516SKenneth E. Jansen character*10 rfname 732*59599516SKenneth E. Jansen character*5 cname 733*59599516SKenneth E. Jansen 734*59599516SKenneth E. Jansen character*20 mfname 735*59599516SKenneth E. Jansen 736*59599516SKenneth E. Jansen integer i 737*59599516SKenneth E. Jansen mfname = trim(rfname)//'.dat'//cname(myrank+1) 738*59599516SKenneth E. Jansen 739*59599516SKenneth E. Jansen write(*,*)'RAMG DUMP: ',mfname 740*59599516SKenneth E. Jansen open(264,file=trim(mfname),status='unknown') 741*59599516SKenneth E. Jansen do i=1,rn1 742*59599516SKenneth E. Jansen !write(264,'((I10)(A)(D10.3))')i,' ',rarray(i) 743*59599516SKenneth E. Jansen write(264,*)i,rarray(i) 744*59599516SKenneth E. Jansen enddo 745*59599516SKenneth E. Jansen close(264) 746*59599516SKenneth E. Jansen 747*59599516SKenneth E. Jansen end subroutine ! ramg_dump 748*59599516SKenneth E. Jansen 749*59599516SKenneth E. Jansen subroutine ramg_dump_ic(rarray,rn1,rn2,rfname) 750*59599516SKenneth E. Jansen include "common.h" 751*59599516SKenneth E. Jansen include "mpif.h" 752*59599516SKenneth E. Jansen include "auxmpi.h" 753*59599516SKenneth E. Jansen integer rn1,rn2 754*59599516SKenneth E. Jansen integer,dimension(rn1,rn2) :: rarray 755*59599516SKenneth E. Jansen character*10 rfname 756*59599516SKenneth E. Jansen character*5 cname 757*59599516SKenneth E. Jansen 758*59599516SKenneth E. Jansen character*20 mfname 759*59599516SKenneth E. Jansen 760*59599516SKenneth E. Jansen integer i 761*59599516SKenneth E. Jansen mfname = trim(rfname)//'.dat'//cname(myrank+1) 762*59599516SKenneth E. Jansen 763*59599516SKenneth E. Jansen write(*,*)'RAMG DUMP: ',mfname 764*59599516SKenneth E. Jansen open(264,file=trim(mfname),status='unknown') 765*59599516SKenneth E. Jansen write(264,*)rn2 766*59599516SKenneth E. Jansen do j=1,rn2 767*59599516SKenneth E. Jansen write(264,*)j,(rarray(i,j),i=1,rn1) 768*59599516SKenneth E. Jansen enddo 769*59599516SKenneth E. Jansen close(264) 770*59599516SKenneth E. Jansen end subroutine 771*59599516SKenneth E. Jansen 772*59599516SKenneth E. Jansen subroutine ramg_dump_i(rarray,rn1,rn2,rfname) 773*59599516SKenneth E. Jansen include "common.h" 774*59599516SKenneth E. Jansen include "mpif.h" 775*59599516SKenneth E. Jansen include "auxmpi.h" 776*59599516SKenneth E. Jansen integer rn1,rn2 777*59599516SKenneth E. Jansen integer,dimension(rn1,rn2) :: rarray 778*59599516SKenneth E. Jansen character*10 rfname 779*59599516SKenneth E. Jansen character*5 cname 780*59599516SKenneth E. Jansen 781*59599516SKenneth E. Jansen character*20 mfname 782*59599516SKenneth E. Jansen 783*59599516SKenneth E. Jansen integer i 784*59599516SKenneth E. Jansen mfname = trim(rfname)//'.dat'//cname(myrank+1) 785*59599516SKenneth E. Jansen 786*59599516SKenneth E. Jansen write(*,*)'RAMG DUMP: ',mfname 787*59599516SKenneth E. Jansen open(264,file=trim(mfname),status='unknown') 788*59599516SKenneth E. Jansen write(264,*)rn1 789*59599516SKenneth E. Jansen do i=1,rn1 790*59599516SKenneth E. Jansen write(264,*)i,(rarray(i,j),j=1,rn2) 791*59599516SKenneth E. Jansen enddo 792*59599516SKenneth E. Jansen close(264) 793*59599516SKenneth E. Jansen 794*59599516SKenneth E. Jansen end subroutine ! ramg_dump_i 795*59599516SKenneth E. Jansen 796*59599516SKenneth E. Jansen subroutine ramg_dump_ir(iarray,rarray,rn1,rn2,rfname) 797*59599516SKenneth E. Jansen include "common.h" 798*59599516SKenneth E. Jansen include "mpif.h" 799*59599516SKenneth E. Jansen include "auxmpi.h" 800*59599516SKenneth E. Jansen integer rn1,rn2 801*59599516SKenneth E. Jansen integer,dimension(rn1) :: iarray 802*59599516SKenneth E. Jansen real(kind=8),dimension(rn1,rn2) :: rarray 803*59599516SKenneth E. Jansen character*10 rfname 804*59599516SKenneth E. Jansen character*5 cname 805*59599516SKenneth E. Jansen 806*59599516SKenneth E. Jansen character*20 mfname 807*59599516SKenneth E. Jansen 808*59599516SKenneth E. Jansen character*20 mformat 809*59599516SKenneth E. Jansen 810*59599516SKenneth E. Jansen integer i 811*59599516SKenneth E. Jansen mfname = trim(rfname)//'.dat'//cname(myrank+1) 812*59599516SKenneth E. Jansen 813*59599516SKenneth E. Jansen write(mformat,'((A6)(I1)(A7))')'((2I)(',rn2,'E14.3))' 814*59599516SKenneth E. Jansen mformat = trim(mformat) 815*59599516SKenneth E. Jansen write(*,*)'RAMG DUMP: ',mfname 816*59599516SKenneth E. Jansen open(264,file=trim(mfname),status='unknown') 817*59599516SKenneth E. Jansen do i=1,rn1 818*59599516SKenneth E. Jansen write(264,mformat) 819*59599516SKenneth E. Jansen & i,iarray(i),(rarray(i,j),j=1,rn2) 820*59599516SKenneth E. Jansen enddo 821*59599516SKenneth E. Jansen close(264) 822*59599516SKenneth E. Jansen 823*59599516SKenneth E. Jansen end subroutine ! ramg_dump_ir 824*59599516SKenneth E. Jansen 825*59599516SKenneth E. Jansen subroutine ramg_dump_rn_map(rarray,rn1,rn2,rfname) 826*59599516SKenneth E. Jansen use ramg_data 827*59599516SKenneth E. Jansen include "common.h" 828*59599516SKenneth E. Jansen include "mpif.h" 829*59599516SKenneth E. Jansen include "auxmpi.h" 830*59599516SKenneth E. Jansen integer rn1,rn2 831*59599516SKenneth E. Jansen real(kind=8),dimension(rn1,rn2) :: rarray 832*59599516SKenneth E. Jansen character*10 rfname 833*59599516SKenneth E. Jansen character*5 cname 834*59599516SKenneth E. Jansen 835*59599516SKenneth E. Jansen character*20 mfname 836*59599516SKenneth E. Jansen character*20 mformat 837*59599516SKenneth E. Jansen 838*59599516SKenneth E. Jansen integer i,j,ii 839*59599516SKenneth E. Jansen mfname = trim(rfname)//'.dat'//cname(myrank+1) 840*59599516SKenneth E. Jansen 841*59599516SKenneth E. Jansen write(*,*)'RAMG DUMP: ',mfname 842*59599516SKenneth E. Jansen open(264,file=trim(mfname),status='unknown') 843*59599516SKenneth E. Jansen write(mformat,'((A6)(I1)(A7))')'((1I)(',rn2,'E14.4))' 844*59599516SKenneth E. Jansen mformat=trim(mformat) 845*59599516SKenneth E. Jansen do i=1,rn1 846*59599516SKenneth E. Jansen if (numpe.gt.1) then 847*59599516SKenneth E. Jansen ii = ncorp_map(i) 848*59599516SKenneth E. Jansen else 849*59599516SKenneth E. Jansen ii = i 850*59599516SKenneth E. Jansen endif 851*59599516SKenneth E. Jansen write(264,mformat)ii,(rarray(i,j),j=1,rn2) 852*59599516SKenneth E. Jansen enddo 853*59599516SKenneth E. Jansen close(264) 854*59599516SKenneth E. Jansen end subroutine ! ramg_dump_rn_map 855*59599516SKenneth E. Jansen 856*59599516SKenneth E. Jansen subroutine ramg_dump_rn(rarray,rn1,rn2,rfname) 857*59599516SKenneth E. Jansen include "common.h" 858*59599516SKenneth E. Jansen include "mpif.h" 859*59599516SKenneth E. Jansen include "auxmpi.h" 860*59599516SKenneth E. Jansen integer rn1,rn2 861*59599516SKenneth E. Jansen real(kind=8),dimension(rn1,rn2) :: rarray 862*59599516SKenneth E. Jansen character*10 rfname 863*59599516SKenneth E. Jansen character*5 cname 864*59599516SKenneth E. Jansen 865*59599516SKenneth E. Jansen character*20 mfname 866*59599516SKenneth E. Jansen character*20 mformat 867*59599516SKenneth E. Jansen 868*59599516SKenneth E. Jansen integer i,j 869*59599516SKenneth E. Jansen mfname = trim(rfname)//'.dat'//cname(myrank+1) 870*59599516SKenneth E. Jansen 871*59599516SKenneth E. Jansen write(*,*)'RAMG DUMP: ',mfname 872*59599516SKenneth E. Jansen open(264,file=trim(mfname),status='unknown') 873*59599516SKenneth E. Jansen write(mformat,'((A6)(I1)(A7))')'((1I)(',rn2,'E14.4))' 874*59599516SKenneth E. Jansen mformat=trim(mformat) 875*59599516SKenneth E. Jansen do i=1,rn1 876*59599516SKenneth E. Jansen write(264,mformat)i,(rarray(i,j),j=1,rn2) 877*59599516SKenneth E. Jansen enddo 878*59599516SKenneth E. Jansen close(264) 879*59599516SKenneth E. Jansen 880*59599516SKenneth E. Jansen end subroutine ! ramg_dump_rn 881*59599516SKenneth E. Jansen 882*59599516SKenneth E. Jansen subroutine ramg_dump_matlab_A(acolm,arowp,alhs,an,annz,redun, 883*59599516SKenneth E. Jansen & fname) 884*59599516SKenneth E. Jansen 885*59599516SKenneth E. Jansen use ramg_data 886*59599516SKenneth E. Jansen include "common.h" 887*59599516SKenneth E. Jansen include "mpif.h" 888*59599516SKenneth E. Jansen include "auxmpi.h" 889*59599516SKenneth E. Jansen 890*59599516SKenneth E. Jansen integer :: an,annz,redun 891*59599516SKenneth E. Jansen integer,dimension(an+1) :: acolm 892*59599516SKenneth E. Jansen integer,dimension(annz) :: arowp 893*59599516SKenneth E. Jansen real(kind=8),dimension(redun,annz) :: alhs 894*59599516SKenneth E. Jansen character fname*10,mtxname*5 895*59599516SKenneth E. Jansen character cname*5 896*59599516SKenneth E. Jansen 897*59599516SKenneth E. Jansen character mfname*15,mAname*5 898*59599516SKenneth E. Jansen character mformat*20 899*59599516SKenneth E. Jansen 900*59599516SKenneth E. Jansen integer i,j,p,k 901*59599516SKenneth E. Jansen 902*59599516SKenneth E. Jansen mfname = trim(fname)//'.dat'//cname(myrank+1) 903*59599516SKenneth E. Jansen 904*59599516SKenneth E. Jansen write(*,*)'RAMG Dump to matlab ',mfname,myrank 905*59599516SKenneth E. Jansen open(264,file=trim(mfname),status='unknown') 906*59599516SKenneth E. Jansen !write(264,*)an 907*59599516SKenneth E. Jansen !write(264,*)annz 908*59599516SKenneth E. Jansen !write(264,*)'1' 909*59599516SKenneth E. Jansen write(mformat,'((A6)(I1)(A7))')'((2I)(',redun,'E14.4))' 910*59599516SKenneth E. Jansen do i=1,an 911*59599516SKenneth E. Jansen do p=acolm(i),acolm(i+1)-1 912*59599516SKenneth E. Jansen j = arowp(p) 913*59599516SKenneth E. Jansen !write(264,"((I6)(I7)(A)(E8.2))")i,j,' ',alhs(p) 914*59599516SKenneth E. Jansen! if ( (amg_paramap(1)%p(i).eq.amg_paramap(2)%p(j)).and. 915*59599516SKenneth E. Jansen! if (iabs(amg_paramap(1)%p(i)).ne.(myrank+1)) then 916*59599516SKenneth E. Jansen! & (amg_paramap(1)%p(i).ne.1)) then 917*59599516SKenneth E. Jansen write(264,mformat)i,j,(alhs(k,p),k=1,redun) 918*59599516SKenneth E. Jansen! endif 919*59599516SKenneth E. Jansen enddo 920*59599516SKenneth E. Jansen enddo 921*59599516SKenneth E. Jansen close(264) 922*59599516SKenneth E. Jansen end subroutine 923*59599516SKenneth E. Jansen 924*59599516SKenneth E. Jansen subroutine ramg_dump_matlab_map(acolm,arowp,alhs,an,annz,redun, 925*59599516SKenneth E. Jansen & fname) 926*59599516SKenneth E. Jansen use ramg_data 927*59599516SKenneth E. Jansen include "common.h" 928*59599516SKenneth E. Jansen include "mpif.h" 929*59599516SKenneth E. Jansen include "auxmpi.h" 930*59599516SKenneth E. Jansen 931*59599516SKenneth E. Jansen integer :: an,annz,redun 932*59599516SKenneth E. Jansen integer,dimension(an+1) :: acolm 933*59599516SKenneth E. Jansen integer,dimension(annz) :: arowp 934*59599516SKenneth E. Jansen real(kind=8),dimension(redun,annz) :: alhs 935*59599516SKenneth E. Jansen !integer,dimension(an) :: ipmap 936*59599516SKenneth E. Jansen character fname*10 937*59599516SKenneth E. Jansen 938*59599516SKenneth E. Jansen character mfname*20 939*59599516SKenneth E. Jansen character cname*5 940*59599516SKenneth E. Jansen character mformat*20 941*59599516SKenneth E. Jansen 942*59599516SKenneth E. Jansen integer i,j,p,k 943*59599516SKenneth E. Jansen integer ii,jj 944*59599516SKenneth E. Jansen 945*59599516SKenneth E. Jansen if (numpe.eq.1) then 946*59599516SKenneth E. Jansen call ramg_dump_matlab_A(acolm,arowp,alhs,an,annz,redun, 947*59599516SKenneth E. Jansen & fname) 948*59599516SKenneth E. Jansen return; 949*59599516SKenneth E. Jansen endif 950*59599516SKenneth E. Jansen 951*59599516SKenneth E. Jansen mfname = trim(fname)//'.dat'//cname(myrank+1) 952*59599516SKenneth E. Jansen 953*59599516SKenneth E. Jansen write(*,*)'RAMG Dump to matlab ',mfname,nshg,myrank 954*59599516SKenneth E. Jansen open(264,file=trim(mfname),status='unknown') 955*59599516SKenneth E. Jansen !write(264,*)an 956*59599516SKenneth E. Jansen !write(264,*)annz 957*59599516SKenneth E. Jansen !write(264,*)'1' 958*59599516SKenneth E. Jansen write(mformat,'((A6)(I1)(A7))')'((2I)(',redun,'E14.4))' 959*59599516SKenneth E. Jansen !call ramg_dump_i(ncorp_map,nshg,1,'pam_corp ') 960*59599516SKenneth E. Jansen do i=1,an 961*59599516SKenneth E. Jansen ii = ncorp_map(i)!ipmap(i)) 962*59599516SKenneth E. Jansen do p=acolm(i),acolm(i+1)-1 963*59599516SKenneth E. Jansen j = arowp(p) 964*59599516SKenneth E. Jansen jj = ncorp_map(j)!ipmap(j)) 965*59599516SKenneth E. Jansen !write(264,"((I6)(I7)(A)(E8.2))")i,j,' ',alhs(p) 966*59599516SKenneth E. Jansen write(264,mformat)ii,jj,(alhs(k,p),k=1,redun) 967*59599516SKenneth E. Jansen enddo 968*59599516SKenneth E. Jansen enddo 969*59599516SKenneth E. Jansen close(264) 970*59599516SKenneth E. Jansen end subroutine 971*59599516SKenneth E. Jansen 972*59599516SKenneth E. Jansen 973*59599516SKenneth E. Jansen subroutine ramg_dump_mupad_A(acolm,arowp,alhs,an,annz, 974*59599516SKenneth E. Jansen & fname,mtxname) 975*59599516SKenneth E. Jansen integer :: an,annz 976*59599516SKenneth E. Jansen integer,dimension(an+1) :: acolm 977*59599516SKenneth E. Jansen integer,dimension(annz) :: arowp 978*59599516SKenneth E. Jansen real(kind=8),dimension(annz) :: alhs 979*59599516SKenneth E. Jansen character fname*10,mtxname*5 980*59599516SKenneth E. Jansen 981*59599516SKenneth E. Jansen character mfname*15,mAname*5 982*59599516SKenneth E. Jansen 983*59599516SKenneth E. Jansen integer i,j,p,k 984*59599516SKenneth E. Jansen 985*59599516SKenneth E. Jansen mfname = trim(fname)//'.mws' 986*59599516SKenneth E. Jansen mAname = trim(mtxname) 987*59599516SKenneth E. Jansen 988*59599516SKenneth E. Jansen write(*,*)'RAMG Dump to Mupad ',mfname 989*59599516SKenneth E. Jansen open(264,file=trim(mfname),status='unknown') 990*59599516SKenneth E. Jansen write(264,*)mAname,':= matrix(',an,',',an,'):' 991*59599516SKenneth E. Jansen do i=1,an 992*59599516SKenneth E. Jansen do p=acolm(i),acolm(i+1)-1 993*59599516SKenneth E. Jansen j = arowp(p) 994*59599516SKenneth E. Jansen write(264,*)mAname,'[',i,',',j,']:=',alhs(p),':' 995*59599516SKenneth E. Jansen enddo 996*59599516SKenneth E. Jansen enddo 997*59599516SKenneth E. Jansen close(264) 998*59599516SKenneth E. Jansen 999*59599516SKenneth E. Jansen end subroutine 1000*59599516SKenneth E. Jansen 1001*59599516SKenneth E. Jansen subroutine ramg_print_time(str,v) 1002*59599516SKenneth E. Jansen 1003*59599516SKenneth E. Jansen include "common.h" 1004*59599516SKenneth E. Jansen include "mpif.h" 1005*59599516SKenneth E. Jansen include "auxmpi.h" 1006*59599516SKenneth E. Jansen 1007*59599516SKenneth E. Jansen character*(*) str 1008*59599516SKenneth E. Jansen real(kind=8) :: v,vave,vmax 1009*59599516SKenneth E. Jansen 1010*59599516SKenneth E. Jansen if (numpe.gt.1) then 1011*59599516SKenneth E. Jansen call MPI_AllReduce(v,vmax,1, 1012*59599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_MAX,MPI_COMM_WORLD,ierr) 1013*59599516SKenneth E. Jansen call MPI_AllReduce(v,vave,1, 1014*59599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,ierr) 1015*59599516SKenneth E. Jansen vave = vave/numpe 1016*59599516SKenneth E. Jansen else 1017*59599516SKenneth E. Jansen vave = v 1018*59599516SKenneth E. Jansen vmax = v 1019*59599516SKenneth E. Jansen endif 1020*59599516SKenneth E. Jansen 1021*59599516SKenneth E. Jansen if ((iamg_verb.gt.1).and.(myrank.eq.master)) then 1022*59599516SKenneth E. Jansen write(*,7101)trim(str),vave,vmax 1023*59599516SKenneth E. Jansen7101 format(T1,A,T40,f9.2,' s (ave), ',f9.2,' s (max)') 1024*59599516SKenneth E. Jansen endif 1025*59599516SKenneth E. Jansen 1026*59599516SKenneth E. Jansen end subroutine 1027*59599516SKenneth E. Jansen 1028*59599516SKenneth E. Jansen subroutine ramg_output_coarsening 1029*59599516SKenneth E. Jansen use readarrays 1030*59599516SKenneth E. Jansen use ramg_data 1031*59599516SKenneth E. Jansen include "common.h" 1032*59599516SKenneth E. Jansen include "mpif.h" 1033*59599516SKenneth E. Jansen 1034*59599516SKenneth E. Jansen character*20 mfname 1035*59599516SKenneth E. Jansen character*20 mformat 1036*59599516SKenneth E. Jansen 1037*59599516SKenneth E. Jansen integer i 1038*59599516SKenneth E. Jansen 1039*59599516SKenneth E. Jansen write(*,*)'ramg dump coarsening' 1040*59599516SKenneth E. Jansen mfname = 'amgcoarsen.dat' 1041*59599516SKenneth E. Jansen open(265,file=trim(mfname),status='unknown') 1042*59599516SKenneth E. Jansen write(265,*)nshg 1043*59599516SKenneth E. Jansen do i=1,nshg 1044*59599516SKenneth E. Jansen write(265,'((2I)(3E14.5))')i,amg_cfmap(i), 1045*59599516SKenneth E. Jansen & point2x(i,1),point2x(i,2),point2x(i,3) 1046*59599516SKenneth E. Jansen enddo 1047*59599516SKenneth E. Jansen close(265) 1048*59599516SKenneth E. Jansen 1049*59599516SKenneth E. Jansen end subroutine 1050*59599516SKenneth E. Jansen 1051*59599516SKenneth E. Jansen!*********************************************************** 1052*59599516SKenneth E. Jansen! <EOF> ramg TOOLS 1053*59599516SKenneth E. Jansen!********************************************************** 1054