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