/[MITgcm]/MITgcm_contrib/atnguyen/code_21Dec2012_saltplume/seaice_growth.F
ViewVC logotype

Contents of /MITgcm_contrib/atnguyen/code_21Dec2012_saltplume/seaice_growth.F

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


Revision 1.2 - (show annotations) (download)
Sun Apr 20 03:47:30 2014 UTC (11 years, 3 months ago) by atn
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +1 -1 lines
FILE REMOVED
remove irrelevant files

1 C $Header: /u/gcmpack/MITgcm_contrib/atnguyen/code_21Dec2012_saltplume/seaice_growth.F,v 1.1 2012/12/21 10:00:29 atn 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 #ifdef FENTY_AREA_EXPANSION_CONTRACTION
122 _RL d_AREAbyOCN (1:sNx,1:sNy)
123 _RL d_AREAbyICE (1:sNx,1:sNy)
124 #endif
125
126 _RL d_HEFFbyNEG (1:sNx,1:sNy)
127 _RL d_HEFFbyOCNonICE (1:sNx,1:sNy)
128 _RL d_HEFFbyATMonOCN (1:sNx,1:sNy)
129 _RL d_HEFFbyATMonICE (1:sNx,1:sNy)
130 _RL d_HEFFbyFLOODING (1:sNx,1:sNy)
131
132 _RL d_HEFFbyATMonOCN_open(1:sNx,1:sNy)
133
134 _RL d_HSNWbyNEG (1:sNx,1:sNy)
135 _RL d_HSNWbyATMonSNW (1:sNx,1:sNy)
136 _RL d_HSNWbyOCNonSNW (1:sNx,1:sNy)
137 _RL d_HSNWbyRAIN (1:sNx,1:sNy)
138
139 _RL d_HFRWbyRAIN (1:sNx,1:sNy)
140 C
141 C a_FWbySublim :: fresh water flux implied by latent heat of
142 C sublimation to atmosphere, same sign convention
143 C as EVAP (positive upward)
144 _RL a_FWbySublim (1:sNx,1:sNy)
145 #ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
146 _RL d_HEFFbySublim (1:sNx,1:sNy)
147 _RL d_HSNWbySublim (1:sNx,1:sNy)
148 _RL rodt, rrodt
149 #endif /* SEAICE_ADD_SUBLIMATION_TO_FWBUDGET */
150
151 C actual ice thickness with upper and lower limit
152 _RL heffActual (1:sNx,1:sNy)
153 C actual snow thickness
154 _RL hsnowActual (1:sNx,1:sNy)
155
156 C AREA_PRE :: hold sea-ice fraction field before any seaice-thermo update
157 _RL AREApreTH (1:sNx,1:sNy)
158 _RL HEFFpreTH (1:sNx,1:sNy)
159 _RL HSNWpreTH (1:sNx,1:sNy)
160
161 C wind speed
162 _RL UG (1:sNx,1:sNy)
163 #ifdef ALLOW_ATM_WIND
164 _RL SPEED_SQ
165 #endif
166
167 C pathological cases thresholds
168 _RL heffTooThin, heffTooHeavy
169
170 C temporary variables available for the various computations
171 #ifdef SEAICE_GROWTH_LEGACY
172 _RL tmpscal0
173 #endif
174 _RL tmpscal1, tmpscal2, tmpscal3, tmpscal4
175 _RL tmparr1 (1:sNx,1:sNy)
176
177 #ifdef ALLOW_SEAICE_FLOODING
178 _RL hDraft
179 #endif /* ALLOW_SEAICE_FLOODING */
180
181 #ifdef SEAICE_SALINITY
182 _RL saltFluxAdjust (1:sNx,1:sNy)
183 #endif
184
185 INTEGER nDim
186 #ifdef SEAICE_MULTICATEGORY
187 INTEGER ilockey
188 PARAMETER ( nDim = MULTDIM )
189 INTEGER it
190 _RL pFac
191 _RL heffActualP (1:sNx,1:sNy)
192 _RL a_QbyATMmult_cover (1:sNx,1:sNy)
193 _RL a_QSWbyATMmult_cover(1:sNx,1:sNy)
194 _RL a_FWbySublimMult (1:sNx,1:sNy)
195 #else
196 PARAMETER ( nDim = 1 )
197 #endif /* SEAICE_MULTICATEGORY */
198
199 #ifdef FENTY_AREA_EXPANSION_CONTRACTION
200 _RL heff_star
201 #endif
202
203 #ifdef MCPHEE_OCEAN_ICE_HEAT_FLUX
204 C Factor by which we increase the upper ocean friction velocity (u*) when
205 C ice is absent in a grid cell (dimensionless)
206 _RL MixedLayerTurbulenceFactor
207
208 c The Stanton number for the McPhee
209 c ocean-ice heat flux parameterization (dimensionless)
210 _RL STANTON_NUMBER
211
212 c A typical friction velocity beneath sea ice for the
213 c McPhee heat flux parameterization (m/s)
214 _RL USTAR_BASE
215
216 _RL surf_theta
217 _RL F_oi (1:sNx,1:sNy)
218 #endif
219
220 #ifdef ALLOW_DIAGNOSTICS
221 _RL DIAGarray (1:sNx,1:sNy)
222 _RL DIAGarrayA (1:sNx,1:sNy)
223 _RL DIAGarrayB (1:sNx,1:sNy)
224 _RL DIAGarrayC (1:sNx,1:sNy)
225 _RL DIAGarrayD (1:sNx,1:sNy)
226 #endif
227
228 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
229
230 C ===================================================================
231 C =================PART 0: constants and initializations=============
232 C ===================================================================
233
234 IF ( buoyancyRelation .EQ. 'OCEANICP' ) THEN
235 kSurface = Nr
236 ELSE
237 kSurface = 1
238 ENDIF
239
240 C Cutoff for very thin ice
241 heffTooThin=1. _d -5
242 C Cutoff for iceload
243 heffTooHeavy=dRf(kSurface) / 5. _d 0
244
245 C FREEZING TEMP. OF SEA WATER (deg C)
246 TBC = SEAICE_freeze
247
248 C RATIO OF SEA ICE DENSITY to SNOW DENSITY
249 ICE2SNOW = SEAICE_rhoIce/SEAICE_rhoSnow
250
251 C HEAT OF FUSION OF ICE (J/m^3)
252 QI = SEAICE_rhoIce*SEAICE_lhFusion
253 C HEAT OF FUSION OF SNOW (J/m^3)
254 QS = SEAICE_rhoSnow*SEAICE_lhFusion
255 C
256 C note that QI/QS=ICE2SNOW -- except it wasnt in old code
257
258 #ifdef MCPHEE_OCEAN_ICE_HEAT_FLUX
259 STANTON_NUMBER = 0.0056 _d 0
260 USTAR_BASE = 0.0125 _d 0
261 #endif
262
263 C conversion factors to go from Q (W/m2) to HEFF (ice meters)
264 convertQ2HI=SEAICE_deltaTtherm/QI
265 convertHI2Q=1/convertQ2HI
266 C conversion factors to go from precip (m/s) unit to HEFF (ice meters)
267 convertPRECIP2HI=SEAICE_deltaTtherm*rhoConstFresh/SEAICE_rhoIce
268 convertHI2PRECIP=1./convertPRECIP2HI
269
270 DO bj=myByLo(myThid),myByHi(myThid)
271 DO bi=myBxLo(myThid),myBxHi(myThid)
272
273 #ifdef ALLOW_AUTODIFF_TAMC
274 act1 = bi - myBxLo(myThid)
275 max1 = myBxHi(myThid) - myBxLo(myThid) + 1
276 act2 = bj - myByLo(myThid)
277 max2 = myByHi(myThid) - myByLo(myThid) + 1
278 act3 = myThid - 1
279 max3 = nTx*nTy
280 act4 = ikey_dynamics - 1
281 iicekey = (act1 + 1) + act2*max1
282 & + act3*max1*max2
283 & + act4*max1*max2*max3
284 #endif /* ALLOW_AUTODIFF_TAMC */
285
286
287 C array initializations
288 C =====================
289
290 DO J=1,sNy
291 DO I=1,sNx
292 a_QbyATM_cover (I,J) = 0.0 _d 0
293 a_QbyATM_open(I,J) = 0.0 _d 0
294 r_QbyATM_cover (I,J) = 0.0 _d 0
295 r_QbyATM_open (I,J) = 0.0 _d 0
296
297 a_QSWbyATM_open (I,J) = 0.0 _d 0
298 a_QSWbyATM_cover (I,J) = 0.0 _d 0
299
300 a_QbyOCN (I,J) = 0.0 _d 0
301 r_QbyOCN (I,J) = 0.0 _d 0
302
303 d_AREAbyATM(I,J) = 0.0 _d 0
304 #ifdef FENTY_AREA_EXPANSION_CONTRACTION
305 d_AREAbyICE(I,J) = 0.0 _d 0
306 d_AREAbyOCN(I,J) = 0.0 _d 0
307 #endif
308
309 d_HEFFbyOCNonICE(I,J) = 0.0 _d 0
310 d_HEFFbyATMonOCN(I,J) = 0.0 _d 0
311 d_HEFFbyATMonICE(I,J) = 0.0 _d 0
312 d_HEFFbyFLOODING(I,J) = 0.0 _d 0
313
314 d_HEFFbyATMonOCN_open(I,J) = 0.0 _d 0
315
316 d_HSNWbyATMonSNW(I,J) = 0.0 _d 0
317 d_HSNWbyOCNonSNW(I,J) = 0.0 _d 0
318 d_HSNWbyRAIN(I,J) = 0.0 _d 0
319 a_FWbySublim(I,J) = 0.0 _d 0
320 #ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
321 d_HEFFbySublim(I,J) = 0.0 _d 0
322 d_HSNWbySublim(I,J) = 0.0 _d 0
323 #endif /* SEAICE_ADD_SUBLIMATION_TO_FWBUDGET */
324 c
325 d_HFRWbyRAIN(I,J) = 0.0 _d 0
326
327 tmparr1(I,J) = 0.0 _d 0
328
329 #ifdef SEAICE_SALINITY
330 saltFluxAdjust(I,J) = 0.0 _d 0
331 #endif
332 #ifdef SEAICE_MULTICATEGORY
333 a_QbyATMmult_cover(I,J) = 0.0 _d 0
334 a_QSWbyATMmult_cover(I,J) = 0.0 _d 0
335 a_FWbySublimMult(I,J) = 0.0 _d 0
336 #endif /* SEAICE_MULTICATEGORY */
337 ENDDO
338 ENDDO
339 #ifdef ALLOW_MEAN_SFLUX_COST_CONTRIBUTION
340 DO J=1-oLy,sNy+oLy
341 DO I=1-oLx,sNx+oLx
342 frWtrAtm(I,J,bi,bj) = 0.0 _d 0
343 ENDDO
344 ENDDO
345 #endif
346
347
348 C =====================================================================
349 C ===========PART 1: treat pathological cases (post advdiff)===========
350 C =====================================================================
351
352 #ifdef SEAICE_GROWTH_LEGACY
353
354 DO J=1,sNy
355 DO I=1,sNx
356 HEFFpreTH(I,J)=HEFFNM1(I,J,bi,bj)
357 HSNWpreTH(I,J)=HSNOW(I,J,bi,bj)
358 AREApreTH(I,J)=AREANM1(I,J,bi,bj)
359 d_HEFFbyNEG(I,J)=0. _d 0
360 d_HSNWbyNEG(I,J)=0. _d 0
361 ENDDO
362 ENDDO
363
364 #else /* SEAICE_GROWTH_LEGACY */
365
366 #ifdef ALLOW_AUTODIFF_TAMC
367 #ifdef SEAICE_MODIFY_GROWTH_ADJ
368 Cgf no dependency through pathological cases treatment
369 if ( SEAICEadjMODE.EQ.0 ) then
370 #endif
371 #endif
372
373 C 1) treat the case of negative values:
374
375 #ifdef ALLOW_AUTODIFF_TAMC
376 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
377 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
378 CADJ STORE area(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
379 #endif /* ALLOW_AUTODIFF_TAMC */
380 DO J=1,sNy
381 DO I=1,sNx
382 d_HEFFbyNEG(I,J)=MAX(-HEFF(I,J,bi,bj),0. _d 0)
383 HEFF(I,J,bi,bj)=HEFF(I,J,bi,bj)+d_HEFFbyNEG(I,J)
384 d_HSNWbyNEG(I,J)=MAX(-HSNOW(I,J,bi,bj),0. _d 0)
385 HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)+d_HSNWbyNEG(I,J)
386 AREA(I,J,bi,bj)=MAX(AREA(I,J,bi,bj),0. _d 0)
387 ENDDO
388 ENDDO
389
390 C 1.25) treat the case of very thin ice:
391
392 #ifdef ALLOW_AUTODIFF_TAMC
393 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
394 #endif /* ALLOW_AUTODIFF_TAMC */
395 DO J=1,sNy
396 DO I=1,sNx
397 if (HEFF(I,J,bi,bj).LE.heffTooThin) then
398 tmpscal2=-HEFF(I,J,bi,bj)
399 tmpscal3=-HSNOW(I,J,bi,bj)
400 TICE(I,J,bi,bj)=celsius2K
401 else
402 tmpscal2=0. _d 0
403 tmpscal3=0. _d 0
404 endif
405 HEFF(I,J,bi,bj)=HEFF(I,J,bi,bj)+tmpscal2
406 d_HEFFbyNEG(I,J)=d_HEFFbyNEG(I,J)+tmpscal2
407 HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)+tmpscal3
408 d_HSNWbyNEG(I,J)=d_HSNWbyNEG(I,J)+tmpscal3
409 ENDDO
410 ENDDO
411
412 C 1.5) treat the case of area but no ice/snow:
413
414 #ifdef ALLOW_AUTODIFF_TAMC
415 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
416 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
417 #endif /* ALLOW_AUTODIFF_TAMC */
418 DO J=1,sNy
419 DO I=1,sNx
420 IF ((HEFF(i,j,bi,bj).EQ.0. _d 0).AND.
421 & (HSNOW(i,j,bi,bj).EQ.0. _d 0)) AREA(I,J,bi,bj)=0. _d 0
422 ENDDO
423 ENDDO
424
425 C 2) treat the case of very small area:
426
427 #ifdef ALLOW_AUTODIFF_TAMC
428 CADJ STORE area(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
429 #endif /* ALLOW_AUTODIFF_TAMC */
430 DO J=1,sNy
431 DO I=1,sNx
432 IF ((HEFF(i,j,bi,bj).GT.0).OR.(HSNOW(i,j,bi,bj).GT.0))
433 & AREA(I,J,bi,bj)=MAX(AREA(I,J,bi,bj),areaMin)
434 ENDDO
435 ENDDO
436
437 C 2.5) treat case of excessive ice cover:
438
439 #ifdef ALLOW_AUTODIFF_TAMC
440 CADJ STORE area(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
441 #endif /* ALLOW_AUTODIFF_TAMC */
442 DO J=1,sNy
443 DO I=1,sNx
444 AREA(I,J,bi,bj)=MIN(AREA(I,J,bi,bj),areaMax)
445 ENDDO
446 ENDDO
447
448 #ifdef ALLOW_AUTODIFF_TAMC
449 #ifdef SEAICE_MODIFY_GROWTH_ADJ
450 endif
451 #endif
452 #endif
453
454 C 3) store regularized values of heff, hsnow, area at the onset of thermo.
455 DO J=1,sNy
456 DO I=1,sNx
457 HEFFpreTH(I,J)=HEFF(I,J,bi,bj)
458 HSNWpreTH(I,J)=HSNOW(I,J,bi,bj)
459 AREApreTH(I,J)=AREA(I,J,bi,bj)
460 ENDDO
461 ENDDO
462
463
464
465 C 4) treat sea ice salinity pathological cases
466 #ifdef SEAICE_SALINITY
467 #ifdef ALLOW_AUTODIFF_TAMC
468 CADJ STORE hsalt(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
469 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
470 #endif /* ALLOW_AUTODIFF_TAMC */
471 DO J=1,sNy
472 DO I=1,sNx
473 IF ( (HSALT(I,J,bi,bj) .LT. 0.0).OR.
474 & (HEFF(I,J,bi,bj) .EQ. 0.0) ) THEN
475 saltFluxAdjust(I,J) = - HEFFM(I,J,bi,bj) *
476 & HSALT(I,J,bi,bj) / SEAICE_deltaTtherm
477 HSALT(I,J,bi,bj) = 0.0 _d 0
478 ENDIF
479 ENDDO
480 ENDDO
481 #endif /* SEAICE_SALINITY */
482
483 C 5) treat sea ice age pathological cases
484 C ...
485 #endif /* SEAICE_GROWTH_LEGACY */
486
487 #ifdef ALLOW_AUTODIFF_TAMC
488 #ifdef SEAICE_MODIFY_GROWTH_ADJ
489 Cgf no additional dependency of air-sea fluxes to ice
490 if ( SEAICEadjMODE.GE.1 ) then
491 DO J=1,sNy
492 DO I=1,sNx
493 HEFFpreTH(I,J) = 0. _d 0
494 HSNWpreTH(I,J) = 0. _d 0
495 AREApreTH(I,J) = 0. _d 0
496 ENDDO
497 ENDDO
498 endif
499 #endif
500 #endif
501
502 C 4) COMPUTE ACTUAL ICE/SNOW THICKNESS; USE MIN/MAX VALUES
503 C TO REGULARIZE SEAICE_SOLVE4TEMP/d_AREA COMPUTATIONS
504
505 #ifdef ALLOW_AUTODIFF_TAMC
506 CADJ STORE AREApreTH = comlev1_bibj, key = iicekey, byte = isbyte
507 CADJ STORE HEFFpreTH = comlev1_bibj, key = iicekey, byte = isbyte
508 CADJ STORE HSNWpreTH = comlev1_bibj, key = iicekey, byte = isbyte
509 #endif /* ALLOW_AUTODIFF_TAMC */
510 DO J=1,sNy
511 DO I=1,sNx
512 tmpscal1 = MAX(areaMin,AREApreTH(I,J))
513 hsnowActual(I,J) = HSNWpreTH(I,J)/tmpscal1
514 tmpscal2 = HEFFpreTH(I,J)/tmpscal1
515 heffActual(I,J) = MAX(tmpscal2,hiceMin)
516 Cgf do we need to keep this comment?
517 C Capping the actual ice thickness effectively enforces a
518 C minimum of heat flux through the ice and helps getting rid of
519 C very thick ice.
520 Cdm actually, this does exactly the opposite, i.e., ice is thicker
521 Cdm when heffActual is capped, so I am commenting out
522 Cdm heffActual(I,J) = MIN(heffActual(I,J),9.0 _d +00)
523 ENDDO
524 ENDDO
525
526 #ifdef ALLOW_AUTODIFF_TAMC
527 #ifdef SEAICE_SIMPLIFY_GROWTH_ADJ
528 CALL ZERO_ADJ_1D( sNx*sNy, heffActual, myThid)
529 CALL ZERO_ADJ_1D( sNx*sNy, hsnowActual, myThid)
530 #endif
531 #endif
532
533
534 C ===================================================================
535 C ================PART 2: determine heat fluxes/stocks===============
536 C ===================================================================
537
538 C determine available heat due to the atmosphere -- for open water
539 C ================================================================
540
541 C ocean surface/mixed layer temperature
542 DO J=1,sNy
543 DO I=1,sNx
544 TMIX(I,J,bi,bj)=theta(I,J,kSurface,bi,bj)+celsius2K
545 ENDDO
546 ENDDO
547
548 C wind speed from exf
549 DO J=1,sNy
550 DO I=1,sNx
551 UG(I,J) = MAX(SEAICE_EPS,wspeed(I,J,bi,bj))
552 ENDDO
553 ENDDO
554
555 #ifdef ALLOW_AUTODIFF_TAMC
556 CADJ STORE qnet(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
557 CADJ STORE qsw(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
558 cCADJ STORE UG = comlev1_bibj, key = iicekey,byte=isbyte
559 cCADJ STORE TMIX(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
560 #endif /* ALLOW_AUTODIFF_TAMC */
561
562 CALL SEAICE_BUDGET_OCEAN(
563 I UG,
564 U TMIX,
565 O a_QbyATM_open, a_QSWbyATM_open,
566 I bi, bj, myTime, myIter, myThid )
567
568 C determine available heat due to the atmosphere -- for ice covered water
569 C =======================================================================
570
571 #ifdef ALLOW_ATM_WIND
572 IF (useRelativeWind) THEN
573 C Compute relative wind speed over sea ice.
574 DO J=1,sNy
575 DO I=1,sNx
576 SPEED_SQ =
577 & (uWind(I,J,bi,bj)
578 & +0.5 _d 0*(uVel(i,j,kSurface,bi,bj)
579 & +uVel(i+1,j,kSurface,bi,bj))
580 & -0.5 _d 0*(uice(i,j,bi,bj)+uice(i+1,j,bi,bj)))**2
581 & +(vWind(I,J,bi,bj)
582 & +0.5 _d 0*(vVel(i,j,kSurface,bi,bj)
583 & +vVel(i,j+1,kSurface,bi,bj))
584 & -0.5 _d 0*(vice(i,j,bi,bj)+vice(i,j+1,bi,bj)))**2
585 IF ( SPEED_SQ .LE. SEAICE_EPS_SQ ) THEN
586 UG(I,J)=SEAICE_EPS
587 ELSE
588 UG(I,J)=SQRT(SPEED_SQ)
589 ENDIF
590 ENDDO
591 ENDDO
592 ENDIF
593 #endif
594
595 #ifdef ALLOW_AUTODIFF_TAMC
596 CADJ STORE tice = comlev1, key = ikey_dynamics, byte = isbyte
597 CADJ STORE hsnowActual = comlev1_bibj, key = iicekey, byte = isbyte
598 CADJ STORE heffActual = comlev1_bibj, key = iicekey, byte = isbyte
599 CADJ STORE UG = comlev1_bibj, key = iicekey, byte = isbyte
600 # ifdef SEAICE_MULTICATEGORY
601 CADJ STORE tices = comlev1, key = ikey_dynamics, byte = isbyte
602 # endif /* SEAICE_MULTICATEGORY */
603 #endif /* ALLOW_AUTODIFF_TAMC */
604
605 C-- Start loop over multi-categories, if SEAICE_MULTICATEGORY is undefined
606 C nDim = 1, and there is only one loop iteration
607 #ifdef SEAICE_MULTICATEGORY
608 DO IT=1,nDim
609 #ifdef ALLOW_AUTODIFF_TAMC
610 C Why do we need this store directive when we have just stored
611 C TICES before the loop?
612 ilockey = (iicekey-1)*nDim + IT
613 CADJ STORE tices(:,:,it,bi,bj) = comlev1_multdim,
614 CADJ & key = ilockey, byte = isbyte
615 #endif /* ALLOW_AUTODIFF_TAMC */
616 pFac = (2.0 _d 0*real(IT)-1.0 _d 0)/nDim
617 DO J=1,sNy
618 DO I=1,sNx
619 heffActualP(I,J)= heffActual(I,J)*pFac
620 TICE(I,J,bi,bj)=TICES(I,J,IT,bi,bj)
621 ENDDO
622 ENDDO
623 CALL SEAICE_SOLVE4TEMP(
624 I UG, heffActualP, hsnowActual,
625 U TICE,
626 O a_QbyATMmult_cover, a_QSWbyATMmult_cover,
627 O a_FWbySublimMult,
628 I bi, bj, myTime, myIter, myThid )
629 DO J=1,sNy
630 DO I=1,sNx
631 C average over categories
632 a_QbyATM_cover (I,J) = a_QbyATM_cover(I,J)
633 & + a_QbyATMmult_cover(I,J)/nDim
634 a_QSWbyATM_cover (I,J) = a_QSWbyATM_cover(I,J)
635 & + a_QSWbyATMmult_cover(I,J)/nDim
636 a_FWbySublim (I,J) = a_FWbySublim(I,J)
637 & + a_FWbySublimMult(I,J)/nDim
638 TICES(I,J,IT,bi,bj) = TICE(I,J,bi,bj)
639 ENDDO
640 ENDDO
641 ENDDO
642 #else
643 CALL SEAICE_SOLVE4TEMP(
644 I UG, heffActual, hsnowActual,
645 U TICE,
646 O a_QbyATM_cover, a_QSWbyATM_cover, a_FWbySublim,
647 I bi, bj, myTime, myIter, myThid )
648 #endif /* SEAICE_MULTICATEGORY */
649 C-- End loop over multi-categories
650
651 #ifdef ALLOW_DIAGNOSTICS
652 IF ( useDiagnostics ) THEN
653 IF ( DIAGNOSTICS_IS_ON('SIatmQnt',myThid) ) THEN
654 DO J=1,sNy
655 DO I=1,sNx
656 CML If I consider the atmosphere above the ice, the surface flux
657 CML which is relevant for the air temperature dT/dt Eq
658 CML accounts for sensible and radiation (with different treatment
659 CML according to wave-length) fluxes but not for "latent heat flux",
660 CML since it does not contribute to heating the air.
661 CML So this diagnostic is only good for heat budget calculations within
662 CML the ice-ocean system.
663 DIAGarray(I,J) = maskC(I,J,kSurface,bi,bj) * (
664 & a_QbyATM_cover(I,J) * AREApreTH(I,J)
665 & + a_QbyATM_open(I,J) * ( ONE - AREApreTH(I,J) ) )
666 ENDDO
667 ENDDO
668 CALL DIAGNOSTICS_FILL(DIAGarray,'SIatmQnt',0,1,3,bi,bj,myThid)
669 ENDIF
670 IF ( DIAGNOSTICS_IS_ON('SIfwSubl',myThid) ) THEN
671 DO J=1,sNy
672 DO I=1,sNx
673 DIAGarray(I,J) = maskC(I,J,kSurface,bi,bj) *
674 & a_FWbySublim(I,J) * AREApreTH(I,J)
675 ENDDO
676 ENDDO
677 CALL DIAGNOSTICS_FILL(DIAGarray,'SIfwSubl',0,1,3,bi,bj,myThid)
678 ENDIF
679 IF ( DIAGNOSTICS_IS_ON('SIatmFW ',myThid) ) THEN
680 DO J=1,sNy
681 DO I=1,sNx
682 DIAGarray(I,J) = maskC(I,J,kSurface,bi,bj)*(
683 & PRECIP(I,J,bi,bj)
684 & - EVAP(I,J,bi,bj)
685 & *( ONE - AREApreTH(I,J) )
686 #ifdef ALLOW_RUNOFF
687 & + RUNOFF(I,J,bi,bj)
688 #endif /* ALLOW_RUNOFF */
689 & )*rhoConstFresh
690 #ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
691 & - a_FWbySublim(I,J)*AREApreTH(I,J)
692 #endif /* SEAICE_ADD_SUBLIMATION_TO_FWBUDGET */
693 ENDDO
694 ENDDO
695 CALL DIAGNOSTICS_FILL(DIAGarray,'SIatmFW ',0,1,3,bi,bj,myThid)
696 ENDIF
697 ENDIF
698 #endif /* ALLOW_DIAGNOSTICS */
699
700 C switch heat fluxes from W/m2 to 'effective' ice meters
701 DO J=1,sNy
702 DO I=1,sNx
703 a_QbyATM_cover(I,J) = a_QbyATM_cover(I,J)
704 & * convertQ2HI * AREApreTH(I,J)
705 a_QSWbyATM_cover(I,J) = a_QSWbyATM_cover(I,J)
706 & * convertQ2HI * AREApreTH(I,J)
707 a_QbyATM_open(I,J) = a_QbyATM_open(I,J)
708 & * convertQ2HI * ( ONE - AREApreTH(I,J) )
709 a_QSWbyATM_open(I,J) = a_QSWbyATM_open(I,J)
710 & * convertQ2HI * ( ONE - AREApreTH(I,J) )
711 C and initialize r_QbyATM_cover/r_QbyATM_open
712 r_QbyATM_cover(I,J)=a_QbyATM_cover(I,J)
713 r_QbyATM_open(I,J)=a_QbyATM_open(I,J)
714
715 #ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
716 C Convert fresh water flux by sublimation to 'effective' ice meters.
717 C Negative sublimation is resublimation and will be added as snow.
718 a_FWbySublim(I,J) = SEAICE_deltaTtherm/SEAICE_rhoIce
719 & * a_FWbySublim(I,J)*AREApreTH(I,J)
720 #endif /* SEAICE_ADD_SUBLIMATION_TO_FWBUDGET */
721 ENDDO
722 ENDDO
723
724 #ifdef ALLOW_AUTODIFF_TAMC
725 #ifdef SEAICE_MODIFY_GROWTH_ADJ
726 Cgf no additional dependency through ice cover
727 if ( SEAICEadjMODE.GE.3 ) then
728 DO J=1,sNy
729 DO I=1,sNx
730 a_QbyATM_cover(I,J) = 0. _d 0
731 r_QbyATM_cover(I,J) = 0. _d 0
732 a_QSWbyATM_cover(I,J) = 0. _d 0
733 ENDDO
734 ENDDO
735 endif
736 #endif
737 #endif
738
739 C determine available heat due to the ice pack tying the
740 C underlying surface water temperature to freezing point
741 C ======================================================
742
743 #ifdef ALLOW_AUTODIFF_TAMC
744 CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
745 #endif
746
747
748 DO J=1,sNy
749 DO I=1,sNx
750
751 #ifdef SEAICE_VARIABLE_FREEZING_POINT
752 TBC = -0.0575 _d 0*salt(I,J,kSurface,bi,bj) + 0.0901 _d 0
753 #endif /* SEAICE_VARIABLE_FREEZING_POINT */
754
755 #ifdef MCPHEE_OCEAN_ICE_HEAT_FLUX
756 DIAGarrayA (I,J) = ZERO
757
758 c Bound the ocean temperature to be at or above the freezing point.
759 surf_theta = max(theta(I,J,kSurface,bi,bj), TBC)
760 #ifdef GRADIENT_MIXED_LAYER_TURBULENCE_FACTOR
761 MixedLayerTurbulenceFactor = 12.5 _d 0 -
762 & 11.5 *AREApreTH(I,J)
763 #else
764 c If ice is present, MixedLayerTurbulenceFactor = 1.0, else 12.50
765 IF (AREApreTH(I,J) .GT. 0. _d 0) THEN
766 MixedLayerTurbulenceFactor = ONE
767 ELSE
768 MixedLayerTurbulenceFactor = 12.5 _d 0
769 ENDIF
770 #endif /* GRADIENT_MIXED_LAYER_TURBULENCE_FACTOR */
771
772 c The flux
773 F_oi(I,J) = -STANTON_NUMBER * USTAR_BASE * rhoConst *
774 & HeatCapacity_Cp *(surf_theta - TBC)*
775 & MixedLayerTurbulenceFactor*hFacC(i,j,kSurface,bi,bj)
776
777 a_QbyOCN(I,J) = F_oi(I,J) * convertQ2HI
778
779 #else
780
781 IF ( .NOT. inAdMode ) THEN
782 IF ( theta(I,J,kSurface,bi,bj) .GE. TBC ) THEN
783 a_QbyOCN(i,j) = -SEAICE_availHeatFrac
784 & * (theta(I,J,kSurface,bi,bj)-TBC) * dRf(kSurface)
785 & * hFacC(i,j,kSurface,bi,bj) *
786 & (HeatCapacity_Cp*rhoConst/QI)
787 ELSE
788 a_QbyOCN(i,j) = -SEAICE_availHeatFracFrz
789 & * (theta(I,J,kSurface,bi,bj)-TBC) * dRf(kSurface)
790 & * hFacC(i,j,kSurface,bi,bj) *
791 & (HeatCapacity_Cp*rhoConst/QI)
792 ENDIF
793 ELSE
794 a_QbyOCN(i,j) = 0.
795 ENDIF
796
797 #endif /* MCPHEE_OCEAN_ICE_HEAT_FLUX */
798
799 r_QbyOCN(i,j) = a_QbyOCN(i,j)
800
801 ENDDO
802 ENDDO
803
804 #ifdef MCPHEE_OCEAN_ICE_HEAT_FLUX
805 #ifdef ALLOW_DIAGNOSTICS
806 IF ( useDiagnostics ) THEN
807 IF ( DIAGNOSTICS_IS_ON('SIDDUM10',myThid) ) THEN
808 CALL DIAGNOSTICS_FILL(DIAGarrayA,
809 & 'SIDDUM10',0,1,3,bi,bj,myThid)
810 ENDIF
811 ENDIF
812 #endif
813 #endif
814
815
816
817 #ifdef ALLOW_AUTODIFF_TAMC
818 #ifdef SEAICE_SIMPLIFY_GROWTH_ADJ
819 CALL ZERO_ADJ_1D( sNx*sNy, r_QbyOCN, myThid)
820 #endif
821 #endif
822
823
824 C ===================================================================
825 C =========PART 3: determine effective thicknesses increments========
826 C ===================================================================
827
828 C compute ice thickness tendency due to ice-ocean interaction
829 C ===========================================================
830
831 #ifdef ALLOW_AUTODIFF_TAMC
832 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
833 CADJ STORE r_QbyOCN = comlev1_bibj,key=iicekey,byte=isbyte
834 #endif /* ALLOW_AUTODIFF_TAMC */
835
836 DO J=1,sNy
837 DO I=1,sNx
838 d_HEFFbyOCNonICE(I,J)=MAX(r_QbyOCN(i,j), -HEFF(I,J,bi,bj))
839 r_QbyOCN(I,J)=r_QbyOCN(I,J)-d_HEFFbyOCNonICE(I,J)
840 HEFF(I,J,bi,bj)=HEFF(I,J,bi,bj) + d_HEFFbyOCNonICE(I,J)
841 #ifdef ALLOW_DIAGNOSTICS
842 DIAGarrayA(I,J) = d_HEFFbyOCNonICE(i,j)
843 #endif
844 ENDDO
845 ENDDO
846
847 #ifdef ALLOW_DIAGNOSTICS
848 IF ( useDiagnostics ) THEN
849 IF ( DIAGNOSTICS_IS_ON('SIDDUM01',myThid) ) THEN
850 CALL DIAGNOSTICS_FILL(DIAGarrayA,
851 & 'SIDDUM01',0,1,3,bi,bj,myThid)
852 ENDIF
853 ENDIF
854 #endif
855
856 #ifdef SEAICE_GROWTH_LEGACY
857 #ifdef ALLOW_DIAGNOSTICS
858 IF ( useDiagnostics ) THEN
859 IF ( DIAGNOSTICS_IS_ON('SIyneg ',myThid) ) THEN
860 CALL DIAGNOSTICS_FILL(d_HEFFbyOCNonICE,
861 & 'SIyneg ',0,1,1,bi,bj,myThid)
862 ENDIF
863 ENDIF
864 #endif
865 #endif
866
867 C compute snow melt tendency due to snow-atmosphere interaction
868 C ==================================================================
869
870 #ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
871 #ifdef ALLOW_AUTODIFF_TAMC
872 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
873 CADJ STORE a_FWbySublim = comlev1_bibj,key=iicekey,byte=isbyte
874 #endif /* ALLOW_AUTODIFF_TAMC */
875 C First apply sublimation to snow
876 rodt = ICE2SNOW
877 rrodt = 1./rodt
878 DO J=1,sNy
879 DO I=1,sNx
880 IF ( a_FWbySublim(I,J) .LT. 0. _d 0 ) THEN
881 C resublimate as snow
882 d_HSNWbySublim(I,J) = -a_FWbySublim(I,J)*rodt
883 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj) + d_HSNWbySublim(I,J)
884 a_FWbySublim(I,J) = 0. _d 0
885 ENDIF
886 C sublimate snow first
887 tmpscal1 = MIN(a_FWbySublim(I,J)*rodt,HSNOW(I,J,bi,bj))
888 tmpscal2 = MAX(tmpscal1,0. _d 0)
889 d_HSNWbySublim(I,J) = - tmpscal2
890 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj) - tmpscal2
891 a_FWbySublim(I,J) = a_FWbySublim(I,J) - tmpscal2*rrodt
892 ENDDO
893 ENDDO
894 #endif /* SEAICE_ADD_SUBLIMATION_TO_FWBUDGET */
895
896 #ifdef ALLOW_AUTODIFF_TAMC
897 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
898 CADJ STORE r_QbyATM_cover = comlev1_bibj,key=iicekey,byte=isbyte
899 #endif /* ALLOW_AUTODIFF_TAMC */
900
901 DO J=1,sNy
902 DO I=1,sNx
903 tmpscal1=MAX(r_QbyATM_cover(I,J)*ICE2SNOW,-HSNOW(I,J,bi,bj))
904 tmpscal2=MIN(tmpscal1,0. _d 0)
905 #ifdef SEAICE_MODIFY_GROWTH_ADJ
906 Cgf no additional dependency through snow
907 if ( SEAICEadjMODE.GE.2 ) tmpscal2 = 0. _d 0
908 #endif
909 d_HSNWbyATMonSNW(I,J)= tmpscal2
910 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj) + tmpscal2
911 r_QbyATM_cover(I,J)=r_QbyATM_cover(I,J) - tmpscal2/ICE2SNOW
912 ENDDO
913 ENDDO
914
915 C compute ice thickness tendency due to the atmosphere
916 C ====================================================
917
918 #ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
919 #ifdef ALLOW_AUTODIFF_TAMC
920 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
921 CADJ STORE a_FWbySublim = comlev1_bibj,key=iicekey,byte=isbyte
922 #endif /* ALLOW_AUTODIFF_TAMC */
923 C Apply sublimation to ice
924 rodt = 1. _d 0
925 rrodt = 1./rodt
926 DO J=1,sNy
927 DO I=1,sNx
928 C If anything is left, sublimate ice
929 tmpscal1 = MIN(a_FWbySublim(I,J)*rodt,HEFF(I,J,bi,bj))
930 tmpscal2 = MAX(tmpscal1,0. _d 0)
931 d_HEFFbySublim(I,J) = - tmpscal2
932 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) - tmpscal2
933 a_FWbySublim(I,J) = a_FWbySublim(I,J) - tmpscal2*rrodt
934 ENDDO
935 ENDDO
936 #endif /* SEAICE_ADD_SUBLIMATION_TO_FWBUDGET */
937
938 #ifdef ALLOW_AUTODIFF_TAMC
939 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
940 CADJ STORE r_QbyATM_cover = comlev1_bibj,key=iicekey,byte=isbyte
941 #endif /* ALLOW_AUTODIFF_TAMC */
942
943 Cgf note: this block is not actually tested by lab_sea
944 Cgf where all experiments start in January. So even though
945 Cgf the v1.81=>v1.82 revision would change results in
946 Cgf warming conditions, the lab_sea results were not changed.
947
948 DO J=1,sNy
949 DO I=1,sNx
950 #ifdef FENTY_DELTA_HEFF_OPEN_WATER_FLUXES
951 c Thickening of the existing ice pack is limited by the
952 c residual capability of the ocean to melt (weighted by
953 c the ice-covered area)
954 tmpscal2 = MAX(-HEFF(i,j,bi,bj) ,
955 & r_QbyATM_cover(I,J) + AREApreTH(I,J) * r_QbyOCN(I,J))
956 #else
957 tmpscal2 = MAX(-HEFF(I,J,bi,bj),r_QbyATM_cover(I,J))
958 #endif FENTY_DELTA_HEFF_OPEN_WATER_FLUXES
959
960 d_HEFFbyATMonICE(I,J)=d_HEFFbyATMonICE(I,J)+tmpscal2
961 r_QbyATM_cover(I,J)=r_QbyATM_cover(I,J)-tmpscal2
962 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) + tmpscal2
963
964 DIAGarrayA(I,J) = d_HEFFbyATMonICE(I,J)
965 DIAGarrayB(I,J) = r_QbyATM_cover(I,J)
966 ENDDO
967 ENDDO
968
969 #ifdef ALLOW_DIAGNOSTICS
970 IF ( useDiagnostics ) THEN
971 IF ( DIAGNOSTICS_IS_ON('SIDDUM02',myThid) ) THEN
972 CALL DIAGNOSTICS_FILL(DIAGarrayA,
973 & 'SIDDUM02',0,1,3,bi,bj,myThid)
974 ENDIF
975 IF ( DIAGNOSTICS_IS_ON('SIDDUM09',myThid) ) THEN
976 CALL DIAGNOSTICS_FILL(DIAGarrayB,
977 & 'SIDDUM09',0,1,3,bi,bj,myThid)
978 ENDIF
979 ENDIF
980 #endif
981
982 C attribute precip to fresh water or snow stock,
983 C depending on atmospheric conditions.
984 C =================================================
985 #ifdef ALLOW_ATM_TEMP
986 #ifdef ALLOW_AUTODIFF_TAMC
987 CADJ STORE a_QbyATM_cover = comlev1_bibj,key=iicekey,byte=isbyte
988 CADJ STORE PRECIP(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
989 CADJ STORE AREApreTH = comlev1_bibj,key=iicekey,byte=isbyte
990 #endif /* ALLOW_AUTODIFF_TAMC */
991 DO J=1,sNy
992 DO I=1,sNx
993 C possible alternatives to the a_QbyATM_cover criterium
994 c IF (TICE(I,J,bi,bj) .LT. TMIX) THEN
995 c IF (atemp(I,J,bi,bj) .LT. celsius2K) THEN
996 IF ( a_QbyATM_cover(I,J).GE. 0. _d 0 ) THEN
997 C add precip as snow
998 d_HFRWbyRAIN(I,J)=0. _d 0
999 d_HSNWbyRAIN(I,J)=convertPRECIP2HI*ICE2SNOW*
1000 & PRECIP(I,J,bi,bj)*AREApreTH(I,J)
1001 ELSE
1002 C add precip to the fresh water bucket
1003 d_HFRWbyRAIN(I,J)=-convertPRECIP2HI*
1004 & PRECIP(I,J,bi,bj)*AREApreTH(I,J)
1005 d_HSNWbyRAIN(I,J)=0. _d 0
1006 ENDIF
1007 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj) + d_HSNWbyRAIN(I,J)
1008 ENDDO
1009 ENDDO
1010 Cgf note: this does not affect air-sea heat flux,
1011 Cgf since the implied air heat gain to turn
1012 Cgf rain to snow is not a surface process.
1013 #ifdef ALLOW_DIAGNOSTICS
1014 IF ( useDiagnostics ) THEN
1015 IF ( DIAGNOSTICS_IS_ON('SIsnPrcp',myThid) ) THEN
1016 DO J=1,sNy
1017 DO I=1,sNx
1018 DIAGarray(I,J) = maskC(I,J,kSurface,bi,bj)
1019 & * d_HSNWbyRAIN(I,J)*SEAICE_rhoSnow/SEAICE_deltaTtherm
1020 ENDDO
1021 ENDDO
1022 CALL DIAGNOSTICS_FILL(DIAGarray,'SIsnPrcp',0,1,3,bi,bj,myThid)
1023 ENDIF
1024 ENDIF
1025 #endif /* ALLOW_DIAGNOSTICS */
1026 #endif /* ALLOW_ATM_TEMP */
1027
1028 C compute snow melt due to heat available from ocean.
1029 C =================================================================
1030
1031 Cgf do we need to keep this comment and cpp bracket?
1032 Cph( very sensitive bit here by JZ
1033 #ifndef SEAICE_EXCLUDE_FOR_EXACT_AD_TESTING
1034 #ifdef ALLOW_AUTODIFF_TAMC
1035 CADJ STORE HSNOW(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1036 CADJ STORE r_QbyOCN = comlev1_bibj,key=iicekey,byte=isbyte
1037 #endif /* ALLOW_AUTODIFF_TAMC */
1038 DO J=1,sNy
1039 DO I=1,sNx
1040 tmpscal1=MAX(r_QbyOCN(i,j)*ICE2SNOW, -HSNOW(I,J,bi,bj))
1041 tmpscal2=MIN(tmpscal1,0. _d 0)
1042 #ifdef SEAICE_MODIFY_GROWTH_ADJ
1043 Cgf no additional dependency through snow
1044 if ( SEAICEadjMODE.GE.2 ) tmpscal2 = 0. _d 0
1045 #endif
1046 d_HSNWbyOCNonSNW(I,J) = tmpscal2
1047 r_QbyOCN(I,J)=r_QbyOCN(I,J)
1048 & -d_HSNWbyOCNonSNW(I,J)/ICE2SNOW
1049 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)+d_HSNWbyOCNonSNW(I,J)
1050 ENDDO
1051 ENDDO
1052 #endif /* SEAICE_EXCLUDE_FOR_EXACT_AD_TESTING */
1053 Cph)
1054
1055 C gain of new ice over open water
1056 C ===============================
1057 #ifndef SEAICE_GROWTH_LEGACY
1058 #ifdef SEAICE_DO_OPEN_WATER_GROWTH
1059 #ifdef ALLOW_AUTODIFF_TAMC
1060 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1061 CADJ STORE r_QbyATM_open = comlev1_bibj,key=iicekey,byte=isbyte
1062 CADJ STORE r_QbyOCN = comlev1_bibj,key=iicekey,byte=isbyte
1063 CADJ STORE a_QSWbyATM_cover = comlev1_bibj,key=iicekey,byte=isbyte
1064 CADJ STORE a_QSWbyATM_open = comlev1_bibj,key=iicekey,byte=isbyte
1065 #endif /* ALLOW_AUTODIFF_TAMC */
1066 DO J=1,sNy
1067 DO I=1,sNx
1068
1069 #ifdef FENTY_DELTA_HEFF_OPEN_WATER_FLUXES
1070 c The sum of open water fluxes + the residual ocean-ice
1071 c fluxes (weighted by the open water fraction).
1072 c Using the McPhee parameterization, r_QbyOCN .LE. ZERO
1073 tmpscal1=r_QbyATM_open(I,J)+r_QbyOCN(i,j) *
1074 & (1.0 _d 0 - AREApreTH(i,J))
1075
1076 tmpscal2=SWFRACB * a_QSWbyATM_open(I,J)
1077
1078 c Open water convergent heat fluxes do not melt ice directly
1079 c but indirectly by first heating the ocean.
1080 tmpscal3 = MAX(0.0 _d 0, tmpscal1-tmpscal2)
1081
1082 #else /* FENTY_DELTA_HEFF_OPEN_WATER_FLUXES */
1083
1084 if ( (r_QbyATM_open(I,J).GT.0. _d 0).AND.
1085 & (HEFF(I,J,bi,bj).GT.0. _d 0) ) then
1086 tmpscal1=r_QbyATM_open(I,J)+r_QbyOCN(i,j)
1087 C at this point r_QbyOCN(i,j)<=0 and represents the heat
1088 C that is still needed to get to the first layer to freezing point
1089 tmpscal2=SWFRACB*(a_QSWbyATM_cover(I,J)
1090 & +a_QSWbyATM_open(I,J))
1091 C SWFRACB*tmpscal2<=0 is the heat (out of qnet) that is not
1092 C going to the first layer, which favors its freezing
1093 tmpscal3=MAX(0. _d 0, tmpscal1-tmpscal2)
1094 else
1095 tmpscal3=0. _d 0
1096 endif
1097 #endif /* FENTY DELTA HEFF OPEN WATER FLUXES */
1098
1099 d_HEFFbyATMonOCN_open(I,J)=tmpscal3
1100
1101 DIAGarrayA(I,J) = maskC(I,J,kSurface,bi,bj)
1102 & * d_HEFFbyATMonOCN_open(I,J)
1103
1104
1105 C The distinct d_HEFFbyATMonOCN_open array is only needed for d_AREA computation.
1106 C For the rest it is treated as another contribution to d_HEFFbyATMonOCN.
1107 d_HEFFbyATMonOCN(I,J)=d_HEFFbyATMonOCN(I,J)+tmpscal3
1108 r_QbyATM_open(I,J)=r_QbyATM_open(I,J)-tmpscal3
1109 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) + tmpscal3
1110
1111 DIAGarrayB(I,J) = maskC(I,J,kSurface,bi,bj)
1112 & * r_QbyATM_open(I,J)
1113
1114 ENDDO
1115 ENDDO
1116
1117 #ifdef ALLOW_DIAGNOSTICS
1118 IF ( useDiagnostics ) THEN
1119 IF ( DIAGNOSTICS_IS_ON('SIDDUM08',myThid) ) THEN
1120 CALL DIAGNOSTICS_FILL(DIAGarrayB,
1121 & 'SIDDUM08',0,1,3,bi,bj,myThid)
1122 ENDIF
1123 IF ( DIAGNOSTICS_IS_ON('SIDDUM03',myThid) ) THEN
1124 CALL DIAGNOSTICS_FILL(DIAGarrayA,
1125 & 'SIDDUM03',0,1,3,bi,bj,myThid)
1126 ENDIF
1127 ENDIF
1128 #endif /* ALLOW DIAGNOSTICS */
1129
1130 #endif /* SEAICE_DO_OPEN_WATER_GROWTH */
1131 #endif /* SEAICE_GROWTH_LEGACY */
1132
1133 C convert snow to ice if submerged.
1134 C =================================
1135
1136 #ifndef SEAICE_GROWTH_LEGACY
1137 C note: in legacy, this process is done at the end
1138 #ifdef ALLOW_SEAICE_FLOODING
1139 #ifdef ALLOW_AUTODIFF_TAMC
1140 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1141 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1142 #endif /* ALLOW_AUTODIFF_TAMC */
1143 IF ( SEAICEuseFlooding ) THEN
1144 DO J=1,sNy
1145 DO I=1,sNx
1146 hDraft = (HSNOW(I,J,bi,bj)*SEAICE_rhoSnow
1147 & +HEFF(I,J,bi,bj)*SEAICE_rhoIce)/rhoConst
1148 tmpscal1 = MAX( 0. _d 0, hDraft - HEFF(I,J,bi,bj))
1149 d_HEFFbyFLOODING(I,J)=tmpscal1
1150 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj)+d_HEFFbyFLOODING(I,J)
1151 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)-
1152 & d_HEFFbyFLOODING(I,J)*ICE2SNOW
1153 ENDDO
1154 ENDDO
1155 ENDIF
1156 #endif /* ALLOW_SEAICE_FLOODING */
1157 #endif /* SEAICE_GROWTH_LEGACY */
1158
1159
1160 C ===================================================================
1161 C ==========PART 4: determine ice cover fraction increments=========-
1162 C ===================================================================
1163
1164 #ifdef ALLOW_AUTODIFF_TAMC
1165 CADJ STORE d_HEFFbyATMonOCN = comlev1_bibj,key=iicekey,byte=isbyte
1166 CADJ STORE d_HEFFbyATMonICE = comlev1_bibj,key=iicekey,byte=isbyte
1167 CADJ STORE d_HEFFbyOCNonICE = comlev1_bibj,key=iicekey,byte=isbyte
1168 CADJ STORE d_HEFFbyATMonOCN_open=comlev1_bibj,key=iicekey,byte=isbyte
1169 CADJ STORE a_QbyATM_open = comlev1_bibj,key=iicekey,byte=isbyte
1170 CADJ STORE heffActual = comlev1_bibj,key=iicekey,byte=isbyte
1171 CADJ STORE AREApreTH = comlev1_bibj,key=iicekey,byte=isbyte
1172 CADJ STORE HEFF(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1173 CADJ STORE HSNOW(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1174 CADJ STORE AREA(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1175 #endif /* ALLOW_AUTODIFF_TAMC */
1176
1177 DO J=1,sNy
1178 DO I=1,sNx
1179 C compute ice melt due to ATM (and OCN) heat stocks
1180
1181 #ifdef FENTY_AREA_EXPANSION_CONTRACTION
1182 DIAGarrayA(I,J) = ZERO
1183 DIAGarrayB(I,J) = ZERO
1184 DIAGarrayC(I,J) = ZERO
1185 DIAGarray(I,J) = ZERO
1186
1187 c The minimum effective thickness used in the ice contraction
1188 c parameterization.
1189 heff_star = sqrt(HEFFpreTH(I,J)*HEFFPreTH(I,J) + 0.01 _d 0)
1190
1191 c the various thickness tendency terms
1192 tmpscal1 = d_HEFFbyATMOnOCN_open(I,J)
1193 tmpscal2 = d_HEFFbyATMOnICE(I,J)
1194 tmpscal3 = d_HEFFbyOCNonICE(I,J)
1195
1196 c Part 1: Expand ice cover in open-water areas
1197
1198 C All new ice cover is created from divergent air-sea heat fluxes. Divergent
1199 c air-sea heat fluxes must exceed the potential convergent ocean-ice heat fluxes
1200 c for ice to form. tmpscal1 = divergent air-sea heat fluxes - ocean-ice heat fluxes
1201
1202 IF (tmpscal1 .GT. ZERO) then
1203 IF ( YC(I,J,bi,bj) .LT. ZERO ) THEN
1204 d_AREAbyATM(I,J)=tmpscal1/HO_south
1205 ELSE
1206 d_AREAbyATM(I,J)=tmpscal1/HO
1207 ENDIF
1208 ENDIF
1209 DIAGarrayA(I,J) = d_AREAbyATM(I,J)
1210
1211 c Part 2: Reduce ice cover when existing ice thins from above
1212
1213 c Ice concentrations are reduced whenever existing ice thins from surface
1214 c heat flux convergence.
1215 if (tmpscal2 .LE. ZERO) then
1216 d_AREAbyICE(I,J) =
1217 & HALF * tmpscal2 * AREApreTH(I,J)/heff_star
1218 endif
1219 DIAGarrayB(I,J) = d_AREAbyICE(I,J)
1220
1221 c Part 3: Reduce ice cover when existing ice thins from below
1222
1223 c Sensible heat transfer from the ocean to the sea ice thins it and
1224 c reduces concentrations
1225 if (tmpscal3 .LE.ZERO) then
1226 d_AREAbyOCN(I,J) =
1227 & HALF * tmpscal3 * AREApreTH(I,J)/heff_star
1228 endif
1229 DIAGarrayC(I,J) = d_AREAbyOCN(I,J)
1230
1231 DIAGarray(I,J) = d_AREAbyICE(I,J) +
1232 & d_AREAbyATM(I,J) + d_AREAbyOCN(I,J)
1233
1234 #else FENTY_AREA_EXPANSION_CONTRACTION
1235
1236 #ifdef SEAICE_GROWTH_LEGACY
1237
1238 C compute heff after ice melt by ocn:
1239 tmpscal0=HEFF(I,J,bi,bj)
1240 & - d_HEFFbyATMonOCN(I,J) - d_HEFFbyFLOODING(I,J)
1241 C compute available heat left after snow melt by atm:
1242 tmpscal1= a_QbyATM_open(I,J)+a_QbyATM_cover(I,J)
1243 & - d_HSNWbyATMonSNW(I,J)/ICE2SNOW
1244 C (cannot melt more than all the ice)
1245 tmpscal2 = MAX(-tmpscal0,tmpscal1)
1246 tmpscal3 = MIN(ZERO,tmpscal2)
1247 #ifdef ALLOW_DIAGNOSTICS
1248 DIAGarray(I,J) = tmpscal2
1249 #endif
1250 C gain of new ice over open water
1251 tmpscal4 = MAX(ZERO,a_QbyATM_open(I,J))
1252
1253 #else /* SEAICE_GROWTH_LEGACY */
1254
1255 # ifdef SEAICE_OCN_MELT_ACT_ON_AREA
1256 C ice cover reduction by joint OCN+ATM melt
1257 tmpscal3 = MIN( 0. _d 0 ,
1258 & d_HEFFbyATMonOCN(I,J)+d_HEFFbyOCNonICE(I,J) )
1259 # else
1260 C ice cover reduction by ATM melt only -- as in legacy code
1261 tmpscal3 = MIN( 0. _d 0 , d_HEFFbyATMonOCN(I,J) )
1262 # endif
1263 C gain of new ice over open water
1264
1265 # ifdef SEAICE_DO_OPEN_WATER_GROWTH
1266 C the one effectively used to increment HEFF
1267 tmpscal4 = d_HEFFbyATMonOCN_open(I,J)
1268 # else
1269 C the virtual one -- as in legcy code
1270 tmpscal4 = MAX(ZERO,a_QbyATM_open(I,J))
1271 # endif
1272 #endif /* SEAICE_GROWTH_LEGACY */
1273
1274 C compute cover fraction tendency
1275 IF ( YC(I,J,bi,bj) .LT. ZERO ) THEN
1276 d_AREAbyATM(I,J)=tmpscal4/HO_south
1277 ELSE
1278 d_AREAbyATM(I,J)=tmpscal4/HO
1279 ENDIF
1280 d_AREAbyATM(I,J)=d_AREAbyATM(I,J)
1281 #ifdef SEAICE_GROWTH_LEGACY
1282 & +HALF*tmpscal3*AREApreTH(I,J)
1283 & /(tmpscal0+.00001 _d 0)
1284 #else
1285 & +HALF*tmpscal3/heffActual(I,J)
1286 #endif
1287
1288 #endif FENTY_AREA_EXPANSION_CONTRACTION
1289
1290 C apply tendency
1291 IF ( (HEFF(i,j,bi,bj).GT.0. _d 0).OR.
1292 & (HSNOW(i,j,bi,bj).GT.0. _d 0) ) THEN
1293 AREA(I,J,bi,bj)=max(0. _d 0 , min( 1. _d 0,
1294 & AREA(I,J,bi,bj)+d_AREAbyATM(I,J)
1295 #ifdef FENTY_AREA_EXPANSION_CONTRACTION
1296 & + d_AREAbyOCN(I,J) + d_AREAbyICE(I,J)
1297 #endif
1298 & ))
1299 ELSE
1300 AREA(I,J,bi,bj)=0. _d 0
1301 ENDIF
1302 ENDDO
1303 ENDDO
1304
1305 #ifdef ALLOW_DIAGNOSTICS
1306 IF ( useDiagnostics ) THEN
1307 IF ( DIAGNOSTICS_IS_ON('SIDDUM04',myThid) ) THEN
1308 CALL DIAGNOSTICS_FILL(DIAGarray,
1309 & 'SIDDUM04',0,1,3,bi,bj,myThid)
1310 ENDIF
1311 IF ( DIAGNOSTICS_IS_ON('SIDDUM05',myThid) ) THEN
1312 CALL DIAGNOSTICS_FILL(DIAGarrayA,
1313 & 'SIDDUM05',0,1,3,bi,bj,myThid)
1314 ENDIF
1315 IF ( DIAGNOSTICS_IS_ON('SIDDUM06',myThid) ) THEN
1316 CALL DIAGNOSTICS_FILL(DIAGarrayB,
1317 & 'SIDDUM06',0,1,3,bi,bj,myThid)
1318 ENDIF
1319 IF ( DIAGNOSTICS_IS_ON('SIDDUM07',myThid) ) THEN
1320 CALL DIAGNOSTICS_FILL(DIAGarrayC,
1321 & 'SIDDUM07',0,1,3,bi,bj,myThid)
1322 ENDIF
1323 ENDIF
1324 #endif
1325
1326 #ifdef ALLOW_AUTODIFF_TAMC
1327 #ifdef SEAICE_MODIFY_GROWTH_ADJ
1328 Cgf 'bulk' linearization of area=f(HEFF)
1329 if ( SEAICEadjMODE.GE.1 ) then
1330 DO J=1,sNy
1331 DO I=1,sNx
1332 C AREA(I,J,bi,bj) = 0.1 _d 0 * HEFF(I,J,bi,bj)
1333 AREA(I,J,bi,bj) = AREApreTH(I,J) + 0.1 _d 0 *
1334 & ( HEFF(I,J,bi,bj) - HEFFpreTH(I,J) )
1335 ENDDO
1336 ENDDO
1337 endif
1338 #endif
1339 #endif
1340
1341 #ifdef SEAICE_GROWTH_LEGACY
1342 #ifdef ALLOW_DIAGNOSTICS
1343 IF ( useDiagnostics ) THEN
1344 IF ( DIAGNOSTICS_IS_ON('SIfice ',myThid) ) THEN
1345 CALL DIAGNOSTICS_FILL(DIAGarray,'SIfice ',0,1,3,bi,bj,myThid)
1346 ENDIF
1347 ENDIF
1348 #endif
1349 #endif /* SEAICE_GROWTH_LEGACY */
1350
1351
1352 C ===================================================================
1353 C =============PART 5: determine ice salinity increments=============
1354 C ===================================================================
1355
1356 #ifndef SEAICE_SALINITY
1357 # ifdef ALLOW_AUTODIFF_TAMC
1358 # ifdef ALLOW_SALT_PLUME
1359 CADJ STORE d_HEFFbyNEG = comlev1_bibj,key=iicekey,byte=isbyte
1360 CADJ STORE d_HEFFbyOCNonICE = comlev1_bibj,key=iicekey,byte=isbyte
1361 CADJ STORE d_HEFFbyATMonOCN = comlev1_bibj,key=iicekey,byte=isbyte
1362 CADJ STORE d_HEFFbyATMonICE = comlev1_bibj,key=iicekey,byte=isbyte
1363 CADJ STORE d_HEFFbyFLOODING = comlev1_bibj,key=iicekey,byte=isbyte
1364 CADJ STORE salt(:,:,kSurface,bi,bj) = comlev1_bibj,
1365 CADJ & key = iicekey, byte = isbyte
1366 # endif /* ALLOW_SALT_PLUME */
1367 # endif /* ALLOW_AUTODIFF_TAMC */
1368 DO J=1,sNy
1369 DO I=1,sNx
1370 Cgf note: flooding does count negatively
1371 tmpscal1 = d_HEFFbyNEG(I,J) + d_HEFFbyOCNonICE(I,J) +
1372 & d_HEFFbyATMonICE(I,J) +
1373 & d_HEFFbyATMonOCN(I,J) - d_HEFFbyFLOODING(I,J)
1374 tmpscal2 = tmpscal1 * SIsal0 * HEFFM(I,J,bi,bj)
1375 & /SEAICE_deltaTtherm * ICE2WATR * rhoConstFresh
1376 saltFlux(I,J,bi,bj) = tmpscal2
1377 #ifdef ALLOW_SALT_PLUME
1378 tmpscal3 = tmpscal1*salt(I,j,kSurface,bi,bj)*HEFFM(I,J,bi,bj)
1379 & /SEAICE_deltaTtherm * ICE2WATR * rhoConstFresh
1380 saltPlumeFlux(I,J,bi,bj) = MAX( tmpscal3-tmpscal2 , 0. _d 0)
1381 #endif /* ALLOW_SALT_PLUME */
1382 ENDDO
1383 ENDDO
1384 #endif
1385
1386 #ifdef ALLOW_ATM_TEMP
1387 #ifdef SEAICE_SALINITY
1388
1389 #ifdef SEAICE_GROWTH_LEGACY
1390 # ifdef ALLOW_AUTODIFF_TAMC
1391 CADJ STORE hsalt(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1392 # endif /* ALLOW_AUTODIFF_TAMC */
1393 DO J=1,sNy
1394 DO I=1,sNx
1395 C set HSALT = 0 if HSALT < 0 and compute salt to remove from ocean
1396 IF ( HSALT(I,J,bi,bj) .LT. 0.0 ) THEN
1397 saltFluxAdjust(I,J) = - HEFFM(I,J,bi,bj) *
1398 & HSALT(I,J,bi,bj) / SEAICE_deltaTtherm
1399 HSALT(I,J,bi,bj) = 0.0 _d 0
1400 ENDIF
1401 ENDDO
1402 ENDDO
1403 #endif /* SEAICE_GROWTH_LEGACY */
1404
1405 #ifdef ALLOW_AUTODIFF_TAMC
1406 CADJ STORE hsalt(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1407 #endif /* ALLOW_AUTODIFF_TAMC */
1408
1409 DO J=1,sNy
1410 DO I=1,sNx
1411 C sum up the terms that affect the salt content of the ice pack
1412 tmpscal1=d_HEFFbyOCNonICE(I,J)+d_HEFFbyATMonOCN(I,J)+
1413 & d_HEFFbyATMonICE(I,J)
1414
1415 C recompute HEFF before thermodyncamic updates (which is not AREApreTH in legacy code)
1416 tmpscal2=HEFF(I,J,bi,bj)-tmpscal1-d_HEFFbyFLOODING(I,J)
1417 C tmpscal1 > 0 : m of sea ice that is created
1418 IF ( tmpscal1 .GE. 0.0 ) THEN
1419 saltFlux(I,J,bi,bj) =
1420 & HEFFM(I,J,bi,bj)/SEAICE_deltaTtherm
1421 & *SEAICE_salinity*salt(I,j,kSurface,bi,bj)
1422 & *tmpscal1*ICE2WATR*rhoConstFresh
1423 #ifdef ALLOW_SALT_PLUME
1424 C saltPlumeFlux is defined only during freezing:
1425 saltPlumeFlux(I,J,bi,bj)=
1426 & HEFFM(I,J,bi,bj)/SEAICE_deltaTtherm
1427 & *(1-SEAICE_salinity)*salt(I,j,kSurface,bi,bj)
1428 & *tmpscal1*ICE2WATR*rhoConstFresh
1429 C if SaltPlumeSouthernOcean=.FALSE. turn off salt plume in Southern Ocean
1430 IF ( .NOT. SaltPlumeSouthernOcean ) THEN
1431 IF ( YC(I,J,bi,bj) .LT. 0.0 _d 0 )
1432 & saltPlumeFlux(i,j,bi,bj) = 0.0 _d 0
1433 ENDIF
1434 #endif /* ALLOW_SALT_PLUME */
1435
1436 C tmpscal1 < 0 : m of sea ice that is melted
1437 ELSE
1438 saltFlux(I,J,bi,bj) =
1439 & HEFFM(I,J,bi,bj)/SEAICE_deltaTtherm
1440 & *HSALT(I,J,bi,bj)
1441 & *tmpscal1/tmpscal2
1442 #ifdef ALLOW_SALT_PLUME
1443 saltPlumeFlux(i,j,bi,bj) = 0.0 _d 0
1444 #endif /* ALLOW_SALT_PLUME */
1445 ENDIF
1446 C update HSALT based on surface saltFlux
1447 HSALT(I,J,bi,bj) = HSALT(I,J,bi,bj) +
1448 & saltFlux(I,J,bi,bj) * SEAICE_deltaTtherm
1449 saltFlux(I,J,bi,bj) =
1450 & saltFlux(I,J,bi,bj) + saltFluxAdjust(I,J)
1451 #ifdef SEAICE_GROWTH_LEGACY
1452 C set HSALT = 0 if HEFF = 0 and compute salt to dump into ocean
1453 IF ( HEFF(I,J,bi,bj) .EQ. 0.0 ) THEN
1454 saltFlux(I,J,bi,bj) = saltFlux(I,J,bi,bj) -
1455 & HEFFM(I,J,bi,bj) * HSALT(I,J,bi,bj) /
1456 & SEAICE_deltaTtherm
1457 HSALT(I,J,bi,bj) = 0.0 _d 0
1458 #ifdef ALLOW_SALT_PLUME
1459 saltPlumeFlux(i,j,bi,bj) = 0.0 _d 0
1460 #endif /* ALLOW_SALT_PLUME */
1461 ENDIF
1462 #endif /* SEAICE_GROWTH_LEGACY */
1463 ENDDO
1464 ENDDO
1465 #endif /* SEAICE_SALINITY */
1466 #endif /* ALLOW_ATM_TEMP */
1467
1468
1469 C =======================================================================
1470 C =====LEGACY PART 5.5: treat pathological cases, then do flooding ======
1471 C =======================================================================
1472
1473 #ifdef SEAICE_GROWTH_LEGACY
1474
1475 C treat values of ice cover fraction oustide
1476 C the [0 1] range, and other such issues.
1477 C ===========================================
1478
1479 Cgf note: this part cannot be heat and water conserving
1480
1481 #ifdef ALLOW_AUTODIFF_TAMC
1482 CADJ STORE area(:,:,bi,bj) = comlev1_bibj,
1483 CADJ & key = iicekey, byte = isbyte
1484 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,
1485 CADJ & key = iicekey, byte = isbyte
1486 #endif /* ALLOW_AUTODIFF_TAMC */
1487 DO J=1,sNy
1488 DO I=1,sNx
1489 C NOW SET AREA(I,J,bi,bj)=0 WHERE NO ICE IS
1490 AREA(I,J,bi,bj)=MIN(AREA(I,J,bi,bj)
1491 & ,HEFF(I,J,bi,bj)/.0001 _d 0)
1492 ENDDO
1493 ENDDO
1494
1495 #ifdef ALLOW_AUTODIFF_TAMC
1496 CADJ STORE area(:,:,bi,bj) = comlev1_bibj,
1497 CADJ & key = iicekey, byte = isbyte
1498 #endif /* ALLOW_AUTODIFF_TAMC */
1499 DO J=1,sNy
1500 DO I=1,sNx
1501 C NOW TRUNCATE AREA
1502 AREA(I,J,bi,bj)=MIN(ONE,AREA(I,J,bi,bj))
1503 ENDDO
1504 ENDDO
1505
1506 #ifdef ALLOW_AUTODIFF_TAMC
1507 CADJ STORE area(:,:,bi,bj) = comlev1_bibj,
1508 CADJ & key = iicekey, byte = isbyte
1509 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
1510 CADJ & key = iicekey, byte = isbyte
1511 #endif /* ALLOW_AUTODIFF_TAMC */
1512 DO J=1,sNy
1513 DO I=1,sNx
1514 AREA(I,J,bi,bj) = MAX(ZERO,AREA(I,J,bi,bj))
1515 HSNOW(I,J,bi,bj) = MAX(ZERO,HSNOW(I,J,bi,bj))
1516 AREA(I,J,bi,bj) = AREA(I,J,bi,bj)*HEFFM(I,J,bi,bj)
1517 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj)*HEFFM(I,J,bi,bj)
1518 #ifdef SEAICE_CAP_HEFF
1519 C This is not energy conserving, but at least it conserves fresh water
1520 tmpscal0 = -MAX(HEFF(I,J,bi,bj)-MAX_HEFF,0. _d 0)
1521 d_HEFFbyNeg(I,J) = d_HEFFbyNeg(I,J) + tmpscal0
1522 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) + tmpscal0
1523 #endif /* SEAICE_CAP_HEFF */
1524 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)*HEFFM(I,J,bi,bj)
1525 ENDDO
1526 ENDDO
1527
1528 #ifdef ALLOW_DIAGNOSTICS
1529 IF ( useDiagnostics ) THEN
1530 IF ( DIAGNOSTICS_IS_ON('SIthdgrh',myThid) ) THEN
1531 DO J=1,sNy
1532 DO I=1,sNx
1533 tmparr1(I,J) = (HEFF(I,J,bi,bj)-HEFFpreTH(I,J))
1534 & /SEAICE_deltaTtherm
1535 ENDDO
1536 ENDDO
1537 CALL DIAGNOSTICS_FILL(tmparr1,'SIthdgrh',0,1,3,bi,bj,myThid)
1538 ENDIF
1539 ENDIF
1540 #endif /* ALLOW_DIAGNOSTICS */
1541
1542 C convert snow to ice if submerged.
1543 C =================================
1544
1545 #ifdef ALLOW_SEAICE_FLOODING
1546 IF ( SEAICEuseFlooding ) THEN
1547 DO J=1,sNy
1548 DO I=1,sNx
1549 hDraft = (HSNOW(I,J,bi,bj)*SEAICE_rhoSnow
1550 & +HEFF(I,J,bi,bj)*SEAICE_rhoIce)/rhoConst
1551 tmpscal1 = MAX( 0. _d 0, hDraft - HEFF(I,J,bi,bj))
1552 d_HEFFbyFLOODING(I,J)=tmpscal1
1553 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj)+d_HEFFbyFLOODING(I,J)
1554 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)-
1555 & d_HEFFbyFLOODING(I,J)*ICE2SNOW
1556 ENDDO
1557 ENDDO
1558 #ifdef ALLOW_DIAGNOSTICS
1559 IF ( useDiagnostics ) THEN
1560 IF ( DIAGNOSTICS_IS_ON('SIsnwice',myThid) ) THEN
1561 DO J=1,sNy
1562 DO I=1,sNx
1563 tmparr1(I,J) = d_HEFFbyFLOODING(I,J)/SEAICE_deltaTtherm
1564 ENDDO
1565 ENDDO
1566 CALL DIAGNOSTICS_FILL(tmparr1,'SIsnwice',0,1,3,bi,bj,myThid)
1567 ENDIF
1568 ENDIF
1569 #endif /* ALLOW_DIAGNOSTICS */
1570 ENDIF
1571 #endif /* ALLOW_SEAICE_FLOODING */
1572
1573 #endif /* SEAICE_GROWTH_LEGACY */
1574
1575
1576 C ===================================================================
1577 C ===============PART 6: determine ice age increments================
1578 C ===================================================================
1579
1580 #ifdef SEAICE_AGE
1581 # ifndef SEAICE_AGE_VOL
1582 C Sources and sinks for sea ice age:
1583 C assume that a) freezing: new ice fraction forms with zero age
1584 C b) melting: ice fraction vanishes with current age
1585 DO J=1,sNy
1586 DO I=1,sNx
1587 IF ( AREA(I,J,bi,bj) .GT. 0.15 ) THEN
1588 IF ( AREA(i,j,bi,bj) .LT. AREApreTH(i,j) ) THEN
1589 C-- scale effective ice-age to account for ice-age sink associated with melting
1590 IceAge(i,j,bi,bj) = IceAge(i,j,bi,bj)
1591 & *AREA(i,j,bi,bj)/AREApreTH(i,j)
1592 ENDIF
1593 C-- account for aging:
1594 IceAge(i,j,bi,bj) = IceAge(i,j,bi,bj)
1595 & + AREA(i,j,bi,bj) * SEAICE_deltaTtherm
1596 ELSE
1597 IceAge(i,j,bi,bj) = ZERO
1598 ENDIF
1599 ENDDO
1600 ENDDO
1601 # else /* ifdef SEAICE_AGE_VOL */
1602 C Sources and sinks for sea ice age:
1603 C assume that a) freezing: new ice volume forms with zero age
1604 C b) melting: ice volume vanishes with current age
1605 DO J=1,sNy
1606 DO I=1,sNx
1607 C-- compute actual age from effective age:
1608 IF (AREApreTH(i,j).GT.0. _d 0) THEN
1609 tmpscal1=IceAge(i,j,bi,bj)/AREApreTH(i,j)
1610 ELSE
1611 tmpscal1=0. _d 0
1612 ENDIF
1613 IF ( (HEFFpreTH(i,j).LT.HEFF(i,j,bi,bj)).AND.
1614 & (AREA(i,j,bi,bj).GT.0.15) ) THEN
1615 tmpscal2=tmpscal1*HEFFpreTH(i,j)/
1616 & HEFF(i,j,bi,bj)+SEAICE_deltaTtherm
1617 ELSEIF (AREA(i,j,bi,bj).LE.0.15) THEN
1618 tmpscal2=0. _d 0
1619 ELSE
1620 tmpscal2=tmpscal1+SEAICE_deltaTtherm
1621 ENDIF
1622 C-- re-scale to effective age:
1623 IceAge(i,j,bi,bj) = tmpscal2*AREA(i,j,bi,bj)
1624 ENDDO
1625 ENDDO
1626 # endif /* SEAICE_AGE_VOL */
1627 #endif /* SEAICE_AGE */
1628
1629
1630 C ===================================================================
1631 C ==============PART 7: determine ocean model forcing================
1632 C ===================================================================
1633
1634 C compute net heat flux leaving/entering the ocean,
1635 C accounting for the part used in melt/freeze processes
1636 C =====================================================
1637
1638 DO J=1,sNy
1639 DO I=1,sNx
1640 QNET(I,J,bi,bj) = r_QbyATM_cover(I,J) + r_QbyATM_open(I,J)
1641 & - ( d_HEFFbyOCNonICE(I,J) +
1642 #ifdef FENTY_DELTA_HEFF_OPEN_WATER_FLUXES
1643 & a_QSWbyATM_cover(I,J) +
1644 #endif /* FENTY_DELTA_HEFF_OPEN_WATER_FLUXES */
1645 & d_HSNWbyOCNonSNW(I,J)/ICE2SNOW +
1646 & d_HEFFbyNEG(I,J) +
1647 & d_HSNWbyNEG(I,J)/ICE2SNOW )
1648 & * maskC(I,J,kSurface,bi,bj)
1649 QSW(I,J,bi,bj) = a_QSWbyATM_cover(I,J) + a_QSWbyATM_open(I,J)
1650 ENDDO
1651 ENDDO
1652
1653 #ifdef ALLOW_DIAGNOSTICS
1654 IF ( useDiagnostics ) THEN
1655 IF ( DIAGNOSTICS_IS_ON('SIqneto ',myThid) ) THEN
1656 DO J=1,sNy
1657 DO I=1,sNx
1658 DIAGarray(I,J) = r_QbyATM_open(I,J) * convertHI2Q
1659 ENDDO
1660 ENDDO
1661 CALL DIAGNOSTICS_FILL(DIAGarray,'SIqneto ',0,1,3,bi,bj,myThid)
1662 ENDIF
1663 IF ( DIAGNOSTICS_IS_ON('SIqneti ',myThid) ) THEN
1664 DO J=1,sNy
1665 DO I=1,sNx
1666 DIAGarray(I,J) = r_QbyATM_cover(I,J) * convertHI2Q
1667 ENDDO
1668 ENDDO
1669 CALL DIAGNOSTICS_FILL(DIAGarray,'SIqneti ',0,1,3,bi,bj,myThid)
1670 ENDIF
1671 ENDIF
1672 #endif /* ALLOW_DIAGNOSTICS */
1673
1674 C switch heat fluxes from 'effective' ice meters to W/m2
1675 C ======================================================
1676
1677 DO J=1,sNy
1678 DO I=1,sNx
1679 QNET(I,J,bi,bj) = QNET(I,J,bi,bj)*convertHI2Q
1680 QSW(I,J,bi,bj) = QSW(I,J,bi,bj)*convertHI2Q
1681 ENDDO
1682 ENDDO
1683
1684 C compute net fresh water flux leaving/entering
1685 C the ocean, accounting for fresh/salt water stocks.
1686 C ==================================================
1687
1688 #ifdef ALLOW_ATM_TEMP
1689 DO J=1,sNy
1690 DO I=1,sNx
1691 tmpscal1= d_HSNWbyATMonSNW(I,J)/ICE2SNOW
1692 & +d_HFRWbyRAIN(I,J)
1693 & +d_HSNWbyOCNonSNW(I,J)/ICE2SNOW
1694 & +d_HEFFbyOCNonICE(I,J)
1695 & +d_HEFFbyATMonOCN(I,J)
1696 & +d_HEFFbyATMonICE(I,J)
1697 & +d_HEFFbyNEG(I,J)
1698 & +d_HSNWbyNEG(I,J)/ICE2SNOW
1699 #ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
1700 & +a_FWbySublim(I,J)
1701 #endif /* SEAICE_ADD_SUBLIMATION_TO_FWBUDGET */
1702 EmPmR(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*(
1703 & ( EVAP(I,J,bi,bj)-PRECIP(I,J,bi,bj) )
1704 & * ( ONE - AREApreTH(I,J) )
1705 #ifdef ALLOW_RUNOFF
1706 & - RUNOFF(I,J,bi,bj)
1707 #endif /* ALLOW_RUNOFF */
1708 & + tmpscal1*convertHI2PRECIP
1709 & )*rhoConstFresh
1710 ENDDO
1711 ENDDO
1712
1713 #ifdef ALLOW_MEAN_SFLUX_COST_CONTRIBUTION
1714 DO J=1,sNy
1715 DO I=1,sNx
1716 frWtrAtm(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*(
1717 & PRECIP(I,J,bi,bj)
1718 & - EVAP(I,J,bi,bj)
1719 & *( ONE - AREApreTH(I,J) )
1720 & + RUNOFF(I,J,bi,bj)
1721 & )*rhoConstFresh
1722 ENDDO
1723 ENDDO
1724 #endif
1725 #endif /* ALLOW_ATM_TEMP */
1726
1727 #ifdef SEAICE_DEBUG
1728 CALL PLOT_FIELD_XYRL( QSW,'Current QSW ', myIter, myThid )
1729 CALL PLOT_FIELD_XYRL( QNET,'Current QNET ', myIter, myThid )
1730 CALL PLOT_FIELD_XYRL( EmPmR,'Current EmPmR ', myIter, myThid )
1731 #endif /* SEAICE_DEBUG */
1732
1733 C Sea Ice Load on the sea surface.
1734 C =================================
1735
1736 #ifdef ALLOW_AUTODIFF_TAMC
1737 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1738 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1739 #endif /* ALLOW_AUTODIFF_TAMC */
1740
1741 IF ( useRealFreshWaterFlux ) THEN
1742 DO J=1,sNy
1743 DO I=1,sNx
1744 #ifdef SEAICE_CAP_ICELOAD
1745 tmpscal1 = HEFF(I,J,bi,bj)*SEAICE_rhoIce
1746 & + HSNOW(I,J,bi,bj)*SEAICE_rhoSnow
1747 tmpscal2 = min(tmpscal1,heffTooHeavy*rhoConst)
1748 #else
1749 tmpscal2 = HEFF(I,J,bi,bj)*SEAICE_rhoIce
1750 & + HSNOW(I,J,bi,bj)*SEAICE_rhoSnow
1751 #endif
1752 sIceLoad(i,j,bi,bj) = tmpscal2
1753 ENDDO
1754 ENDDO
1755 ENDIF
1756
1757 C close bi,bj loops
1758 ENDDO
1759 ENDDO
1760
1761 RETURN
1762 END

  ViewVC Help
Powered by ViewVC 1.1.22