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

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

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


Revision 1.110 - (show annotations) (download)
Wed Feb 9 12:27:14 2011 UTC (13 years, 4 months ago) by gforget
Branch: MAIN
Changes since 1.109: +39 -13 lines
- McPhee formula for Ice-Ocean fluxes (provided by Ian Fenty).

1 C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_growth.F,v 1.109 2010/12/16 08:32:04 mlosch Exp $
2 C $Name: $
3
4 #include "SEAICE_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: SEAICE_GROWTH
8 C !INTERFACE:
9 SUBROUTINE SEAICE_GROWTH( myTime, myIter, myThid )
10 C !DESCRIPTION: \bv
11 C *==========================================================*
12 C | SUBROUTINE seaice_growth
13 C | o Updata ice thickness and snow depth
14 C *==========================================================*
15 C \ev
16
17 C !USES:
18 IMPLICIT NONE
19 C === Global variables ===
20 #include "SIZE.h"
21 #include "EEPARAMS.h"
22 #include "PARAMS.h"
23 #include "DYNVARS.h"
24 #include "GRID.h"
25 #include "FFIELDS.h"
26 #include "SEAICE_PARAMS.h"
27 #include "SEAICE.h"
28 #ifdef ALLOW_EXF
29 # include "EXF_OPTIONS.h"
30 # include "EXF_FIELDS.h"
31 # include "EXF_PARAM.h"
32 #endif
33 #ifdef ALLOW_SALT_PLUME
34 # include "SALT_PLUME.h"
35 #endif
36 #ifdef ALLOW_AUTODIFF_TAMC
37 # include "tamc.h"
38 #endif
39
40 C !INPUT/OUTPUT PARAMETERS:
41 C === Routine arguments ===
42 C myTime :: Simulation time
43 C myIter :: Simulation timestep number
44 C myThid :: Thread no. that called this routine.
45 _RL myTime
46 INTEGER myIter, myThid
47
48 C !FUNCTIONS:
49 #ifdef ALLOW_DIAGNOSTICS
50 LOGICAL DIAGNOSTICS_IS_ON
51 EXTERNAL DIAGNOSTICS_IS_ON
52 #endif
53
54 C !LOCAL VARIABLES:
55 C === Local variables ===
56 C
57 C unit/sign convention:
58 C Within the thermodynamic computation all stocks, except HSNOW,
59 C are in 'effective ice meters' units, and >0 implies more ice.
60 C This holds for stocks due to ocean and atmosphere heat,
61 C at the outset of 'PART 2: determine heat fluxes/stocks'
62 C and until 'PART 7: determine ocean model forcing'
63 C This strategy minimizes the need for multiplications/divisions
64 C by ice fraction, heat capacity, etc. The only conversions that
65 C occurs are for the HSNOW (in effective snow meters) and
66 C PRECIP (fresh water m/s).
67 C
68 C HEFF is effective Hice thickness (m3/m2)
69 C HSNOW is Heffective snow thickness (m3/m2)
70 C HSALT is Heffective salt content (g/m2)
71 C AREA is the seaice cover fraction (0<=AREA<=1)
72 C Q denotes heat stocks -- converted to ice stocks (m3/m2) early on
73 C
74 C For all other stocks/increments, such as d_HEFFbyATMonOCN
75 C or a_QbyATM_cover, the naming convention is as follows:
76 C The prefix 'a_' means available, the prefix 'd_' means delta
77 C (i.e. increment), and the prefix 'r_' means residual.
78 C The suffix '_cover' denotes a value for the ice covered fraction
79 C of the grid cell, whereas '_open' is for the open water fraction.
80 C The main part of the name states what ice/snow stock is concerned
81 C (e.g. QbyATM or HEFF), and how it is affected (e.g. d_HEFFbyATMonOCN
82 C is the increment of HEFF due to the ATMosphere extracting heat from the
83 C OCeaN surface, or providing heat to the OCeaN surface).
84
85 CEOP
86 C i,j,bi,bj :: Loop counters
87 INTEGER i, j, bi, bj
88 C number of surface interface layer
89 INTEGER kSurface
90 C constants
91 _RL TBC, ICE2SNOW
92 _RL QI, QS
93
94 C a_QbyATM_cover :: available heat (in W/m^2) due to the interaction of
95 C the atmosphere and the ocean surface - for ice covered water
96 C a_QbyATM_open :: same but for open water
97 C r_QbyATM_cover :: residual of a_QbyATM_cover after freezing/melting processes
98 C r_QbyATM_open :: same but for open water
99 _RL a_QbyATM_cover (1:sNx,1:sNy)
100 _RL a_QbyATM_open (1:sNx,1:sNy)
101 _RL r_QbyATM_cover (1:sNx,1:sNy)
102 _RL r_QbyATM_open (1:sNx,1:sNy)
103 C a_QSWbyATM_open - short wave heat flux over ocean in W/m^2
104 C a_QSWbyATM_cover - short wave heat flux under ice in W/m^2
105 _RL a_QSWbyATM_open (1:sNx,1:sNy)
106 _RL a_QSWbyATM_cover (1:sNx,1:sNy)
107 C a_QbyOCN :: available heat (in in W/m^2) due to the
108 C interaction of the ice pack and the ocean surface
109 C r_QbyOCN :: residual of a_QbyOCN after freezing/melting
110 C processes have been accounted for
111 _RL a_QbyOCN (1:sNx,1:sNy)
112 _RL r_QbyOCN (1:sNx,1:sNy)
113
114 C conversion factors to go from Q (W/m2) to HEFF (ice meters)
115 _RL convertQ2HI, convertHI2Q
116 C conversion factors to go from precip (m/s) unit to HEFF (ice meters)
117 _RL convertPRECIP2HI, convertHI2PRECIP
118
119 C ICE/SNOW stocks tendencies associated with the various melt/freeze processes
120 _RL d_AREAbyATM (1:sNx,1:sNy)
121
122 _RL d_HEFFbyNEG (1:sNx,1:sNy)
123 _RL d_HEFFbyOCNonICE (1:sNx,1:sNy)
124 _RL d_HEFFbyATMonOCN (1:sNx,1:sNy)
125 _RL d_HEFFbyFLOODING (1:sNx,1:sNy)
126
127 _RL d_HEFFbyATMonOCN_open(1:sNx,1:sNy)
128
129 _RL d_HSNWbyNEG (1:sNx,1:sNy)
130 _RL d_HSNWbyATMonSNW (1:sNx,1:sNy)
131 _RL d_HSNWbyOCNonSNW (1:sNx,1:sNy)
132 _RL d_HSNWbyRAIN (1:sNx,1:sNy)
133
134 _RL d_HFRWbyRAIN (1:sNx,1:sNy)
135 C
136 C a_FWbySublim :: fresh water flux implied by latent heat of
137 C sublimation to atmosphere, same sign convention
138 C as EVAP (positive upward)
139 _RL a_FWbySublim (1:sNx,1:sNy)
140 #ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
141 _RL d_HEFFbySublim (1:sNx,1:sNy)
142 _RL d_HSNWbySublim (1:sNx,1:sNy)
143 _RL rodt, rrodt
144 #endif /* SEAICE_ADD_SUBLIMATION_TO_FWBUDGET */
145
146 C actual ice thickness with upper and lower limit
147 _RL heffActual (1:sNx,1:sNy)
148 C actual snow thickness
149 _RL hsnowActual (1:sNx,1:sNy)
150
151 C AREA_PRE :: hold sea-ice fraction field before any seaice-thermo update
152 _RL AREApreTH (1:sNx,1:sNy)
153 _RL HEFFpreTH (1:sNx,1:sNy)
154 _RL HSNWpreTH (1:sNx,1:sNy)
155
156 C wind speed
157 _RL UG (1:sNx,1:sNy)
158 #ifdef ALLOW_ATM_WIND
159 _RL SPEED_SQ
160 #endif
161
162 C pathological cases thresholds
163 _RL heffTooThin, heffTooHeavy
164
165 C temporary variables available for the various computations
166 #ifdef SEAICE_GROWTH_LEGACY
167 _RL tmpscal0
168 #endif
169 _RL tmpscal1, tmpscal2, tmpscal3, tmpscal4
170 _RL tmparr1 (1:sNx,1:sNy)
171
172 #ifdef ALLOW_SEAICE_FLOODING
173 _RL hDraft
174 #endif /* ALLOW_SEAICE_FLOODING */
175
176 #ifdef SEAICE_SALINITY
177 _RL saltFluxAdjust (1:sNx,1:sNy)
178 #endif
179
180 INTEGER nDim
181 #ifdef SEAICE_MULTICATEGORY
182 INTEGER ilockey
183 PARAMETER ( nDim = MULTDIM )
184 INTEGER it
185 _RL pFac
186 _RL heffActualP (1:sNx,1:sNy)
187 _RL a_QbyATMmult_cover (1:sNx,1:sNy)
188 _RL a_QSWbyATMmult_cover(1:sNx,1:sNy)
189 _RL a_FWbySublimMult (1:sNx,1:sNy)
190 #else
191 PARAMETER ( nDim = 1 )
192 #endif /* SEAICE_MULTICATEGORY */
193
194 #ifdef MCPHEE_OCEAN_ICE_HEAT_FLUX
195 C Mixed Layer factor (dimensionless)
196 _RL mlTurbFac
197 c Stanton number (dimensionless)
198 _RL STANTON_NUMBER
199 c Friction velocity (m/s)
200 _RL USTAR_BASE
201 #endif
202
203 #ifdef ALLOW_DIAGNOSTICS
204 _RL DIAGarray (1:sNx,1:sNy)
205 #endif
206
207 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
208
209 C ===================================================================
210 C =================PART 0: constants and initializations=============
211 C ===================================================================
212
213 IF ( buoyancyRelation .EQ. 'OCEANICP' ) THEN
214 kSurface = Nr
215 ELSE
216 kSurface = 1
217 ENDIF
218
219 C Cutoff for very thin ice
220 heffTooThin=1. _d -5
221 C Cutoff for iceload
222 heffTooHeavy=dRf(kSurface) / 5. _d 0
223
224 C FREEZING TEMP. OF SEA WATER (deg C)
225 TBC = SEAICE_freeze
226
227 C RATIO OF SEA ICE DENSITY to SNOW DENSITY
228 ICE2SNOW = SEAICE_rhoIce/SEAICE_rhoSnow
229
230 C HEAT OF FUSION OF ICE (J/m^3)
231 QI = SEAICE_rhoIce*SEAICE_lhFusion
232 C HEAT OF FUSION OF SNOW (J/m^3)
233 QS = SEAICE_rhoSnow*SEAICE_lhFusion
234 C
235 C note that QI/QS=ICE2SNOW -- except it wasnt in old code
236
237 C conversion factors to go from Q (W/m2) to HEFF (ice meters)
238 convertQ2HI=SEAICE_deltaTtherm/QI
239 convertHI2Q=1/convertQ2HI
240 C conversion factors to go from precip (m/s) unit to HEFF (ice meters)
241 convertPRECIP2HI=SEAICE_deltaTtherm*rhoConstFresh/SEAICE_rhoIce
242 convertHI2PRECIP=1./convertPRECIP2HI
243
244 #ifdef MCPHEE_OCEAN_ICE_HEAT_FLUX
245 STANTON_NUMBER = 0.0056 _d 0
246 USTAR_BASE = 0.0125 _d 0
247 #endif
248
249 DO bj=myByLo(myThid),myByHi(myThid)
250 DO bi=myBxLo(myThid),myBxHi(myThid)
251
252 #ifdef ALLOW_AUTODIFF_TAMC
253 act1 = bi - myBxLo(myThid)
254 max1 = myBxHi(myThid) - myBxLo(myThid) + 1
255 act2 = bj - myByLo(myThid)
256 max2 = myByHi(myThid) - myByLo(myThid) + 1
257 act3 = myThid - 1
258 max3 = nTx*nTy
259 act4 = ikey_dynamics - 1
260 iicekey = (act1 + 1) + act2*max1
261 & + act3*max1*max2
262 & + act4*max1*max2*max3
263 #endif /* ALLOW_AUTODIFF_TAMC */
264
265
266 C array initializations
267 C =====================
268
269 DO J=1,sNy
270 DO I=1,sNx
271 a_QbyATM_cover (I,J) = 0.0 _d 0
272 a_QbyATM_open(I,J) = 0.0 _d 0
273 r_QbyATM_cover (I,J) = 0.0 _d 0
274 r_QbyATM_open (I,J) = 0.0 _d 0
275
276 a_QSWbyATM_open (I,J) = 0.0 _d 0
277 a_QSWbyATM_cover (I,J) = 0.0 _d 0
278
279 a_QbyOCN (I,J) = 0.0 _d 0
280 r_QbyOCN (I,J) = 0.0 _d 0
281
282 d_AREAbyATM(I,J) = 0.0 _d 0
283
284 d_HEFFbyOCNonICE(I,J) = 0.0 _d 0
285 d_HEFFbyATMonOCN(I,J) = 0.0 _d 0
286 d_HEFFbyFLOODING(I,J) = 0.0 _d 0
287
288 d_HEFFbyATMonOCN_open(I,J) = 0.0 _d 0
289
290 d_HSNWbyATMonSNW(I,J) = 0.0 _d 0
291 d_HSNWbyOCNonSNW(I,J) = 0.0 _d 0
292 d_HSNWbyRAIN(I,J) = 0.0 _d 0
293 a_FWbySublim(I,J) = 0.0 _d 0
294 #ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
295 d_HEFFbySublim(I,J) = 0.0 _d 0
296 d_HSNWbySublim(I,J) = 0.0 _d 0
297 #endif /* SEAICE_ADD_SUBLIMATION_TO_FWBUDGET */
298 c
299 d_HFRWbyRAIN(I,J) = 0.0 _d 0
300
301 tmparr1(I,J) = 0.0 _d 0
302
303 #ifdef SEAICE_SALINITY
304 saltFluxAdjust(I,J) = 0.0 _d 0
305 #endif
306 #ifdef SEAICE_MULTICATEGORY
307 a_QbyATMmult_cover(I,J) = 0.0 _d 0
308 a_QSWbyATMmult_cover(I,J) = 0.0 _d 0
309 a_FWbySublimMult(I,J) = 0.0 _d 0
310 #endif /* SEAICE_MULTICATEGORY */
311 ENDDO
312 ENDDO
313 #ifdef ALLOW_MEAN_SFLUX_COST_CONTRIBUTION
314 DO J=1-oLy,sNy+oLy
315 DO I=1-oLx,sNx+oLx
316 frWtrAtm(I,J,bi,bj) = 0.0 _d 0
317 ENDDO
318 ENDDO
319 #endif
320
321
322 C =====================================================================
323 C ===========PART 1: treat pathological cases (post advdiff)===========
324 C =====================================================================
325
326 #ifdef SEAICE_GROWTH_LEGACY
327
328 DO J=1,sNy
329 DO I=1,sNx
330 HEFFpreTH(I,J)=HEFFNM1(I,J,bi,bj)
331 HSNWpreTH(I,J)=HSNOW(I,J,bi,bj)
332 AREApreTH(I,J)=AREANM1(I,J,bi,bj)
333 d_HEFFbyNEG(I,J)=0. _d 0
334 d_HSNWbyNEG(I,J)=0. _d 0
335 ENDDO
336 ENDDO
337
338 #else /* SEAICE_GROWTH_LEGACY */
339
340 #ifdef ALLOW_AUTODIFF_TAMC
341 #ifdef SEAICE_MODIFY_GROWTH_ADJ
342 Cgf no dependency through pathological cases treatment
343 if ( SEAICEadjMODE.EQ.0 ) then
344 #endif
345 #endif
346
347 C 1) treat the case of negative values:
348
349 #ifdef ALLOW_AUTODIFF_TAMC
350 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
351 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
352 CADJ STORE area(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
353 #endif /* ALLOW_AUTODIFF_TAMC */
354 DO J=1,sNy
355 DO I=1,sNx
356 d_HEFFbyNEG(I,J)=MAX(-HEFF(I,J,bi,bj),0. _d 0)
357 HEFF(I,J,bi,bj)=HEFF(I,J,bi,bj)+d_HEFFbyNEG(I,J)
358 d_HSNWbyNEG(I,J)=MAX(-HSNOW(I,J,bi,bj),0. _d 0)
359 HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)+d_HSNWbyNEG(I,J)
360 AREA(I,J,bi,bj)=MAX(AREA(I,J,bi,bj),0. _d 0)
361 ENDDO
362 ENDDO
363
364 C 1.25) treat the case of very thin ice:
365
366 #ifdef ALLOW_AUTODIFF_TAMC
367 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
368 #endif /* ALLOW_AUTODIFF_TAMC */
369 DO J=1,sNy
370 DO I=1,sNx
371 if (HEFF(I,J,bi,bj).LE.heffTooThin) then
372 tmpscal2=-HEFF(I,J,bi,bj)
373 tmpscal3=-HSNOW(I,J,bi,bj)
374 TICE(I,J,bi,bj)=celsius2K
375 else
376 tmpscal2=0. _d 0
377 tmpscal3=0. _d 0
378 endif
379 HEFF(I,J,bi,bj)=HEFF(I,J,bi,bj)+tmpscal2
380 d_HEFFbyNEG(I,J)=d_HEFFbyNEG(I,J)+tmpscal2
381 HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)+tmpscal3
382 d_HSNWbyNEG(I,J)=d_HSNWbyNEG(I,J)+tmpscal3
383 ENDDO
384 ENDDO
385
386 C 1.5) treat the case of area but no ice/snow:
387
388 #ifdef ALLOW_AUTODIFF_TAMC
389 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
390 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
391 #endif /* ALLOW_AUTODIFF_TAMC */
392 DO J=1,sNy
393 DO I=1,sNx
394 IF ((HEFF(i,j,bi,bj).EQ.0. _d 0).AND.
395 & (HSNOW(i,j,bi,bj).EQ.0. _d 0)) AREA(I,J,bi,bj)=0. _d 0
396 ENDDO
397 ENDDO
398
399 C 2) treat the case of very small area:
400
401 #ifdef ALLOW_AUTODIFF_TAMC
402 CADJ STORE area(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
403 #endif /* ALLOW_AUTODIFF_TAMC */
404 DO J=1,sNy
405 DO I=1,sNx
406 IF ((HEFF(i,j,bi,bj).GT.0).OR.(HSNOW(i,j,bi,bj).GT.0))
407 & AREA(I,J,bi,bj)=MAX(AREA(I,J,bi,bj),areaMin)
408 ENDDO
409 ENDDO
410
411 C 2.5) treat case of excessive ice cover:
412
413 #ifdef ALLOW_AUTODIFF_TAMC
414 CADJ STORE area(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
415 #endif /* ALLOW_AUTODIFF_TAMC */
416 DO J=1,sNy
417 DO I=1,sNx
418 AREA(I,J,bi,bj)=MIN(AREA(I,J,bi,bj),areaMax)
419 ENDDO
420 ENDDO
421
422 #ifdef ALLOW_AUTODIFF_TAMC
423 #ifdef SEAICE_MODIFY_GROWTH_ADJ
424 endif
425 #endif
426 #endif
427
428 C 3) store regularized values of heff, hsnow, area at the onset of thermo.
429 DO J=1,sNy
430 DO I=1,sNx
431 HEFFpreTH(I,J)=HEFF(I,J,bi,bj)
432 HSNWpreTH(I,J)=HSNOW(I,J,bi,bj)
433 AREApreTH(I,J)=AREA(I,J,bi,bj)
434 ENDDO
435 ENDDO
436
437 C 4) treat sea ice salinity pathological cases
438 #ifdef SEAICE_SALINITY
439 #ifdef ALLOW_AUTODIFF_TAMC
440 CADJ STORE hsalt(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
441 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
442 #endif /* ALLOW_AUTODIFF_TAMC */
443 DO J=1,sNy
444 DO I=1,sNx
445 IF ( (HSALT(I,J,bi,bj) .LT. 0.0).OR.
446 & (HEFF(I,J,bi,bj) .EQ. 0.0) ) THEN
447 saltFluxAdjust(I,J) = - HEFFM(I,J,bi,bj) *
448 & HSALT(I,J,bi,bj) / SEAICE_deltaTtherm
449 HSALT(I,J,bi,bj) = 0.0 _d 0
450 ENDIF
451 ENDDO
452 ENDDO
453 #endif /* SEAICE_SALINITY */
454
455 C 5) treat sea ice age pathological cases
456 C ...
457 #endif /* SEAICE_GROWTH_LEGACY */
458
459 #ifdef ALLOW_AUTODIFF_TAMC
460 #ifdef SEAICE_MODIFY_GROWTH_ADJ
461 Cgf no additional dependency of air-sea fluxes to ice
462 if ( SEAICEadjMODE.GE.1 ) then
463 DO J=1,sNy
464 DO I=1,sNx
465 HEFFpreTH(I,J) = 0. _d 0
466 HSNWpreTH(I,J) = 0. _d 0
467 AREApreTH(I,J) = 0. _d 0
468 ENDDO
469 ENDDO
470 endif
471 #endif
472 #endif
473
474 C 4) COMPUTE ACTUAL ICE/SNOW THICKNESS; USE MIN/MAX VALUES
475 C TO REGULARIZE SEAICE_SOLVE4TEMP/d_AREA COMPUTATIONS
476
477 #ifdef ALLOW_AUTODIFF_TAMC
478 CADJ STORE AREApreTH = comlev1_bibj, key = iicekey, byte = isbyte
479 CADJ STORE HEFFpreTH = comlev1_bibj, key = iicekey, byte = isbyte
480 CADJ STORE HSNWpreTH = comlev1_bibj, key = iicekey, byte = isbyte
481 #endif /* ALLOW_AUTODIFF_TAMC */
482 DO J=1,sNy
483 DO I=1,sNx
484 tmpscal1 = MAX(areaMin,AREApreTH(I,J))
485 hsnowActual(I,J) = HSNWpreTH(I,J)/tmpscal1
486 tmpscal2 = HEFFpreTH(I,J)/tmpscal1
487 heffActual(I,J) = MAX(tmpscal2,hiceMin)
488 Cgf do we need to keep this comment?
489 C Capping the actual ice thickness effectively enforces a
490 C minimum of heat flux through the ice and helps getting rid of
491 C very thick ice.
492 Cdm actually, this does exactly the opposite, i.e., ice is thicker
493 Cdm when heffActual is capped, so I am commenting out
494 Cdm heffActual(I,J) = MIN(heffActual(I,J),9.0 _d +00)
495 ENDDO
496 ENDDO
497
498 #ifdef ALLOW_AUTODIFF_TAMC
499 #ifdef SEAICE_SIMPLIFY_GROWTH_ADJ
500 CALL ZERO_ADJ_1D( sNx*sNy, heffActual, myThid)
501 CALL ZERO_ADJ_1D( sNx*sNy, hsnowActual, myThid)
502 #endif
503 #endif
504
505
506 C ===================================================================
507 C ================PART 2: determine heat fluxes/stocks===============
508 C ===================================================================
509
510 C determine available heat due to the atmosphere -- for open water
511 C ================================================================
512
513 C ocean surface/mixed layer temperature
514 DO J=1,sNy
515 DO I=1,sNx
516 TMIX(I,J,bi,bj)=theta(I,J,kSurface,bi,bj)+celsius2K
517 ENDDO
518 ENDDO
519
520 C wind speed from exf
521 DO J=1,sNy
522 DO I=1,sNx
523 UG(I,J) = MAX(SEAICE_EPS,wspeed(I,J,bi,bj))
524 ENDDO
525 ENDDO
526
527 #ifdef ALLOW_AUTODIFF_TAMC
528 CADJ STORE qnet(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
529 CADJ STORE qsw(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
530 cCADJ STORE UG = comlev1_bibj, key = iicekey,byte=isbyte
531 cCADJ STORE TMIX(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
532 #endif /* ALLOW_AUTODIFF_TAMC */
533
534 CALL SEAICE_BUDGET_OCEAN(
535 I UG,
536 U TMIX,
537 O a_QbyATM_open, a_QSWbyATM_open,
538 I bi, bj, myTime, myIter, myThid )
539
540 C determine available heat due to the atmosphere -- for ice covered water
541 C =======================================================================
542
543 #ifdef ALLOW_ATM_WIND
544 IF (useRelativeWind) THEN
545 C Compute relative wind speed over sea ice.
546 DO J=1,sNy
547 DO I=1,sNx
548 SPEED_SQ =
549 & (uWind(I,J,bi,bj)
550 & +0.5 _d 0*(uVel(i,j,kSurface,bi,bj)
551 & +uVel(i+1,j,kSurface,bi,bj))
552 & -0.5 _d 0*(uice(i,j,bi,bj)+uice(i+1,j,bi,bj)))**2
553 & +(vWind(I,J,bi,bj)
554 & +0.5 _d 0*(vVel(i,j,kSurface,bi,bj)
555 & +vVel(i,j+1,kSurface,bi,bj))
556 & -0.5 _d 0*(vice(i,j,bi,bj)+vice(i,j+1,bi,bj)))**2
557 IF ( SPEED_SQ .LE. SEAICE_EPS_SQ ) THEN
558 UG(I,J)=SEAICE_EPS
559 ELSE
560 UG(I,J)=SQRT(SPEED_SQ)
561 ENDIF
562 ENDDO
563 ENDDO
564 ENDIF
565 #endif
566
567 #ifdef ALLOW_AUTODIFF_TAMC
568 CADJ STORE tice = comlev1, key = ikey_dynamics, byte = isbyte
569 CADJ STORE hsnowActual = comlev1_bibj, key = iicekey, byte = isbyte
570 CADJ STORE heffActual = comlev1_bibj, key = iicekey, byte = isbyte
571 CADJ STORE UG = comlev1_bibj, key = iicekey, byte = isbyte
572 # ifdef SEAICE_MULTICATEGORY
573 CADJ STORE tices = comlev1, key = ikey_dynamics, byte = isbyte
574 # endif /* SEAICE_MULTICATEGORY */
575 #endif /* ALLOW_AUTODIFF_TAMC */
576
577 C-- Start loop over multi-categories, if SEAICE_MULTICATEGORY is undefined
578 C nDim = 1, and there is only one loop iteration
579 #ifdef SEAICE_MULTICATEGORY
580 DO IT=1,nDim
581 #ifdef ALLOW_AUTODIFF_TAMC
582 C Why do we need this store directive when we have just stored
583 C TICES before the loop?
584 ilockey = (iicekey-1)*nDim + IT
585 CADJ STORE tices(:,:,it,bi,bj) = comlev1_multdim,
586 CADJ & key = ilockey, byte = isbyte
587 #endif /* ALLOW_AUTODIFF_TAMC */
588 pFac = (2.0 _d 0*real(IT)-1.0 _d 0)/nDim
589 DO J=1,sNy
590 DO I=1,sNx
591 heffActualP(I,J)= heffActual(I,J)*pFac
592 TICE(I,J,bi,bj)=TICES(I,J,IT,bi,bj)
593 ENDDO
594 ENDDO
595 CALL SEAICE_SOLVE4TEMP(
596 I UG, heffActualP, hsnowActual,
597 U TICE,
598 O a_QbyATMmult_cover, a_QSWbyATMmult_cover,
599 O a_FWbySublimMult,
600 I bi, bj, myTime, myIter, myThid )
601 DO J=1,sNy
602 DO I=1,sNx
603 C average over categories
604 a_QbyATM_cover (I,J) = a_QbyATM_cover(I,J)
605 & + a_QbyATMmult_cover(I,J)/nDim
606 a_QSWbyATM_cover (I,J) = a_QSWbyATM_cover(I,J)
607 & + a_QSWbyATMmult_cover(I,J)/nDim
608 a_FWbySublim (I,J) = a_FWbySublim(I,J)
609 & + a_FWbySublimMult(I,J)/nDim
610 TICES(I,J,IT,bi,bj) = TICE(I,J,bi,bj)
611 ENDDO
612 ENDDO
613 ENDDO
614 #else
615 CALL SEAICE_SOLVE4TEMP(
616 I UG, heffActual, hsnowActual,
617 U TICE,
618 O a_QbyATM_cover, a_QSWbyATM_cover, a_FWbySublim,
619 I bi, bj, myTime, myIter, myThid )
620 #endif /* SEAICE_MULTICATEGORY */
621 C-- End loop over multi-categories
622
623 #ifdef ALLOW_DIAGNOSTICS
624 IF ( useDiagnostics ) THEN
625 IF ( DIAGNOSTICS_IS_ON('SIatmQnt',myThid) ) THEN
626 DO J=1,sNy
627 DO I=1,sNx
628 CML If I consider the atmosphere above the ice, the surface flux
629 CML which is relevant for the air temperature dT/dt Eq
630 CML accounts for sensible and radiation (with different treatment
631 CML according to wave-length) fluxes but not for "latent heat flux",
632 CML since it does not contribute to heating the air.
633 CML So this diagnostic is only good for heat budget calculations within
634 CML the ice-ocean system.
635 DIAGarray(I,J) = maskC(I,J,kSurface,bi,bj) * (
636 & a_QbyATM_cover(I,J) * AREApreTH(I,J)
637 & + a_QbyATM_open(I,J) * ( ONE - AREApreTH(I,J) ) )
638 ENDDO
639 ENDDO
640 CALL DIAGNOSTICS_FILL(DIAGarray,'SIatmQnt',0,1,3,bi,bj,myThid)
641 ENDIF
642 IF ( DIAGNOSTICS_IS_ON('SIfwSubl',myThid) ) THEN
643 DO J=1,sNy
644 DO I=1,sNx
645 DIAGarray(I,J) = maskC(I,J,kSurface,bi,bj) *
646 & a_FWbySublim(I,J) * AREApreTH(I,J)
647 ENDDO
648 ENDDO
649 CALL DIAGNOSTICS_FILL(DIAGarray,'SIfwSubl',0,1,3,bi,bj,myThid)
650 ENDIF
651 IF ( DIAGNOSTICS_IS_ON('SIatmFW ',myThid) ) THEN
652 DO J=1,sNy
653 DO I=1,sNx
654 DIAGarray(I,J) = maskC(I,J,kSurface,bi,bj)*(
655 & PRECIP(I,J,bi,bj)
656 & - EVAP(I,J,bi,bj)
657 & *( ONE - AREApreTH(I,J) )
658 #ifdef ALLOW_RUNOFF
659 & + RUNOFF(I,J,bi,bj)
660 #endif /* ALLOW_RUNOFF */
661 & )*rhoConstFresh
662 #ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
663 & - a_FWbySublim(I,J)*AREApreTH(I,J)
664 #endif /* SEAICE_ADD_SUBLIMATION_TO_FWBUDGET */
665 ENDDO
666 ENDDO
667 CALL DIAGNOSTICS_FILL(DIAGarray,'SIatmFW ',0,1,3,bi,bj,myThid)
668 ENDIF
669 ENDIF
670 #endif /* ALLOW_DIAGNOSTICS */
671
672 C switch heat fluxes from W/m2 to 'effective' ice meters
673 DO J=1,sNy
674 DO I=1,sNx
675 a_QbyATM_cover(I,J) = a_QbyATM_cover(I,J)
676 & * convertQ2HI * AREApreTH(I,J)
677 a_QSWbyATM_cover(I,J) = a_QSWbyATM_cover(I,J)
678 & * convertQ2HI * AREApreTH(I,J)
679 a_QbyATM_open(I,J) = a_QbyATM_open(I,J)
680 & * convertQ2HI * ( ONE - AREApreTH(I,J) )
681 a_QSWbyATM_open(I,J) = a_QSWbyATM_open(I,J)
682 & * convertQ2HI * ( ONE - AREApreTH(I,J) )
683 C and initialize r_QbyATM_cover/r_QbyATM_open
684 r_QbyATM_cover(I,J)=a_QbyATM_cover(I,J)
685 r_QbyATM_open(I,J)=a_QbyATM_open(I,J)
686 #ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
687 C Convert fresh water flux by sublimation to 'effective' ice meters.
688 C Negative sublimation is resublimation and will be added as snow.
689 a_FWbySublim(I,J) = SEAICE_deltaTtherm/SEAICE_rhoIce
690 & * a_FWbySublim(I,J)*AREApreTH(I,J)
691 #endif /* SEAICE_ADD_SUBLIMATION_TO_FWBUDGET */
692 ENDDO
693 ENDDO
694
695 #ifdef ALLOW_AUTODIFF_TAMC
696 #ifdef SEAICE_MODIFY_GROWTH_ADJ
697 Cgf no additional dependency through ice cover
698 if ( SEAICEadjMODE.GE.3 ) then
699 DO J=1,sNy
700 DO I=1,sNx
701 a_QbyATM_cover(I,J) = 0. _d 0
702 r_QbyATM_cover(I,J) = 0. _d 0
703 a_QSWbyATM_cover(I,J) = 0. _d 0
704 ENDDO
705 ENDDO
706 endif
707 #endif
708 #endif
709
710 C determine available heat due to the ice pack tying the
711 C underlying surface water temperature to freezing point
712 C ======================================================
713
714 #ifdef ALLOW_AUTODIFF_TAMC
715 CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
716 #endif
717
718 DO J=1,sNy
719 DO I=1,sNx
720 #ifdef SEAICE_VARIABLE_FREEZING_POINT
721 TBC = -0.0575 _d 0*salt(I,J,kSurface,bi,bj) + 0.0901 _d 0
722 #endif /* SEAICE_VARIABLE_FREEZING_POINT */
723
724 #ifdef MCPHEE_OCEAN_ICE_HEAT_FLUX
725 # ifdef MCPHEE_STEP_FUNCTION
726 mlTurbFac = 12.5 _d 0
727 IF (AREApreTH(I,J) .GT. 0. _d 0) mlTurbFac = 1. _d 0
728 # else
729 mlTurbFac = 12.5 _d 0 - 11.5 _d 0 *AREApreTH(I,J)
730 # endif /* GRADIENT_MIXED_LAYER_TURBULENCE_FACTOR */
731 IF ( theta(I,J,kSurface,bi,bj) .GE. TBC ) THEN
732 tmpscal1 = STANTON_NUMBER * USTAR_BASE * mlTurbFac
733 ELSE
734 tmpscal1 = 0. _d 0
735 ENDIF
736 tmpscal1 = tmpscal1
737 & * SEAICE_deltaTtherm * hFacC(i,j,kSurface,bi,bj)
738 #else /* MCPHEE_OCEAN_ICE_HEAT_FLUX */
739 IF ( theta(I,J,kSurface,bi,bj) .GE. TBC ) THEN
740 tmpscal1 = SEAICE_availHeatFrac
741 ELSE
742 tmpscal1 = SEAICE_availHeatFracFrz
743 ENDIF
744 tmpscal1 = tmpscal1
745 & * dRf(kSurface) * hFacC(i,j,kSurface,bi,bj)
746 #endif /* MCPHEE_OCEAN_ICE_HEAT_FLUX */
747
748 a_QbyOCN(i,j) = -tmpscal1 * (HeatCapacity_Cp*rhoConst/QI)
749 & * (theta(I,J,kSurface,bi,bj)-TBC)
750 r_QbyOCN(i,j) = a_QbyOCN(i,j)
751 ENDDO
752 ENDDO
753
754 #ifdef ALLOW_AUTODIFF_TAMC
755 #ifdef SEAICE_SIMPLIFY_GROWTH_ADJ
756 CALL ZERO_ADJ_1D( sNx*sNy, r_QbyOCN, myThid)
757 #endif
758 #endif
759
760
761 C ===================================================================
762 C =========PART 3: determine effective thicknesses increments========
763 C ===================================================================
764
765 C compute ice thickness tendency due to ice-ocean interaction
766 C ===========================================================
767
768 #ifdef ALLOW_AUTODIFF_TAMC
769 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
770 CADJ STORE r_QbyOCN = comlev1_bibj,key=iicekey,byte=isbyte
771 #endif /* ALLOW_AUTODIFF_TAMC */
772
773 DO J=1,sNy
774 DO I=1,sNx
775 d_HEFFbyOCNonICE(I,J)=MAX(r_QbyOCN(i,j), -HEFF(I,J,bi,bj))
776 r_QbyOCN(I,J)=r_QbyOCN(I,J)-d_HEFFbyOCNonICE(I,J)
777 HEFF(I,J,bi,bj)=HEFF(I,J,bi,bj) + d_HEFFbyOCNonICE(I,J)
778 ENDDO
779 ENDDO
780
781 #ifdef SEAICE_GROWTH_LEGACY
782 #ifdef ALLOW_DIAGNOSTICS
783 IF ( useDiagnostics ) THEN
784 IF ( DIAGNOSTICS_IS_ON('SIyneg ',myThid) ) THEN
785 CALL DIAGNOSTICS_FILL(d_HEFFbyOCNonICE,
786 & 'SIyneg ',0,1,1,bi,bj,myThid)
787 ENDIF
788 ENDIF
789 #endif
790 #endif
791
792 C compute snow melt tendency due to snow-atmosphere interaction
793 C ==================================================================
794
795 #ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
796 #ifdef ALLOW_AUTODIFF_TAMC
797 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
798 CADJ STORE a_FWbySublim = comlev1_bibj,key=iicekey,byte=isbyte
799 #endif /* ALLOW_AUTODIFF_TAMC */
800 C First apply sublimation to snow
801 rodt = ICE2SNOW
802 rrodt = 1./rodt
803 DO J=1,sNy
804 DO I=1,sNx
805 IF ( a_FWbySublim(I,J) .LT. 0. _d 0 ) THEN
806 C resublimate as snow
807 d_HSNWbySublim(I,J) = -a_FWbySublim(I,J)*rodt
808 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj) + d_HSNWbySublim(I,J)
809 a_FWbySublim(I,J) = 0. _d 0
810 ENDIF
811 C sublimate snow first
812 tmpscal1 = MIN(a_FWbySublim(I,J)*rodt,HSNOW(I,J,bi,bj))
813 tmpscal2 = MAX(tmpscal1,0. _d 0)
814 d_HSNWbySublim(I,J) = - tmpscal2
815 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj) - tmpscal2
816 a_FWbySublim(I,J) = a_FWbySublim(I,J) - tmpscal2*rrodt
817 ENDDO
818 ENDDO
819 #endif /* SEAICE_ADD_SUBLIMATION_TO_FWBUDGET */
820
821 #ifdef ALLOW_AUTODIFF_TAMC
822 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
823 CADJ STORE r_QbyATM_cover = comlev1_bibj,key=iicekey,byte=isbyte
824 #endif /* ALLOW_AUTODIFF_TAMC */
825
826 DO J=1,sNy
827 DO I=1,sNx
828 tmpscal1=MAX(r_QbyATM_cover(I,J)*ICE2SNOW,-HSNOW(I,J,bi,bj))
829 tmpscal2=MIN(tmpscal1,0. _d 0)
830 #ifdef SEAICE_MODIFY_GROWTH_ADJ
831 Cgf no additional dependency through snow
832 if ( SEAICEadjMODE.GE.2 ) tmpscal2 = 0. _d 0
833 #endif
834 d_HSNWbyATMonSNW(I,J)= tmpscal2
835 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj) + tmpscal2
836 r_QbyATM_cover(I,J)=r_QbyATM_cover(I,J) - tmpscal2/ICE2SNOW
837 ENDDO
838 ENDDO
839
840 C compute ice thickness tendency due to the atmosphere
841 C ====================================================
842
843 #ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
844 #ifdef ALLOW_AUTODIFF_TAMC
845 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
846 CADJ STORE a_FWbySublim = comlev1_bibj,key=iicekey,byte=isbyte
847 #endif /* ALLOW_AUTODIFF_TAMC */
848 C Apply sublimation to ice
849 rodt = 1. _d 0
850 rrodt = 1./rodt
851 DO J=1,sNy
852 DO I=1,sNx
853 C If anything is left, sublimate ice
854 tmpscal1 = MIN(a_FWbySublim(I,J)*rodt,HEFF(I,J,bi,bj))
855 tmpscal2 = MAX(tmpscal1,0. _d 0)
856 d_HEFFbySublim(I,J) = - tmpscal2
857 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) - tmpscal2
858 a_FWbySublim(I,J) = a_FWbySublim(I,J) - tmpscal2*rrodt
859 ENDDO
860 ENDDO
861 #endif /* SEAICE_ADD_SUBLIMATION_TO_FWBUDGET */
862
863 #ifdef ALLOW_AUTODIFF_TAMC
864 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
865 CADJ STORE r_QbyATM_cover = comlev1_bibj,key=iicekey,byte=isbyte
866 #endif /* ALLOW_AUTODIFF_TAMC */
867
868 Cgf note: this block is not actually tested by lab_sea
869 Cgf where all experiments start in January. So even though
870 Cgf the v1.81=>v1.82 revision would change results in
871 Cgf warming conditions, the lab_sea results were not changed.
872
873 DO J=1,sNy
874 DO I=1,sNx
875 tmpscal2 = MAX(-HEFF(I,J,bi,bj),r_QbyATM_cover(I,J))
876 d_HEFFbyATMonOCN(I,J)=d_HEFFbyATMonOCN(I,J)+tmpscal2
877 r_QbyATM_cover(I,J)=r_QbyATM_cover(I,J)-tmpscal2
878 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) + tmpscal2
879 ENDDO
880 ENDDO
881
882 C attribute precip to fresh water or snow stock,
883 C depending on atmospheric conditions.
884 C =================================================
885 #ifdef ALLOW_ATM_TEMP
886 #ifdef ALLOW_AUTODIFF_TAMC
887 CADJ STORE a_QbyATM_cover = comlev1_bibj,key=iicekey,byte=isbyte
888 CADJ STORE PRECIP(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
889 CADJ STORE AREApreTH = comlev1_bibj,key=iicekey,byte=isbyte
890 #endif /* ALLOW_AUTODIFF_TAMC */
891 DO J=1,sNy
892 DO I=1,sNx
893 C possible alternatives to the a_QbyATM_cover criterium
894 c IF (TICE(I,J,bi,bj) .LT. TMIX) THEN
895 c IF (atemp(I,J,bi,bj) .LT. celsius2K) THEN
896 IF ( a_QbyATM_cover(I,J).GE. 0. _d 0 ) THEN
897 C add precip as snow
898 d_HFRWbyRAIN(I,J)=0. _d 0
899 d_HSNWbyRAIN(I,J)=convertPRECIP2HI*ICE2SNOW*
900 & PRECIP(I,J,bi,bj)*AREApreTH(I,J)
901 ELSE
902 C add precip to the fresh water bucket
903 d_HFRWbyRAIN(I,J)=-convertPRECIP2HI*
904 & PRECIP(I,J,bi,bj)*AREApreTH(I,J)
905 d_HSNWbyRAIN(I,J)=0. _d 0
906 ENDIF
907 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj) + d_HSNWbyRAIN(I,J)
908 ENDDO
909 ENDDO
910 Cgf note: this does not affect air-sea heat flux,
911 Cgf since the implied air heat gain to turn
912 Cgf rain to snow is not a surface process.
913 #ifdef ALLOW_DIAGNOSTICS
914 IF ( useDiagnostics ) THEN
915 IF ( DIAGNOSTICS_IS_ON('SIsnPrcp',myThid) ) THEN
916 DO J=1,sNy
917 DO I=1,sNx
918 DIAGarray(I,J) = maskC(I,J,kSurface,bi,bj)
919 & * d_HSNWbyRAIN(I,J)*SEAICE_rhoSnow/SEAICE_deltaTtherm
920 ENDDO
921 ENDDO
922 CALL DIAGNOSTICS_FILL(DIAGarray,'SIsnPrcp',0,1,3,bi,bj,myThid)
923 ENDIF
924 ENDIF
925 #endif /* ALLOW_DIAGNOSTICS */
926 #endif /* ALLOW_ATM_TEMP */
927
928 C compute snow melt due to heat available from ocean.
929 C =================================================================
930
931 Cgf do we need to keep this comment and cpp bracket?
932 Cph( very sensitive bit here by JZ
933 #ifndef SEAICE_EXCLUDE_FOR_EXACT_AD_TESTING
934 #ifdef ALLOW_AUTODIFF_TAMC
935 CADJ STORE HSNOW(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
936 CADJ STORE r_QbyOCN = comlev1_bibj,key=iicekey,byte=isbyte
937 #endif /* ALLOW_AUTODIFF_TAMC */
938 DO J=1,sNy
939 DO I=1,sNx
940 tmpscal1=MAX(r_QbyOCN(i,j)*ICE2SNOW, -HSNOW(I,J,bi,bj))
941 tmpscal2=MIN(tmpscal1,0. _d 0)
942 #ifdef SEAICE_MODIFY_GROWTH_ADJ
943 Cgf no additional dependency through snow
944 if ( SEAICEadjMODE.GE.2 ) tmpscal2 = 0. _d 0
945 #endif
946 d_HSNWbyOCNonSNW(I,J) = tmpscal2
947 r_QbyOCN(I,J)=r_QbyOCN(I,J)
948 & -d_HSNWbyOCNonSNW(I,J)/ICE2SNOW
949 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)+d_HSNWbyOCNonSNW(I,J)
950 ENDDO
951 ENDDO
952 #endif /* SEAICE_EXCLUDE_FOR_EXACT_AD_TESTING */
953 Cph)
954
955 C gain of new ice over open water
956 C ===============================
957 #ifndef SEAICE_GROWTH_LEGACY
958 #ifdef SEAICE_DO_OPEN_WATER_GROWTH
959 #ifdef ALLOW_AUTODIFF_TAMC
960 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
961 CADJ STORE r_QbyATM_open = comlev1_bibj,key=iicekey,byte=isbyte
962 CADJ STORE r_QbyOCN = comlev1_bibj,key=iicekey,byte=isbyte
963 CADJ STORE a_QSWbyATM_cover = comlev1_bibj,key=iicekey,byte=isbyte
964 CADJ STORE a_QSWbyATM_open = comlev1_bibj,key=iicekey,byte=isbyte
965 #endif /* ALLOW_AUTODIFF_TAMC */
966 DO J=1,sNy
967 DO I=1,sNx
968 if ( (r_QbyATM_open(I,J).GT.0. _d 0).AND.
969 & (HEFF(I,J,bi,bj).GT.0. _d 0) ) then
970 tmpscal1=r_QbyATM_open(I,J)+r_QbyOCN(i,j)
971 C at this point r_QbyOCN(i,j)<=0 and represents the heat
972 C that is still needed to get to the first layer to freezing point
973 tmpscal2=SWFRACB*(a_QSWbyATM_cover(I,J)
974 & +a_QSWbyATM_open(I,J))
975 C SWFRACB*tmpscal2<=0 is the heat (out of qnet) that is not
976 C going to the first layer, which favors its freezing
977 tmpscal3=MAX(0. _d 0, tmpscal1-tmpscal2)
978 else
979 tmpscal3=0. _d 0
980 endif
981 d_HEFFbyATMonOCN_open(I,J)=tmpscal3
982 C The distinct d_HEFFbyATMonOCN_open array is only needed for d_AREA computation.
983 C For the rest it is treated as another contribution to d_HEFFbyATMonOCN.
984 d_HEFFbyATMonOCN(I,J)=d_HEFFbyATMonOCN(I,J)+tmpscal3
985 r_QbyATM_open(I,J)=r_QbyATM_open(I,J)-tmpscal3
986 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) + tmpscal3
987 ENDDO
988 ENDDO
989 #endif /* SEAICE_DO_OPEN_WATER_GROWTH */
990 #endif /* SEAICE_GROWTH_LEGACY */
991
992 C convert snow to ice if submerged.
993 C =================================
994
995 #ifndef SEAICE_GROWTH_LEGACY
996 C note: in legacy, this process is done at the end
997 #ifdef ALLOW_SEAICE_FLOODING
998 #ifdef ALLOW_AUTODIFF_TAMC
999 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1000 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1001 #endif /* ALLOW_AUTODIFF_TAMC */
1002 IF ( SEAICEuseFlooding ) THEN
1003 DO J=1,sNy
1004 DO I=1,sNx
1005 hDraft = (HSNOW(I,J,bi,bj)*SEAICE_rhoSnow
1006 & +HEFF(I,J,bi,bj)*SEAICE_rhoIce)/rhoConst
1007 tmpscal1 = MAX( 0. _d 0, hDraft - HEFF(I,J,bi,bj))
1008 d_HEFFbyFLOODING(I,J)=tmpscal1
1009 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj)+d_HEFFbyFLOODING(I,J)
1010 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)-
1011 & d_HEFFbyFLOODING(I,J)*ICE2SNOW
1012 ENDDO
1013 ENDDO
1014 ENDIF
1015 #endif /* ALLOW_SEAICE_FLOODING */
1016 #endif /* SEAICE_GROWTH_LEGACY */
1017
1018
1019 C ===================================================================
1020 C ==========PART 4: determine ice cover fraction increments=========-
1021 C ===================================================================
1022
1023 #ifdef ALLOW_AUTODIFF_TAMC
1024 CADJ STORE d_HEFFbyATMonOCN = comlev1_bibj,key=iicekey,byte=isbyte
1025 CADJ STORE d_HEFFbyOCNonICE = comlev1_bibj,key=iicekey,byte=isbyte
1026 CADJ STORE d_HEFFbyATMonOCN_open=comlev1_bibj,key=iicekey,byte=isbyte
1027 CADJ STORE a_QbyATM_open = comlev1_bibj,key=iicekey,byte=isbyte
1028 CADJ STORE heffActual = comlev1_bibj,key=iicekey,byte=isbyte
1029 CADJ STORE AREApreTH = comlev1_bibj,key=iicekey,byte=isbyte
1030 CADJ STORE HEFF(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1031 CADJ STORE HSNOW(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1032 CADJ STORE AREA(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1033 #endif /* ALLOW_AUTODIFF_TAMC */
1034
1035 DO J=1,sNy
1036 DO I=1,sNx
1037 C compute ice melt due to ATM (and OCN) heat stocks
1038 #ifdef SEAICE_GROWTH_LEGACY
1039
1040 C compute heff after ice melt by ocn:
1041 tmpscal0=HEFF(I,J,bi,bj)
1042 & - d_HEFFbyATMonOCN(I,J) - d_HEFFbyFLOODING(I,J)
1043 C compute available heat left after snow melt by atm:
1044 tmpscal1= a_QbyATM_open(I,J)+a_QbyATM_cover(I,J)
1045 & - d_HSNWbyATMonSNW(I,J)/ICE2SNOW
1046 C (cannot melt more than all the ice)
1047 tmpscal2 = MAX(-tmpscal0,tmpscal1)
1048 tmpscal3 = MIN(ZERO,tmpscal2)
1049 #ifdef ALLOW_DIAGNOSTICS
1050 DIAGarray(I,J) = tmpscal2
1051 #endif
1052 C gain of new ice over open water
1053 tmpscal4 = MAX(ZERO,a_QbyATM_open(I,J))
1054
1055 #else /* SEAICE_GROWTH_LEGACY */
1056
1057 # ifdef SEAICE_OCN_MELT_ACT_ON_AREA
1058 C ice cover reduction by joint OCN+ATM melt
1059 tmpscal3 = MIN( 0. _d 0 ,
1060 & d_HEFFbyATMonOCN(I,J)+d_HEFFbyOCNonICE(I,J) )
1061 # else
1062 C ice cover reduction by ATM melt only -- as in legacy code
1063 tmpscal3 = MIN( 0. _d 0 , d_HEFFbyATMonOCN(I,J) )
1064 # endif
1065 C gain of new ice over open water
1066
1067 # ifdef SEAICE_DO_OPEN_WATER_GROWTH
1068 C the one effectively used to increment HEFF
1069 tmpscal4 = d_HEFFbyATMonOCN_open(I,J)
1070 # else
1071 C the virtual one -- as in legcy code
1072 tmpscal4 = MAX(ZERO,a_QbyATM_open(I,J))
1073 # endif
1074 #endif /* SEAICE_GROWTH_LEGACY */
1075
1076 C compute cover fraction tendency
1077 IF ( YC(I,J,bi,bj) .LT. ZERO ) THEN
1078 d_AREAbyATM(I,J)=tmpscal4/HO_south
1079 ELSE
1080 d_AREAbyATM(I,J)=tmpscal4/HO
1081 ENDIF
1082 d_AREAbyATM(I,J)=d_AREAbyATM(I,J)
1083 #ifdef SEAICE_GROWTH_LEGACY
1084 & +HALF*tmpscal3*AREApreTH(I,J)
1085 & /(tmpscal0+.00001 _d 0)
1086 #else
1087 & +HALF*tmpscal3/heffActual(I,J)
1088 #endif
1089 C apply tendency
1090 IF ( (HEFF(i,j,bi,bj).GT.0. _d 0).OR.
1091 & (HSNOW(i,j,bi,bj).GT.0. _d 0) ) THEN
1092 AREA(I,J,bi,bj)=max(0. _d 0 , min( 1. _d 0,
1093 & AREA(I,J,bi,bj)+d_AREAbyATM(I,J) ) )
1094 ELSE
1095 AREA(I,J,bi,bj)=0. _d 0
1096 ENDIF
1097 ENDDO
1098 ENDDO
1099
1100 #ifdef ALLOW_AUTODIFF_TAMC
1101 #ifdef SEAICE_MODIFY_GROWTH_ADJ
1102 Cgf 'bulk' linearization of area=f(HEFF)
1103 if ( SEAICEadjMODE.GE.1 ) then
1104 DO J=1,sNy
1105 DO I=1,sNx
1106 C AREA(I,J,bi,bj) = 0.1 _d 0 * HEFF(I,J,bi,bj)
1107 AREA(I,J,bi,bj) = AREApreTH(I,J) + 0.1 _d 0 *
1108 & ( HEFF(I,J,bi,bj) - HEFFpreTH(I,J) )
1109 ENDDO
1110 ENDDO
1111 endif
1112 #endif
1113 #endif
1114
1115 #ifdef SEAICE_GROWTH_LEGACY
1116 #ifdef ALLOW_DIAGNOSTICS
1117 IF ( useDiagnostics ) THEN
1118 IF ( DIAGNOSTICS_IS_ON('SIfice ',myThid) ) THEN
1119 CALL DIAGNOSTICS_FILL(DIAGarray,'SIfice ',0,1,3,bi,bj,myThid)
1120 ENDIF
1121 ENDIF
1122 #endif
1123 #endif /* SEAICE_GROWTH_LEGACY */
1124
1125
1126 C ===================================================================
1127 C =============PART 5: determine ice salinity increments=============
1128 C ===================================================================
1129
1130 #ifndef SEAICE_SALINITY
1131 # ifdef ALLOW_AUTODIFF_TAMC
1132 # ifdef ALLOW_SALT_PLUME
1133 CADJ STORE d_HEFFbyNEG = comlev1_bibj,key=iicekey,byte=isbyte
1134 CADJ STORE d_HEFFbyOCNonICE = comlev1_bibj,key=iicekey,byte=isbyte
1135 CADJ STORE d_HEFFbyATMonOCN = comlev1_bibj,key=iicekey,byte=isbyte
1136 CADJ STORE d_HEFFbyFLOODING = comlev1_bibj,key=iicekey,byte=isbyte
1137 CADJ STORE salt(:,:,kSurface,bi,bj) = comlev1_bibj,
1138 CADJ & key = iicekey, byte = isbyte
1139 # endif /* ALLOW_SALT_PLUME */
1140 # endif /* ALLOW_AUTODIFF_TAMC */
1141 DO J=1,sNy
1142 DO I=1,sNx
1143 Cgf note: flooding does count negatively
1144 tmpscal1 = d_HEFFbyNEG(I,J) + d_HEFFbyOCNonICE(I,J) +
1145 & d_HEFFbyATMonOCN(I,J) - d_HEFFbyFLOODING(I,J)
1146 tmpscal2 = tmpscal1 * SIsal0 * HEFFM(I,J,bi,bj)
1147 & /SEAICE_deltaTtherm * ICE2WATR * rhoConstFresh
1148 saltFlux(I,J,bi,bj) = tmpscal2
1149 #ifdef ALLOW_SALT_PLUME
1150 tmpscal3 = tmpscal1*salt(I,j,kSurface,bi,bj)*HEFFM(I,J,bi,bj)
1151 & /SEAICE_deltaTtherm * ICE2WATR * rhoConstFresh
1152 saltPlumeFlux(I,J,bi,bj) = MAX( tmpscal3-tmpscal2 , 0. _d 0)
1153 #endif /* ALLOW_SALT_PLUME */
1154 ENDDO
1155 ENDDO
1156 #endif
1157
1158 #ifdef ALLOW_ATM_TEMP
1159 #ifdef SEAICE_SALINITY
1160
1161 #ifdef SEAICE_GROWTH_LEGACY
1162 # ifdef ALLOW_AUTODIFF_TAMC
1163 CADJ STORE hsalt(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1164 # endif /* ALLOW_AUTODIFF_TAMC */
1165 DO J=1,sNy
1166 DO I=1,sNx
1167 C set HSALT = 0 if HSALT < 0 and compute salt to remove from ocean
1168 IF ( HSALT(I,J,bi,bj) .LT. 0.0 ) THEN
1169 saltFluxAdjust(I,J) = - HEFFM(I,J,bi,bj) *
1170 & HSALT(I,J,bi,bj) / SEAICE_deltaTtherm
1171 HSALT(I,J,bi,bj) = 0.0 _d 0
1172 ENDIF
1173 ENDDO
1174 ENDDO
1175 #endif /* SEAICE_GROWTH_LEGACY */
1176
1177 #ifdef ALLOW_AUTODIFF_TAMC
1178 CADJ STORE hsalt(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1179 #endif /* ALLOW_AUTODIFF_TAMC */
1180
1181 DO J=1,sNy
1182 DO I=1,sNx
1183 C sum up the terms that affect the salt content of the ice pack
1184 tmpscal1=d_HEFFbyOCNonICE(I,J)+d_HEFFbyATMonOCN(I,J)
1185 C recompute HEFF before thermodyncamic updates (which is not AREApreTH in legacy code)
1186 tmpscal2=HEFF(I,J,bi,bj)-tmpscal1-d_HEFFbyFLOODING(I,J)
1187 C tmpscal1 > 0 : m of sea ice that is created
1188 IF ( tmpscal1 .GE. 0.0 ) THEN
1189 saltFlux(I,J,bi,bj) =
1190 & HEFFM(I,J,bi,bj)/SEAICE_deltaTtherm
1191 & *SEAICE_salinity*salt(I,j,kSurface,bi,bj)
1192 & *tmpscal1*ICE2WATR*rhoConstFresh
1193 #ifdef ALLOW_SALT_PLUME
1194 C saltPlumeFlux is defined only during freezing:
1195 saltPlumeFlux(I,J,bi,bj)=
1196 & HEFFM(I,J,bi,bj)/SEAICE_deltaTtherm
1197 & *(1-SEAICE_salinity)*salt(I,j,kSurface,bi,bj)
1198 & *tmpscal1*ICE2WATR*rhoConstFresh
1199 C if SaltPlumeSouthernOcean=.FALSE. turn off salt plume in Southern Ocean
1200 IF ( .NOT. SaltPlumeSouthernOcean ) THEN
1201 IF ( YC(I,J,bi,bj) .LT. 0.0 _d 0 )
1202 & saltPlumeFlux(i,j,bi,bj) = 0.0 _d 0
1203 ENDIF
1204 #endif /* ALLOW_SALT_PLUME */
1205
1206 C tmpscal1 < 0 : m of sea ice that is melted
1207 ELSE
1208 saltFlux(I,J,bi,bj) =
1209 & HEFFM(I,J,bi,bj)/SEAICE_deltaTtherm
1210 & *HSALT(I,J,bi,bj)
1211 & *tmpscal1/tmpscal2
1212 #ifdef ALLOW_SALT_PLUME
1213 saltPlumeFlux(i,j,bi,bj) = 0.0 _d 0
1214 #endif /* ALLOW_SALT_PLUME */
1215 ENDIF
1216 C update HSALT based on surface saltFlux
1217 HSALT(I,J,bi,bj) = HSALT(I,J,bi,bj) +
1218 & saltFlux(I,J,bi,bj) * SEAICE_deltaTtherm
1219 saltFlux(I,J,bi,bj) =
1220 & saltFlux(I,J,bi,bj) + saltFluxAdjust(I,J)
1221 #ifdef SEAICE_GROWTH_LEGACY
1222 C set HSALT = 0 if HEFF = 0 and compute salt to dump into ocean
1223 IF ( HEFF(I,J,bi,bj) .EQ. 0.0 ) THEN
1224 saltFlux(I,J,bi,bj) = saltFlux(I,J,bi,bj) -
1225 & HEFFM(I,J,bi,bj) * HSALT(I,J,bi,bj) /
1226 & SEAICE_deltaTtherm
1227 HSALT(I,J,bi,bj) = 0.0 _d 0
1228 #ifdef ALLOW_SALT_PLUME
1229 saltPlumeFlux(i,j,bi,bj) = 0.0 _d 0
1230 #endif /* ALLOW_SALT_PLUME */
1231 ENDIF
1232 #endif /* SEAICE_GROWTH_LEGACY */
1233 ENDDO
1234 ENDDO
1235 #endif /* SEAICE_SALINITY */
1236 #endif /* ALLOW_ATM_TEMP */
1237
1238
1239 C =======================================================================
1240 C =====LEGACY PART 5.5: treat pathological cases, then do flooding ======
1241 C =======================================================================
1242
1243 #ifdef SEAICE_GROWTH_LEGACY
1244
1245 C treat values of ice cover fraction oustide
1246 C the [0 1] range, and other such issues.
1247 C ===========================================
1248
1249 Cgf note: this part cannot be heat and water conserving
1250
1251 #ifdef ALLOW_AUTODIFF_TAMC
1252 CADJ STORE area(:,:,bi,bj) = comlev1_bibj,
1253 CADJ & key = iicekey, byte = isbyte
1254 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,
1255 CADJ & key = iicekey, byte = isbyte
1256 #endif /* ALLOW_AUTODIFF_TAMC */
1257 DO J=1,sNy
1258 DO I=1,sNx
1259 C NOW SET AREA(I,J,bi,bj)=0 WHERE NO ICE IS
1260 AREA(I,J,bi,bj)=MIN(AREA(I,J,bi,bj)
1261 & ,HEFF(I,J,bi,bj)/.0001 _d 0)
1262 ENDDO
1263 ENDDO
1264
1265 #ifdef ALLOW_AUTODIFF_TAMC
1266 CADJ STORE area(:,:,bi,bj) = comlev1_bibj,
1267 CADJ & key = iicekey, byte = isbyte
1268 #endif /* ALLOW_AUTODIFF_TAMC */
1269 DO J=1,sNy
1270 DO I=1,sNx
1271 C NOW TRUNCATE AREA
1272 AREA(I,J,bi,bj)=MIN(ONE,AREA(I,J,bi,bj))
1273 ENDDO
1274 ENDDO
1275
1276 #ifdef ALLOW_AUTODIFF_TAMC
1277 CADJ STORE area(:,:,bi,bj) = comlev1_bibj,
1278 CADJ & key = iicekey, byte = isbyte
1279 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
1280 CADJ & key = iicekey, byte = isbyte
1281 #endif /* ALLOW_AUTODIFF_TAMC */
1282 DO J=1,sNy
1283 DO I=1,sNx
1284 AREA(I,J,bi,bj) = MAX(ZERO,AREA(I,J,bi,bj))
1285 HSNOW(I,J,bi,bj) = MAX(ZERO,HSNOW(I,J,bi,bj))
1286 AREA(I,J,bi,bj) = AREA(I,J,bi,bj)*HEFFM(I,J,bi,bj)
1287 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj)*HEFFM(I,J,bi,bj)
1288 #ifdef SEAICE_CAP_HEFF
1289 C This is not energy conserving, but at least it conserves fresh water
1290 tmpscal0 = -MAX(HEFF(I,J,bi,bj)-MAX_HEFF,0. _d 0)
1291 d_HEFFbyNeg(I,J) = d_HEFFbyNeg(I,J) + tmpscal0
1292 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) + tmpscal0
1293 #endif /* SEAICE_CAP_HEFF */
1294 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)*HEFFM(I,J,bi,bj)
1295 ENDDO
1296 ENDDO
1297
1298 #ifdef ALLOW_DIAGNOSTICS
1299 IF ( useDiagnostics ) THEN
1300 IF ( DIAGNOSTICS_IS_ON('SIthdgrh',myThid) ) THEN
1301 DO J=1,sNy
1302 DO I=1,sNx
1303 tmparr1(I,J) = (HEFF(I,J,bi,bj)-HEFFpreTH(I,J))
1304 & /SEAICE_deltaTtherm
1305 ENDDO
1306 ENDDO
1307 CALL DIAGNOSTICS_FILL(tmparr1,'SIthdgrh',0,1,3,bi,bj,myThid)
1308 ENDIF
1309 ENDIF
1310 #endif /* ALLOW_DIAGNOSTICS */
1311
1312 C convert snow to ice if submerged.
1313 C =================================
1314
1315 #ifdef ALLOW_SEAICE_FLOODING
1316 IF ( SEAICEuseFlooding ) THEN
1317 DO J=1,sNy
1318 DO I=1,sNx
1319 hDraft = (HSNOW(I,J,bi,bj)*SEAICE_rhoSnow
1320 & +HEFF(I,J,bi,bj)*SEAICE_rhoIce)/rhoConst
1321 tmpscal1 = MAX( 0. _d 0, hDraft - HEFF(I,J,bi,bj))
1322 d_HEFFbyFLOODING(I,J)=tmpscal1
1323 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj)+d_HEFFbyFLOODING(I,J)
1324 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)-
1325 & d_HEFFbyFLOODING(I,J)*ICE2SNOW
1326 ENDDO
1327 ENDDO
1328 #ifdef ALLOW_DIAGNOSTICS
1329 IF ( useDiagnostics ) THEN
1330 IF ( DIAGNOSTICS_IS_ON('SIsnwice',myThid) ) THEN
1331 DO J=1,sNy
1332 DO I=1,sNx
1333 tmparr1(I,J) = d_HEFFbyFLOODING(I,J)/SEAICE_deltaTtherm
1334 ENDDO
1335 ENDDO
1336 CALL DIAGNOSTICS_FILL(tmparr1,'SIsnwice',0,1,3,bi,bj,myThid)
1337 ENDIF
1338 ENDIF
1339 #endif /* ALLOW_DIAGNOSTICS */
1340 ENDIF
1341 #endif /* ALLOW_SEAICE_FLOODING */
1342
1343 #endif /* SEAICE_GROWTH_LEGACY */
1344
1345
1346 C ===================================================================
1347 C ===============PART 6: determine ice age increments================
1348 C ===================================================================
1349
1350 #ifdef SEAICE_AGE
1351 # ifndef SEAICE_AGE_VOL
1352 C Sources and sinks for sea ice age:
1353 C assume that a) freezing: new ice fraction forms with zero age
1354 C b) melting: ice fraction vanishes with current age
1355 DO J=1,sNy
1356 DO I=1,sNx
1357 IF ( AREA(I,J,bi,bj) .GT. 0.15 ) THEN
1358 IF ( AREA(i,j,bi,bj) .LT. AREApreTH(i,j) ) THEN
1359 C-- scale effective ice-age to account for ice-age sink associated with melting
1360 IceAge(i,j,bi,bj) = IceAge(i,j,bi,bj)
1361 & *AREA(i,j,bi,bj)/AREApreTH(i,j)
1362 ENDIF
1363 C-- account for aging:
1364 IceAge(i,j,bi,bj) = IceAge(i,j,bi,bj)
1365 & + AREA(i,j,bi,bj) * SEAICE_deltaTtherm
1366 ELSE
1367 IceAge(i,j,bi,bj) = ZERO
1368 ENDIF
1369 ENDDO
1370 ENDDO
1371 # else /* ifdef SEAICE_AGE_VOL */
1372 C Sources and sinks for sea ice age:
1373 C assume that a) freezing: new ice volume forms with zero age
1374 C b) melting: ice volume vanishes with current age
1375 DO J=1,sNy
1376 DO I=1,sNx
1377 C-- compute actual age from effective age:
1378 IF (AREApreTH(i,j).GT.0. _d 0) THEN
1379 tmpscal1=IceAge(i,j,bi,bj)/AREApreTH(i,j)
1380 ELSE
1381 tmpscal1=0. _d 0
1382 ENDIF
1383 IF ( (HEFFpreTH(i,j).LT.HEFF(i,j,bi,bj)).AND.
1384 & (AREA(i,j,bi,bj).GT.0.15) ) THEN
1385 tmpscal2=tmpscal1*HEFFpreTH(i,j)/
1386 & HEFF(i,j,bi,bj)+SEAICE_deltaTtherm
1387 ELSEIF (AREA(i,j,bi,bj).LE.0.15) THEN
1388 tmpscal2=0. _d 0
1389 ELSE
1390 tmpscal2=tmpscal1+SEAICE_deltaTtherm
1391 ENDIF
1392 C-- re-scale to effective age:
1393 IceAge(i,j,bi,bj) = tmpscal2*AREA(i,j,bi,bj)
1394 ENDDO
1395 ENDDO
1396 # endif /* SEAICE_AGE_VOL */
1397 #endif /* SEAICE_AGE */
1398
1399
1400 C ===================================================================
1401 C ==============PART 7: determine ocean model forcing================
1402 C ===================================================================
1403
1404 C compute net heat flux leaving/entering the ocean,
1405 C accounting for the part used in melt/freeze processes
1406 C =====================================================
1407
1408 DO J=1,sNy
1409 DO I=1,sNx
1410 QNET(I,J,bi,bj) = r_QbyATM_cover(I,J) + r_QbyATM_open(I,J)
1411 & - ( d_HEFFbyOCNonICE(I,J) +
1412 & d_HSNWbyOCNonSNW(I,J)/ICE2SNOW +
1413 & d_HEFFbyNEG(I,J) +
1414 & d_HSNWbyNEG(I,J)/ICE2SNOW )
1415 & * maskC(I,J,kSurface,bi,bj)
1416 QSW(I,J,bi,bj) = a_QSWbyATM_cover(I,J) + a_QSWbyATM_open(I,J)
1417 ENDDO
1418 ENDDO
1419
1420 #ifdef ALLOW_DIAGNOSTICS
1421 IF ( useDiagnostics ) THEN
1422 IF ( DIAGNOSTICS_IS_ON('SIqneto ',myThid) ) THEN
1423 DO J=1,sNy
1424 DO I=1,sNx
1425 DIAGarray(I,J) = r_QbyATM_open(I,J) * convertHI2Q
1426 ENDDO
1427 ENDDO
1428 CALL DIAGNOSTICS_FILL(DIAGarray,'SIqneto ',0,1,3,bi,bj,myThid)
1429 ENDIF
1430 IF ( DIAGNOSTICS_IS_ON('SIqneti ',myThid) ) THEN
1431 DO J=1,sNy
1432 DO I=1,sNx
1433 DIAGarray(I,J) = r_QbyATM_cover(I,J) * convertHI2Q
1434 ENDDO
1435 ENDDO
1436 CALL DIAGNOSTICS_FILL(DIAGarray,'SIqneti ',0,1,3,bi,bj,myThid)
1437 ENDIF
1438 ENDIF
1439 #endif /* ALLOW_DIAGNOSTICS */
1440
1441 C switch heat fluxes from 'effective' ice meters to W/m2
1442 C ======================================================
1443
1444 DO J=1,sNy
1445 DO I=1,sNx
1446 QNET(I,J,bi,bj) = QNET(I,J,bi,bj)*convertHI2Q
1447 QSW(I,J,bi,bj) = QSW(I,J,bi,bj)*convertHI2Q
1448 ENDDO
1449 ENDDO
1450
1451 C compute net fresh water flux leaving/entering
1452 C the ocean, accounting for fresh/salt water stocks.
1453 C ==================================================
1454
1455 #ifdef ALLOW_ATM_TEMP
1456 DO J=1,sNy
1457 DO I=1,sNx
1458 tmpscal1= d_HSNWbyATMonSNW(I,J)/ICE2SNOW
1459 & +d_HFRWbyRAIN(I,J)
1460 & +d_HSNWbyOCNonSNW(I,J)/ICE2SNOW
1461 & +d_HEFFbyOCNonICE(I,J)
1462 & +d_HEFFbyATMonOCN(I,J)
1463 & +d_HEFFbyNEG(I,J)
1464 & +d_HSNWbyNEG(I,J)/ICE2SNOW
1465 #ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
1466 & +a_FWbySublim(I,J)
1467 #endif /* SEAICE_ADD_SUBLIMATION_TO_FWBUDGET */
1468 EmPmR(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*(
1469 & ( EVAP(I,J,bi,bj)-PRECIP(I,J,bi,bj) )
1470 & * ( ONE - AREApreTH(I,J) )
1471 #ifdef ALLOW_RUNOFF
1472 & - RUNOFF(I,J,bi,bj)
1473 #endif /* ALLOW_RUNOFF */
1474 & + tmpscal1*convertHI2PRECIP
1475 & )*rhoConstFresh
1476 ENDDO
1477 ENDDO
1478
1479 #ifdef ALLOW_MEAN_SFLUX_COST_CONTRIBUTION
1480 DO J=1,sNy
1481 DO I=1,sNx
1482 frWtrAtm(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*(
1483 & PRECIP(I,J,bi,bj)
1484 & - EVAP(I,J,bi,bj)
1485 & *( ONE - AREApreTH(I,J) )
1486 & + RUNOFF(I,J,bi,bj)
1487 & )*rhoConstFresh
1488 ENDDO
1489 ENDDO
1490 #endif
1491 #endif /* ALLOW_ATM_TEMP */
1492
1493 #ifdef SEAICE_DEBUG
1494 CALL PLOT_FIELD_XYRL( QSW,'Current QSW ', myIter, myThid )
1495 CALL PLOT_FIELD_XYRL( QNET,'Current QNET ', myIter, myThid )
1496 CALL PLOT_FIELD_XYRL( EmPmR,'Current EmPmR ', myIter, myThid )
1497 #endif /* SEAICE_DEBUG */
1498
1499 C Sea Ice Load on the sea surface.
1500 C =================================
1501
1502 #ifdef ALLOW_AUTODIFF_TAMC
1503 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1504 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1505 #endif /* ALLOW_AUTODIFF_TAMC */
1506
1507 IF ( useRealFreshWaterFlux ) THEN
1508 DO J=1,sNy
1509 DO I=1,sNx
1510 #ifdef SEAICE_CAP_ICELOAD
1511 tmpscal1 = HEFF(I,J,bi,bj)*SEAICE_rhoIce
1512 & + HSNOW(I,J,bi,bj)*SEAICE_rhoSnow
1513 tmpscal2 = min(tmpscal1,heffTooHeavy*rhoConst)
1514 #else
1515 tmpscal2 = HEFF(I,J,bi,bj)*SEAICE_rhoIce
1516 & + HSNOW(I,J,bi,bj)*SEAICE_rhoSnow
1517 #endif
1518 sIceLoad(i,j,bi,bj) = tmpscal2
1519 ENDDO
1520 ENDDO
1521 ENDIF
1522
1523 C close bi,bj loops
1524 ENDDO
1525 ENDDO
1526
1527 RETURN
1528 END

  ViewVC Help
Powered by ViewVC 1.1.22