/[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.139 - (show annotations) (download)
Mon Jul 18 08:55:18 2011 UTC (12 years, 10 months ago) by heimbach
Branch: MAIN
Changes since 1.138: +3 -3 lines
More fixes to store dirs
(common blocks and keys were also wrong)

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

  ViewVC Help
Powered by ViewVC 1.1.22