/[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.24 - (show annotations) (download)
Wed Feb 1 23:58:09 2012 UTC (12 years, 4 months ago) by jmc
Branch: MAIN
Changes since 1.23: +52 -41 lines
- remove from F_ia (and it's derivative dFiDTs1) the contribution of
  conductive heat flux F_c , which is added explicitly when updating tsurf
  as solution of: Fc = Fia + d/dT(Fia - Fc) *delta.tsurf
  so that now F_ia has a consistent meaning through the entire routine.
- add two 2-D arrays (dFia_dTs & dqh_dTs) in prep for next modif.

1 C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_solve4temp.F,v 1.23 2012/01/31 15:57:17 jmc 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, IcePenetSW,
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 PARAMETERS:
53 C UG :: atmospheric wind speed (m/s)
54 C HICE_ACTUAL :: actual ice thickness
55 C HSNOW_ACTUAL :: actual snow thickness
56 C TSURF :: surface temperature of ice/snow in Kelvin
57 C bi,bj :: tile indices
58 C myTime :: current time in simulation
59 C myIter :: iteration number in simulation
60 C myThid :: my Thread Id number
61 C !OUTPUT PARAMETERS:
62 C TSURF :: updated surface temperature of ice/snow in Kelvin
63 C F_ia :: upward seaice/snow surface heat flux to atmosphere (W/m^2)
64 C IcePenetSW :: short wave heat flux transmitted through ice (+=upward)
65 C FWsublim :: fresh water (mass) flux due to sublimation (+=up)(kg/m^2/s)
66 C---- Notes:
67 C 1) should add IcePenetSW to F_ia to get the net surface heat flux
68 C from the atmosphere (IcePenetSW not currently included in F_ia)
69 C 2) since zero ice/snow heat capacity is assumed, all the absorbed Short
70 C -Wave is used to warm the ice/snow surface (heating profile ignored).
71 C----------
72 _RL UG (1:sNx,1:sNy)
73 _RL HICE_ACTUAL (1:sNx,1:sNy)
74 _RL HSNOW_ACTUAL(1:sNx,1:sNy)
75 #ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
76 _RL F_lh_max (1:sNx,1:sNy)
77 #endif
78 _RL TSURF (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
79 _RL F_ia (1:sNx,1:sNy)
80 _RL IcePenetSW (1:sNx,1:sNy)
81 _RL FWsublim (1:sNx,1:sNy)
82 INTEGER bi, bj
83 _RL myTime
84 INTEGER myIter, myThid
85 CEOP
86
87 #if defined(ALLOW_ATM_TEMP) && defined(ALLOW_DOWNWARD_RADIATION)
88 C !LOCAL VARIABLES:
89 C === Local variables ===
90 C i, j :: Loop counters
91 C kSrf :: vertical index of surface layer
92 INTEGER i, j
93 #ifdef SEAICE_VARIABLE_FREEZING_POINT
94 INTEGER kSrf
95 #endif /* SEAICE_VARIABLE_FREEZING_POINT */
96 INTEGER ITER
97 C TB :: ocean temperature in contact with ice (=seawater freezing point) (K)
98 _RL TB (1:sNx,1:sNy)
99 _RL D1, D1I
100 _RL D3(1:sNx,1:sNy)
101 _RL TMELT, XKI, XKS, HCUT, XIO
102 _RL SurfMeltTemp
103 C effConduct :: effective conductivity of combined ice and snow
104 _RL effConduct(1:sNx,1:sNy)
105 C lhSublim :: latent heat of sublimation (SEAICE_lhEvap + SEAICE_lhFusion)
106 _RL lhSublim
107 C t1,t2,t3,t4 :: powers of temperature
108 _RL t1, t2, t3, t4
109
110 C- Constants to calculate Saturation Vapor Pressure
111 #ifdef SEAICE_SOLVE4TEMP_LEGACY
112 C Maykut Polynomia Coeff. for Sat. Vapor Press
113 _RL C1, C2, C3, C4, C5, QS1
114 #else /* SEAICE_SOLVE4TEMP_LEGACY */
115 C Extended temp-range expon. relation Coeff. for Sat. Vapor Press
116 _RL lnTEN
117 _RL aa1,aa2,bb1,bb2,Ppascals,cc0,cc1,cc2,cc3t
118 C specific humidity at ice surface variables
119 _RL mm_pi,mm_log10pi
120 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
121
122 C F_c :: conductive heat flux through seaice+snow (+=upward)
123 C F_lh :: latent heat flux (sublimation) (+=upward)
124 C qhice :: saturation vapor pressure of snow/ice surface
125 C dqh_dTs :: derivative of qhice w.r.t snow/ice surf. temp
126 #ifdef SEAICE_SOLVE4TEMP_LEGACY
127 C A1 :: part of atmos surface flux (+=downward) independent of tsurf
128 C A2 :: part of atmos surface flux (+=upward) which depends on tsurf
129 C A3 :: derivative of (A2-F_c) w.r.t tsurf
130 _RL A2 (1:sNx,1:sNy)
131 _RL A3 (1:sNx,1:sNy)
132 _RL A1 (1:sNx,1:sNy)
133 #else /* SEAICE_SOLVE4TEMP_LEGACY */
134 C F_lwu :: upward long-wave surface heat flux (+=upward)
135 C F_sens :: sensible surface heat flux (+=upward)
136 C dFia_dTs :: derivative of surf heat flux (F_ia) w.r.t surf. temp
137 _RL F_lwu (1:sNx,1:sNy)
138 _RL F_sens (1:sNx,1:sNy)
139 _RL dFia_dTs (1:sNx,1:sNy)
140 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
141 _RL F_lh (1:sNx,1:sNy)
142 _RL F_c (1:sNx,1:sNy)
143 _RL qhice (1:sNx,1:sNy)
144 _RL dqh_dTs (1:sNx,1:sNy)
145 _RL absorbedSW (1:sNx,1:sNy)
146 _RL penetSWFrac
147
148 C local copies of global variables
149 _RL tsurfLoc (1:sNx,1:sNy)
150 _RL atempLoc (1:sNx,1:sNy)
151 _RL lwdownLoc (1:sNx,1:sNy)
152 _RL ALB (1:sNx,1:sNy)
153 _RL ALB_ICE (1:sNx,1:sNy)
154 _RL ALB_SNOW (1:sNx,1:sNy)
155 C iceOrNot :: this is HICE_ACTUAL.GT.0.
156 LOGICAL iceOrNot(1:sNx,1:sNy)
157 #ifdef SEAICE_DEBUG
158 C F_io_net :: upward conductive heat flux through seaice+snow
159 C F_ia_net :: net heat flux divergence at the sea ice/snow surface:
160 C includes ice conductive fluxes and atmospheric fluxes (W/m^2)
161 _RL F_io_net (1:sNx,1:sNy)
162 _RL F_ia_net (1:sNx,1:sNy)
163 #endif /* SEAICE_DEBUG */
164
165 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
166
167 #ifdef ALLOW_AUTODIFF_TAMC
168 CADJ INIT comlev1_solve4temp = COMMON, sNx*sNy*NMAX_TICE
169 #endif /* ALLOW_AUTODIFF_TAMC */
170
171 #ifdef SEAICE_SOLVE4TEMP_LEGACY
172 C- MAYKUT CONSTANTS FOR SAT. VAP. PRESSURE TEMP. POLYNOMIAL
173 C1= 2.7798202 _d -06
174 C2= -2.6913393 _d -03
175 C3= 0.97920849 _d +00
176 C4= -158.63779 _d +00
177 C5= 9653.1925 _d +00
178
179 QS1=0.622 _d +00/1013.0 _d +00
180 #else /* SEAICE_SOLVE4TEMP_LEGACY */
181 C- Extended temp-range expon. relation Coeff. for Sat. Vapor Press
182 lnTEN = LOG(10.0 _d 0)
183 aa1 = 2663.5 _d 0
184 aa2 = 12.537 _d 0
185 bb1 = 0.622 _d 0
186 bb2 = 1.0 _d 0 - bb1
187 Ppascals = 100000. _d 0
188 C cc0 = TEN ** aa2
189 cc0 = EXP(aa2*lnTEN)
190 cc1 = cc0*aa1*bb1*Ppascals*lnTEN
191 cc2 = cc0*bb2
192 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
193
194 #ifdef SEAICE_VARIABLE_FREEZING_POINT
195 kSrf = 1
196 #endif /* SEAICE_VARIABLE_FREEZING_POINT */
197
198 C SENSIBLE HEAT CONSTANT
199 D1=SEAICE_dalton*SEAICE_cpAir*SEAICE_rhoAir
200
201 C ICE LATENT HEAT CONSTANT
202 lhSublim = SEAICE_lhEvap + SEAICE_lhFusion
203 D1I=SEAICE_dalton*lhSublim*SEAICE_rhoAir
204
205 C MELTING TEMPERATURE OF ICE
206 TMELT = celsius2K
207 SurfMeltTemp = TMELT
208
209 C ICE CONDUCTIVITY
210 XKI=SEAICE_iceConduct
211
212 C SNOW CONDUCTIVITY
213 XKS=SEAICE_snowConduct
214
215 C CUTOFF SNOW THICKNESS
216 C Snow-Thickness above HCUT: SW optically thick snow (=> snow-albedo).
217 C Snow-Thickness below HCUT: linear transition to ice-albedo
218 HCUT = SEAICE_snowThick
219
220 C PENETRATION SHORTWAVE RADIATION FACTOR
221 XIO=SEAICE_shortwave
222
223 C-- until these become run-time params, set according to CPP OPTION:
224 #ifdef SEAICE_SOLVE4TEMP_LEGACY
225 C old SOLVE4TEMP_LEGACY setting, consistent with former celsius2K value:
226 c TMELT = 273.16 _d +00
227 c SurfMeltTemp = 273.159 _d +00
228 SurfMeltTemp = TMELT - 1. _d -3
229 #else /* SEAICE_SOLVE4TEMP_LEGACY */
230 HCUT = 0. _d 0
231 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
232
233 C Initialize variables
234 DO J=1,sNy
235 DO I=1,sNx
236 C HICE_ACTUAL is modified in this routine, but at the same time
237 C used to decided where there is ice, therefore we save this information
238 C here in a separate array
239 iceOrNot (I,J) = HICE_ACTUAL(I,J) .GT. 0. _d 0
240 IcePenetSW(I,J) = 0. _d 0
241 absorbedSW(I,J) = 0. _d 0
242 qhice (I,J) = 0. _d 0
243 dqh_dTs (I,J) = 0. _d 0
244 F_ia (I,J) = 0. _d 0
245 c F_io_net (I,J) = 0. _d 0
246 c F_ia_net (I,J) = 0. _d 0
247 F_lh (I,J) = 0. _d 0
248
249 C Reset the snow/ice surface to TMELT and bound the atmospheric temperature
250 #ifdef SEAICE_SOLVE4TEMP_LEGACY
251 A1(I,J) = 0.0 _d 0
252 A2(I,J) = 0.0 _d 0
253 A3(I,J) = 0.0 _d 0
254 tsurfLoc (I,J) = MIN( celsius2K+MAX_TICE, TSURF(I,J,bi,bj) )
255 lwdownLoc(I,J) = MAX( MIN_LWDOWN, LWDOWN(I,J,bi,bj) )
256 #else /* SEAICE_SOLVE4TEMP_LEGACY */
257 F_lwu (I,J) = 0. _d 0
258 F_sens (I,J) = 0. _d 0
259 tsurfLoc (I,J) = TSURF(I,J,bi,bj)
260 lwdownLoc(I,J) = LWDOWN(I,J,bi,bj)
261 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
262 atempLoc (I,J) = MAX( celsius2K+MIN_ATEMP, ATEMP(I,J,bi,bj) )
263
264 C FREEZING TEMPERATURE OF SEAWATER
265 #ifdef SEAICE_VARIABLE_FREEZING_POINT
266 C Use a variable seawater freezing point
267 TB(I,J) = -0.0575 _d 0*salt(I,J,kSrf,bi,bj) + 0.0901 _d 0
268 & + celsius2K
269 #else
270 C Use a constant freezing temperature (SEAICE_VARIABLE_FREEZING_POINT undef)
271 C old SOLVE4TEMP_LEGACY setting (not consistent with seaice_growth value)
272 c TB(I,J) = 271.2 _d 0
273 TB(I,J) = celsius2K + SEAICE_freeze
274 #endif /* SEAICE_VARIABLE_FREEZING_POINT */
275 IF(HSNOW_ACTUAL(I,J).GT.0.0) THEN
276 C Stefan-Boltzmann constant times emissivity
277 D3(I,J)=SEAICE_snow_emiss*SEAICE_boltzmann
278 #ifdef EXF_LWDOWN_WITH_EMISSIVITY
279 C This is now [(1-emiss)*lwdown - lwdown]
280 lwdownloc(I,J) = SEAICE_snow_emiss*lwdownloc(I,J)
281 #else /* use the old hard wired inconsistent value */
282 lwdownloc(I,J) = 0.97 _d 0*lwdownloc(I,J)
283 #endif /* EXF_LWDOWN_WITH_EMISSIVITY */
284 ELSE
285 C Stefan-Boltzmann constant times emissivity
286 D3(I,J)=SEAICE_ice_emiss*SEAICE_boltzmann
287 #ifdef EXF_LWDOWN_WITH_EMISSIVITY
288 C This is now [(1-emiss)*lwdown - lwdown]
289 lwdownloc(I,J) = SEAICE_ice_emiss*lwdownloc(I,J)
290 #else /* use the old hard wired inconsistent value */
291 lwdownloc(I,J) = 0.97 _d 0*lwdownloc(I,J)
292 #endif /* EXF_LWDOWN_WITH_EMISSIVITY */
293 ENDIF
294 ENDDO
295 ENDDO
296
297 DO J=1,sNy
298 DO I=1,sNx
299
300 C DECIDE ON ALBEDO
301 IF ( iceOrNot(I,J) ) THEN
302
303 IF ( YC(I,J,bi,bj) .LT. 0.0 _d 0 ) THEN
304 IF (tsurfLoc(I,J) .GE. SurfMeltTemp) THEN
305 ALB_ICE (I,J) = SEAICE_wetIceAlb_south
306 ALB_SNOW(I,J) = SEAICE_wetSnowAlb_south
307 ELSE ! no surface melting
308 ALB_ICE (I,J) = SEAICE_dryIceAlb_south
309 ALB_SNOW(I,J) = SEAICE_drySnowAlb_south
310 ENDIF
311 ELSE !/ Northern Hemisphere
312 IF (tsurfLoc(I,J) .GE. SurfMeltTemp) THEN
313 ALB_ICE (I,J) = SEAICE_wetIceAlb
314 ALB_SNOW(I,J) = SEAICE_wetSnowAlb
315 ELSE ! no surface melting
316 ALB_ICE (I,J) = SEAICE_dryIceAlb
317 ALB_SNOW(I,J) = SEAICE_drySnowAlb
318 ENDIF
319 ENDIF !/ Albedo for snow and ice
320
321 C If actual snow thickness exceeds the cutoff thickness, use snow albedo
322 IF (HSNOW_ACTUAL(I,J) .GT. HCUT) THEN
323 ALB(I,J) = ALB_SNOW(I,J)
324 ELSEIF ( HCUT.LE.ZERO ) THEN
325 ALB(I,J) = ALB_ICE(I,J)
326 ELSE
327 C otherwise, use linear transition between ice and snow albedo
328 ALB(I,J) = MIN( ALB_ICE(I,J) + HSNOW_ACTUAL(I,J)/HCUT
329 & *(ALB_SNOW(I,J) -ALB_ICE(I,J))
330 & , ALB_SNOW(I,J) )
331 ENDIF
332
333 C Determine the fraction of shortwave radiative flux remaining
334 C at ocean interface after scattering through the snow and ice.
335 C If snow is present, no radiation penetrates through snow+ice
336 IF (HSNOW_ACTUAL(I,J) .GT. 0.0 _d 0) THEN
337 penetSWFrac = 0.0 _d 0
338 ELSE
339 penetSWFrac = XIO*EXP(-1.5 _d 0 * HICE_ACTUAL(I,J))
340 ENDIF
341 C The shortwave radiative flux leaving ocean beneath ice (+=up).
342 IcePenetSW(I,J) = -(1.0 _d 0 - ALB(I,J))
343 & *penetSWFrac * SWDOWN(I,J,bi,bj)
344 C The shortwave radiative flux convergence in the seaice.
345 absorbedSW(I,J) = (1.0 _d 0 - ALB(I,J))
346 & *(1.0 _d 0 - penetSWFrac)* SWDOWN(I,J,bi,bj)
347
348 #ifdef SEAICE_SOLVE4TEMP_LEGACY
349 C Now determine fixed (relative to tsurf) forcing term in heat budget
350 A1(I,J) = absorbedSW(I,J) + lwdownLoc(I,J)
351 & +D1*UG(I,J)*atempLoc(I,J)+D1I*UG(I,J)*AQH(I,J,bi,bj)
352 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
353
354 C The effective conductivity of the two-layer snow/ice system.
355 #ifdef SEAICE_SOLVE4TEMP_LEGACY
356 effConduct(I,J)=
357 & XKS/(HSNOW_ACTUAL(I,J)/HICE_ACTUAL(I,J) +
358 & XKS/XKI)/HICE_ACTUAL(I,J)
359 #else /* SEAICE_SOLVE4TEMP_LEGACY */
360 C Set a mininum sea ice thickness of 5 cm to bound
361 C the magnitude of conductive heat fluxes.
362 Cif * now taken care of by SEAICE_hice_reg in seaice_growth
363 c hice_tmp = max(HICE_ACTUAL(I,J),5. _d -2)
364 effConduct(I,J) = XKI * XKS /
365 & (XKS * HICE_ACTUAL(I,J) + XKI * HSNOW_ACTUAL(I,J))
366 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
367
368 #ifdef SEAICE_DEBUG
369 IF ( (I .EQ. SEAICE_debugPointI) .AND.
370 & (J .EQ. SEAICE_debugPointJ) ) THEN
371 print '(A,i6)','-----------------------------------'
372 print '(A,i6)','ibi merged initialization ', myIter
373 print '(A,i6,4(1x,D24.15))',
374 & 'ibi iter, TSL, TS ',myIter,
375 & tsurfLoc(I,J), TSURF(I,J,bi,bj)
376 print '(A,i6,4(1x,D24.15))',
377 & 'ibi iter, TMELT ',myIter,TMELT
378 print '(A,i6,4(1x,D24.15))',
379 & 'ibi iter, HIA, EFKCON ',myIter,
380 & HICE_ACTUAL(I,J), effConduct(I,J)
381 print '(A,i6,4(1x,D24.15))',
382 & 'ibi iter, HSNOW ',myIter,
383 & HSNOW_ACTUAL(I,J), ALB(I,J)
384 print '(A,i6)','-----------------------------------'
385 print '(A,i6)','ibi energy balance iterat ', myIter
386 ENDIF
387 #endif /* SEAICE_DEBUG */
388
389 ENDIF !/* iceOrNot */
390 ENDDO !/* i */
391 ENDDO !/* j */
392
393 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
394 DO ITER=1,IMAX_TICE
395 DO J=1,sNy
396 DO I=1,sNx
397 #ifdef ALLOW_AUTODIFF_TAMC
398 iicekey = I + sNx*(J-1) + (ITER-1)*sNx*sNy
399 CADJ STORE tsurfloc(i,j) = comlev1_solve4temp,
400 CADJ & key = iicekey, byte = isbyte
401 #endif /* ALLOW_AUTODIFF_TAMC */
402
403 IF ( iceOrNot(I,J) ) THEN
404
405 t1 = tsurfLoc(I,J)
406 t2 = t1*t1
407 t3 = t2*t1
408 t4 = t2*t2
409
410 C-- Calculate the specific humidity in the BL above the snow/ice
411 #ifdef SEAICE_SOLVE4TEMP_LEGACY
412 C- Use the Maykut polynomial
413 qhice(I,J)=QS1*(C1*t4+C2*t3 +C3*t2+C4*t1+C5)
414 dqh_dTs(I,J) = 0. _d 0
415
416 #else /* SEAICE_SOLVE4TEMP_LEGACY */
417 C- Use exponential relation approx., more accurate at low temperatures
418 C log 10 of the sat vap pressure
419 mm_log10pi = -aa1 / t1 + aa2
420 C The saturation vapor pressure (SVP) in the surface
421 C boundary layer (BL) above the snow/ice.
422 c mm_pi = TEN **(mm_log10pi)
423 C The following form does the same, but is faster
424 mm_pi = EXP(mm_log10pi*lnTEN)
425 qhice(I,J) = bb1*mm_pi/( Ppascals -(1.0 _d 0 - bb1)*mm_pi )
426 C A constant for SVP derivative w.r.t TICE
427 c cc3t = TEN **(aa1 / t1)
428 C The following form does the same, but is faster
429 cc3t = EXP(aa1 / t1 * lnTEN)
430 C d(qh)/d(TICE)
431 dqh_dTs(I,J) = cc1*cc3t/((cc2-cc3t*Ppascals)**2 *t2)
432 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
433
434 C Calculate the flux terms based on the updated tsurfLoc
435 F_c(I,J) = effConduct(I,J)*(TB(I,J)-tsurfLoc(I,J))
436 F_lh(I,J) = D1I*UG(I,J)*(qhice(I,J)-AQH(I,J,bi,bj))
437 #ifdef SEAICE_SOLVE4TEMP_LEGACY
438 A2(I,J) = D1*UG(I,J)*t1+D1I*UG(I,J)*qhice(I,J)+D3(I,J)*t4
439 A3(I,J) = 4.0 _d 0*D3(I,J)*t3 + effConduct(I,J)+D1*UG(I,J)
440 & + D1I*UG(I,J)*dqh_dTs(I,J)
441 #else /* SEAICE_SOLVE4TEMP_LEGACY */
442 #ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
443 C if the latent heat flux implied by tsurfLoc exceeds
444 C F_lh_max, cap F_lh and decouple the flux magnitude from TICE
445 IF (F_lh(I,J) .GT. F_lh_max(I,J)) THEN
446 F_lh(I,J) = F_lh_max(I,J)
447 dqh_dTs(I,J) = ZERO
448 ENDIF
449 #endif /* SEAICE_ADD_SUBLIMATION_TO_FWBUDGET */
450
451 C d(F_ia)/d(Tsurf)
452 dFia_dTs(I,J) = 4.0 _d 0*D3(I,J)*t3 + D1*UG(I,J)
453 & + D1I*UG(I,J)*dqh_dTs(I,J)
454
455 F_lwu(I,J) = t4 * D3(I,J)
456 F_sens(I,J)= D1 * UG(I,J) * (t1 - atempLoc(I,J))
457 F_ia(I,J) = -lwdownLoc(I,J) -absorbedSW(I,J) + F_lwu(I,J)
458 & + F_sens(I,J) + F_lh(I,J)
459 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
460
461 #ifdef SEAICE_DEBUG
462 IF ( (I .EQ. SEAICE_debugPointI) .AND.
463 & (J .EQ. SEAICE_debugPointJ) ) THEN
464 print '(A,i6,4(1x,D24.15))',
465 & 'ice-iter qhICE, ', ITER,qhIce(I,J)
466 #ifdef SEAICE_SOLVE4TEMP_LEGACY
467 print '(A,i6,4(1x,D24.15))',
468 & 'ice-iter A1 A2 B ',ITER,A1(I,J),A2(I,J),F_c(I,J)
469 print '(A,i6,4(1x,D24.15))',
470 & 'ice-iter A3 (-A1+A2) ',ITER,A3(I,J),-A1(I,J)+A2(I,J)
471 #else /* SEAICE_SOLVE4TEMP_LEGACY */
472 print '(A,i6,4(1x,D24.15))',
473 & 'ice-iter dFiDTs1 F_ia ', ITER,
474 & dFia_dTs(I,J)+effConduct(I,J), F_ia(I,J)-F_c(I,J)
475 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
476 ENDIF
477 #endif /* SEAICE_DEBUG */
478
479 C Update tsurfLoc
480 #ifdef SEAICE_SOLVE4TEMP_LEGACY
481 C update tsurf as solution of : Fc = A2 - A1 + A3 *delta.tsurf
482 tsurfLoc(I,J)=tsurfLoc(I,J)
483 & +(A1(I,J)-A2(I,J)+F_c(I,J))/A3(I,J)
484 tsurfLoc(I,J) = MAX( celsius2K+MIN_TICE, tsurfLoc(I,J) )
485
486 #else /* SEAICE_SOLVE4TEMP_LEGACY */
487 C update tsurf as solution of : Fc = Fia + d/dT(Fia - Fc) *delta.tsurf
488 tsurfLoc(I,J) = tsurfLoc(I,J)
489 & + ( F_c(I,J)-F_ia(I,J) ) / ( effConduct(I,J)+dFia_dTs(I,J) )
490
491 C If the search leads to tsurfLoc < 50 Kelvin, restart the search
492 C at tsurfLoc = TMELT. Note that one solution to the energy balance problem
493 C is an extremely low temperature - a temperature far below realistic values.
494 IF (tsurfLoc(I,J) .LT. 50.0 _d 0 ) THEN
495 tsurfLoc(I,J) = TMELT
496 ENDIF
497 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
498 tsurfLoc(I,J) = MIN( tsurfLoc(I,J), TMELT )
499
500 #ifdef SEAICE_DEBUG
501 IF ( (I .EQ. SEAICE_debugPointI) .AND.
502 & (J .EQ. SEAICE_debugPointJ) ) THEN
503 print '(A,i6,4(1x,D24.15))',
504 & 'ice-iter tsurfLc,|dif|', ITER,
505 & tsurfLoc(I,J),
506 & LOG10(ABS(tsurfLoc(I,J) - t1))
507 ENDIF
508 #endif /* SEAICE_DEBUG */
509
510 ENDIF !/* iceOrNot */
511 ENDDO !/* i */
512 ENDDO !/* j */
513 ENDDO !/* Iterations */
514 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
515
516 DO J=1,sNy
517 DO I=1,sNx
518 IF ( iceOrNot(I,J) ) THEN
519
520 C Save updated tsurf and finalize the flux terms
521 TSURF(I,J,bi,bj) = tsurfLoc(I,J)
522
523 #ifdef SEAICE_SOLVE4TEMP_LEGACY
524 F_ia(I,J)=-A1(I,J)+A2(I,J)
525 #else /* SEAICE_SOLVE4TEMP_LEGACY */
526 C Recalculate the fluxes based on the (possibly) adjusted TSURF
527 t1 = tsurfLoc(I,J)
528 t2 = t1*t1
529 t3 = t2*t1
530 t4 = t2*t2
531
532 C log 10 of the sat vap pressure
533 mm_log10pi = -aa1 / t1 + aa2
534 C saturation vapor pressure
535 c mm_pi = TEN **(mm_log10pi)
536 C The following form does the same, but is faster
537 mm_pi = EXP(mm_log10pi*lnTEN)
538 C over ice specific humidity
539 qhice(I,J) = bb1*mm_pi/( Ppascals -(1.0 _d 0 - bb1)*mm_pi )
540 F_lh(I,J) = D1I * UG(I,J)*(qhice(I,J)-AQH(I,J,bi,bj))
541 #ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
542 IF (F_lh(I,J) .GT. F_lh_max(I,J)) THEN
543 F_lh(I,J) = F_lh_max(I,J)
544 ENDIF
545 #endif /* SEAICE_ADD_SUBLIMATION_TO_FWBUDGET */
546
547 F_c(I,J) = effConduct(I,J) * (TB(I,J) - t1)
548 F_lwu(I,J) = t4 * D3(I,J)
549 F_sens(I,J) = D1 * UG(I,J) * (t1 - atempLoc(I,J))
550
551 C The flux between the ice/snow surface and the atmosphere.
552 F_ia(I,J) = -lwdownLoc(I,J) -absorbedSW(I,J) + F_lwu(I,J)
553 & + F_sens(I,J) + F_lh(I,J)
554 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
555
556 #ifdef SEAICE_MODIFY_GROWTH_ADJ
557 Cgf no additional dependency through solver, snow, etc.
558 IF ( SEAICEadjMODE.GE.2 ) THEN
559 CALL ZERO_ADJ_1D( 1, TSURF(I,J,bi,bj), myThid)
560 t1 = TSURF(I,J,bi,bj)
561 t2 = t1*t1
562 t3 = t2*t1
563 t4 = t2*t2
564 qhice(I,J)=QS1*(C1*t4+C2*t3 +C3*t2+C4*t1+C5)
565
566 A1(I,J)=0.3 _d 0 *SWDOWN(I,J,bi,bj)+lwdownLoc(I,J)
567 & +D1*UG(I,J)*atempLoc(I,J)+D1I*UG(I,J)*AQH(I,J,bi,bj)
568 A2(I,J)= D1*UG(I,J)*t1+D1I*UG(I,J)*qhice(I,J)+D3(I,J)*t4
569
570 F_ia(I,J)=-A1(I,J)+A2(I,J)
571 IcePenetSW(I,J)= 0. _d 0
572 ENDIF
573 #endif /* SEAICE_MODIFY_GROWTH_ADJ */
574
575 C Fresh water flux (kg/m^2/s) from latent heat of sublimation.
576 C F_lh is positive upward (sea ice looses heat) and FWsublim
577 C is also positive upward (atmosphere gains freshwater)
578 FWsublim(I,J) = F_lh(I,J)/lhSublim
579
580 #ifdef SEAICE_DEBUG
581 C Caclulate the net ice-ocean and ice-atmosphere fluxes
582 IF (F_c(I,J) .GT. 0.0 _d 0) THEN
583 F_io_net(I,J) = F_c(I,J)
584 F_ia_net(I,J) = 0.0 _d 0
585 ELSE
586 F_io_net(I,J) = 0.0 _d 0
587 F_ia_net(I,J) = F_ia(I,J)
588 ENDIF !/* conductive fluxes up or down */
589
590 IF ( (I .EQ. SEAICE_debugPointI) .AND.
591 & (J .EQ. SEAICE_debugPointJ) ) THEN
592 print '(A)','----------------------------------------'
593 print '(A,i6)','ibi complete ', myIter
594 print '(A,4(1x,D24.15))',
595 & 'ibi T(SURF, surfLoc,atmos) ',
596 & TSURF(I,J,bi,bj), tsurfLoc(I,J),atempLoc(I,J)
597 print '(A,4(1x,D24.15))',
598 & 'ibi LWL ', lwdownLoc(I,J)
599 print '(A,4(1x,D24.15))',
600 & 'ibi QSW(Total, Penetrating)',
601 & SWDOWN(I,J,bi,bj), IcePenetSW(I,J)
602 print '(A,4(1x,D24.15))',
603 & 'ibi qh(ATM ICE) ',
604 & AQH(I,J,bi,bj),qhice(I,J)
605 #ifndef SEAICE_SOLVE4TEMP_LEGACY
606 print '(A,4(1x,D24.15))',
607 & 'ibi F(lwd,swi,lwu) ',
608 & -lwdownLoc(I,J), -absorbedSW(I,J), F_lwu(I,J)
609 print '(A,4(1x,D24.15))',
610 & 'ibi F(c,lh,sens) ',
611 & F_c(I,J), F_lh(I,J), F_sens(I,J)
612 #ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
613 IF (F_lh_max(I,J) .GT. ZERO) THEN
614 print '(A,4(1x,D24.15))',
615 & 'ibi F_lh_max, F_lh/lhmax) ',
616 & F_lh_max(I,J), F_lh(I,J)/ F_lh_max(I,J)
617 ELSE
618 print '(A,4(1x,D24.15))',
619 & 'ibi F_lh_max = ZERO! '
620 ENDIF
621 print '(A,4(1x,D24.15))',
622 & 'ibi FWsub, FWsubm*dT/rhoI ',
623 & FWsublim(I,J),
624 & FWsublim(I,J)*SEAICE_deltaTtherm/SEAICE_rhoICE
625 #endif /* SEAICE_ADD_SUBLIMATION_TO_FWBUDGET */
626 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
627 print '(A,4(1x,D24.15))',
628 & 'ibi F_ia, F_ia_net, F_c ',
629 #ifdef SEAICE_SOLVE4TEMP_LEGACY
630 & -A1(I,J)+A2(I,J), -A1(I,J)+A2(I,J)-F_c(I,J), F_c(I,J)
631 #else /* SEAICE_SOLVE4TEMP_LEGACY */
632 & F_ia(I,J), F_ia_net(I,J), F_c(I,J)
633 #endif /* SEAICE_SOLVE4TEMP_LEGACY */
634 print '(A)','----------------------------------------'
635 ENDIF
636 #endif /* SEAICE_DEBUG */
637
638 ENDIF !/* iceOrNot */
639 ENDDO !/* i */
640 ENDDO !/* j */
641
642 #endif /* ALLOW_ATM_TEMP && ALLOW_DOWNWARD_RADIATION */
643 RETURN
644 END

  ViewVC Help
Powered by ViewVC 1.1.22