C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_check.F,v 1.40 2010/12/03 05:00:37 gforget Exp $
C $Name: $
#include "SEAICE_OPTIONS.h"
SUBROUTINE SEAICE_CHECK( myThid )
C *==========================================================*
C | SUBROUTINE SEAICE_CHECK
C | o Validate basic package setup and inter-package
C | dependencies.
C *==========================================================*
IMPLICIT NONE
C === Global variables ===
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "SEAICE_PARAMS.h"
#include "SEAICE.h"
#include "GAD.h"
#ifdef ALLOW_EXF
# include "EXF_OPTIONS.h"
#endif
C === Routine arguments ===
C myThid :: Number of this instance of SEAICE_CHECK
INTEGER myThid
C === Local variables ===
C msgBuf :: Informational/error message buffer
CHARACTER*(MAX_LEN_MBUF) msgBuf
LOGICAL checkAdvSchArea, checkAdvSchHeff, checkAdvSchSnow
LOGICAL checkAdvSchSalt, checkAdvSchAge
_BEGIN_MASTER(myThid)
C-- ALLOW_SEAICE
WRITE(msgBuf,'(A)') 'SEAICE_CHECK: #define ALLOW_SEAICE'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT , myThid )
C-- SEAICE needs forcing_In_AB FALSE
IF (tracForcingOutAB.NE.1) THEN
WRITE(msgBuf,'(2A)') 'SEAICE_CHECK:',
& ' Need T,S forcing out of AB (tracForcingOutAB=1)'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
ENDIF
C-- Check advection schemes
checkAdvSchArea = SEAICEadvArea .AND. (
& SEAICEadvSchArea.NE.ENUM_UPWIND_1RST .AND.
& SEAICEadvSchArea.NE.ENUM_CENTERED_2ND .AND.
& SEAICEadvSchArea.NE.ENUM_DST2 .AND.
& SEAICEadvSchArea.NE.ENUM_FLUX_LIMIT .AND.
& SEAICEadvSchArea.NE.ENUM_DST3 .AND.
& SEAICEadvSchArea.NE.ENUM_DST3_FLUX_LIMIT .AND.
& SEAICEadvSchArea.NE.ENUM_OS7MP )
checkAdvSchHEFF = SEAICEadvHeff .AND. (
& SEAICEadvSchHeff.NE.ENUM_UPWIND_1RST .AND.
& SEAICEadvSchHeff.NE.ENUM_CENTERED_2ND .AND.
& SEAICEadvSchHeff.NE.ENUM_DST2 .AND.
& SEAICEadvSchHeff.NE.ENUM_FLUX_LIMIT .AND.
& SEAICEadvSchHeff.NE.ENUM_DST3 .AND.
& SEAICEadvSchHeff.NE.ENUM_DST3_FLUX_LIMIT .AND.
& SEAICEadvSchHeff.NE.ENUM_OS7MP )
checkAdvSchSnow = SEAICEadvSnow .AND. (
& SEAICEadvSchSnow.NE.ENUM_UPWIND_1RST .AND.
& SEAICEadvSchSnow.NE.ENUM_CENTERED_2ND .AND.
& SEAICEadvSchSnow.NE.ENUM_DST2 .AND.
& SEAICEadvSchSnow.NE.ENUM_FLUX_LIMIT .AND.
& SEAICEadvSchSnow.NE.ENUM_DST3 .AND.
& SEAICEadvSchSnow.NE.ENUM_DST3_FLUX_LIMIT .AND.
& SEAICEadvSchSnow.NE.ENUM_OS7MP )
checkAdvSchSalt = SEAICEadvSalt .AND. (
& SEAICEadvSchSalt.NE.ENUM_UPWIND_1RST .AND.
& SEAICEadvSchSalt.NE.ENUM_CENTERED_2ND .AND.
& SEAICEadvSchSalt.NE.ENUM_DST2 .AND.
& SEAICEadvSchSalt.NE.ENUM_FLUX_LIMIT .AND.
& SEAICEadvSchSalt.NE.ENUM_DST3 .AND.
& SEAICEadvSchSalt.NE.ENUM_DST3_FLUX_LIMIT .AND.
& SEAICEadvSchSalt.NE.ENUM_OS7MP )
checkAdvSchAge = SEAICEadvAge .AND. (
& SEAICEadvSchAge .NE.ENUM_UPWIND_1RST .AND.
& SEAICEadvSchAge .NE.ENUM_CENTERED_2ND .AND.
& SEAICEadvSchAge .NE.ENUM_DST2 .AND.
& SEAICEadvSchAge .NE.ENUM_FLUX_LIMIT .AND.
& SEAICEadvSchAge .NE.ENUM_DST3 .AND.
& SEAICEadvSchAge .NE.ENUM_DST3_FLUX_LIMIT .AND.
& SEAICEadvSchAge .NE.ENUM_OS7MP )
IF ( checkAdvSchArea .OR. checkAdvSchHeff .OR.
& checkAdvSchSnow .OR. checkAdvSchSalt .OR.
& checkAdvSchAge ) THEN
WRITE(msgBuf,'(2A)') 'SEAICE_CHECK: allowed advection schemes',
& ' for heff, area, snow, salt, and ice-age are: '
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(A,7I3)') 'SEAICE_CHECK:',
& ENUM_UPWIND_1RST, ENUM_CENTERED_2ND, ENUM_DST2,
& ENUM_FLUX_LIMIT, ENUM_DST3, ENUM_DST3_FLUX_LIMIT,
& ENUM_OS7MP
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(2A)') 'SEAICE_CHECK:',
& ' the following Adv.Scheme are not allowed:'
CALL PRINT_ERROR( msgBuf, myThid )
IF ( checkAdvSchArea ) THEN
WRITE(msgBuf,'(2A,I3)') 'SEAICE_CHECK:',
& ' SEAICEadvSchArea = ', SEAICEadvSchArea
CALL PRINT_ERROR( msgBuf, myThid )
ENDIF
IF ( checkAdvSchHeff ) THEN
WRITE(msgBuf,'(2A,I3)') 'SEAICE_CHECK:',
& ' SEAICEadvSchHeff = ', SEAICEadvSchHeff
CALL PRINT_ERROR( msgBuf, myThid )
ENDIF
IF ( checkAdvSchSnow ) THEN
WRITE(msgBuf,'(2A,I3)') 'SEAICE_CHECK:',
& ' SEAICEadvSchSnow = ', SEAICEadvSchSnow
CALL PRINT_ERROR( msgBuf, myThid )
ENDIF
IF ( checkAdvSchSalt ) THEN
WRITE(msgBuf,'(2A,I3)') 'SEAICE_CHECK:',
& ' SEAICEadvSchSalt = ', SEAICEadvSchSalt
CALL PRINT_ERROR( msgBuf, myThid )
ENDIF
IF ( checkAdvSchAge ) THEN
WRITE(msgBuf,'(2A,I3)') 'SEAICE_CHECK:',
& ' SEAICEadvSchAge = ', SEAICEadvSchAge
CALL PRINT_ERROR( msgBuf, myThid )
ENDIF
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
ENDIF
IF ( SEAICEadvScheme.EQ.ENUM_CENTERED_2ND ) THEN
C-- for now, the code does not allow to use the default advection scheme
C (Centered 2nd order) for 1 ice-field and an other advection scheme
C for an other ice-field. In this case, stop here.
checkAdvSchArea = SEAICEadvArea .AND.
& SEAICEadvSchArea.NE.ENUM_CENTERED_2ND
checkAdvSchHEFF = SEAICEadvHeff .AND.
& SEAICEadvSchHeff.NE.ENUM_CENTERED_2ND
checkAdvSchSnow = SEAICEadvSnow .AND.
& SEAICEadvSchSnow.NE.ENUM_CENTERED_2ND
checkAdvSchSalt = SEAICEadvSalt .AND.
& SEAICEadvSchSalt.NE.ENUM_CENTERED_2ND
checkAdvSchAge = SEAICEadvAge .AND.
& SEAICEadvSchAge .NE.ENUM_CENTERED_2ND
IF ( checkAdvSchArea .OR. checkAdvSchHeff .OR.
& checkAdvSchSnow .OR. checkAdvSchSalt .OR.
& checkAdvSchAge ) THEN
WRITE(msgBuf,'(A,I3,A)') 'SEAICE_CHECK: SEAICEadvScheme=',
& SEAICEadvScheme, ' not compatible with those Adv.Scheme:'
CALL PRINT_ERROR( msgBuf, myThid )
IF ( checkAdvSchArea ) THEN
WRITE(msgBuf,'(2A,I3)') 'SEAICE_CHECK:',
& ' SEAICEadvSchArea = ', SEAICEadvSchArea
CALL PRINT_ERROR( msgBuf, myThid )
ENDIF
IF ( checkAdvSchHeff ) THEN
WRITE(msgBuf,'(2A,I3)') 'SEAICE_CHECK:',
& ' SEAICEadvSchHeff = ', SEAICEadvSchHeff
CALL PRINT_ERROR( msgBuf, myThid )
ENDIF
IF ( checkAdvSchSnow ) THEN
WRITE(msgBuf,'(2A,I3)') 'SEAICE_CHECK:',
& ' SEAICEadvSchSnow = ', SEAICEadvSchSnow
CALL PRINT_ERROR( msgBuf, myThid )
ENDIF
IF ( checkAdvSchSalt ) THEN
WRITE(msgBuf,'(2A,I3)') 'SEAICE_CHECK:',
& ' SEAICEadvSchSalt = ', SEAICEadvSchSalt
CALL PRINT_ERROR( msgBuf, myThid )
ENDIF
IF ( checkAdvSchAge ) THEN
WRITE(msgBuf,'(2A,I3)') 'SEAICE_CHECK:',
& ' SEAICEadvSchAge = ', SEAICEadvSchAge
CALL PRINT_ERROR( msgBuf, myThid )
ENDIF
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
ENDIF
ENDIF
C--
#ifdef ALLOW_AUTODIFF_TAMC
IF ( NPSEUDOTIMESTEPS .GT. MPSEUDOTIMESTEPS ) THEN
WRITE(msgBuf,'(2A)') 'SEAICE_CHECK:',
& ' need to increase MPSEUDOTIMESTEPS in SEAICE_PARAMS.h'
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(2A,2I4)') 'SEAICE_CHECK:',
& ' MPSEUDOTIMESTEPS, NPSEUDOTIMESTEPS = ',
& MPSEUDOTIMESTEPS, NPSEUDOTIMESTEPS
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
ENDIF
IF ( IMAX_TICE .GT. NMAX_TICE ) THEN
WRITE(msgBuf,'(2A)') 'SEAICE_CHECK:',
& ' need to increase NMAX_TICE in SEAICE_PARAMS.h'
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(2A,2I4)') 'SEAICE_CHECK:',
& ' NMAX_TICE, MAX_TICE = ', NMAX_TICE, IMAX_TICE
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
ENDIF
#endif
C-- LAD has been retired
IF ( LAD .EQ. 1 ) THEN
WRITE(msgBuf,'(2A)') 'SEAICE_CHECK:',
& ' 2nd order advection with Leap frog (LAD==1) has been retired'
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(2A)') 'SEAICE_CHECK:',
& ' please use the defauld modified Euler step (LAD==2)'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
ENDIF
C-- SEAICE_ALLOW_DYNAMICS and SEAICEuseDYNAMICS
#ifndef SEAICE_ALLOW_DYNAMICS
IF (SEAICEuseDYNAMICS) THEN
WRITE(msgBuf,'(A)')
& 'SEAICE_ALLOW_DYNAMICS needed for SEAICEuseDYNAMICS'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
ENDIF
#endif
C-- SEAICE_EXTERNAL_FORCING is obsolete: issue warning but continue.
#ifdef SEAICE_EXTERNAL_FORCING
WRITE(msgBuf,'(A)')
& 'SEAICE_EXTERNAL_FORCING option is obsolete:'
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(A)')
& 'seaice now always uses exf to read input files.'
CALL PRINT_ERROR( msgBuf, myThid )
#endif
C-- SEAICE_OLD_AND_BAD_DISCRETIZATION is obsolete: issue warning and stop.
#ifdef SEAICE_OLD_AND_BAD_DISCRETIZATION
WRITE(msgBuf,'(A)')
& 'SEAICE_OLD_AND_BAD_DISCRETIZATION option is obsolete'
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(A)')
& 'and has no effect.'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
#endif /* SEAICE_OLD_AND_BAD_DISCRETIZATION */
C-- pkg/seaice requires pkg/exf with following CPP options/
#ifndef ALLOW_EXF
WRITE(msgBuf,'(A)')
& 'need to define ALLOW_EXF'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
#else /* ALLOW_EXF */
IF ( .NOT.useEXF ) THEN
WRITE(msgBuf,'(A)')
& 'S/R SEAICE_CHECK: need to set useEXF in data.pkg'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
ENDIF
#ifndef ALLOW_ATM_TEMP
WRITE(msgBuf,'(A)')
& 'need to define pkg/exf ALLOW_ATM_TEMP'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
#endif
#ifndef ALLOW_DOWNWARD_RADIATION
WRITE(msgBuf,'(A)')
& 'need to define pkg/exf ALLOW_DOWNWARD_RADIATION'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
#endif
#ifndef ALLOW_RUNOFF
WRITE(msgBuf,'(A)')
& 'need to define pkg/exf ALLOW_RUNOFF'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
#endif
#if !defined(EXF_READ_EVAP) && !defined(ALLOW_BULKFORMULAE)
WRITE(msgBuf,'(A)')
& 'need to set EXF_READ_EVAP or ALLOW_BULKFORMULAE in pkg/exf '
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
#endif
#if !defined(ALLOW_ATM_WIND) && !defined(SEAICE_CGRID)
WRITE(msgBuf,'(A)')
& 'need to define pkg/exf ALLOW_ATM_WIND'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
#endif
#endif /* ALLOW_EXF */
IF ( Olx.LT.3 .OR. Oly.LT.3 ) THEN
WRITE(msgBuf,'(A,A)')
& 'SEAICE_CHECK: cannot use EVP nor LSR solver with',
& ' overlap (Olx,Oly) smaller than 3'
CALL PRINT_ERROR( msgBuf , myThid)
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
ENDIF
#ifdef SEAICE_ALLOW_EVP
# ifdef ALLOW_AUTODIFF_TAMC
IF ( INT(SEAICE_deltaTdyn/SEAICE_deltaTevp).GT.nEVPstepMax ) THEN
WRITE(msgBuf,'(A)')
& 'SEAICE_ALLOW_EVP: need to set nEVPstepMax to >= nEVPstep'
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(A,I4)')
& 'nEVPstep = INT(SEAICE_deltaTdyn/SEAICE_deltaTevp) = ',
& INT(SEAICE_deltaTdyn/SEAICE_deltaTevp)
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
ENDIF
# endif
#else
IF ( SEAICE_deltaTevp .NE. UNSET_RL ) THEN
WRITE(msgBuf,'(A)') 'SEAICE_CHECK: SEAICE_deltaTevp is set'
CALL PRINT_ERROR( msgBuf , myThid)
WRITE(msgBuf,'(A)') 'SEAICE_CHECK: but cpp-flag '//
& 'SEAICE_ALLOW_EVP is not defined in SEAICE_OPTIONS.h'
CALL PRINT_ERROR( msgBuf , myThid)
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
ENDIF
#endif
#ifndef ALLOW_SEAICE_FLOODING
IF ( SEAICEuseFlooding ) THEN
WRITE(msgBuf,'(A)') 'SEAICE_CHECK: SEAICEuseFlooding = .TRUE.'
CALL PRINT_ERROR( msgBuf , myThid)
WRITE(msgBuf,'(A)') 'SEAICE_CHECK: but cpp-flag '//
& 'ALLOW_SEAICE_FLOODING is not defined in SEAICE_OPTIONS.h'
CALL PRINT_ERROR( msgBuf , myThid)
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
ENDIF
#endif /* ALLOW_SEAICE_FLOODING */
#ifndef SEAICE_ALLOW_CLIPVELS
IF ( SEAICE_clipVelocities ) THEN
WRITE(msgBuf,'(A)')
& 'SEAICE_CHECK: SEAICE_clipVelocities = .TRUE.'
CALL PRINT_ERROR( msgBuf , myThid)
WRITE(msgBuf,'(A)') 'SEAICE_CHECK: but cpp-flag '//
& 'SEAICE_ALLOW_CLIPVELS is not defined in SEAICE_OPTIONS.h'
CALL PRINT_ERROR( msgBuf , myThid)
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
ENDIF
#endif /* SEAICE_ALLOW_CLIPVELS */
#ifndef SEAICE_ALLOW_CLIPZETA
IF ( SEAICE_evpDampC .GT. 0. _d 0 .OR.
& SEAICE_zetaMin .GT. 0. _d 0 ) THEN
WRITE(msgBuf,'(A)')
& 'SEAICE_CHECK: SEAICE_evpDampC and/or SEAICE_zetaMin '//
& 'are set in data.seaice'
CALL PRINT_ERROR( msgBuf , myThid)
WRITE(msgBuf,'(A)') 'SEAICE_CHECK: but cpp-flag '//
& 'SEAICE_ALLOW_CLIPZETA is not defined in SEAICE_OPTIONS.h'
CALL PRINT_ERROR( msgBuf , myThid)
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
ENDIF
#endif /* SEAICE_ALLOW_CLIPZETA */
#if !defined(SEAICE_ALLOW_TEM) || !defined(SEAICE_CGRID)
IF ( SEAICEuseTEM ) THEN
WRITE(msgBuf,'(A)') 'SEAICE_CHECK: SEAICEuseTEM requires that'
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(A)')
& 'SEAICE_CHECK: SEAICE_ALLOW_TEM and SEAICE_CGRID are defined'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
ENDIF
#endif
#if !defined(SEAICE_CGRID)
#ifdef SEAICE_TEST_ICE_STRESS_1
WRITE(msgBuf,'(A)')
& 'SEAICE_CHECK: Only relevant for B-grid:'
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(A)')
& 'SEAICE_CHECK: SEAICE_TEST_ICE_STRESS_1 is replaced by'
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(A)')
& 'SEAICE_CHECK: SEAICE_BICE_STRESS (defined by default)'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
#endif /* SEAICE_TEST_ICE_STRESS_1 */
#endif /* SEAICE_CGRID not defined */
C-- SEAICE_ALLOW_FREEDRIFT and SEAICEuseFREEDRIFT
#ifndef SEAICE_ALLOW_FREEDRIFT
IF (SEAICEuseFREEDRIFT) THEN
WRITE(msgBuf,'(A)')
& 'SEAICE_ALLOW_FREEDRIFT needed for SEAICEuseFREEDRIFT'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R SEAICE_CHECK'
ENDIF
#endif
_END_MASTER(myThid)
RETURN
END