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
ffe464dc7d Mart*0005
0006
0007
61e8fddf13 Jean*0008
ffe464dc7d Mart*0009 IMPLICIT NONE
0010
0011
0012 #include "SIZE.h"
0013 #include "EEPARAMS.h"
0014 #include "PARAMS.h"
71125c711d Mart*0015 #include "SHELFICE.h"
ffe464dc7d Mart*0016
0017
61e8fddf13 Jean*0018
ffe464dc7d Mart*0019 INTEGER myThid
0020
0021 #ifdef ALLOW_SHELFICE
0022
0023
61e8fddf13 Jean*0024
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
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
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
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
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
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
0243
0244
0245
0246
0247
0248
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
b98ed2a71d Mart*0279
0280
61e8fddf13 Jean*0281
b98ed2a71d Mart*0282
ffe464dc7d Mart*0283
0284
0285
0286
9c84481760 Jean*0287
ffe464dc7d Mart*0288
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
0301
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