/[MITgcm]/MITgcm_contrib/shelfice_remeshing/CLEAN/code/shelfice_thermodynamics.F
ViewVC logotype

Contents of /MITgcm_contrib/shelfice_remeshing/CLEAN/code/shelfice_thermodynamics.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.5 - (show annotations) (download)
Fri Jan 22 10:26:50 2016 UTC (9 years, 6 months ago) by dgoldberg
Branch: MAIN
CVS Tags: HEAD
Changes since 1.4: +0 -0 lines
Error occurred while calculating annotation data.
Overlap bug fixing

1 C $Header: /u/gcmpack/MITgcm_contrib/verification_other/shelfice_remeshing/code/shelfice_thermodynamics.F,v 1.1 2015/12/11 19:48:32 dgoldberg Exp $
2 C $Name: $
3
4 #include "SHELFICE_OPTIONS.h"
5 #ifdef ALLOW_AUTODIFF
6 # include "AUTODIFF_OPTIONS.h"
7 #endif
8 #ifdef ALLOW_CTRL
9 # include "CTRL_OPTIONS.h"
10 #endif
11
12 CBOP
13 C !ROUTINE: SHELFICE_THERMODYNAMICS
14 C !INTERFACE:
15 SUBROUTINE SHELFICE_THERMODYNAMICS(
16 I myTime, myIter, myThid )
17 C !DESCRIPTION: \bv
18 C *=============================================================*
19 C | S/R SHELFICE_THERMODYNAMICS
20 C | o shelf-ice main routine.
21 C | compute temperature and (virtual) salt flux at the
22 C | shelf-ice ocean interface
23 C |
24 C | stresses at the ice/water interface are computed in separate
25 C | routines that are called from mom_fluxform/mom_vecinv
26 C *=============================================================*
27 C \ev
28
29 C !USES:
30 IMPLICIT NONE
31
32 C === Global variables ===
33 #include "SIZE.h"
34 #include "EEPARAMS.h"
35 #include "PARAMS.h"
36 #include "GRID.h"
37 #include "DYNVARS.h"
38 #include "FFIELDS.h"
39 #include "SHELFICE.h"
40 #include "SHELFICE_COST.h"
41 #ifdef ALLOW_AUTODIFF
42 # include "CTRL_SIZE.h"
43 # include "ctrl.h"
44 # include "ctrl_dummy.h"
45 #endif /* ALLOW_AUTODIFF */
46 #ifdef ALLOW_AUTODIFF_TAMC
47 # ifdef SHI_ALLOW_GAMMAFRICT
48 # include "tamc.h"
49 # include "tamc_keys.h"
50 # endif /* SHI_ALLOW_GAMMAFRICT */
51 #endif /* ALLOW_AUTODIFF_TAMC */
52 #ifdef ALLOW_STREAMICE
53 # include "STREAMICE.h"
54 #endif /* ALLOW_STREAMICE */
55
56 C !INPUT/OUTPUT PARAMETERS:
57 C === Routine arguments ===
58 C myIter :: iteration counter for this thread
59 C myTime :: time counter for this thread
60 C myThid :: thread number for this instance of the routine.
61 _RL myTime
62 INTEGER myIter
63 INTEGER myThid
64
65 #ifdef ALLOW_SHELFICE
66 C !LOCAL VARIABLES :
67 C === Local variables ===
68 C I,J,K,Kp1,bi,bj :: loop counters
69 C tLoc, sLoc, pLoc :: local in-situ temperature, salinity, pressure
70 C theta/saltFreeze :: temperature and salinity of water at the
71 C ice-ocean interface (at the freezing point)
72 C freshWaterFlux :: local variable for fresh water melt flux due
73 C to melting in kg/m^2/s
74 C (negative density x melt rate)
75 C convertFW2SaltLoc:: local copy of convertFW2Salt
76 C cFac :: 1 for conservative form, 0, otherwise
77 C rFac :: realFreshWaterFlux factor
78 C dFac :: 0 for diffusive heat flux (Holland and Jenkins, 1999,
79 C eq21)
80 C 1 for advective and diffusive heat flux (eq22, 26, 31)
81 C fwflxFac :: only effective for dFac=1, 1 if we expect a melting
82 C fresh water flux, 0 otherwise
83 C auxiliary variables and abbreviations:
84 C a0, a1, a2, b, c0
85 C eps1, eps2, eps3, eps3a, eps4, eps5, eps6, eps7, eps8
86 C aqe, bqe, cqe, discrim, recip_aqe
87 C drKp1, recip_drLoc
88 INTEGER I,J,K,Kp1,kp2
89 INTEGER bi,bj
90 _RL tLoc(1:sNx,1:sNy)
91 _RL sLoc(1:sNx,1:sNy)
92 _RL pLoc(1:sNx,1:sNy)
93 _RL uLoc(1:sNx,1:sNy)
94 _RL vLoc(1:sNx,1:sNy)
95 _RL u_topdr(1:sNx+1,1:sNy+1,nSx,nSy)
96 _RL v_topdr(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
97 _RL thetaFreeze, saltFreeze, recip_Cp
98 _RL freshWaterFlux, convertFW2SaltLoc
99 _RL a0, a1, a2, b, c0
100 _RL eps1, eps2, eps3, eps3a, eps4, eps5, eps6, eps7, eps8
101 _RL cFac, rFac, dFac, fwflxFac, realfwFac
102 _RL aqe, bqe, cqe, discrim, recip_aqe
103 _RL drKp1, drKp2, recip_drLoc
104 _RL recip_latentHeat
105 _RL tmpFac
106 _RL massMin, mass, mass_eff, DELZ
107 _RL SHA,FACTOR1,FACTOR2,FACTOR3
108 _RL GMSL,ETACOUNT
109 #ifdef SHI_ALLOW_GAMMAFRICT
110 _RL shiPr, shiSc, shiLo, recip_shiKarman, shiTwoThirds
111 _RL gammaTmoleT, gammaTmoleS, gammaTurb, gammaTurbConst
112 _RL ustar, ustarSq, etastar
113 PARAMETER ( shiTwoThirds = 0.66666666666666666666666666667D0 )
114 #ifdef ALLOW_DIAGNOSTICS
115 _RL uStarDiag(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
116 #endif /* ALLOW_DIAGNOSTICS */
117 #endif
118
119 #ifndef ALLOW_OPENAD
120 _RL SW_TEMP
121 EXTERNAL SW_TEMP
122 #endif
123
124 #ifdef ALLOW_SHIFWFLX_CONTROL
125 _RL xx_shifwflx_loc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
126 #endif
127 CEOP
128 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
129
130 #ifdef SHI_ALLOW_GAMMAFRICT
131 #ifdef ALLOW_AUTODIFF
132 C re-initialize here again, curtesy to TAF
133 DO bj = myByLo(myThid), myByHi(myThid)
134 DO bi = myBxLo(myThid), myBxHi(myThid)
135 DO J = 1-OLy,sNy+OLy
136 DO I = 1-OLx,sNx+OLx
137 shiTransCoeffT(i,j,bi,bj) = SHELFICEheatTransCoeff
138 shiTransCoeffS(i,j,bi,bj) = SHELFICEsaltTransCoeff
139 ENDDO
140 ENDDO
141 ENDDO
142 ENDDO
143 #endif /* ALLOW_AUTODIFF */
144 IF ( SHELFICEuseGammaFrict ) THEN
145 C Implement friction velocity-dependent transfer coefficient
146 C of Holland and Jenkins, JPO, 1999
147 recip_shiKarman= 1. _d 0 / 0.4 _d 0
148 shiLo = 0. _d 0
149 shiPr = shiPrandtl**shiTwoThirds
150 shiSc = shiSchmidt**shiTwoThirds
151 cph shiPr = (viscArNr(1)/diffKrNrT(1))**shiTwoThirds
152 cph shiSc = (viscArNr(1)/diffKrNrS(1))**shiTwoThirds
153 gammaTmoleT = 12.5 _d 0 * shiPr - 6. _d 0
154 gammaTmoleS = 12.5 _d 0 * shiSc - 6. _d 0
155 C instead of etastar = sqrt(1+zetaN*ustar./(f*Lo*Rc))
156 etastar = 1. _d 0
157 gammaTurbConst = 1. _d 0 / (2. _d 0 * shiZetaN*etastar)
158 & - recip_shiKarman
159 #ifdef ALLOW_AUTODIFF
160 DO bj = myByLo(myThid), myByHi(myThid)
161 DO bi = myBxLo(myThid), myBxHi(myThid)
162 DO J = 1-OLy,sNy+OLy
163 DO I = 1-OLx,sNx+OLx
164 shiTransCoeffT(i,j,bi,bj) = 0. _d 0
165 shiTransCoeffS(i,j,bi,bj) = 0. _d 0
166 ENDDO
167 ENDDO
168 ENDDO
169 ENDDO
170 #endif /* ALLOW_AUTODIFF */
171 ENDIF
172 #endif /* SHI_ALLOW_GAMMAFRICT */
173
174 recip_latentHeat = 0. _d 0
175 IF ( SHELFICElatentHeat .NE. 0. _d 0 )
176 & recip_latentHeat = 1. _d 0/SHELFICElatentHeat
177 C are we doing the conservative form of Jenkins et al. (2001)?
178 recip_Cp = 1. _d 0 / HeatCapacity_Cp
179 cFac = 0. _d 0
180 IF ( SHELFICEconserve ) cFac = 1. _d 0
181
182 realFWfac = 0. _d 0
183 IF ( SHELFICErealFWflux ) realFWfac = 1. _d 0
184 C with "real fresh water flux" (affecting ETAN),
185 C there is more to modify
186 rFac = 1. _d 0
187 IF ( SHELFICEconserve .AND. useRealFreshWaterFlux ) rFac = 0. _d 0
188 C heat flux into the ice shelf, default is diffusive flux
189 C (Holland and Jenkins, 1999, eq.21)
190 dFac = 0. _d 0
191 IF ( SHELFICEadvDiffHeatFlux ) dFac = 1. _d 0
192 fwflxFac = 0. _d 0
193 C linear dependence of freezing point on salinity
194 a0 = -0.0575 _d 0
195 a1 = 0.0 _d -0
196 a2 = 0.0 _d -0
197 c0 = 0.0901 _d 0
198 b = -7.61 _d -4
199 #ifdef ALLOW_ISOMIP_TD
200 IF ( useISOMIPTD ) THEN
201 C non-linear dependence of freezing point on salinity
202 a0 = -0.0575 _d 0
203 a1 = 1.710523 _d -3
204 a2 = -2.154996 _d -4
205 b = -7.53 _d -4
206 c0 = 0. _d 0
207 ENDIF
208 convertFW2SaltLoc = convertFW2Salt
209 C hardcoding this value here is OK because it only applies to ISOMIP
210 C where this value is part of the protocol
211 IF ( convertFW2SaltLoc .EQ. -1. ) convertFW2SaltLoc = 33.4 _d 0
212 #endif /* ALLOW_ISOMIP_TD */
213
214 DO bj = myByLo(myThid), myByHi(myThid)
215 DO bi = myBxLo(myThid), myBxHi(myThid)
216 DO J = 1-OLy,sNy+OLy
217 DO I = 1-OLx,sNx+OLx
218 shelfIceHeatFlux (I,J,bi,bj) = 0. _d 0
219 shelfIceFreshWaterFlux(I,J,bi,bj) = 0. _d 0
220 shelficeForcingT (I,J,bi,bj) = 0. _d 0
221 shelficeForcingS (I,J,bi,bj) = 0. _d 0
222 #if (defined SHI_ALLOW_GAMMAFRICT && defined ALLOW_DIAGNOSTICS)
223 uStarDiag (I,J,bi,bj) = 0. _d 0
224 #endif /* SHI_ALLOW_GAMMAFRICT and ALLOW_DIAGNOSTICS */
225 ENDDO
226 ENDDO
227 ENDDO
228 ENDDO
229 #ifdef ALLOW_SHIFWFLX_CONTROL
230 DO bj = myByLo(myThid), myByHi(myThid)
231 DO bi = myBxLo(myThid), myBxHi(myThid)
232 DO J = 1-OLy,sNy+OLy
233 DO I = 1-OLx,sNx+OLx
234 xx_shifwflx_loc(I,J,bi,bj) = 0. _d 0
235 ENDDO
236 ENDDO
237 ENDDO
238 ENDDO
239 #ifdef ALLOW_CTRL
240 if (useCTRL) CALL CTRL_GET_GEN (
241 & xx_shifwflx_file, xx_shifwflxstartdate, xx_shifwflxperiod,
242 & maskSHI, xx_shifwflx_loc, xx_shifwflx0, xx_shifwflx1,
243 & xx_shifwflx_dummy,
244 & xx_shifwflx_remo_intercept, xx_shifwflx_remo_slope,
245 & wshifwflx,
246 & myTime, myIter, myThid )
247 #endif
248 #endif /* ALLOW_SHIFWFLX_CONTROL */
249 DO bj = myByLo(myThid), myByHi(myThid)
250 DO bi = myBxLo(myThid), myBxHi(myThid)
251
252 IF ( SHELFICEBoundaryLayer ) THEN
253 C-- average over boundary layer width
254 DO J = 1, sNy+1
255 DO I = 1, sNx+1
256 u_topdr(I,J,bi,bj) = 0.0
257 v_topdr(I,J,bi,bj) = 0.0
258 ENDDO
259 ENDDO
260 ENDIF
261
262 #ifdef ALLOW_AUTODIFF_TAMC
263 # ifdef SHI_ALLOW_GAMMAFRICT
264 act1 = bi - myBxLo(myThid)
265 max1 = myBxHi(myThid) - myBxLo(myThid) + 1
266 act2 = bj - myByLo(myThid)
267 max2 = myByHi(myThid) - myByLo(myThid) + 1
268 act3 = myThid - 1
269 max3 = nTx*nTy
270 act4 = ikey_dynamics - 1
271 ikey = (act1 + 1) + act2*max1
272 & + act3*max1*max2
273 & + act4*max1*max2*max3
274 # endif /* SHI_ALLOW_GAMMAFRICT */
275 #endif /* ALLOW_AUTODIFF_TAMC */
276 DO J = 1, sNy
277 DO I = 1, sNx
278 C-- make local copies of temperature, salinity and depth (pressure in deci-bar)
279 C-- underneath the ice
280 K = MAX(1,kTopC(I,J,bi,bj))
281 pLoc(I,J) = ABS(R_shelfIce(I,J,bi,bj))
282 c pLoc(I,J) = shelficeMass(I,J,bi,bj)*gravity*1. _d -4
283 tLoc(I,J) = theta(I,J,K,bi,bj)
284 sLoc(I,J) = MAX(salt(I,J,K,bi,bj), zeroRL)
285 IF ( .not.SHELFICEBoundaryLayer ) THEN
286 uLoc(I,J) = recip_hFacC(I,J,K,bi,bj) *
287 & ( uVel(I, J,K,bi,bj) * _hFacW(I, J,K,bi,bj)
288 & + uVel(I+1,J,K,bi,bj) * _hFacW(I+1,J,K,bi,bj) )
289 vLoc(I,J) = recip_hFacC(I,J,K,bi,bj) *
290 & ( vVel(I, J,K,bi,bj) * _hFacS(I, J,K,bi,bj)
291 & + vVel(I,J+1,K,bi,bj) * _hFacS(I,J+1,K,bi,bj) )
292 ENDIF
293 ENDDO
294 ENDDO
295
296 ! IF ( SHELFICEBoundaryLayer ) THEN
297 ! DO J = 1, sNy+1
298 ! DO I = 1, sNx+1
299 !
300 ! K = ksurfW(I,J,bi,bj)
301 ! Kp1 = K+1
302 ! Kp2 = K+2
303 !
304 ! IF (ShelficeThickBoundaryLayer .and.
305 ! & (K.ne.0.and.K.LT.Nr-1)) THEN
306 !
307 ! drKp1 = drF(K)*( 1.5 - _hFacW(I,J,K,bi,bj) )
308 ! drKp2 = drKp1 - drF(kp1)*_hFacW(I,J,kp1,bi,bj)
309 ! drKp2 = MAX( drKp2, 0. _d 0)
310 ! drKp2 = MIN( drKp2,
311 ! & drF(kp2)*_hFacW(I,J,kp2,bi,bj))
312 ! drKp1 = drKp1 - drKp2
313 ! drKp1 = MAX( drKp1, 0. _d 0)
314 ! recip_drLoc = 1. _d 0 /
315 ! & (drF(K)*_hFacW(I,J,K,bi,bj)+drKp1+drKp2)
316 ! u_topdr(I,J,bi,bj) =
317 ! & (drF(K)*_hFacW(I,J,K,bi,bj)*uVel(I,J,K,bi,bj) +
318 ! & drKp1*uVel(I,J,Kp1,bi,bj)) * recip_drLoc
319 ! u_topdr(I,J,bi,bj) = u_topdr(I,J,bi,bj) +
320 ! & drKp2 * uVel(I,J,Kp2,bi,bj) * recip_drLoc
321 !
322 ! ELSEIF ( (K .NE. 0 .AND. K.EQ.Nr-1) .OR.
323 ! & (.not.SHELFICEthickboundarylayer.AND.
324 ! & (K .NE. 0 .AND. K .LT. Nr) ) ) THEN
325 !
326 ! drKp1 = drF(K)*(1. _d 0-_hFacW(I,J,K,bi,bj))
327 ! drKp1 = max (drKp1, 0. _d 0)
328 ! recip_drLoc = 1.0 /
329 ! & (drF(K)*_hFacW(I,J,K,bi,bj)+drKp1)
330 ! u_topdr(I,J,bi,bj) =
331 ! & (drF(K)*_hFacW(I,J,K,bi,bj)*uVel(I,J,K,bi,bj) +
332 ! & drKp1*uVel(I,J,Kp1,bi,bj))
333 ! & * recip_drLoc
334 !
335 ! ELSE
336 !
337 ! u_topdr(I,J,bi,bj) = 0. _d 0
338 !
339 ! ENDIF
340 !
341 ! K = ksurfS(I,J,bi,bj)
342 ! Kp1 = K+1
343 ! Kp2 = K+2
344 !
345 ! IF (ShelficeThickBoundaryLayer .and.
346 ! & (K.ne.0.and.K.LT.Nr-1)) THEN
347 !
348 ! drKp1 = drF(K)*( 1.5 - _hFacS(I,J,K,bi,bj) )
349 ! drKp2 = drKp1 - drF(kp1)*_hFacS(I,J,kp1,bi,bj)
350 ! drKp2 = MAX( drKp2, 0. _d 0)
351 ! drKp2 = MIN( drKp2,
352 ! & drF(kp2)*_hFacS(I,J,kp2,bi,bj))
353 ! drKp1 = drKp1 - drKp2
354 ! drKp1 = MAX( drKp1, 0. _d 0)
355 ! recip_drLoc = 1. _d 0 /
356 ! & (drF(K)*_hFacS(I,J,K,bi,bj)+drKp1+drKp2)
357 ! v_topdr(I,J,bi,bj) =
358 ! & (drF(K)*_hFacS(I,J,K,bi,bj)*vVel(I,J,K,bi,bj) +
359 ! & drKp1*vVel(I,J,Kp1,bi,bj)) * recip_drLoc
360 ! v_topdr(I,J,bi,bj) = v_topdr(I,J,bi,bj) +
361 ! & drKp2 * vVel(I,J,Kp2,bi,bj) * recip_drLoc
362 !
363 ! ELSEIF ( (K .NE. 0 .AND. K.EQ.Nr-1) .OR.
364 ! & ((.NOT.SHELFICEthickboundarylayer).AND.
365 ! & (K .NE. 0 .AND. K .LT. Nr) ) ) THEN
366 !
367 ! drKp1 = drF(K)*(1. _d 0-_hFacS(I,J,K,bi,bj))
368 ! drKp1 = max (drKp1, 0. _d 0)
369 ! recip_drLoc = 1.0 /
370 ! & (drF(K)*_hFacS(I,J,K,bi,bj)+drKp1)
371 ! v_topdr(I,J,bi,bj) =
372 ! & (drF(K)*_hFacS(I,J,K,bi,bj)*vVel(I,J,K,bi,bj) +
373 ! & drKp1*vVel(I,J,Kp1,bi,bj))
374 ! & * recip_drLoc
375 !
376 ! ELSE
377 !
378 ! v_topdr(I,J,bi,bj) = 0. _d 0
379 !
380 ! ENDIF
381 !
382 ! ENDDO
383 ! ENDDO
384 ! ENDIF
385
386 IF ( SHELFICEBoundaryLayer ) THEN
387 DO J = 1, sNy+1
388 DO I = 1, sNx+1
389 K = ksurfW(I,J,bi,bj)
390 Kp1 = K+1
391 IF (K.lt.Nr) then
392 drKp1 = drF(K)*(1. _d 0-_hFacW(I,J,K,bi,bj))
393 drKp1 = max (drKp1, 0. _d 0)
394 recip_drLoc = 1.0 /
395 & (drF(K)*_hFacW(I,J,K,bi,bj)+drKp1)
396 u_topdr(I,J,bi,bj) =
397 & (drF(K)*_hFacW(I,J,K,bi,bj)*uVel(I,J,K,bi,bj) +
398 & drKp1*uVel(I,J,Kp1,bi,bj))
399 & * recip_drLoc
400 ELSE
401 u_topdr(I,J,bi,bj) = 0. _d 0
402 ENDIF
403
404 K = ksurfS(I,J,bi,bj)
405 Kp1 = K+1
406 IF (K.lt.Nr) then
407 drKp1 = drF(K)*(1. _d 0-_hFacS(I,J,K,bi,bj))
408 drKp1 = max (drKp1, 0. _d 0)
409 recip_drLoc = 1.0 /
410 & (drF(K)*_hFacS(I,J,K,bi,bj)+drKp1)
411 v_topdr(I,J,bi,bj) =
412 & (drF(K)*_hFacS(I,J,K,bi,bj)*vVel(I,J,K,bi,bj) +
413 & drKp1*vVel(I,J,Kp1,bi,bj))
414 & * recip_drLoc
415 ELSE
416 v_topdr(I,J,bi,bj) = 0. _d 0
417 ENDIF
418
419 ENDDO
420 ENDDO
421 ENDIF
422
423 IF ( SHELFICEBoundaryLayer ) THEN
424 C-- average over boundary layer width
425 DO J = 1, sNy
426 DO I = 1, sNx
427 K = kTopC(I,J,bi,bj)
428 IF ( K .NE. 0 .AND. K .LT. Nr ) THEN
429 Kp1 = MIN(Nr,K+1)
430 C-- overlap into lower cell
431 drKp1 = drF(K)*( 1. _d 0 - _hFacC(I,J,K,bi,bj) )
432 C-- Dans fix
433 drKp1 = MAX(drKp1, 0.)
434 C-- lower cell may not be as thick as required
435 drKp1 = MIN( drKp1, drF(Kp1) * _hFacC(I,J,Kp1,bi,bj) )
436 recip_drLoc = 1. _d 0 /
437 & ( drF(K)*_hFacC(I,J,K,bi,bj) + drKp1 )
438 tLoc(I,J) = ( tLoc(I,J) * drF(K)*_hFacC(I,J,K,bi,bj)
439 & + theta(I,J,Kp1,bi,bj) *drKp1 )
440 & * recip_drLoc
441 sLoc(I,J) = ( sLoc(I,J) * drF(K)*_hFacC(I,J,K,bi,bj)
442 & + MAX(salt(I,J,Kp1,bi,bj), zeroRL) * drKp1 )
443 & * recip_drLoc
444
445 ! uLoc(I,J) = ( uLoc(I,J) * drF(K)*_hFacC(I,J,K,bi,bj)
446 ! & + drKp1 * recip_hFacC(I,J,Kp1,bi,bj) *
447 ! & ( uVel(I, J,Kp1,bi,bj) * _hFacW(I, J,Kp1,bi,bj)
448 ! & + uVel(I+1,J,Kp1,bi,bj) * _hFacW(I+1,J,Kp1,bi,bj) )
449 ! & ) * recip_drLoc
450 ! vLoc(I,J) = ( vLoc(I,J) * drF(K)*_hFacC(I,J,K,bi,bj)
451 ! & + drKp1 * recip_hFacC(I,J,Kp1,bi,bj) *
452 ! & ( vVel(I,J, Kp1,bi,bj) * _hFacS(I,J, Kp1,bi,bj)
453 ! & + vVel(I,J+1,Kp1,bi,bj) * _hFacS(I,J+1,Kp1,bi,bj) )
454 ! & ) * recip_drLoc
455 ENDIF
456 ENDDO
457 ENDDO
458 ENDIF
459
460
461 IF ( SHELFICEBoundaryLayer ) THEN
462 DO J = 1, sNy
463 DO I = 1, sNx
464 uLoc(I,J) =
465 & u_topdr(I,J,bi,bj) + u_topdr(I+1,J,bi,bj)
466 vLoc(I,J) =
467 & v_topdr(I,J,bi,bj) + v_topdr(I,J+1,bi,bj)
468 ENDDO
469 ENDDO
470 ENDIF
471
472 C-- turn potential temperature into in-situ temperature relative
473 C-- to the surface
474 DO J = 1, sNy
475 DO I = 1, sNx
476 #ifndef ALLOW_OPENAD
477 tLoc(I,J) = SW_TEMP(sLoc(I,J),tLoc(I,J),pLoc(I,J),zeroRL)
478 #else
479 CALL SW_TEMP(sLoc(I,J),tLoc(I,J),pLoc(I,J),zeroRL,tLoc(I,J))
480 #endif
481 ENDDO
482 ENDDO
483
484 #ifdef SHI_ALLOW_GAMMAFRICT
485 IF ( SHELFICEuseGammaFrict ) THEN
486 DO J = 1, sNy
487 DO I = 1, sNx
488 K = kTopC(I,J,bi,bj)
489 IF ( K .NE. 0 .AND. pLoc(I,J) .GT. 0. _d 0 ) THEN
490 ustarSq = shiCdrag * MAX( 1.D-6,
491 & 0.25 _d 0 *(uLoc(I,J)*uLoc(I,J)+vLoc(I,J)*vLoc(I,J)) )
492 ustar = SQRT(ustarSq)
493 #ifdef ALLOW_DIAGNOSTICS
494 uStarDiag(I,J,bi,bj) = ustar
495 #endif /* ALLOW_DIAGNOSTICS */
496 C instead of etastar = sqrt(1+zetaN*ustar./(f*Lo*Rc))
497 C etastar = 1. _d 0
498 C gammaTurbConst = 1. _d 0 / (2. _d 0 * shiZetaN*etastar)
499 C & - recip_shiKarman
500 IF ( fCori(I,J,bi,bj) .NE. 0. _d 0 ) THEN
501 gammaTurb = LOG( ustarSq * shiZetaN * etastar**2
502 & / ABS(fCori(I,J,bi,bj) * 5.0 _d 0 * shiKinVisc))
503 & * recip_shiKarman
504 & + gammaTurbConst
505 C Do we need to catch the unlikely case of very small ustar
506 C that can lead to negative gammaTurb?
507 C gammaTurb = MAX(0.D0, gammaTurb)
508 ELSE
509 gammaTurb = gammaTurbConst
510 ENDIF
511 shiTransCoeffT(i,j,bi,bj) = MAX( zeroRL,
512 & ustar/(gammaTurb + gammaTmoleT) )
513 shiTransCoeffS(i,j,bi,bj) = MAX( zeroRL,
514 & ustar/(gammaTurb + gammaTmoleS) )
515 ENDIF
516 ENDDO
517 ENDDO
518 ENDIF
519 #endif /* SHI_ALLOW_GAMMAFRICT */
520
521
522
523 c DO bj = myByLo(myThid), myByHi(myThid)
524 c DO bi = myBxLo(myThid), myBxHi(myThid)
525 DO j=1-OLy,sNy+OLy
526 DO i=1-OLx,sNx+OLx
527 IF (R_shelfice(i,j,bi,bj) .EQ. R_Grounding(i,j,bi,bj))THEN
528 shiTransCoeffT(i,j,bi,bj)=0
529 shiTransCoeffS (i,j,bi,bj)=0
530 ENDIF
531 ENDDO
532 ENDDO
533 c ENDDO
534 c ENDDO
535
536
537
538 #ifdef ALLOW_AUTODIFF_TAMC
539 # ifdef SHI_ALLOW_GAMMAFRICT
540 CADJ STORE shiTransCoeffS(:,:,bi,bj) = comlev1_bibj,
541 CADJ & key=ikey, byte=isbyte
542 CADJ STORE shiTransCoeffT(:,:,bi,bj) = comlev1_bibj,
543 CADJ & key=ikey, byte=isbyte
544 # endif /* SHI_ALLOW_GAMMAFRICT */
545 #endif /* ALLOW_AUTODIFF_TAMC */
546 #ifdef ALLOW_ISOMIP_TD
547 IF ( useISOMIPTD ) THEN
548 DO J = 1, sNy
549 DO I = 1, sNx
550 K = kTopC(I,J,bi,bj)
551 IF ( K .NE. 0 .AND. pLoc(I,J) .GT. 0. _d 0 ) THEN
552 C-- Calculate freezing temperature as a function of salinity and pressure
553 thetaFreeze =
554 & sLoc(I,J) * ( a0 + a1*sqrt(sLoc(I,J)) + a2*sLoc(I,J) )
555 & + b*pLoc(I,J) + c0
556 C-- Calculate the upward heat and fresh water fluxes
557 shelfIceHeatFlux(I,J,bi,bj) = maskC(I,J,K,bi,bj)
558 & * shiTransCoeffT(i,j,bi,bj)
559 & * ( tLoc(I,J) - thetaFreeze )
560 & * HeatCapacity_Cp*rUnit2mass
561 #ifdef ALLOW_SHIFWFLX_CONTROL
562 & - xx_shifwflx_loc(I,J,bi,bj)*SHELFICElatentHeat
563 #endif /* ALLOW_SHIFWFLX_CONTROL */
564 C upward heat flux into the shelf-ice implies basal melting,
565 C thus a downward (negative upward) fresh water flux (as a mass flux),
566 C and vice versa
567 shelfIceFreshWaterFlux(I,J,bi,bj) =
568 & - shelfIceHeatFlux(I,J,bi,bj)
569 & *recip_latentHeat
570 C-- compute surface tendencies
571 shelficeForcingT(i,j,bi,bj) =
572 & - shelfIceHeatFlux(I,J,bi,bj)
573 & *recip_Cp*mass2rUnit
574 & - cFac * shelfIceFreshWaterFlux(I,J,bi,bj)*mass2rUnit
575 & * ( thetaFreeze - tLoc(I,J) )
576 shelficeForcingS(i,j,bi,bj) =
577 & shelfIceFreshWaterFlux(I,J,bi,bj) * mass2rUnit
578 & * ( cFac*sLoc(I,J) + (1. _d 0-cFac)*convertFW2SaltLoc )
579 C-- stress at the ice/water interface is computed in separate
580 C routines that are called from mom_fluxform/mom_vecinv
581 ELSE
582 shelfIceHeatFlux (I,J,bi,bj) = 0. _d 0
583 shelfIceFreshWaterFlux(I,J,bi,bj) = 0. _d 0
584 shelficeForcingT (I,J,bi,bj) = 0. _d 0
585 shelficeForcingS (I,J,bi,bj) = 0. _d 0
586 ENDIF
587 ENDDO
588 ENDDO
589 ELSE
590 #else
591 IF ( .TRUE. ) THEN
592 #endif /* ALLOW_ISOMIP_TD */
593 C use BRIOS thermodynamics, following Hellmers PhD thesis:
594 C Hellmer, H., 1989, A two-dimensional model for the thermohaline
595 C circulation under an ice shelf, Reports on Polar Research, No. 60
596 C (in German).
597
598 DO J = 1, sNy
599 DO I = 1, sNx
600 K = kTopC(I,J,bi,bj)
601 IF ( K .NE. 0 .AND. pLoc(I,J) .GT. 0. _d 0 ) THEN
602 C heat flux into the ice shelf, default is diffusive flux
603 C (Holland and Jenkins, 1999, eq.21)
604 thetaFreeze = a0*sLoc(I,J)+c0+b*pLoc(I,J)
605 fwflxFac = 0. _d 0
606 IF ( tLoc(I,J) .GT. thetaFreeze ) fwflxFac = dFac
607 C a few abbreviations
608 eps1 = rUnit2mass*HeatCapacity_Cp
609 & *shiTransCoeffT(i,j,bi,bj)
610 eps2 = rUnit2mass*SHELFICElatentHeat
611 & *shiTransCoeffS(i,j,bi,bj)
612 eps5 = rUnit2mass*HeatCapacity_Cp
613 & *shiTransCoeffS(i,j,bi,bj)
614
615 C solve quadratic equation for salinity at shelfice-ocean interface
616 C note: this part of the code is not very intuitive as it involves
617 C many arbitrary abbreviations that were introduced to derive the
618 C correct form of the quadratic equation for salinity. The abbreviations
619 C only make sense in connection with my notes on this (M.Losch)
620 C
621 C eps3a was introduced as a constant variant of eps3 to avoid AD of
622 C code of typ (pLoc-const)/pLoc
623 eps3a = rhoShelfIce*SHELFICEheatCapacity_Cp
624 & * SHELFICEkappa * ( 1. _d 0 - dFac )
625 eps3 = eps3a/pLoc(I,J)
626 eps4 = b*pLoc(I,J) + c0
627 eps6 = eps4 - tLoc(I,J)
628 eps7 = eps4 - SHELFICEthetaSurface
629 eps8 = rUnit2mass*SHELFICEheatCapacity_Cp
630 & *shiTransCoeffS(i,j,bi,bj) * fwflxFac
631 aqe = a0 *(eps1+eps3-eps8)
632 recip_aqe = 0. _d 0
633 IF ( aqe .NE. 0. _d 0 ) recip_aqe = 0.5 _d 0/aqe
634 c bqe = eps1*eps6 + eps3*eps7 - eps2
635 bqe = eps1*eps6
636 & + eps3a*( b
637 & + ( c0 - SHELFICEthetaSurface )/pLoc(I,J) )
638 & - eps2
639 & + eps8*( a0*sLoc(I,J) - eps7 )
640 cqe = ( eps2 + eps8*eps7 )*sLoc(I,J)
641 discrim = bqe*bqe - 4. _d 0*aqe*cqe
642 #undef ALLOW_SHELFICE_DEBUG
643 #ifdef ALLOW_SHELFICE_DEBUG
644 IF ( discrim .LT. 0. _d 0 ) THEN
645 print *, 'ml-shelfice: discrim = ', discrim,aqe,bqe,cqe
646 print *, 'ml-shelfice: pLoc = ', pLoc(I,J)
647 print *, 'ml-shelfice: tLoc = ', tLoc(I,J)
648 print *, 'ml-shelfice: sLoc = ', sLoc(I,J)
649 print *, 'ml-shelfice: tsurface= ',
650 & SHELFICEthetaSurface
651 print *, 'ml-shelfice: eps1 = ', eps1
652 print *, 'ml-shelfice: eps2 = ', eps2
653 print *, 'ml-shelfice: eps3 = ', eps3
654 print *, 'ml-shelfice: eps4 = ', eps4
655 print *, 'ml-shelfice: eps5 = ', eps5
656 print *, 'ml-shelfice: eps6 = ', eps6
657 print *, 'ml-shelfice: eps7 = ', eps7
658 print *, 'ml-shelfice: eps8 = ', eps8
659 print *, 'ml-shelfice: rU2mass = ', rUnit2mass
660 print *, 'ml-shelfice: rhoIce = ', rhoShelfIce
661 print *, 'ml-shelfice: cFac = ', cFac
662 print *, 'ml-shelfice: Cp_W = ', HeatCapacity_Cp
663 print *, 'ml-shelfice: Cp_I = ',
664 & SHELFICEHeatCapacity_Cp
665 print *, 'ml-shelfice: gammaT = ',
666 & SHELFICEheatTransCoeff
667 print *, 'ml-shelfice: gammaS = ',
668 & SHELFICEsaltTransCoeff
669 print *, 'ml-shelfice: lat.heat= ',
670 & SHELFICElatentHeat
671 STOP 'ABNORMAL END in S/R SHELFICE_THERMODYNAMICS'
672 ENDIF
673 #endif /* ALLOW_SHELFICE_DEBUG */
674 saltFreeze = (- bqe - SQRT(discrim))*recip_aqe
675 IF ( saltFreeze .LT. 0. _d 0 )
676 & saltFreeze = (- bqe + SQRT(discrim))*recip_aqe
677 thetaFreeze = a0*saltFreeze + eps4
678 C-- upward fresh water flux due to melting (in kg/m^2/s)
679 cph change to identical form
680 cph freshWaterFlux = rUnit2mass
681 cph & * shiTransCoeffS(i,j,bi,bj)
682 cph & * ( saltFreeze - sLoc(I,J) ) / saltFreeze
683 freshWaterFlux = rUnit2mass
684 & * shiTransCoeffS(i,j,bi,bj)
685 & * ( 1. _d 0 - sLoc(I,J) / saltFreeze )
686 #ifdef ALLOW_SHIFWFLX_CONTROL
687 & + xx_shifwflx_loc(I,J,bi,bj)
688 #endif /* ALLOW_SHIFWFLX_CONTROL */
689 C-- Calculate the upward heat and fresh water fluxes;
690 C-- MITgcm sign conventions: downward (negative) fresh water flux
691 C-- implies melting and due to upward (positive) heat flux
692 shelfIceHeatFlux(I,J,bi,bj) =
693 & ( eps3
694 & - freshWaterFlux*SHELFICEheatCapacity_Cp*fwflxFac )
695 & * ( thetaFreeze - SHELFICEthetaSurface )
696 & - cFac*freshWaterFlux*( SHELFICElatentHeat
697 & - HeatCapacity_Cp*( thetaFreeze - rFac*tLoc(I,J) ) )
698 shelfIceFreshWaterFlux(I,J,bi,bj) = freshWaterFlux
699 C-- compute surface tendencies
700 shelficeForcingT(i,j,bi,bj) =
701 & ( shiTransCoeffT(i,j,bi,bj)
702 & - cFac*shelfIceFreshWaterFlux(I,J,bi,bj)*mass2rUnit )
703 & * ( thetaFreeze - tLoc(I,J) )
704 & - realFWfac*shelfIceFreshWaterFlux(I,J,bi,bj)*
705 & mass2rUnit*
706 & ( tLoc(I,J) - theta(I,J,K,bi,bj) )
707 shelficeForcingS(i,j,bi,bj) =
708 & ( shiTransCoeffS(i,j,bi,bj)
709 & - cFac*shelfIceFreshWaterFlux(I,J,bi,bj)*mass2rUnit )
710 & * ( saltFreeze - sLoc(I,J) )
711 & - realFWfac*shelfIceFreshWaterFlux(I,J,bi,bj)*
712 & mass2rUnit*
713 & ( sLoc(I,J) - salt(I,J,K,bi,bj) )
714 ELSE
715 shelfIceHeatFlux (I,J,bi,bj) = 0. _d 0
716 shelfIceFreshWaterFlux(I,J,bi,bj) = 0. _d 0
717 shelficeForcingT (I,J,bi,bj) = 0. _d 0
718 shelficeForcingS (I,J,bi,bj) = 0. _d 0
719 ENDIF
720 ENDDO
721 ENDDO
722 ENDIF
723 C endif (not) useISOMIPTD
724 ENDDO
725 ENDDO
726
727 IF (SHELFICEMassStepping) THEN
728 CALL SHELFICE_STEP_ICEMASS( myTime, myIter, myThid )
729 ENDIF
730
731 C-- Calculate new loading anomaly (in case the ice-shelf mass was updated)
732 #ifndef ALLOW_AUTODIFF
733
734
735 DO bj = myByLo(myThid), myByHi(myThid)
736 DO bi = myBxLo(myThid), myBxHi(myThid)
737 DO j = 1-OLy, sNy+OLy
738 DO i = 1-OLx, sNx+OLx
739 shelficeLoadAnomaly(i,j,bi,bj) = gravity
740 & *( shelficeMass(i,j,bi,bj) + rhoConst*Ro_surf(i,j,bi,bj) )
741 #ifdef ALLOW_STREAMICE
742
743 delZ = drF(kLowC(i,j,bi,bj))
744 massMin = -1*streamice_density_ocean_avg
745 & *(R_low(i,j,bi,bj)+hfacMin*delZ)
746 mass = shelficemass(i,j,bi,bj)
747
748 SHA=massMin/
749 & SQRT(.01+mass**2)
750
751 FACTOR1 = (1-sha)/2.
752 FACTOR2 = (1+sha)/2.
753 FACTOR3 = tanh((massMin - mass)*4./delZ)
754
755 mass_eff=
756 & (FACTOR1*FACTOR3 + FACTOR2)*mass
757
758 shelficeLoadAnomaly(i,j,bi,bj) = gravity
759 & *( mass_eff + rhoConst*Ro_surf(i,j,bi,bj) )
760
761 EFFMASS(i,j,bi,bj)=mass_eff
762
763 #endif /* ALLOW_STREAMICE */
764
765 ENDDO
766 ENDDO
767 ENDDO
768 ENDDO
769
770
771 #endif /* ndef ALLOW_AUTODIFF */
772
773 #ifdef ALLOW_DIAGNOSTICS
774 IF ( useDiagnostics ) THEN
775 CALL DIAGNOSTICS_FILL_RS(shelfIceFreshWaterFlux,'SHIfwFlx',
776 & 0,1,0,1,1,myThid)
777 CALL DIAGNOSTICS_FILL_RS(shelfIceHeatFlux, 'SHIhtFlx',
778 & 0,1,0,1,1,myThid)
779 C SHIForcT (Ice shelf forcing for theta [W/m2], >0 increases theta)
780 tmpFac = HeatCapacity_Cp*rUnit2mass
781 CALL DIAGNOSTICS_SCALE_FILL(shelficeForcingT,tmpFac,1,
782 & 'SHIForcT',0,1,0,1,1,myThid)
783 C SHIForcS (Ice shelf forcing for salt [g/m2/s], >0 increases salt)
784 tmpFac = rUnit2mass
785 CALL DIAGNOSTICS_SCALE_FILL(shelficeForcingS,tmpFac,1,
786 & 'SHIForcS',0,1,0,1,1,myThid)
787 C Transfer coefficients
788 CALL DIAGNOSTICS_FILL(shiTransCoeffT,'SHIgammT',
789 & 0,1,0,1,1,myThid)
790 CALL DIAGNOSTICS_FILL(shiTransCoeffS,'SHIgammS',
791 & 0,1,0,1,1,myThid)
792 C Friction velocity
793 #ifdef SHI_ALLOW_GAMMAFRICT
794 IF ( SHELFICEuseGammaFrict )
795 & CALL DIAGNOSTICS_FILL(uStarDiag,'SHIuStar',0,1,0,1,1,myThid)
796 #endif /* SHI_ALLOW_GAMMAFRICT */
797 ENDIF
798 CALL DIAGNOSTICS_FILL(R_shelfice,'SHI_Rshelfice',
799 & 0,1,0,1,1,myThid)
800 CALL DIAGNOSTICS_FILL(EFFMASS,'SHI_MassEff',
801 & 0,1,0,1,1,myThid)
802
803 #endif
804
805
806 #endif /* ALLOW_SHELFICE */
807 RETURN
808 END

  ViewVC Help
Powered by ViewVC 1.1.22