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