/[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.118 - (show annotations) (download)
Wed Apr 27 00:17:26 2011 UTC (13 years, 1 month ago) by ifenty
Branch: MAIN
Changes since 1.117: +9 -10 lines
Fixed 2 bugs in seaice_growth.F

Bug 1: calculation of saltFlux (and saltPlumeFlux) by removing dependence on now-defunct parameter ICE2WATR.
and slightly simplifying the equation.  Now if the sea ice salinity equals the local seawater salinity, the growth of sea ice
will not alter the seawater salinity.

old equation:
           saltFlux(I,J,bi,bj) =
       &            HEFFM(I,J,bi,bj)/SEAICE_deltaTtherm
       &            *SEAICE_salinity*salt(I,j,kSurface,bi,bj)
!      &            *tmpscal1*ICE2WATR*rhoConstFresh

new equation:
           saltFlux(I,J,bi,bj) =
       &            HEFFM(I,J,bi,bj)/SEAICE_deltaTtherm
       &            *SEAICE_salinity*salt(I,j,kSurface,bi,bj)
!      &            *tmpscal1*SEAICE_rhoIce

As ICE2WATR equaled SEAICE_rhoICE/rhoConst and not SEAICE_rhoICE/rhoConstFresh, verification experiments where
rhoConstFresh did not equal rhoConst need to be updated.

Bug 2: replaced hFacC with maskC in the calculation of the turbulent ocean-ice flux (found by Gael) (doesn't change results).


:
: Modified Files:
: 	seaice_growth.F
: ----------------------------------------------------------------------

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

  ViewVC Help
Powered by ViewVC 1.1.22