C $Header: /u/gcmpack/MITgcm/pkg/longstep/longstep_check_iters.F,v 1.4 2015/11/16 23:11:21 jmc Exp $ C $Name: $ #include "LONGSTEP_OPTIONS.h" C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP C !ROUTINE: LONGSTEP_CHECK_ITERS C !INTERFACE: SUBROUTINE LONGSTEP_CHECK_ITERS( myThid ) C !DESCRIPTION: C Check that starttime and endtime are multiples of long time step. C Fix endtime if not, abort if starttime is not. C !USES: IMPLICIT NONE #include "SIZE.h" #include "EEPARAMS.h" #include "LONGSTEP_PARAMS.h" #include "PARAMS.h" C !INPUT PARAMETERS: INTEGER myThid CEOP #ifdef ALLOW_LONGSTEP C !LOCAL VARIABLES: C extraIter :: extra iterations added to finish on a longstep C msgBuf :: message buffer INTEGER extraIter CHARACTER*(MAX_LEN_MBUF) msgBuf IF (MOD(nIter0, LS_nIter) .NE. 0) THEN C Restarting from a pickup in the middle of a longstep will lead C to invalid vel,... averages, so we abort WRITE(msgBuf,'(2A,2I10)') & ' LONGSTEP_CHECK_ITERS: nIter0 is not a multiple of', & ' LS_niter', nIter0, LS_niter CALL PRINT_ERROR( msgBuf, myThid ) STOP 'ABNORMAL END: S/R LONGSTEP_CHECK_ITERS' ENDIF IF (MOD(nEndIter, LS_nIter) .NE. 0) THEN C Add as many time steps as necessary to bring endtime to the end C of a long time step, so that the pickup will be valid. WRITE(msgBuf,'(3A)') '**WARNING** ', & ' LONGSTEP_CHECK_ITERS: nEndIter is not a multiple of', & ' LS_niter:' CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT , myThid) WRITE(msgBuf,'(2A,2I10)') '**WARNING** ', & ' LONGSTEP_CHECK_ITERS: ', nEndIter, LS_niter CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT , myThid) extraIter = LS_nIter - MOD(nEndIter, LS_nIter) nEndIter = nEndIter + extraIter nTimeSteps = nEndIter - nIter0 endTime = baseTime + deltaTClock*DFLOAT(nEndIter) WRITE(msgBuf,'(2A)') '**WARNING** ', & ' LONGSTEP_CHECK_ITERS: adjusting to' CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT , myThid) WRITE(msgBuf,'(2A,I10)') '**WARNING** ', & ' LONGSTEP_CHECK_ITERS: nEndIter =', nEndIter CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT , myThid) WRITE(msgBuf,'(2A,I10)') '**WARNING** ', & ' LONGSTEP_CHECK_ITERS: nTimeSteps =', nTimeSteps CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT , myThid) WRITE(msgBuf,'(2A,1PE23.15)') '**WARNING** ', & ' LONGSTEP_CHECK_ITERS: endTime =', endTime CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT , myThid) C log to standard output too WRITE(msgBuf,'(2A)') 'S/R LONGSTEP_CHECK_ITERS: ', & ' adjusting endTime:' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT , 1) CALL WRITE_0D_RL( endTime, INDEX_NONE,'endTime =', &' /* Integration ending time ( s ). */') CALL WRITE_0D_I( nTimeSteps, INDEX_NONE,'nTimeSteps =', &' /* Number of timesteps */') ENDIF #endif /* ALLOW_LONGSTEP */ RETURN END