159599516SKenneth E. Jansen!********************************************************** 259599516SKenneth E. Jansen! RAMG tools, functions needed in ramg_driver and 359599516SKenneth E. Jansen! ramg_interface. 459599516SKenneth E. Jansen! Module defined in ramg_data.f 559599516SKenneth E. Jansen! 659599516SKenneth E. Jansen! ramg_calcIAI 759599516SKenneth E. Jansen! ramg_calcIvFC/CF 859599516SKenneth E. Jansen! ramg_direct 959599516SKenneth E. Jansen! ramg_allocate 1059599516SKenneth E. Jansen! ramg_deallocate 1159599516SKenneth E. Jansen! ramg_dump 1259599516SKenneth E. Jansen! 1359599516SKenneth E. Jansen!*********************************************************** 1459599516SKenneth E. Jansen 1559599516SKenneth E. Jansen 1659599516SKenneth E. Jansen!!*********************************************************** 1759599516SKenneth E. Jansen! ramg_calcIvCF 1859599516SKenneth E. Jansen! calculate V coarse to fine, 1959599516SKenneth E. Jansen! v = I * VC 2059599516SKenneth E. Jansen!*********************************************************** 2159599516SKenneth E. Jansen subroutine ramg_calcIvCF(level1,level2,VC,vf, 2259599516SKenneth E. Jansen & ilwork,BC,iBC,iper) 2359599516SKenneth E. Jansen use ramg_data 2459599516SKenneth E. Jansen include "common.h" 2559599516SKenneth E. Jansen include "mpif.h" 2659599516SKenneth E. Jansen 2759599516SKenneth E. Jansen !implicit none 2859599516SKenneth E. Jansen integer,intent(in) :: level1,level2 2959599516SKenneth E. Jansen real(kind=8),intent(inout),dimension(amg_nshg(level1)) :: vf 3059599516SKenneth E. Jansen real(kind=8),intent(in),dimension(amg_nshg(level2)) :: VC 3159599516SKenneth E. Jansen 3259599516SKenneth E. Jansen integer,intent(in),dimension(nlwork) :: ilwork 3359599516SKenneth E. Jansen integer,intent(in),dimension(nshg) :: iBC,iper 3459599516SKenneth E. Jansen real(kind=8),intent(in),dimension(nshg,ndofBC) :: BC 3559599516SKenneth E. Jansen 3659599516SKenneth E. Jansen integer :: i,j,k,p 3759599516SKenneth E. Jansen 3859599516SKenneth E. Jansen real(kind=8) :: cpusec(2) 3959599516SKenneth E. Jansen 4059599516SKenneth E. Jansen call cpu_time(cpusec(1)) 4159599516SKenneth E. Jansen 4259599516SKenneth E. Jansen vf = 0 4359599516SKenneth E. Jansen do i=1,amg_nshg(level1) 4459599516SKenneth E. Jansen do k=I_cf_colm(level1)%p(i),I_cf_colm(level1)%p(i+1)-1 4559599516SKenneth E. Jansen j = I_cf_rowp(level1)%p(k) 4659599516SKenneth E. Jansen vf(i) = vf(i) + VC(j)*I_cf(level1)%p(k) 4759599516SKenneth E. Jansen enddo 4859599516SKenneth E. Jansen enddo 4959599516SKenneth E. Jansen 5059599516SKenneth E. Jansen if ( level1 .eq. -1 ) then 5159599516SKenneth E. Jansen call commIn(vf,ilwork,1,iper,iBC,BC) 5259599516SKenneth E. Jansen call commOut(vf,ilwork,1,iper,iBC,BC) 5359599516SKenneth E. Jansen end if 5459599516SKenneth E. Jansen 5559599516SKenneth E. Jansen call cpu_time(cpusec(2)) 5659599516SKenneth E. Jansen ramg_time(13)=ramg_time(13)+cpusec(2)-cpusec(1) 5759599516SKenneth E. Jansen 5859599516SKenneth E. Jansen end subroutine ! ramg_calcIvCF 5959599516SKenneth E. Jansen 6059599516SKenneth E. Jansen!*********************************************************** 6159599516SKenneth E. Jansen! ramg_calcIvFC 6259599516SKenneth E. Jansen! calculate v fine to coarse, 6359599516SKenneth E. Jansen! VC = IT * v 6459599516SKenneth E. Jansen!*********************************************************** 6559599516SKenneth E. Jansen subroutine ramg_calcIvFC(level1,level2,vf,VC) 6659599516SKenneth E. Jansen use ramg_data 6759599516SKenneth E. Jansen implicit none 6859599516SKenneth E. Jansen integer,intent(in) :: level1,level2 6959599516SKenneth E. Jansen real(kind=8),intent(in),dimension(amg_nshg(level1)) :: vf 7059599516SKenneth E. Jansen real(kind=8),intent(inout),dimension(amg_nshg(level2)) :: VC 7159599516SKenneth E. Jansen 7259599516SKenneth E. Jansen integer :: i,j,k,p 7359599516SKenneth E. Jansen real(kind=8) :: cpusec(2) 7459599516SKenneth E. Jansen 7559599516SKenneth E. Jansen call cpu_time(cpusec(1)) 7659599516SKenneth E. Jansen 7759599516SKenneth E. Jansen 7859599516SKenneth E. Jansen VC = 0 7959599516SKenneth E. Jansen do i=1,amg_nshg(level2) 8059599516SKenneth E. Jansen do k=I_fc_colm(level1)%p(i),I_fc_colm(level1)%p(i+1)-1 8159599516SKenneth E. Jansen j = I_fc_rowp(level1)%p(k) 8259599516SKenneth E. Jansen VC(i) = VC(i) + vf(j)*I_fc(level1)%p(k) 8359599516SKenneth E. Jansen enddo 8459599516SKenneth E. Jansen enddo 8559599516SKenneth E. Jansen call cpu_time(cpusec(2)) 8659599516SKenneth E. Jansen ramg_time(13)=ramg_time(13)+cpusec(2)-cpusec(1) 8759599516SKenneth E. Jansen 8859599516SKenneth E. Jansen end subroutine ! ramg_calcIvFC 8959599516SKenneth E. Jansen 9059599516SKenneth E. Jansen!!*********************************************************** 9159599516SKenneth E. Jansen! ramg_calcSvCF 9259599516SKenneth E. Jansen! calculate V coarse to fine, 9359599516SKenneth E. Jansen! v = S * VC 9459599516SKenneth E. Jansen!*********************************************************** 9559599516SKenneth E. Jansen 9659599516SKenneth E. Jansen!*********************************************************** 9759599516SKenneth E. Jansen! ramg_calcIvFC 9859599516SKenneth E. Jansen! calculate v fine to coarse, 9959599516SKenneth E. Jansen! VC = ST * v 10059599516SKenneth E. Jansen!*********************************************************** 10159599516SKenneth E. Jansen 10259599516SKenneth E. Jansen!************************************************************ 10359599516SKenneth E. Jansen! ramg_calcAv 10459599516SKenneth E. Jansen! calculate u = A*v 10559599516SKenneth E. Jansen!************************************************************ 10659599516SKenneth E. Jansen subroutine ramg_calcAv(gcolm,growp,glhs,gnshg,gnnz_tot, 10759599516SKenneth E. Jansen & u,v,gcomm) 10859599516SKenneth E. Jansen use ramg_data 10959599516SKenneth E. Jansen integer,intent(in) :: gnshg,gnnz_tot 11059599516SKenneth E. Jansen integer,intent(in),dimension(gnshg+1) :: gcolm 11159599516SKenneth E. Jansen integer,intent(in),dimension(gnnz_tot) :: growp 11259599516SKenneth E. Jansen real(kind=8),intent(in),dimension(gnnz_tot) :: glhs 11359599516SKenneth E. Jansen real(kind=8),intent(in),dimension(gnshg) :: v 11459599516SKenneth E. Jansen real(kind=8),intent(inout),dimension(gnshg) :: u 11559599516SKenneth E. Jansen integer,intent(in) :: gcomm 11659599516SKenneth E. Jansen 11759599516SKenneth E. Jansen integer :: i,j,k,p 11859599516SKenneth E. Jansen 11959599516SKenneth E. Jansen u = 0 12059599516SKenneth E. Jansen do i=1,gnshg 12159599516SKenneth E. Jansen do k=gcolm(i),gcolm(i+1)-1 12259599516SKenneth E. Jansen j = growp(k) 12359599516SKenneth E. Jansen u(i) = u(i)+glhs(k)*v(j) 12459599516SKenneth E. Jansen enddo 12559599516SKenneth E. Jansen enddo 12659599516SKenneth E. Jansen 12759599516SKenneth E. Jansen! if (gcomm.eq.1) then 12859599516SKenneth E. Jansen! end if 12959599516SKenneth E. Jansen 13059599516SKenneth E. Jansen end subroutine ! ramg_calcAv 13159599516SKenneth E. Jansen 13259599516SKenneth E. Jansen!************************************************************ 13359599516SKenneth E. Jansen! ramg_calcAv_g 13459599516SKenneth E. Jansen! calculate u = A*v 13559599516SKenneth E. Jansen! Globally: commout, do product, commin, (zeroout) 13659599516SKenneth E. Jansen!************************************************************ 13759599516SKenneth E. Jansen subroutine ramg_calcAv_g(level,u,v,colm,rowp,lhsK,lhsP, 13859599516SKenneth E. Jansen & ilwork,BC,iBC,iper,gcomm) 13959599516SKenneth E. Jansen use ramg_data 14059599516SKenneth E. Jansen include "common.h" 14159599516SKenneth E. Jansen include "mpif.h" 14259599516SKenneth E. Jansen include "auxmpi.h" 14359599516SKenneth E. Jansen 14459599516SKenneth E. Jansen integer,intent(in),dimension(nlwork) :: ilwork 14559599516SKenneth E. Jansen integer,intent(in),dimension(nshg) :: iBC,iper 14659599516SKenneth E. Jansen real(kind=8),intent(in),dimension(nshg,ndofBC) :: BC 14759599516SKenneth E. Jansen integer,intent(in),dimension(nshg+1) :: colm 14859599516SKenneth E. Jansen integer,intent(in),dimension(nnz_tot) :: rowp 14959599516SKenneth E. Jansen 15059599516SKenneth E. Jansen real(kind=8),intent(in),dimension(9,nnz_tot) :: lhsK 15159599516SKenneth E. Jansen real(kind=8),intent(in),dimension(4,nnz_tot) :: lhsP 15259599516SKenneth E. Jansen integer,intent(in) :: level 15359599516SKenneth E. Jansen real(kind=8),intent(inout),dimension(amg_nshg(level)) :: v 15459599516SKenneth E. Jansen real(kind=8),intent(inout),dimension(amg_nshg(level)) :: u 15559599516SKenneth E. Jansen integer,intent(in) :: gcomm 15659599516SKenneth E. Jansen 15759599516SKenneth E. Jansen integer :: i,j,k,p,mi,mj 15859599516SKenneth E. Jansen real(kind=8) :: cpusec(2) 15959599516SKenneth E. Jansen 16059599516SKenneth E. Jansen call cpu_time(cpusec(1)) 16159599516SKenneth E. Jansen 16259599516SKenneth E. Jansen IF (level.eq.1) THEN 16359599516SKenneth E. Jansen !IF (.FALSE.) THEN 16459599516SKenneth E. Jansen call ramg_PPEAp(u,v,colm,rowp,lhsK,lhsP,ilwork,BC,iBC,iper) 16559599516SKenneth E. Jansen ELSE 16659599516SKenneth E. Jansen if (gcomm.eq.1) then 16759599516SKenneth E. Jansen call ramg_commOut(v,level,ilwork,1,iper,iBC,BC) 16859599516SKenneth E. Jansen endif 16959599516SKenneth E. Jansen u = 0 17059599516SKenneth E. Jansen do i=1,amg_nshg(level) 17159599516SKenneth E. Jansen mi = amg_paramap(level)%p(i) 17259599516SKenneth E. Jansen do k=amg_A_colm(level)%p(i),amg_A_colm(level)%p(i+1)-1 17359599516SKenneth E. Jansen j = amg_A_rowp(level)%p(k) 17459599516SKenneth E. Jansen mj = amg_paramap(level)%p(j) 17559599516SKenneth E. Jansen if (.not.( (mi.eq.mj).and.(mi.lt.0) )) then 17659599516SKenneth E. Jansen u(i) = u(i)+amg_A_lhs(level)%p(k,1)*v(j) 17759599516SKenneth E. Jansen endif 17859599516SKenneth E. Jansen enddo 17959599516SKenneth E. Jansen enddo 18059599516SKenneth E. Jansen if (gcomm.eq.1) then 18159599516SKenneth E. Jansen call ramg_commIn(u,level,ilwork,1,iper,iBC,BC) 18259599516SKenneth E. Jansen endif 18359599516SKenneth E. Jansen ENDIF 18459599516SKenneth E. Jansen call cpu_time(cpusec(2)) 18559599516SKenneth E. Jansen if (level.eq.1) then 18659599516SKenneth E. Jansen ramg_time(11) = ramg_time(11) + cpusec(2)-cpusec(1) 18759599516SKenneth E. Jansen else 18859599516SKenneth E. Jansen ramg_time(12) = ramg_time(12) + cpusec(2)-cpusec(1) 18959599516SKenneth E. Jansen endif 19059599516SKenneth E. Jansen 19159599516SKenneth E. Jansen end subroutine ! ramg_calcAv_g 19259599516SKenneth E. Jansen 19359599516SKenneth E. Jansen!************************************************************ 19459599516SKenneth E. Jansen! ramg_calcAv_b: same as calcAv_g, but only apply 19559599516SKenneth E. Jansen! on boundary nodes. 19659599516SKenneth E. Jansen! calculate u = A*v 19759599516SKenneth E. Jansen! Globally: commout, do product, commin, (zeroout) 19859599516SKenneth E. Jansen!************************************************************ 19959599516SKenneth E. Jansen subroutine ramg_calcAv_b(level,u,v, 20059599516SKenneth E. Jansen & ilwork,BC,iBC,iper,gcomm,diag) 20159599516SKenneth E. Jansen use ramg_data 20259599516SKenneth E. Jansen include "common.h" 20359599516SKenneth E. Jansen include "mpif.h" 20459599516SKenneth E. Jansen include "auxmpi.h" 20559599516SKenneth E. Jansen 20659599516SKenneth E. Jansen integer,intent(in),dimension(nlwork) :: ilwork 20759599516SKenneth E. Jansen integer,intent(in),dimension(nshg) :: iBC,iper 20859599516SKenneth E. Jansen real(kind=8),intent(in),dimension(nshg,ndofBC) :: BC 20959599516SKenneth E. Jansen 21059599516SKenneth E. Jansen integer,intent(in) :: level 21159599516SKenneth E. Jansen real(kind=8),intent(inout),dimension(amg_nshg(level)) :: v 21259599516SKenneth E. Jansen real(kind=8),intent(inout),dimension(amg_nshg(level)) :: u 21359599516SKenneth E. Jansen integer,intent(in) :: gcomm 21459599516SKenneth E. Jansen integer,intent(in) :: diag !=1: NOT include diagonal A_(i,i) 21559599516SKenneth E. Jansen !=0: include diagonal 21659599516SKenneth E. Jansen 21759599516SKenneth E. Jansen integer :: i,j,k,p,mi,mj,mk 21859599516SKenneth E. Jansen real(kind=8) :: cpusec(2) 21959599516SKenneth E. Jansen 22059599516SKenneth E. Jansen call cpu_time(cpusec(1)) 22159599516SKenneth E. Jansen 22259599516SKenneth E. Jansen if (gcomm.eq.1) then 22359599516SKenneth E. Jansen call ramg_commOut(v,level,ilwork,1,iper,iBC,BC) 22459599516SKenneth E. Jansen endif 22559599516SKenneth E. Jansen u = 0 22659599516SKenneth E. Jansen do i=1,amg_nshg(level) 22759599516SKenneth E. Jansen mi = amg_paramap(level)%p(i) 22859599516SKenneth E. Jansen mk = amg_paraext(level)%p(i) 22959599516SKenneth E. Jansen IF (mk.ne.(myrank+1)) THEN ! only treat boundary nodes 23059599516SKenneth E. Jansen do k=amg_A_colm(level)%p(i)+diag,amg_A_colm(level)%p(i+1)-1 23159599516SKenneth E. Jansen j = amg_A_rowp(level)%p(k) 23259599516SKenneth E. Jansen mj = amg_paramap(level)%p(j) 23359599516SKenneth E. Jansen if (.not.( (mi.eq.mj).and.(mi.lt.0) )) then 23459599516SKenneth E. Jansen u(i) = u(i)+amg_A_lhs(level)%p(k,1)*v(j) 23559599516SKenneth E. Jansen endif 23659599516SKenneth E. Jansen enddo 23759599516SKenneth E. Jansen ELSE 23859599516SKenneth E. Jansen u(i) = v(i) 23959599516SKenneth E. Jansen ENDIF 24059599516SKenneth E. Jansen enddo 24159599516SKenneth E. Jansen if (gcomm.eq.1) then 24259599516SKenneth E. Jansen call ramg_commIn(u,level,ilwork,1,iper,iBC,BC) 24359599516SKenneth E. Jansen endif 24459599516SKenneth E. Jansen 24559599516SKenneth E. Jansen end subroutine ! ramg_calcAv_b 24659599516SKenneth E. Jansen 24759599516SKenneth E. Jansen 24859599516SKenneth E. Jansen!************************************************* 24959599516SKenneth E. Jansen! check_paracomm 25059599516SKenneth E. Jansen!************************************************* 25159599516SKenneth E. Jansen subroutine ramg_check_paracomm(ilwork,BC,iBC,iper) 25259599516SKenneth E. Jansen use ramg_data 25359599516SKenneth E. Jansen include "common.h" 25459599516SKenneth E. Jansen include "mpif.h" 25559599516SKenneth E. Jansen include "auxmpi.h" 25659599516SKenneth E. Jansen 25759599516SKenneth E. Jansen integer,intent(in),dimension(nlwork) :: ilwork 25859599516SKenneth E. Jansen integer,intent(in),dimension(nshg) :: iBC,iper 25959599516SKenneth E. Jansen real(kind=8),intent(in),dimension(nshg,ndofBC) :: BC 26059599516SKenneth E. Jansen 26159599516SKenneth E. Jansen integer i,j 26259599516SKenneth E. Jansen type(r1d),dimension(ramg_levelx) :: tarray 26359599516SKenneth E. Jansen character :: fname*80 26459599516SKenneth E. Jansen 26559599516SKenneth E. Jansen do i=1,ramg_levelx 26659599516SKenneth E. Jansen allocate(tarray(i)%p(amg_nshg(i))) 26759599516SKenneth E. Jansen do j=1,amg_nshg(i) 26859599516SKenneth E. Jansen call random_number(tarray(i)%p) 26959599516SKenneth E. Jansen enddo 27059599516SKenneth E. Jansen enddo 27159599516SKenneth E. Jansen 27259599516SKenneth E. Jansen do i=1,ramg_levelx 27359599516SKenneth E. Jansen write(fname,'((A8)(I1))')'tarray_a',i 27459599516SKenneth E. Jansen call ramg_dump(tarray(i)%p,amg_nshg(i),fname) 27559599516SKenneth E. Jansen enddo 27659599516SKenneth E. Jansen 27759599516SKenneth E. Jansen do i=1,ramg_levelx 27859599516SKenneth E. Jansen call ramg_commIn(tarray(i)%p,i,ilwork,1,iper,iBC,BC) 27959599516SKenneth E. Jansen write(fname,'((A8)(I1))')'tarray_i',i 28059599516SKenneth E. Jansen call ramg_dump(tarray(i)%p,amg_nshg(i),fname) 28159599516SKenneth E. Jansen enddo 28259599516SKenneth E. Jansen 28359599516SKenneth E. Jansen do i=1,ramg_levelx 28459599516SKenneth E. Jansen call ramg_commOut(tarray(i)%p,i,ilwork,1,iper,iBC,BC) 28559599516SKenneth E. Jansen write(fname,'((A8)(I1))')'tarray_b',i 28659599516SKenneth E. Jansen call ramg_dump(tarray(i)%p,amg_nshg(i),fname) 28759599516SKenneth E. Jansen enddo 28859599516SKenneth E. Jansen 28959599516SKenneth E. Jansen! call commOut(tarray(1)%p,ilwork,1,iper,iBC,BC) 29059599516SKenneth E. Jansen 29159599516SKenneth E. Jansen! do i=1,ramg_levelx 29259599516SKenneth E. Jansen! write(fname,'((A8)(I1))')'tarray_i',i 29359599516SKenneth E. Jansen! call ramg_dump_rn_map(tarray(i)%p,amg_nshg(i),1,fname) 29459599516SKenneth E. Jansen! enddo 29559599516SKenneth E. Jansen 29659599516SKenneth E. Jansen 29759599516SKenneth E. Jansen do i=1,ramg_levelx 29859599516SKenneth E. Jansen deallocate(tarray(i)%p) 29959599516SKenneth E. Jansen enddo 30059599516SKenneth E. Jansen 30159599516SKenneth E. Jansen end subroutine ! ramg_check_paracomm 30259599516SKenneth E. Jansen 30359599516SKenneth E. Jansen!************************************************** 30459599516SKenneth E. Jansen! ramg_zeroOut: zero out slave values 30559599516SKenneth E. Jansen!************************************************** 30659599516SKenneth E. Jansen subroutine ramg_zeroOut(u,ilwork,BC,iBC,iper) 30759599516SKenneth E. Jansen include "common.h" 30859599516SKenneth E. Jansen include "auxmpi.h" 30959599516SKenneth E. Jansen include "mpif.h" 31059599516SKenneth E. Jansen 31159599516SKenneth E. Jansen real(kind=8),dimension(nshg),intent(inout) :: u 31259599516SKenneth E. Jansen integer,intent(in),dimension(nlwork) :: ilwork 31359599516SKenneth E. Jansen integer,intent(in),dimension(nshg) :: iBC,iper 31459599516SKenneth E. Jansen real(kind=8),intent(in),dimension(nshg,ndofBC) :: BC 31559599516SKenneth E. Jansen 31659599516SKenneth E. Jansen integer i,j,k,p 31759599516SKenneth E. Jansen integer :: itag,iacc,iother,numseg,isgbeg,itkbeg 31859599516SKenneth E. Jansen integer :: numtask,lenseg 31959599516SKenneth E. Jansen 32059599516SKenneth E. Jansen if (numpe.lt.2) return 32159599516SKenneth E. Jansen !call commOut(u,ilwork,1,iper,iBC,BC) 32259599516SKenneth E. Jansen numtask = ilwork(1) 32359599516SKenneth E. Jansen itkbeg = 1 32459599516SKenneth E. Jansen do i=1,numtask 32559599516SKenneth E. Jansen iacc = ilwork(itkbeg+2) 32659599516SKenneth E. Jansen numseg = ilwork(itkbeg+4) 32759599516SKenneth E. Jansen if (iacc.eq.0) then 32859599516SKenneth E. Jansen do j=1,numseg 32959599516SKenneth E. Jansen isgbeg = ilwork(itkbeg+3+j*2) 33059599516SKenneth E. Jansen lenseg = ilwork(itkbeg+4+j*2) 33159599516SKenneth E. Jansen isgend = isgbeg + lenseg -1 33259599516SKenneth E. Jansen u(isgbeg:isgend) = 0 33359599516SKenneth E. Jansen enddo 33459599516SKenneth E. Jansen endif 33559599516SKenneth E. Jansen itkbeg = itkbeg+4+2*numseg 33659599516SKenneth E. Jansen enddo 33759599516SKenneth E. Jansen 33859599516SKenneth E. Jansen end subroutine ! ramg_zeroOut 33959599516SKenneth E. Jansen 34059599516SKenneth E. Jansen!************************************************ 34159599516SKenneth E. Jansen! ramg_freeBC: set "fine" on boundary nodes 34259599516SKenneth E. Jansen!************************************************ 34359599516SKenneth E. Jansen subroutine ramg_freeBC(amg_F,ilwork,BC,iBC,iper) 34459599516SKenneth E. Jansen use ramg_data 34559599516SKenneth E. Jansen include "common.h" 34659599516SKenneth E. Jansen include "auxmpi.h" 34759599516SKenneth E. Jansen include "mpif.h" 34859599516SKenneth E. Jansen integer,intent(inout),dimension(nshg) :: amg_F 34959599516SKenneth E. Jansen integer,intent(in),dimension(nlwork) :: ilwork 35059599516SKenneth E. Jansen integer,intent(in),dimension(nshg) :: iBC,iper 35159599516SKenneth E. Jansen real(kind=8),intent(in),dimension(nshg,ndofBC) :: BC 35259599516SKenneth E. Jansen integer :: itag,iacc,iother,numseg,isgbeg,itkbeg,numtask 35359599516SKenneth E. Jansen integer :: i,p 35459599516SKenneth E. Jansen integer,dimension(nshg,2) :: tmpout 35559599516SKenneth E. Jansen 35659599516SKenneth E. Jansen character :: filename*80 35759599516SKenneth E. Jansen integer :: nentry,nshg,iglobal,ilocal,icf,iproc 35859599516SKenneth E. Jansen 35959599516SKenneth E. Jansen return 36059599516SKenneth E. Jansen 36159599516SKenneth E. Jansen if (numpe.ge.2) then 36259599516SKenneth E. Jansen 36359599516SKenneth E. Jansen numtask = ilwork(1) 36459599516SKenneth E. Jansen itkbeg = 1 36559599516SKenneth E. Jansen do i=1,numtask 36659599516SKenneth E. Jansen itag = ilwork(itkbeg+1) 36759599516SKenneth E. Jansen iacc = ilwork(itkbeg+2) 36859599516SKenneth E. Jansen iother = ilwork(itkbeg+3) 36959599516SKenneth E. Jansen numseg = ilwork(itkbeg+4) 37059599516SKenneth E. Jansen isgbeg = ilwork(itkbeg+5) 37159599516SKenneth E. Jansen do j=1,numseg 37259599516SKenneth E. Jansen p = ilwork(itkbeg+3+j*2) 37359599516SKenneth E. Jansen amg_F(p) = 2 37459599516SKenneth E. Jansen enddo 37559599516SKenneth E. Jansen enddo 37659599516SKenneth E. Jansen 37759599516SKenneth E. Jansen tmpout(:,1) = ncorp_map 37859599516SKenneth E. Jansen tmpout(:,2) = amg_F 37959599516SKenneth E. Jansen 38059599516SKenneth E. Jansen call ramg_dump_i(tmpout,nshg,2,'CFsplit ') 38159599516SKenneth E. Jansen else ! DEBUGGING PART, READ 2-PROC CASE INTO 1-proc 38259599516SKenneth E. Jansen filename = "cfs.dat" 38359599516SKenneth E. Jansen filename = trim(filename) 38459599516SKenneth E. Jansen open(unit=999,file=filename,status='unknown') 38559599516SKenneth E. Jansen read(999,*)nentry 38659599516SKenneth E. Jansen do i=1,nentry 38759599516SKenneth E. Jansen read(999,*)iglobal,ilocal,icf,iproc 38859599516SKenneth E. Jansen !amg_F(iglobal) = icf 38959599516SKenneth E. Jansen enddo 39059599516SKenneth E. Jansen close(999) 39159599516SKenneth E. Jansen end if 39259599516SKenneth E. Jansen 39359599516SKenneth E. Jansen end subroutine ! ramg_freeBC 39459599516SKenneth E. Jansen 39559599516SKenneth E. Jansen 39659599516SKenneth E. Jansen!********************************************** 39759599516SKenneth E. Jansen! ramg_read_map: 39859599516SKenneth E. Jansen! read in ncorp array from local to global 39959599516SKenneth E. Jansen! mapping 40059599516SKenneth E. Jansen!********************************************** 40159599516SKenneth E. Jansen subroutine ramg_prep_reduce_map 40259599516SKenneth E. Jansen use ramg_data 40359599516SKenneth E. Jansen include "common.h" 40459599516SKenneth E. Jansen include "mpif.h" 40559599516SKenneth E. Jansen include "auxmpi.h" 40659599516SKenneth E. Jansen 40759599516SKenneth E. Jansen character*5 cname 40859599516SKenneth E. Jansen character*255 fname1 40959599516SKenneth E. Jansen integer igeom,map_nshg,i 41059599516SKenneth E. Jansen 41159599516SKenneth E. Jansen allocate(ncorp_map(nshg)) 41259599516SKenneth E. Jansen if (numpe.lt.2) then! construct dummy-array 41359599516SKenneth E. Jansen do i=1,nshg 41459599516SKenneth E. Jansen ncorp_map(i) = i 41559599516SKenneth E. Jansen enddo 41659599516SKenneth E. Jansen else 41759599516SKenneth E. Jansen fname1='geombc.dat' 41859599516SKenneth E. Jansen fname1=trim(fname1)//cname(myrank+1) 41959599516SKenneth E. Jansen 42059599516SKenneth E. Jansen call openfile(fname1,"read",igeom) 42159599516SKenneth E. Jansen !write(*,*)'mcheck:',myrank,fname1,igeom 42259599516SKenneth E. Jansen 42359599516SKenneth E. Jansen fname1="mode number map from partition to global" 42459599516SKenneth E. Jansen ione=1 425*1a0ed25eSCameron Smith call readheader(igeom, 426*1a0ed25eSCameron Smith & 'mode number map from partition to global' // char(0), 427*1a0ed25eSCameron Smith & map_nshg,ione,"integer",iotype) 42859599516SKenneth E. Jansen 429*1a0ed25eSCameron Smith call readdatablock(igeom, 430*1a0ed25eSCameron Smith & 'mode number map from partition to global' // char(0), 431*1a0ed25eSCameron Smith & ncorp_map,map_nshg, "integer",iotype) 43259599516SKenneth E. Jansen 43359599516SKenneth E. Jansen call closefile(igeom,"read") 43459599516SKenneth E. Jansen 43559599516SKenneth E. Jansen endif 43659599516SKenneth E. Jansen 43759599516SKenneth E. Jansen end subroutine ! ramg_read_map 43859599516SKenneth E. Jansen 43959599516SKenneth E. Jansen!*********************************************** 44059599516SKenneth E. Jansen! ramg_check_diag 44159599516SKenneth E. Jansen!*********************************************** 44259599516SKenneth E. Jansen subroutine ramg_check_diag(colm,rowp,lhs,nshg,nnz_tot) 44359599516SKenneth E. Jansen implicit none 44459599516SKenneth E. Jansen integer,intent(in) :: nshg,nnz_tot 44559599516SKenneth E. Jansen integer,intent(in),dimension(nshg+1) :: colm 44659599516SKenneth E. Jansen integer,intent(in),dimension(nnz_tot) :: rowp 44759599516SKenneth E. Jansen real(kind=8),intent(in),dimension(nnz_tot) :: lhs 44859599516SKenneth E. Jansen 44959599516SKenneth E. Jansen integer :: i,j,p 45059599516SKenneth E. Jansen real(kind=8) :: diagrow 45159599516SKenneth E. Jansen logical :: diagokay 45259599516SKenneth E. Jansen 45359599516SKenneth E. Jansen diagokay = .true. 45459599516SKenneth E. Jansen 45559599516SKenneth E. Jansen do i=1,nshg 45659599516SKenneth E. Jansen p = colm(i) 45759599516SKenneth E. Jansen if (rowp(p).ne.i) then 45859599516SKenneth E. Jansen write(*,*)'matrix first row entry is not diagonal',i 45959599516SKenneth E. Jansen diagokay = .false. 46059599516SKenneth E. Jansen end if 46159599516SKenneth E. Jansen diagrow = lhs(p) 46259599516SKenneth E. Jansen if (diagrow.lt.0) then 46359599516SKenneth E. Jansen write(*,*)'matrix diagonal < 0 at',i,diagrow 46459599516SKenneth E. Jansen diagokay = .false. 46559599516SKenneth E. Jansen end if 46659599516SKenneth E. Jansen do j = colm(i)+1,colm(i+1)-1 46759599516SKenneth E. Jansen p = rowp(j) 46859599516SKenneth E. Jansen if (lhs(p).gt.diagrow) then 46959599516SKenneth E. Jansen write(*,*)'matrix not diagonal dominant at row',i 47059599516SKenneth E. Jansen diagokay = .false. 47159599516SKenneth E. Jansen write(*,*)'diag:',diagrow,p,lhs(p) 47259599516SKenneth E. Jansen exit 47359599516SKenneth E. Jansen end if 47459599516SKenneth E. Jansen end do 47559599516SKenneth E. Jansen enddo 47659599516SKenneth E. Jansen 47759599516SKenneth E. Jansen if (diagokay) then 47859599516SKenneth E. Jansen write(*,*)'matrix check diagonal dominance okay' 47959599516SKenneth E. Jansen end if 48059599516SKenneth E. Jansen 48159599516SKenneth E. Jansen end subroutine 48259599516SKenneth E. Jansen 48359599516SKenneth E. Jansen subroutine ramg_dot_p(level,v,u,redun,norm) 48459599516SKenneth E. Jansen use ramg_data 48559599516SKenneth E. Jansen include "common.h" 48659599516SKenneth E. Jansen include "mpif.h" 48759599516SKenneth E. Jansen include "auxmpi.h" 48859599516SKenneth E. Jansen 48959599516SKenneth E. Jansen integer :: redun,level 49059599516SKenneth E. Jansen real(kind=8),intent(in),dimension(amg_nshg(level),redun) ::v,u 49159599516SKenneth E. Jansen real(kind=8),intent(inout) :: norm 49259599516SKenneth E. Jansen integer :: i,k 49359599516SKenneth E. Jansen real(kind=8) :: normt 49459599516SKenneth E. Jansen normt = 0 49559599516SKenneth E. Jansen do i=1,amg_nshg(level) 49659599516SKenneth E. Jansen do k=1,redun 49759599516SKenneth E. Jansen normt = normt + v(i,k)*u(i,k) 49859599516SKenneth E. Jansen enddo 49959599516SKenneth E. Jansen enddo 50059599516SKenneth E. Jansen if (numpe.gt.1) then 50159599516SKenneth E. Jansen call MPI_AllReduce(normt,norm,1,MPI_DOUBLE_PRECISION,MPI_SUM, 50259599516SKenneth E. Jansen & MPI_COMM_WORLD,ierr) 50359599516SKenneth E. Jansen else 50459599516SKenneth E. Jansen norm=normt 50559599516SKenneth E. Jansen endif 50659599516SKenneth E. Jansen end subroutine !ramg_dot_p 50759599516SKenneth E. Jansen 50859599516SKenneth E. Jansen!************************************************************ 50959599516SKenneth E. Jansen! ramg_L2_norm 51059599516SKenneth E. Jansen! calculate norm = | r | 51159599516SKenneth E. Jansen!************************************************************ 51259599516SKenneth E. Jansen subroutine ramg_L2_norm(nshg,v,norm) 51359599516SKenneth E. Jansen implicit none 51459599516SKenneth E. Jansen integer,intent(in) :: nshg 51559599516SKenneth E. Jansen real(kind=8),intent(in),dimension(nshg) :: v 51659599516SKenneth E. Jansen real(kind=8),intent(inout) :: norm 51759599516SKenneth E. Jansen integer :: i 51859599516SKenneth E. Jansen norm = 0 51959599516SKenneth E. Jansen do i=1,nshg 52059599516SKenneth E. Jansen norm = norm + v(i)*v(i) 52159599516SKenneth E. Jansen enddo 52259599516SKenneth E. Jansen norm = sqrt(norm) 52359599516SKenneth E. Jansen end subroutine !ramg_L2_norm 52459599516SKenneth E. Jansen 52559599516SKenneth E. Jansen subroutine ramg_L2_norm_p(level,v,vflow,norm) 52659599516SKenneth E. Jansen use ramg_data 52759599516SKenneth E. Jansen include "common.h" 52859599516SKenneth E. Jansen include "mpif.h" 52959599516SKenneth E. Jansen include "auxmpi.h" 53059599516SKenneth E. Jansen 53159599516SKenneth E. Jansen integer,intent(in) :: vflow,level 53259599516SKenneth E. Jansen real(kind=8),intent(in),dimension(amg_nshg(level),vflow) :: v 53359599516SKenneth E. Jansen real(kind=8),intent(inout) :: norm 53459599516SKenneth E. Jansen integer :: i,k 53559599516SKenneth E. Jansen real(kind=8) :: normt 53659599516SKenneth E. Jansen normt = 0 53759599516SKenneth E. Jansen do i=1,amg_nshg(level) 53859599516SKenneth E. Jansen do k=1,vflow 53959599516SKenneth E. Jansen normt = normt + v(i,k)*v(i,k) 54059599516SKenneth E. Jansen enddo 54159599516SKenneth E. Jansen enddo 54259599516SKenneth E. Jansen if (numpe.gt.1) then 54359599516SKenneth E. Jansen call MPI_AllReduce(normt,norm,1,MPI_DOUBLE_PRECISION,MPI_SUM, 54459599516SKenneth E. Jansen & MPI_COMM_WORLD,ierr) 54559599516SKenneth E. Jansen else 54659599516SKenneth E. Jansen norm = normt 54759599516SKenneth E. Jansen endif 54859599516SKenneth E. Jansen norm = sqrt(norm) 54959599516SKenneth E. Jansen end subroutine !ramg_L2_norm_p 55059599516SKenneth E. Jansen 55159599516SKenneth E. Jansen!************************************************************ 55259599516SKenneth E. Jansen! ramg_allocate & deallocate 55359599516SKenneth E. Jansen! (de)allocate memory for level l, lhs matrix, rhs vector 55459599516SKenneth E. Jansen!************************************************************ 55559599516SKenneth E. Jansen subroutine ramg_allocate( 55659599516SKenneth E. Jansen & level,lnshg,lnnz_tot,n_sol) 55759599516SKenneth E. Jansen use ramg_data 55859599516SKenneth E. Jansen implicit none 55959599516SKenneth E. Jansen 56059599516SKenneth E. Jansen integer,intent(in) :: level,lnshg,lnnz_tot 56159599516SKenneth E. Jansen integer,intent(in) :: n_sol 56259599516SKenneth E. Jansen integer :: mem_err,mem_err_s 56359599516SKenneth E. Jansen mem_err_s = 0 56459599516SKenneth E. Jansen if (lnnz_tot.ne.0) then ! zero means manual alloc later 56559599516SKenneth E. Jansen amg_nnz(level) = lnnz_tot 56659599516SKenneth E. Jansen allocate(amg_A_lhs(level)%p(amg_nnz(level),n_sol), 56759599516SKenneth E. Jansen & stat=mem_err) 56859599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 56959599516SKenneth E. Jansen allocate(amg_A_rowp(level)%p(amg_nnz(level)), 57059599516SKenneth E. Jansen & stat=mem_err) 57159599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 57259599516SKenneth E. Jansen endif 57359599516SKenneth E. Jansen if (lnshg.ne.0) then 57459599516SKenneth E. Jansen amg_nshg(level) = lnshg 57559599516SKenneth E. Jansen allocate(amg_A_colm(level)%p(amg_nshg(level)+1), 57659599516SKenneth E. Jansen & stat=mem_err) 57759599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 57859599516SKenneth E. Jansen allocate(amg_A_rhs(level)%p(amg_nshg(level)), 57959599516SKenneth E. Jansen & stat=mem_err) 58059599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 58159599516SKenneth E. Jansen allocate(amg_ppeDiag(level)%p(amg_nshg(level)), 58259599516SKenneth E. Jansen & stat=mem_err) 58359599516SKenneth E. Jansen endif 58459599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 58559599516SKenneth E. Jansen if (mem_err_s .ne. 0 ) then 58659599516SKenneth E. Jansen write(6,7001)level 58759599516SKenneth E. Jansen end if 58859599516SKenneth E. Jansen7001 format(/' **** ramg: Allocation error at level',i5) 58959599516SKenneth E. Jansen ! zero out 59059599516SKenneth E. Jansen if (lnnz_tot.ne.0) then 59159599516SKenneth E. Jansen amg_A_lhs(level)%p(:,:) = 0 59259599516SKenneth E. Jansen amg_A_rowp(level)%p(:) = 0 59359599516SKenneth E. Jansen endif 59459599516SKenneth E. Jansen if (lnshg.ne.0) then 59559599516SKenneth E. Jansen amg_A_colm(level)%p(:) = 0 59659599516SKenneth E. Jansen amg_A_rhs(level)%p(:) = 0 59759599516SKenneth E. Jansen endif 59859599516SKenneth E. Jansen return 59959599516SKenneth E. Jansen 60059599516SKenneth E. Jansen end subroutine ! ramg_allocate 60159599516SKenneth E. Jansen 60259599516SKenneth E. Jansen subroutine ramg_deallocate(level) 60359599516SKenneth E. Jansen 60459599516SKenneth E. Jansen use ramg_data 60559599516SKenneth E. Jansen include "common.h" 60659599516SKenneth E. Jansen 60759599516SKenneth E. Jansen integer,intent(inout) :: level 60859599516SKenneth E. Jansen integer :: mem_err,mem_err_s,i 60959599516SKenneth E. Jansen 61059599516SKenneth E. Jansen 61159599516SKenneth E. Jansen if (level.eq.1) then 61259599516SKenneth E. Jansen 61359599516SKenneth E. Jansen if (maxnev.gt.0) then 61459599516SKenneth E. Jansen deallocate(ramg_ggb_ev) 61559599516SKenneth E. Jansen deallocate(ramg_ggb_eA) 61659599516SKenneth E. Jansen deallocate(cmtxA) 61759599516SKenneth E. Jansen deallocate(cindx) 61859599516SKenneth E. Jansen endif 61959599516SKenneth E. Jansen 62059599516SKenneth E. Jansen 62159599516SKenneth E. Jansen if (iamg_reduce.gt.1) then 62259599516SKenneth E. Jansen deallocate(reducemap) 62359599516SKenneth E. Jansen deallocate(rmap1d) 62459599516SKenneth E. Jansen endif 62559599516SKenneth E. Jansen 62659599516SKenneth E. Jansen end if 62759599516SKenneth E. Jansen 62859599516SKenneth E. Jansen 62959599516SKenneth E. Jansen level = abs(level) 63059599516SKenneth E. Jansen 63159599516SKenneth E. Jansen mem_err_s = 0 63259599516SKenneth E. Jansen if (associated(amg_A_lhs(level)%p)) then 63359599516SKenneth E. Jansen deallocate(amg_A_lhs(level)%p, 63459599516SKenneth E. Jansen & stat=mem_err) 63559599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 63659599516SKenneth E. Jansen endif 63759599516SKenneth E. Jansen if (associated(amg_A_rowp(level)%p)) then 63859599516SKenneth E. Jansen deallocate(amg_A_rowp(level)%p, 63959599516SKenneth E. Jansen & stat=mem_err) 64059599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 64159599516SKenneth E. Jansen endif 64259599516SKenneth E. Jansen if (associated(amg_A_colm(level)%p)) then 64359599516SKenneth E. Jansen deallocate(amg_A_colm(level)%p, 64459599516SKenneth E. Jansen & stat=mem_err) 64559599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 64659599516SKenneth E. Jansen endif 64759599516SKenneth E. Jansen if (associated(amg_ppeDiag(level)%p)) then 64859599516SKenneth E. Jansen deallocate(amg_ppeDiag(level)%p, 64959599516SKenneth E. Jansen & stat=mem_err) 65059599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 65159599516SKenneth E. Jansen endif 65259599516SKenneth E. Jansen if (associated(amg_A_rhs(level)%p)) then 65359599516SKenneth E. Jansen deallocate(amg_A_rhs(level)%p, 65459599516SKenneth E. Jansen & stat=mem_err) 65559599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 65659599516SKenneth E. Jansen endif 65759599516SKenneth E. Jansen if (associated(amg_ilwork(level)%p)) then 65859599516SKenneth E. Jansen deallocate(amg_ilwork(level)%p, 65959599516SKenneth E. Jansen & stat=mem_err) 66059599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 66159599516SKenneth E. Jansen write(*,*)'mcheck deallocate ilwork,',level,myrank 66259599516SKenneth E. Jansen endif 66359599516SKenneth E. Jansen 66459599516SKenneth E. Jansen if (associated(amg_paramap(level)%p)) then 66559599516SKenneth E. Jansen deallocate(amg_paramap(level)%p, 66659599516SKenneth E. Jansen & stat=mem_err) 66759599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 66859599516SKenneth E. Jansen endif 66959599516SKenneth E. Jansen if (associated(amg_paraext(level)%p)) then 67059599516SKenneth E. Jansen deallocate(amg_paraext(level)%p, 67159599516SKenneth E. Jansen & stat=mem_err) 67259599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 67359599516SKenneth E. Jansen endif 67459599516SKenneth E. Jansen 67559599516SKenneth E. Jansen if (mem_err_s .ne. 0 ) then 67659599516SKenneth E. Jansen write(6,7002)level 67759599516SKenneth E. Jansen end if 67859599516SKenneth E. Jansen 67959599516SKenneth E. Jansen if (associated(I_fc_colm(level)%p)) then 68059599516SKenneth E. Jansen deallocate(CF_map(level)%p,stat=mem_err) 68159599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 68259599516SKenneth E. Jansen deallocate(CF_revmap(level)%p,stat=mem_err) 68359599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 68459599516SKenneth E. Jansen deallocate(I_cf_colm(level)%p,stat=mem_err) 68559599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 68659599516SKenneth E. Jansen deallocate(I_cf_rowp(level)%p,stat=mem_err) 68759599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 68859599516SKenneth E. Jansen deallocate(I_cf(level)%p,stat=mem_err) 68959599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 69059599516SKenneth E. Jansen deallocate(I_fc_colm(level)%p,stat=mem_err) 69159599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 69259599516SKenneth E. Jansen deallocate(I_fc_rowp(level)%p,stat=mem_err) 69359599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 69459599516SKenneth E. Jansen deallocate(I_fc(level)%p,stat=mem_err) 69559599516SKenneth E. Jansen mem_err_s = mem_err_s + mem_err 69659599516SKenneth E. Jansen end if 69759599516SKenneth E. Jansen amg_nnz(level) = 0 69859599516SKenneth E. Jansen amg_nshg(level) = 0 69959599516SKenneth E. Jansen7002 format(/' **** ramg: Deallocation error at level',i5) 70059599516SKenneth E. Jansen 70159599516SKenneth E. Jansen return 70259599516SKenneth E. Jansen 70359599516SKenneth E. Jansen end subroutine ! ramg_deallocate 70459599516SKenneth E. Jansen 70559599516SKenneth E. Jansen subroutine ramg_readin_i(iarray,rn1,rfname) 70659599516SKenneth E. Jansen include "common.h" 70759599516SKenneth E. Jansen include "mpif.h" 70859599516SKenneth E. Jansen include "auxmpi.h" 70959599516SKenneth E. Jansen integer rn1 71059599516SKenneth E. Jansen integer,dimension(rn1) :: iarray 71159599516SKenneth E. Jansen character*10 rfname 71259599516SKenneth E. Jansen character*5 cname 71359599516SKenneth E. Jansen 71459599516SKenneth E. Jansen character*20 mfname 71559599516SKenneth E. Jansen 71659599516SKenneth E. Jansen integer i,t 71759599516SKenneth E. Jansen mfname = trim(rfname)//'.dat'//cname(myrank+1) 71859599516SKenneth E. Jansen 71959599516SKenneth E. Jansen write(*,*)'RAMG READ: ',mfname 72059599516SKenneth E. Jansen open(264,file=trim(mfname),status='unknown') 72159599516SKenneth E. Jansen do i=1,rn1 72259599516SKenneth E. Jansen read(264,*)t,iarray(i) 72359599516SKenneth E. Jansen enddo 72459599516SKenneth E. Jansen close(264) 72559599516SKenneth E. Jansen end subroutine ! ramg_readin_i 72659599516SKenneth E. Jansen 72759599516SKenneth E. Jansen 72859599516SKenneth E. Jansen subroutine ramg_dump(rarray,rn1,rfname) 72959599516SKenneth E. Jansen include "common.h" 73059599516SKenneth E. Jansen include "mpif.h" 73159599516SKenneth E. Jansen include "auxmpi.h" 73259599516SKenneth E. Jansen integer rn1 73359599516SKenneth E. Jansen real(kind=8),dimension(rn1) :: rarray 73459599516SKenneth E. Jansen character*10 rfname 73559599516SKenneth E. Jansen character*5 cname 73659599516SKenneth E. Jansen 73759599516SKenneth E. Jansen character*20 mfname 73859599516SKenneth E. Jansen 73959599516SKenneth E. Jansen integer i 74059599516SKenneth E. Jansen mfname = trim(rfname)//'.dat'//cname(myrank+1) 74159599516SKenneth E. Jansen 74259599516SKenneth E. Jansen write(*,*)'RAMG DUMP: ',mfname 74359599516SKenneth E. Jansen open(264,file=trim(mfname),status='unknown') 74459599516SKenneth E. Jansen do i=1,rn1 74559599516SKenneth E. Jansen !write(264,'((I10)(A)(D10.3))')i,' ',rarray(i) 74659599516SKenneth E. Jansen write(264,*)i,rarray(i) 74759599516SKenneth E. Jansen enddo 74859599516SKenneth E. Jansen close(264) 74959599516SKenneth E. Jansen 75059599516SKenneth E. Jansen end subroutine ! ramg_dump 75159599516SKenneth E. Jansen 75259599516SKenneth E. Jansen subroutine ramg_dump_ic(rarray,rn1,rn2,rfname) 75359599516SKenneth E. Jansen include "common.h" 75459599516SKenneth E. Jansen include "mpif.h" 75559599516SKenneth E. Jansen include "auxmpi.h" 75659599516SKenneth E. Jansen integer rn1,rn2 75759599516SKenneth E. Jansen integer,dimension(rn1,rn2) :: rarray 75859599516SKenneth E. Jansen character*10 rfname 75959599516SKenneth E. Jansen character*5 cname 76059599516SKenneth E. Jansen 76159599516SKenneth E. Jansen character*20 mfname 76259599516SKenneth E. Jansen 76359599516SKenneth E. Jansen integer i 76459599516SKenneth E. Jansen mfname = trim(rfname)//'.dat'//cname(myrank+1) 76559599516SKenneth E. Jansen 76659599516SKenneth E. Jansen write(*,*)'RAMG DUMP: ',mfname 76759599516SKenneth E. Jansen open(264,file=trim(mfname),status='unknown') 76859599516SKenneth E. Jansen write(264,*)rn2 76959599516SKenneth E. Jansen do j=1,rn2 77059599516SKenneth E. Jansen write(264,*)j,(rarray(i,j),i=1,rn1) 77159599516SKenneth E. Jansen enddo 77259599516SKenneth E. Jansen close(264) 77359599516SKenneth E. Jansen end subroutine 77459599516SKenneth E. Jansen 77559599516SKenneth E. Jansen subroutine ramg_dump_i(rarray,rn1,rn2,rfname) 77659599516SKenneth E. Jansen include "common.h" 77759599516SKenneth E. Jansen include "mpif.h" 77859599516SKenneth E. Jansen include "auxmpi.h" 77959599516SKenneth E. Jansen integer rn1,rn2 78059599516SKenneth E. Jansen integer,dimension(rn1,rn2) :: rarray 78159599516SKenneth E. Jansen character*10 rfname 78259599516SKenneth E. Jansen character*5 cname 78359599516SKenneth E. Jansen 78459599516SKenneth E. Jansen character*20 mfname 78559599516SKenneth E. Jansen 78659599516SKenneth E. Jansen integer i 78759599516SKenneth E. Jansen mfname = trim(rfname)//'.dat'//cname(myrank+1) 78859599516SKenneth E. Jansen 78959599516SKenneth E. Jansen write(*,*)'RAMG DUMP: ',mfname 79059599516SKenneth E. Jansen open(264,file=trim(mfname),status='unknown') 79159599516SKenneth E. Jansen write(264,*)rn1 79259599516SKenneth E. Jansen do i=1,rn1 79359599516SKenneth E. Jansen write(264,*)i,(rarray(i,j),j=1,rn2) 79459599516SKenneth E. Jansen enddo 79559599516SKenneth E. Jansen close(264) 79659599516SKenneth E. Jansen 79759599516SKenneth E. Jansen end subroutine ! ramg_dump_i 79859599516SKenneth E. Jansen 79959599516SKenneth E. Jansen subroutine ramg_dump_ir(iarray,rarray,rn1,rn2,rfname) 80059599516SKenneth E. Jansen include "common.h" 80159599516SKenneth E. Jansen include "mpif.h" 80259599516SKenneth E. Jansen include "auxmpi.h" 80359599516SKenneth E. Jansen integer rn1,rn2 80459599516SKenneth E. Jansen integer,dimension(rn1) :: iarray 80559599516SKenneth E. Jansen real(kind=8),dimension(rn1,rn2) :: rarray 80659599516SKenneth E. Jansen character*10 rfname 80759599516SKenneth E. Jansen character*5 cname 80859599516SKenneth E. Jansen 80959599516SKenneth E. Jansen character*20 mfname 81059599516SKenneth E. Jansen 81159599516SKenneth E. Jansen character*20 mformat 81259599516SKenneth E. Jansen 81359599516SKenneth E. Jansen integer i 81459599516SKenneth E. Jansen mfname = trim(rfname)//'.dat'//cname(myrank+1) 81559599516SKenneth E. Jansen 81659599516SKenneth E. Jansen write(mformat,'((A6)(I1)(A7))')'((2I)(',rn2,'E14.3))' 81759599516SKenneth E. Jansen mformat = trim(mformat) 81859599516SKenneth E. Jansen write(*,*)'RAMG DUMP: ',mfname 81959599516SKenneth E. Jansen open(264,file=trim(mfname),status='unknown') 82059599516SKenneth E. Jansen do i=1,rn1 82159599516SKenneth E. Jansen write(264,mformat) 82259599516SKenneth E. Jansen & i,iarray(i),(rarray(i,j),j=1,rn2) 82359599516SKenneth E. Jansen enddo 82459599516SKenneth E. Jansen close(264) 82559599516SKenneth E. Jansen 82659599516SKenneth E. Jansen end subroutine ! ramg_dump_ir 82759599516SKenneth E. Jansen 82859599516SKenneth E. Jansen subroutine ramg_dump_rn_map(rarray,rn1,rn2,rfname) 82959599516SKenneth E. Jansen use ramg_data 83059599516SKenneth E. Jansen include "common.h" 83159599516SKenneth E. Jansen include "mpif.h" 83259599516SKenneth E. Jansen include "auxmpi.h" 83359599516SKenneth E. Jansen integer rn1,rn2 83459599516SKenneth E. Jansen real(kind=8),dimension(rn1,rn2) :: rarray 83559599516SKenneth E. Jansen character*10 rfname 83659599516SKenneth E. Jansen character*5 cname 83759599516SKenneth E. Jansen 83859599516SKenneth E. Jansen character*20 mfname 83959599516SKenneth E. Jansen character*20 mformat 84059599516SKenneth E. Jansen 84159599516SKenneth E. Jansen integer i,j,ii 84259599516SKenneth E. Jansen mfname = trim(rfname)//'.dat'//cname(myrank+1) 84359599516SKenneth E. Jansen 84459599516SKenneth E. Jansen write(*,*)'RAMG DUMP: ',mfname 84559599516SKenneth E. Jansen open(264,file=trim(mfname),status='unknown') 84659599516SKenneth E. Jansen write(mformat,'((A6)(I1)(A7))')'((1I)(',rn2,'E14.4))' 84759599516SKenneth E. Jansen mformat=trim(mformat) 84859599516SKenneth E. Jansen do i=1,rn1 84959599516SKenneth E. Jansen if (numpe.gt.1) then 85059599516SKenneth E. Jansen ii = ncorp_map(i) 85159599516SKenneth E. Jansen else 85259599516SKenneth E. Jansen ii = i 85359599516SKenneth E. Jansen endif 85459599516SKenneth E. Jansen write(264,mformat)ii,(rarray(i,j),j=1,rn2) 85559599516SKenneth E. Jansen enddo 85659599516SKenneth E. Jansen close(264) 85759599516SKenneth E. Jansen end subroutine ! ramg_dump_rn_map 85859599516SKenneth E. Jansen 85959599516SKenneth E. Jansen subroutine ramg_dump_rn(rarray,rn1,rn2,rfname) 86059599516SKenneth E. Jansen include "common.h" 86159599516SKenneth E. Jansen include "mpif.h" 86259599516SKenneth E. Jansen include "auxmpi.h" 86359599516SKenneth E. Jansen integer rn1,rn2 86459599516SKenneth E. Jansen real(kind=8),dimension(rn1,rn2) :: rarray 86559599516SKenneth E. Jansen character*10 rfname 86659599516SKenneth E. Jansen character*5 cname 86759599516SKenneth E. Jansen 86859599516SKenneth E. Jansen character*20 mfname 86959599516SKenneth E. Jansen character*20 mformat 87059599516SKenneth E. Jansen 87159599516SKenneth E. Jansen integer i,j 87259599516SKenneth E. Jansen mfname = trim(rfname)//'.dat'//cname(myrank+1) 87359599516SKenneth E. Jansen 87459599516SKenneth E. Jansen write(*,*)'RAMG DUMP: ',mfname 87559599516SKenneth E. Jansen open(264,file=trim(mfname),status='unknown') 87659599516SKenneth E. Jansen write(mformat,'((A6)(I1)(A7))')'((1I)(',rn2,'E14.4))' 87759599516SKenneth E. Jansen mformat=trim(mformat) 87859599516SKenneth E. Jansen do i=1,rn1 87959599516SKenneth E. Jansen write(264,mformat)i,(rarray(i,j),j=1,rn2) 88059599516SKenneth E. Jansen enddo 88159599516SKenneth E. Jansen close(264) 88259599516SKenneth E. Jansen 88359599516SKenneth E. Jansen end subroutine ! ramg_dump_rn 88459599516SKenneth E. Jansen 88559599516SKenneth E. Jansen subroutine ramg_dump_matlab_A(acolm,arowp,alhs,an,annz,redun, 88659599516SKenneth E. Jansen & fname) 88759599516SKenneth E. Jansen 88859599516SKenneth E. Jansen use ramg_data 88959599516SKenneth E. Jansen include "common.h" 89059599516SKenneth E. Jansen include "mpif.h" 89159599516SKenneth E. Jansen include "auxmpi.h" 89259599516SKenneth E. Jansen 89359599516SKenneth E. Jansen integer :: an,annz,redun 89459599516SKenneth E. Jansen integer,dimension(an+1) :: acolm 89559599516SKenneth E. Jansen integer,dimension(annz) :: arowp 89659599516SKenneth E. Jansen real(kind=8),dimension(redun,annz) :: alhs 89759599516SKenneth E. Jansen character fname*10,mtxname*5 89859599516SKenneth E. Jansen character cname*5 89959599516SKenneth E. Jansen 90059599516SKenneth E. Jansen character mfname*15,mAname*5 90159599516SKenneth E. Jansen character mformat*20 90259599516SKenneth E. Jansen 90359599516SKenneth E. Jansen integer i,j,p,k 90459599516SKenneth E. Jansen 90559599516SKenneth E. Jansen mfname = trim(fname)//'.dat'//cname(myrank+1) 90659599516SKenneth E. Jansen 90759599516SKenneth E. Jansen write(*,*)'RAMG Dump to matlab ',mfname,myrank 90859599516SKenneth E. Jansen open(264,file=trim(mfname),status='unknown') 90959599516SKenneth E. Jansen !write(264,*)an 91059599516SKenneth E. Jansen !write(264,*)annz 91159599516SKenneth E. Jansen !write(264,*)'1' 91259599516SKenneth E. Jansen write(mformat,'((A6)(I1)(A7))')'((2I)(',redun,'E14.4))' 91359599516SKenneth E. Jansen do i=1,an 91459599516SKenneth E. Jansen do p=acolm(i),acolm(i+1)-1 91559599516SKenneth E. Jansen j = arowp(p) 91659599516SKenneth E. Jansen !write(264,"((I6)(I7)(A)(E8.2))")i,j,' ',alhs(p) 91759599516SKenneth E. Jansen! if ( (amg_paramap(1)%p(i).eq.amg_paramap(2)%p(j)).and. 91859599516SKenneth E. Jansen! if (iabs(amg_paramap(1)%p(i)).ne.(myrank+1)) then 91959599516SKenneth E. Jansen! & (amg_paramap(1)%p(i).ne.1)) then 92059599516SKenneth E. Jansen write(264,mformat)i,j,(alhs(k,p),k=1,redun) 92159599516SKenneth E. Jansen! endif 92259599516SKenneth E. Jansen enddo 92359599516SKenneth E. Jansen enddo 92459599516SKenneth E. Jansen close(264) 92559599516SKenneth E. Jansen end subroutine 92659599516SKenneth E. Jansen 92759599516SKenneth E. Jansen subroutine ramg_dump_matlab_map(acolm,arowp,alhs,an,annz,redun, 92859599516SKenneth E. Jansen & fname) 92959599516SKenneth E. Jansen use ramg_data 93059599516SKenneth E. Jansen include "common.h" 93159599516SKenneth E. Jansen include "mpif.h" 93259599516SKenneth E. Jansen include "auxmpi.h" 93359599516SKenneth E. Jansen 93459599516SKenneth E. Jansen integer :: an,annz,redun 93559599516SKenneth E. Jansen integer,dimension(an+1) :: acolm 93659599516SKenneth E. Jansen integer,dimension(annz) :: arowp 93759599516SKenneth E. Jansen real(kind=8),dimension(redun,annz) :: alhs 93859599516SKenneth E. Jansen !integer,dimension(an) :: ipmap 93959599516SKenneth E. Jansen character fname*10 94059599516SKenneth E. Jansen 94159599516SKenneth E. Jansen character mfname*20 94259599516SKenneth E. Jansen character cname*5 94359599516SKenneth E. Jansen character mformat*20 94459599516SKenneth E. Jansen 94559599516SKenneth E. Jansen integer i,j,p,k 94659599516SKenneth E. Jansen integer ii,jj 94759599516SKenneth E. Jansen 94859599516SKenneth E. Jansen if (numpe.eq.1) then 94959599516SKenneth E. Jansen call ramg_dump_matlab_A(acolm,arowp,alhs,an,annz,redun, 95059599516SKenneth E. Jansen & fname) 95159599516SKenneth E. Jansen return; 95259599516SKenneth E. Jansen endif 95359599516SKenneth E. Jansen 95459599516SKenneth E. Jansen mfname = trim(fname)//'.dat'//cname(myrank+1) 95559599516SKenneth E. Jansen 95659599516SKenneth E. Jansen write(*,*)'RAMG Dump to matlab ',mfname,nshg,myrank 95759599516SKenneth E. Jansen open(264,file=trim(mfname),status='unknown') 95859599516SKenneth E. Jansen !write(264,*)an 95959599516SKenneth E. Jansen !write(264,*)annz 96059599516SKenneth E. Jansen !write(264,*)'1' 96159599516SKenneth E. Jansen write(mformat,'((A6)(I1)(A7))')'((2I)(',redun,'E14.4))' 96259599516SKenneth E. Jansen !call ramg_dump_i(ncorp_map,nshg,1,'pam_corp ') 96359599516SKenneth E. Jansen do i=1,an 96459599516SKenneth E. Jansen ii = ncorp_map(i)!ipmap(i)) 96559599516SKenneth E. Jansen do p=acolm(i),acolm(i+1)-1 96659599516SKenneth E. Jansen j = arowp(p) 96759599516SKenneth E. Jansen jj = ncorp_map(j)!ipmap(j)) 96859599516SKenneth E. Jansen !write(264,"((I6)(I7)(A)(E8.2))")i,j,' ',alhs(p) 96959599516SKenneth E. Jansen write(264,mformat)ii,jj,(alhs(k,p),k=1,redun) 97059599516SKenneth E. Jansen enddo 97159599516SKenneth E. Jansen enddo 97259599516SKenneth E. Jansen close(264) 97359599516SKenneth E. Jansen end subroutine 97459599516SKenneth E. Jansen 97559599516SKenneth E. Jansen 97659599516SKenneth E. Jansen subroutine ramg_dump_mupad_A(acolm,arowp,alhs,an,annz, 97759599516SKenneth E. Jansen & fname,mtxname) 97859599516SKenneth E. Jansen integer :: an,annz 97959599516SKenneth E. Jansen integer,dimension(an+1) :: acolm 98059599516SKenneth E. Jansen integer,dimension(annz) :: arowp 98159599516SKenneth E. Jansen real(kind=8),dimension(annz) :: alhs 98259599516SKenneth E. Jansen character fname*10,mtxname*5 98359599516SKenneth E. Jansen 98459599516SKenneth E. Jansen character mfname*15,mAname*5 98559599516SKenneth E. Jansen 98659599516SKenneth E. Jansen integer i,j,p,k 98759599516SKenneth E. Jansen 98859599516SKenneth E. Jansen mfname = trim(fname)//'.mws' 98959599516SKenneth E. Jansen mAname = trim(mtxname) 99059599516SKenneth E. Jansen 99159599516SKenneth E. Jansen write(*,*)'RAMG Dump to Mupad ',mfname 99259599516SKenneth E. Jansen open(264,file=trim(mfname),status='unknown') 99359599516SKenneth E. Jansen write(264,*)mAname,':= matrix(',an,',',an,'):' 99459599516SKenneth E. Jansen do i=1,an 99559599516SKenneth E. Jansen do p=acolm(i),acolm(i+1)-1 99659599516SKenneth E. Jansen j = arowp(p) 99759599516SKenneth E. Jansen write(264,*)mAname,'[',i,',',j,']:=',alhs(p),':' 99859599516SKenneth E. Jansen enddo 99959599516SKenneth E. Jansen enddo 100059599516SKenneth E. Jansen close(264) 100159599516SKenneth E. Jansen 100259599516SKenneth E. Jansen end subroutine 100359599516SKenneth E. Jansen 100459599516SKenneth E. Jansen subroutine ramg_print_time(str,v) 100559599516SKenneth E. Jansen 100659599516SKenneth E. Jansen include "common.h" 100759599516SKenneth E. Jansen include "mpif.h" 100859599516SKenneth E. Jansen include "auxmpi.h" 100959599516SKenneth E. Jansen 101059599516SKenneth E. Jansen character*(*) str 101159599516SKenneth E. Jansen real(kind=8) :: v,vave,vmax 101259599516SKenneth E. Jansen 101359599516SKenneth E. Jansen if (numpe.gt.1) then 101459599516SKenneth E. Jansen call MPI_AllReduce(v,vmax,1, 101559599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_MAX,MPI_COMM_WORLD,ierr) 101659599516SKenneth E. Jansen call MPI_AllReduce(v,vave,1, 101759599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,ierr) 101859599516SKenneth E. Jansen vave = vave/numpe 101959599516SKenneth E. Jansen else 102059599516SKenneth E. Jansen vave = v 102159599516SKenneth E. Jansen vmax = v 102259599516SKenneth E. Jansen endif 102359599516SKenneth E. Jansen 102459599516SKenneth E. Jansen if ((iamg_verb.gt.1).and.(myrank.eq.master)) then 102559599516SKenneth E. Jansen write(*,7101)trim(str),vave,vmax 102659599516SKenneth E. Jansen7101 format(T1,A,T40,f9.2,' s (ave), ',f9.2,' s (max)') 102759599516SKenneth E. Jansen endif 102859599516SKenneth E. Jansen 102959599516SKenneth E. Jansen end subroutine 103059599516SKenneth E. Jansen 103159599516SKenneth E. Jansen subroutine ramg_output_coarsening 103259599516SKenneth E. Jansen use readarrays 103359599516SKenneth E. Jansen use ramg_data 103459599516SKenneth E. Jansen include "common.h" 103559599516SKenneth E. Jansen include "mpif.h" 103659599516SKenneth E. Jansen 103759599516SKenneth E. Jansen character*20 mfname 103859599516SKenneth E. Jansen character*20 mformat 103959599516SKenneth E. Jansen 104059599516SKenneth E. Jansen integer i 104159599516SKenneth E. Jansen 104259599516SKenneth E. Jansen write(*,*)'ramg dump coarsening' 104359599516SKenneth E. Jansen mfname = 'amgcoarsen.dat' 104459599516SKenneth E. Jansen open(265,file=trim(mfname),status='unknown') 104559599516SKenneth E. Jansen write(265,*)nshg 104659599516SKenneth E. Jansen do i=1,nshg 104759599516SKenneth E. Jansen write(265,'((2I)(3E14.5))')i,amg_cfmap(i), 104859599516SKenneth E. Jansen & point2x(i,1),point2x(i,2),point2x(i,3) 104959599516SKenneth E. Jansen enddo 105059599516SKenneth E. Jansen close(265) 105159599516SKenneth E. Jansen 105259599516SKenneth E. Jansen end subroutine 105359599516SKenneth E. Jansen 105459599516SKenneth E. Jansen!*********************************************************** 105559599516SKenneth E. Jansen! <EOF> ramg TOOLS 105659599516SKenneth E. Jansen!********************************************************** 1057