8 |
#ifdef ALLOW_CTRL |
#ifdef ALLOW_CTRL |
9 |
# include "CTRL_OPTIONS.h" |
# include "CTRL_OPTIONS.h" |
10 |
#endif |
#endif |
|
#ifdef ALLOW_STREAMICE |
|
|
# include "STREAMICE_OPTIONS.h" |
|
|
#endif |
|
|
|
|
11 |
|
|
12 |
CBOP |
CBOP |
13 |
C !ROUTINE: SHELFICE_THERMODYNAMICS |
C !ROUTINE: SHELFICE_THERMODYNAMICS |
24 |
C | stresses at the ice/water interface are computed in separate |
C | stresses at the ice/water interface are computed in separate |
25 |
C | routines that are called from mom_fluxform/mom_vecinv |
C | routines that are called from mom_fluxform/mom_vecinv |
26 |
C *=============================================================* |
C *=============================================================* |
27 |
|
C \ev |
28 |
|
|
29 |
C !USES: |
C !USES: |
30 |
IMPLICIT NONE |
IMPLICIT NONE |
49 |
# include "tamc_keys.h" |
# include "tamc_keys.h" |
50 |
# endif /* SHI_ALLOW_GAMMAFRICT */ |
# endif /* SHI_ALLOW_GAMMAFRICT */ |
51 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
|
#ifdef ALLOW_STREAMICE |
|
|
# include "STREAMICE.h" |
|
|
#endif |
|
|
|
|
52 |
|
|
53 |
C !INPUT/OUTPUT PARAMETERS: |
C !INPUT/OUTPUT PARAMETERS: |
54 |
C === Routine arguments === |
C === Routine arguments === |
58 |
_RL myTime |
_RL myTime |
59 |
INTEGER myIter |
INTEGER myIter |
60 |
INTEGER myThid |
INTEGER myThid |
|
CEOP |
|
61 |
|
|
62 |
#ifdef ALLOW_SHELFICE |
#ifdef ALLOW_SHELFICE |
63 |
C !LOCAL VARIABLES : |
C !LOCAL VARIABLES : |
72 |
C convertFW2SaltLoc:: local copy of convertFW2Salt |
C convertFW2SaltLoc:: local copy of convertFW2Salt |
73 |
C cFac :: 1 for conservative form, 0, otherwise |
C cFac :: 1 for conservative form, 0, otherwise |
74 |
C rFac :: realFreshWaterFlux factor |
C rFac :: realFreshWaterFlux factor |
75 |
C dFac :: 0 for diffusive heat flux (Holland and Jenkins, 1999, eq21) |
C dFac :: 0 for diffusive heat flux (Holland and Jenkins, 1999, |
76 |
|
C eq21) |
77 |
C 1 for advective and diffusive heat flux (eq22, 26, 31) |
C 1 for advective and diffusive heat flux (eq22, 26, 31) |
78 |
C fwflxFac :: only effective for dFac=1, 1 if we expect a melting fresh |
C fwflxFac :: only effective for dFac=1, 1 if we expect a melting |
79 |
C water flux, 0 otherwise |
C fresh water flux, 0 otherwise |
80 |
C auxiliary variables and abbreviations: |
C auxiliary variables and abbreviations: |
81 |
C a0, a1, a2, b, c0 |
C a0, a1, a2, b, c0 |
82 |
C eps1, eps2, eps3, eps3a, eps4, eps5, eps6, eps7, eps8 |
C eps1, eps2, eps3, eps3a, eps4, eps5, eps6, eps7, eps8 |
96 |
_RL cFac, rFac, dFac, fwflxFac |
_RL cFac, rFac, dFac, fwflxFac |
97 |
_RL aqe, bqe, cqe, discrim, recip_aqe |
_RL aqe, bqe, cqe, discrim, recip_aqe |
98 |
_RL drKp1, recip_drLoc |
_RL drKp1, recip_drLoc |
99 |
|
_RL recip_latentHeat |
100 |
_RL tmpFac |
_RL tmpFac |
101 |
|
|
102 |
#ifdef SHI_ALLOW_GAMMAFRICT |
#ifdef SHI_ALLOW_GAMMAFRICT |
104 |
_RL gammaTmoleT, gammaTmoleS, gammaTurb, gammaTurbConst |
_RL gammaTmoleT, gammaTmoleS, gammaTurb, gammaTurbConst |
105 |
_RL ustar, ustarSq, etastar |
_RL ustar, ustarSq, etastar |
106 |
PARAMETER ( shiTwoThirds = 0.66666666666666666666666666667D0 ) |
PARAMETER ( shiTwoThirds = 0.66666666666666666666666666667D0 ) |
107 |
|
#ifdef ALLOW_DIAGNOSTICS |
108 |
|
_RL uStarDiag(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy) |
109 |
|
#endif /* ALLOW_DIAGNOSTICS */ |
110 |
#endif |
#endif |
111 |
|
|
112 |
#ifndef ALLOW_OPENAD |
#ifndef ALLOW_OPENAD |
117 |
#ifdef ALLOW_SHIFWFLX_CONTROL |
#ifdef ALLOW_SHIFWFLX_CONTROL |
118 |
_RL xx_shifwflx_loc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy) |
_RL xx_shifwflx_loc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy) |
119 |
#endif |
#endif |
120 |
|
CEOP |
121 |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
122 |
|
|
123 |
#ifdef SHI_ALLOW_GAMMAFRICT |
#ifdef SHI_ALLOW_GAMMAFRICT |
164 |
ENDIF |
ENDIF |
165 |
#endif /* SHI_ALLOW_GAMMAFRICT */ |
#endif /* SHI_ALLOW_GAMMAFRICT */ |
166 |
|
|
167 |
|
recip_latentHeat = 0. _d 0 |
168 |
|
IF ( SHELFICElatentHeat .NE. 0. _d 0 ) |
169 |
|
& recip_latentHeat = 1. _d 0/SHELFICElatentHeat |
170 |
C are we doing the conservative form of Jenkins et al. (2001)? |
C are we doing the conservative form of Jenkins et al. (2001)? |
171 |
recip_Cp = 1. _d 0 / HeatCapacity_Cp |
recip_Cp = 1. _d 0 / HeatCapacity_Cp |
172 |
cFac = 0. _d 0 |
cFac = 0. _d 0 |
209 |
shelfIceFreshWaterFlux(I,J,bi,bj) = 0. _d 0 |
shelfIceFreshWaterFlux(I,J,bi,bj) = 0. _d 0 |
210 |
shelficeForcingT (I,J,bi,bj) = 0. _d 0 |
shelficeForcingT (I,J,bi,bj) = 0. _d 0 |
211 |
shelficeForcingS (I,J,bi,bj) = 0. _d 0 |
shelficeForcingS (I,J,bi,bj) = 0. _d 0 |
212 |
|
#if (defined SHI_ALLOW_GAMMAFRICT && defined ALLOW_DIAGNOSTICS) |
213 |
|
uStarDiag (I,J,bi,bj) = 0. _d 0 |
214 |
|
#endif /* SHI_ALLOW_GAMMAFRICT and ALLOW_DIAGNOSTICS */ |
215 |
ENDDO |
ENDDO |
216 |
ENDDO |
ENDDO |
217 |
ENDDO |
ENDDO |
280 |
drKp1 = drF(K)*( 1. _d 0 - _hFacC(I,J,K,bi,bj) ) |
drKp1 = drF(K)*( 1. _d 0 - _hFacC(I,J,K,bi,bj) ) |
281 |
C-- lower cell may not be as thick as required |
C-- lower cell may not be as thick as required |
282 |
drKp1 = MIN( drKp1, drF(Kp1) * _hFacC(I,J,Kp1,bi,bj) ) |
drKp1 = MIN( drKp1, drF(Kp1) * _hFacC(I,J,Kp1,bi,bj) ) |
283 |
|
drKp1 = MAX( drKp1, 0. _d 0 ) |
284 |
recip_drLoc = 1. _d 0 / |
recip_drLoc = 1. _d 0 / |
285 |
& ( drF(K)*_hFacC(I,J,K,bi,bj) + drKp1 ) |
& ( drF(K)*_hFacC(I,J,K,bi,bj) + drKp1 ) |
286 |
tLoc(I,J) = ( tLoc(I,J) * drF(K)*_hFacC(I,J,K,bi,bj) |
tLoc(I,J) = ( tLoc(I,J) * drF(K)*_hFacC(I,J,K,bi,bj) |
325 |
ustarSq = shiCdrag * MAX( 1.D-6, |
ustarSq = shiCdrag * MAX( 1.D-6, |
326 |
& 0.25 _d 0 *(uLoc(I,J)*uLoc(I,J)+vLoc(I,J)*vLoc(I,J)) ) |
& 0.25 _d 0 *(uLoc(I,J)*uLoc(I,J)+vLoc(I,J)*vLoc(I,J)) ) |
327 |
ustar = SQRT(ustarSq) |
ustar = SQRT(ustarSq) |
328 |
|
#ifdef ALLOW_DIAGNOSTICS |
329 |
|
uStarDiag(I,J,bi,bj) = ustar |
330 |
|
#endif /* ALLOW_DIAGNOSTICS */ |
331 |
C instead of etastar = sqrt(1+zetaN*ustar./(f*Lo*Rc)) |
C instead of etastar = sqrt(1+zetaN*ustar./(f*Lo*Rc)) |
332 |
C etastar = 1. _d 0 |
C etastar = 1. _d 0 |
333 |
C gammaTurbConst = 1. _d 0 / (2. _d 0 * shiZetaN*etastar) |
C gammaTurbConst = 1. _d 0 / (2. _d 0 * shiZetaN*etastar) |
384 |
C and vice versa |
C and vice versa |
385 |
shelfIceFreshWaterFlux(I,J,bi,bj) = |
shelfIceFreshWaterFlux(I,J,bi,bj) = |
386 |
& - shelfIceHeatFlux(I,J,bi,bj) |
& - shelfIceHeatFlux(I,J,bi,bj) |
387 |
& *recip_SHELFICElatentHeat |
& *recip_latentHeat |
388 |
C-- compute surface tendencies |
C-- compute surface tendencies |
389 |
shelficeForcingT(i,j,bi,bj) = |
shelficeForcingT(i,j,bi,bj) = |
390 |
& - shelfIceHeatFlux(I,J,bi,bj) |
& - shelfIceHeatFlux(I,J,bi,bj) |
536 |
ENDDO |
ENDDO |
537 |
ENDDO |
ENDDO |
538 |
|
|
539 |
IF (SHELFICEallowThinIceMass) then |
IF (SHELFICEMassStepping) THEN |
|
#ifdef ALLOW_STREAMICE |
|
|
DO bj = myByLo(myThid), myByHi(myThid) |
|
|
DO bi = myBxLo(myThid), myBxHi(myThid) |
|
|
DO j=1-Oly,sNy+Oly-1 |
|
|
DO i=1-Olx+1,sNx+Olx-1 |
|
|
|
|
|
if (streamice_hmask(i,j,bi,bj).eq.1 .or. |
|
|
& streamice_hmask(i,j,bi,bj).eq.2) then |
|
|
|
|
|
shelficeMass(i,j,bi,bj) = |
|
|
& H_streamice(I,J,bi,bj) * streamice_density |
|
|
|
|
|
endif |
|
|
|
|
|
ENDDO |
|
|
ENDDO |
|
|
ENDDO |
|
|
ENDDO |
|
|
#else |
|
540 |
CALL SHELFICE_STEP_ICEMASS( myTime, myIter, myThid ) |
CALL SHELFICE_STEP_ICEMASS( myTime, myIter, myThid ) |
|
#endif |
|
541 |
ENDIF |
ENDIF |
542 |
|
|
543 |
C-- Calculate new loading anomaly (in case the ice-shelf mass was updated) |
C-- Calculate new loading anomaly (in case the ice-shelf mass was updated) |
575 |
& 0,1,0,1,1,myThid) |
& 0,1,0,1,1,myThid) |
576 |
CALL DIAGNOSTICS_FILL(shiTransCoeffS,'SHIgammS', |
CALL DIAGNOSTICS_FILL(shiTransCoeffS,'SHIgammS', |
577 |
& 0,1,0,1,1,myThid) |
& 0,1,0,1,1,myThid) |
578 |
|
C Friction velocity |
579 |
|
#ifdef SHI_ALLOW_GAMMAFRICT |
580 |
|
IF ( SHELFICEuseGammaFrict ) |
581 |
|
& CALL DIAGNOSTICS_FILL(uStarDiag,'SHIuStar',0,1,0,1,1,myThid) |
582 |
|
#endif /* SHI_ALLOW_GAMMAFRICT */ |
583 |
ENDIF |
ENDIF |
584 |
#endif /* ALLOW_DIAGNOSTICS */ |
#endif /* ALLOW_DIAGNOSTICS */ |
585 |
|
|