Back to home page

MITgcm

 
 

    


File indexing completed on 2025-11-07 06:08:50 UTC

view on githubraw file Latest commit b7411f1a on 2025-11-06 19:05:26 UTC
ffe464dc7d Mart*0001 #include "SHELFICE_OPTIONS.h"
                0002 
                0003       SUBROUTINE SHELFICE_CHECK( myThid )
61e8fddf13 Jean*0004 C     *==========================================================*
ffe464dc7d Mart*0005 C     | SUBROUTINE SHELFICE_CHECK                                |
                0006 C     | o Validate basic package setup and inter-package         |
                0007 C     | dependencies.                                            |
61e8fddf13 Jean*0008 C     *==========================================================*
ffe464dc7d Mart*0009       IMPLICIT NONE
                0010 
                0011 C     === Global variables ===
                0012 #include "SIZE.h"
                0013 #include "EEPARAMS.h"
                0014 #include "PARAMS.h"
71125c711d Mart*0015 #include "SHELFICE.h"
ffe464dc7d Mart*0016 
                0017 C     === Routine arguments ===
61e8fddf13 Jean*0018 C     myThid   :  Number of this instance of SHELFICE_CHECK
ffe464dc7d Mart*0019       INTEGER myThid
                0020 
                0021 #ifdef ALLOW_SHELFICE
                0022 
                0023 C     === Local variables ===
61e8fddf13 Jean*0024 C     msgBuf   :: Informational/error message buffer
ffe464dc7d Mart*0025       CHARACTER*(MAX_LEN_MBUF) msgBuf
9c84481760 Jean*0026       INTEGER errCount
ffe464dc7d Mart*0027 
a93eea6699 Jean*0028       _BEGIN_MASTER(myThid)
9c84481760 Jean*0029       errCount = 0
a93eea6699 Jean*0030 
ffe464dc7d Mart*0031       WRITE(msgBuf,'(A)') 'SHELFICE_CHECK: #define ALLOW_SHELFICE'
                0032       CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
a93eea6699 Jean*0033      &     SQUEEZE_RIGHT, myThid )
ffe464dc7d Mart*0034 
cbbed5656a Mart*0035 C     print shelfice summary here before checking the parameter combinations
                0036       WRITE(msgBuf,'(A)') ' '
                0037       CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
                0038      &     SQUEEZE_RIGHT, myThid )
918d8a2ea2 Jean*0039       WRITE(msgBuf,'(A)')
cbbed5656a Mart*0040      &     'SHELFICE_CHECK: start of SHELFICE config. summary'
                0041       CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
                0042      &     SQUEEZE_RIGHT, myThid )
918d8a2ea2 Jean*0043 
cbbed5656a Mart*0044        CALL WRITE_0D_L( SHELFICEisOn, INDEX_NONE,
                0045      &   'SHELFICEisOn =', ' /* package is turned on */')
918d8a2ea2 Jean*0046 
cbbed5656a Mart*0047        CALL WRITE_0D_L( useISOMIPTD, INDEX_NONE,
                0048      &   'useISOMIPTD =', ' /* use simple isomip thermodynamics */')
                0049        CALL WRITE_0D_L( SHELFICEconserve, INDEX_NONE,
918d8a2ea2 Jean*0050      &   'SHELFICEconserve =',
cbbed5656a Mart*0051      &      ' /* use a conservative form of boundary conditions */')
                0052        CALL WRITE_0D_L( SHELFICEboundaryLayer, INDEX_NONE,
                0053      &   'SHELFICEboundaryLayer =',
                0054      &   ' /* use simple boundary layer scheme to suppress noise */')
9952f046d7 dngo*0055        IF ( SHELFICEboundaryLayer ) THEN
                0056         CALL WRITE_0D_L( SHI_withBL_realFWflux, INDEX_NONE,
                0057      &   'SHI_withBL_realFWflux =',
                0058      &   ' /* use real FW Flux in boundary layer scheme */')
                0059        ENDIF
cbbed5656a Mart*0060        CALL WRITE_0D_L( SHELFICEadvDiffHeatFlux, INDEX_NONE,
918d8a2ea2 Jean*0061      &   'SHELFICEadvDiffHeatFlux =',
cbbed5656a Mart*0062      &   ' /* use adv.-diff. instead of just diff. heat flux into'//
                0063      &   ' the ice shelf */')
                0064        CALL WRITE_0D_L( SHELFICEMassStepping, INDEX_NONE,
                0065      &   'SHELFICEMassStepping =',
                0066      &   ' /* step forward ice shelf mass/thickness */')
005af54e38 Jean*0067        CALL WRITE_0D_L( SHI_update_kTopC, INDEX_NONE,
                0068      &   'SHI_update_kTopC =',
                0069      &   ' /* update "kTopC" as ice shelf expand or retreat */')
cbbed5656a Mart*0070        CALL WRITE_0D_L( no_slip_shelfice, INDEX_NONE,
                0071      &   'no_slip_shelfice =', ' /* use no slip boundary conditions */')
                0072        CALL WRITE_0D_RL( SHELFICEdragLinear, INDEX_NONE,
                0073      & 'SHELFICEdragLinear    =', ' /* linear drag coefficient */')
                0074        CALL WRITE_0D_RL( SHELFICEdragQuadratic, INDEX_NONE,
                0075      & 'SHELFICEdragQuadratic =', ' /* quadratic drag coefficient */')
918d8a2ea2 Jean*0076        CALL WRITE_0D_I( SHELFICEselectDragQuadr, INDEX_NONE,
                0077      &  'SHELFICEselectDragQuadr =',
                0078      &  ' /* select quadratic drag option */')
cbbed5656a Mart*0079        CALL WRITE_0D_RL( SHELFICElatentHeat, INDEX_NONE,
                0080      & 'SHELFICElatentHeat      =', ' /* latent heat of ice */')
                0081        CALL WRITE_0D_RL( SHELFICEheatCapacity_Cp, INDEX_NONE,
                0082      & 'SHELFICEheatCapacity_Cp =', ' /* heat capacity of ice shelf */')
                0083        CALL WRITE_0D_RL( rhoShelfice, INDEX_NONE,
                0084      & 'rhoShelfice   =', ' /* density of ice shelf */')
                0085        CALL WRITE_0D_RL( SHELFICEkappa, INDEX_NONE,
                0086      & 'SHELFICEkappa =', ' /* thermal conductivity of ice shelf */')
                0087        CALL WRITE_0D_RL( SHELFICEthetaSurface, INDEX_NONE,
                0088      & 'SHELFICEthetaSurface =',' /* surface temperature above i.s. */')
                0089        CALL WRITE_0D_RL( SHELFICEheatTransCoeff, INDEX_NONE,
                0090      & 'SHELFICEheatTransCoeff =', ' /* heat transfer coefficient */')
                0091        CALL WRITE_0D_RL( SHELFICEsaltTransCoeff, INDEX_NONE,
                0092      & 'SHELFICEsaltTransCoeff =', ' /* salt transfer coefficient */')
918d8a2ea2 Jean*0093 
cbbed5656a Mart*0094        CALL WRITE_0D_L( SHELFICEuseGammaFrict, INDEX_NONE,
918d8a2ea2 Jean*0095      &   'SHELFICEuseGammaFrict =',
cbbed5656a Mart*0096      &   ' /* use velocity dependent exchange coefficients */')
                0097        IF ( SHELFICEuseGammaFrict ) THEN
9952f046d7 dngo*0098         IF ( SHELFICEboundaryLayer ) THEN
                0099          CALL WRITE_0D_L( SHI_withBL_uStarTopDz, INDEX_NONE,
                0100      &   'SHI_withBL_uStarTopDz =',
                0101      &   ' /* compute uStar from top Dz averaged uVel,vVel */')
                0102         ELSE
                0103          CALL WRITE_0D_L( SHELFICE_oldCalcUStar, INDEX_NONE,
b06dffee6b Jean*0104      &   'SHELFICE_oldCalcUStar =', ' /* use old uStar expression */')
9952f046d7 dngo*0105         ENDIF
cbbed5656a Mart*0106         CALL WRITE_0D_RL( shiCdrag, INDEX_NONE,
                0107      & 'shiCdrag   =', ' /* quadr. drag coefficient for uStar */')
                0108         CALL WRITE_0D_RL( shiZetaN, INDEX_NONE,
                0109      & 'shiZetaN   =', ' /* parameter for gammaTurb */')
                0110         CALL WRITE_0D_RL( shiRc, INDEX_NONE,
                0111      & 'shiRc      =', ' /* parameter for gammaTurb (not used) */')
                0112         CALL WRITE_0D_RL( shiPrandtl, INDEX_NONE,
                0113      & 'shiPrandtl =', ' /* const. Prandtl No. for gammaTurb */')
                0114         CALL WRITE_0D_RL( shiSchmidt, INDEX_NONE,
                0115      & 'shiSchmidt =', ' /* const. Schmidt No. for gammaTurb */')
                0116         CALL WRITE_0D_RL( shiKinVisc, INDEX_NONE,
                0117      & 'shiKinVisc =', ' /* const. kin. viscosity for gammaTurb */')
                0118        ENDIF
918d8a2ea2 Jean*0119 
9952f046d7 dngo*0120       CALL WRITE_0D_RL( SHELFICEremeshFrequency, INDEX_NONE,
                0121      &   'SHELFICEremeshFrequency =',
                0122      &   ' /* Frequency (in s) of Remeshing */')
                0123       IF ( SHELFICEremeshFrequency .GT. zeroRL ) THEN
                0124         CALL WRITE_0D_RL( SHELFICEsplitThreshold, INDEX_NONE,
                0125      &   'SHELFICEsplitThreshold =',
                0126      &   ' /* hFac remesh threshold above which cell splits */')
                0127         CALL WRITE_0D_RL( SHELFICEmergeThreshold, INDEX_NONE,
                0128      &   'SHELFICEmergeThreshold =',
                0129      &   ' /* hFac remesh threshold below which cell merges */')
                0130       ENDIF
                0131 
918d8a2ea2 Jean*0132       CALL WRITE_0D_C( SHELFICEloadAnomalyFile, -1, INDEX_NONE,
cbbed5656a Mart*0133      &  'SHELFICEloadAnomalyFile =',
                0134      &  ' /* file name of loaded loadAnomaly field */')
918d8a2ea2 Jean*0135       CALL WRITE_0D_C( SHELFICEmassFile, -1, INDEX_NONE,
cbbed5656a Mart*0136      &  'SHELFICEmassFile =', ' /* file name of loaded mass field */')
918d8a2ea2 Jean*0137       CALL WRITE_0D_C( SHELFICEtopoFile, -1, INDEX_NONE,
cbbed5656a Mart*0138      &  'SHELFICEtopoFile =',
                0139      &  ' /* file name of loaded under-ice topography */')
918d8a2ea2 Jean*0140       CALL WRITE_0D_C( SHELFICEMassDynTendFile, -1, INDEX_NONE,
cbbed5656a Mart*0141      &  'SHELFICEMassDynTendFile =',
                0142      &  ' /* file name of loaded dynamic mass tendency field */')
918d8a2ea2 Jean*0143 C-    I/O parameters:
                0144        CALL WRITE_0D_L( SHELFICEwriteState, INDEX_NONE,
                0145      &   'SHELFICEwriteState  =', ' /* do simple standard output */')
                0146        CALL WRITE_0D_L( SHELFICE_dump_mdsio, INDEX_NONE,
                0147      &   'SHELFICE_dump_mdsio =', ' /* use mdsio for snapshots */')
                0148        CALL WRITE_0D_L( SHELFICE_dump_mnc, INDEX_NONE,
                0149      &   'SHELFICE_dump_mnc   =', ' /* use netcdf for snapshots */')
                0150        CALL WRITE_0D_RL( SHELFICE_dumpFreq, INDEX_NONE,
                0151      & 'SHELFICE_dumpFreq =', ' /* analoguous to dumpFreq */')
                0152 
                0153       WRITE(msgBuf,'(A)')
cbbed5656a Mart*0154      &     'SHELFICE_CHECK: end of SHELFICE config. summary'
                0155       CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
                0156      &     SQUEEZE_RIGHT, myThid )
                0157 
9952f046d7 dngo*0158 C-    Check that CPP option is "defined" when corresponding run-time parameter is on
                0159 #ifndef ALLOW_ISOMIP_TD
                0160       IF ( useISOMIPTD ) THEN
                0161        WRITE(msgBuf,'(A,A,A)')
                0162      &      'Run-time control flag useISOMIPTD was used'
                0163        CALL PRINT_ERROR( msgBuf, myThid )
                0164        WRITE(msgBuf,'(A,A,A)')
                0165      &      'when CPP flag ALLOW_ISOMIP_TD was unset'
                0166        CALL PRINT_ERROR( msgBuf, myThid )
                0167        errCount = errCount + 1
                0168       ENDIF
                0169 #else
                0170       IF ( useISOMIPTD ) THEN
                0171        IF ( SHELFICEconserve ) THEN
                0172         WRITE(msgBuf,'(A,A,A)')
                0173      &       'Run-time control flag SHELFICEconserve=.TRUE. was used'
                0174         CALL PRINT_ERROR( msgBuf, myThid )
                0175         WRITE(msgBuf,'(A,A,A)')
                0176      &       'when useISOMIPTD=.TRUE.; this does not work!'
                0177         CALL PRINT_ERROR( msgBuf, myThid )
                0178         errCount = errCount + 1
                0179        ENDIF
                0180       ENDIF
                0181 #endif /* ALLOW_ISOMIP_TD */
                0182 
                0183 #ifndef SHI_ALLOW_GAMMAFRICT
                0184       IF ( SHELFICEuseGammaFrict ) THEN
                0185        WRITE(msgBuf,'(A,A,A)')
                0186      &      'Run-time control flag SHELFICEuseGammaFrict was used'
                0187        CALL PRINT_ERROR( msgBuf, myThid )
                0188        WRITE(msgBuf,'(A,A,A)')
                0189      &      'when CPP flag SHI_ALLOW_GAMMAFRICT was unset'
                0190        CALL PRINT_ERROR( msgBuf, myThid )
                0191        errCount = errCount + 1
                0192       ENDIF
                0193 #endif /* SHI_ALLOW_GAMMAFRICT */
                0194 
                0195 #ifndef ALLOW_SHELFICE_REMESHING
005af54e38 Jean*0196       IF ( SHI_update_kTopC ) THEN
                0197        WRITE(msgBuf,'(2A)') 'SHELFICE_CHECK: ',
                0198      &      'SHI_update_kTopC only available with'
                0199        CALL PRINT_ERROR( msgBuf, myThid )
                0200        WRITE(msgBuf,'(2A)') 'SHELFICE_CHECK: ',
                0201      &      'CPP option ALLOW_SHELFICE_REMESHING defined'
                0202        CALL PRINT_ERROR( msgBuf, myThid )
                0203        errCount = errCount + 1
                0204       ENDIF
9952f046d7 dngo*0205       IF ( SHELFICEremeshFrequency.GT.zeroRL ) THEN
                0206        WRITE(msgBuf,'(A,A,A)')
                0207      &      'Run-time SHELFICEremeshFrequency was set ( > 0 )'
                0208        CALL PRINT_ERROR( msgBuf, myThid )
                0209        WRITE(msgBuf,'(A,A,A)')
                0210      &      'when CPP flag ALLOW_SHELFICE_REMESHING is unset'
                0211        CALL PRINT_ERROR( msgBuf, myThid )
                0212        errCount = errCount + 1
                0213       ENDIF
                0214 #endif /* ALLOW_SHELFICE_REMESHING */
                0215 
9c84481760 Jean*0216 C     Consistent choice of parameter:
9952f046d7 dngo*0217 
9c84481760 Jean*0218       IF ( SHELFICEmassFile.NE.' ' .AND. SHELFICEloadAnomalyFile.NE.' '
                0219      &   ) THEN
                0220          WRITE(msgBuf,'(2A)') 'SHELFICE_CHECK: cannot specify both',
                0221      &      ' SHELFICEmassFile and SHELFICEloadAnomalyFile'
                0222          CALL PRINT_ERROR( msgBuf, myThid )
                0223          errCount = errCount + 1
                0224       ENDIF
005af54e38 Jean*0225       IF ( SHELFICEMassStepping .AND. SHELFICEmassFile.EQ.' '
                0226      &                   .AND. SHELFICEloadAnomalyFile.NE.' ' ) THEN
                0227         WRITE(msgBuf,'(2A)') '** Warning ** SHELFICE_CHECK: ',
                0228      &   'safer to set initial Mass when using SHELFICEMassStepping'
                0229         CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
                0230      &                      SQUEEZE_RIGHT, myThid )
                0231       ENDIF
9c84481760 Jean*0232 
ffe464dc7d Mart*0233 C     So far, SHELFICE works only with oceanic z-coordinates
                0234       IF ( buoyancyRelation .NE. 'OCEANIC' ) THEN
                0235          WRITE(msgBuf,'(A)')
                0236      &      'SHELFICE works only with buoyancyRelation = ''OCEANIC'''
a93eea6699 Jean*0237          CALL PRINT_ERROR( msgBuf, myThid )
9c84481760 Jean*0238          errCount = errCount + 1
ffe464dc7d Mart*0239       ENDIF
                0240 
61e8fddf13 Jean*0241       IF ( selectNHfreeSurf.NE.0 ) THEN
                0242 C--   Non-Hydrostatic Free-Surf below Ice-Shelf:
                0243 C     a) there is a practical implementation issue (kSurf > 1) that has to be
                0244 C        fixed before removing this stop.
                0245 C     b) In general, should also account for the vertical acceleration of the
                0246 C        Ice-shelf mass above Free-Surf in NH.Free-Surf equation (less obvious).
                0247 C        Ignore this term for now; as a consequence, might over-estimate
                0248 C        d.Eta/dt below Ice-Shelf.
                0249          WRITE(msgBuf,'(2A,I3,A)') 'Current nonHydrostatic',
                0250      &    ' Free-Surf option (selectNHfreeSurf=',selectNHfreeSurf,' )'
                0251          CALL PRINT_ERROR( msgBuf, myThid )
                0252          WRITE(msgBuf,'(A)') ' not compatible with SHELFICE code'
                0253          CALL PRINT_ERROR( msgBuf, myThid )
9c84481760 Jean*0254          errCount = errCount + 1
61e8fddf13 Jean*0255       ENDIF
6247293a5a Mart*0256 
9952f046d7 dngo*0257       IF ( SHELFICEremeshFrequency.GT.zeroRL ) THEN
                0258        IF ( nonlinFreeSurf.LE.0 ) THEN
                0259         WRITE(msgBuf,'(A,A,A)')
                0260      &     'remeshing requires Non-Lin Free-Surf (nonlinFreeSurf > 0)'
                0261         CALL PRINT_ERROR( msgBuf, myThid )
                0262         errCount = errCount + 1
                0263        ELSEIF ( select_rStar.GT.0 ) THEN
                0264         WRITE(msgBuf,'(A,A,A)')
                0265      &     'remeshing not implemented for r-Star coordinate ',
                0266      &     '(select_rStar > 0)'
                0267         CALL PRINT_ERROR( msgBuf, myThid )
                0268         errCount = errCount + 1
                0269        ENDIF
                0270       ENDIF
005af54e38 Jean*0271       IF ( SHI_update_kTopC .AND. nonlinFreeSurf.LE.0 ) THEN
                0272         WRITE(msgBuf,'(2A)') '** WARNING ** SHELFICE_CHECK: ',
                0273      &       'linear Free-Surf not consistent with SHI_update_kTopC'
                0274         CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
                0275      &                      SQUEEZE_RIGHT, myThid )
                0276       ENDIF
9952f046d7 dngo*0277 
61e8fddf13 Jean*0278 C     SHELFICE may not work with many other packages,
b98ed2a71d Mart*0279 C     e.g. vertical mixing schemes, in particular KPP will not work properly,
                0280 C     as KPP requires surface fluxes at the surface, whereas shelfice will
61e8fddf13 Jean*0281 C     provide interfacial fluxes at some depth. Richardson flux number based
b98ed2a71d Mart*0282 C     schemes such as Packanowski-Philander (PP81) should be no problem.
ffe464dc7d Mart*0283 CML      IF ( useKPP ) THEN
                0284 CML         WRITE(msgBuf,'(A)')
                0285 CML     &      'SHELFICE and KPP cannot be turned on at the same time'
                0286 CML         CALL PRINT_ERROR( msgBuf , 1)
9c84481760 Jean*0287 CML         errCount = errCount + 1
ffe464dc7d Mart*0288 CML      ENDIF
b940763644 Patr*0289 
005af54e38 Jean*0290       IF ( SHI_update_kTopC .AND. useSEAICE ) THEN
                0291         WRITE(msgBuf,'(2A)') 'SHELFICE_CHECK: ',
c96d63ff5a Jean*0292      &   'pkg/seaice IGNORES Ice-Shelf retreat/advance'
005af54e38 Jean*0293         CALL PRINT_ERROR( msgBuf, myThid )
                0294         WRITE(msgBuf,'(2A)') 'SHELFICE_CHECK: ',
                0295      &   ' and does not work with SHI_update_kTopC=T'
                0296         CALL PRINT_ERROR( msgBuf, myThid )
                0297         errCount = errCount + 1
c96d63ff5a Jean*0298       ENDIF
                0299 
3bafcf6020 Timo*0300 C     Currently cannot use SHELFICEMassStepping with OpenAD
                0301 C     See shelfice_mass_stepping.F and github.com/MITgcm/MITgcm/pull/495
                0302 #ifdef ALLOW_OPENAD
                0303       IF (SHELFICEMassStepping) THEN
                0304        WRITE(msgBuf,'(2A)')
                0305      &    'SHELFICEMassStepping does not currently work',
                0306      &    ' with #define ALLOW_OPENAD'
                0307        CALL PRINT_ERROR( msgBuf, myThid )
                0308        errCount = errCount + 1
                0309       ENDIF
                0310 #endif
9c84481760 Jean*0311       IF ( errCount.GE.1 ) THEN
                0312         WRITE(msgBuf,'(A,I3,A)')
                0313      &       'SHELFICE_CHECK: detected', errCount,' fatal error(s)'
                0314         CALL PRINT_ERROR( msgBuf, myThid )
                0315         CALL ALL_PROC_DIE( 0 )
                0316         STOP 'ABNORMAL END: S/R SHELFICE_CHECK'
                0317       ENDIF
                0318 
a93eea6699 Jean*0319       _END_MASTER(myThid)
                0320 
ffe464dc7d Mart*0321 #endif /* ALLOW_SHELFICE */
                0322 
a93eea6699 Jean*0323       RETURN
                0324       END