Back to home page

MITgcm

 
 

    


File indexing completed on 2024-01-13 06:10:44 UTC

view on githubraw file Latest commit 005af54e on 2024-01-12 20:10:27 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_tave_mdsio, INDEX_NONE,
                0149      &   'SHELFICE_tave_mdsio =', ' /* use mdsio for time averages */')
                0150        CALL WRITE_0D_L( SHELFICE_dump_mnc, INDEX_NONE,
                0151      &   'SHELFICE_dump_mnc   =', ' /* use netcdf for snapshots */')
                0152        CALL WRITE_0D_L( SHELFICE_tave_mnc, INDEX_NONE,
                0153      &   'SHELFICE_tave_mnc   =', ' /* use netcdf for time averages */')
                0154        CALL WRITE_0D_RL( SHELFICE_dumpFreq, INDEX_NONE,
                0155      & 'SHELFICE_dumpFreq =', ' /* analoguous to dumpFreq */')
                0156        CALL WRITE_0D_RL( SHELFICE_taveFreq, INDEX_NONE,
                0157      & 'SHELFICE_taveFreq =', ' /* analoguous to taveFreq */')
                0158 
                0159       WRITE(msgBuf,'(A)')
cbbed5656a Mart*0160      &     'SHELFICE_CHECK: end of SHELFICE config. summary'
                0161       CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
                0162      &     SQUEEZE_RIGHT, myThid )
                0163 
9952f046d7 dngo*0164 C-    Check that CPP option is "defined" when corresponding run-time parameter is on
                0165 #ifndef ALLOW_ISOMIP_TD
                0166       IF ( useISOMIPTD ) THEN
                0167        WRITE(msgBuf,'(A,A,A)')
                0168      &      'Run-time control flag useISOMIPTD was used'
                0169        CALL PRINT_ERROR( msgBuf, myThid )
                0170        WRITE(msgBuf,'(A,A,A)')
                0171      &      'when CPP flag ALLOW_ISOMIP_TD was unset'
                0172        CALL PRINT_ERROR( msgBuf, myThid )
                0173        errCount = errCount + 1
                0174       ENDIF
                0175 #else
                0176       IF ( useISOMIPTD ) THEN
                0177        IF ( SHELFICEconserve ) THEN
                0178         WRITE(msgBuf,'(A,A,A)')
                0179      &       'Run-time control flag SHELFICEconserve=.TRUE. was used'
                0180         CALL PRINT_ERROR( msgBuf, myThid )
                0181         WRITE(msgBuf,'(A,A,A)')
                0182      &       'when useISOMIPTD=.TRUE.; this does not work!'
                0183         CALL PRINT_ERROR( msgBuf, myThid )
                0184         errCount = errCount + 1
                0185        ENDIF
                0186       ENDIF
                0187 #endif /* ALLOW_ISOMIP_TD */
                0188 
                0189 #ifndef SHI_ALLOW_GAMMAFRICT
                0190       IF ( SHELFICEuseGammaFrict ) THEN
                0191        WRITE(msgBuf,'(A,A,A)')
                0192      &      'Run-time control flag SHELFICEuseGammaFrict was used'
                0193        CALL PRINT_ERROR( msgBuf, myThid )
                0194        WRITE(msgBuf,'(A,A,A)')
                0195      &      'when CPP flag SHI_ALLOW_GAMMAFRICT was unset'
                0196        CALL PRINT_ERROR( msgBuf, myThid )
                0197        errCount = errCount + 1
                0198       ENDIF
                0199 #endif /* SHI_ALLOW_GAMMAFRICT */
                0200 
                0201 #ifndef ALLOW_SHELFICE_REMESHING
005af54e38 Jean*0202       IF ( SHI_update_kTopC ) THEN
                0203        WRITE(msgBuf,'(2A)') 'SHELFICE_CHECK: ',
                0204      &      'SHI_update_kTopC only available with'
                0205        CALL PRINT_ERROR( msgBuf, myThid )
                0206        WRITE(msgBuf,'(2A)') 'SHELFICE_CHECK: ',
                0207      &      'CPP option ALLOW_SHELFICE_REMESHING defined'
                0208        CALL PRINT_ERROR( msgBuf, myThid )
                0209        errCount = errCount + 1
                0210       ENDIF
9952f046d7 dngo*0211       IF ( SHELFICEremeshFrequency.GT.zeroRL ) THEN
                0212        WRITE(msgBuf,'(A,A,A)')
                0213      &      'Run-time SHELFICEremeshFrequency was set ( > 0 )'
                0214        CALL PRINT_ERROR( msgBuf, myThid )
                0215        WRITE(msgBuf,'(A,A,A)')
                0216      &      'when CPP flag ALLOW_SHELFICE_REMESHING is unset'
                0217        CALL PRINT_ERROR( msgBuf, myThid )
                0218        errCount = errCount + 1
                0219       ENDIF
                0220 #endif /* ALLOW_SHELFICE_REMESHING */
                0221 
9c84481760 Jean*0222 C     Consistent choice of parameter:
9952f046d7 dngo*0223 
9c84481760 Jean*0224       IF ( SHELFICEmassFile.NE.' ' .AND. SHELFICEloadAnomalyFile.NE.' '
                0225      &   ) THEN
                0226          WRITE(msgBuf,'(2A)') 'SHELFICE_CHECK: cannot specify both',
                0227      &      ' SHELFICEmassFile and SHELFICEloadAnomalyFile'
                0228          CALL PRINT_ERROR( msgBuf, myThid )
                0229          errCount = errCount + 1
                0230       ENDIF
005af54e38 Jean*0231       IF ( SHELFICEMassStepping .AND. SHELFICEmassFile.EQ.' '
                0232      &                   .AND. SHELFICEloadAnomalyFile.NE.' ' ) THEN
                0233         WRITE(msgBuf,'(2A)') '** Warning ** SHELFICE_CHECK: ',
                0234      &   'safer to set initial Mass when using SHELFICEMassStepping'
                0235         CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
                0236      &                      SQUEEZE_RIGHT, myThid )
                0237       ENDIF
9c84481760 Jean*0238 
ffe464dc7d Mart*0239 C     So far, SHELFICE works only with oceanic z-coordinates
                0240       IF ( buoyancyRelation .NE. 'OCEANIC' ) THEN
                0241          WRITE(msgBuf,'(A)')
                0242      &      'SHELFICE works only with buoyancyRelation = ''OCEANIC'''
a93eea6699 Jean*0243          CALL PRINT_ERROR( msgBuf, myThid )
9c84481760 Jean*0244          errCount = errCount + 1
ffe464dc7d Mart*0245       ENDIF
                0246 
61e8fddf13 Jean*0247       IF ( selectNHfreeSurf.NE.0 ) THEN
                0248 C--   Non-Hydrostatic Free-Surf below Ice-Shelf:
                0249 C     a) there is a practical implementation issue (kSurf > 1) that has to be
                0250 C        fixed before removing this stop.
                0251 C     b) In general, should also account for the vertical acceleration of the
                0252 C        Ice-shelf mass above Free-Surf in NH.Free-Surf equation (less obvious).
                0253 C        Ignore this term for now; as a consequence, might over-estimate
                0254 C        d.Eta/dt below Ice-Shelf.
                0255          WRITE(msgBuf,'(2A,I3,A)') 'Current nonHydrostatic',
                0256      &    ' Free-Surf option (selectNHfreeSurf=',selectNHfreeSurf,' )'
                0257          CALL PRINT_ERROR( msgBuf, myThid )
                0258          WRITE(msgBuf,'(A)') ' not compatible with SHELFICE code'
                0259          CALL PRINT_ERROR( msgBuf, myThid )
9c84481760 Jean*0260          errCount = errCount + 1
61e8fddf13 Jean*0261       ENDIF
6247293a5a Mart*0262 
9952f046d7 dngo*0263       IF ( SHELFICEremeshFrequency.GT.zeroRL ) THEN
                0264        IF ( nonlinFreeSurf.LE.0 ) THEN
                0265         WRITE(msgBuf,'(A,A,A)')
                0266      &     'remeshing requires Non-Lin Free-Surf (nonlinFreeSurf > 0)'
                0267         CALL PRINT_ERROR( msgBuf, myThid )
                0268         errCount = errCount + 1
                0269        ELSEIF ( select_rStar.GT.0 ) THEN
                0270         WRITE(msgBuf,'(A,A,A)')
                0271      &     'remeshing not implemented for r-Star coordinate ',
                0272      &     '(select_rStar > 0)'
                0273         CALL PRINT_ERROR( msgBuf, myThid )
                0274         errCount = errCount + 1
                0275        ENDIF
                0276       ENDIF
005af54e38 Jean*0277       IF ( SHI_update_kTopC .AND. nonlinFreeSurf.LE.0 ) THEN
                0278         WRITE(msgBuf,'(2A)') '** WARNING ** SHELFICE_CHECK: ',
                0279      &       'linear Free-Surf not consistent with SHI_update_kTopC'
                0280         CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
                0281      &                      SQUEEZE_RIGHT, myThid )
                0282       ENDIF
9952f046d7 dngo*0283 
61e8fddf13 Jean*0284 C     SHELFICE may not work with many other packages,
b98ed2a71d Mart*0285 C     e.g. vertical mixing schemes, in particular KPP will not work properly,
                0286 C     as KPP requires surface fluxes at the surface, whereas shelfice will
61e8fddf13 Jean*0287 C     provide interfacial fluxes at some depth. Richardson flux number based
b98ed2a71d Mart*0288 C     schemes such as Packanowski-Philander (PP81) should be no problem.
ffe464dc7d Mart*0289 CML      IF ( useKPP ) THEN
                0290 CML         WRITE(msgBuf,'(A)')
                0291 CML     &      'SHELFICE and KPP cannot be turned on at the same time'
                0292 CML         CALL PRINT_ERROR( msgBuf , 1)
9c84481760 Jean*0293 CML         errCount = errCount + 1
ffe464dc7d Mart*0294 CML      ENDIF
b940763644 Patr*0295 
005af54e38 Jean*0296       IF ( SHI_update_kTopC .AND. useSEAICE ) THEN
                0297         WRITE(msgBuf,'(2A)') 'SHELFICE_CHECK: ',
c96d63ff5a Jean*0298      &   'pkg/seaice IGNORES Ice-Shelf retreat/advance'
005af54e38 Jean*0299         CALL PRINT_ERROR( msgBuf, myThid )
                0300         WRITE(msgBuf,'(2A)') 'SHELFICE_CHECK: ',
                0301      &   ' and does not work with SHI_update_kTopC=T'
                0302         CALL PRINT_ERROR( msgBuf, myThid )
                0303         errCount = errCount + 1
c96d63ff5a Jean*0304       ENDIF
                0305 
3bafcf6020 Timo*0306 C     Currently cannot use SHELFICEMassStepping with OpenAD
                0307 C     See shelfice_mass_stepping.F and github.com/MITgcm/MITgcm/pull/495
                0308 #ifdef ALLOW_OPENAD
                0309       IF (SHELFICEMassStepping) THEN
                0310        WRITE(msgBuf,'(2A)')
                0311      &    'SHELFICEMassStepping does not currently work',
                0312      &    ' with #define ALLOW_OPENAD'
                0313        CALL PRINT_ERROR( msgBuf, myThid )
                0314        errCount = errCount + 1
                0315       ENDIF
                0316 #endif
9c84481760 Jean*0317       IF ( errCount.GE.1 ) THEN
                0318         WRITE(msgBuf,'(A,I3,A)')
                0319      &       'SHELFICE_CHECK: detected', errCount,' fatal error(s)'
                0320         CALL PRINT_ERROR( msgBuf, myThid )
                0321         CALL ALL_PROC_DIE( 0 )
                0322         STOP 'ABNORMAL END: S/R SHELFICE_CHECK'
                0323       ENDIF
                0324 
a93eea6699 Jean*0325       _END_MASTER(myThid)
                0326 
ffe464dc7d Mart*0327 #endif /* ALLOW_SHELFICE */
                0328 
a93eea6699 Jean*0329       RETURN
                0330       END