C $Header: /u/gcmpack/MITgcm/model/src/check_pickup.F,v 1.6 2015/01/20 20:46:55 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)') '** WARNING ** 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)') '** WARNING ** 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)') '** WARNING ** 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)') '** WARNING ** 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)') '** WARNING ** 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)') '** WARNING ** CHECK_PICKUP: ',
     &      'restart with AddMass == 0'
           CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
          ENDIF
         ELSEIF ( missFldList(j).EQ.'FricHeat' ) THEN
          IF ( .NOT.pickupStrictlyMatch ) THEN
           WRITE(msgBuf,'(4A)') '** WARNING ** CHECK_PICKUP: ',
     &      'restart with Frictional Dissipation Heating == 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)') '** WARNING ** 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