xref: /phasta/phSolver/AMG/ramg_tools.f (revision 7acde132a6def0fe2daaec0d1a712dff0e5c6636)
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