xref: /phasta/phSolver/AMG/ramg_control.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
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