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

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

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


Revision 1.1 - (hide annotations) (download)
Fri Dec 21 10:00:29 2012 UTC (12 years, 7 months ago) by atn
Branch: MAIN
inprogress swapping 1-x with x in plumefrac

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

  ViewVC Help
Powered by ViewVC 1.1.22