SUBROUTINE tick( iout,nstart, nstop ) 1,5 INCLUDE 'agrialloc.inc' INCLUDE 'nodal.inc' INCLUDE 'agricst.inc' DIMENSION intcnt(10),icheck(10),iout(6) LOGICAL :: tprint,aprint DATA tprint /.true./ DATA aprint/.false./ ! !----------------------------------------------------------------------- ! ! parameters: ! ! nstart = # of coarse grid time steps corresponding to start time. ! nstop = # of coarse grid time steps corresponding to stop time. ! iout = output interval every 'iout' coarse time steps ! there are three io options at present ! ! main driver routine. controls: ! ! integration of all grids. ! error estimation / regridding ! output counting ! updating of fine to coarse grids ! ! integration strategy is to advance a fine grid until one step of ! the coarser grid would catch up to it. ! ! array intcnt counts down from levmlt for the number of times ! a grid is integrated, to determine who should be integrated next. ! array icheck also counts (down from ncheck) to keep track of ! when that level should have its error estimated/regridding. ! !----------------------------------------------------------------------- ! time = rnode(20,mstart) DO i = 1, mxnest icheck(i) = ncheck(i) END DO ! !----------------------------------------------------------------------- ! ! start of coarse grid integration loop ! !----------------------------------------------------------------------- ! delt0=possk(mstart) DO nstepc=nstart+1,nstop ! WRITE(6,'('' COARSE GRID STEP '',I5)') nstepc ! DO i=1, mxnest intcnt(i) = levmlt(i) END DO ! level = 1 ! 30 IF(intcnt(level) > 0) GO TO 60 ! !----------------------------------------------------------------------- ! ! find next level to be integrated ! !----------------------------------------------------------------------- ! 40 IF (level <= 1) GO TO 45 level = level - 1 IF (intcnt(level) <= 0) GO TO 40 GO TO 50 45 IF (level == 1) GO TO 110 50 lp = level+1 DO i = lp,lfine intcnt(i) = levmlt(i) END DO ! IF(verbose6) WRITE(6,'(''CALLING UPDATE FOR LEVEL '',I5)') level CALL update( level ) WRITE(6,'(''UPDATE CALLED FOR LEVEL '',I5)') level ! !----------------------------------------------------------------------- ! ! regridding time? ! !----------------------------------------------------------------------- ! 60 IF (icheck(level) > 0) GO TO 90 ! !----------------------------------------------------------------------- ! ! regrid level 'level+1' up to finest level. ! level 'lbase' stays fixed. ! ! Not implemented yet. ! !----------------------------------------------------------------------- ! WRITE(6,*) ' calling regrid in tick ' WRITE(6,*) ' regrid not implemented yet for call here ' STOP ! ! lbase = level ! if (tprint) write(6,101) lbase !101 format(8h level ,i5,32h stays fixed during regridding ) ! ! call regrd1( lbase,.true. ) ! ! call outtre( mstart,.false. ) ! ! maybe finest level in existence has changed. reset counters. ! ! do 80 i = lbase, lfine ! icheck(i) = ncheck(i) !80 continue ! !----------------------------------------------------------------------- ! ! done regridding -------------------- ! !----------------------------------------------------------------------- ! 90 CONTINUE ! !----------------------------------------------------------------------- ! ! Integrate all grids at level 'level'. ! !----------------------------------------------------------------------- ! CALL advanc( level) ! !----------------------------------------------------------------------- ! ! Done with a level of integration. update counts, decide who next. ! !----------------------------------------------------------------------- ! intcnt(level) = intcnt(level) - 1 icheck(level) = icheck(level) - 1 IF (level < lfine) level = level + 1 GO TO 30 ! !----------------------------------------------------------------------- ! ! One complete coarse grid integration cycle done. ! !----------------------------------------------------------------------- ! 110 CONTINUE ! !----------------------------------------------------------------------- ! ! Update all grids at levels finest-1 to level ! !----------------------------------------------------------------------- ! ! print*,'calling update after statement 110' ! write(6,'(''Calling UPDATE for level '',i5)') level CALL update( level ) ! write(6,'(''Called UPDATE for level '',i5)') level time = time + delt0 ! !----------------------------------------------------------------------- ! ! Data output ! !----------------------------------------------------------------------- ! IF ( ( (iout(1) > 0 .AND. MOD(nstepc,iout(1)) == 0) .OR. & (iout(2) > 0 .AND. MOD(nstepc,iout(2)) == 0) .OR. & (iout(3) > 0 .AND. MOD(nstepc,iout(3)) == 0) .OR. & (iout(4) > 0 .AND. MOD(nstepc,iout(4)) == 0) ) .AND. & nstepc >= iout(6) )THEN CALL usrout1( 1,lfine, 0 ) END IF ! !----------------------------------------------------------------------- ! ! Run time plotting: ! !----------------------------------------------------------------------- ! ! IF( iout(5).gt.0 .and. mod(nstepc,iout(5)).eq.0) ) call pltall(3) ! !----------------------------------------------------------------------- ! ! Dump out restart data every iout(3) base grid time steps ! !----------------------------------------------------------------------- ! IF ( iout(3) > 0 .AND. MOD(nstepc,iout(3)) == 0 .AND. & nstepc >= iout(6) ) THEN WRITE(6,'('' DUMPING RESTRART DATA AT TIME='',F10.2)') time CALL rstrdwr(2,time) WRITE(6,'(1x,a,i20)') 'Alloc dimension was ',lstore END IF ! !----------------------------------------------------------------------- ! ! Print the cpu statistics ! !----------------------------------------------------------------------- ! ! cpu_simulation = f_cputime() - cpu_simulation ! call prtcpu(1,6) ! !----------------------------------------------------------------------- ! ! End of one entire coarse grid time step integration cycle ! !----------------------------------------------------------------------- ! WRITE(6,'(1x,a,i20)') 'Maximum alloc used was ',ihighwater END DO RETURN END SUBROUTINE tick ! SUBROUTINE regrd1( lbase,rdbpts ) ! !----------------------------------------------------------------------- ! ! Not implemented. ! !----------------------------------------------------------------------- ! LOGICAL :: rdbpts WRITE(6,'('' IN REGRD1 FOR LBASE '',I4)') lbase WRITE(6,'('' RDBPTS IS '',L1)') rdbpts RETURN END SUBROUTINE regrd1 ! SUBROUTINE update( level ) 2,3 ! !----------------------------------------------------------------------- ! ! Update all grids at levels finest-1 to level ! !----------------------------------------------------------------------- ! INCLUDE 'nodal.inc' INCLUDE 'agricpu.inc' INCLUDE 'agricst.inc' cpu0 = f_cputime() lget = lfine - 1 4 IF(lget < level) GO TO 999 mptr = lstart(lget) 5 IF (mptr == 0) GO TO 998 ! IF(verbose6)WRITE(6,'('' CALLING UPDGRD FOR GRID '',I5)') mptr CALL updgrd( mptr ) IF(verbose6)WRITE(6,'('' UPDGRD CALLED FOR GRID '',I5)') mptr ! ! !----------------------------------------------------------------------- ! ! Take care of next grid ! !----------------------------------------------------------------------- ! mptr = node(10,mptr) GO TO 5 998 CONTINUE ! !----------------------------------------------------------------------- ! ! Update next coarser level ! !----------------------------------------------------------------------- ! lget = lget - 1 GO TO 4 ! 999 CONTINUE cpu_update = cpu_update + f_cputime() - cpu0 RETURN END SUBROUTINE update ! SUBROUTINE advanc( level ) 1,3 ! !----------------------------------------------------------------------- ! ! This routine advances all grids at level 'level' a single timestep. ! It also calls tha appropriate boundary conditions routines for ! interpolating fine grid boundary values ! ! Interpolate boundary values for all grids at this level from ! coarser grids if necessary ! !----------------------------------------------------------------------- ! INCLUDE 'nodal.inc' INCLUDE 'agrialloc.inc' INCLUDE 'agricst.inc' LOGICAL :: boundc, samlvl boundc = .false. IF (level > 1) THEN irr = nint(possk(level-1)/possk(level)) dtl = possk(level) mptr = lstart(level) mptrc = lstart(level-1) istp = nint((rnode(20,mptrc)-rnode(20,mptr))/dtl) tmwght = 1./(1.+intratt) ! Time interpolation coefficient ! !----------------------------------------------------------------------- ! ! Set boundc to .true. for the first of a number of fine grid time ! steps that will make one coarse grid time step. ! ! Only for this first time step, boundary conditions are interpolated ! from the coarse grid. ! !----------------------------------------------------------------------- ! IF(istp == irr) boundc = .true. IF( boundc .AND. verbose6 ) THEN WRITE(6,*)' tmwght=',tmwght, & ' level=', level,' intratt= ',intratt END IF END IF ! !----------------------------------------------------------------------- ! ! Loop through all grids at level 'level' ! !----------------------------------------------------------------------- ! mptr = lstart(level) 15 CONTINUE IF( mptr /= 0) THEN ! !----------------------------------------------------------------------- ! ! Call coarse grid boundary interpolation routine to obtain the ! boundary time tendencies for the fine grid when boundc=.true. ! !----------------------------------------------------------------------- ! IF( boundc ) THEN IF( verbose6 ) WRITE(6,'('' CALLING BOUNDARY INTERP ROUTINE FOR '', & & '' interp from coarser grids '')') samlvl = .false. ! For grids at different levels. CALL updbc( mptr, samlvl, tmwght ) END IF ! !----------------------------------------------------------------------- ! ! Call solver for mptr ! !----------------------------------------------------------------------- ! IF(verbose6)WRITE(6,'('' CALLING ARPSOLVE FOR GRID '',I4)')mptr CALL arpsolve( mptr ) ! !----------------------------------------------------------------------- ! ! Do the next grid at this level ! !----------------------------------------------------------------------- ! mptr = node(10,mptr) GO TO 15 END IF ! !----------------------------------------------------------------------- ! ! Exchange boundary values between all grids at this level ! if necessary ! !----------------------------------------------------------------------- ! CALL exchng( level ) ! RETURN END SUBROUTINE advanc