File indexing completed on 2026-04-11 05:08:52 UTC
view on githubraw file Latest commit f39e9f37 on 2026-04-10 15:10:11 UTC
ffe464dc7d Mart*0001 #include "SHELFICE_OPTIONS.h"
26cd020e03 Jean*0002 #ifdef ALLOW_AUTODIFF
0003 # include "AUTODIFF_OPTIONS.h"
0004 #endif
0005 #ifdef ALLOW_CTRL
0006 # include "CTRL_OPTIONS.h"
0007 #endif
ead4e7560e Jean*0008
ffe464dc7d Mart*0009
0010
0011
ead4e7560e Jean*0012 SUBROUTINE SHELFICE_THERMODYNAMICS(
ffe464dc7d Mart*0013 I myTime, myIter, myThid )
0014
0015
ead4e7560e Jean*0016
0017
0018
ffe464dc7d Mart*0019
0020
0021
0022
0023
5744811f23 Mart*0024
ffe464dc7d Mart*0025
0026
0027 IMPLICIT NONE
0028
0029
0030 #include "SIZE.h"
0031 #include "EEPARAMS.h"
0032 #include "PARAMS.h"
8eaa195dfe Jean*0033 #include "EOS.h"
ffe464dc7d Mart*0034 #include "GRID.h"
0035 #include "DYNVARS.h"
0036 #include "FFIELDS.h"
0037 #include "SHELFICE.h"
6b47d550f4 Mart*0038 #ifdef ALLOW_CTRL
83a7138cb5 Jean*0039 # include "CTRL_SIZE.h"
4d72283393 Mart*0040 # include "CTRL.h"
edcd27be69 Mart*0041 # include "CTRL_DUMMY.h"
6b47d550f4 Mart*0042 # ifdef ALLOW_GENTIM2D_CONTROL
0043 # include "CTRL_GENARR.h"
0044 # endif
0045 #endif /* ALLOW_CTRL */
7ce1881910 Mart*0046 #ifdef ALLOW_AUTODIFF_TAMC
c96d63ff5a Jean*0047 # include "tamc.h"
7ce1881910 Mart*0048 #endif /* ALLOW_AUTODIFF_TAMC */
ead4e7560e Jean*0049
ffe464dc7d Mart*0050
0051
0052
0053
0054
0055 _RL myTime
0056 INTEGER myIter
0057 INTEGER myThid
0058
0059 #ifdef ALLOW_SHELFICE
40b188dddd Mart*0060
ffe464dc7d Mart*0061
f39e9f371c Mart*0062
71125c711d Mart*0063
ead4e7560e Jean*0064
71125c711d Mart*0065
e4305b0f18 Patr*0066
823dd639fd Jean*0067
e4305b0f18 Patr*0068
7108c05fdf Mart*0069
a8eec31802 Mart*0070
823dd639fd Jean*0071
5744811f23 Mart*0072
0073
37e32ac0e0 Mart*0074
5744811f23 Mart*0075
0076
9952f046d7 dngo*0077
71125c711d Mart*0078
f39e9f371c Mart*0079
0080
7108c05fdf Mart*0081
71125c711d Mart*0082
f39e9f371c Mart*0083 INTEGER i,j,k,kp1
ffe464dc7d Mart*0084 INTEGER bi,bj
04ba99fb18 Mart*0085 _RL tLoc(1:sNx,1:sNy)
0086 _RL sLoc(1:sNx,1:sNy)
0087 _RL pLoc(1:sNx,1:sNy)
9952f046d7 dngo*0088 _RL uLoc(1:sNx+1,1:sNy+1)
0089 _RL vLoc(1:sNx+1,1:sNy+1)
43bfccd244 Jean*0090 _RL velSq(1:sNx,1:sNy)
7b8b86ab99 Timo*0091 _RL tTMP, sTMP, uTMP, vTMP, vSqTmp
52d51b46b8 Jean*0092 _RL thetaFreeze, saltFreeze, recip_Cp
9952f046d7 dngo*0093 _RL freshWaterFlux
0094 #ifdef ALLOW_ISOMIP_TD
0095 _RL convertFW2SaltLoc
0096 #endif
f39e9f371c Mart*0097 _RL a0, a1, a2, b0, c0
0098 _RL eps1, eps2, eps3, eps3a, eps4, eps6, eps7, eps8, epsq
9952f046d7 dngo*0099 _RL cFac, rFac, dFac, fwflxFac, rFWinBL
71125c711d Mart*0100 _RL aqe, bqe, cqe, discrim, recip_aqe
40b188dddd Mart*0101 _RL drKp1, recip_drLoc
6c8ffc8ddb Mart*0102 _RL recip_latentHeat
a86b6152f4 Dimi*0103 _RL tmpFac
ffe464dc7d Mart*0104
e4305b0f18 Patr*0105 #ifdef SHI_ALLOW_GAMMAFRICT
784f4a51b3 Mart*0106 _RL shiPr, shiSc, shiLo, recip_shiKarman, shiTwoThirds
0107 _RL gammaTmoleT, gammaTmoleS, gammaTurb, gammaTurbConst
e4305b0f18 Patr*0108 _RL ustar, ustarSq, etastar
9952f046d7 dngo*0109 _RL u_tmp, v_tmp
784f4a51b3 Mart*0110 PARAMETER ( shiTwoThirds = 0.66666666666666666666666666667D0 )
5744811f23 Mart*0111 #ifdef ALLOW_DIAGNOSTICS
0112 _RL uStarDiag(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
0113 #endif /* ALLOW_DIAGNOSTICS */
9952f046d7 dngo*0114 #endif /*SHI_ALLOW_GAMMAFRICT */
e4305b0f18 Patr*0115
5357e1c86c Jean*0116 #ifndef ALLOW_OPENAD
e3465203db Mart*0117 _RL SW_TEMP
0118 EXTERNAL SW_TEMP
bb49380557 Patr*0119 #endif
e3465203db Mart*0120
6b47d550f4 Mart*0121 #ifdef ALLOW_GENTIM2D_CONTROL
0122 INTEGER iarr
9952f046d7 dngo*0123 _RL xx_shifwflx_loc(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
9e75f57067 Jean*0124 #endif
dcd3df3e6a Ou W*0125 #ifdef ALLOW_AUTODIFF_TAMC
0126 # ifdef SHI_ALLOW_GAMMAFRICT
0127 INTEGER ikey
0128 # endif
0129 #endif
5744811f23 Mart*0130
ffe464dc7d Mart*0131
0132
e4305b0f18 Patr*0133 #ifdef SHI_ALLOW_GAMMAFRICT
26cd020e03 Jean*0134 #ifdef ALLOW_AUTODIFF
7ce1881910 Mart*0135
0136 DO bj = myByLo(myThid), myByHi(myThid)
0137 DO bi = myBxLo(myThid), myBxHi(myThid)
00f81e6785 Ou W*0138 DO j = 1-OLy,sNy+OLy
0139 DO i = 1-OLx,sNx+OLx
7ce1881910 Mart*0140 shiTransCoeffT(i,j,bi,bj) = SHELFICEheatTransCoeff
0141 shiTransCoeffS(i,j,bi,bj) = SHELFICEsaltTransCoeff
0142 ENDDO
0143 ENDDO
0144 ENDDO
823dd639fd Jean*0145 ENDDO
26cd020e03 Jean*0146 #endif /* ALLOW_AUTODIFF */
784f4a51b3 Mart*0147 IF ( SHELFICEuseGammaFrict ) THEN
0148
0149
0150 recip_shiKarman= 1. _d 0 / 0.4 _d 0
0151 shiLo = 0. _d 0
0152 shiPr = shiPrandtl**shiTwoThirds
0153 shiSc = shiSchmidt**shiTwoThirds
0154
0155
0156 gammaTmoleT = 12.5 _d 0 * shiPr - 6. _d 0
0157 gammaTmoleS = 12.5 _d 0 * shiSc - 6. _d 0
7462d20066 Mart*0158
0159 etastar = 1. _d 0
823dd639fd Jean*0160 gammaTurbConst = 1. _d 0 / (2. _d 0 * shiZetaN*etastar)
784f4a51b3 Mart*0161 & - recip_shiKarman
0162 ENDIF
0163 #endif /* SHI_ALLOW_GAMMAFRICT */
e4305b0f18 Patr*0164
6c8ffc8ddb Mart*0165 recip_latentHeat = 0. _d 0
0166 IF ( SHELFICElatentHeat .NE. 0. _d 0 )
0167 & recip_latentHeat = 1. _d 0/SHELFICElatentHeat
7108c05fdf Mart*0168
52d51b46b8 Jean*0169 recip_Cp = 1. _d 0 / HeatCapacity_Cp
7108c05fdf Mart*0170 cFac = 0. _d 0
0171 IF ( SHELFICEconserve ) cFac = 1. _d 0
9952f046d7 dngo*0172
7108c05fdf Mart*0173 rFac = 1. _d 0
0174 IF ( SHELFICEconserve .AND. useRealFreshWaterFlux ) rFac = 0. _d 0
9952f046d7 dngo*0175 rFWinBL = 0. _d 0
0176 IF ( SHI_withBL_realFWflux ) rFWinBL = 1. _d 0
823dd639fd Jean*0177
37e32ac0e0 Mart*0178
0179 dFac = 0. _d 0
0180 IF ( SHELFICEadvDiffHeatFlux ) dFac = 1. _d 0
0181 fwflxFac = 0. _d 0
17292dde13 Mart*0182
ffe464dc7d Mart*0183 a0 = -0.0575 _d 0
17292dde13 Mart*0184 a1 = 0.0 _d -0
0185 a2 = 0.0 _d -0
0186 c0 = 0.0901 _d 0
f39e9f371c Mart*0187 b0 = -7.61 _d -4
17292dde13 Mart*0188 #ifdef ALLOW_ISOMIP_TD
0189 IF ( useISOMIPTD ) THEN
0190
0191 a0 = -0.0575 _d 0
0192 a1 = 1.710523 _d -3
0193 a2 = -2.154996 _d -4
f39e9f371c Mart*0194 b0 = -7.53 _d -4
17292dde13 Mart*0195 c0 = 0. _d 0
0196 ENDIF
7108c05fdf Mart*0197 convertFW2SaltLoc = convertFW2Salt
0198
0199
0200 IF ( convertFW2SaltLoc .EQ. -1. ) convertFW2SaltLoc = 33.4 _d 0
f34b2e0f36 Jean*0201 #endif /* ALLOW_ISOMIP_TD */
a8eec31802 Mart*0202
ffe464dc7d Mart*0203 DO bj = myByLo(myThid), myByHi(myThid)
0204 DO bi = myBxLo(myThid), myBxHi(myThid)
f39e9f371c Mart*0205 DO j = 1-OLy,sNy+OLy
0206 DO i = 1-OLx,sNx+OLx
0207 shelfIceHeatFlux (i,j,bi,bj) = 0. _d 0
0208 shelfIceFreshWaterFlux(i,j,bi,bj) = 0. _d 0
0209 shelficeForcingT (i,j,bi,bj) = 0. _d 0
0210 shelficeForcingS (i,j,bi,bj) = 0. _d 0
74a4ab463e Mart*0211 #if (defined SHI_ALLOW_GAMMAFRICT && defined ALLOW_DIAGNOSTICS)
f39e9f371c Mart*0212 uStarDiag (i,j,bi,bj) = 0. _d 0
74a4ab463e Mart*0213 #endif /* SHI_ALLOW_GAMMAFRICT and ALLOW_DIAGNOSTICS */
3bafcf6020 Timo*0214 #ifdef ALLOW_GENTIM2D_CONTROL
f39e9f371c Mart*0215 xx_shifwflx_loc (i,j,bi,bj) = 0. _d 0
3bafcf6020 Timo*0216 #endif /* ALLOW_GENTIM2D_CONTROL */
40b188dddd Mart*0217 ENDDO
0218 ENDDO
f47cd69e8b Mart*0219 ENDDO
0220 ENDDO
cf705a6c8e Mart*0221 #if (defined ALLOW_CTRL && defined ALLOW_GENTIM2D_CONTROL)
0222 IF ( useCTRL ) THEN
6b47d550f4 Mart*0223 DO iarr = 1, maxCtrlTim2D
0224 IF (xx_gentim2d_file(iarr)(1:11).EQ.'xx_shifwflx') THEN
0225 DO bj = myByLo(myThid),myByHi(myThid)
0226 DO bi = myBxLo(myThid),myBxHi(myThid)
f39e9f371c Mart*0227 DO j = 1,sNy
0228 DO i = 1,sNx
0229 xx_shifwflx_loc(i,j,bi,bj)=xx_gentim2d(i,j,bi,bj,iarr)
6b47d550f4 Mart*0230 ENDDO
0231 ENDDO
0232 ENDDO
f47cd69e8b Mart*0233 ENDDO
6b47d550f4 Mart*0234 ENDIF
f47cd69e8b Mart*0235 ENDDO
6b47d550f4 Mart*0236 ENDIF
cf705a6c8e Mart*0237 #endif
c96d63ff5a Jean*0238
005af54e38 Jean*0239 #ifdef ALLOW_SHELFICE_REMESHING
0240 IF ( SHI_update_kTopC ) THEN
c96d63ff5a Jean*0241
0242
0243
0244
0245
0246 DO bj = myByLo(myThid), myByHi(myThid)
0247 DO bi = myBxLo(myThid), myBxHi(myThid)
0248 DO j = 1-OLy,sNy+OLy
0249 DO i = 1-OLx,sNx+OLx
0250 IF ( kSurfC(i,j,bi,bj).LE.Nr .AND.
0251 & shelficeMass(i,j,bi,bj).GT.zeroRL ) THEN
0252 kTopC(i,j,bi,bj) = kSurfC(i,j,bi,bj)
0253 ELSE
0254 kTopC(i,j,bi,bj) = 0
0255 ENDIF
0256 ENDDO
0257 ENDDO
0258 ENDDO
0259 ENDDO
0260 ENDIF
005af54e38 Jean*0261 # ifdef ALLOW_AUTODIFF_TAMC
c96d63ff5a Jean*0262
005af54e38 Jean*0263 # endif
0264 #endif /* ALLOW_SHELFICE_REMESHING */
0265 #ifdef ALLOW_AUTODIFF_TAMC
c96d63ff5a Jean*0266
0267 #endif
0268
f47cd69e8b Mart*0269 DO bj = myByLo(myThid), myByHi(myThid)
0270 DO bi = myBxLo(myThid), myBxHi(myThid)
9952f046d7 dngo*0271
7ce1881910 Mart*0272 #ifdef ALLOW_AUTODIFF_TAMC
0273 # ifdef SHI_ALLOW_GAMMAFRICT
20dee61641 Mart*0274 ikey = bi + (bj-1)*nSx + (ikey_dynamics-1)*nSx*nSy
7ce1881910 Mart*0275 # endif /* SHI_ALLOW_GAMMAFRICT */
0276 #endif /* ALLOW_AUTODIFF_TAMC */
c96d63ff5a Jean*0277
823dd639fd Jean*0278
04ba99fb18 Mart*0279
f39e9f371c Mart*0280 DO j = 1, sNy
0281 DO i = 1, sNx
0282 k = MAX(1,kTopC(i,j,bi,bj))
8eaa195dfe Jean*0283
0284
0285
f39e9f371c Mart*0286
8eaa195dfe Jean*0287
f39e9f371c Mart*0288 pLoc(i,j) = shelficeMass(i,j,bi,bj)*gravity*SItodBar
0289 tLoc(i,j) = theta(i,j,k,bi,bj)
0290 sLoc(i,j) = MAX(salt(i,j,k,bi,bj), zeroRL)
0291 velSq(i,j)= 0.
b06dffee6b Jean*0292 ENDDO
0293 ENDDO
f39e9f371c Mart*0294 DO j = 1, sNy+1
0295 DO i = 1, sNx+1
0296 uLoc(i,j) = 0.
0297 vLoc(i,j) = 0.
9952f046d7 dngo*0298 ENDDO
0299 ENDDO
0300 #ifdef SHI_ALLOW_GAMMAFRICT
0301 IF ( SHELFICEuseGammaFrict .AND. SHELFICE_oldCalcUStar ) THEN
0302
f39e9f371c Mart*0303 DO j = 1, sNy
0304 DO i = 1, sNx
0305 k = MAX(1,kTopC(i,j,bi,bj))
0306 uLoc(i,j) = recip_hFacC(i,j,k,bi,bj) * halfRL *
0307 & ( uVel(i, j,k,bi,bj) * _hFacW(i, j,k,bi,bj)
0308 & + uVel(i+1,j,k,bi,bj) * _hFacW(i+1,j,k,bi,bj) )
0309 vLoc(i,j) = recip_hFacC(i,j,k,bi,bj) * halfRL *
0310 & ( vVel(i,j, k,bi,bj) * _hFacS(i,j, k,bi,bj)
0311 & + vVel(i,j+1,k,bi,bj) * _hFacS(i,j+1,k,bi,bj) )
0312 velSq(i,j) = uLoc(i,j)*uLoc(i,j)+vLoc(i,j)*vLoc(i,j)
9952f046d7 dngo*0313 ENDDO
0314 ENDDO
0315 ELSEIF ( SHELFICEuseGammaFrict ) THEN
b06dffee6b Jean*0316
f39e9f371c Mart*0317 DO j = 1, sNy
0318 DO i = 1, sNx
0319 uLoc(i,j) = 0.
0320 vLoc(i,j) = 0.
0321 velSq(i,j) = 0.
0322 k = MAX(1,kTopC(i,j,bi,bj))
0323 tmpFac = _hFacW(i, j,k,bi,bj) + _hFacW(i+1,j,k,bi,bj)
b06dffee6b Jean*0324 IF ( tmpFac.GT.0. _d 0 )
f39e9f371c Mart*0325 & velSq(i,j) = (
0326 & uVel( i, j,k,bi,bj)*uVel( i, j,k,bi,bj)*_hFacW( i, j,k,bi,bj)
0327 & + uVel(i+1,j,k,bi,bj)*uVel(i+1,j,k,bi,bj)*_hFacW(i+1,j,k,bi,bj)
43bfccd244 Jean*0328 & )/tmpFac
f39e9f371c Mart*0329 tmpFac = _hFacS(i,j, k,bi,bj) + _hFacS(i,j+1,k,bi,bj)
b06dffee6b Jean*0330 IF ( tmpFac.GT.0. _d 0 )
f39e9f371c Mart*0331 & velSq(i,j) = velSq(i,j) + (
0332 & vVel(i, j, k,bi,bj)*vVel(i, j, k,bi,bj)*_hFacS(i, j, k,bi,bj)
0333 & + vVel(i,j+1,k,bi,bj)*vVel(i,j+1,k,bi,bj)*_hFacS(i,j+1,k,bi,bj)
43bfccd244 Jean*0334 & )/tmpFac
b06dffee6b Jean*0335 ENDDO
0336 ENDDO
0337 ENDIF
9952f046d7 dngo*0338 #endif /* SHI_ALLOW_GAMMAFRICT */
0339
04ba99fb18 Mart*0340 IF ( SHELFICEBoundaryLayer ) THEN
0341
f39e9f371c Mart*0342 DO j = 1, sNy
0343 DO i = 1, sNx
0344 k = kTopC(i,j,bi,bj)
0345 IF ( k .NE. 0 .AND. k .LT. Nr ) THEN
7b8b86ab99 Timo*0346
0347
f39e9f371c Mart*0348 tTMP = tLoc (i,j)
0349 sTMP = sLoc (i,j)
0350 uTMP = uLoc (i,j)
0351 vTMP = vLoc (i,j)
0352 vSqTMP = velSq(i,j)
7b8b86ab99 Timo*0353
f39e9f371c Mart*0354 kp1 = MIN(Nr,k+1)
40b188dddd Mart*0355
f39e9f371c Mart*0356 drKp1 = drF(k)*( 1. _d 0 - _hFacC(i,j,k,bi,bj) )
40b188dddd Mart*0357
f39e9f371c Mart*0358 drKp1 = MIN( drKp1, drF(kp1) * _hFacC(i,j,kp1,bi,bj) )
09df6ae39f Dani*0359 drKp1 = MAX( drKp1, 0. _d 0 )
ead4e7560e Jean*0360 recip_drLoc = 1. _d 0 /
f39e9f371c Mart*0361 & ( drF(k)*_hFacC(i,j,k,bi,bj) + drKp1 )
0362 tTMP = ( tTMP * drF(k)*_hFacC(i,j,k,bi,bj)
0363 & + theta(i,j,kp1,bi,bj) *drKp1 )
04ba99fb18 Mart*0364 & * recip_drLoc
f39e9f371c Mart*0365 sTMP = ( sTMP * drF(k)*_hFacC(i,j,k,bi,bj)
0366 & + MAX(salt(i,j,kp1,bi,bj), zeroRL) * drKp1 )
04ba99fb18 Mart*0367 & * recip_drLoc
f39e9f371c Mart*0368 uTMP = ( uTMP * drF(k)*_hFacC(i,j,k,bi,bj)
0369 & + drKp1 * recip_hFacC(i,j,kp1,bi,bj) * halfRL *
0370 & ( uVel(i, j,kp1,bi,bj) * _hFacW(i, j,kp1,bi,bj)
0371 & + uVel(i+1,j,kp1,bi,bj) * _hFacW(i+1,j,kp1,bi,bj) )
7ce1881910 Mart*0372 & ) * recip_drLoc
f39e9f371c Mart*0373 vTMP = ( vTMP * drF(k)*_hFacC(i,j,k,bi,bj)
0374 & + drKp1 * recip_hFacC(i,j,kp1,bi,bj) * halfRL *
0375 & ( vVel(i,j, kp1,bi,bj) * _hFacS(i,j, kp1,bi,bj)
0376 & + vVel(i,j+1,kp1,bi,bj) * _hFacS(i,j+1,kp1,bi,bj) )
7ce1881910 Mart*0377 & ) * recip_drLoc
7b8b86ab99 Timo*0378 vSqTMP = uTMP*uTMP + vTMP*vTMP
0379
f39e9f371c Mart*0380 tLoc (i,j) = tTMP
0381 sLoc (i,j) = sTMP
0382 uLoc (i,j) = uTMP
0383 vLoc (i,j) = vTMP
0384 velSq(i,j) = vSqTMP
04ba99fb18 Mart*0385 ENDIF
0386 ENDDO
0387 ENDDO
0388 ENDIF
0389
9952f046d7 dngo*0390 #ifdef SHI_ALLOW_GAMMAFRICT
0391 IF ( SHI_withBL_uStarTopDz ) THEN
0392
0393
0394
f39e9f371c Mart*0395 DO j = 1, sNy+1
0396 DO i = 1, sNx+1
0397 k = kSurfW(i,j,bi,bj)
0398 IF (k.LT.Nr) THEN
0399 kp1 = k+1
0400 drKp1 = drF(k)*( 1. _d 0 - _hFacW(i,j,k,bi,bj) )
0401 drKp1 = MIN( drKp1, drF(kp1) * _hFacW(i,j,kp1,bi,bj) )
9952f046d7 dngo*0402 drKp1 = MAX( drKp1, 0. _d 0 )
0403 recip_drLoc = 1. _d 0
f39e9f371c Mart*0404 & / ( drF(k)*_hFacW(i,j,k,bi,bj) + drKp1 )
0405 uLoc(i,j) = ( drF(k)*_hFacW(i,j,k,bi,bj)*uVel(i,j,k,bi,bj)
0406 & + drKp1*uVel(i,j,kp1,bi,bj)
9952f046d7 dngo*0407 & )*recip_drLoc
f39e9f371c Mart*0408
0409
0410
9952f046d7 dngo*0411
f39e9f371c Mart*0412 ELSEIF (k.EQ.Nr) THEN
0413 uLoc(i,j) = uVel(i,j,k,bi,bj)
9952f046d7 dngo*0414 ELSE
f39e9f371c Mart*0415 uLoc(i,j) = 0. _d 0
9952f046d7 dngo*0416 ENDIF
0417
f39e9f371c Mart*0418 k = kSurfS(i,j,bi,bj)
0419 IF (k.LT.Nr) THEN
0420 kp1 = k+1
0421 drKp1 = drF(k)*( 1. _d 0 - _hFacS(i,j,k,bi,bj) )
0422 drKp1 = MIN( drKp1, drF(kp1) * _hFacS(i,j,kp1,bi,bj) )
9952f046d7 dngo*0423 drKp1 = MAX( drKp1, 0. _d 0 )
0424 recip_drLoc = 1. _d 0
f39e9f371c Mart*0425 & / ( drF(k)*_hFacS(i,j,k,bi,bj) + drKp1 )
0426 vLoc(i,j) = ( drF(k)*_hFacS(i,j,k,bi,bj)*vVel(i,j,k,bi,bj)
0427 & + drKp1*vVel(i,j,kp1,bi,bj)
9952f046d7 dngo*0428 & )*recip_drLoc
f39e9f371c Mart*0429
0430
0431
9952f046d7 dngo*0432
f39e9f371c Mart*0433 ELSEIF (k.EQ.Nr) THEN
0434 vLoc(i,j) = vVel(i,j,k,bi,bj)
9952f046d7 dngo*0435 ELSE
f39e9f371c Mart*0436 vLoc(i,j) = 0. _d 0
9952f046d7 dngo*0437 ENDIF
0438
0439 ENDDO
0440 ENDDO
f39e9f371c Mart*0441 DO j = 1, sNy
0442 DO i = 1, sNx
0443 u_tmp = halfRL*( uLoc(i,j) + uLoc(i+1,j) )
0444 v_tmp = halfRL*( vLoc(i,j) + vLoc(i,j+1) )
0445 velSq(i,j) = u_tmp*u_tmp + v_tmp*v_tmp
9952f046d7 dngo*0446 ENDDO
0447 ENDDO
0448 ENDIF
0449 #endif /* SHI_ALLOW_GAMMAFRICT */
0450
ead4e7560e Jean*0451
e3465203db Mart*0452
f39e9f371c Mart*0453 DO j = 1, sNy
0454 DO i = 1, sNx
9952f046d7 dngo*0455 #ifdef ALLOW_OPENAD
f39e9f371c Mart*0456 CALL SW_TEMP(sLoc(i,j),tLoc(i,j),pLoc(i,j),zeroRL,tLoc(i,j))
9952f046d7 dngo*0457 #else
f39e9f371c Mart*0458 tLoc(i,j) = SW_TEMP(sLoc(i,j),tLoc(i,j),pLoc(i,j),zeroRL)
bb49380557 Patr*0459 #endif
e3465203db Mart*0460 ENDDO
0461 ENDDO
0462
7462d20066 Mart*0463 #ifdef SHI_ALLOW_GAMMAFRICT
0464 IF ( SHELFICEuseGammaFrict ) THEN
f39e9f371c Mart*0465 DO j = 1, sNy
0466 DO i = 1, sNx
0467 k = kTopC(i,j,bi,bj)
0468 IF ( k .NE. 0 .AND. pLoc(i,j) .GT. 0. _d 0 ) THEN
0469 ustarSq = shiCdragfld(i,j,bi,bj) * MAX( 1.D-6, velSq(i,j) )
7462d20066 Mart*0470 ustar = SQRT(ustarSq)
5744811f23 Mart*0471 #ifdef ALLOW_DIAGNOSTICS
f39e9f371c Mart*0472 uStarDiag(i,j,bi,bj) = ustar
5744811f23 Mart*0473 #endif /* ALLOW_DIAGNOSTICS */
7462d20066 Mart*0474
0475
823dd639fd Jean*0476
7462d20066 Mart*0477
f39e9f371c Mart*0478 IF ( fCori(i,j,bi,bj) .NE. 0. _d 0 ) THEN
7462d20066 Mart*0479 gammaTurb = LOG( ustarSq * shiZetaN * etastar**2
f39e9f371c Mart*0480 & / ABS(fCori(i,j,bi,bj) * 5.0 _d 0 * shiKinVisc))
823dd639fd Jean*0481 & * recip_shiKarman
7462d20066 Mart*0482 & + gammaTurbConst
823dd639fd Jean*0483
7462d20066 Mart*0484
0485
0486 ELSE
0487 gammaTurb = gammaTurbConst
0488 ENDIF
823dd639fd Jean*0489 shiTransCoeffT(i,j,bi,bj) = MAX( zeroRL,
7462d20066 Mart*0490 & ustar/(gammaTurb + gammaTmoleT) )
823dd639fd Jean*0491 shiTransCoeffS(i,j,bi,bj) = MAX( zeroRL,
7462d20066 Mart*0492 & ustar/(gammaTurb + gammaTmoleS) )
0493 ENDIF
0494 ENDDO
0495 ENDDO
0496 ENDIF
0497 #endif /* SHI_ALLOW_GAMMAFRICT */
0498
7ce1881910 Mart*0499 #ifdef ALLOW_AUTODIFF_TAMC
0500 # ifdef SHI_ALLOW_GAMMAFRICT
0501
0502
0503
0504
0505 # endif /* SHI_ALLOW_GAMMAFRICT */
0506 #endif /* ALLOW_AUTODIFF_TAMC */
04ba99fb18 Mart*0507 #ifdef ALLOW_ISOMIP_TD
0508 IF ( useISOMIPTD ) THEN
f39e9f371c Mart*0509 DO j = 1, sNy
0510 DO i = 1, sNx
0511 k = kTopC(i,j,bi,bj)
0512 IF ( k .NE. 0 .AND. pLoc(i,j) .GT. 0. _d 0 ) THEN
ffe464dc7d Mart*0513
ead4e7560e Jean*0514 thetaFreeze =
f39e9f371c Mart*0515 & sLoc(i,j) * ( a0 + a1*sqrt(sLoc(i,j)) + a2*sLoc(i,j) )
0516 & + b0*pLoc(i,j) + c0
ffe464dc7d Mart*0517
f39e9f371c Mart*0518 shelfIceHeatFlux(i,j,bi,bj) = maskC(i,j,k,bi,bj)
e4305b0f18 Patr*0519 & * shiTransCoeffT(i,j,bi,bj)
f39e9f371c Mart*0520 & * ( tLoc(i,j) - thetaFreeze )
e4305b0f18 Patr*0521 & * HeatCapacity_Cp*rUnit2mass
3bafcf6020 Timo*0522 #ifdef ALLOW_GENTIM2D_CONTROL
f39e9f371c Mart*0523 & - xx_shifwflx_loc(i,j,bi,bj)*SHELFICElatentHeat
3bafcf6020 Timo*0524 #endif /* ALLOW_GENTIM2D_CONTROL */
ffe464dc7d Mart*0525
2bf81d7d9d Mart*0526
0527
f39e9f371c Mart*0528 shelfIceFreshWaterFlux(i,j,bi,bj) =
0529 & - shelfIceHeatFlux(i,j,bi,bj)
6c8ffc8ddb Mart*0530 & *recip_latentHeat
ffe464dc7d Mart*0531
0532 shelficeForcingT(i,j,bi,bj) =
f39e9f371c Mart*0533 & - shelfIceHeatFlux(i,j,bi,bj)
0b1017b546 Jean*0534 & *recip_Cp*mass2rUnit
f39e9f371c Mart*0535 & - cFac * shelfIceFreshWaterFlux(i,j,bi,bj)*mass2rUnit
0536 & * ( thetaFreeze - tLoc(i,j) )
ead4e7560e Jean*0537 shelficeForcingS(i,j,bi,bj) =
f39e9f371c Mart*0538 & shelfIceFreshWaterFlux(i,j,bi,bj) * mass2rUnit
0539 & * ( cFac*sLoc(i,j) + (1. _d 0-cFac)*convertFW2SaltLoc )
ffe464dc7d Mart*0540
0541
71125c711d Mart*0542 ELSE
f39e9f371c Mart*0543 shelfIceHeatFlux (i,j,bi,bj) = 0. _d 0
0544 shelfIceFreshWaterFlux(i,j,bi,bj) = 0. _d 0
0545 shelficeForcingT (i,j,bi,bj) = 0. _d 0
0546 shelficeForcingS (i,j,bi,bj) = 0. _d 0
ffe464dc7d Mart*0547 ENDIF
0548 ENDDO
0549 ENDDO
0550 ELSE
ead4e7560e Jean*0551 #else
ffe464dc7d Mart*0552 IF ( .TRUE. ) THEN
0553 #endif /* ALLOW_ISOMIP_TD */
17292dde13 Mart*0554
ead4e7560e Jean*0555
17292dde13 Mart*0556
0557
a8eec31802 Mart*0558
f39e9f371c Mart*0559 DO j = 1, sNy
0560 DO i = 1, sNx
0561 k = kTopC(i,j,bi,bj)
0562 IF ( k .NE. 0 .AND. pLoc(i,j) .GT. 0. _d 0 ) THEN
823dd639fd Jean*0563
37e32ac0e0 Mart*0564
f39e9f371c Mart*0565 thetaFreeze = a0*sLoc(i,j)+c0+b0*pLoc(i,j)
37e32ac0e0 Mart*0566 fwflxFac = 0. _d 0
f39e9f371c Mart*0567 IF ( tLoc(i,j) .GT. thetaFreeze ) fwflxFac = dFac
e4305b0f18 Patr*0568
0569 eps1 = rUnit2mass*HeatCapacity_Cp
0570 & *shiTransCoeffT(i,j,bi,bj)
0571 eps2 = rUnit2mass*SHELFICElatentHeat
0572 & *shiTransCoeffS(i,j,bi,bj)
0573
0574
71125c711d Mart*0575
0576
0577
00f81e6785 Ou W*0578
823dd639fd Jean*0579
296c868ef5 Mart*0580
00f81e6785 Ou W*0581
397d7a6973 Patr*0582 eps3a = rhoShelfIce*SHELFICEheatCapacity_Cp
37e32ac0e0 Mart*0583 & * SHELFICEkappa * ( 1. _d 0 - dFac )
f39e9f371c Mart*0584 eps3 = eps3a/pLoc(i,j)
0585 eps4 = b0*pLoc(i,j) + c0
0586 eps6 = eps4 - tLoc(i,j)
71125c711d Mart*0587 eps7 = eps4 - SHELFICEthetaSurface
37e32ac0e0 Mart*0588 eps8 = rUnit2mass*SHELFICEheatCapacity_Cp
0589 & *shiTransCoeffS(i,j,bi,bj) * fwflxFac
f39e9f371c Mart*0590 epsq = eps1*eps6 + eps3*eps7
0591
0592 aqe = a0*(eps1+eps3-eps8)
17292dde13 Mart*0593 recip_aqe = 0. _d 0
71125c711d Mart*0594 IF ( aqe .NE. 0. _d 0 ) recip_aqe = 0.5 _d 0/aqe
f39e9f371c Mart*0595 bqe = epsq - eps2 + eps8*( a0*sLoc(i,j) - eps7 )
0596 & - a0*(eps1+eps3)*SHELFICEsalinity
0597 cqe = ( eps2 + eps8*eps7 )*sLoc(i,j) - epsq*SHELFICEsalinity
17292dde13 Mart*0598 discrim = bqe*bqe - 4. _d 0*aqe*cqe
71125c711d Mart*0599 #undef ALLOW_SHELFICE_DEBUG
17292dde13 Mart*0600 #ifdef ALLOW_SHELFICE_DEBUG
0601 IF ( discrim .LT. 0. _d 0 ) THEN
0602 print *, 'ml-shelfice: discrim = ', discrim,aqe,bqe,cqe
f39e9f371c Mart*0603 print *, 'ml-shelfice: pLoc = ', pLoc(i,j)
0604 print *, 'ml-shelfice: tLoc = ', tLoc(i,j)
0605 print *, 'ml-shelfice: sLoc = ', sLoc(i,j)
ead4e7560e Jean*0606 print *, 'ml-shelfice: tsurface= ',
17292dde13 Mart*0607 & SHELFICEthetaSurface
0608 print *, 'ml-shelfice: eps1 = ', eps1
0609 print *, 'ml-shelfice: eps2 = ', eps2
0610 print *, 'ml-shelfice: eps3 = ', eps3
0611 print *, 'ml-shelfice: eps4 = ', eps4
71125c711d Mart*0612 print *, 'ml-shelfice: eps6 = ', eps6
0613 print *, 'ml-shelfice: eps7 = ', eps7
296c868ef5 Mart*0614 print *, 'ml-shelfice: eps8 = ', eps8
2bf81d7d9d Mart*0615 print *, 'ml-shelfice: rU2mass = ', rUnit2mass
17292dde13 Mart*0616 print *, 'ml-shelfice: rhoIce = ', rhoShelfIce
a8eec31802 Mart*0617 print *, 'ml-shelfice: cFac = ', cFac
17292dde13 Mart*0618 print *, 'ml-shelfice: Cp_W = ', HeatCapacity_Cp
0619 print *, 'ml-shelfice: Cp_I = ',
0620 & SHELFICEHeatCapacity_Cp
ead4e7560e Jean*0621 print *, 'ml-shelfice: gammaT = ',
17292dde13 Mart*0622 & SHELFICEheatTransCoeff
ead4e7560e Jean*0623 print *, 'ml-shelfice: gammaS = ',
17292dde13 Mart*0624 & SHELFICEsaltTransCoeff
ead4e7560e Jean*0625 print *, 'ml-shelfice: lat.heat= ',
17292dde13 Mart*0626 & SHELFICElatentHeat
0627 STOP 'ABNORMAL END in S/R SHELFICE_THERMODYNAMICS'
0628 ENDIF
0629 #endif /* ALLOW_SHELFICE_DEBUG */
0630 saltFreeze = (- bqe - SQRT(discrim))*recip_aqe
f4aa450f28 Mart*0631 IF ( saltFreeze .LT. 0. _d 0 )
17292dde13 Mart*0632 & saltFreeze = (- bqe + SQRT(discrim))*recip_aqe
7108c05fdf Mart*0633 thetaFreeze = a0*saltFreeze + eps4
f39e9f371c Mart*0634 #ifdef SHI_SALTBAL_FWFLX
2bf81d7d9d Mart*0635
397d7a6973 Patr*0636
e4305b0f18 Patr*0637
0638
f39e9f371c Mart*0639
0640 freshWaterFlux = rUnit2mass * shiTransCoeffS(i,j,bi,bj)
0641
0642 IF ( saltFreeze .NE. 0. _d 0 )
0643 & freshWaterFlux = freshWaterFlux
0644 & * ( 1. _d 0 - sLoc(i,j) / saltFreeze )
0645 #else /* ndef SHI_SALTBAL_FWFLX */
0646
0647
0648
0649
0650
0651
0652
0653
0654
0655 freshWaterFlux = (
0656 & eps1*( thetaFreeze - tLoc(i,j) )
0657 & + eps3*( thetaFreeze - SHELFICEthetaSurface )
0658 & ) / ( SHELFICElatentHeat
0659 & + fwflxFac * SHELFICEheatCapacity_Cp*
0660 & (thetaFreeze - SHELFICEthetaSurface) )
0661 #endif /* ndef SHI_SALTBAL_FWFLX */
0662
3bafcf6020 Timo*0663 #ifdef ALLOW_GENTIM2D_CONTROL
f39e9f371c Mart*0664 freshWaterFlux = freshWaterFlux + xx_shifwflx_loc(i,j,bi,bj)
0665 #endif /* ALLOW_GENTIM2D_CONTROL */
71125c711d Mart*0666
ead4e7560e Jean*0667
71125c711d Mart*0668
f39e9f371c Mart*0669 shelfIceHeatFlux(i,j,bi,bj) =
823dd639fd Jean*0670 & ( eps3
37e32ac0e0 Mart*0671 & - freshWaterFlux*SHELFICEheatCapacity_Cp*fwflxFac )
0672 & * ( thetaFreeze - SHELFICEthetaSurface )
ead4e7560e Jean*0673 & - cFac*freshWaterFlux*( SHELFICElatentHeat
f39e9f371c Mart*0674 & - HeatCapacity_Cp*( thetaFreeze - rFac*tLoc(i,j) ) )
0675 shelfIceFreshWaterFlux(i,j,bi,bj) = freshWaterFlux
17292dde13 Mart*0676
9952f046d7 dngo*0677
0678
17292dde13 Mart*0679 shelficeForcingT(i,j,bi,bj) =
e4305b0f18 Patr*0680 & ( shiTransCoeffT(i,j,bi,bj)
9952f046d7 dngo*0681 & - cFac*freshWaterFlux*mass2rUnit
f39e9f371c Mart*0682 & )*( thetaFreeze - tLoc(i,j) )
9952f046d7 dngo*0683 & - rFWinBL*freshWaterFlux*mass2rUnit
f39e9f371c Mart*0684 & *( tLoc(i,j) - theta(i,j,k,bi,bj) )
ead4e7560e Jean*0685 shelficeForcingS(i,j,bi,bj) =
e4305b0f18 Patr*0686 & ( shiTransCoeffS(i,j,bi,bj)
9952f046d7 dngo*0687 & - cFac*freshWaterFlux*mass2rUnit
f39e9f371c Mart*0688 & )*( saltFreeze - sLoc(i,j) )
9952f046d7 dngo*0689 & - rFWinBL*freshWaterFlux*mass2rUnit
f39e9f371c Mart*0690 & *( sLoc(i,j) - salt(i,j,k,bi,bj) )
71125c711d Mart*0691 ELSE
f39e9f371c Mart*0692 shelfIceHeatFlux (i,j,bi,bj) = 0. _d 0
0693 shelfIceFreshWaterFlux(i,j,bi,bj) = 0. _d 0
0694 shelficeForcingT (i,j,bi,bj) = 0. _d 0
0695 shelficeForcingS (i,j,bi,bj) = 0. _d 0
17292dde13 Mart*0696 ENDIF
ead4e7560e Jean*0697 ENDDO
17292dde13 Mart*0698 ENDDO
0699
9952f046d7 dngo*0700 ENDIF
0701
ffe464dc7d Mart*0702 ENDDO
0703 ENDDO
00f81e6785 Ou W*0704 #ifdef ALLOW_AUTODIFF_TAMC
0705
0706
0707
0708 #endif
ead4e7560e Jean*0709
a0178c5a01 Jean*0710 IF (SHELFICEMassStepping) THEN
3d2f509a67 Dani*0711 CALL SHELFICE_STEP_ICEMASS( myTime, myIter, myThid )
0712 ENDIF
0713
4c0efb30d8 Mart*0714 #ifdef ALLOW_DIAGNOSTICS
0715 IF ( useDiagnostics ) THEN
ead4e7560e Jean*0716 CALL DIAGNOSTICS_FILL_RS(shelfIceFreshWaterFlux,'SHIfwFlx',
4c0efb30d8 Mart*0717 & 0,1,0,1,1,myThid)
ead4e7560e Jean*0718 CALL DIAGNOSTICS_FILL_RS(shelfIceHeatFlux, 'SHIhtFlx',
4c0efb30d8 Mart*0719 & 0,1,0,1,1,myThid)
a86b6152f4 Dimi*0720
0721 tmpFac = HeatCapacity_Cp*rUnit2mass
0722 CALL DIAGNOSTICS_SCALE_FILL(shelficeForcingT,tmpFac,1,
7462d20066 Mart*0723 & 'SHIForcT',0,1,0,1,1,myThid)
a86b6152f4 Dimi*0724
0725 tmpFac = rUnit2mass
0726 CALL DIAGNOSTICS_SCALE_FILL(shelficeForcingS,tmpFac,1,
7462d20066 Mart*0727 & 'SHIForcS',0,1,0,1,1,myThid)
0728
0729 CALL DIAGNOSTICS_FILL(shiTransCoeffT,'SHIgammT',
0730 & 0,1,0,1,1,myThid)
0731 CALL DIAGNOSTICS_FILL(shiTransCoeffS,'SHIgammS',
0732 & 0,1,0,1,1,myThid)
7b8b86ab99 Timo*0733
5744811f23 Mart*0734
fbf1101a4a Jean*0735 #ifdef SHI_ALLOW_GAMMAFRICT
7b8b86ab99 Timo*0736 IF ( SHELFICEuseGammaFrict ) THEN
0737 CALL DIAGNOSTICS_FILL(uStarDiag,'SHIuStar',0,1,0,1,1,myThid)
0738 CALL DIAGNOSTICS_FILL(shiCDragFld,'SHICDrag',
0739 & 0,1,0,1,1,myThid)
0740 ENDIF
fbf1101a4a Jean*0741 #endif /* SHI_ALLOW_GAMMAFRICT */
9952f046d7 dngo*0742 #ifdef ALLOW_SHELFICE_REMESHING
3b86795949 Jean*0743 CALL DIAGNOSTICS_FILL_RS( R_shelfIce, 'SHIRshel',
9952f046d7 dngo*0744 & 0, 1, 0, 1, 1, myThid )
0745 #endif
4c0efb30d8 Mart*0746 ENDIF
0747 #endif /* ALLOW_DIAGNOSTICS */
a86b6152f4 Dimi*0748
ffe464dc7d Mart*0749 #endif /* ALLOW_SHELFICE */
0750 RETURN
0751 END