1 |
dcarroll |
1.1 |
#include "SHELFICE_OPTIONS.h" |
2 |
|
|
#ifdef ALLOW_AUTODIFF |
3 |
|
|
# include "AUTODIFF_OPTIONS.h" |
4 |
|
|
#endif |
5 |
|
|
#ifdef ALLOW_CTRL |
6 |
|
|
# include "CTRL_OPTIONS.h" |
7 |
|
|
#endif |
8 |
|
|
|
9 |
|
|
CBOP |
10 |
|
|
C !ROUTINE: SHELFICE_SOLVE4FLUXES |
11 |
|
|
C !INTERFACE: |
12 |
|
|
SUBROUTINE SHELFICE_SOLVE4FLUXES( |
13 |
|
|
I tLoc, sLoc, pLoc, |
14 |
|
|
I gammaT, gammaS, |
15 |
|
|
I iceConductionDistance, thetaIceConduction, |
16 |
|
|
O heatFlux, fwFlux, |
17 |
|
|
O forcingT, forcingS, |
18 |
|
|
I bi, bj, myTime, myIter, myThid ) |
19 |
|
|
|
20 |
|
|
C !DESCRIPTION: \bv |
21 |
|
|
C *==========================================================* |
22 |
|
|
C | SUBROUTINE SOLVE4FLUXES |
23 |
|
|
C | o Calculate |
24 |
|
|
C *==========================================================* |
25 |
|
|
C \ev |
26 |
|
|
|
27 |
|
|
C !USES: |
28 |
|
|
IMPLICIT NONE |
29 |
|
|
|
30 |
|
|
C === Global variables === |
31 |
|
|
#include "SIZE.h" |
32 |
|
|
#include "EEPARAMS.h" |
33 |
|
|
#include "PARAMS.h" |
34 |
|
|
#include "GRID.h" |
35 |
|
|
#include "DYNVARS.h" |
36 |
|
|
#include "FFIELDS.h" |
37 |
|
|
#include "SHELFICE.h" |
38 |
|
|
#include "SHELFICE_COST.h" |
39 |
|
|
#ifdef ALLOW_AUTODIFF |
40 |
|
|
# include "CTRL_SIZE.h" |
41 |
|
|
# include "ctrl.h" |
42 |
|
|
# include "ctrl_dummy.h" |
43 |
|
|
#endif /* ALLOW_AUTODIFF */ |
44 |
|
|
#ifdef ALLOW_AUTODIFF_TAMC |
45 |
|
|
# ifdef SHI_ALLOW_GAMMAFRICT |
46 |
|
|
# include "tamc.h" |
47 |
|
|
# include "tamc_keys.h" |
48 |
|
|
# endif /* SHI_ALLOW_GAMMAFRICT */ |
49 |
|
|
#endif /* ALLOW_AUTODIFF_TAMC */ |
50 |
|
|
|
51 |
|
|
C !INPUT PARAMETERS: |
52 |
|
|
C tLoc :: |
53 |
|
|
C sLoc :: |
54 |
|
|
C pLoc :: |
55 |
|
|
C insitutLoc :: |
56 |
|
|
C gammaT :: |
57 |
|
|
C gammaS :: |
58 |
|
|
C bi,bj :: tile indices |
59 |
|
|
C myTime :: current time in simulation |
60 |
|
|
C myIter :: iteration number in simulation |
61 |
|
|
C myThid :: my Thread Id number |
62 |
|
|
|
63 |
|
|
C !OUTPUT PARAMETERS: |
64 |
|
|
C heatFlux :: |
65 |
|
|
C fwFlux :: |
66 |
|
|
C forcingT :: |
67 |
|
|
C forcingS :: |
68 |
|
|
C---------- |
69 |
|
|
|
70 |
|
|
_RL tLoc, sLoc, pLoc, insitutLoc |
71 |
|
|
_RL gammaT, gammaS |
72 |
|
|
_RL iceConductionDistance, thetaIceConduction |
73 |
|
|
_RL heatFlux, fwFlux, forcingS, forcingT |
74 |
|
|
INTEGER i, j, bi, bj |
75 |
|
|
_RL myTime |
76 |
|
|
INTEGER myIter, myThid |
77 |
|
|
character*200 msgBuf |
78 |
|
|
CEOP |
79 |
|
|
|
80 |
|
|
#ifndef ALLOW_OPENAD |
81 |
|
|
_RL SW_TEMP |
82 |
|
|
EXTERNAL SW_TEMP |
83 |
|
|
#endif |
84 |
|
|
|
85 |
|
|
|
86 |
|
|
C !LOCAL VARIABLES: |
87 |
|
|
C === Local variables === |
88 |
|
|
_RL thetaFreeze, saltFreeze |
89 |
|
|
_RL eps1, eps2, eps3, eps4, eps5, eps6, eps7, eps8 |
90 |
|
|
_RL aqe, bqe, cqe, discrim, recip_aqe |
91 |
|
|
_RL a0, a1, a2, b0, c0 |
92 |
|
|
_RL w_I |
93 |
|
|
|
94 |
|
|
C === Useful Units === |
95 |
|
|
C-- gammaT, m s^-1 |
96 |
|
|
C-- gammaS, m s^-1 |
97 |
|
|
C-- rUnit2mass (rhoConst), kg m^-3 |
98 |
|
|
C-- mass2rUnit (recip_rhoConst), m^3 kg^-1 |
99 |
|
|
C-- eps3, W K^-1 m^-2 |
100 |
|
|
C-- fwFlux, kg m^-2 s^-1 |
101 |
|
|
C-- heatFlux, kg m^-2 s^-1 |
102 |
|
|
C-- forcing T, K m/s |
103 |
|
|
C-- forcing S, psu m/s |
104 |
|
|
C-- SHELFICEkappa, m^2/s |
105 |
|
|
|
106 |
|
|
C-- eps1, W K^-1 m^-2 : kg/m^3 * J/kg/K * m/s |
107 |
|
|
C-- eps2, W m^-2 : kg/m^3 * J/kg * m/s |
108 |
|
|
C-- eps3, W K^-1 m^-2 : kg m^-3 * J kg^-1 K^-1 * m^2 s^-1 * m^-1 |
109 |
|
|
|
110 |
|
|
C-- fwFlux : fresh water flux due to melting (kg m^-2 s^-1) |
111 |
|
|
|
112 |
|
|
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
113 |
|
|
C linear dependence of freezing point on salinity |
114 |
|
|
a0 = -0.0575 _d 0 |
115 |
|
|
c0 = 0.0901 _d 0 |
116 |
|
|
b0 = -7.61 _d -4 |
117 |
|
|
|
118 |
|
|
C-- convert potential T into in-situ T relative to surface |
119 |
|
|
insitutLoc = SW_TEMP(sLoc,tLoc,pLoc, zeroRL) |
120 |
|
|
|
121 |
|
|
C-- DEFINE SOME CONSTANTS |
122 |
|
|
eps1 = rUnit2mass*HeatCapacity_Cp * gammaT |
123 |
|
|
eps2 = rUnit2mass*SHELFICElatentHeat * gammaS |
124 |
|
|
eps3 = rhoShelfIce*SHELFICEheatCapacity_Cp * SHELFICEkappa |
125 |
|
|
& /iceConductionDistance; |
126 |
|
|
eps4 = b0*pLoc + c0 |
127 |
|
|
eps6 = eps4 - insitutLoc |
128 |
|
|
eps7 = eps4 - thetaIceConduction |
129 |
|
|
|
130 |
|
|
IF ( debugLevel.GE.debLevE ) THEN |
131 |
|
|
WRITE(msgBuf,'(A25,9E16.8)') |
132 |
|
|
&'ZZZ7 r2mass, Cp, gmaT,SIlh,gmaS, rhoSI, SI_Cp, Kap, ICondDis ', |
133 |
|
|
& rUnit2mass,HeatCapacity_Cp,gammaT, SHELFICElatentHeat,gammaS, |
134 |
|
|
& rhoShelfIce, SHELFICEheatCapacity_Cp, SHELFICEkappa, |
135 |
|
|
& iceConductionDistance |
136 |
|
|
|
137 |
|
|
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, |
138 |
|
|
& SQUEEZE_RIGHT , 1) |
139 |
|
|
ENDIF |
140 |
|
|
|
141 |
|
|
C-- Default thermodynamics specify a linear T gradient |
142 |
|
|
C-- through the ice (Holland and Jenkins, 1999, Section 2. |
143 |
|
|
aqe = a0*(eps1 + eps3) |
144 |
|
|
bqe = eps1*eps6 + eps3*eps7 - eps2 - SHELFICEsalinity*aqe |
145 |
|
|
cqe = eps2 * sLoc - SHELFICEsalinity*(eps1*eps6 + eps3*eps7) |
146 |
|
|
|
147 |
|
|
C-- Alterantively, we can have a nonlinear T gradient |
148 |
|
|
C-- through the ice (Holland and Jenkins, 1999, Section 3. |
149 |
|
|
C-- This demands a different set of constants |
150 |
|
|
IF (SHELFICEadvDiffHeatFlux .EQV. .TRUE.) THEN |
151 |
|
|
|
152 |
|
|
IF ( debugLevel.GE.debLevE ) THEN |
153 |
|
|
WRITE(msgBuf,'(A)') |
154 |
|
|
& '1useSHELFICEadvDiffHeatFlux ' |
155 |
|
|
|
156 |
|
|
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, |
157 |
|
|
& SQUEEZE_RIGHT , 1) |
158 |
|
|
ENDIF |
159 |
|
|
|
160 |
|
|
eps8 = rUnit2mass * gammaS * SHELFICEheatCapacity_Cp |
161 |
|
|
aqe = a0 *(eps1 - eps8) |
162 |
|
|
bqe = eps1*eps6 + sLoc*eps8*a0 - eps8*eps7 - eps2 - |
163 |
|
|
& SHELFICEsalinity*eps1*a0 |
164 |
|
|
cqe = sLoc*(eps8*eps7 + eps2) - SHELFICEsalinity*eps1 |
165 |
|
|
ENDIF |
166 |
|
|
|
167 |
|
|
C solve quadratic equation for salinity at shelfice-ocean interface |
168 |
|
|
recip_aqe = 0. _d 0 |
169 |
|
|
IF ( aqe .NE. 0. _d 0 ) recip_aqe = 0.5 _d 0/aqe |
170 |
|
|
|
171 |
|
|
C-- Sb = \frac{-bqe \pm \sqrt(bqe^2 - 4 aqc cqe)}{2 aqe} |
172 |
|
|
discrim = bqe*bqe - 4. _d 0*aqe*cqe |
173 |
|
|
|
174 |
|
|
C-- Try the negative root (- SQRT(discrim)) of the quadratic eq. |
175 |
|
|
saltFreeze = (- bqe - SQRT(discrim))*recip_aqe |
176 |
|
|
|
177 |
|
|
C--- If the negative root yields a negative salinity, then use the |
178 |
|
|
C-- positive root (+ SQRT(discrim)) |
179 |
|
|
IF ( saltFreeze .LT. 0. _d 0 ) THEN |
180 |
|
|
saltFreeze = (- bqe + SQRT(discrim))*recip_aqe |
181 |
|
|
ENDIF |
182 |
|
|
|
183 |
|
|
C-- in situ seawater freezing point using linearization |
184 |
|
|
thetaFreeze = a0*saltFreeze + eps4 |
185 |
|
|
|
186 |
|
|
C-- Calculate the upward heat and fresh water fluxes; |
187 |
|
|
C-- MITgcm sign conventions: downward (negative) fresh water flux |
188 |
|
|
C-- implies melting and due to upward (positive) heat flux |
189 |
|
|
|
190 |
|
|
C-- This formulation of fwflux, derived from the heat balance equation |
191 |
|
|
C-- instead of the salt balance equation, can handle the case when the |
192 |
|
|
C-- salinity of the ocean, boundary layer, and ice are identical. |
193 |
|
|
fwFlux = 1/SHELFICElatentHeat*( |
194 |
|
|
& eps3*(thetaFreeze - thetaIceConduction) - |
195 |
|
|
& eps1*(insitutLoc - thetaFreeze) ) |
196 |
|
|
|
197 |
|
|
C-- If a nonlinear local ice T gradient near the ice-ocean interface |
198 |
|
|
C-- is allowed and fwflux is positive (ice growth) then |
199 |
|
|
C-- we must solve the quadratic equation using a different set of |
200 |
|
|
C-- coeffs (Holland Jenkins, 1999). |
201 |
|
|
IF ((SHELFICEadvDiffHeatFlux .EQV. .TRUE.) .AND. |
202 |
|
|
& (fwFlux .GT. zeroRL)) THEN |
203 |
|
|
IF ( debugLevel.GE.debLevE ) THEN |
204 |
|
|
WRITE(msgBuf,'(A)') |
205 |
|
|
& '2useSHELFICEadvDiffHeatFlux ' |
206 |
|
|
|
207 |
|
|
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, |
208 |
|
|
& SQUEEZE_RIGHT , 1) |
209 |
|
|
ENDIF |
210 |
|
|
aqe = a0 *(eps1) |
211 |
|
|
bqe = eps1*eps6 - eps2 - SHELFICEsalinity*eps1*a0 |
212 |
|
|
cqe = sLoc*(eps2) - SHELFICEsalinity*eps1 |
213 |
|
|
|
214 |
|
|
recip_aqe = 0. _d 0 |
215 |
|
|
IF ( aqe .NE. 0. _d 0 ) recip_aqe = 0.5 _d 0/aqe |
216 |
|
|
|
217 |
|
|
discrim = bqe*bqe - 4. _d 0*aqe*cqe |
218 |
|
|
saltFreeze = (- bqe - SQRT(discrim))*recip_aqe |
219 |
|
|
IF ( saltFreeze .LT. 0. _d 0 ) THEN |
220 |
|
|
saltFreeze = (- bqe + SQRT(discrim))*recip_aqe |
221 |
|
|
ENDIF |
222 |
|
|
|
223 |
|
|
thetaFreeze = a0*saltFreeze + eps4 |
224 |
|
|
|
225 |
|
|
fwFlux = 1/SHELFICElatentHeat* ( |
226 |
|
|
& eps3*(thetaFreeze - thetaIceConduction) - |
227 |
|
|
& eps1*(insitutLoc - thetaFreeze) ) |
228 |
|
|
ENDIF |
229 |
|
|
|
230 |
|
|
C meltwater advective flux velocity at ice-ocean interface (m/s) |
231 |
|
|
C * negative corresponds to downward flux (melting) |
232 |
|
|
w_I = fwFlux * mass2rUnit |
233 |
|
|
|
234 |
|
|
C-- Calculate the upward heat fluxes: |
235 |
|
|
C-- melting requires upward (positive) heat flux from ocean to ice. |
236 |
|
|
|
237 |
|
|
C-- The heatFlux variable corresponds with the change of energy in the |
238 |
|
|
C-- ocean grid cell volume. In the conservative case (J2001), |
239 |
|
|
C-- advective heat fluxes change the energy of the volume whereas in |
240 |
|
|
C-- the non-conservative case there are no advective heat fluxes |
241 |
|
|
C-- melting or freezing have no associated advective heat fluxes. |
242 |
|
|
IF (SHELFICEconserve) THEN |
243 |
|
|
|
244 |
|
|
C-- In the conservative case (J2001) there are two cases, fixed and |
245 |
|
|
C-- non-fixed ocean volume. |
246 |
|
|
|
247 |
|
|
IF (useRealFreshWaterFlux ) THEN |
248 |
|
|
|
249 |
|
|
C-- If the ocean volume can change (realFWFlux=true) then advection of |
250 |
|
|
C-- meltwater does not displace water at T=insitutLoc in the cell and the |
251 |
|
|
C-- heat flux correpsonding to the total energy flux of the volume |
252 |
|
|
C-- consists of only two terms: turbulent fluxes (positive out) |
253 |
|
|
C-- and advective meltwater fluxes (negative in). |
254 |
|
|
heatFlux = rUnit2mass*HeatCapacity_Cp * ( |
255 |
|
|
& gammaT * (insitutLoc - thetaFreeze) |
256 |
|
|
& + w_I * thetaFreeze ) |
257 |
|
|
ELSE |
258 |
|
|
|
259 |
|
|
C-- If the volume is fixed (realFWFlux=false) then the advection of |
260 |
|
|
C-- meltwater does displace ambient water at T=insitutLoc in the cell. |
261 |
|
|
C-- Displacement reduction volume energy by w_I * insitutLoc (positive) |
262 |
|
|
heatFlux = rUnit2mass*HeatCapacity_Cp * ( |
263 |
|
|
& gammaT * (insitutLoc - thetaFreeze) |
264 |
|
|
& + w_I * (thetaFreeze - insitutLoc) ) |
265 |
|
|
ENDIF |
266 |
|
|
|
267 |
|
|
ELSE |
268 |
|
|
|
269 |
|
|
C-- In the non-conservative form, only fluxes are turbulent fluxes |
270 |
|
|
heatFlux = rUnit2mass*HeatCapacity_Cp * |
271 |
|
|
& gammaT * (insitutLoc - thetaFreeze) |
272 |
|
|
ENDIF |
273 |
|
|
|
274 |
|
|
C-- Calculate the T and S tendency terms. T tendency term is |
275 |
|
|
C-- not necessarily proportional to the heat flux term above because |
276 |
|
|
C-- the heat flux term corresponds to total energy change in the grid |
277 |
|
|
C-- cell and not the change of energy per unit volume. |
278 |
|
|
|
279 |
|
|
IF (SHELFICEconserve) THEN |
280 |
|
|
C-- In the conservative case, meltwater advection contributes (J2001) |
281 |
|
|
C-- to T and S tendencies |
282 |
|
|
C-- * forcing T (K m/s) |
283 |
|
|
forcingT = |
284 |
|
|
& (gammaT - w_I)*(thetaFreeze - insitutLoc) |
285 |
|
|
|
286 |
|
|
C-- * forcing S (psu m/s) |
287 |
|
|
forcingS = |
288 |
|
|
& (gammaS - w_I)*(saltFreeze - sLoc) |
289 |
|
|
ELSE |
290 |
|
|
C-- Otherwise, the only fluxes out of the ocean that change T and S |
291 |
|
|
C-- are the turbulent fluxes. |
292 |
|
|
forcingT = gammaT * ( thetaFreeze - insitutLoc ) |
293 |
|
|
forcingS = gammaS * ( saltFreeze - sLoc ) |
294 |
|
|
ENDIF |
295 |
|
|
|
296 |
|
|
IF ( debugLevel.GE.debLevE ) THEN |
297 |
|
|
WRITE(msgBuf,'(A25,7E16.8)') |
298 |
|
|
& 'ZZZ6 aqe, bqe, ceq ', |
299 |
|
|
& aqe,bqe,cqe |
300 |
|
|
|
301 |
|
|
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, |
302 |
|
|
& SQUEEZE_RIGHT , 1) |
303 |
|
|
|
304 |
|
|
WRITE(msgBuf,'(A25,7E16.8)') |
305 |
|
|
& 'ZZZ2 T,S,P,t,TFrz,SFrz,w_I ', |
306 |
|
|
& tLoc,sLoc,pLoc, insitutLoc, thetaFreeze, saltFreeze, w_I |
307 |
|
|
|
308 |
|
|
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, |
309 |
|
|
& SQUEEZE_RIGHT , 1) |
310 |
|
|
ENDIF |
311 |
|
|
|
312 |
|
|
|
313 |
|
|
RETURN |
314 |
|
|
END |
315 |
|
|
|