/[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.132 - (show annotations) (download)
Mon Jun 27 13:15:45 2011 UTC (12 years, 11 months ago) by gforget
Branch: MAIN
Changes since 1.131: +63 -46 lines
- remove the CPP switch around the *_FWbySublim unit change and move diagnostic
  fill for SIatmQnt, SIfwSubl, SIatmFW to the end of seaice_growth.F.
- add diagnostic of the actual sublimation freshwater flux (that is 0. ifndef
  SEAICE_ADD_SUBLIMATION_TO_FWBUDGET) and of the latent heat flux (evap+sublim).

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

  ViewVC Help
Powered by ViewVC 1.1.22