xref: /phasta/phSolver/AMG/ramg_mls.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen!**************************************************************
2*59599516SKenneth E. Jansen!      mls_eigen: get maximum eigenvalue of A
3*59599516SKenneth E. Jansen!      mls_setup: set coefficients of A^n
4*59599516SKenneth E. Jansen!
5*59599516SKenneth E. Jansen!      These routine uses ARPACK and auxilary routines in
6*59599516SKenneth E. Jansen!      ramg_ggb.f
7*59599516SKenneth E. Jansen!**************************************************************
8*59599516SKenneth E. Jansen      subroutine ramg_mls_eigen(evmax,level,flagfb,
9*59599516SKenneth E. Jansen     &                          colm,rowp,lhsK,lhsP,
10*59599516SKenneth E. Jansen     &                          ilwork,BC,iBC,iper)
11*59599516SKenneth E. Jansen      use ramg_data
12*59599516SKenneth E. Jansen      include "common.h"
13*59599516SKenneth E. Jansen      include "mpif.h"
14*59599516SKenneth E. Jansen      include "auxmpi.h"
15*59599516SKenneth E. Jansen      include 'debug.h'
16*59599516SKenneth E. Jansen
17*59599516SKenneth E. Jansen      real(kind=8),intent(inout)                      :: evmax
18*59599516SKenneth E. Jansen      integer,intent(in)                              :: level
19*59599516SKenneth E. Jansen      integer,intent(in)                              :: flagfb
20*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg+1)       :: colm
21*59599516SKenneth E. Jansen      integer,intent(in),dimension(nnz_tot)      :: rowp
22*59599516SKenneth E. Jansen
23*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(9,nnz_tot)    :: lhsK
24*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(4,nnz_tot)    :: lhsP
25*59599516SKenneth E. Jansen
26*59599516SKenneth E. Jansen      integer,intent(in),dimension(nlwork)            :: ilwork
27*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg)              :: iBC,iper
28*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(nshg,ndofBC)  :: BC
29*59599516SKenneth E. Jansen
30*59599516SKenneth E. Jansen!      ! parameter for PPE Ap-product
31*59599516SKenneth E. Jansen!      real(kind=8),dimension(nshg,4) :: diag
32*59599516SKenneth E. Jansen      ! parameter for eigenvalue
33*59599516SKenneth E. Jansen
34*59599516SKenneth E. Jansen      integer   iparam(11),ipntr(14)
35*59599516SKenneth E. Jansen      integer gcomm
36*59599516SKenneth E. Jansen
37*59599516SKenneth E. Jansen!      logical   selectncv(maxncv)
38*59599516SKenneth E. Jansen!      real(kind=8) :: d(maxncv,3),dr(maxncv),di(maxncv),
39*59599516SKenneth E. Jansen!     &                workev(3*maxncv),
40*59599516SKenneth E. Jansen!     &                workl(3*maxncv*maxncv+6*maxncv)
41*59599516SKenneth E. Jansen      logical,dimension(:),allocatable :: selectncv
42*59599516SKenneth E. Jansen      real(kind=8),dimension(:,:),allocatable :: d
43*59599516SKenneth E. Jansen      real(kind=8),dimension(:),allocatable :: dr,di,workev,workl
44*59599516SKenneth E. Jansen
45*59599516SKenneth E. Jansen      real(kind=8),allocatable,dimension(:) ::  resid,workd
46*59599516SKenneth E. Jansen
47*59599516SKenneth E. Jansen      character  bmat*1,which*2
48*59599516SKenneth E. Jansen      integer   :: ido,n,nx,nev,ncv,lworkl,info,ierr,
49*59599516SKenneth E. Jansen     &             i,j,ishifts,maxitr,model,nconv
50*59599516SKenneth E. Jansen      real(kind=8)  :: tol,sigmar,sigmai
51*59599516SKenneth E. Jansen      logical     ::  first,rvec
52*59599516SKenneth E. Jansen
53*59599516SKenneth E. Jansen      real(kind=8) :: res_i,res_o,rtemp,tnorm,tnorm1
54*59599516SKenneth E. Jansen      real(kind=8),allocatable,dimension(:,:):: tramg_ev
55*59599516SKenneth E. Jansen      real(kind=8),dimension(amg_nshg(level)) :: twork1,twork2
56*59599516SKenneth E. Jansen
57*59599516SKenneth E. Jansen      integer,allocatable,dimension(:) :: gmap,grevmap
58*59599516SKenneth E. Jansen
59*59599516SKenneth E. Jansen      integer :: p,q,nsize,step,asize,gsize
60*59599516SKenneth E. Jansen
61*59599516SKenneth E. Jansen!      ! if ( freeze parameter ) return
62*59599516SKenneth E. Jansen!      call drvLesPrepDiag(diag,ilwork,iBC,BC,iper,rowp,colm,lhsK,lhsP)
63*59599516SKenneth E. Jansen
64*59599516SKenneth E. Jansen      asize = amg_nshg(level)
65*59599516SKenneth E. Jansen      allocate(gmap(asize))
66*59599516SKenneth E. Jansen      allocate(grevmap(asize))
67*59599516SKenneth E. Jansen
68*59599516SKenneth E. Jansen      call ramg_generate_gmap(ilwork,asize,nsize,gmap,grevmap,level)
69*59599516SKenneth E. Jansen
70*59599516SKenneth E. Jansen      call MPI_AllReduce(nsize,gsize,1,MPI_INTEGER,MPI_MAX,
71*59599516SKenneth E. Jansen     &                   MPI_COMM_WORLD,ierr)
72*59599516SKenneth E. Jansen
73*59599516SKenneth E. Jansen      ncv = min(maxncv,gsize)
74*59599516SKenneth E. Jansen      !write(*,*)'mcheck ncv=',ncv
75*59599516SKenneth E. Jansen
76*59599516SKenneth E. Jansen      if (ncv.eq.1) then
77*59599516SKenneth E. Jansen         evmax = 1
78*59599516SKenneth E. Jansen         return
79*59599516SKenneth E. Jansen      endif
80*59599516SKenneth E. Jansen
81*59599516SKenneth E. Jansen      allocate(selectncv(ncv))
82*59599516SKenneth E. Jansen      allocate(d(ncv,3))
83*59599516SKenneth E. Jansen      allocate(dr(ncv))
84*59599516SKenneth E. Jansen      allocate(di(ncv))
85*59599516SKenneth E. Jansen      allocate(workev(3*ncv))
86*59599516SKenneth E. Jansen      allocate(workl(3*ncv*ncv+6*ncv))
87*59599516SKenneth E. Jansen
88*59599516SKenneth E. Jansen      allocate(resid(gsize))
89*59599516SKenneth E. Jansen      allocate(workd(3*gsize))
90*59599516SKenneth E. Jansen      !***********   Start of Parameter setting *******
91*59599516SKenneth E. Jansen
92*59599516SKenneth E. Jansen      ndigit = -3
93*59599516SKenneth E. Jansen      logfil = 6
94*59599516SKenneth E. Jansen      mnaitr = 0
95*59599516SKenneth E. Jansen      mnapps = 0
96*59599516SKenneth E. Jansen      mnaupd = 0 ! controls the output (verbose) mode
97*59599516SKenneth E. Jansen      mnaup2 = 0
98*59599516SKenneth E. Jansen      mneigh = 0
99*59599516SKenneth E. Jansen      mneupd = 0
100*59599516SKenneth E. Jansen
101*59599516SKenneth E. Jansen      nev = 1
102*59599516SKenneth E. Jansen      bmat = 'I'
103*59599516SKenneth E. Jansen      which = 'LM'
104*59599516SKenneth E. Jansen
105*59599516SKenneth E. Jansen      lworkl = 3*ncv**2+6*ncv
106*59599516SKenneth E. Jansen      tol = 1.0E-3
107*59599516SKenneth E. Jansen      ido = 0
108*59599516SKenneth E. Jansen      info = 0
109*59599516SKenneth E. Jansen
110*59599516SKenneth E. Jansen      iparam(1) = 1
111*59599516SKenneth E. Jansen      iparam(3) = 500
112*59599516SKenneth E. Jansen      iparam(7) = 1
113*59599516SKenneth E. Jansen
114*59599516SKenneth E. Jansen      !********** End of parameter setting ********
115*59599516SKenneth E. Jansen
116*59599516SKenneth E. Jansen      allocate(tramg_ev(nsize,maxncv))
117*59599516SKenneth E. Jansen
118*59599516SKenneth E. Jansen      step = 1
119*59599516SKenneth E. Jansen      tramg_ev = 0
120*59599516SKenneth E. Jansen      gcomm = MPI_COMM_WORLD
121*59599516SKenneth E. Jansen
122*59599516SKenneth E. Jansen      call pdnaupd(gcomm,
123*59599516SKenneth E. Jansen     &               ido,bmat,nsize,which,nev,tol,resid,ncv,
124*59599516SKenneth E. Jansen     &               tramg_ev,
125*59599516SKenneth E. Jansen     &               nsize,iparam,ipntr,workd,workl,lworkl,
126*59599516SKenneth E. Jansen     &               info)
127*59599516SKenneth E. Jansen      do while ((ido.eq.1).or.(ido.eq.-1))
128*59599516SKenneth E. Jansen        call ramg_ggb_G2A(twork1,workd(ipntr(1)),asize,nsize,1,
129*59599516SKenneth E. Jansen     &                    gmap,grevmap)
130*59599516SKenneth E. Jansen!        call ramg_PPEAp(twork2,twork1,diag,
131*59599516SKenneth E. Jansen!     &                colm,rowp,lhsK,lhsP,ilwork,BC,iBC,iper)
132*59599516SKenneth E. Jansen!        call ramg_calcAv(amg_A_colm(level)%p,amg_A_rowp(level)%p,
133*59599516SKenneth E. Jansen!     &                     amg_A_lhs(level)%p,amg_nshg(level),
134*59599516SKenneth E. Jansen!     &                     amg_nnz(level),twork2,twork1,1)
135*59599516SKenneth E. Jansen        if (flagfb.eq.1) then
136*59599516SKenneth E. Jansen        call ramg_calcAv_g(level,twork2,twork1,colm,rowp,lhsK,lhsP,
137*59599516SKenneth E. Jansen     &                 ilwork,BC,iBC,iper,1)
138*59599516SKenneth E. Jansen        else
139*59599516SKenneth E. Jansen        call ramg_mls_calcPAv(level,twork2,twork1,
140*59599516SKenneth E. Jansen     &           colm,rowp,lhsK,lhsP,
141*59599516SKenneth E. Jansen     &           ilwork,BC,iBC,iper)
142*59599516SKenneth E. Jansen        endif
143*59599516SKenneth E. Jansen        call ramg_ggb_A2G(twork2,workd(ipntr(2)),asize,nsize,1,
144*59599516SKenneth E. Jansen     &                    gmap,grevmap)
145*59599516SKenneth E. Jansen        call pdnaupd(gcomm,
146*59599516SKenneth E. Jansen     &               ido,bmat,nsize,which,nev,tol,resid,ncv,
147*59599516SKenneth E. Jansen     &               tramg_ev,
148*59599516SKenneth E. Jansen     &               nsize,iparam,ipntr,workd,workl,lworkl,
149*59599516SKenneth E. Jansen     &               info)
150*59599516SKenneth E. Jansen         step = step + 1
151*59599516SKenneth E. Jansen      enddo
152*59599516SKenneth E. Jansen      if (info.lt.0) then
153*59599516SKenneth E. Jansen          if (myrank.eq.master) then
154*59599516SKenneth E. Jansen          write(*,*)'mcheck: mls: info:',info,iparam(5)
155*59599516SKenneth E. Jansen          endif
156*59599516SKenneth E. Jansen          ramg_levelx = level-1
157*59599516SKenneth E. Jansen      else
158*59599516SKenneth E. Jansen          rvec = .false.
159*59599516SKenneth E. Jansen          call pdneupd (gcomm,rvec,'A',selectncv,dr,di,
160*59599516SKenneth E. Jansen     &         tramg_ev,nsize,
161*59599516SKenneth E. Jansen     &         sigmar,sigmai,workev,bmat,nsize,which,nev,tol,
162*59599516SKenneth E. Jansen     &         resid,ncv,tramg_ev,
163*59599516SKenneth E. Jansen     &         nsize,iparam,ipntr,workd,workl,
164*59599516SKenneth E. Jansen     &         lworkl,ierr)
165*59599516SKenneth E. Jansen      end if
166*59599516SKenneth E. Jansen      evmax = dr(1)
167*59599516SKenneth E. Jansen!      if (myrank.eq.master) then
168*59599516SKenneth E. Jansen!         write(*,*)'MLS: largest eigenvalue of A at level ',level,
169*59599516SKenneth E. Jansen!     &    ' is ',evmax
170*59599516SKenneth E. Jansen!      endif
171*59599516SKenneth E. Jansen      !write(*,*)'mcheck: ggb over pdnaupd'
172*59599516SKenneth E. Jansen
173*59599516SKenneth E. Jansen      deallocate(tramg_ev)
174*59599516SKenneth E. Jansen      deallocate(gmap)
175*59599516SKenneth E. Jansen      deallocate(grevmap)
176*59599516SKenneth E. Jansen      deallocate(resid)
177*59599516SKenneth E. Jansen      deallocate(workd)
178*59599516SKenneth E. Jansen
179*59599516SKenneth E. Jansen      deallocate(selectncv)
180*59599516SKenneth E. Jansen      deallocate(d)
181*59599516SKenneth E. Jansen      deallocate(dr)
182*59599516SKenneth E. Jansen      deallocate(di)
183*59599516SKenneth E. Jansen      deallocate(workev)
184*59599516SKenneth E. Jansen      deallocate(workl)
185*59599516SKenneth E. Jansen
186*59599516SKenneth E. Jansen      end subroutine ! ramg_mls_eigen
187*59599516SKenneth E. Jansen
188*59599516SKenneth E. Jansen      subroutine ramg_mls_min_eigen(evmax,level,flagfb,
189*59599516SKenneth E. Jansen     &                          colm,rowp,lhsK,lhsP,
190*59599516SKenneth E. Jansen     &                          ilwork,BC,iBC,iper)
191*59599516SKenneth E. Jansen      use ramg_data
192*59599516SKenneth E. Jansen      include "common.h"
193*59599516SKenneth E. Jansen      include "mpif.h"
194*59599516SKenneth E. Jansen      include "auxmpi.h"
195*59599516SKenneth E. Jansen      include 'debug.h'
196*59599516SKenneth E. Jansen
197*59599516SKenneth E. Jansen      real(kind=8),intent(inout)                      :: evmax
198*59599516SKenneth E. Jansen      integer,intent(in)                              :: level
199*59599516SKenneth E. Jansen      integer,intent(in)                              :: flagfb
200*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg+1)       :: colm
201*59599516SKenneth E. Jansen      integer,intent(in),dimension(nnz_tot)      :: rowp
202*59599516SKenneth E. Jansen
203*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(9,nnz_tot)    :: lhsK
204*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(4,nnz_tot)    :: lhsP
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!      ! parameter for PPE Ap-product
211*59599516SKenneth E. Jansen!      real(kind=8),dimension(nshg,4) :: diag
212*59599516SKenneth E. Jansen      ! parameter for eigenvalue
213*59599516SKenneth E. Jansen
214*59599516SKenneth E. Jansen      integer   iparam(11),ipntr(14)
215*59599516SKenneth E. Jansen      integer gcomm
216*59599516SKenneth E. Jansen
217*59599516SKenneth E. Jansen!      logical   selectncv(maxncv)
218*59599516SKenneth E. Jansen!      real(kind=8) :: d(maxncv,3),dr(maxncv),di(maxncv),
219*59599516SKenneth E. Jansen!     &                workev(3*maxncv),
220*59599516SKenneth E. Jansen!     &                workl(3*maxncv*maxncv+6*maxncv)
221*59599516SKenneth E. Jansen      logical,dimension(:),allocatable :: selectncv
222*59599516SKenneth E. Jansen      real(kind=8),dimension(:,:),allocatable :: d
223*59599516SKenneth E. Jansen      real(kind=8),dimension(:),allocatable :: dr,di,workev,workl
224*59599516SKenneth E. Jansen
225*59599516SKenneth E. Jansen      real(kind=8),allocatable,dimension(:) ::  resid,workd
226*59599516SKenneth E. Jansen
227*59599516SKenneth E. Jansen      character  bmat*1,which*2
228*59599516SKenneth E. Jansen      integer   :: ido,n,nx,nev,ncv,lworkl,info,ierr,
229*59599516SKenneth E. Jansen     &             i,j,ishifts,maxitr,model,nconv
230*59599516SKenneth E. Jansen      real(kind=8)  :: tol,sigmar,sigmai
231*59599516SKenneth E. Jansen      logical     ::  first,rvec
232*59599516SKenneth E. Jansen
233*59599516SKenneth E. Jansen      real(kind=8) :: res_i,res_o,rtemp,tnorm,tnorm1
234*59599516SKenneth E. Jansen      real(kind=8),allocatable,dimension(:,:):: tramg_ev
235*59599516SKenneth E. Jansen      real(kind=8),dimension(amg_nshg(level)) :: twork1,twork2
236*59599516SKenneth E. Jansen
237*59599516SKenneth E. Jansen      integer,allocatable,dimension(:) :: gmap,grevmap
238*59599516SKenneth E. Jansen
239*59599516SKenneth E. Jansen      integer :: p,q,nsize,step,asize,gsize
240*59599516SKenneth E. Jansen
241*59599516SKenneth E. Jansen!      ! if ( freeze parameter ) return
242*59599516SKenneth E. Jansen!      call drvLesPrepDiag(diag,ilwork,iBC,BC,iper,rowp,colm,lhsK,lhsP)
243*59599516SKenneth E. Jansen
244*59599516SKenneth E. Jansen      asize = amg_nshg(level)
245*59599516SKenneth E. Jansen      allocate(gmap(asize))
246*59599516SKenneth E. Jansen      allocate(grevmap(asize))
247*59599516SKenneth E. Jansen
248*59599516SKenneth E. Jansen      call ramg_generate_gmap(ilwork,asize,nsize,gmap,grevmap,level)
249*59599516SKenneth E. Jansen
250*59599516SKenneth E. Jansen      call MPI_AllReduce(nsize,gsize,1,MPI_INTEGER,MPI_MAX,
251*59599516SKenneth E. Jansen     &                   MPI_COMM_WORLD,ierr)
252*59599516SKenneth E. Jansen
253*59599516SKenneth E. Jansen      ncv = min(maxncv,gsize)
254*59599516SKenneth E. Jansen      !write(*,*)'mcheck ncv=',ncv
255*59599516SKenneth E. Jansen
256*59599516SKenneth E. Jansen      if (ncv.eq.1) then
257*59599516SKenneth E. Jansen         evmax = 1
258*59599516SKenneth E. Jansen         return
259*59599516SKenneth E. Jansen      endif
260*59599516SKenneth E. Jansen
261*59599516SKenneth E. Jansen      allocate(selectncv(ncv))
262*59599516SKenneth E. Jansen      allocate(d(ncv,3))
263*59599516SKenneth E. Jansen      allocate(dr(ncv))
264*59599516SKenneth E. Jansen      allocate(di(ncv))
265*59599516SKenneth E. Jansen      allocate(workev(3*ncv))
266*59599516SKenneth E. Jansen      allocate(workl(3*ncv*ncv+6*ncv))
267*59599516SKenneth E. Jansen
268*59599516SKenneth E. Jansen      allocate(resid(gsize))
269*59599516SKenneth E. Jansen      allocate(workd(3*gsize))
270*59599516SKenneth E. Jansen      !***********   Start of Parameter setting *******
271*59599516SKenneth E. Jansen
272*59599516SKenneth E. Jansen      ndigit = -3
273*59599516SKenneth E. Jansen      logfil = 6
274*59599516SKenneth E. Jansen      mnaitr = 0
275*59599516SKenneth E. Jansen      mnapps = 0
276*59599516SKenneth E. Jansen      mnaupd = 0 ! controls the output (verbose) mode
277*59599516SKenneth E. Jansen      mnaup2 = 0
278*59599516SKenneth E. Jansen      mneigh = 0
279*59599516SKenneth E. Jansen      mneupd = 0
280*59599516SKenneth E. Jansen
281*59599516SKenneth E. Jansen      nev = 1
282*59599516SKenneth E. Jansen      bmat = 'I'
283*59599516SKenneth E. Jansen      which = 'SM'
284*59599516SKenneth E. Jansen
285*59599516SKenneth E. Jansen      lworkl = 3*ncv**2+6*ncv
286*59599516SKenneth E. Jansen      tol = 1.0E-3
287*59599516SKenneth E. Jansen      ido = 0
288*59599516SKenneth E. Jansen      info = 0
289*59599516SKenneth E. Jansen
290*59599516SKenneth E. Jansen      iparam(1) = 1
291*59599516SKenneth E. Jansen      iparam(3) = 500
292*59599516SKenneth E. Jansen      iparam(7) = 1
293*59599516SKenneth E. Jansen
294*59599516SKenneth E. Jansen      !********** End of parameter setting ********
295*59599516SKenneth E. Jansen
296*59599516SKenneth E. Jansen      allocate(tramg_ev(nsize,maxncv))
297*59599516SKenneth E. Jansen
298*59599516SKenneth E. Jansen      step = 1
299*59599516SKenneth E. Jansen      tramg_ev = 0
300*59599516SKenneth E. Jansen      gcomm = MPI_COMM_WORLD
301*59599516SKenneth E. Jansen
302*59599516SKenneth E. Jansen      call pdnaupd(gcomm,
303*59599516SKenneth E. Jansen     &               ido,bmat,nsize,which,nev,tol,resid,ncv,
304*59599516SKenneth E. Jansen     &               tramg_ev,
305*59599516SKenneth E. Jansen     &               nsize,iparam,ipntr,workd,workl,lworkl,
306*59599516SKenneth E. Jansen     &               info)
307*59599516SKenneth E. Jansen      do while ((ido.eq.1).or.(ido.eq.-1))
308*59599516SKenneth E. Jansen        call ramg_ggb_G2A(twork1,workd(ipntr(1)),asize,nsize,1,
309*59599516SKenneth E. Jansen     &                    gmap,grevmap)
310*59599516SKenneth E. Jansen!        call ramg_PPEAp(twork2,twork1,diag,
311*59599516SKenneth E. Jansen!     &                colm,rowp,lhsK,lhsP,ilwork,BC,iBC,iper)
312*59599516SKenneth E. Jansen!        call ramg_calcAv(amg_A_colm(level)%p,amg_A_rowp(level)%p,
313*59599516SKenneth E. Jansen!     &                     amg_A_lhs(level)%p,amg_nshg(level),
314*59599516SKenneth E. Jansen!     &                     amg_nnz(level),twork2,twork1,1)
315*59599516SKenneth E. Jansen        if (flagfb.eq.1) then
316*59599516SKenneth E. Jansen        call ramg_calcAv_g(level,twork2,twork1,colm,rowp,lhsK,lhsP,
317*59599516SKenneth E. Jansen     &                 ilwork,BC,iBC,iper,1)
318*59599516SKenneth E. Jansen        else
319*59599516SKenneth E. Jansen        call ramg_mls_calcPAv(level,twork2,twork1,
320*59599516SKenneth E. Jansen     &           colm,rowp,lhsK,lhsP,
321*59599516SKenneth E. Jansen     &           ilwork,BC,iBC,iper)
322*59599516SKenneth E. Jansen        endif
323*59599516SKenneth E. Jansen        call ramg_ggb_A2G(twork2,workd(ipntr(2)),asize,nsize,1,
324*59599516SKenneth E. Jansen     &                    gmap,grevmap)
325*59599516SKenneth E. Jansen        call pdnaupd(gcomm,
326*59599516SKenneth E. Jansen     &               ido,bmat,nsize,which,nev,tol,resid,ncv,
327*59599516SKenneth E. Jansen     &               tramg_ev,
328*59599516SKenneth E. Jansen     &               nsize,iparam,ipntr,workd,workl,lworkl,
329*59599516SKenneth E. Jansen     &               info)
330*59599516SKenneth E. Jansen         step = step + 1
331*59599516SKenneth E. Jansen      enddo
332*59599516SKenneth E. Jansen      if (info.lt.0) then
333*59599516SKenneth E. Jansen          if (myrank.eq.master) then
334*59599516SKenneth E. Jansen          write(*,*)'mcheck: mls: info:',info,iparam(5)
335*59599516SKenneth E. Jansen          endif
336*59599516SKenneth E. Jansen          ramg_levelx = level-1
337*59599516SKenneth E. Jansen      else
338*59599516SKenneth E. Jansen          rvec = .false.
339*59599516SKenneth E. Jansen          call pdneupd (gcomm,rvec,'A',selectncv,dr,di,
340*59599516SKenneth E. Jansen     &         tramg_ev,nsize,
341*59599516SKenneth E. Jansen     &         sigmar,sigmai,workev,bmat,nsize,which,nev,tol,
342*59599516SKenneth E. Jansen     &         resid,ncv,tramg_ev,
343*59599516SKenneth E. Jansen     &         nsize,iparam,ipntr,workd,workl,
344*59599516SKenneth E. Jansen     &         lworkl,ierr)
345*59599516SKenneth E. Jansen      end if
346*59599516SKenneth E. Jansen      evmax = dr(1)
347*59599516SKenneth E. Jansen!      if (myrank.eq.master) then
348*59599516SKenneth E. Jansen!         write(*,*)'MLS: smallest eigenvalue of A is ',evmax
349*59599516SKenneth E. Jansen!      endif
350*59599516SKenneth E. Jansen      !write(*,*)'mcheck: ggb over pdnaupd'
351*59599516SKenneth E. Jansen
352*59599516SKenneth E. Jansen      deallocate(tramg_ev)
353*59599516SKenneth E. Jansen      deallocate(gmap)
354*59599516SKenneth E. Jansen      deallocate(grevmap)
355*59599516SKenneth E. Jansen      deallocate(resid)
356*59599516SKenneth E. Jansen      deallocate(workd)
357*59599516SKenneth E. Jansen
358*59599516SKenneth E. Jansen      deallocate(selectncv)
359*59599516SKenneth E. Jansen      deallocate(d)
360*59599516SKenneth E. Jansen      deallocate(dr)
361*59599516SKenneth E. Jansen      deallocate(di)
362*59599516SKenneth E. Jansen      deallocate(workev)
363*59599516SKenneth E. Jansen      deallocate(workl)
364*59599516SKenneth E. Jansen
365*59599516SKenneth E. Jansen      end subroutine ! ramg_mls_min_eigen
366*59599516SKenneth E. Jansen
367*59599516SKenneth E. Jansen      subroutine ramg_mls_coeff(level,ilwork,BC,iBC,iper)
368*59599516SKenneth E. Jansen      end subroutine !ramg_mls_coeff
369*59599516SKenneth E. Jansen
370*59599516SKenneth E. Jansen
371*59599516SKenneth E. Jansen      subroutine ramg_mls_setup(colm,rowp,lhsK,lhsP,
372*59599516SKenneth E. Jansen     &                          ilwork,BC,iBC,iper)
373*59599516SKenneth E. Jansen      use ramg_data
374*59599516SKenneth E. Jansen      include "common.h"
375*59599516SKenneth E. Jansen      include "mpif.h"
376*59599516SKenneth E. Jansen      include "auxmpi.h"
377*59599516SKenneth E. Jansen
378*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg+1)            :: colm
379*59599516SKenneth E. Jansen      integer,intent(in),dimension(nnz_tot)           :: rowp
380*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(9,nnz_tot)    :: lhsK
381*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(4,nnz_tot)    :: lhsP
382*59599516SKenneth E. Jansen      integer,intent(in),dimension(nlwork)            :: ilwork
383*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg)              :: iBC,iper
384*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(nshg,ndofBC)  :: BC
385*59599516SKenneth E. Jansen
386*59599516SKenneth E. Jansen
387*59599516SKenneth E. Jansen      real(kind=8)    :: evmax,ddeg,aux1,aux0,auxom,rho,rho2
388*59599516SKenneth E. Jansen      real(kind=8),dimension(10) :: omloc
389*59599516SKenneth E. Jansen      real(kind=8)    :: mlsOver  ! magic number!
390*59599516SKenneth E. Jansen      integer         :: i,j,k,lvl,ideg
391*59599516SKenneth E. Jansen      integer  :: nSample,nGrid
392*59599516SKenneth E. Jansen      real(kind=8) :: gridStep,coord,samplej
393*59599516SKenneth E. Jansen
394*59599516SKenneth E. Jansen      if (ramg_setup_flag .ne. 0 ) return
395*59599516SKenneth E. Jansen      if ((iamg_smoother.eq.1).and.(numpe.eq.1)) return
396*59599516SKenneth E. Jansen      ! do not setup if serial Gauss-Seidel
397*59599516SKenneth E. Jansen      ! magic numbers....
398*59599516SKenneth E. Jansen      mlsOver = 1.1
399*59599516SKenneth E. Jansen
400*59599516SKenneth E. Jansen      do lvl=1,ramg_levelx
401*59599516SKenneth E. Jansen      call ramg_mls_eigen(evmax,lvl,1,colm,rowp,lhsK,lhsP,
402*59599516SKenneth E. Jansen     &                    ilwork,BC,iBC,iper)
403*59599516SKenneth E. Jansen
404*59599516SKenneth E. Jansen      mlsCf(lvl,:) = 0
405*59599516SKenneth E. Jansen      omloc = 0
406*59599516SKenneth E. Jansen
407*59599516SKenneth E. Jansen      if (iamg_smoother.eq.1) then !Gauss-Seidel in parallel
408*59599516SKenneth E. Jansen          ideg = 1
409*59599516SKenneth E. Jansen      else
410*59599516SKenneth E. Jansen        ideg = iabs(mlsDeg)
411*59599516SKenneth E. Jansen      endif
412*59599516SKenneth E. Jansen      ddeg = ideg
413*59599516SKenneth E. Jansen      aux1 = 1.0/(2.0*ddeg+1.0)
414*59599516SKenneth E. Jansen      rho = evmax!*mlsOver
415*59599516SKenneth E. Jansen
416*59599516SKenneth E. Jansen      do i=1,ideg
417*59599516SKenneth E. Jansen         aux0 = 2.0*i*PI
418*59599516SKenneth E. Jansen         auxom = rho/2.0*(1.0-cos(aux0*aux1))
419*59599516SKenneth E. Jansen         omloc(i) = 1.0/auxom
420*59599516SKenneth E. Jansen         !write(*,*)'mcheck: ',omloc(i)
421*59599516SKenneth E. Jansen      enddo
422*59599516SKenneth E. Jansen
423*59599516SKenneth E. Jansen      ! 4th order maximum
424*59599516SKenneth E. Jansen      mlsCf(lvl,1) = omloc(1)+omloc(2)+omloc(3)+omloc(4)+omloc(5)
425*59599516SKenneth E. Jansen
426*59599516SKenneth E. Jansen      mlsCf(lvl,2) = -( omloc(1)*omloc(2)+omloc(1)*omloc(3)
427*59599516SKenneth E. Jansen     &             +omloc(1)*omloc(4)+omloc(1)*omloc(5)
428*59599516SKenneth E. Jansen     &             +omloc(2)*omloc(3)+omloc(2)*omloc(4)
429*59599516SKenneth E. Jansen     &             +omloc(2)*omloc(5)+omloc(3)*omloc(4)
430*59599516SKenneth E. Jansen     &             +omloc(3)*omloc(5)+omloc(4)*omloc(5) )
431*59599516SKenneth E. Jansen
432*59599516SKenneth E. Jansen      mlsCf(lvl,3) = ( omloc(1)*omloc(2)*omloc(3)
433*59599516SKenneth E. Jansen     &            +omloc(1)*omloc(2)*omloc(4)
434*59599516SKenneth E. Jansen     &            +omloc(1)*omloc(2)*omloc(5)
435*59599516SKenneth E. Jansen     &            +omloc(1)*omloc(3)*omloc(4)
436*59599516SKenneth E. Jansen     &            +omloc(1)*omloc(3)*omloc(5)
437*59599516SKenneth E. Jansen     &            +omloc(1)*omloc(4)*omloc(5)
438*59599516SKenneth E. Jansen     &            +omloc(2)*omloc(3)*omloc(4)
439*59599516SKenneth E. Jansen     &            +omloc(2)*omloc(3)*omloc(5)
440*59599516SKenneth E. Jansen     &            +omloc(2)*omloc(4)*omloc(5)
441*59599516SKenneth E. Jansen     &            +omloc(3)*omloc(4)*omloc(5) )
442*59599516SKenneth E. Jansen
443*59599516SKenneth E. Jansen      mlsCf(lvl,4) = -( omloc(1)*omloc(2)*omloc(3)*omloc(4)
444*59599516SKenneth E. Jansen     &             +omloc(1)*omloc(2)*omloc(3)*omloc(5)
445*59599516SKenneth E. Jansen     &             +omloc(1)*omloc(2)*omloc(4)*omloc(5)
446*59599516SKenneth E. Jansen     &             +omloc(1)*omloc(3)*omloc(4)*omloc(5)
447*59599516SKenneth E. Jansen     &             +omloc(2)*omloc(3)*omloc(4)*omloc(5) )
448*59599516SKenneth E. Jansen
449*59599516SKenneth E. Jansen      mlsCf(lvl,5) = omloc(1)*omloc(2)*omloc(3)*omloc(4)*omloc(5)
450*59599516SKenneth E. Jansen
451*59599516SKenneth E. Jansen      do i=1,ideg
452*59599516SKenneth E. Jansen         mlsOm(lvl,i) = omloc(i)
453*59599516SKenneth E. Jansen      enddo
454*59599516SKenneth E. Jansen
455*59599516SKenneth E. Jansen      ! setup coefficients for post smoothing
456*59599516SKenneth E. Jansen      ! ref: trilinos ml
457*59599516SKenneth E. Jansen
458*59599516SKenneth E. Jansen      nSample=20000
459*59599516SKenneth E. Jansen      gridStep = rho/nSample
460*59599516SKenneth E. Jansen      rho2=zero
461*59599516SKenneth E. Jansen      do j=1,nSample
462*59599516SKenneth E. Jansen         coord=j*gridStep
463*59599516SKenneth E. Jansen         samplej=1.0-omloc(1)*coord
464*59599516SKenneth E. Jansen         do i=2,ideg
465*59599516SKenneth E. Jansen            samplej=samplej*(1.0-omloc(i)*coord)
466*59599516SKenneth E. Jansen         enddo
467*59599516SKenneth E. Jansen         samplej=samplej*(samplej*coord)
468*59599516SKenneth E. Jansen         if (samplej.gt.rho2) rho2=samplej
469*59599516SKenneth E. Jansen      enddo
470*59599516SKenneth E. Jansen      smlsOm(lvl,1) = 2.0/(1.025*rho2)!*mlsCf(lvl,1)
471*59599516SKenneth E. Jansen      !write(*,*)'mcheckpost:',rho2,smlsOm(lvl,1)
472*59599516SKenneth E. Jansen
473*59599516SKenneth E. Jansen      !do i=1,mlsDeg
474*59599516SKenneth E. Jansen      !   write(*,*)'mcheck: ',lvl,i,mlsCf(lvl,i)
475*59599516SKenneth E. Jansen      !enddo
476*59599516SKenneth E. Jansen      if (myrank.eq.master) then
477*59599516SKenneth E. Jansen          write(*,*)'MLS: Setup finished at level:',lvl,mlsCf(lvl,1)
478*59599516SKenneth E. Jansen      endif
479*59599516SKenneth E. Jansen      enddo !lvl
480*59599516SKenneth E. Jansen
481*59599516SKenneth E. Jansen      end subroutine ! ramg_mls_setup
482*59599516SKenneth E. Jansen
483*59599516SKenneth E. Jansen!***********************************************************
484*59599516SKenneth E. Jansen!     Construct Sfc = Ifc*(I-\lambda_1 A-\lambda_2 A^2)
485*59599516SKenneth E. Jansen!
486*59599516SKenneth E. Jansen!***********************************************************
487*59599516SKenneth E. Jansen!      Additional note: This is useless which results in
488*59599516SKenneth E. Jansen!      a super dense S instead of I, using this interpolator
489*59599516SKenneth E. Jansen!      is not effective won't save time ignore!
490*59599516SKenneth E. Jansen
491*59599516SKenneth E. Jansen!***********************************************************
492*59599516SKenneth E. Jansen!     u = (S^2*A) v
493*59599516SKenneth E. Jansen!     S = polynomial smoothing
494*59599516SKenneth E. Jansen!
495*59599516SKenneth E. Jansen!**********************************************************
496*59599516SKenneth E. Jansen      subroutine ramg_mls_calcPAv(level,u,v,colm,rowp,lhsK,lhsP,
497*59599516SKenneth E. Jansen     &                            ilwork,BC,iBC,iper)
498*59599516SKenneth E. Jansen      use ramg_data
499*59599516SKenneth E. Jansen      include "common.h"
500*59599516SKenneth E. Jansen      include "mpif.h"
501*59599516SKenneth E. Jansen      include "auxmpi.h"
502*59599516SKenneth E. Jansen
503*59599516SKenneth E. Jansen      integer,intent(in),dimension(nlwork)  :: ilwork
504*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg)    :: iBC,iper
505*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg+1)       :: colm
506*59599516SKenneth E. Jansen      integer,intent(in),dimension(nnz_tot)      :: rowp
507*59599516SKenneth E. Jansen
508*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(9,nnz_tot)    :: lhsK
509*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(4,nnz_tot)    :: lhsP
510*59599516SKenneth E. Jansen
511*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(nshg,ndofBC) :: BC
512*59599516SKenneth E. Jansen      real(kind=8),intent(inout),dimension(amg_nshg(level)) :: v
513*59599516SKenneth E. Jansen      real(kind=8),intent(inout),dimension(amg_nshg(level)) :: u
514*59599516SKenneth E. Jansen
515*59599516SKenneth E. Jansen      real(kind=8),dimension(amg_nshg(level)) :: aux,aux2,r0
516*59599516SKenneth E. Jansen
517*59599516SKenneth E. Jansen!      r0 = 0
518*59599516SKenneth E. Jansen      call ramg_calcAv_g(level,aux,v,colm,rowp,lhsK,lhsP,
519*59599516SKenneth E. Jansen     &                   ilwork,BC,iBC,iper,1)
520*59599516SKenneth E. Jansen      call ramg_mls_sandw_pre(aux2,aux,level,colm,rowp,lhsK,lhsP,
521*59599516SKenneth E. Jansen     &                    ilwork,BC,iBC,iper)!,
522*59599516SKenneth E. Jansen      call ramg_mls_sandw_post(u,aux2,level,colm,rowp,lhsK,lhsP,
523*59599516SKenneth E. Jansen     &                    ilwork,BC,iBC,iper)!,
524*59599516SKenneth E. Jansen
525*59599516SKenneth E. Jansen      end subroutine ! ramg_mls_calcPav
526*59599516SKenneth E. Jansen
527*59599516SKenneth E. Jansen      subroutine ramg_mls_setupPost(colm,rowp,lhsK,lhsP,
528*59599516SKenneth E. Jansen     &                          ilwork,BC,iBC,iper)
529*59599516SKenneth E. Jansen      use ramg_data
530*59599516SKenneth E. Jansen      include "common.h"
531*59599516SKenneth E. Jansen      include "mpif.h"
532*59599516SKenneth E. Jansen      include "auxmpi.h"
533*59599516SKenneth E. Jansen
534*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg+1)            :: colm
535*59599516SKenneth E. Jansen      integer,intent(in),dimension(nnz_tot)           :: rowp
536*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(9,nnz_tot)    :: lhsK
537*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(4,nnz_tot)    :: lhsP
538*59599516SKenneth E. Jansen      integer,intent(in),dimension(nlwork)            :: ilwork
539*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg)              :: iBC,iper
540*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(nshg,ndofBC)  :: BC
541*59599516SKenneth E. Jansen
542*59599516SKenneth E. Jansen      real(kind=8)    :: evmax,ddeg,aux1,aux0,auxom,rho
543*59599516SKenneth E. Jansen      real(kind=8),dimension(10) :: omloc
544*59599516SKenneth E. Jansen      integer :: i,j,k,lvl
545*59599516SKenneth E. Jansen
546*59599516SKenneth E. Jansen      do lvl = 1,ramg_levelx
547*59599516SKenneth E. Jansen      call ramg_mls_eigen(evmax,lvl,2,colm,rowp,lhsK,lhsP,
548*59599516SKenneth E. Jansen     &                    ilwork,BC,iBC,iper)
549*59599516SKenneth E. Jansen      smlsOm(lvl,2) = 1.0/(1.025*evmax)!*mlsCf(lvl,1)
550*59599516SKenneth E. Jansen      !mlsOm(lvl,2) = -1.0*evmax*mlsCf(lvl,1)*mlsCf(lvl,1)
551*59599516SKenneth E. Jansen      write(*,*)'mcheck: post,',evmax,smlsOm(lvl,2)
552*59599516SKenneth E. Jansen      enddo
553*59599516SKenneth E. Jansen
554*59599516SKenneth E. Jansen      end subroutine ! ramg_mls_setupPost
555*59599516SKenneth E. Jansen
556*59599516SKenneth E. Jansen!***********************************************************
557*59599516SKenneth E. Jansen!      ramg_mls_apply: u = MLS(v,(lhs,r))
558*59599516SKenneth E. Jansen!      v : approx. solution before
559*59599516SKenneth E. Jansen!      u : approx. solution (after)
560*59599516SKenneth E. Jansen!      r : residual vector, r=Ax-b
561*59599516SKenneth E. Jansen!***********************************************************
562*59599516SKenneth E. Jansen
563*59599516SKenneth E. Jansen      subroutine ramg_mls_apply(u,v,r,level,colm,rowp,lhsK,lhsP,
564*59599516SKenneth E. Jansen     &                          ilwork,BC,iBC,iper,fwdbck)
565*59599516SKenneth E. Jansen      use ramg_data
566*59599516SKenneth E. Jansen      include "common.h"
567*59599516SKenneth E. Jansen      include "mpif.h"
568*59599516SKenneth E. Jansen      include "auxmpi.h"
569*59599516SKenneth E. Jansen
570*59599516SKenneth E. Jansen      integer,intent(in),dimension(nlwork)            :: ilwork
571*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg)              :: iBC,iper
572*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(nshg,ndofBC)  :: BC
573*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg+1)       :: colm
574*59599516SKenneth E. Jansen      integer,intent(in),dimension(nnz_tot)      :: rowp
575*59599516SKenneth E. Jansen
576*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(9,nnz_tot)    :: lhsK
577*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(4,nnz_tot)    :: lhsP
578*59599516SKenneth E. Jansen
579*59599516SKenneth E. Jansen
580*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(amg_nshg(level)) :: v,r
581*59599516SKenneth E. Jansen      real(kind=8),intent(inout),dimension(amg_nshg(level)) :: u
582*59599516SKenneth E. Jansen      integer,intent(in) :: fwdbck
583*59599516SKenneth E. Jansen
584*59599516SKenneth E. Jansen      real(kind=8),dimension(amg_nshg(level)) :: aux
585*59599516SKenneth E. Jansen
586*59599516SKenneth E. Jansen!     calculate residual first if necessary
587*59599516SKenneth E. Jansen!     do not calculate residual at pre-smoothing,
588*59599516SKenneth E. Jansen!     only calculate it at post-smoothing.
589*59599516SKenneth E. Jansen      if (fwdbck.eq.2) then
590*59599516SKenneth E. Jansen          aux = -r
591*59599516SKenneth E. Jansen      else
592*59599516SKenneth E. Jansen          call ramg_calcAv_g(level,aux,v,colm,rowp,lhsK,lhsP,
593*59599516SKenneth E. Jansen     &         ilwork,BC,iBC,iper,1)
594*59599516SKenneth E. Jansen          aux = aux-r
595*59599516SKenneth E. Jansen      endif
596*59599516SKenneth E. Jansen!      if (.false.) then ! always post smoother
597*59599516SKenneth E. Jansen      if (.true.) then ! always pre smoother
598*59599516SKenneth E. Jansen          call ramg_mls_apply_fwd(u,v,aux,level,colm,rowp,lhsK,lhsP,
599*59599516SKenneth E. Jansen     &                  ilwork,BC,iBC,iper)
600*59599516SKenneth E. Jansen      else
601*59599516SKenneth E. Jansen          call ramg_mls_apply_post(u,v,aux,level,colm,rowp,lhsK,lhsP,
602*59599516SKenneth E. Jansen     &                  ilwork,BC,iBC,iper)
603*59599516SKenneth E. Jansen      endif
604*59599516SKenneth E. Jansen
605*59599516SKenneth E. Jansen      u = v-1.1*u
606*59599516SKenneth E. Jansen
607*59599516SKenneth E. Jansen      end subroutine ! ramg_mls_apply
608*59599516SKenneth E. Jansen
609*59599516SKenneth E. Jansen
610*59599516SKenneth E. Jansen      subroutine ramg_mls_apply_fwd(u,v,r,level,colm,rowp,lhsK,lhsP,
611*59599516SKenneth E. Jansen     &                          ilwork,BC,iBC,iper)
612*59599516SKenneth E. Jansen      use ramg_data
613*59599516SKenneth E. Jansen      include "common.h"
614*59599516SKenneth E. Jansen      include "mpif.h"
615*59599516SKenneth E. Jansen      include "auxmpi.h"
616*59599516SKenneth E. Jansen
617*59599516SKenneth E. Jansen      integer,intent(in),dimension(nlwork)            :: ilwork
618*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg)              :: iBC,iper
619*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(nshg,ndofBC)  :: BC
620*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg+1)       :: colm
621*59599516SKenneth E. Jansen      integer,intent(in),dimension(nnz_tot)      :: rowp
622*59599516SKenneth E. Jansen
623*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(9,nnz_tot)    :: lhsK
624*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(4,nnz_tot)    :: lhsP
625*59599516SKenneth E. Jansen
626*59599516SKenneth E. Jansen
627*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(amg_nshg(level)) :: v,r
628*59599516SKenneth E. Jansen      real(kind=8),intent(inout),dimension(amg_nshg(level)) :: u
629*59599516SKenneth E. Jansen
630*59599516SKenneth E. Jansen      ! Local
631*59599516SKenneth E. Jansen      real(kind=8),dimension(amg_nshg(level)) :: pAux,res
632*59599516SKenneth E. Jansen      real(kind=8) :: cf
633*59599516SKenneth E. Jansen      integer :: i,j,k
634*59599516SKenneth E. Jansen
635*59599516SKenneth E. Jansen      pAux = r
636*59599516SKenneth E. Jansen      ! c_1*A*r
637*59599516SKenneth E. Jansen
638*59599516SKenneth E. Jansen      cf = mlsCf(level,1)
639*59599516SKenneth E. Jansen      u = cf*pAux
640*59599516SKenneth E. Jansen      do i=2,mlsDeg
641*59599516SKenneth E. Jansen         ! c_i*A*(A*...*r)
642*59599516SKenneth E. Jansen         call ramg_calcAv_g(level,res,pAux,colm,rowp,lhsK,lhsP,
643*59599516SKenneth E. Jansen     &        ilwork,BC,iBC,iper,1)
644*59599516SKenneth E. Jansen         pAux = res
645*59599516SKenneth E. Jansen         cf = mlsCf(level,i)
646*59599516SKenneth E. Jansen         u = u+cf*res
647*59599516SKenneth E. Jansen      enddo
648*59599516SKenneth E. Jansen
649*59599516SKenneth E. Jansen      end subroutine ! ramg_mls_apply_fwd
650*59599516SKenneth E. Jansen
651*59599516SKenneth E. Jansen      subroutine ramg_mls_apply_post(u,v,r,level,colm,rowp,lhsK,lhsP,
652*59599516SKenneth E. Jansen     &                          ilwork,BC,iBC,iper)
653*59599516SKenneth E. Jansen      use ramg_data
654*59599516SKenneth E. Jansen      include "common.h"
655*59599516SKenneth E. Jansen      include "mpif.h"
656*59599516SKenneth E. Jansen      include "auxmpi.h"
657*59599516SKenneth E. Jansen
658*59599516SKenneth E. Jansen      integer,intent(in),dimension(nlwork)            :: ilwork
659*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg)              :: iBC,iper
660*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(nshg,ndofBC)  :: BC
661*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg+1)       :: colm
662*59599516SKenneth E. Jansen      integer,intent(in),dimension(nnz_tot)      :: rowp
663*59599516SKenneth E. Jansen
664*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(9,nnz_tot)    :: lhsK
665*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(4,nnz_tot)    :: lhsP
666*59599516SKenneth E. Jansen
667*59599516SKenneth E. Jansen
668*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(amg_nshg(level)) :: v,r
669*59599516SKenneth E. Jansen      real(kind=8),intent(inout),dimension(amg_nshg(level)) :: u
670*59599516SKenneth E. Jansen
671*59599516SKenneth E. Jansen      ! Local
672*59599516SKenneth E. Jansen      real(kind=8),dimension(amg_nshg(level)) :: pAux,y,res,y1
673*59599516SKenneth E. Jansen      real(kind=8) :: cf
674*59599516SKenneth E. Jansen      integer :: i,j,k
675*59599516SKenneth E. Jansen
676*59599516SKenneth E. Jansen      call ramg_mls_apply_fwd(y1,v,r,level,colm,rowp,lhsK,lhsP,
677*59599516SKenneth E. Jansen     &     ilwork,BC,iBC,iper)
678*59599516SKenneth E. Jansen!      y1=1.1*y1
679*59599516SKenneth E. Jansen      call ramg_calcAv_g(level,pAux,y1,colm,rowp,lhsK,lhsP,
680*59599516SKenneth E. Jansen     &     ilwork,BC,iBC,iper,1)
681*59599516SKenneth E. Jansen      res = b-pAux!b-pAux ! rhs to feed in post smoothing, keep y
682*59599516SKenneth E. Jansen
683*59599516SKenneth E. Jansen      call ramg_mls_sandw_post(pAux,res,level,colm,rowp,lhsK,lhsP,
684*59599516SKenneth E. Jansen     &     ilwork,BC,iBC,iper)
685*59599516SKenneth E. Jansen      call ramg_mls_sandw_pre(y,pAux,level,colm,rowp,lhsK,lhsP,
686*59599516SKenneth E. Jansen     &    ilwork,BC,iBC,iper)
687*59599516SKenneth E. Jansen      u = smlsOm(level,1)*y+y1
688*59599516SKenneth E. Jansen
689*59599516SKenneth E. Jansen      end subroutine ! ramg_mls_apply_post
690*59599516SKenneth E. Jansen
691*59599516SKenneth E. Jansen      subroutine ramg_mls_sandw_pre(u,v,level,colm,rowp,lhsK,lhsP,
692*59599516SKenneth E. Jansen     &                          ilwork,BC,iBC,iper)
693*59599516SKenneth E. Jansen      use ramg_data
694*59599516SKenneth E. Jansen      include "common.h"
695*59599516SKenneth E. Jansen      include "mpif.h"
696*59599516SKenneth E. Jansen      include "auxmpi.h"
697*59599516SKenneth E. Jansen
698*59599516SKenneth E. Jansen      integer,intent(in),dimension(nlwork)            :: ilwork
699*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg)              :: iBC,iper
700*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(nshg,ndofBC)  :: BC
701*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg+1)       :: colm
702*59599516SKenneth E. Jansen      integer,intent(in),dimension(nnz_tot)      :: rowp
703*59599516SKenneth E. Jansen
704*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(9,nnz_tot)    :: lhsK
705*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(4,nnz_tot)    :: lhsP
706*59599516SKenneth E. Jansen
707*59599516SKenneth E. Jansen
708*59599516SKenneth E. Jansen      real(kind=8),intent(inout),dimension(amg_nshg(level)) :: v
709*59599516SKenneth E. Jansen      real(kind=8),intent(inout),dimension(amg_nshg(level)) :: u
710*59599516SKenneth E. Jansen
711*59599516SKenneth E. Jansen      ! Local
712*59599516SKenneth E. Jansen      real(kind=8),dimension(amg_nshg(level)) :: res
713*59599516SKenneth E. Jansen      real(kind=8) :: cf
714*59599516SKenneth E. Jansen      integer :: i,j,k
715*59599516SKenneth E. Jansen
716*59599516SKenneth E. Jansen      u = v
717*59599516SKenneth E. Jansen      ! c_1*A*r
718*59599516SKenneth E. Jansen
719*59599516SKenneth E. Jansen      do i=mlsDeg,1,-1
720*59599516SKenneth E. Jansen         call ramg_calcAv_g(level,res,u,colm,rowp,lhsK,lhsP,
721*59599516SKenneth E. Jansen     &        ilwork,BC,iBC,iper,1)
722*59599516SKenneth E. Jansen         u = u-mlsOm(level,i)*res
723*59599516SKenneth E. Jansen      enddo
724*59599516SKenneth E. Jansen
725*59599516SKenneth E. Jansen      end subroutine ! ramg_mls_sandw_pre
726*59599516SKenneth E. Jansen
727*59599516SKenneth E. Jansen      subroutine ramg_mls_sandw_post(u,v,level,colm,rowp,lhsK,lhsP,
728*59599516SKenneth E. Jansen     &                          ilwork,BC,iBC,iper)
729*59599516SKenneth E. Jansen      use ramg_data
730*59599516SKenneth E. Jansen      include "common.h"
731*59599516SKenneth E. Jansen      include "mpif.h"
732*59599516SKenneth E. Jansen      include "auxmpi.h"
733*59599516SKenneth E. Jansen
734*59599516SKenneth E. Jansen      integer,intent(in),dimension(nlwork)            :: ilwork
735*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg)              :: iBC,iper
736*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(nshg,ndofBC)  :: BC
737*59599516SKenneth E. Jansen      integer,intent(in),dimension(nshg+1)       :: colm
738*59599516SKenneth E. Jansen      integer,intent(in),dimension(nnz_tot)      :: rowp
739*59599516SKenneth E. Jansen
740*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(9,nnz_tot)    :: lhsK
741*59599516SKenneth E. Jansen      real(kind=8),intent(in),dimension(4,nnz_tot)    :: lhsP
742*59599516SKenneth E. Jansen
743*59599516SKenneth E. Jansen
744*59599516SKenneth E. Jansen      real(kind=8),intent(inout),dimension(amg_nshg(level)) :: v
745*59599516SKenneth E. Jansen      real(kind=8),intent(inout),dimension(amg_nshg(level)) :: u
746*59599516SKenneth E. Jansen
747*59599516SKenneth E. Jansen      ! Local
748*59599516SKenneth E. Jansen      real(kind=8),dimension(amg_nshg(level)) :: res
749*59599516SKenneth E. Jansen      real(kind=8) :: cf
750*59599516SKenneth E. Jansen      integer :: i,j,k
751*59599516SKenneth E. Jansen
752*59599516SKenneth E. Jansen      u = v
753*59599516SKenneth E. Jansen      ! c_1*A*r
754*59599516SKenneth E. Jansen
755*59599516SKenneth E. Jansen      do i=1,mlsDeg,1
756*59599516SKenneth E. Jansen         call ramg_calcAv_g(level,res,u,colm,rowp,lhsK,lhsP,
757*59599516SKenneth E. Jansen     &        ilwork,BC,iBC,iper,1)
758*59599516SKenneth E. Jansen         u = u-mlsOm(level,i)*res
759*59599516SKenneth E. Jansen      enddo
760*59599516SKenneth E. Jansen
761*59599516SKenneth E. Jansen      end subroutine ! ramg_mls_sandw_post
762*59599516SKenneth E. Jansen
763