/[MITgcm]/MITgcm_contrib/dgoldberg/shelfice/shelfice_thermodynamics.F
ViewVC logotype

Contents of /MITgcm_contrib/dgoldberg/shelfice/shelfice_thermodynamics.F

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


Revision 1.3 - (show annotations) (download)
Tue Apr 21 11:07:10 2015 UTC (9 years ago) by dgoldberg
Branch: MAIN
CVS Tags: HEAD
Changes since 1.2: +28 -35 lines
revert to non-shelficeboundary layer behavior if hfacC(ktopC)>1

1 C $Header: /u/gcmpack/MITgcm/pkg/shelfice/shelfice_thermodynamics.F,v 1.44 2015/02/15 15:46:24 jmc 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
53 C !INPUT/OUTPUT PARAMETERS:
54 C === Routine arguments ===
55 C myIter :: iteration counter for this thread
56 C myTime :: time counter for this thread
57 C myThid :: thread number for this instance of the routine.
58 _RL myTime
59 INTEGER myIter
60 INTEGER myThid
61
62 #ifdef ALLOW_SHELFICE
63 C !LOCAL VARIABLES :
64 C === Local variables ===
65 C I,J,K,Kp1,bi,bj :: loop counters
66 C tLoc, sLoc, pLoc :: local in-situ temperature, salinity, pressure
67 C theta/saltFreeze :: temperature and salinity of water at the
68 C ice-ocean interface (at the freezing point)
69 C freshWaterFlux :: local variable for fresh water melt flux due
70 C to melting in kg/m^2/s
71 C (negative density x melt rate)
72 C convertFW2SaltLoc:: local copy of convertFW2Salt
73 C cFac :: 1 for conservative form, 0, otherwise
74 C rFac :: realFreshWaterFlux factor
75 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)
78 C fwflxFac :: only effective for dFac=1, 1 if we expect a melting
79 C fresh water flux, 0 otherwise
80 C auxiliary variables and abbreviations:
81 C a0, a1, a2, b, c0
82 C eps1, eps2, eps3, eps3a, eps4, eps5, eps6, eps7, eps8
83 C aqe, bqe, cqe, discrim, recip_aqe
84 C drKp1, recip_drLoc
85 INTEGER I,J,K,Kp1
86 INTEGER bi,bj
87 _RL tLoc(1:sNx,1:sNy)
88 _RL sLoc(1:sNx,1:sNy)
89 _RL pLoc(1:sNx,1:sNy)
90 _RL uLoc(1:sNx,1:sNy)
91 _RL vLoc(1:sNx,1:sNy)
92 _RL thetaFreeze, saltFreeze, recip_Cp
93 _RL freshWaterFlux, convertFW2SaltLoc
94 _RL a0, a1, a2, b, c0
95 _RL eps1, eps2, eps3, eps3a, eps4, eps5, eps6, eps7, eps8
96 _RL cFac, rFac, dFac, fwflxFac
97 _RL aqe, bqe, cqe, discrim, recip_aqe
98 _RL drKp1, recip_drLoc
99 _RL recip_latentHeat
100 _RL tmpFac
101
102 #ifdef SHI_ALLOW_GAMMAFRICT
103 _RL shiPr, shiSc, shiLo, recip_shiKarman, shiTwoThirds
104 _RL gammaTmoleT, gammaTmoleS, gammaTurb, gammaTurbConst
105 _RL ustar, ustarSq, etastar
106 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
111
112 #ifndef ALLOW_OPENAD
113 _RL SW_TEMP
114 EXTERNAL SW_TEMP
115 #endif
116
117 #ifdef ALLOW_SHIFWFLX_CONTROL
118 _RL xx_shifwflx_loc(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
119 #endif
120 CEOP
121 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
122
123 #ifdef SHI_ALLOW_GAMMAFRICT
124 #ifdef ALLOW_AUTODIFF
125 C re-initialize here again, curtesy to TAF
126 DO bj = myByLo(myThid), myByHi(myThid)
127 DO bi = myBxLo(myThid), myBxHi(myThid)
128 DO J = 1-OLy,sNy+OLy
129 DO I = 1-OLx,sNx+OLx
130 shiTransCoeffT(i,j,bi,bj) = SHELFICEheatTransCoeff
131 shiTransCoeffS(i,j,bi,bj) = SHELFICEsaltTransCoeff
132 ENDDO
133 ENDDO
134 ENDDO
135 ENDDO
136 #endif /* ALLOW_AUTODIFF */
137 IF ( SHELFICEuseGammaFrict ) THEN
138 C Implement friction velocity-dependent transfer coefficient
139 C of Holland and Jenkins, JPO, 1999
140 recip_shiKarman= 1. _d 0 / 0.4 _d 0
141 shiLo = 0. _d 0
142 shiPr = shiPrandtl**shiTwoThirds
143 shiSc = shiSchmidt**shiTwoThirds
144 cph shiPr = (viscArNr(1)/diffKrNrT(1))**shiTwoThirds
145 cph shiSc = (viscArNr(1)/diffKrNrS(1))**shiTwoThirds
146 gammaTmoleT = 12.5 _d 0 * shiPr - 6. _d 0
147 gammaTmoleS = 12.5 _d 0 * shiSc - 6. _d 0
148 C instead of etastar = sqrt(1+zetaN*ustar./(f*Lo*Rc))
149 etastar = 1. _d 0
150 gammaTurbConst = 1. _d 0 / (2. _d 0 * shiZetaN*etastar)
151 & - recip_shiKarman
152 #ifdef ALLOW_AUTODIFF
153 DO bj = myByLo(myThid), myByHi(myThid)
154 DO bi = myBxLo(myThid), myBxHi(myThid)
155 DO J = 1-OLy,sNy+OLy
156 DO I = 1-OLx,sNx+OLx
157 shiTransCoeffT(i,j,bi,bj) = 0. _d 0
158 shiTransCoeffS(i,j,bi,bj) = 0. _d 0
159 ENDDO
160 ENDDO
161 ENDDO
162 ENDDO
163 #endif /* ALLOW_AUTODIFF */
164 ENDIF
165 #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)?
171 recip_Cp = 1. _d 0 / HeatCapacity_Cp
172 cFac = 0. _d 0
173 IF ( SHELFICEconserve ) cFac = 1. _d 0
174 C with "real fresh water flux" (affecting ETAN),
175 C there is more to modify
176 rFac = 1. _d 0
177 IF ( SHELFICEconserve .AND. useRealFreshWaterFlux ) rFac = 0. _d 0
178 C heat flux into the ice shelf, default is diffusive flux
179 C (Holland and Jenkins, 1999, eq.21)
180 dFac = 0. _d 0
181 IF ( SHELFICEadvDiffHeatFlux ) dFac = 1. _d 0
182 fwflxFac = 0. _d 0
183 C linear dependence of freezing point on salinity
184 a0 = -0.0575 _d 0
185 a1 = 0.0 _d -0
186 a2 = 0.0 _d -0
187 c0 = 0.0901 _d 0
188 b = -7.61 _d -4
189 #ifdef ALLOW_ISOMIP_TD
190 IF ( useISOMIPTD ) THEN
191 C non-linear dependence of freezing point on salinity
192 a0 = -0.0575 _d 0
193 a1 = 1.710523 _d -3
194 a2 = -2.154996 _d -4
195 b = -7.53 _d -4
196 c0 = 0. _d 0
197 ENDIF
198 convertFW2SaltLoc = convertFW2Salt
199 C hardcoding this value here is OK because it only applies to ISOMIP
200 C where this value is part of the protocol
201 IF ( convertFW2SaltLoc .EQ. -1. ) convertFW2SaltLoc = 33.4 _d 0
202 #endif /* ALLOW_ISOMIP_TD */
203
204 DO bj = myByLo(myThid), myByHi(myThid)
205 DO bi = myBxLo(myThid), myBxHi(myThid)
206 DO J = 1-OLy,sNy+OLy
207 DO I = 1-OLx,sNx+OLx
208 shelfIceHeatFlux (I,J,bi,bj) = 0. _d 0
209 shelfIceFreshWaterFlux(I,J,bi,bj) = 0. _d 0
210 shelficeForcingT (I,J,bi,bj) = 0. _d 0
211 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
216 ENDDO
217 ENDDO
218 ENDDO
219 #ifdef ALLOW_SHIFWFLX_CONTROL
220 DO bj = myByLo(myThid), myByHi(myThid)
221 DO bi = myBxLo(myThid), myBxHi(myThid)
222 DO J = 1-OLy,sNy+OLy
223 DO I = 1-OLx,sNx+OLx
224 xx_shifwflx_loc(I,J,bi,bj) = 0. _d 0
225 ENDDO
226 ENDDO
227 ENDDO
228 ENDDO
229 #ifdef ALLOW_CTRL
230 if (useCTRL) CALL CTRL_GET_GEN (
231 & xx_shifwflx_file, xx_shifwflxstartdate, xx_shifwflxperiod,
232 & maskSHI, xx_shifwflx_loc, xx_shifwflx0, xx_shifwflx1,
233 & xx_shifwflx_dummy,
234 & xx_shifwflx_remo_intercept, xx_shifwflx_remo_slope,
235 & wshifwflx,
236 & myTime, myIter, myThid )
237 #endif
238 #endif /* ALLOW_SHIFWFLX_CONTROL */
239 DO bj = myByLo(myThid), myByHi(myThid)
240 DO bi = myBxLo(myThid), myBxHi(myThid)
241 #ifdef ALLOW_AUTODIFF_TAMC
242 # ifdef SHI_ALLOW_GAMMAFRICT
243 act1 = bi - myBxLo(myThid)
244 max1 = myBxHi(myThid) - myBxLo(myThid) + 1
245 act2 = bj - myByLo(myThid)
246 max2 = myByHi(myThid) - myByLo(myThid) + 1
247 act3 = myThid - 1
248 max3 = nTx*nTy
249 act4 = ikey_dynamics - 1
250 ikey = (act1 + 1) + act2*max1
251 & + act3*max1*max2
252 & + act4*max1*max2*max3
253 # endif /* SHI_ALLOW_GAMMAFRICT */
254 #endif /* ALLOW_AUTODIFF_TAMC */
255 DO J = 1, sNy
256 DO I = 1, sNx
257 C-- make local copies of temperature, salinity and depth (pressure in deci-bar)
258 C-- underneath the ice
259 K = MAX(1,kTopC(I,J,bi,bj))
260 pLoc(I,J) = ABS(R_shelfIce(I,J,bi,bj))
261 c pLoc(I,J) = shelficeMass(I,J,bi,bj)*gravity*1. _d -4
262 tLoc(I,J) = theta(I,J,K,bi,bj)
263 sLoc(I,J) = MAX(salt(I,J,K,bi,bj), zeroRL)
264 uLoc(I,J) = recip_hFacC(I,J,K,bi,bj) *
265 & ( uVel(I, J,K,bi,bj) * _hFacW(I, J,K,bi,bj)
266 & + uVel(I+1,J,K,bi,bj) * _hFacW(I+1,J,K,bi,bj) )
267 vLoc(I,J) = recip_hFacC(I,J,K,bi,bj) *
268 & ( vVel(I,J, K,bi,bj) * _hFacS(I,J, K,bi,bj)
269 & + vVel(I,J+1,K,bi,bj) * _hFacS(I,J+1,K,bi,bj) )
270 ENDDO
271 ENDDO
272 IF ( SHELFICEBoundaryLayer ) THEN
273 C-- average over boundary layer width
274 DO J = 1, sNy
275 DO I = 1, sNx
276 K = kTopC(I,J,bi,bj)
277 IF ( K .NE. 0 .AND. K .LT. Nr ) THEN
278 Kp1 = MIN(Nr,K+1)
279 C-- overlap into lower cell
280 drKp1 = drF(K)*( 1. _d 0 - _hFacC(I,J,K,bi,bj) )
281 C-- lower cell may not be as thick as required
282 drKp1 = MIN( drKp1, drF(Kp1) * _hFacC(I,J,Kp1,bi,bj) )
283 drKp1 = MAX( drKp1, 0. _d 0 )
284 recip_drLoc = 1. _d 0 /
285 & ( drF(K)*_hFacC(I,J,K,bi,bj) + drKp1 )
286 tLoc(I,J) = ( tLoc(I,J) * drF(K)*_hFacC(I,J,K,bi,bj)
287 & + theta(I,J,Kp1,bi,bj) *drKp1 )
288 & * recip_drLoc
289 sLoc(I,J) = ( sLoc(I,J) * drF(K)*_hFacC(I,J,K,bi,bj)
290 & + MAX(salt(I,J,Kp1,bi,bj), zeroRL) * drKp1 )
291 & * recip_drLoc
292 uLoc(I,J) = ( uLoc(I,J) * drF(K)*_hFacC(I,J,K,bi,bj)
293 & + drKp1 * recip_hFacC(I,J,Kp1,bi,bj) *
294 & ( uVel(I, J,Kp1,bi,bj) * _hFacW(I, J,Kp1,bi,bj)
295 & + uVel(I+1,J,Kp1,bi,bj) * _hFacW(I+1,J,Kp1,bi,bj) )
296 & ) * recip_drLoc
297 vLoc(I,J) = ( vLoc(I,J) * drF(K)*_hFacC(I,J,K,bi,bj)
298 & + drKp1 * recip_hFacC(I,J,Kp1,bi,bj) *
299 & ( vVel(I,J, Kp1,bi,bj) * _hFacS(I,J, Kp1,bi,bj)
300 & + vVel(I,J+1,Kp1,bi,bj) * _hFacS(I,J+1,Kp1,bi,bj) )
301 & ) * recip_drLoc
302 ENDIF
303 ENDDO
304 ENDDO
305 ENDIF
306
307 C-- turn potential temperature into in-situ temperature relative
308 C-- to the surface
309 DO J = 1, sNy
310 DO I = 1, sNx
311 #ifndef ALLOW_OPENAD
312 tLoc(I,J) = SW_TEMP(sLoc(I,J),tLoc(I,J),pLoc(I,J),zeroRL)
313 #else
314 CALL SW_TEMP(sLoc(I,J),tLoc(I,J),pLoc(I,J),zeroRL,tLoc(I,J))
315 #endif
316 ENDDO
317 ENDDO
318
319 #ifdef SHI_ALLOW_GAMMAFRICT
320 IF ( SHELFICEuseGammaFrict ) THEN
321 DO J = 1, sNy
322 DO I = 1, sNx
323 K = kTopC(I,J,bi,bj)
324 IF ( K .NE. 0 .AND. pLoc(I,J) .GT. 0. _d 0 ) THEN
325 ustarSq = shiCdrag * MAX( 1.D-6,
326 & 0.25 _d 0 *(uLoc(I,J)*uLoc(I,J)+vLoc(I,J)*vLoc(I,J)) )
327 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))
332 C etastar = 1. _d 0
333 C gammaTurbConst = 1. _d 0 / (2. _d 0 * shiZetaN*etastar)
334 C & - recip_shiKarman
335 IF ( fCori(I,J,bi,bj) .NE. 0. _d 0 ) THEN
336 gammaTurb = LOG( ustarSq * shiZetaN * etastar**2
337 & / ABS(fCori(I,J,bi,bj) * 5.0 _d 0 * shiKinVisc))
338 & * recip_shiKarman
339 & + gammaTurbConst
340 C Do we need to catch the unlikely case of very small ustar
341 C that can lead to negative gammaTurb?
342 C gammaTurb = MAX(0.D0, gammaTurb)
343 ELSE
344 gammaTurb = gammaTurbConst
345 ENDIF
346 shiTransCoeffT(i,j,bi,bj) = MAX( zeroRL,
347 & ustar/(gammaTurb + gammaTmoleT) )
348 shiTransCoeffS(i,j,bi,bj) = MAX( zeroRL,
349 & ustar/(gammaTurb + gammaTmoleS) )
350 ENDIF
351 ENDDO
352 ENDDO
353 ENDIF
354 #endif /* SHI_ALLOW_GAMMAFRICT */
355
356 #ifdef ALLOW_AUTODIFF_TAMC
357 # ifdef SHI_ALLOW_GAMMAFRICT
358 CADJ STORE shiTransCoeffS(:,:,bi,bj) = comlev1_bibj,
359 CADJ & key=ikey, byte=isbyte
360 CADJ STORE shiTransCoeffT(:,:,bi,bj) = comlev1_bibj,
361 CADJ & key=ikey, byte=isbyte
362 # endif /* SHI_ALLOW_GAMMAFRICT */
363 #endif /* ALLOW_AUTODIFF_TAMC */
364 #ifdef ALLOW_ISOMIP_TD
365 IF ( useISOMIPTD ) THEN
366 DO J = 1, sNy
367 DO I = 1, sNx
368 K = kTopC(I,J,bi,bj)
369 IF ( K .NE. 0 .AND. pLoc(I,J) .GT. 0. _d 0 ) THEN
370 C-- Calculate freezing temperature as a function of salinity and pressure
371 thetaFreeze =
372 & sLoc(I,J) * ( a0 + a1*sqrt(sLoc(I,J)) + a2*sLoc(I,J) )
373 & + b*pLoc(I,J) + c0
374 C-- Calculate the upward heat and fresh water fluxes
375 shelfIceHeatFlux(I,J,bi,bj) = maskC(I,J,K,bi,bj)
376 & * shiTransCoeffT(i,j,bi,bj)
377 & * ( tLoc(I,J) - thetaFreeze )
378 & * HeatCapacity_Cp*rUnit2mass
379 #ifdef ALLOW_SHIFWFLX_CONTROL
380 & - xx_shifwflx_loc(I,J,bi,bj)*SHELFICElatentHeat
381 #endif /* ALLOW_SHIFWFLX_CONTROL */
382 C upward heat flux into the shelf-ice implies basal melting,
383 C thus a downward (negative upward) fresh water flux (as a mass flux),
384 C and vice versa
385 shelfIceFreshWaterFlux(I,J,bi,bj) =
386 & - shelfIceHeatFlux(I,J,bi,bj)
387 & *recip_latentHeat
388 C-- compute surface tendencies
389 shelficeForcingT(i,j,bi,bj) =
390 & - shelfIceHeatFlux(I,J,bi,bj)
391 & *recip_Cp*mass2rUnit
392 & - cFac * shelfIceFreshWaterFlux(I,J,bi,bj)*mass2rUnit
393 & * ( thetaFreeze - tLoc(I,J) )
394 shelficeForcingS(i,j,bi,bj) =
395 & shelfIceFreshWaterFlux(I,J,bi,bj) * mass2rUnit
396 & * ( cFac*sLoc(I,J) + (1. _d 0-cFac)*convertFW2SaltLoc )
397 C-- stress at the ice/water interface is computed in separate
398 C routines that are called from mom_fluxform/mom_vecinv
399 ELSE
400 shelfIceHeatFlux (I,J,bi,bj) = 0. _d 0
401 shelfIceFreshWaterFlux(I,J,bi,bj) = 0. _d 0
402 shelficeForcingT (I,J,bi,bj) = 0. _d 0
403 shelficeForcingS (I,J,bi,bj) = 0. _d 0
404 ENDIF
405 ENDDO
406 ENDDO
407 ELSE
408 #else
409 IF ( .TRUE. ) THEN
410 #endif /* ALLOW_ISOMIP_TD */
411 C use BRIOS thermodynamics, following Hellmers PhD thesis:
412 C Hellmer, H., 1989, A two-dimensional model for the thermohaline
413 C circulation under an ice shelf, Reports on Polar Research, No. 60
414 C (in German).
415
416 DO J = 1, sNy
417 DO I = 1, sNx
418 K = kTopC(I,J,bi,bj)
419 IF ( K .NE. 0 .AND. pLoc(I,J) .GT. 0. _d 0 ) THEN
420 C heat flux into the ice shelf, default is diffusive flux
421 C (Holland and Jenkins, 1999, eq.21)
422 thetaFreeze = a0*sLoc(I,J)+c0+b*pLoc(I,J)
423 fwflxFac = 0. _d 0
424 IF ( tLoc(I,J) .GT. thetaFreeze ) fwflxFac = dFac
425 C a few abbreviations
426 eps1 = rUnit2mass*HeatCapacity_Cp
427 & *shiTransCoeffT(i,j,bi,bj)
428 eps2 = rUnit2mass*SHELFICElatentHeat
429 & *shiTransCoeffS(i,j,bi,bj)
430 eps5 = rUnit2mass*HeatCapacity_Cp
431 & *shiTransCoeffS(i,j,bi,bj)
432
433 C solve quadratic equation for salinity at shelfice-ocean interface
434 C note: this part of the code is not very intuitive as it involves
435 C many arbitrary abbreviations that were introduced to derive the
436 C correct form of the quadratic equation for salinity. The abbreviations
437 C only make sense in connection with my notes on this (M.Losch)
438 C
439 C eps3a was introduced as a constant variant of eps3 to avoid AD of
440 C code of typ (pLoc-const)/pLoc
441 eps3a = rhoShelfIce*SHELFICEheatCapacity_Cp
442 & * SHELFICEkappa * ( 1. _d 0 - dFac )
443 eps3 = eps3a/pLoc(I,J)
444 eps4 = b*pLoc(I,J) + c0
445 eps6 = eps4 - tLoc(I,J)
446 eps7 = eps4 - SHELFICEthetaSurface
447 eps8 = rUnit2mass*SHELFICEheatCapacity_Cp
448 & *shiTransCoeffS(i,j,bi,bj) * fwflxFac
449 aqe = a0 *(eps1+eps3-eps8)
450 recip_aqe = 0. _d 0
451 IF ( aqe .NE. 0. _d 0 ) recip_aqe = 0.5 _d 0/aqe
452 c bqe = eps1*eps6 + eps3*eps7 - eps2
453 bqe = eps1*eps6
454 & + eps3a*( b
455 & + ( c0 - SHELFICEthetaSurface )/pLoc(I,J) )
456 & - eps2
457 & + eps8*( a0*sLoc(I,J) - eps7 )
458 cqe = ( eps2 + eps8*eps7 )*sLoc(I,J)
459 discrim = bqe*bqe - 4. _d 0*aqe*cqe
460 #undef ALLOW_SHELFICE_DEBUG
461 #ifdef ALLOW_SHELFICE_DEBUG
462 IF ( discrim .LT. 0. _d 0 ) THEN
463 print *, 'ml-shelfice: discrim = ', discrim,aqe,bqe,cqe
464 print *, 'ml-shelfice: pLoc = ', pLoc(I,J)
465 print *, 'ml-shelfice: tLoc = ', tLoc(I,J)
466 print *, 'ml-shelfice: sLoc = ', sLoc(I,J)
467 print *, 'ml-shelfice: tsurface= ',
468 & SHELFICEthetaSurface
469 print *, 'ml-shelfice: eps1 = ', eps1
470 print *, 'ml-shelfice: eps2 = ', eps2
471 print *, 'ml-shelfice: eps3 = ', eps3
472 print *, 'ml-shelfice: eps4 = ', eps4
473 print *, 'ml-shelfice: eps5 = ', eps5
474 print *, 'ml-shelfice: eps6 = ', eps6
475 print *, 'ml-shelfice: eps7 = ', eps7
476 print *, 'ml-shelfice: eps8 = ', eps8
477 print *, 'ml-shelfice: rU2mass = ', rUnit2mass
478 print *, 'ml-shelfice: rhoIce = ', rhoShelfIce
479 print *, 'ml-shelfice: cFac = ', cFac
480 print *, 'ml-shelfice: Cp_W = ', HeatCapacity_Cp
481 print *, 'ml-shelfice: Cp_I = ',
482 & SHELFICEHeatCapacity_Cp
483 print *, 'ml-shelfice: gammaT = ',
484 & SHELFICEheatTransCoeff
485 print *, 'ml-shelfice: gammaS = ',
486 & SHELFICEsaltTransCoeff
487 print *, 'ml-shelfice: lat.heat= ',
488 & SHELFICElatentHeat
489 STOP 'ABNORMAL END in S/R SHELFICE_THERMODYNAMICS'
490 ENDIF
491 #endif /* ALLOW_SHELFICE_DEBUG */
492 saltFreeze = (- bqe - SQRT(discrim))*recip_aqe
493 IF ( saltFreeze .LT. 0. _d 0 )
494 & saltFreeze = (- bqe + SQRT(discrim))*recip_aqe
495 thetaFreeze = a0*saltFreeze + eps4
496 C-- upward fresh water flux due to melting (in kg/m^2/s)
497 cph change to identical form
498 cph freshWaterFlux = rUnit2mass
499 cph & * shiTransCoeffS(i,j,bi,bj)
500 cph & * ( saltFreeze - sLoc(I,J) ) / saltFreeze
501 freshWaterFlux = rUnit2mass
502 & * shiTransCoeffS(i,j,bi,bj)
503 & * ( 1. _d 0 - sLoc(I,J) / saltFreeze )
504 #ifdef ALLOW_SHIFWFLX_CONTROL
505 & + xx_shifwflx_loc(I,J,bi,bj)
506 #endif /* ALLOW_SHIFWFLX_CONTROL */
507 C-- Calculate the upward heat and fresh water fluxes;
508 C-- MITgcm sign conventions: downward (negative) fresh water flux
509 C-- implies melting and due to upward (positive) heat flux
510 shelfIceHeatFlux(I,J,bi,bj) =
511 & ( eps3
512 & - freshWaterFlux*SHELFICEheatCapacity_Cp*fwflxFac )
513 & * ( thetaFreeze - SHELFICEthetaSurface )
514 & - cFac*freshWaterFlux*( SHELFICElatentHeat
515 & - HeatCapacity_Cp*( thetaFreeze - rFac*tLoc(I,J) ) )
516 shelfIceFreshWaterFlux(I,J,bi,bj) = freshWaterFlux
517 C-- compute surface tendencies
518 shelficeForcingT(i,j,bi,bj) =
519 & ( shiTransCoeffT(i,j,bi,bj)
520 & - cFac*shelfIceFreshWaterFlux(I,J,bi,bj)*mass2rUnit )
521 & * ( thetaFreeze - tLoc(I,J) )
522 shelficeForcingS(i,j,bi,bj) =
523 & ( shiTransCoeffS(i,j,bi,bj)
524 & - cFac*shelfIceFreshWaterFlux(I,J,bi,bj)*mass2rUnit )
525 & * ( saltFreeze - sLoc(I,J) )
526 ELSE
527 shelfIceHeatFlux (I,J,bi,bj) = 0. _d 0
528 shelfIceFreshWaterFlux(I,J,bi,bj) = 0. _d 0
529 shelficeForcingT (I,J,bi,bj) = 0. _d 0
530 shelficeForcingS (I,J,bi,bj) = 0. _d 0
531 ENDIF
532 ENDDO
533 ENDDO
534 ENDIF
535 C endif (not) useISOMIPTD
536 ENDDO
537 ENDDO
538
539 IF (SHELFICEMassStepping) THEN
540 CALL SHELFICE_STEP_ICEMASS( myTime, myIter, myThid )
541 ENDIF
542
543 C-- Calculate new loading anomaly (in case the ice-shelf mass was updated)
544 #ifndef ALLOW_AUTODIFF
545 c IF ( SHELFICEloadAnomalyFile .EQ. ' ' ) THEN
546 DO bj = myByLo(myThid), myByHi(myThid)
547 DO bi = myBxLo(myThid), myBxHi(myThid)
548 DO j = 1-OLy, sNy+OLy
549 DO i = 1-OLx, sNx+OLx
550 shelficeLoadAnomaly(i,j,bi,bj) = gravity
551 & *( shelficeMass(i,j,bi,bj) + rhoConst*Ro_surf(i,j,bi,bj) )
552 ENDDO
553 ENDDO
554 ENDDO
555 ENDDO
556 c ENDIF
557 #endif /* ndef ALLOW_AUTODIFF */
558
559 #ifdef ALLOW_DIAGNOSTICS
560 IF ( useDiagnostics ) THEN
561 CALL DIAGNOSTICS_FILL_RS(shelfIceFreshWaterFlux,'SHIfwFlx',
562 & 0,1,0,1,1,myThid)
563 CALL DIAGNOSTICS_FILL_RS(shelfIceHeatFlux, 'SHIhtFlx',
564 & 0,1,0,1,1,myThid)
565 C SHIForcT (Ice shelf forcing for theta [W/m2], >0 increases theta)
566 tmpFac = HeatCapacity_Cp*rUnit2mass
567 CALL DIAGNOSTICS_SCALE_FILL(shelficeForcingT,tmpFac,1,
568 & 'SHIForcT',0,1,0,1,1,myThid)
569 C SHIForcS (Ice shelf forcing for salt [g/m2/s], >0 increases salt)
570 tmpFac = rUnit2mass
571 CALL DIAGNOSTICS_SCALE_FILL(shelficeForcingS,tmpFac,1,
572 & 'SHIForcS',0,1,0,1,1,myThid)
573 C Transfer coefficients
574 CALL DIAGNOSTICS_FILL(shiTransCoeffT,'SHIgammT',
575 & 0,1,0,1,1,myThid)
576 CALL DIAGNOSTICS_FILL(shiTransCoeffS,'SHIgammS',
577 & 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
584 #endif /* ALLOW_DIAGNOSTICS */
585
586 #endif /* ALLOW_SHELFICE */
587 RETURN
588 END

  ViewVC Help
Powered by ViewVC 1.1.22