/[MITgcm]/MITgcm_contrib/ksnow/press_release/code_expt/shelfice_thermodynamics.F
ViewVC logotype

Contents of /MITgcm_contrib/ksnow/press_release/code_expt/shelfice_thermodynamics.F

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


Revision 1.6 - (show annotations) (download)
Sat Mar 4 11:57:41 2017 UTC (9 years, 6 months ago) by dgoldberg
Branch: MAIN
CVS Tags: HEAD
Changes since 1.5: +7 -7 lines
further changes

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

  ViewVC Help
Powered by ViewVC 1.1.22