/[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.8 - (show annotations) (download)
Thu Nov 25 16:42:33 2010 UTC (13 years, 6 months ago) by mlosch
Branch: MAIN
Changes since 1.7: +14 -1 lines
 explicitly store tsurfloc in seaice_solve4temp.F to avoid
 unnecessary copying in adjoint code, requires new parameter NMAX_ITER

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

  ViewVC Help
Powered by ViewVC 1.1.22