1*59599516SKenneth E. Jansen!********************************************************* 2*59599516SKenneth E. Jansen! ramg control 3*59599516SKenneth E. Jansen! Control AMG preparation/solve process 4*59599516SKenneth E. Jansen! will have dynamic control (based on solver vecters) 5*59599516SKenneth E. Jansen!********************************************************* 6*59599516SKenneth E. Jansen 7*59599516SKenneth E. Jansen subroutine ramg_control(colm,rowp,lhsK,lhsP, 8*59599516SKenneth E. Jansen & ilwork,BC,iBC,iper) 9*59599516SKenneth E. Jansen use ramg_data 10*59599516SKenneth E. Jansen include "common.h" 11*59599516SKenneth E. Jansen 12*59599516SKenneth E. Jansen integer,intent(in),dimension(nshg+1) :: colm 13*59599516SKenneth E. Jansen integer,intent(in),dimension(nnz_tot) :: rowp 14*59599516SKenneth E. Jansen real(kind=8),intent(in),dimension(9,nnz_tot) :: lhsK 15*59599516SKenneth E. Jansen real(kind=8),intent(in),dimension(4,nnz_tot) :: lhsP 16*59599516SKenneth E. Jansen ! the boundary info 17*59599516SKenneth E. Jansen integer, intent(in), dimension(nlwork) :: ilwork 18*59599516SKenneth E. Jansen integer, intent(in),dimension(nshg) :: iBC,iper 19*59599516SKenneth E. Jansen real(kind=8),intent(in),dimension(nshg,ndofBC) :: BC 20*59599516SKenneth E. Jansen 21*59599516SKenneth E. Jansen integer i 22*59599516SKenneth E. Jansen 23*59599516SKenneth E. Jansen if (iamg_init .eq. 0 ) then 24*59599516SKenneth E. Jansen ! The overall initialization 25*59599516SKenneth E. Jansen ! do init 26*59599516SKenneth E. Jansen ramg_winct = 0 27*59599516SKenneth E. Jansen ramg_setup_flag = 0 28*59599516SKenneth E. Jansen iamg_init = 1 29*59599516SKenneth E. Jansen ramg_time = 0 30*59599516SKenneth E. Jansen else 31*59599516SKenneth E. Jansen ramg_setup_flag = mod(ramg_setup_flag+1 ,iamg_setup_frez) 32*59599516SKenneth E. Jansen end if 33*59599516SKenneth E. Jansen 34*59599516SKenneth E. Jansen ! Extract PPE 35*59599516SKenneth E. Jansen call ramg_extract_ppe(colm,rowp,lhsK,lhsP, 36*59599516SKenneth E. Jansen & ilwork,BC,iBC,iper) 37*59599516SKenneth E. Jansen ! Coarsening 38*59599516SKenneth E. Jansen call ramg_prep(ilwork,BC,iBC,iper) 39*59599516SKenneth E. Jansen call ramg_init_ilwork(ilwork,BC,iBC,iper) 40*59599516SKenneth E. Jansen ! Prepare for MLS smoothing 41*59599516SKenneth E. Jansen if (iamg_smoother.eq.2) then 42*59599516SKenneth E. Jansen call ramg_cheby_setup(colm,rowp,lhsK,lhsP, 43*59599516SKenneth E. Jansen & ilwork,BC,iBC,iper) 44*59599516SKenneth E. Jansen else 45*59599516SKenneth E. Jansen call ramg_mls_setup(colm,rowp,lhsK,lhsP, 46*59599516SKenneth E. Jansen & ilwork,BC,iBC,iper) 47*59599516SKenneth E. Jansen endif 48*59599516SKenneth E. Jansen if (iamg_c_solver.eq.2) then 49*59599516SKenneth E. Jansen ! Setup Coarsest Direct solver 50*59599516SKenneth E. Jansen call ramg_direct_LU(amg_A_colm(ramg_levelx)%p, 51*59599516SKenneth E. Jansen & amg_A_rowp(ramg_levelx)%p, 52*59599516SKenneth E. Jansen & amg_A_lhs(ramg_levelx)%p,amg_nshg(ramg_levelx), 53*59599516SKenneth E. Jansen & amg_nnz(ramg_levelx)) 54*59599516SKenneth E. Jansen endif 55*59599516SKenneth E. Jansen if (maxnev.gt.0) then 56*59599516SKenneth E. Jansen ! Setup GGB 57*59599516SKenneth E. Jansen call ramg_ggb_setup(colm,rowp,lhsK,lhsP,ilwork,BC,iBC,iper) 58*59599516SKenneth E. Jansen endif 59*59599516SKenneth E. Jansen 60*59599516SKenneth E. Jansen 61*59599516SKenneth E. Jansen end subroutine !ramg_control 62*59599516SKenneth E. Jansen 63*59599516SKenneth E. Jansen!********************************************************* 64*59599516SKenneth E. Jansen! Ramg preparation 65*59599516SKenneth E. Jansen!********************************************************* 66*59599516SKenneth E. Jansen 67*59599516SKenneth E. Jansen subroutine ramg_prep(ilwork,BC,iBC,iper) 68*59599516SKenneth E. Jansen use ramg_data 69*59599516SKenneth E. Jansen include "common.h" 70*59599516SKenneth E. Jansen include "mpif.h" 71*59599516SKenneth E. Jansen include "auxmpi.h" 72*59599516SKenneth E. Jansen 73*59599516SKenneth E. Jansen integer,intent(in),dimension(nlwork) :: ilwork 74*59599516SKenneth E. Jansen integer,intent(in),dimension(nshg) :: iBC,iper 75*59599516SKenneth E. Jansen real(kind=8),intent(in),dimension(nshg,ndofBC) :: BC 76*59599516SKenneth E. Jansen 77*59599516SKenneth E. Jansen logical :: maxstopsign,mxs2 78*59599516SKenneth E. Jansen integer :: i,p,p2 79*59599516SKenneth E. Jansen 80*59599516SKenneth E. Jansen if (ramg_setup_flag.ne.0) return 81*59599516SKenneth E. Jansen maxstopsign = .false. 82*59599516SKenneth E. Jansen i = 1 83*59599516SKenneth E. Jansen do while ((i+1.le.iamg_nlevel) .and. (.not.maxstopsign)) 84*59599516SKenneth E. Jansen if (amg_nshg(i+1).ne.0) then 85*59599516SKenneth E. Jansen call ramg_deallocate(i+1) 86*59599516SKenneth E. Jansen end if 87*59599516SKenneth E. Jansen call ramg_coarse_setup(i,i+1,strong_eps,iamg_interp, 88*59599516SKenneth E. Jansen & ramg_trunc, 89*59599516SKenneth E. Jansen & ilwork,BC,iBC,iper,nshg,nlwork,ndofBC) 90*59599516SKenneth E. Jansen call ramg_calcITAI(i,i+1,maxstopsign) 91*59599516SKenneth E. Jansen if ((iamg_verb.gt.2).and.(myrank.eq.master)) then 92*59599516SKenneth E. Jansen write(*,*)'COARSEN: level:',i+1,' nshg:',amg_nshg(i+1), 93*59599516SKenneth E. Jansen & ' nnz:',amg_nnz(i+1) 94*59599516SKenneth E. Jansen endif 95*59599516SKenneth E. Jansen i = i+1 96*59599516SKenneth E. Jansen call MPI_Barrier(MPI_COMM_WORLD,ierr) 97*59599516SKenneth E. Jansen maxstopsign = (amg_nshg(i).eq.amg_nshg(i-1)) 98*59599516SKenneth E. Jansen IF (.true.) THEN 99*59599516SKenneth E. Jansen !call ramg_checkcoarse(i,ilwork,BC,iBC,iper,maxstopsign) 100*59599516SKenneth E. Jansen p = 1 101*59599516SKenneth E. Jansen if (maxstopsign) p = 0 102*59599516SKenneth E. Jansen call MPI_AllReduce(p,p2,1,MPI_INTEGER,MPI_SUM, 103*59599516SKenneth E. Jansen & MPI_COMM_WORLD,ierr) 104*59599516SKenneth E. Jansen if (p2.eq.0) then 105*59599516SKenneth E. Jansen maxstopsign = .true. 106*59599516SKenneth E. Jansen !write(*,*)'mcheck stopped' 107*59599516SKenneth E. Jansen else 108*59599516SKenneth E. Jansen maxstopsign = .false. 109*59599516SKenneth E. Jansen endif 110*59599516SKenneth E. Jansen ENDIF 111*59599516SKenneth E. Jansen enddo 112*59599516SKenneth E. Jansen ramg_levelx=i 113*59599516SKenneth E. Jansen if (maxstopsign) then 114*59599516SKenneth E. Jansen ramg_levelx = ramg_levelx-1 115*59599516SKenneth E. Jansen endif 116*59599516SKenneth E. Jansen 117*59599516SKenneth E. Jansen! if ( (irun_amg_prec.eq.1).and.(mlsDeg.gt.0) ) then 118*59599516SKenneth E. Jansen if (.false.) then 119*59599516SKenneth E. Jansen deallocate(amg_A_colm(1)%p) 120*59599516SKenneth E. Jansen deallocate(amg_A_rowp(1)%p) 121*59599516SKenneth E. Jansen deallocate(amg_A_lhs(1)%p) 122*59599516SKenneth E. Jansen endif 123*59599516SKenneth E. Jansen 124*59599516SKenneth E. Jansen allocate(CF_map(ramg_levelx)%p(amg_nshg(ramg_levelx))) 125*59599516SKenneth E. Jansen allocate(CF_revmap(ramg_levelx)%p(amg_nshg(ramg_levelx))) 126*59599516SKenneth E. Jansen do i=1,amg_nshg(ramg_levelx) 127*59599516SKenneth E. Jansen CF_map(ramg_levelx)%p(i) = i 128*59599516SKenneth E. Jansen CF_revmap(ramg_levelx)%p(i) = i 129*59599516SKenneth E. Jansen enddo 130*59599516SKenneth E. Jansen 131*59599516SKenneth E. Jansen !call ramg_output_coarsening 132*59599516SKenneth E. Jansen 133*59599516SKenneth E. Jansen end subroutine !ramg_prep 134*59599516SKenneth E. Jansen 135*59599516SKenneth E. Jansen subroutine ramg_checkcoarse(level1,ilwork,BC,iBC,iper, 136*59599516SKenneth E. Jansen & cfstop) 137*59599516SKenneth E. Jansen use ramg_data 138*59599516SKenneth E. Jansen include "common.h" 139*59599516SKenneth E. Jansen include "mpif.h" 140*59599516SKenneth E. Jansen include "auxmpi.h" 141*59599516SKenneth E. Jansen 142*59599516SKenneth E. Jansen integer,intent(in) :: level1 143*59599516SKenneth E. Jansen integer,intent(in),dimension(nlwork) :: ilwork 144*59599516SKenneth E. Jansen integer,intent(in),dimension(nshg) :: iBC,iper 145*59599516SKenneth E. Jansen real(kind=8),intent(in),dimension(nshg,ndofBC) :: BC 146*59599516SKenneth E. Jansen 147*59599516SKenneth E. Jansen logical,intent(inout) :: cfstop 148*59599516SKenneth E. Jansen integer :: i,numtask,itkbeg,numseg,iacc 149*59599516SKenneth E. Jansen integer :: j,k,p 150*59599516SKenneth E. Jansen integer,allocatable,dimension(:) 151*59599516SKenneth E. Jansen & :: subcfstop,subnnz,subcf,subcfrev,subnei 152*59599516SKenneth E. Jansen real(kind=8) :: rhoratio 153*59599516SKenneth E. Jansen logical :: subneireduce 154*59599516SKenneth E. Jansen 155*59599516SKenneth E. Jansen IF (( iamg_reduce.le.1).or.(numpe.gt.1)) THEN 156*59599516SKenneth E. Jansen! IF (.TRUE.) THEN 157*59599516SKenneth E. Jansen if (numpe.ge.2) then 158*59599516SKenneth E. Jansen numtask = ilwork(1)+1 159*59599516SKenneth E. Jansen else 160*59599516SKenneth E. Jansen numtask = 1 161*59599516SKenneth E. Jansen endif 162*59599516SKenneth E. Jansen 163*59599516SKenneth E. Jansen allocate(subcfrev(numpe)) 164*59599516SKenneth E. Jansen subcfrev = 0 165*59599516SKenneth E. Jansen allocate(subnei(numtask)) 166*59599516SKenneth E. Jansen subnei = 0 167*59599516SKenneth E. Jansen 168*59599516SKenneth E. Jansen subnei(1) = myrank+1 169*59599516SKenneth E. Jansen subcfrev(subnei(1))=1 170*59599516SKenneth E. Jansen itkbeg = 1 171*59599516SKenneth E. Jansen do i=2,numtask 172*59599516SKenneth E. Jansen subnei(i)=ilwork(itkbeg+3)+1 173*59599516SKenneth E. Jansen subcfrev(subnei(i)) = i 174*59599516SKenneth E. Jansen itkbeg = itkbeg + 4 + 2*ilwork(itkbeg+4) 175*59599516SKenneth E. Jansen enddo 176*59599516SKenneth E. Jansen 177*59599516SKenneth E. Jansen ELSE !reduced 178*59599516SKenneth E. Jansen numtask = rmapmax-1 179*59599516SKenneth E. Jansen allocate(subcfrev(numtask)) 180*59599516SKenneth E. Jansen allocate(subnei(numtask)) 181*59599516SKenneth E. Jansen do i=1,numtask 182*59599516SKenneth E. Jansen subcfrev(i) = i 183*59599516SKenneth E. Jansen enddo 184*59599516SKenneth E. Jansen ENDIF 185*59599516SKenneth E. Jansen 186*59599516SKenneth E. Jansen allocate(subcfstop(numtask)) 187*59599516SKenneth E. Jansen allocate(subcf(numtask)) 188*59599516SKenneth E. Jansen allocate(subnnz(numtask)) 189*59599516SKenneth E. Jansen subcfstop = 0 190*59599516SKenneth E. Jansen subcf = 0 191*59599516SKenneth E. Jansen subnnz = 0 192*59599516SKenneth E. Jansen 193*59599516SKenneth E. Jansen 194*59599516SKenneth E. Jansen do i = 1,amg_nnz(level1) 195*59599516SKenneth E. Jansen k = amg_A_rowp(level1)%p(i) 196*59599516SKenneth E. Jansen p = iabs(amg_paramap(level1)%p(k)) 197*59599516SKenneth E. Jansen! if (iamg_reduce.gt.1) then 198*59599516SKenneth E. Jansen! p = 1 ! for reduced only 199*59599516SKenneth E. Jansen! endif 200*59599516SKenneth E. Jansen p = subcfrev(p) 201*59599516SKenneth E. Jansen subnnz(p) = subnnz(p) + 1 202*59599516SKenneth E. Jansen enddo 203*59599516SKenneth E. Jansen do i = 1,amg_nshg(level1) 204*59599516SKenneth E. Jansen p = iabs(amg_paramap(level1)%p(i)) 205*59599516SKenneth E. Jansen! if (iamg_reduce.gt.1) then 206*59599516SKenneth E. Jansen! p = 1 ! for reduced only 207*59599516SKenneth E. Jansen! endif 208*59599516SKenneth E. Jansen p = subcfrev(p) 209*59599516SKenneth E. Jansen subcf(p) = subcf(p) + 1 210*59599516SKenneth E. Jansen enddo 211*59599516SKenneth E. Jansen 212*59599516SKenneth E. Jansen do i=1,numtask 213*59599516SKenneth E. Jansen IF ((iamg_reduce.le.1).or.(numpe.gt.1)) THEN 214*59599516SKenneth E. Jansen! IF (.TRUE.) THEN 215*59599516SKenneth E. Jansen p = subnei(i) 216*59599516SKenneth E. Jansen subneireduce = (p.ne.(myrank+1)) 217*59599516SKenneth E. Jansen ELSE !reduced 218*59599516SKenneth E. Jansen subneireduce = (i.gt.iamg_reduce) 219*59599516SKenneth E. Jansen END IF 220*59599516SKenneth E. Jansen if ((subcf(i).lt.30).and.subneireduce) then 221*59599516SKenneth E. Jansen subcfstop(i) = 1 222*59599516SKenneth E. Jansen endif 223*59599516SKenneth E. Jansen if (.not.subneireduce) then 224*59599516SKenneth E. Jansen if (subcf(i).lt.200) then 225*59599516SKenneth E. Jansen subcfstop(i) = 1 226*59599516SKenneth E. Jansen endif 227*59599516SKenneth E. Jansen if ((subnnz(i)/(subcf(i)**2)).gt.0.6) then 228*59599516SKenneth E. Jansen subcfstop(i) = 1 229*59599516SKenneth E. Jansen endif 230*59599516SKenneth E. Jansen end if 231*59599516SKenneth E. Jansen enddo 232*59599516SKenneth E. Jansen 233*59599516SKenneth E. Jansen cfstop = .true. 234*59599516SKenneth E. Jansen do i=1,numtask 235*59599516SKenneth E. Jansen if (subcfstop(i).eq.0) then 236*59599516SKenneth E. Jansen cfstop = .false. 237*59599516SKenneth E. Jansen exit 238*59599516SKenneth E. Jansen endif 239*59599516SKenneth E. Jansen enddo 240*59599516SKenneth E. Jansen 241*59599516SKenneth E. Jansen 242*59599516SKenneth E. Jansen IF ((iamg_reduce.le.1).or.(numpe.gt.1)) THEN 243*59599516SKenneth E. Jansen ! if interior is coarsened, boundary should be fixed whatever 244*59599516SKenneth E. Jansen if (subcfstop(1).eq.1) then 245*59599516SKenneth E. Jansen cfstop = .true. 246*59599516SKenneth E. Jansen endif 247*59599516SKenneth E. Jansen ENDIF 248*59599516SKenneth E. Jansen 249*59599516SKenneth E. Jansen if (.not.cfstop) then 250*59599516SKenneth E. Jansen do i=1,amg_nshg(level1) 251*59599516SKenneth E. Jansen p = iabs(amg_paramap(level1)%p(i)) 252*59599516SKenneth E. Jansen! if (iamg_reduce.gt.1) then 253*59599516SKenneth E. Jansen! p = 1 ! reduced only 254*59599516SKenneth E. Jansen! endif 255*59599516SKenneth E. Jansen p = subcfrev(p) 256*59599516SKenneth E. Jansen if (subcfstop(p).eq.1) then 257*59599516SKenneth E. Jansen amg_paramap(level1)%p(i) = -iabs(amg_paramap(level1)%p(i)) 258*59599516SKenneth E. Jansen endif 259*59599516SKenneth E. Jansen enddo 260*59599516SKenneth E. Jansen endif 261*59599516SKenneth E. Jansen 262*59599516SKenneth E. Jansen deallocate(subcfrev) 263*59599516SKenneth E. Jansen deallocate(subnei) 264*59599516SKenneth E. Jansen deallocate(subcfstop) 265*59599516SKenneth E. Jansen deallocate(subcf) 266*59599516SKenneth E. Jansen deallocate(subnnz) 267*59599516SKenneth E. Jansen 268*59599516SKenneth E. Jansen end subroutine ! ramg_checkcoarse 269*59599516SKenneth E. Jansen 270*59599516SKenneth E. Jansen!****************************************************************** 271*59599516SKenneth E. Jansen! A bunch of code that hook to leslib's cg solve 272*59599516SKenneth E. Jansen! Force it to restart with AMG if meets plateau 273*59599516SKenneth E. Jansen!****************************************************************** 274*59599516SKenneth E. Jansen 275*59599516SKenneth E. Jansen!******** 276*59599516SKenneth E. Jansen! sc writes: 277*59599516SKenneth E. Jansen! irun_amg_prec is a variable controling how to use AMG wisely. 278*59599516SKenneth E. Jansen! 0 : no run 279*59599516SKenneth E. Jansen! 1 : always use AMG prec'd CG 280*59599516SKenneth E. Jansen! 2 : restart CG a ( if plain CG hits plateau, do again with AMG ) 281*59599516SKenneth E. Jansen! 3 : restart CG b ( if plain exceeds maxiter, do again with AMG ) 282*59599516SKenneth E. Jansen! also refer to input.config for a detailed description. 283*59599516SKenneth E. Jansen!******** 284*59599516SKenneth E. Jansen 285*59599516SKenneth E. Jansen 286*59599516SKenneth E. Jansen subroutine ramg_normcheck(tmpnorm) 287*59599516SKenneth E. Jansen use ramg_data 288*59599516SKenneth E. Jansen 289*59599516SKenneth E. Jansen include "common.h" 290*59599516SKenneth E. Jansen include "mpif.h" 291*59599516SKenneth E. Jansen 292*59599516SKenneth E. Jansen real(kind=8),intent(inout) :: tmpnorm 293*59599516SKenneth E. Jansen real(kind=8) :: sqnorm 294*59599516SKenneth E. Jansen 295*59599516SKenneth E. Jansen !write(*,*)myrank,' winct:',ramg_winct,sqrt(tmpnorm) 296*59599516SKenneth E. Jansen !return 297*59599516SKenneth E. Jansen if (irun_amg_prec.ne.2) return ! No control at all 298*59599516SKenneth E. Jansen if (ramg_winct.eq.0) then 299*59599516SKenneth E. Jansen !ramg_window = sqrt(tmpnorm) 300*59599516SKenneth E. Jansen return ! Not relevant 301*59599516SKenneth E. Jansen endif 302*59599516SKenneth E. Jansen ramg_winct=0 303*59599516SKenneth E. Jansen if (ramg_flag.gt.1) return ! Second run does not need control 304*59599516SKenneth E. Jansen 305*59599516SKenneth E. Jansen ! Following are for the first run 306*59599516SKenneth E. Jansen !write(*,*)'normcheck: ',sqnorm 307*59599516SKenneth E. Jansen !return; 308*59599516SKenneth E. Jansen 309*59599516SKenneth E. Jansen if (ramg_redo.ge.100) then 310*59599516SKenneth E. Jansen ! The rest of GMRES should be terminated 311*59599516SKenneth E. Jansen if (ramg_redo.lt.104) then 312*59599516SKenneth E. Jansen ramg_winct = 1 313*59599516SKenneth E. Jansen ramg_redo=ramg_redo+1 314*59599516SKenneth E. Jansen! write(*,*)'***' 315*59599516SKenneth E. Jansen else 316*59599516SKenneth E. Jansen ramg_redo = 0 317*59599516SKenneth E. Jansen tmpnorm = 0 318*59599516SKenneth E. Jansen endif 319*59599516SKenneth E. Jansen return 320*59599516SKenneth E. Jansen endif 321*59599516SKenneth E. Jansen sqnorm = sqrt(tmpnorm) 322*59599516SKenneth E. Jansen 323*59599516SKenneth E. Jansen if (ramg_redo.le.7) then 324*59599516SKenneth E. Jansen ramg_redo = ramg_redo + 1 325*59599516SKenneth E. Jansen call ramg_winpushin(sqnorm) 326*59599516SKenneth E. Jansen return 327*59599516SKenneth E. Jansen endif 328*59599516SKenneth E. Jansen 329*59599516SKenneth E. Jansen call ramg_winpushin(sqnorm) 330*59599516SKenneth E. Jansen 331*59599516SKenneth E. Jansen if (ramg_window(7).gt.ramg_window(1)) then ! Stop point 332*59599516SKenneth E. Jansen! write(*,*)'myrank:',myrank,ramg_window(7),ramg_window(1) 333*59599516SKenneth E. Jansen! if (ramg_window(7).lt.1e-3) then 334*59599516SKenneth E. Jansen ! stop point in cg 335*59599516SKenneth E. Jansen if (myrank.eq.master) then 336*59599516SKenneth E. Jansen write(*,*)"Prepare to restart CG" 337*59599516SKenneth E. Jansen endif 338*59599516SKenneth E. Jansen tmpnorm = 0 339*59599516SKenneth E. Jansen ramg_redo = 100 340*59599516SKenneth E. Jansen ramg_winct = 1 341*59599516SKenneth E. Jansen ramg_flag = ramg_flag -1 342*59599516SKenneth E. Jansen endif 343*59599516SKenneth E. Jansen 344*59599516SKenneth E. Jansen end subroutine ! ramg_normcheck 345*59599516SKenneth E. Jansen 346*59599516SKenneth E. Jansen subroutine ramg_winpushin(sqnorm) 347*59599516SKenneth E. Jansen use ramg_data 348*59599516SKenneth E. Jansen include "common.h" 349*59599516SKenneth E. Jansen include "mpif.h" 350*59599516SKenneth E. Jansen 351*59599516SKenneth E. Jansen real(kind=8),intent(in) :: sqnorm 352*59599516SKenneth E. Jansen integer i 353*59599516SKenneth E. Jansen integer totlen 354*59599516SKenneth E. Jansen 355*59599516SKenneth E. Jansen totlen = 7 356*59599516SKenneth E. Jansen 357*59599516SKenneth E. Jansen do i=1,totlen-1 358*59599516SKenneth E. Jansen ramg_window(i)=ramg_window(i+1) 359*59599516SKenneth E. Jansen enddo 360*59599516SKenneth E. Jansen ramg_window(totlen) = sqnorm 361*59599516SKenneth E. Jansen 362*59599516SKenneth E. Jansen end subroutine ! ramg_winpushin 363*59599516SKenneth E. Jansen 364*59599516SKenneth E. Jansen 365*59599516SKenneth E. Jansen!********************************************************* 366*59599516SKenneth E. Jansen! <EOF> RAMG Control 367*59599516SKenneth E. Jansen!********************************************************* 368