/[MITgcm]/MITgcm/pkg/seaice/seaice_solve4temp.F
ViewVC logotype

Contents of /MITgcm/pkg/seaice/seaice_solve4temp.F

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


Revision 1.19 - (show annotations) (download)
Sat Dec 24 18:37:18 2011 UTC (12 years, 5 months ago) by jmc
Branch: MAIN
Changes since 1.18: +9 -10 lines
allow to compile with exf options ALLOW_ATM_TEMP or ALLOW_DOWNWARD_RADIATION
 undefined.

1 C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_solve4temp.F,v 1.18 2011/12/22 12:35:02 mlosch Exp $
2 C $Name: $
3
4 #include "SEAICE_OPTIONS.h"
5 #ifdef ALLOW_EXF
6 # include "EXF_OPTIONS.h"
7 #endif
8
9 CBOP
10 C !ROUTINE: SEAICE_SOLVE4TEMP
11 C !INTERFACE:
12 SUBROUTINE SEAICE_SOLVE4TEMP(
13 I UG, HICE_ACTUAL, HSNOW_ACTUAL,
14 #ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
15 I F_lh_max,
16 #endif
17 U TSURF,
18 O F_ia, IcePenetSWFlux,
19 O FWsublim,
20 I bi, bj, myTime, myIter, myThid )
21
22 C !DESCRIPTION: \bv
23 C *==========================================================*
24 C | SUBROUTINE SOLVE4TEMP
25 C | o Calculate ice growth rate, surface fluxes and
26 C | temperature of ice surface.
27 C | see Hibler, MWR, 108, 1943-1973, 1980
28 C *==========================================================*
29 C \ev
30
31 C !USES:
32 IMPLICIT NONE
33 C === Global variables ===
34 #include "SIZE.h"
35 #include "GRID.h"
36 #include "EEPARAMS.h"
37 #include "PARAMS.h"
38 #include "FFIELDS.h"
39 #include "SEAICE_SIZE.h"
40 #include "SEAICE_PARAMS.h"
41 #include "SEAICE.h"
42 #ifdef SEAICE_VARIABLE_FREEZING_POINT
43 #include "DYNVARS.h"
44 #endif /* SEAICE_VARIABLE_FREEZING_POINT */
45 #ifdef ALLOW_EXF
46 # include "EXF_FIELDS.h"
47 #endif
48 #ifdef ALLOW_AUTODIFF_TAMC
49 # include "tamc.h"
50 #endif
51
52 C !INPUT/OUTPUT PARAMETERS
53 C === Routine arguments ===
54 C INPUT:
55 C UG :: thermal wind of atmosphere
56 C HICE_ACTUAL :: actual ice thickness
57 C HSNOW_ACTUAL :: actual snow thickness
58 C TSURF :: surface temperature of ice in Kelvin, updated
59 C bi,bj :: loop indices
60 C OUTPUT:
61 C F_io_net :: net upward conductive heat flux through ice at the base
62 C of the ice
63 C F_ia_net :: net heat flux divergence at the sea ice/snow surface:
64 C includes ice conductive fluxes and atmospheric fluxes (W/m^2)
65 C F_ia :: upward sea ice/snow surface heat flux to atmosphere (W/m^2)
66 C IcePenetSWFlux :: short wave heat flux under ice
67 C FWsublim :: fresh water (mass) flux implied by latent heat of
68 C sublimation (kg/m^2/s)
69 _RL UG (1:sNx,1:sNy)
70 _RL HICE_ACTUAL (1:sNx,1:sNy)
71 _RL HSNOW_ACTUAL (1:sNx,1:sNy)
72 #ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
73 _RL F_lh_max (1:sNx,1:sNy)
74 #endif
75 _RL TSURF (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
76 c _RL F_io_net (1:sNx,1:sNy)
77 c _RL F_ia_net (1:sNx,1:sNy)
78 _RL F_ia (1:sNx,1:sNy)
79 _RL IcePenetSWFlux (1:sNx,1:sNy)
80 _RL FWsublim (1:sNx,1:sNy)
81 INTEGER bi, bj
82 _RL myTime
83 INTEGER myIter, myThid
84 CEOP
85
86 #if defined(ALLOW_ATM_TEMP) && defined(ALLOW_DOWNWARD_RADIATION)
87 C !LOCAL VARIABLES:
88 C === Local variables ===
89 _RL F_io_net (1:sNx,1:sNy)
90 _RL F_ia_net (1:sNx,1:sNy)
91 #ifndef SEAICE_SOLVE4TEMP_LEGACY
92 _RL F_swi (1:sNx,1:sNy)
93 _RL F_lwd (1:sNx,1:sNy)
94 _RL F_lwu (1:sNx,1:sNy)
95 _RL F_sens (1:sNx,1:sNy)
96 _RL hice_tmp
97 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
98 _RL F_lh (1:sNx,1:sNy)
99 _RL F_c (1:sNx,1:sNy)
100 _RL qhice (1:sNx,1:sNy)
101
102 _RL AbsorbedSWFlux (1:sNx,1:sNy)
103 _RL IcePenetSWFluxFrac (1:sNx,1:sNy)
104
105 C local copies of global variables
106 _RL tsurfLoc (1:sNx,1:sNy)
107 _RL atempLoc (1:sNx,1:sNy)
108 _RL lwdownLoc (1:sNx,1:sNy)
109 _RL ALB (1:sNx,1:sNy)
110 _RL ALB_ICE (1:sNx,1:sNy)
111 _RL ALB_SNOW (1:sNx,1:sNy)
112
113 C i, j :: Loop counters
114 C kSrf :: vertical index of surface layer
115 INTEGER i, j
116 #ifdef SEAICE_VARIABLE_FREEZING_POINT
117 INTEGER kSrf
118 #endif /* SEAICE_VARIABLE_FREEZING_POINT */
119 INTEGER ITER
120
121 C This is HICE_ACTUAL.GT.0.
122 LOGICAL iceOrNot(1:sNx,1:sNy)
123
124 C TB :: temperature in boundary layer (=freezing point temperature) (K)
125 _RL TB (1:sNx,1:sNy)
126 C
127 _RL D1, D1I
128 _RL D3(1:sNx,1:sNy)
129 _RL TMELT, XKI, XKS, HCUT, XIO
130 _RL SurfMeltTemp
131 C effective conductivity of combined ice and snow
132 _RL effConduct(1:sNx,1:sNy)
133
134 C Constants to calculate Saturation Vapor Pressure
135 #ifdef SEAICE_SOLVE4TEMP_LEGACY
136 _RL TMELTP, C1, C2, C3, C4, C5, QS1
137 _RL A2 (1:sNx,1:sNy)
138 _RL A3 (1:sNx,1:sNy)
139 c _RL B (1:sNx,1:sNy)
140 _RL A1 (1:sNx,1:sNy)
141 #else /* SEAICE_SOLVE4TEMP_LEGACY */
142 _RL dFiDTs1
143 _RL aa1,aa2,bb1,bb2,Ppascals,cc0,cc1,cc2,cc3t
144 C specific humidity at ice surface variables
145 _RL mm_pi,mm_log10pi,dqhice_dTice
146 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
147
148 C latent heat of sublimation for ice (SEAICE_lhEvap +
149 C SEAICE_lhFusion)
150 _RL lhSublim
151
152 C powers of temperature
153 _RL t1, t2, t3, t4
154 _RL lnTEN
155
156 #ifdef ALLOW_AUTODIFF_TAMC
157 CADJ INIT comlev1_solve4temp = COMMON, sNx*sNy*NMAX_TICE
158 #endif /* ALLOW_AUTODIFF_TAMC */
159
160 lnTEN = log(10.0 _d 0)
161 #ifdef SEAICE_SOLVE4TEMP_LEGACY
162 C MAYKUTS CONSTANTS FOR SAT. VAP. PRESSURE TEMP. POLYNOMIAL
163 C1= 2.7798202 _d -06
164 C2= -2.6913393 _d -03
165 C3= 0.97920849 _d +00
166 C4= -158.63779 _d +00
167 C5= 9653.1925 _d +00
168
169 QS1=0.622 _d +00/1013.0 _d +00
170
171 #else /* SEAICE_SOLVE4TEMP_LEGACY */
172 aa1 = 2663.5 _d 0
173 aa2 = 12.537 _d 0
174 bb1 = 0.622 _d 0
175 bb2 = 1.0 _d 0 - bb1
176 Ppascals = 100000. _d 0
177 C cc0 = TEN ** aa2
178 cc0 = exp(aa2*lnTEN)
179 cc1 = cc0*aa1*bb1*Ppascals*lnTEN
180 cc2 = cc0*bb2
181 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
182
183 #ifdef SEAICE_VARIABLE_FREEZING_POINT
184 kSrf = 1
185 #endif /* SEAICE_VARIABLE_FREEZING_POINT */
186
187 C SENSIBLE HEAT CONSTANT
188 D1=SEAICE_dalton*SEAICE_cpAir*SEAICE_rhoAir
189
190 C ICE LATENT HEAT CONSTANT
191 lhSublim = SEAICE_lhEvap + SEAICE_lhFusion
192 D1I=SEAICE_dalton*lhSublim*SEAICE_rhoAir
193
194 C MELTING TEMPERATURE OF ICE
195 #ifdef SEAICE_SOLVE4TEMP_LEGACY
196 TMELT = 273.16 _d +00
197 TMELTP = 273.159 _d +00
198 SurfMeltTemp = TMELTP
199 #else /* SEAICE_SOLVE4TEMP_LEGACY */
200 TMELT = celsius2K
201 SurfMeltTemp = TMELT
202 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
203
204 C ICE CONDUCTIVITY
205 XKI=SEAICE_iceConduct
206
207 C SNOW CONDUCTIVITY
208 XKS=SEAICE_snowConduct
209
210 C CUTOFF SNOW THICKNESS
211 HCUT=SEAICE_snowThick
212
213 C PENETRATION SHORTWAVE RADIATION FACTOR
214 XIO=SEAICE_shortwave
215
216 C Initialize variables
217 DO J=1,sNy
218 DO I=1,sNx
219 C HICE_ACTUAL is modified in this routine, but at the same time
220 C used to decided where there is ice, therefore we save this information
221 C here in a separate array
222 iceOrNot (I,J) = HICE_ACTUAL(I,J) .GT. 0. _d 0
223 C
224 IcePenetSWFlux (I,J) = 0. _d 0
225 IcePenetSWFluxFrac (I,J) = 0. _d 0
226 AbsorbedSWFlux (I,J) = 0. _d 0
227
228 qhice (I,J) = 0. _d 0
229 F_ia (I,J) = 0. _d 0
230
231 F_io_net (I,J) = 0. _d 0
232 F_ia_net (I,J) = 0. _d 0
233
234 F_lh (I,J) = 0. _d 0
235
236 C Reset the snow/ice surface to TMELT and bound the atmospheric temperature
237 #ifdef SEAICE_SOLVE4TEMP_LEGACY
238 tsurfLoc (I,J) = MIN(273.16 _d 0 + MAX_TICE,TSURF(I,J,bi,bj))
239 atempLoc (I,J) = MAX(273.16 _d 0 + MIN_ATEMP,ATEMP(I,J,bi,bj))
240 A1(I,J) = 0.0 _d 0
241 A2(I,J) = 0.0 _d 0
242 A3(I,J) = 0.0 _d 0
243 c B(I,J) = 0.0 _d 0
244 lwdownLoc(I,J) = MAX(MIN_LWDOWN,LWDOWN(I,J,bi,bj))
245 #else /* SEAICE_SOLVE4TEMP_LEGACY */
246 F_swi (I,J) = 0. _d 0
247 F_lwd (I,J) = 0. _d 0
248 F_lwu (I,J) = 0. _d 0
249 F_sens (I,J) = 0. _d 0
250
251 tsurfLoc (I,J) = TSURF(I,J,bi,bj)
252 atempLoc (I,J) = MAX(TMELT + MIN_ATEMP,ATEMP(I,J,bi,bj))
253 lwdownLoc(I,J) = LWDOWN(I,J,bi,bj)
254 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
255
256 C FREEZING TEMPERATURE OF SEAWATER
257 #ifdef SEAICE_VARIABLE_FREEZING_POINT
258 C Use a variable seawater freezing point
259 TB(I,J) = -0.0575 _d 0*salt(I,J,kSrf,bi,bj) + 0.0901 _d 0
260 & + celsius2K
261 #else
262 C Use a constant freezing temperature (SEAICE_VARIABLE_FREEZING_POINT undef)
263 #ifdef SEAICE_SOLVE4TEMP_LEGACY
264 TB(I,J) = 271.2 _d 0
265 #else /* SEAICE_SOLVE4TEMP_LEGACY */
266 TB(I,J) = celsius2K + SEAICE_freeze
267 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
268 #endif /* SEAICE_VARIABLE_FREEZING_POINT */
269 IF(HSNOW_ACTUAL(I,J).GT.0.0) THEN
270 C Stefan-Boltzman constant times emissivity
271 D3(I,J)=SEAICE_snow_emiss*SEAICE_boltzmann
272 #ifdef EXF_LWDOWN_WITH_EMISSIVITY
273 C This is now [(1-emiss)*lwdown - lwdown]
274 lwdownloc(I,J) = SEAICE_snow_emiss*lwdownloc(I,J)
275 #else /* use the old hard wired inconsistent value */
276 lwdownloc(I,J) = 0.97 _d 0*lwdownloc(I,J)
277 #endif /* EXF_LWDOWN_WITH_EMISSIVITY */
278 ELSE
279 C Stefan-Boltzman constant times emissivity
280 D3(I,J)=SEAICE_ice_emiss*SEAICE_boltzmann
281 #ifdef EXF_LWDOWN_WITH_EMISSIVITY
282 C This is now [(1-emiss)*lwdown - lwdown]
283 lwdownloc(I,J) = SEAICE_ice_emiss*lwdownloc(I,J)
284 #else /* use the old hard wired inconsistent value */
285 lwdownloc(I,J) = 0.97 _d 0*lwdownloc(I,J)
286 #endif /* EXF_LWDOWN_WITH_EMISSIVITY */
287 ENDIF
288 ENDDO
289 ENDDO
290
291 DO J=1,sNy
292 DO I=1,sNx
293
294 C DECIDE ON ALBEDO
295 IF ( iceOrNot(I,J) ) THEN
296
297 IF ( YC(I,J,bi,bj) .LT. 0.0 _d 0 ) THEN
298 IF (tsurfLoc(I,J) .GE. SurfMeltTemp) THEN
299 ALB_ICE (I,J) = SEAICE_wetIceAlb_south
300 ALB_SNOW(I,J) = SEAICE_wetSnowAlb_south
301 ELSE ! no surface melting
302 ALB_ICE (I,J) = SEAICE_dryIceAlb_south
303 ALB_SNOW(I,J) = SEAICE_drySnowAlb_south
304 ENDIF
305 ELSE !/ Northern Hemisphere
306 IF (tsurfLoc(I,J) .GE. SurfMeltTemp) THEN
307 ALB_ICE (I,J) = SEAICE_wetIceAlb
308 ALB_SNOW(I,J) = SEAICE_wetSnowAlb
309 ELSE ! no surface melting
310 ALB_ICE (I,J) = SEAICE_dryIceAlb
311 ALB_SNOW(I,J) = SEAICE_drySnowAlb
312 ENDIF
313 ENDIF !/ Albedo for snow and ice
314
315 #ifdef SEAICE_SOLVE4TEMP_LEGACY
316 C If actual snow thickness exceeds the cutoff thickness, use the
317 C snow albedo
318 IF (HSNOW_ACTUAL(I,J) .GT. HCUT) THEN
319 ALB(I,J) = ALB_SNOW(I,J)
320 C otherwise, use some combination of ice and snow albedo
321 C (What is the source of this formulation ?)
322 ELSE
323 ALB(I,J) = MIN(ALB_ICE(I,J) + HSNOW_ACTUAL(I,J)/HCUT*
324 & (ALB_SNOW(I,J) -ALB_ICE(I,J)),
325 & ALB_SNOW(I,J))
326 ENDIF
327
328 #else /* SEAICE_SOLVE4TEMP_LEGACY */
329 IF (HSNOW_ACTUAL(I,J) .GT. 0.0 _d 0) THEN
330 ALB(I,J) = ALB_SNOW(I,J)
331 ELSE
332 ALB(I,J) = ALB_ICE(I,J)
333 ENDIF
334 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
335
336 #ifdef SEAICE_SOLVE4TEMP_LEGACY
337 C NOW DETERMINE FIXED FORCING TERM IN HEAT BUDGET
338
339 IF(HSNOW_ACTUAL(I,J).GT.0.0) THEN
340 C NO SW PENETRATION WITH SNOW
341 A1(I,J)=(1.0 _d 0 - ALB(I,J))*SWDOWN(I,J,bi,bj)
342 & +lwdownLoc(I,J)
343 & +D1*UG(I,J)*atempLoc(I,J)+D1I*UG(I,J)*AQH(I,J,bi,bj)
344 ELSE
345 C SW PENETRATION UNDER ICE
346 A1(I,J)=(1.0 _d 0 - ALB(I,J))*SWDOWN(I,J,bi,bj)
347 & *(1.0 _d 0 - XIO*EXP(-1.5 _d 0*HICE_ACTUAL(I,J)))
348 & +lwdownLoc(I,J)
349 & +D1*UG(I,J)*atempLoc(I,J)+D1I*UG(I,J)*AQH(I,J,bi,bj)
350 ENDIF
351
352 #else /* SEAICE_SOLVE4TEMP_LEGACY */
353
354 C The longwave radiative flux convergence
355 F_lwd(I,J) = - lwdownLoc(I,J)
356
357 C Determine the fraction of shortwave radiative flux
358 C remaining after scattering through the snow and ice at
359 C the ocean interface. If snow is present, no radiation
360 C penetrates to the ocean.
361 IF (HSNOW_ACTUAL(I,J) .GT. 0.0 _d 0) THEN
362 IcePenetSWFluxFrac(I,J) = 0.0 _d 0
363 ELSE
364 IcePenetSWFluxFrac(I,J) =
365 & XIO*EXP(-1.5 _d 0 * HICE_ACTUAL(I,J))
366 ENDIF
367
368 C The shortwave radiative flux convergence in the
369 C seaice.
370 AbsorbedSWFlux(I,J) = -(1.0 _d 0 - ALB(I,J))*
371 & (1.0 _d 0 - IcePenetSWFluxFrac(I,J))
372 & *SWDOWN(I,J,bi,bj)
373
374 C The shortwave radiative flux convergence in the
375 C ocean beneath ice.
376 IcePenetSWFlux(I,J) = -(1.0 _d 0 - ALB(I,J))*
377 & IcePenetSWFluxFrac(I,J)
378 & *SWDOWN(I,J,bi,bj)
379
380 F_swi(I,J) = AbsorbedSWFlux(I,J)
381
382 C Set a mininum sea ice thickness of 5 cm to bound
383 C the magnitude of conductive heat fluxes.
384 cif * now taken care of by SEAICE_hice_reg in seaice_growth
385 C hice_tmp = max(HICE_ACTUAL(I,J),5. _d -2)
386
387 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
388
389 C The effective conductivity of the two-layer
390 C snow/ice system.
391 #ifdef SEAICE_SOLVE4TEMP_LEGACY
392 effConduct(I,J)=
393 & XKS/(HSNOW_ACTUAL(I,J)/HICE_ACTUAL(I,J) +
394 & XKS/XKI)/HICE_ACTUAL(I,J)
395 #else /* SEAICE_SOLVE4TEMP_LEGACY */
396 effConduct(I,J) = XKI * XKS /
397 & (XKS * HICE_ACTUAL(I,j) + XKI * HSNOW_ACTUAL(I,J))
398 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
399
400 #ifdef SEAICE_DEBUG
401 IF ( (I .EQ. SEAICE_debugPointI) .and.
402 & (J .EQ. SEAICE_debugPointJ) ) THEN
403
404 print '(A,i6)','-----------------------------------'
405 print '(A,i6)','ibi merged initialization ', myIter
406
407 print '(A,i6,4(1x,D24.15))',
408 & 'ibi iter, TSL, TS ',myIter,
409 & tsurfLoc(I,J), TSURF(I,J,bi,bj)
410
411 print '(A,i6,4(1x,D24.15))',
412 & 'ibi iter, TMELT ',myIter,TMELT
413
414 print '(A,i6,4(1x,D24.15))',
415 & 'ibi iter, HIA, EFKCON ',myIter,
416 & HICE_ACTUAL(I,J), effConduct(I,J)
417
418 print '(A,i6,4(1x,D24.15))',
419 & 'ibi iter, HSNOW ',myIter,
420 & HSNOW_ACTUAL(I,J), ALB(I,J)
421
422 print '(A,i6)','-----------------------------------'
423 print '(A,i6)','ibi energy balance iterat ', myIter
424
425 ENDIF
426 #endif /* SEAICE_DEBUG */
427
428 ENDIF !/* iceOrNot */
429 ENDDO !/* i */
430 ENDDO !/* j */
431 Ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
432 DO ITER=1,IMAX_TICE
433 DO J=1,sNy
434 DO I=1,sNx
435 #ifdef ALLOW_AUTODIFF_TAMC
436 iicekey = I + sNx*(J-1) + (ITER-1)*sNx*sNy
437 CADJ STORE tsurfloc(i,j) = comlev1_solve4temp,
438 CADJ & key = iicekey, byte = isbyte
439 #endif /* ALLOW_AUTODIFF_TAMC */
440
441 IF ( iceOrNot(I,J) ) THEN
442
443 t1 = tsurfLoc(I,J)
444 t2 = t1*t1
445 t3 = t2*t1
446 t4 = t2*t2
447
448 C Calculate the specific humidity in the BL above the snow/ice
449 #ifdef SEAICE_SOLVE4TEMP_LEGACY
450 C Use the Maykut polynomial
451 qhice(I,J)=QS1*(C1*t4+C2*t3 +C3*t2+C4*t1+C5)
452
453 #else /* SEAICE_SOLVE4TEMP_LEGACY */
454 C Use an approximation which is more accurate at low temperatures
455
456 C log 10 of the sat vap pressure
457 mm_log10pi = -aa1 / t1 + aa2
458
459 C The saturation vapor pressure (SVP) in the surface
460 C boundary layer (BL) above the snow/ice.
461 C mm_pi = TEN **(mm_log10pi)
462 C The following form does the same, but is faster
463 mm_pi = exp(mm_log10pi*lnTEN)
464
465 qhice(I,J) = bb1*mm_pi / (Ppascals - (1.0 _d 0 - bb1) *
466 & mm_pi)
467 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
468
469 C Calculate the flux terms based on the updated tsurfLoc
470 F_c(I,J) = -effConduct(I,J)*(TB(I,J)-tsurfLoc(I,J))
471 F_lh(I,J) = D1I*UG(I,J)*(qhice(I,J)-AQH(I,J,bi,bj))
472 #ifdef SEAICE_SOLVE4TEMP_LEGACY
473 A2(I,J)=-D1*UG(I,J)*t1-D1I*UG(I,J)*qhice(I,J)-D3(I,J)*t4
474 A3(I,J) = 4.0 _d 0*D3(I,J)*t3 + effConduct(I,J)+D1*UG(I,J)
475 #else /* SEAICE_SOLVE4TEMP_LEGACY */
476 C A constant for SVP derivative w.r.t TICE
477 C cc3t = TEN **(aa1 / t1)
478 C The following form does the same, but is faster
479 cc3t = exp(aa1 / t1 * lnTEN)
480
481 c d(qh)/d(TICE)
482 dqhice_dTice = cc1*cc3t/((cc2-cc3t*Ppascals)**2 *t2)
483
484 #ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
485 c if the latent heat flux implied by tsurfLoc exceeds
486 c F_lh_max, cap F_lh and decouple the flux magnitude from TICE
487 if (F_lh(I,J) .GT. F_lh_max(I,J)) THEN
488 F_lh(I,J) = F_lh_max(I,J)
489 dqhice_dTice = ZERO
490 endif
491 #endif
492
493
494 c d(F_ia)/d(TICE)
495 dFiDTs1 = 4.0 _d 0*D3(I,J)*t3 + effConduct(I,J) + D1*UG(I,J)
496 & + D1I*UG(I,J)*dqhice_dTice
497
498 F_lwu(I,J)= t4 * D3(I,J)
499
500 F_sens(I,J)= D1 * UG(I,J) * (t1 - atempLoc(I,J))
501
502 F_ia(I,J) = F_lwd(I,J) + F_swi(I,J) + F_lwu(I,J) +
503 & F_c(I,J) + F_sens(I,J) + F_lh(I,J)
504
505 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
506
507 #ifdef SEAICE_DEBUG
508 IF ( (I .EQ. SEAICE_debugPointI) .and.
509 & (J .EQ. SEAICE_debugPointJ) ) THEN
510 print '(A,i6,4(1x,D24.15))',
511 & 'ice-iter qhICE, ', ITER,qhIce(I,J)
512
513 #ifdef SEAICE_SOLVE4TEMP_LEGACY
514 print '(A,i6,4(1x,D24.15))',
515 & 'ice-iter A1 A2 B ', ITER,A1(I,J), A2(I,J),
516 & -F_c(I,J)
517
518 print '(A,i6,4(1x,D24.15))',
519 & 'ice-iter A3 (-A1+A2) ', ITER, A3(I,J),
520 & -(A1(I,J) + A2(I,J))
521 #else /* SEAICE_SOLVE4TEMP_LEGACY */
522
523 print '(A,i6,4(1x,D24.15))',
524 & 'ice-iter dFiDTs1 F_ia ', ITER, dFiDTs1,
525 & F_ia(I,J)
526 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
527
528 ENDIF
529 #endif /* SEAICE_DEBUG */
530
531 C Update tsurfLoc
532 #ifdef SEAICE_SOLVE4TEMP_LEGACY
533 tsurfLoc(I,J)=tsurfLoc(I,J)
534 & +(A1(I,J)+A2(I,J)-F_c(I,J))/A3(I,J)
535
536 tsurfLoc(I,J) =MAX(273.16 _d 0+MIN_TICE,tsurfLoc(I,J))
537 tsurfLoc(I,J) =MIN(tsurfLoc(I,J),TMELT)
538
539 #else /* SEAICE_SOLVE4TEMP_LEGACY */
540 tsurfLoc(I,J) = tsurfLoc(I,J) - F_ia(I,J) / dFiDTs1
541
542 C If the search leads to tsurfLoc < 50 Kelvin,
543 C restart the search at tsurfLoc = TMELT. Note that one
544 C solution to the energy balance problem is an
545 C extremely low temperature - a temperature far below
546 C realistic values.
547
548 IF (tsurfLoc(I,J) .LT. 50.0 _d 0 ) THEN
549 tsurfLoc(I,J) = TMELT
550 ENDIF
551 tsurfLoc(I,J) =MIN(tsurfLoc(I,J),TMELT)
552 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
553
554 #ifdef SEAICE_DEBUG
555 IF ( (I .EQ. SEAICE_debugPointI) .and.
556 & (J .EQ. SEAICE_debugPointJ) ) THEN
557
558 print '(A,i6,4(1x,D24.15))',
559 & 'ice-iter tsurfLc,|dif|', ITER,
560 & tsurfLoc(I,J),
561 & log10(abs(tsurfLoc(I,J) - t1))
562 ENDIF
563 #endif /* SEAICE_DEBUG */
564
565 ENDIF !/* iceOrNot */
566 ENDDO !/* i */
567 ENDDO !/* j */
568 ENDDO !/* Iterations */
569 Ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
570 DO J=1,sNy
571 DO I=1,sNx
572 IF ( iceOrNot(I,J) ) THEN
573
574 C Finalize the flux terms
575 #ifdef SEAICE_SOLVE4TEMP_LEGACY
576 F_ia(I,J)=-A1(I,J)-A2(I,J)
577 TSURF(I,J,bi,bj)=MIN(tsurfLoc(I,J),TMELT)
578
579 IF (HSNOW_ACTUAL(I,J) .GT. 0.0 _d 0 ) THEN
580 C NO SW PENETRATION WITH SNOW
581 IcePenetSWFlux(I,J)=0.0 _d 0
582 ELSE
583 C SW PENETRATION UNDER ICE
584 IcePenetSWFlux(I,J)=-(1.0 _d 0 -ALB(I,J))*SWDOWN(I,J,bi,bj)
585 & *XIO*EXP(-1.5 _d 0*HICE_ACTUAL(I,J))
586 ENDIF
587
588 #else /* SEAICE_SOLVE4TEMP_LEGACY */
589 TSURF(I,J,bi,bj) = tsurfLoc(I,J)
590
591 C Recalculate the fluxes based on the (possibly) adjusted TSURF
592 t1 = tsurfLoc(I,J)
593 t2 = t1*t1
594 t3 = t2*t1
595 t4 = t2*t2
596
597 C log 10 of the sat vap pressure
598 mm_log10pi = -aa1 / t1 + aa2
599
600 C saturation vapor pressure
601 C mm_pi = TEN **(mm_log10pi)
602 C The following form does the same, but is faster
603 mm_pi = exp(mm_log10pi*lnTEN)
604
605 C over ice specific humidity
606 qhice(I,J) = bb1*mm_pi/(Ppascals- (1.0 _d 0 - bb1) * mm_pi)
607
608 F_lh(I,J) = D1I * UG(I,J)*(qhice(I,J)-AQH(I,J,bi,bj))
609
610 #ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
611 if (F_lh(I,J) .GT. F_lh_max(I,J)) THEN
612 F_lh(I,J) = F_lh_max(I,J)
613 endif
614 #endif
615
616 F_c(I,J) = -effConduct(I,J) * (TB(I,J) - t1)
617 F_lwu(I,J) = t4 * D3(I,J)
618 F_sens(I,J) = D1 * UG(I,J) * (t1 - atempLoc(I,J))
619
620 C The flux between the ice/snow surface and the atmosphere.
621 C (excludes upward conductive fluxes)
622 F_ia(I,J) = F_lwd(I,J) + F_swi(I,J) + F_lwu(I,J) +
623 & F_sens(I,J) + F_lh(I,J)
624 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
625
626 #ifdef SEAICE_MODIFY_GROWTH_ADJ
627 Cgf no additional dependency through solver, snow, etc.
628 if ( SEAICEadjMODE.GE.2 ) then
629 CALL ZERO_ADJ_1D( 1, TSURF(I,J,bi,bj), myThid)
630 t1 = TSURF(I,J,bi,bj)
631 t2 = t1*t1
632 t3 = t2*t1
633 t4 = t2*t2
634 qhice(I,J)=QS1*(C1*t4+C2*t3 +C3*t2+C4*t1+C5)
635
636 A1(I,J)=0.3 _d 0 *SWDOWN(I,J,bi,bj)+lwdownLoc(I,J)
637 & +D1*UG(I,J)*atempLoc(I,J)+D1I*UG(I,J)*AQH(I,J,bi,bj)
638 A2(I,J)=-D1*UG(I,J)*t1-D1I*UG(I,J)*qhice(I,J)-D3(I,J)*t4
639
640 F_ia(I,J)=-A1(I,J)-A2(I,J)
641 IcePenetSWFlux(I,J)= 0. _d 0
642 endif
643 #endif
644
645 C Caclulate the net ice-ocean and ice-atmosphere fluxes
646 IF (F_c(I,J) .LT. 0.0 _d 0) THEN
647 F_io_net(I,J) = -F_c(I,J)
648 F_ia_net(I,J) = 0.0 _d 0
649 ELSE
650 F_io_net(I,J) = 0.0 _d 0
651 F_ia_net(I,J) = F_ia(I,J)
652 ENDIF !/* conductive fluxes up or down */
653 C Fresh water flux (kg/m^2/s) from latent heat of sublimation.
654 C F_lh is positive upward (sea ice looses heat) and FWsublim
655 C is also positive upward (atmosphere gains freshwater)
656 FWsublim(I,J) = F_lh(I,J)/lhSublim
657
658 #ifdef SEAICE_DEBUG
659 IF ( (I .EQ. SEAICE_debugPointI) .and.
660 & (J .EQ. SEAICE_debugPointJ) ) THEN
661
662 print '(A)','----------------------------------------'
663 print '(A,i6)','ibi complete ', myIter
664
665 print '(A,4(1x,D24.15))',
666 & 'ibi T(SURF, surfLoc,atmos) ',
667 & TSURF(I,J,bi,bj), tsurfLoc(I,J),atempLoc(I,J)
668
669 print '(A,4(1x,D24.15))',
670 & 'ibi LWL ', lwdownLoc(I,J)
671
672 print '(A,4(1x,D24.15))',
673 & 'ibi QSW(Total, Penetrating)',
674 & SWDOWN(I,J,bi,bj), IcePenetSWFlux(I,J)
675
676 print '(A,4(1x,D24.15))',
677 & 'ibi qh(ATM ICE) ',
678 & AQH(I,J,bi,bj),qhice(I,J)
679
680 #ifndef SEAICE_SOLVE4TEMP_LEGACY
681 print '(A,4(1x,D24.15))',
682 & 'ibi F(lwd,swi,lwu) ',
683 & F_lwd(I,J), F_swi(I,J), F_lwu(I,J)
684
685 print '(A,4(1x,D24.15))',
686 & 'ibi F(c,lh,sens) ',
687 & F_c(I,J), F_lh(I,J), F_sens(I,J)
688
689 #ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
690 IF (F_lh_max(I,J) .GT. ZERO) THEN
691 print '(A,4(1x,D24.15))',
692 & 'ibi F_lh_max, F_lh/lhmax) ',
693 & F_lh_max(I,J), F_lh(I,J)/ F_lh_max(I,J)
694 ELSE
695 print '(A,4(1x,D24.15))',
696 & 'ibi F_lh_max = ZERO! '
697 ENDIF
698
699 print '(A,4(1x,D24.15))',
700 & 'ibi FWsub, FWsubm*dT/rhoI ',
701 & FWsublim(I,J),
702 & FWsublim(I,J)*SEAICE_deltaTtherm/SEAICE_rhoICE
703 #endif
704 #endif
705
706 print '(A,4(1x,D24.15))',
707 & 'ibi F_ia, F_ia_net, F_c ',
708 #ifdef SEAICE_SOLVE4TEMP_LEGACY
709 & -(A1(I,J)+A2(I,J)),
710 & -(A1(I,J)+A2(I,J)-F_c(I,J)),
711 & F_c(I,J)
712 #else /* SEAICE_SOLVE4TEMP_LEGACY */
713 & F_ia(I,J),
714 & F_ia_net(I,J),
715 & F_c(I,J)
716 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
717
718 print '(A)','----------------------------------------'
719
720 ENDIF
721 #endif /* SEAICE_DEBUG */
722
723 ENDIF !/* iceOrNot */
724 ENDDO !/* i */
725 ENDDO !/* j */
726
727 #endif /* ALLOW_ATM_TEMP && ALLOW_DOWNWARD_RADIATION */
728 RETURN
729 END

  ViewVC Help
Powered by ViewVC 1.1.22