C $Header: /u/gcmpack/MITgcm/model/src/check_pickup.F,v 1.4 2009/12/11 13:53:07 jmc Exp $
C $Name: $
c#include "PACKAGES_CONFIG.h"
#include "CPP_OPTIONS.h"
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
CBOP
C !ROUTINE: CHECK_PICKUP
C !INTERFACE:
SUBROUTINE CHECK_PICKUP(
I missFldList,
I nMissing, nbFields,
I myIter, myThid )
C !DESCRIPTION:
C Check that fields that are needed to restart have been read.
C In case some fields are missing, stop if pickupStrictlyMatch=T
C or try, if possible, to restart without the missing field.
C !USES:
IMPLICIT NONE
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "RESTART.h"
c#ifdef ALLOW_GENERIC_ADVDIFF
c# include "GAD.h"
c#endif
C !INPUT/OUTPUT PARAMETERS:
C missFldList :: List of missing fields (attempted to read but not found)
C nMissing :: Number of missing fields (attempted to read but not found)
C nbFields :: number of fields in pickup file (read from meta file)
C myIter :: Iteration number
C myThid :: my Thread Id. number
CHARACTER*(8) missFldList(*)
INTEGER nMissing
INTEGER nbFields
INTEGER myIter
INTEGER myThid
CEOP
C !FUNCTIONS
INTEGER ILNBLNK
EXTERNAL
C !LOCAL VARIABLES:
INTEGER j
INTEGER ioUnit
INTEGER warnCnts
LOGICAL stopFlag
CHARACTER*(MAX_LEN_MBUF) msgBuf
ioUnit = errorMessageUnit
c IF (pickup_read_mdsio) THEN
_BEGIN_MASTER( myThid )
IF ( nbFields.GE.1 ) THEN
C- flag startFromPickupAB2 is becoming obsolete with new way to read
C pickup file: cancel its effect (from initialisation) by resetting
C start-AB parameters:
tempStartAB = nIter0
saltStartAB = nIter0
mom_StartAB = nIter0
nHydStartAB = nIter0
ENDIF
IF ( selectNHfreeSurf.GE.1 ) THEN
IF ( nbFields.EQ.0 ) THEN
WRITE(msgBuf,'(4A)') '** WARNINGS ** CHECK_PICKUP: ',
& 'restart like hydrostatic free-surf (dPhiNH missing)'
CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
ELSE
C- assume reading dPhiNH was OK (otherwise expected in missing field list)
dPhiNHstatus = 1
ENDIF
ENDIF
IF ( nMissing.GE.1 ) THEN
stopFlag = .FALSE.
warnCnts = nMissing
DO j=1,nMissing
C- Case where missing field is not essential or can be recomputed
IF ( missFldList(j).EQ.'dEtaHdt '
& .AND. .NOT.useRealFreshWaterFlux ) THEN
warnCnts = warnCnts - 1
IF ( .NOT.pickupStrictlyMatch ) THEN
WRITE(msgBuf,'(4A)') ' CHECK_PICKUP: ',
& 'no RealFreshWaterFlux => can restart without "dEtaHdt "'
CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
ENDIF
ELSEIF ( missFldList(j).EQ.'dPhiNH '
& .AND. implicitNHPress.EQ.1. _d 0 ) THEN
warnCnts = warnCnts - 1
dPhiNHstatus = 0
IF ( .NOT.pickupStrictlyMatch ) THEN
WRITE(msgBuf,'(4A)') ' CHECK_PICKUP: ',
& 'fully Implic.NH-Press => can restart without "dPhiNH "'
CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
ENDIF
C- Old pickup for which special code takes care of missing fields
ELSEIF ( missFldList(j).EQ.'dEtaHdt '
& .AND.usePickupBeforeC54 ) THEN
C- with RealFreshWaterFlux, needs dEtaHdt to restart when:
C * synchronousTimeStep & usingPCoords => needs PmEpR for surf-forcing
C <- present code might be wrong if usePickupBeforeC54 and LinFS
C * synchronousTimeStep & nonlinFreeSurf > 0 => needs PmEpR for surf-forcing
C * select_rStar <> 0 => needs dEtaHdt for 1rst Integr_continuity
IF ( .NOT.pickupStrictlyMatch ) THEN
WRITE(msgBuf,'(4A)') '** WARNINGS ** CHECK_PICKUP: ',
& 'restart as before C54 without "dEtaHdt "'
CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
ENDIF
C- fields used only to speed-up solver(s) convergence:
C (no serious problems expected if missing, but get a non-perfect restart)
ELSEIF ( missFldList(j).EQ.'EtaN '
& .AND. rigidLid ) THEN
IF ( .NOT.pickupStrictlyMatch ) THEN
WRITE(msgBuf,'(4A)') '** WARNINGS ** CHECK_PICKUP: ',
& 'restart with 1rst guess == 0 for CG2D solver'
CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
ENDIF
ELSEIF ( missFldList(j).EQ.'Phi_NHyd' ) THEN
IF ( .NOT.pickupStrictlyMatch ) THEN
WRITE(msgBuf,'(4A)') '** WARNINGS ** CHECK_PICKUP: ',
& 'restart with 1rst guess == 0 for CG3D solver'
CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
ENDIF
ELSEIF ( missFldList(j).EQ.'dPhiNH ' ) THEN
dPhiNHstatus = 0
IF ( .NOT.pickupStrictlyMatch ) THEN
WRITE(msgBuf,'(4A)') '** WARNINGS ** CHECK_PICKUP: ',
& 'restart like hydrostatic free-surf (dPhiNH missing)'
CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
ENDIF
ELSEIF ( missFldList(j).EQ.'AddMass '
& .AND. selectAddFluid.EQ.2 ) THEN
IF ( .NOT.pickupStrictlyMatch ) THEN
WRITE(msgBuf,'(4A)') '** WARNINGS ** CHECK_PICKUP: ',
& 'restart with AddMass == 0'
CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
ENDIF
C- Absolutely needed fields:
ELSEIF ( missFldList(j).EQ.'Uvel ' .OR.
& missFldList(j).EQ.'Vvel ' .OR.
& missFldList(j).EQ.'Theta ' .OR.
& missFldList(j).EQ.'Salt ' .OR.
& missFldList(j).EQ.'EtaN ' ) THEN
stopFlag = .TRUE.
WRITE(msgBuf,'(4A)') 'CHECK_PICKUP: ',
& 'cannot restart without field "',missFldList(j),'"'
CALL PRINT_ERROR( msgBuf, myThid )
C- fields needed for restart (alternative not presently implemented)
ELSEIF ( missFldList(j).EQ.'PhiHyd ' .OR.
& missFldList(j).EQ.'AddMass ' .OR.
& missFldList(j).EQ.'dEtaHdt ' .OR.
& missFldList(j).EQ.'EtaH ' ) THEN
stopFlag = .TRUE.
WRITE(msgBuf,'(4A)') 'CHECK_PICKUP: ',
& 'cannot currently restart without field "',missFldList(j),'"'
CALL PRINT_ERROR( msgBuf, myThid )
C- fields with alternative in place to restart without:
C- (but get a non-perfect restart)
ELSEIF ( missFldList(j).EQ.'GuNm1 ' .OR.
& missFldList(j).EQ.'GvNm1 ' ) THEN
mom_StartAB = 0
ELSEIF ( missFldList(j).EQ.'GuNm2 ' .OR.
& missFldList(j).EQ.'GvNm2 ' ) THEN
mom_StartAB = MIN( mom_startAB, 1 )
ELSEIF ( missFldList(j).EQ.'GtNm1 ' .OR.
& missFldList(j).EQ.'TempNm1 ' ) THEN
tempStartAB = 0
ELSEIF ( missFldList(j).EQ.'GtNm2 ' .OR.
& missFldList(j).EQ.'TempNm2 ' ) THEN
tempStartAB = MIN( tempStartAB, 1 )
ELSEIF ( missFldList(j).EQ.'GsNm1 ' .OR.
& missFldList(j).EQ.'SaltNm1 ' ) THEN
saltStartAB = 0
ELSEIF ( missFldList(j).EQ.'GsNm2 ' .OR.
& missFldList(j).EQ.'SaltNm2 ' ) THEN
saltStartAB = MIN( saltStartAB, 1 )
ELSEIF ( missFldList(j).EQ.'GwNm1 ' ) THEN
nHydStartAB = 0
ELSEIF ( missFldList(j).EQ.'GwNm2 ' ) THEN
nHydStartAB = MIN( nHydStartAB, 1 )
ELSE
C- not recognized fields:
stopFlag = .TRUE.
WRITE(msgBuf,'(4A)') 'CHECK_PICKUP: ',
& 'missing field "',missFldList(j),'" not recognized'
CALL PRINT_ERROR( msgBuf, myThid )
ENDIF
ENDDO
IF ( stopFlag ) THEN
STOP 'ABNORMAL END: S/R CHECK_PICKUP'
ELSEIF ( pickupStrictlyMatch ) THEN
WRITE(msgBuf,'(4A)') 'CHECK_PICKUP: ',
& 'try with " pickupStrictlyMatch=.FALSE.,"',
& ' in file: "data", NameList: "PARM03"'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R CHECK_PICKUP'
ELSEIF ( warnCnts .GT. 0 ) THEN
WRITE(msgBuf,'(4A)') '** WARNINGS ** CHECK_PICKUP: ',
& 'Will get only an approximated Restart'
CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
IF ( mom_StartAB.LT.nIter0 .OR.
& nHydStartAB.LT.nIter0 .OR.
& tempStartAB.LT.nIter0 .OR.
& saltStartAB.LT.nIter0 ) THEN
WRITE(msgBuf,'(2(A,I10))')
& ' Continue with mom_StartAB =', mom_StartAB,
& ' ; nHydStartAB =', nHydStartAB
CALL PRINT_MESSAGE(msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
WRITE(msgBuf,'(2(A,I10))')
& ' with tempStartAB =', tempStartAB,
& ' ; saltStartAB =', saltStartAB
CALL PRINT_MESSAGE(msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
ENDIF
ENDIF
ENDIF
_END_MASTER( myThid )
c ENDIF
RETURN
END