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

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

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


Revision 1.14 - (hide annotations) (download)
Sun Jun 19 02:31:40 2011 UTC (12 years, 11 months ago) by ifenty
Branch: MAIN
Changes since 1.13: +8 -3 lines
Minor changes to seaice package.

1) Retired old variables (A22, SEAICE_lhsublim, areaMax, areaMin, hiceMin) and
   added some new ones (SEAICE_area_reg, SEAICE_hice_reg, SEAICE_area_floor)

  - Differentiated "regularization variables" from "floor variables"
    * areaMin became SEAICE_area_reg (old A22) and SEAICE_area_floor
    * hiceMin became SEAICE_hice_reg (old hiceMin)
     (with _reg meaning regularization variable)

  - SEAICE_lhSublim becomes lhSublim, the sum of SEAICE_lhEvap and SEAICE_lhFusion
    so as to ensure energy conservation when going between phases

  - A22 was not used anywhere

2) Changed regularization procedure for heffActual and hsnowActual to ensure
   well-boundedness and smooth adjoint in seaice_growth.F

3) Fixed a bug where seaice_solve4temp would not recognize ice-free grid cells
   because the old regularization always set heffActual >= 0.05 cm

4) Changed the model so that the default behavior is to put a small (10^-5) "floor"
   on AREA when HEFF > 0.
   - went from requiring ALLOW_PRECLUDE_INFINITESIMAL_AREA to be defined to
     requiring that DISABLE_AREA_FLOOR *not* be defined

 Modified Files:
 	SEAICE_PARAMS.h seaice_check.F seaice_growth.F
 	seaice_readparms.F seaice_solve4temp.F seaice_summary.F

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

  ViewVC Help
Powered by ViewVC 1.1.22