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