xref: /phasta/phSolver/AMG/ramg_ggb.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen      subroutine ramg_ggb_setup(colm,rowp,lhsK,lhsP,
2*59599516SKenneth E. Jansen     &                          ilwork,BC,iBC,iper)
3*59599516SKenneth E. Jansen
4*59599516SKenneth E. Jansen      use ramg_data
5*59599516SKenneth E. Jansen      include "common.h"
6*59599516SKenneth E. Jansen      include "mpif.h"
7*59599516SKenneth E. Jansen      include "auxmpi.h"
8*59599516SKenneth E. Jansen      include 'debug.h'
9*59599516SKenneth E. Jansen
10*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg+1)       :: colm
11*59599516SKenneth E. Jansen      integer,intent(in),dimension(nnz_tot)      :: rowp
12*59599516SKenneth E. Jansen
13*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(9,nnz_tot)  :: lhsK
14*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(4,nnz_tot)  :: lhsP
15*59599516SKenneth E. Jansen
16*59599516SKenneth E. Jansen      integer,intent(in),dimension(nlwork)      :: ilwork
17*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg)        :: iBC,iper
18*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(nshg,ndofBC) :: BC
19*59599516SKenneth E. Jansen      integer   iparam(11),ipntr(14)
20*59599516SKenneth E. Jansen
21*59599516SKenneth E. Jansen      integer gcomm
22*59599516SKenneth E. Jansen
23*59599516SKenneth E. Jansen      logical   selectncv(maxncv)
24*59599516SKenneth E. Jansen      real(kind=8) :: d(maxncv,3),dr(maxncv),di(maxncv),
25*59599516SKenneth E. Jansen     &                workev(3*maxncv),
26*59599516SKenneth E. Jansen     &                workl(3*maxncv*maxncv+6*maxncv)
27*59599516SKenneth E. Jansen
28*59599516SKenneth E. Jansen      real(kind=8),allocatable,dimension(:) ::  resid,workd
29*59599516SKenneth E. Jansen
30*59599516SKenneth E. Jansen      character  bmat*1,which*2
31*59599516SKenneth E. Jansen      integer   :: ido,n,nx,nev,ncv,lworkl,info,ierr,
32*59599516SKenneth E. Jansen     &             i,j,ishifts,maxitr,model,nconv
33*59599516SKenneth E. Jansen      real(kind=8)  :: tol,sigmar,sigmai
34*59599516SKenneth E. Jansen      logical     ::  first,rvec
35*59599516SKenneth E. Jansen
36*59599516SKenneth E. Jansen      real(kind=8) :: rtemp,tnorm,tnorm1
37*59599516SKenneth E. Jansen      real(kind=8),allocatable,dimension(:) :: tv,tw
38*59599516SKenneth E. Jansen      real(kind=8),allocatable,dimension(:,:):: teA,tramg_ev
39*59599516SKenneth E. Jansen
40*59599516SKenneth E. Jansen      integer,allocatable,dimension(:) :: gmap,grevmap
41*59599516SKenneth E. Jansen
42*59599516SKenneth E. Jansen      integer :: p,q,nsize,step,asize,gsize
43*59599516SKenneth E. Jansen      character fname*20
44*59599516SKenneth E. Jansen
45*59599516SKenneth E. Jansen      if (maxnev.le.0) return
46*59599516SKenneth E. Jansen      if (ramg_setup_flag.ne.0) return
47*59599516SKenneth E. Jansen
48*59599516SKenneth E. Jansen      if (numpe.gt.1) then
49*59599516SKenneth E. Jansen          call MPI_Barrier(MPI_COMM_WORLD,ierr)
50*59599516SKenneth E. Jansen      end if
51*59599516SKenneth E. Jansen
52*59599516SKenneth E. Jansen      asize = amg_nshg(1)
53*59599516SKenneth E. Jansen      allocate(gmap(asize))
54*59599516SKenneth E. Jansen      allocate(grevmap(asize))
55*59599516SKenneth E. Jansen
56*59599516SKenneth E. Jansen      call ramg_generate_gmap(ilwork,asize,nsize,gmap,grevmap,1)
57*59599516SKenneth E. Jansen
58*59599516SKenneth E. Jansen      call MPI_AllReduce(nsize,gsize,1,MPI_INTEGER,MPI_MAX,
59*59599516SKenneth E. Jansen     &                   MPI_COMM_WORLD,ierr)
60*59599516SKenneth E. Jansen
61*59599516SKenneth E. Jansen      !write(*,*)'mcheck ggb:',myrank,asize,nsize,gsize
62*59599516SKenneth E. Jansen
63*59599516SKenneth E. Jansen      allocate(resid(gsize))
64*59599516SKenneth E. Jansen      allocate(workd(3*gsize))
65*59599516SKenneth E. Jansen      !***********   Start of Parameter setting *******
66*59599516SKenneth E. Jansen
67*59599516SKenneth E. Jansen      ndigit = -3
68*59599516SKenneth E. Jansen      logfil = 6
69*59599516SKenneth E. Jansen      mnaitr = 0
70*59599516SKenneth E. Jansen      mnapps = 0
71*59599516SKenneth E. Jansen      mnaupd = 1 ! controls the output (verbose) mode
72*59599516SKenneth E. Jansen      mnaup2 = 0
73*59599516SKenneth E. Jansen      mneigh = 0
74*59599516SKenneth E. Jansen      mneupd = 1
75*59599516SKenneth E. Jansen
76*59599516SKenneth E. Jansen      nev = maxnev
77*59599516SKenneth E. Jansen      ncv = maxncv
78*59599516SKenneth E. Jansen      bmat = 'I'
79*59599516SKenneth E. Jansen      which = 'LM'
80*59599516SKenneth E. Jansen
81*59599516SKenneth E. Jansen      lworkl = 3*ncv**2+6*ncv
82*59599516SKenneth E. Jansen      tol = 1.0E-3
83*59599516SKenneth E. Jansen      ido = 0
84*59599516SKenneth E. Jansen      info = 0
85*59599516SKenneth E. Jansen
86*59599516SKenneth E. Jansen      iparam(1) = 1
87*59599516SKenneth E. Jansen      iparam(3) = 500
88*59599516SKenneth E. Jansen      iparam(7) = 1
89*59599516SKenneth E. Jansen
90*59599516SKenneth E. Jansen      !********** End of parameter setting ********
91*59599516SKenneth E. Jansen
92*59599516SKenneth E. Jansen      allocate(tramg_ev(nsize,maxncv))
93*59599516SKenneth E. Jansen      allocate(tv(asize))
94*59599516SKenneth E. Jansen      allocate(tw(asize))
95*59599516SKenneth E. Jansen
96*59599516SKenneth E. Jansen      step = 1
97*59599516SKenneth E. Jansen      if (myrank.eq.master) then
98*59599516SKenneth E. Jansen      write(*,*)'AMG GGB: calculating eigenvalue/vectors'
99*59599516SKenneth E. Jansen      endif
100*59599516SKenneth E. Jansen      tramg_ev = 0
101*59599516SKenneth E. Jansen      gcomm = MPI_COMM_WORLD
102*59599516SKenneth E. Jansen
103*59599516SKenneth E. Jansen      call pdnaupd(gcomm,
104*59599516SKenneth E. Jansen     &               ido,bmat,nsize,which,nev,tol,resid,ncv,
105*59599516SKenneth E. Jansen     &               tramg_ev,
106*59599516SKenneth E. Jansen     &               nsize,iparam,ipntr,workd,workl,lworkl,
107*59599516SKenneth E. Jansen     &               info)
108*59599516SKenneth E. Jansen      do while ((ido.eq.1).or.(ido.eq.-1))
109*59599516SKenneth E. Jansen         call ramg_ggb_av(workd(ipntr(2)),workd(ipntr(1)),
110*59599516SKenneth E. Jansen     &                     asize,nsize,gmap,grevmap,
111*59599516SKenneth E. Jansen     &                     1,
112*59599516SKenneth E. Jansen     &                     colm,rowp,lhsK,lhsP,ilwork,BC,iBC,iper)
113*59599516SKenneth E. Jansen         call pdnaupd(gcomm,
114*59599516SKenneth E. Jansen     &               ido,bmat,nsize,which,nev,tol,resid,ncv,
115*59599516SKenneth E. Jansen     &               tramg_ev,
116*59599516SKenneth E. Jansen     &               nsize,iparam,ipntr,workd,workl,lworkl,
117*59599516SKenneth E. Jansen     &               info)
118*59599516SKenneth E. Jansen         step = step + 1
119*59599516SKenneth E. Jansen      enddo
120*59599516SKenneth E. Jansen      !write(*,*)'mcheck: ggb over pdnaupd'
121*59599516SKenneth E. Jansen
122*59599516SKenneth E. Jansen      if (info.lt.0) then
123*59599516SKenneth E. Jansen          write(*,*)'mcheck: ggb: info:',info
124*59599516SKenneth E. Jansen      else
125*59599516SKenneth E. Jansen          rvec = .false.
126*59599516SKenneth E. Jansen          call pdneupd (gcomm,rvec,'A',selectncv,dr,di,
127*59599516SKenneth E. Jansen     &         tramg_ev,nsize,
128*59599516SKenneth E. Jansen     &         sigmar,sigmai,workev,bmat,nsize,which,nev,tol,
129*59599516SKenneth E. Jansen     &         resid,ncv,tramg_ev,
130*59599516SKenneth E. Jansen     &         nsize,iparam,ipntr,workd,workl,
131*59599516SKenneth E. Jansen     &         lworkl,ierr)
132*59599516SKenneth E. Jansen          !write(*,*)'mcheck:ggb:',ierr,'iconv:',iparam(5)
133*59599516SKenneth E. Jansen      end if
134*59599516SKenneth E. Jansen
135*59599516SKenneth E. Jansen      allocate(ramg_ggb_ev(asize,maxnev))
136*59599516SKenneth E. Jansen      do i=1,maxnev
137*59599516SKenneth E. Jansen        call ramg_ggb_G2A(ramg_ggb_ev(:,i),tramg_ev(:,i),
138*59599516SKenneth E. Jansen     &                    asize,nsize,1,gmap,grevmap)
139*59599516SKenneth E. Jansen      enddo
140*59599516SKenneth E. Jansen
141*59599516SKenneth E. Jansen
142*59599516SKenneth E. Jansen      ! Set matrix eA for GGB V-cycle
143*59599516SKenneth E. Jansen
144*59599516SKenneth E. Jansen      allocate(ramg_ggb_eA(maxnev,maxnev))
145*59599516SKenneth E. Jansen      allocate(teA(asize,maxnev))
146*59599516SKenneth E. Jansen
147*59599516SKenneth E. Jansen      ramg_ggb_eA = 0
148*59599516SKenneth E. Jansen      teA = 0
149*59599516SKenneth E. Jansen
150*59599516SKenneth E. Jansen      do i=1,maxnev
151*59599516SKenneth E. Jansen         call ramg_calcAv_g(1,teA(:,i),ramg_ggb_ev(:,i),
152*59599516SKenneth E. Jansen     &                      colm,rowp,lhsK,lhsP,
153*59599516SKenneth E. Jansen     &                      ilwork,BC,iBC,iper,1)
154*59599516SKenneth E. Jansen      enddo
155*59599516SKenneth E. Jansen      do i=1,maxnev
156*59599516SKenneth E. Jansen            do j=1,maxnev
157*59599516SKenneth E. Jansen               do p=1,asize
158*59599516SKenneth E. Jansen                  ramg_ggb_eA(j,i) = ramg_ggb_eA(j,i) +
159*59599516SKenneth E. Jansen     &            ramg_ggb_ev(p,j)*teA(p,i)
160*59599516SKenneth E. Jansen               enddo
161*59599516SKenneth E. Jansen            enddo
162*59599516SKenneth E. Jansen      enddo
163*59599516SKenneth E. Jansen
164*59599516SKenneth E. Jansen      ! communicate to complete GGB matrix
165*59599516SKenneth E. Jansen      if (numpe.gt.1) then
166*59599516SKenneth E. Jansen         call MPI_Barrier(MPI_COMM_WORLD,ierr)
167*59599516SKenneth E. Jansen         do i=1,maxnev
168*59599516SKenneth E. Jansen            do j=1,maxnev
169*59599516SKenneth E. Jansen           call MPI_Allreduce(ramg_ggb_eA(j,i),rtemp,1,
170*59599516SKenneth E. Jansen     &          MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,ierr)
171*59599516SKenneth E. Jansen           ramg_ggb_eA(j,i) = rtemp
172*59599516SKenneth E. Jansen            enddo
173*59599516SKenneth E. Jansen          enddo
174*59599516SKenneth E. Jansen      end if
175*59599516SKenneth E. Jansen
176*59599516SKenneth E. Jansen      !call MPI_Barrier(MPI_COMM_WORLD,ierr)
177*59599516SKenneth E. Jansen
178*59599516SKenneth E. Jansen      deallocate(teA)
179*59599516SKenneth E. Jansen
180*59599516SKenneth E. Jansen      deallocate(tramg_ev)
181*59599516SKenneth E. Jansen      deallocate(tv)
182*59599516SKenneth E. Jansen      deallocate(tw)
183*59599516SKenneth E. Jansen      deallocate(gmap)
184*59599516SKenneth E. Jansen      deallocate(grevmap)
185*59599516SKenneth E. Jansen      deallocate(resid)
186*59599516SKenneth E. Jansen      deallocate(workd)
187*59599516SKenneth E. Jansen
188*59599516SKenneth E. Jansen      ramg_time(11:30) = 0
189*59599516SKenneth E. Jansen      !write(*,*)'mcheck: over at g-cycle'
190*59599516SKenneth E. Jansen
191*59599516SKenneth E. Jansen      end subroutine !ramg_ggb_setup
192*59599516SKenneth E. Jansen
193*59599516SKenneth E. Jansen      subroutine ramg_generate_gmap(ilwork,asize,nsize,gmap,grevmap,
194*59599516SKenneth E. Jansen     &           level)
195*59599516SKenneth E. Jansen
196*59599516SKenneth E. Jansen      use ramg_data
197*59599516SKenneth E. Jansen      include "common.h"
198*59599516SKenneth E. Jansen      include "mpif.h"
199*59599516SKenneth E. Jansen      include "auxmpi.h"
200*59599516SKenneth E. Jansen
201*59599516SKenneth E. Jansen      integer,intent(inout) :: nsize
202*59599516SKenneth E. Jansen      integer,intent(in),dimension(nlwork) :: ilwork
203*59599516SKenneth E. Jansen      integer,intent(in) :: asize
204*59599516SKenneth E. Jansen      integer,intent(inout),dimension(asize) :: gmap,grevmap
205*59599516SKenneth E. Jansen      integer,intent(in) :: level
206*59599516SKenneth E. Jansen
207*59599516SKenneth E. Jansen      integer  :: numtask,i,j,k,m,p,newn
208*59599516SKenneth E. Jansen      integer  :: itag,iacc,iother,numseg,isgbeg,itkbeg
209*59599516SKenneth E. Jansen      integer,allocatable,dimension(:) :: neimap
210*59599516SKenneth E. Jansen
211*59599516SKenneth E. Jansen      do i=1,asize
212*59599516SKenneth E. Jansen         gmap(i) = i
213*59599516SKenneth E. Jansen         grevmap(i) = i
214*59599516SKenneth E. Jansen      enddo
215*59599516SKenneth E. Jansen
216*59599516SKenneth E. Jansen      if (numpe.le.1) then
217*59599516SKenneth E. Jansen          nsize = asize
218*59599516SKenneth E. Jansen          return
219*59599516SKenneth E. Jansen      end if
220*59599516SKenneth E. Jansen
221*59599516SKenneth E. Jansen      numtask = ilwork(1)
222*59599516SKenneth E. Jansen      m = 0
223*59599516SKenneth E. Jansen      itkbeg = 1
224*59599516SKenneth E. Jansen      allocate(neimap(numpe))
225*59599516SKenneth E. Jansen      neimap = 0
226*59599516SKenneth E. Jansen
227*59599516SKenneth E. Jansen      newn = 0
228*59599516SKenneth E. Jansen
229*59599516SKenneth E. Jansen      do i=1,numtask
230*59599516SKenneth E. Jansen         m = m+1
231*59599516SKenneth E. Jansen         itag = ilwork(itkbeg+1)
232*59599516SKenneth E. Jansen         iacc = ilwork(itkbeg+2)
233*59599516SKenneth E. Jansen         iother = ilwork(itkbeg+3)
234*59599516SKenneth E. Jansen         numseg = ilwork(itkbeg+4)
235*59599516SKenneth E. Jansen         isgbeg = ilwork(itkbeg+5)
236*59599516SKenneth E. Jansen         if (iacc.eq.0) then !slave
237*59599516SKenneth E. Jansen             neimap(iother+1) = 1
238*59599516SKenneth E. Jansen!             do j=1,numseg
239*59599516SKenneth E. Jansen!                k = ilwork(itkbeg+3+2*j)
240*59599516SKenneth E. Jansen!                gmap(k) = -iother
241*59599516SKenneth E. Jansen!             enddo
242*59599516SKenneth E. Jansen         end if
243*59599516SKenneth E. Jansen         m = m + 1
244*59599516SKenneth E. Jansen         itkbeg = itkbeg + 4 + 2*numseg
245*59599516SKenneth E. Jansen      enddo
246*59599516SKenneth E. Jansen
247*59599516SKenneth E. Jansen      k = 1
248*59599516SKenneth E. Jansen      do i=1,asize
249*59599516SKenneth E. Jansen         m = iabs(amg_paramap(level)%p(i))
250*59599516SKenneth E. Jansen         if (neimap(m).eq.0) then ! self or master
251*59599516SKenneth E. Jansen            gmap(i) = k
252*59599516SKenneth E. Jansen            grevmap(k) = i
253*59599516SKenneth E. Jansen            k = k+1
254*59599516SKenneth E. Jansen         end if
255*59599516SKenneth E. Jansen      enddo
256*59599516SKenneth E. Jansen      nsize = k-1
257*59599516SKenneth E. Jansen      deallocate(neimap)
258*59599516SKenneth E. Jansen
259*59599516SKenneth E. Jansen      !write(*,*)'mcheck gmap,',myrank,asize,nsize
260*59599516SKenneth E. Jansen
261*59599516SKenneth E. Jansen      !call ramg_dump_i(gmap,asize,1,'gmapdump  ')
262*59599516SKenneth E. Jansen      !call ramg_dump_i(grevmap,asize,1,'grevmap   ')
263*59599516SKenneth E. Jansen
264*59599516SKenneth E. Jansen      end subroutine !ramg_generate_gmap
265*59599516SKenneth E. Jansen
266*59599516SKenneth E. Jansen      subroutine ramg_ggb_av(
267*59599516SKenneth E. Jansen     &               gramg_sol,gramg_rhs,
268*59599516SKenneth E. Jansen     &               asize,nsize,gmap,grevmap,
269*59599516SKenneth E. Jansen     &               clevel,
270*59599516SKenneth E. Jansen     &      colm,rowp,lhsK,lhsP,ilwork,BC,iBC,iper
271*59599516SKenneth E. Jansen     &           )
272*59599516SKenneth E. Jansen      use ramg_data
273*59599516SKenneth E. Jansen      include "common.h"
274*59599516SKenneth E. Jansen      include "mpif.h"
275*59599516SKenneth E. Jansen
276*59599516SKenneth E. Jansen      !arguments
277*59599516SKenneth E. Jansen      integer, intent(in)         :: asize,nsize
278*59599516SKenneth E. Jansen      integer, intent(in)         :: clevel
279*59599516SKenneth E. Jansen      real(kind=8),intent(inout),dimension(nsize)
280*59599516SKenneth E. Jansen     &               :: gramg_sol
281*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(nsize) :: gramg_rhs
282*59599516SKenneth E. Jansen      integer, intent(in),dimension(asize) :: gmap,grevmap
283*59599516SKenneth E. Jansen
284*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg+1)       :: colm
285*59599516SKenneth E. Jansen      integer,intent(in),dimension(nnz_tot)      :: rowp
286*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(9,nnz_tot)  :: lhsK
287*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(4,nnz_tot)  :: lhsP
288*59599516SKenneth E. Jansen      integer,intent(in),dimension(nlwork)          :: ilwork
289*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg)            :: iBC,iper
290*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(nshg,ndofBC) :: BC
291*59599516SKenneth E. Jansen
292*59599516SKenneth E. Jansen      !local
293*59599516SKenneth E. Jansen      real(kind=8),dimension(amg_nshg(clevel)) :: vF
294*59599516SKenneth E. Jansen      real(kind=8),dimension(asize) :: ramg_sol,ramg_rhs
295*59599516SKenneth E. Jansen
296*59599516SKenneth E. Jansen      call ramg_ggb_G2A(ramg_rhs,gramg_rhs,asize,nsize,1,gmap,grevmap)
297*59599516SKenneth E. Jansen
298*59599516SKenneth E. Jansen      vF = 0
299*59599516SKenneth E. Jansen
300*59599516SKenneth E. Jansen      call ramg_calcAv_g(clevel,vF,ramg_rhs,colm,rowp,lhsK,lhsP,
301*59599516SKenneth E. Jansen     &                   ilwork,BC,iBC,iper,1)
302*59599516SKenneth E. Jansen
303*59599516SKenneth E. Jansen      call ramg_V_cycle(ramg_sol,vF,1,
304*59599516SKenneth E. Jansen     &                  colm,rowp,lhsK,lhsP,ilwork,BC,iBC,iper)
305*59599516SKenneth E. Jansen      ramg_sol = ramg_rhs-ramg_sol
306*59599516SKenneth E. Jansen
307*59599516SKenneth E. Jansen      call ramg_ggb_A2G(ramg_sol,gramg_sol,asize,nsize,1,
308*59599516SKenneth E. Jansen     &                  gmap,grevmap)
309*59599516SKenneth E. Jansen
310*59599516SKenneth E. Jansen      end subroutine !ramg_ggb_av
311*59599516SKenneth E. Jansen
312*59599516SKenneth E. Jansen
313*59599516SKenneth E. Jansen      subroutine ramg_G_cycle(
314*59599516SKenneth E. Jansen     &               ramg_sol,ramg_rhs,
315*59599516SKenneth E. Jansen     &               clevel,
316*59599516SKenneth E. Jansen     &      colm,rowp,lhsK,lhsP,ilwork,BC,iBC,iper
317*59599516SKenneth E. Jansen     &           )
318*59599516SKenneth E. Jansen      use ramg_data
319*59599516SKenneth E. Jansen      include "common.h"
320*59599516SKenneth E. Jansen      include "mpif.h"
321*59599516SKenneth E. Jansen
322*59599516SKenneth E. Jansen      !arguments
323*59599516SKenneth E. Jansen      integer, intent(in)         :: clevel
324*59599516SKenneth E. Jansen      real(kind=8),intent(inout),dimension(amg_nshg(clevel))
325*59599516SKenneth E. Jansen     &               :: ramg_sol,ramg_rhs
326*59599516SKenneth E. Jansen
327*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg+1)       :: colm
328*59599516SKenneth E. Jansen      integer,intent(in),dimension(nnz_tot)      :: rowp
329*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(9,nnz_tot)  :: lhsK
330*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(4,nnz_tot)  :: lhsP
331*59599516SKenneth E. Jansen      integer,intent(in),dimension(nlwork)          :: ilwork
332*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg)            :: iBC,iper
333*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(nshg,ndofBC) :: BC
334*59599516SKenneth E. Jansen
335*59599516SKenneth E. Jansen      !local
336*59599516SKenneth E. Jansen      real(kind=8),dimension(maxnev) :: vR,rtemp
337*59599516SKenneth E. Jansen      real(kind=8),dimension(amg_nshg(clevel)) :: ggberr
338*59599516SKenneth E. Jansen      real(kind=8),dimension(maxnev,maxnev) :: mtxggbA
339*59599516SKenneth E. Jansen      integer,dimension(maxnev) :: indx
340*59599516SKenneth E. Jansen      real(kind=8) :: d
341*59599516SKenneth E. Jansen      integer :: i,j
342*59599516SKenneth E. Jansen
343*59599516SKenneth E. Jansen      if (maxnev.le.0) return
344*59599516SKenneth E. Jansen
345*59599516SKenneth E. Jansen!      ggberr = 0
346*59599516SKenneth E. Jansen      call ramg_calcAv_g(clevel,ggberr,ramg_sol,colm,rowp,lhsK,lhsP,
347*59599516SKenneth E. Jansen     &                   ilwork,BC,iBC,iper,1)
348*59599516SKenneth E. Jansen      ggberr = ggberr - ramg_rhs
349*59599516SKenneth E. Jansen
350*59599516SKenneth E. Jansen      ! restriction
351*59599516SKenneth E. Jansen      vR = 0
352*59599516SKenneth E. Jansen      do i=1,maxnev
353*59599516SKenneth E. Jansen         do j=1,amg_nshg(clevel)
354*59599516SKenneth E. Jansen            vR(i) = vR(i)+ramg_ggb_eV(j,i)*ggberr(j)
355*59599516SKenneth E. Jansen         enddo
356*59599516SKenneth E. Jansen      enddo
357*59599516SKenneth E. Jansen      rtemp = 0
358*59599516SKenneth E. Jansen      if (numpe.gt.1) then
359*59599516SKenneth E. Jansen          call MPI_Allreduce(vR,rtemp,maxnev,
360*59599516SKenneth E. Jansen     &            MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,ierr)
361*59599516SKenneth E. Jansen
362*59599516SKenneth E. Jansen      vR = rtemp
363*59599516SKenneth E. Jansen      end if
364*59599516SKenneth E. Jansen
365*59599516SKenneth E. Jansen      ! solve maxnev by maxnev matrix
366*59599516SKenneth E. Jansen      mtxggbA = ramg_ggb_eA
367*59599516SKenneth E. Jansen      call ludcmp(mtxggbA,maxnev,maxnev,indx,d)
368*59599516SKenneth E. Jansen      call lubksb(mtxggbA,maxnev,maxnev,indx,vR)
369*59599516SKenneth E. Jansen
370*59599516SKenneth E. Jansen      ! prolongation
371*59599516SKenneth E. Jansen      ggberr = 0
372*59599516SKenneth E. Jansen      do i=1,maxnev
373*59599516SKenneth E. Jansen         do j=1,amg_nshg(clevel)
374*59599516SKenneth E. Jansen            ggberr(j) = ggberr(j)+ramg_ggb_eV(j,i)*vR(i)
375*59599516SKenneth E. Jansen         enddo
376*59599516SKenneth E. Jansen      enddo
377*59599516SKenneth E. Jansen
378*59599516SKenneth E. Jansen      ramg_sol = ramg_sol - ggberr
379*59599516SKenneth E. Jansen
380*59599516SKenneth E. Jansen      end subroutine !ramg_G_cycle
381*59599516SKenneth E. Jansen
382*59599516SKenneth E. Jansen      subroutine ramg_ggb_G2A(avec,gvec,asize,gsize,redun,
383*59599516SKenneth E. Jansen     &                           gmap,grevmap)
384*59599516SKenneth E. Jansen      integer,intent(in) :: asize, gsize
385*59599516SKenneth E. Jansen      integer,intent(in) :: redun
386*59599516SKenneth E. Jansen      integer,intent(in),dimension(asize) :: gmap,grevmap
387*59599516SKenneth E. Jansen      real(kind=8),intent(inout),dimension(asize,redun) :: avec
388*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(gsize,redun) :: gvec
389*59599516SKenneth E. Jansen      integer :: i
390*59599516SKenneth E. Jansen
391*59599516SKenneth E. Jansen      avec = 0
392*59599516SKenneth E. Jansen      do i=1,gsize
393*59599516SKenneth E. Jansen         avec(grevmap(i),:) = gvec(i,:)
394*59599516SKenneth E. Jansen      enddo
395*59599516SKenneth E. Jansen
396*59599516SKenneth E. Jansen      end subroutine ! ramg_ggb_G2A
397*59599516SKenneth E. Jansen
398*59599516SKenneth E. Jansen
399*59599516SKenneth E. Jansen      subroutine ramg_ggb_A2G(avec,gvec,asize,gsize,redun,
400*59599516SKenneth E. Jansen     &           gmap,grevmap)
401*59599516SKenneth E. Jansen      integer,intent(in) :: asize, gsize
402*59599516SKenneth E. Jansen      integer,intent(in) :: redun
403*59599516SKenneth E. Jansen      integer,intent(in),dimension(asize) :: gmap,grevmap
404*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(asize,redun) :: avec
405*59599516SKenneth E. Jansen      real(kind=8),intent(inout),dimension(gsize,redun) :: gvec
406*59599516SKenneth E. Jansen      integer :: i
407*59599516SKenneth E. Jansen
408*59599516SKenneth E. Jansen      gvec = 0
409*59599516SKenneth E. Jansen      do i=1,asize
410*59599516SKenneth E. Jansen         if (gmap(i).gt.0) then
411*59599516SKenneth E. Jansen             gvec(gmap(i),:) = avec(i,:)
412*59599516SKenneth E. Jansen         end if
413*59599516SKenneth E. Jansen      enddo
414*59599516SKenneth E. Jansen
415*59599516SKenneth E. Jansen      end subroutine ! ramg_ggb_A2G
416*59599516SKenneth E. Jansen
417