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

Annotation of /MITgcm_contrib/verification_other/shelfice_remeshing/code/shelfice_thermodynamics.F

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


Revision 1.3 - (hide annotations) (download)
Fri Jan 22 16:09:34 2016 UTC (9 years, 5 months ago) by dgoldberg
Branch: MAIN
Changes since 1.2: +30 -63 lines
New verification now includes grounding line

1 dgoldberg 1.3 C $Header: /u/gcmpack/MITgcm_contrib/shelfice_remeshing/CLEAN/code/shelfice_thermodynamics.F,v 1.5 2016/01/22 10:26:50 dgoldberg Exp $
2 dgoldberg 1.1 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 dgoldberg 1.3 _RL massMin, mass, mass_eff, DELZ
107     _RL SHA,FACTOR1,FACTOR2,FACTOR3
108     _RL GMSL,ETACOUNT
109 dgoldberg 1.1 #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 dgoldberg 1.2 DO bj = myByLo(myThid), myByHi(myThid)
736     DO bi = myBxLo(myThid), myBxHi(myThid)
737 dgoldberg 1.3 DO j = 1-OLy, sNy+OLy
738 dgoldberg 1.2 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 dgoldberg 1.3 #ifdef ALLOW_STREAMICE
742 dgoldberg 1.1
743 dgoldberg 1.3 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 dgoldberg 1.2
748 dgoldberg 1.3 SHA=massMin/
749     & SQRT(.01+mass**2)
750 dgoldberg 1.1
751 dgoldberg 1.3 FACTOR1 = (1-sha)/2.
752     FACTOR2 = (1+sha)/2.
753     FACTOR3 = tanh((massMin - mass)*4./delZ)
754 dgoldberg 1.1
755 dgoldberg 1.3 mass_eff=
756     & (FACTOR1*FACTOR3 + FACTOR2)*mass
757 dgoldberg 1.1
758 dgoldberg 1.3 shelficeLoadAnomaly(i,j,bi,bj) = gravity
759     & *( mass_eff + rhoConst*Ro_surf(i,j,bi,bj) )
760 dgoldberg 1.1
761 dgoldberg 1.3 EFFMASS(i,j,bi,bj)=mass_eff
762 dgoldberg 1.1
763 dgoldberg 1.3 #endif /* ALLOW_STREAMICE */
764 dgoldberg 1.1
765 dgoldberg 1.3 ENDDO
766     ENDDO
767     ENDDO
768     ENDDO
769 dgoldberg 1.1
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 dgoldberg 1.3 CALL DIAGNOSTICS_FILL(EFFMASS,'SHI_MassEff',
801     & 0,1,0,1,1,myThid)
802    
803     #endif
804    
805 dgoldberg 1.1
806     #endif /* ALLOW_SHELFICE */
807     RETURN
808     END

  ViewVC Help
Powered by ViewVC 1.1.22