/[MITgcm]/MITgcm_contrib/torge/itd/code/seaice_growth.F
ViewVC logotype

Annotation of /MITgcm_contrib/torge/itd/code/seaice_growth.F

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


Revision 1.4 - (hide annotations) (download)
Fri Sep 28 19:01:17 2012 UTC (12 years, 10 months ago) by torge
Branch: MAIN
Changes since 1.3: +44 -27 lines
added missing lines related to a_QbyATM_open and a_QSWbyATM_open
to SEAICE_ITD part of code;
also removing some write and print statements used for debugging

1 dimitri 1.1 C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_growth.F,v 1.162 2012/03/15 03:07:31 jmc Exp $
2     C $Name: $
3    
4     #include "SEAICE_OPTIONS.h"
5     #ifdef ALLOW_EXF
6     # include "EXF_OPTIONS.h"
7     #endif
8    
9     CBOP
10     C !ROUTINE: SEAICE_GROWTH
11     C !INTERFACE:
12     SUBROUTINE SEAICE_GROWTH( myTime, myIter, myThid )
13     C !DESCRIPTION: \bv
14     C *==========================================================*
15     C | SUBROUTINE seaice_growth
16     C | o Updata ice thickness and snow depth
17     C *==========================================================*
18     C \ev
19    
20     C !USES:
21     IMPLICIT NONE
22     C === Global variables ===
23     #include "SIZE.h"
24     #include "EEPARAMS.h"
25     #include "PARAMS.h"
26     #include "DYNVARS.h"
27     #include "GRID.h"
28     #include "FFIELDS.h"
29     #include "SEAICE_SIZE.h"
30     #include "SEAICE_PARAMS.h"
31     #include "SEAICE.h"
32     #include "SEAICE_TRACER.h"
33     #ifdef ALLOW_EXF
34     # include "EXF_PARAM.h"
35     # include "EXF_FIELDS.h"
36     #endif
37     #ifdef ALLOW_SALT_PLUME
38     # include "SALT_PLUME.h"
39     #endif
40     #ifdef ALLOW_AUTODIFF_TAMC
41     # include "tamc.h"
42     #endif
43    
44     C !INPUT/OUTPUT PARAMETERS:
45     C === Routine arguments ===
46     C myTime :: Simulation time
47     C myIter :: Simulation timestep number
48     C myThid :: Thread no. that called this routine.
49     _RL myTime
50     INTEGER myIter, myThid
51     CEOP
52    
53     C !FUNCTIONS:
54     #ifdef ALLOW_DIAGNOSTICS
55     LOGICAL DIAGNOSTICS_IS_ON
56     EXTERNAL DIAGNOSTICS_IS_ON
57     #endif
58    
59     C !LOCAL VARIABLES:
60     C === Local variables ===
61 torge 1.3 c ToM<<< debug seaice_growth
62     C msgBuf :: Informational/error message buffer
63     CHARACTER*(MAX_LEN_MBUF) msgBuf
64     c ToM>>>
65 dimitri 1.1 C
66     C unit/sign convention:
67     C Within the thermodynamic computation all stocks, except HSNOW,
68     C are in 'effective ice meters' units, and >0 implies more ice.
69     C This holds for stocks due to ocean and atmosphere heat,
70     C at the outset of 'PART 2: determine heat fluxes/stocks'
71     C and until 'PART 7: determine ocean model forcing'
72     C This strategy minimizes the need for multiplications/divisions
73     C by ice fraction, heat capacity, etc. The only conversions that
74     C occurs are for the HSNOW (in effective snow meters) and
75     C PRECIP (fresh water m/s).
76     C
77     C HEFF is effective Hice thickness (m3/m2)
78     C HSNOW is Heffective snow thickness (m3/m2)
79     C HSALT is Heffective salt content (g/m2)
80     C AREA is the seaice cover fraction (0<=AREA<=1)
81     C Q denotes heat stocks -- converted to ice stocks (m3/m2) early on
82     C
83     C For all other stocks/increments, such as d_HEFFbyATMonOCN
84     C or a_QbyATM_cover, the naming convention is as follows:
85     C The prefix 'a_' means available, the prefix 'd_' means delta
86     C (i.e. increment), and the prefix 'r_' means residual.
87     C The suffix '_cover' denotes a value for the ice covered fraction
88     C of the grid cell, whereas '_open' is for the open water fraction.
89     C The main part of the name states what ice/snow stock is concerned
90     C (e.g. QbyATM or HEFF), and how it is affected (e.g. d_HEFFbyATMonOCN
91     C is the increment of HEFF due to the ATMosphere extracting heat from the
92     C OCeaN surface, or providing heat to the OCeaN surface).
93    
94     C i,j,bi,bj :: Loop counters
95     INTEGER i, j, bi, bj
96     C number of surface interface layer
97     INTEGER kSurface
98     C constants
99     _RL tempFrz, ICE2SNOW, SNOW2ICE
100     _RL QI, QS, recip_QI
101    
102     C-- TmixLoc :: ocean surface/mixed-layer temperature (in K)
103     _RL TmixLoc (1:sNx,1:sNy)
104    
105     C a_QbyATM_cover :: available heat (in W/m^2) due to the interaction of
106     C the atmosphere and the ocean surface - for ice covered water
107     C a_QbyATM_open :: same but for open water
108     C r_QbyATM_cover :: residual of a_QbyATM_cover after freezing/melting processes
109     C r_QbyATM_open :: same but for open water
110     _RL a_QbyATM_cover (1:sNx,1:sNy)
111     _RL a_QbyATM_open (1:sNx,1:sNy)
112     _RL r_QbyATM_cover (1:sNx,1:sNy)
113     _RL r_QbyATM_open (1:sNx,1:sNy)
114     C a_QSWbyATM_open - short wave heat flux over ocean in W/m^2
115     C a_QSWbyATM_cover - short wave heat flux under ice in W/m^2
116     _RL a_QSWbyATM_open (1:sNx,1:sNy)
117     _RL a_QSWbyATM_cover (1:sNx,1:sNy)
118     C a_QbyOCN :: available heat (in in W/m^2) due to the
119     C interaction of the ice pack and the ocean surface
120     C r_QbyOCN :: residual of a_QbyOCN after freezing/melting
121     C processes have been accounted for
122     _RL a_QbyOCN (1:sNx,1:sNy)
123     _RL r_QbyOCN (1:sNx,1:sNy)
124    
125     C conversion factors to go from Q (W/m2) to HEFF (ice meters)
126     _RL convertQ2HI, convertHI2Q
127     C conversion factors to go from precip (m/s) unit to HEFF (ice meters)
128     _RL convertPRECIP2HI, convertHI2PRECIP
129    
130     #ifdef ALLOW_DIAGNOSTICS
131     C ICE/SNOW stocks tendencies associated with the various melt/freeze processes
132     _RL d_AREAbyATM (1:sNx,1:sNy)
133     _RL d_AREAbyOCN (1:sNx,1:sNy)
134     _RL d_AREAbyICE (1:sNx,1:sNy)
135     #endif
136    
137     #ifdef SEAICE_ALLOW_AREA_RELAXATION
138     C ICE/SNOW stocks tendency associated with relaxation towards observation
139     _RL d_AREAbyRLX (1:sNx,1:sNy)
140     c The change of mean ice thickness due to relaxation
141     _RL d_HEFFbyRLX (1:sNx,1:sNy)
142     #endif
143    
144 dimitri 1.2 #ifdef SEAICE_ITD
145     c The change of mean ice area due to out-of-bounds values following
146     c sea ice dynamics
147     _RL d_AREAbyNEG (1:sNx,1:sNy)
148     #endif
149 dimitri 1.1 c The change of mean ice thickness due to out-of-bounds values following
150 dimitri 1.2 c sea ice dynamics
151 dimitri 1.1 _RL d_HEFFbyNEG (1:sNx,1:sNy)
152    
153     c The change of mean ice thickness due to turbulent ocean-sea ice heat fluxes
154     _RL d_HEFFbyOCNonICE (1:sNx,1:sNy)
155    
156     c The sum of mean ice thickness increments due to atmospheric fluxes over the open water
157     c fraction and ice-covered fractions of the grid cell
158     _RL d_HEFFbyATMonOCN (1:sNx,1:sNy)
159     c The change of mean ice thickness due to flooding by snow
160     _RL d_HEFFbyFLOODING (1:sNx,1:sNy)
161    
162     c The mean ice thickness increments due to atmospheric fluxes over the open water
163     c fraction and ice-covered fractions of the grid cell, respectively
164     _RL d_HEFFbyATMonOCN_open(1:sNx,1:sNy)
165     _RL d_HEFFbyATMonOCN_cover(1:sNx,1:sNy)
166    
167     _RL d_HSNWbyNEG (1:sNx,1:sNy)
168     _RL d_HSNWbyATMonSNW (1:sNx,1:sNy)
169     _RL d_HSNWbyOCNonSNW (1:sNx,1:sNy)
170     _RL d_HSNWbyRAIN (1:sNx,1:sNy)
171    
172     _RL d_HFRWbyRAIN (1:sNx,1:sNy)
173     C
174     C a_FWbySublim :: fresh water flux implied by latent heat of
175     C sublimation to atmosphere, same sign convention
176     C as EVAP (positive upward)
177     _RL a_FWbySublim (1:sNx,1:sNy)
178     _RL r_FWbySublim (1:sNx,1:sNy)
179     _RL d_HEFFbySublim (1:sNx,1:sNy)
180     _RL d_HSNWbySublim (1:sNx,1:sNy)
181    
182 torge 1.3 #if (defined(SEAICE_CAP_SUBLIM) || defined(SEAICE_ITD))
183 dimitri 1.1 C The latent heat flux which will sublimate all snow and ice
184     C over one time step
185     _RL latentHeatFluxMax (1:sNx,1:sNy)
186     _RL latentHeatFluxMaxMult (1:sNx,1:sNy,MULTDIM)
187     #endif
188    
189     C actual ice thickness (with upper and lower limit)
190     _RL heffActual (1:sNx,1:sNy)
191     C actual snow thickness
192     _RL hsnowActual (1:sNx,1:sNy)
193     C actual ice thickness (with lower limit only) Reciprocal
194     _RL recip_heffActual (1:sNx,1:sNy)
195     C local value (=1/HO or 1/HO_south)
196     _RL recip_HO
197     C local value (=1/ice thickness)
198     _RL recip_HH
199    
200     C AREA_PRE :: hold sea-ice fraction field before any seaice-thermo update
201     _RL AREApreTH (1:sNx,1:sNy)
202     _RL HEFFpreTH (1:sNx,1:sNy)
203     _RL HSNWpreTH (1:sNx,1:sNy)
204 dimitri 1.2 #ifdef SEAICE_ITD
205     _RL AREAITDpreTH (1:sNx,1:sNy,1:nITD)
206     _RL HEFFITDpreTH (1:sNx,1:sNy,1:nITD)
207     _RL HSNWITDpreTH (1:sNx,1:sNy,1:nITD)
208     _RL areaFracFactor (1:sNx,1:sNy,1:nITD)
209     _RL heffFracFactor (1:sNx,1:sNy,1:nITD)
210     #endif
211 dimitri 1.1
212     C wind speed
213     _RL UG (1:sNx,1:sNy)
214     #ifdef ALLOW_ATM_WIND
215     _RL SPEED_SQ
216     #endif
217    
218     C Regularization values squared
219     _RL area_reg_sq, hice_reg_sq
220    
221     C pathological cases thresholds
222     _RL heffTooHeavy
223    
224     _RL lhSublim
225    
226     C temporary variables available for the various computations
227     _RL tmpscal0, tmpscal1, tmpscal2, tmpscal3, tmpscal4
228     _RL tmparr1 (1:sNx,1:sNy)
229    
230     #ifdef SEAICE_VARIABLE_SALINITY
231     _RL saltFluxAdjust (1:sNx,1:sNy)
232     #endif
233    
234     INTEGER ilockey
235 torge 1.3 INTEGER it
236     #ifdef SEAICE_ITD
237     INTEGER K
238     #endif
239 dimitri 1.1 _RL pFac
240     _RL ticeInMult (1:sNx,1:sNy,MULTDIM)
241     _RL ticeOutMult (1:sNx,1:sNy,MULTDIM)
242     _RL heffActualMult (1:sNx,1:sNy,MULTDIM)
243 dimitri 1.2 #ifdef SEAICE_ITD
244     _RL hsnowActualMult (1:sNx,1:sNy,MULTDIM)
245     _RL recip_heffActualMult(1:sNx,1:sNy,MULTDIM)
246     #endif
247 dimitri 1.1 _RL a_QbyATMmult_cover (1:sNx,1:sNy,MULTDIM)
248     _RL a_QSWbyATMmult_cover(1:sNx,1:sNy,MULTDIM)
249     _RL a_FWbySublimMult (1:sNx,1:sNy,MULTDIM)
250 dimitri 1.2 #ifdef SEAICE_ITD
251     _RL r_QbyATMmult_cover (1:sNx,1:sNy,MULTDIM)
252     _RL r_FWbySublimMult (1:sNx,1:sNy,MULTDIM)
253     #endif
254 dimitri 1.1 C Helper variables: reciprocal of some constants
255     _RL recip_multDim
256     _RL recip_deltaTtherm
257     _RL recip_rhoIce
258    
259     C Factor by which we increase the upper ocean friction velocity (u*) when
260     C ice is absent in a grid cell (dimensionless)
261     _RL MixedLayerTurbulenceFactor
262    
263     #ifdef ALLOW_SITRACER
264     INTEGER iTr
265     CHARACTER*8 diagName
266     #endif
267     #ifdef ALLOW_DIAGNOSTICS
268     c Helper variables for diagnostics
269     _RL DIAGarrayA (1:sNx,1:sNy)
270     _RL DIAGarrayB (1:sNx,1:sNy)
271     _RL DIAGarrayC (1:sNx,1:sNy)
272     _RL DIAGarrayD (1:sNx,1:sNy)
273     #endif
274    
275    
276     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
277    
278     C ===================================================================
279     C =================PART 0: constants and initializations=============
280     C ===================================================================
281    
282     IF ( buoyancyRelation .EQ. 'OCEANICP' ) THEN
283     kSurface = Nr
284     ELSE
285     kSurface = 1
286     ENDIF
287    
288     C avoid unnecessary divisions in loops
289 torge 1.3 #ifdef SEAICE_ITD
290     CToM SEAICE_multDim = nITD (see SEAICE_SIZE.h and seaice_readparms.F)
291     #endif
292 dimitri 1.1 recip_multDim = SEAICE_multDim
293     recip_multDim = ONE / recip_multDim
294     C above/below: double/single precision calculation of recip_multDim
295     c recip_multDim = 1./float(SEAICE_multDim)
296     recip_deltaTtherm = ONE / SEAICE_deltaTtherm
297     recip_rhoIce = ONE / SEAICE_rhoIce
298    
299     C Cutoff for iceload
300     heffTooHeavy=drF(kSurface) / 5. _d 0
301    
302     C RATIO OF SEA ICE DENSITY to SNOW DENSITY
303     ICE2SNOW = SEAICE_rhoIce/SEAICE_rhoSnow
304     SNOW2ICE = ONE / ICE2SNOW
305    
306     C HEAT OF FUSION OF ICE (J/m^3)
307     QI = SEAICE_rhoIce*SEAICE_lhFusion
308     recip_QI = ONE / QI
309     C HEAT OF FUSION OF SNOW (J/m^3)
310     QS = SEAICE_rhoSnow*SEAICE_lhFusion
311    
312     C ICE LATENT HEAT CONSTANT
313     lhSublim = SEAICE_lhEvap + SEAICE_lhFusion
314    
315     C regularization constants
316     area_reg_sq = SEAICE_area_reg * SEAICE_area_reg
317     hice_reg_sq = SEAICE_hice_reg * SEAICE_hice_reg
318    
319     C conversion factors to go from Q (W/m2) to HEFF (ice meters)
320     convertQ2HI=SEAICE_deltaTtherm/QI
321     convertHI2Q = ONE/convertQ2HI
322     C conversion factors to go from precip (m/s) unit to HEFF (ice meters)
323     convertPRECIP2HI=SEAICE_deltaTtherm*rhoConstFresh/SEAICE_rhoIce
324     convertHI2PRECIP = ONE/convertPRECIP2HI
325    
326     DO bj=myByLo(myThid),myByHi(myThid)
327     DO bi=myBxLo(myThid),myBxHi(myThid)
328    
329     #ifdef ALLOW_AUTODIFF_TAMC
330     act1 = bi - myBxLo(myThid)
331     max1 = myBxHi(myThid) - myBxLo(myThid) + 1
332     act2 = bj - myByLo(myThid)
333     max2 = myByHi(myThid) - myByLo(myThid) + 1
334     act3 = myThid - 1
335     max3 = nTx*nTy
336     act4 = ikey_dynamics - 1
337     iicekey = (act1 + 1) + act2*max1
338     & + act3*max1*max2
339     & + act4*max1*max2*max3
340     #endif /* ALLOW_AUTODIFF_TAMC */
341    
342    
343     C array initializations
344     C =====================
345    
346     DO J=1,sNy
347     DO I=1,sNx
348     a_QbyATM_cover (I,J) = 0.0 _d 0
349     a_QbyATM_open(I,J) = 0.0 _d 0
350     r_QbyATM_cover (I,J) = 0.0 _d 0
351     r_QbyATM_open (I,J) = 0.0 _d 0
352    
353     a_QSWbyATM_open (I,J) = 0.0 _d 0
354     a_QSWbyATM_cover (I,J) = 0.0 _d 0
355    
356     a_QbyOCN (I,J) = 0.0 _d 0
357     r_QbyOCN (I,J) = 0.0 _d 0
358    
359     #ifdef ALLOW_DIAGNOSTICS
360     d_AREAbyATM(I,J) = 0.0 _d 0
361     d_AREAbyICE(I,J) = 0.0 _d 0
362     d_AREAbyOCN(I,J) = 0.0 _d 0
363     #endif
364    
365     #ifdef SEAICE_ALLOW_AREA_RELAXATION
366     d_AREAbyRLX(I,J) = 0.0 _d 0
367     d_HEFFbyRLX(I,J) = 0.0 _d 0
368     #endif
369    
370 dimitri 1.2 #ifdef SEAICE_ITD
371     d_AREAbyNEG(I,J) = 0.0 _d 0
372     #endif
373 dimitri 1.1 d_HEFFbyNEG(I,J) = 0.0 _d 0
374     d_HEFFbyOCNonICE(I,J) = 0.0 _d 0
375     d_HEFFbyATMonOCN(I,J) = 0.0 _d 0
376     d_HEFFbyFLOODING(I,J) = 0.0 _d 0
377    
378     d_HEFFbyATMonOCN_open(I,J) = 0.0 _d 0
379     d_HEFFbyATMonOCN_cover(I,J) = 0.0 _d 0
380    
381     d_HSNWbyNEG(I,J) = 0.0 _d 0
382     d_HSNWbyATMonSNW(I,J) = 0.0 _d 0
383     d_HSNWbyOCNonSNW(I,J) = 0.0 _d 0
384     d_HSNWbyRAIN(I,J) = 0.0 _d 0
385     a_FWbySublim(I,J) = 0.0 _d 0
386     r_FWbySublim(I,J) = 0.0 _d 0
387     d_HEFFbySublim(I,J) = 0.0 _d 0
388     d_HSNWbySublim(I,J) = 0.0 _d 0
389     #ifdef SEAICE_CAP_SUBLIM
390     latentHeatFluxMax(I,J) = 0.0 _d 0
391     #endif
392     c
393     d_HFRWbyRAIN(I,J) = 0.0 _d 0
394    
395     tmparr1(I,J) = 0.0 _d 0
396    
397     #ifdef SEAICE_VARIABLE_SALINITY
398     saltFluxAdjust(I,J) = 0.0 _d 0
399     #endif
400     DO IT=1,SEAICE_multDim
401     ticeInMult(I,J,IT) = 0.0 _d 0
402     ticeOutMult(I,J,IT) = 0.0 _d 0
403     a_QbyATMmult_cover(I,J,IT) = 0.0 _d 0
404     a_QSWbyATMmult_cover(I,J,IT) = 0.0 _d 0
405     a_FWbySublimMult(I,J,IT) = 0.0 _d 0
406 dimitri 1.2 #ifdef SEAICE_ITD
407     r_QbyATMmult_cover (I,J,IT) = 0.0 _d 0
408     r_FWbySublimMult(I,J,IT) = 0.0 _d 0
409     #endif
410 torge 1.3 #if (defined(SEAICE_CAP_SUBLIM) || defined(SEAICE_ITD))
411 dimitri 1.1 latentHeatFluxMaxMult(I,J,IT) = 0.0 _d 0
412     #endif
413     ENDDO
414     ENDDO
415     ENDDO
416     #if (defined (ALLOW_MEAN_SFLUX_COST_CONTRIBUTION) || defined (ALLOW_SSH_GLOBMEAN_COST_CONTRIBUTION))
417     DO J=1-oLy,sNy+oLy
418     DO I=1-oLx,sNx+oLx
419     frWtrAtm(I,J,bi,bj) = 0.0 _d 0
420     ENDDO
421     ENDDO
422     #endif
423    
424    
425     C =====================================================================
426     C ===========PART 1: treat pathological cases (post advdiff)===========
427     C =====================================================================
428    
429     #ifdef SEAICE_GROWTH_LEGACY
430    
431     DO J=1,sNy
432     DO I=1,sNx
433     HEFFpreTH(I,J)=HEFFNM1(I,J,bi,bj)
434     HSNWpreTH(I,J)=HSNOW(I,J,bi,bj)
435     AREApreTH(I,J)=AREANM1(I,J,bi,bj)
436     d_HEFFbyNEG(I,J)=0. _d 0
437     d_HSNWbyNEG(I,J)=0. _d 0
438     #ifdef ALLOW_DIAGNOSTICS
439     DIAGarrayA(I,J) = AREANM1(I,J,bi,bj)
440     DIAGarrayB(I,J) = AREANM1(I,J,bi,bj)
441     DIAGarrayC(I,J) = HEFFNM1(I,J,bi,bj)
442     DIAGarrayD(I,J) = HSNOW(I,J,bi,bj)
443     #endif
444     ENDDO
445     ENDDO
446 dimitri 1.2 #ifdef SEAICE_ITD
447     DO K=1,nITD
448     DO J=1,sNy
449     DO I=1,sNx
450     HEFFITDpreTH(I,J,K)=HEFFITD(I,J,K,bi,bj)
451     HSNWITDpreTH(I,J,K)=HSNOWITD(I,J,K,bi,bj)
452     AREAITDpreTH(I,J,K)=AREAITD(I,J,K,bi,bj)
453     ENDDO
454     ENDDO
455     ENDDO
456     #endif
457 dimitri 1.1
458     #else /* SEAICE_GROWTH_LEGACY */
459    
460     #if (defined ALLOW_AUTODIFF_TAMC && defined SEAICE_MODIFY_GROWTH_ADJ)
461     Cgf no dependency through pathological cases treatment
462     IF ( SEAICEadjMODE.EQ.0 ) THEN
463     #endif
464    
465     #ifdef SEAICE_ALLOW_AREA_RELAXATION
466     CADJ STORE heff(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
467     CADJ STORE area(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
468     C 0) relax sea ice concentration towards observation
469     IF (SEAICE_tauAreaObsRelax .GT. 0.) THEN
470     DO J=1,sNy
471     DO I=1,sNx
472     C d_AREAbyRLX(i,j) = 0. _d 0
473     C d_HEFFbyRLX(i,j) = 0. _d 0
474     IF ( obsSIce(I,J,bi,bj).GT.AREA(I,J,bi,bj)) THEN
475     d_AREAbyRLX(i,j) =
476     & SEAICE_deltaTtherm/SEAICE_tauAreaObsRelax
477     & * (obsSIce(I,J,bi,bj) - AREA(I,J,bi,bj))
478     ENDIF
479     IF ( obsSIce(I,J,bi,bj).GT.0. _d 0 .AND.
480     & AREA(I,J,bi,bj).EQ.0. _d 0) THEN
481     C d_HEFFbyRLX(i,j) = 1. _d 1 * siEps * d_AREAbyRLX(i,j)
482     d_HEFFbyRLX(i,j) = 1. _d 1 * siEps
483     ENDIF
484 dimitri 1.2 #ifdef SEAICE_ITD
485     AREAITD(I,J,1,bi,bj) = AREAITD(I,J,1,bi,bj)
486     & + d_AREAbyRLX(i,j)
487     HEFFITD(I,J,1,bi,bj) = HEFFITD(I,J,1,bi,bj)
488     & + d_HEFFbyRLX(i,j)
489     #endif
490 dimitri 1.1 AREA(I,J,bi,bj) = AREA(I,J,bi,bj) + d_AREAbyRLX(i,j)
491     HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) + d_HEFFbyRLX(i,j)
492     ENDDO
493     ENDDO
494     ENDIF
495     #endif /* SEAICE_ALLOW_AREA_RELAXATION */
496    
497     C 1) treat the case of negative values:
498    
499     #ifdef ALLOW_AUTODIFF_TAMC
500     CADJ STORE heff(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
501     CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
502     CADJ STORE area(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
503     #endif /* ALLOW_AUTODIFF_TAMC */
504     DO J=1,sNy
505     DO I=1,sNx
506 dimitri 1.2 #ifdef SEAICE_ITD
507     DO K=1,nITD
508 torge 1.3 tmpscal1=0. _d 0
509 dimitri 1.2 tmpscal2=0. _d 0
510     tmpscal3=0. _d 0
511     tmpscal2=MAX(-HEFFITD(I,J,K,bi,bj),0. _d 0)
512     HEFFITD(I,J,K,bi,bj)=HEFFITD(I,J,K,bi,bj)+tmpscal2
513     d_HEFFbyNEG(I,J)=d_HEFFbyNEG(I,J)+tmpscal2
514     tmpscal3=MAX(-HSNOWITD(I,J,K,bi,bj),0. _d 0)
515     HSNOWITD(I,J,K,bi,bj)=HSNOWITD(I,J,K,bi,bj)+tmpscal3
516     d_HSNWbyNEG(I,J)=d_HSNWbyNEG(I,J)+tmpscal3
517 torge 1.3 tmpscal1=MAX(-AREAITD(I,J,K,bi,bj),0. _d 0)
518     AREAITD(I,J,K,bi,bj)=AREAITD(I,J,K,bi,bj)+tmpscal1
519     d_AREAbyNEG(I,J)=d_AREAbyNEG(I,J)+tmpscal1
520 dimitri 1.2 ENDDO
521 torge 1.3 CToM AREA, HEFF, and HSNOW will be updated at end of PART 1
522     C by calling SEAICE_ITD_SUM
523 dimitri 1.2 #else
524 dimitri 1.1 d_HEFFbyNEG(I,J)=MAX(-HEFF(I,J,bi,bj),0. _d 0)
525 dimitri 1.2 d_HSNWbyNEG(I,J)=MAX(-HSNOW(I,J,bi,bj),0. _d 0)
526     AREA(I,J,bi,bj)=MAX(AREA(I,J,bi,bj),0. _d 0)
527 dimitri 1.1 HEFF(I,J,bi,bj)=HEFF(I,J,bi,bj)+d_HEFFbyNEG(I,J)
528     HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)+d_HSNWbyNEG(I,J)
529 torge 1.3 #endif
530 dimitri 1.1 ENDDO
531     ENDDO
532    
533     C 1.25) treat the case of very thin ice:
534    
535     #ifdef ALLOW_AUTODIFF_TAMC
536     CADJ STORE heff(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
537     #endif /* ALLOW_AUTODIFF_TAMC */
538     DO J=1,sNy
539     DO I=1,sNx
540 dimitri 1.2 #ifdef SEAICE_ITD
541     DO K=1,nITD
542 torge 1.3 #endif
543     tmpscal2=0. _d 0
544     tmpscal3=0. _d 0
545     #ifdef SEAICE_ITD
546 dimitri 1.2 IF (HEFFITD(I,J,K,bi,bj).LE.siEps) THEN
547     tmpscal2=-HEFFITD(I,J,K,bi,bj)
548     tmpscal3=-HSNOWITD(I,J,K,bi,bj)
549     TICES(I,J,K,bi,bj)=celsius2K
550 torge 1.3 CToM TICE will be updated at end of Part 1 together with AREA and HEFF
551 dimitri 1.2 ENDIF
552 torge 1.3 HEFFITD(I,J,K,bi,bj) =HEFFITD(I,J,K,bi,bj) +tmpscal2
553     HSNOWITD(I,J,K,bi,bj)=HSNOWITD(I,J,K,bi,bj)+tmpscal3
554 dimitri 1.2 #else
555 dimitri 1.1 IF (HEFF(I,J,bi,bj).LE.siEps) THEN
556 torge 1.3 tmpscal2=-HEFF(I,J,bi,bj)
557     tmpscal3=-HSNOW(I,J,bi,bj)
558     TICE(I,J,bi,bj)=celsius2K
559     DO IT=1,SEAICE_multDim
560     TICES(I,J,IT,bi,bj)=celsius2K
561     ENDDO
562 dimitri 1.1 ENDIF
563     HEFF(I,J,bi,bj)=HEFF(I,J,bi,bj)+tmpscal2
564 torge 1.3 HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)+tmpscal3
565     #endif
566 dimitri 1.1 d_HEFFbyNEG(I,J)=d_HEFFbyNEG(I,J)+tmpscal2
567     d_HSNWbyNEG(I,J)=d_HSNWbyNEG(I,J)+tmpscal3
568 torge 1.3 #ifdef SEAICE_ITD
569     ENDDO
570 dimitri 1.2 #endif
571 dimitri 1.1 ENDDO
572     ENDDO
573    
574     C 1.5) treat the case of area but no ice/snow:
575    
576     #ifdef ALLOW_AUTODIFF_TAMC
577     CADJ STORE heff(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
578     CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
579     #endif /* ALLOW_AUTODIFF_TAMC */
580     DO J=1,sNy
581     DO I=1,sNx
582 torge 1.3 #ifdef SEAICE_ITD
583     DO K=1,nITD
584     IF ((HEFFITD(i,j,k,bi,bj).EQ.0. _d 0).AND.
585     & (HSNOWITD(i,j,k,bi,bj).EQ.0. _d 0))
586     & AREAITD(I,J,K,bi,bj)=0. _d 0
587     ENDDO
588     #else
589 dimitri 1.1 IF ((HEFF(i,j,bi,bj).EQ.0. _d 0).AND.
590 torge 1.3 & (HSNOW(i,j,bi,bj).EQ.0. _d 0)) AREA(I,J,bi,bj)=0. _d 0
591 dimitri 1.2 #endif
592 dimitri 1.1 ENDDO
593     ENDDO
594    
595     C 2) treat the case of very small area:
596    
597     #ifndef DISABLE_AREA_FLOOR
598     #ifdef ALLOW_AUTODIFF_TAMC
599     CADJ STORE area(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
600     #endif /* ALLOW_AUTODIFF_TAMC */
601     DO J=1,sNy
602     DO I=1,sNx
603 torge 1.3 #ifdef SEAICE_ITD
604     DO K=1,nITD
605     IF ((HEFFITD(i,j,k,bi,bj).GT.0).OR.
606     & (HSNOWITD(i,j,k,bi,bj).GT.0)) THEN
607     CToM SEAICE_area_floor*nITD cannot be allowed to exceed 1
608     C hence use SEAICE_area_floor devided by nITD
609     C (or install a warning in e.g. seaice_readparms.F)
610     AREAITD(I,J,K,bi,bj)=
611     & MAX(AREAITD(I,J,K,bi,bj),SEAICE_area_floor/float(nITD))
612     ENDIF
613     ENDDO
614     #else
615 dimitri 1.1 IF ((HEFF(i,j,bi,bj).GT.0).OR.(HSNOW(i,j,bi,bj).GT.0)) THEN
616     AREA(I,J,bi,bj)=MAX(AREA(I,J,bi,bj),SEAICE_area_floor)
617 torge 1.3 ENDIF
618 dimitri 1.2 #endif
619 dimitri 1.1 ENDDO
620     ENDDO
621     #endif /* DISABLE_AREA_FLOOR */
622    
623     C 2.5) treat case of excessive ice cover, e.g., due to ridging:
624    
625 torge 1.3 CToM for SEAICE_ITD this case is treated in SEAICE_ITD_REDIST,
626     C which is called at end of PART 1 below
627     #ifndef SEAICE_ITD
628 dimitri 1.1 #ifdef ALLOW_AUTODIFF_TAMC
629     CADJ STORE area(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
630     #endif /* ALLOW_AUTODIFF_TAMC */
631     DO J=1,sNy
632     DO I=1,sNx
633     #ifdef ALLOW_DIAGNOSTICS
634     DIAGarrayA(I,J) = AREA(I,J,bi,bj)
635     #endif
636     #ifdef ALLOW_SITRACER
637     SItrAREA(I,J,bi,bj,1)=AREA(I,J,bi,bj)
638     #endif
639     AREA(I,J,bi,bj)=MIN(AREA(I,J,bi,bj),SEAICE_area_max)
640 torge 1.3 ENDDO
641     ENDDO
642     #endif /* SEAICE_ITD */
643    
644 dimitri 1.2 #ifdef SEAICE_ITD
645 torge 1.3 CToM catch up with items 1.25 and 2.5 involving category sums AREA and HEFF
646     C first, update AREA and HEFF:
647     CALL SEAICE_ITD_SUM(bi, bj, myTime, myIter, myThid)
648     C
649     DO J=1,sNy
650     DO I=1,sNx
651     C TICES was changed above (item 1.25), now update TICE as ice volume
652     C weighted average of TICES
653     tmpscal1 = 0. _d 0
654     tmpscal2 = 0. _d 0
655 dimitri 1.2 DO K=1,nITD
656 torge 1.3 tmpscal1=tmpscal1 + TICES(I,J,K,bi,bj)*HEFFITD(I,J,K,bi,bj)
657     tmpscal2=tmpscal2 + HEFFITD(I,J,K,bi,bj)
658 dimitri 1.2 ENDDO
659 torge 1.3 TICE(I,J,bi,bj)=tmpscal1/tmpscal2
660     C lines of item 2.5 that were omitted:
661     C in 2.5 these lines are executed before "ridging" is applied to AREA
662     C hence we execute them here before SEAICE_ITD_REDIST is called
663     C although this means that AREA has not been completely regularized
664     #ifdef ALLOW_DIAGNOSTICS
665     DIAGarrayA(I,J) = AREA(I,J,bi,bj)
666     #endif
667     #ifdef ALLOW_SITRACER
668     SItrAREA(I,J,bi,bj,1)=AREA(I,J,bi,bj)
669 dimitri 1.2 #endif
670 dimitri 1.1 ENDDO
671     ENDDO
672    
673 torge 1.3 CToM finally make sure that all categories meet their thickness limits
674     C which includes ridging as in item 2.5
675     C and update AREA, HEFF, and HSNOW
676     CALL SEAICE_ITD_REDIST(bi, bj, myTime, myIter, myThid)
677     CALL SEAICE_ITD_SUM(bi, bj, myTime, myIter, myThid)
678    
679 dimitri 1.2 #endif
680 dimitri 1.1 #if (defined ALLOW_AUTODIFF_TAMC && defined SEAICE_MODIFY_GROWTH_ADJ)
681 torge 1.3 C ENDIF SEAICEadjMODE.EQ.0
682 dimitri 1.1 ENDIF
683     #endif
684    
685     C 3) store regularized values of heff, hsnow, area at the onset of thermo.
686     DO J=1,sNy
687     DO I=1,sNx
688     HEFFpreTH(I,J)=HEFF(I,J,bi,bj)
689     HSNWpreTH(I,J)=HSNOW(I,J,bi,bj)
690     AREApreTH(I,J)=AREA(I,J,bi,bj)
691     #ifdef ALLOW_DIAGNOSTICS
692     DIAGarrayB(I,J) = AREA(I,J,bi,bj)
693     DIAGarrayC(I,J) = HEFF(I,J,bi,bj)
694     DIAGarrayD(I,J) = HSNOW(I,J,bi,bj)
695     #endif
696     #ifdef ALLOW_SITRACER
697     SItrHEFF(I,J,bi,bj,1)=HEFF(I,J,bi,bj)
698     SItrAREA(I,J,bi,bj,2)=AREA(I,J,bi,bj)
699     #endif
700     ENDDO
701     ENDDO
702 dimitri 1.2 #ifdef SEAICE_ITD
703     DO K=1,nITD
704     DO J=1,sNy
705     DO I=1,sNx
706     HEFFITDpreTH(I,J,K)=HEFFITD(I,J,K,bi,bj)
707     HSNWITDpreTH(I,J,K)=HSNOWITD(I,J,K,bi,bj)
708     AREAITDpreTH(I,J,K)=AREAITD(I,J,K,bi,bj)
709 torge 1.3
710     C memorize areal and volume fraction of each ITD category
711     IF (AREA(I,J,bi,bj).GT.0) THEN
712     areaFracFactor(I,J,K)=AREAITD(I,J,K,bi,bj)/AREA(I,J,bi,bj)
713     ELSE
714     areaFracFactor(I,J,K)=ZERO
715     ENDIF
716     IF (HEFF(I,J,bi,bj).GT.0) THEN
717     heffFracFactor(I,J,K)=HEFFITD(I,J,K,bi,bj)/HEFF(I,J,bi,bj)
718     ELSE
719     heffFracFactor(I,J,K)=ZERO
720     ENDIF
721     ENDDO
722     ENDDO
723     ENDDO
724     C prepare SItrHEFF to be computed as cumulative sum
725     DO K=2,5
726     DO J=1,sNy
727     DO I=1,sNx
728     SItrHEFF(I,J,bi,bj,K)=ZERO
729 dimitri 1.2 ENDDO
730     ENDDO
731     ENDDO
732 torge 1.3 C prepare SItrAREA to be computed as cumulative sum
733     DO J=1,sNy
734     DO I=1,sNx
735     SItrAREA(I,J,bi,bj,3)=ZERO
736     ENDDO
737     ENDDO
738 dimitri 1.2 #endif
739 dimitri 1.1
740     C 4) treat sea ice salinity pathological cases
741     #ifdef SEAICE_VARIABLE_SALINITY
742     #ifdef ALLOW_AUTODIFF_TAMC
743     CADJ STORE hsalt(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
744     CADJ STORE heff(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
745     #endif /* ALLOW_AUTODIFF_TAMC */
746     DO J=1,sNy
747     DO I=1,sNx
748     IF ( (HSALT(I,J,bi,bj) .LT. 0.0).OR.
749     & (HEFF(I,J,bi,bj) .EQ. 0.0) ) THEN
750     saltFluxAdjust(I,J) = - HEFFM(I,J,bi,bj) *
751     & HSALT(I,J,bi,bj) * recip_deltaTtherm
752     HSALT(I,J,bi,bj) = 0.0 _d 0
753     ENDIF
754     ENDDO
755     ENDDO
756     #endif /* SEAICE_VARIABLE_SALINITY */
757    
758     #endif /* SEAICE_GROWTH_LEGACY */
759    
760     #ifdef ALLOW_DIAGNOSTICS
761     IF ( useDiagnostics ) THEN
762     CALL DIAGNOSTICS_FILL(DIAGarrayA,'SIareaPR',0,1,3,bi,bj,myThid)
763     CALL DIAGNOSTICS_FILL(DIAGarrayB,'SIareaPT',0,1,3,bi,bj,myThid)
764     CALL DIAGNOSTICS_FILL(DIAGarrayC,'SIheffPT',0,1,3,bi,bj,myThid)
765     CALL DIAGNOSTICS_FILL(DIAGarrayD,'SIhsnoPT',0,1,3,bi,bj,myThid)
766     #ifdef ALLOW_SITRACER
767     DO iTr = 1, SItrNumInUse
768     WRITE(diagName,'(A4,I2.2,A2)') 'SItr',iTr,'PT'
769     IF (SItrMate(iTr).EQ.'HEFF') THEN
770     CALL DIAGNOSTICS_FRACT_FILL(
771     I SItracer(1-OLx,1-OLy,bi,bj,iTr),HEFF(1-OLx,1-OLy,bi,bj),
772     I ONE, 1, diagName,0,1,2,bi,bj,myThid )
773     ELSE
774     CALL DIAGNOSTICS_FRACT_FILL(
775     I SItracer(1-OLx,1-OLy,bi,bj,iTr),AREA(1-OLx,1-OLy,bi,bj),
776     I ONE, 1, diagName,0,1,2,bi,bj,myThid )
777     ENDIF
778     ENDDO
779     #endif /* ALLOW_SITRACER */
780     ENDIF
781     #endif /* ALLOW_DIAGNOSTICS */
782    
783     #if (defined ALLOW_AUTODIFF_TAMC && defined SEAICE_MODIFY_GROWTH_ADJ)
784     Cgf no additional dependency of air-sea fluxes to ice
785     IF ( SEAICEadjMODE.GE.1 ) THEN
786     DO J=1,sNy
787     DO I=1,sNx
788     HEFFpreTH(I,J) = 0. _d 0
789     HSNWpreTH(I,J) = 0. _d 0
790     AREApreTH(I,J) = 0. _d 0
791     ENDDO
792     ENDDO
793 dimitri 1.2 #ifdef SEAICE_ITD
794     DO K=1,nITD
795     DO J=1,sNy
796     DO I=1,sNx
797     HEFFITDpreTH(I,J,K) = 0. _d 0
798     HSNWITDpreTH(I,J,K) = 0. _d 0
799     AREAITDpreTH(I,J,K) = 0. _d 0
800     ENDDO
801     ENDDO
802     ENDDO
803     #endif
804 dimitri 1.1 ENDIF
805     #endif
806    
807     #if (defined (ALLOW_MEAN_SFLUX_COST_CONTRIBUTION) || defined (ALLOW_SSH_GLOBMEAN_COST_CONTRIBUTION))
808     DO J=1,sNy
809     DO I=1,sNx
810     AREAforAtmFW(I,J,bi,bj) = AREApreTH(I,J)
811     ENDDO
812     ENDDO
813     #endif
814    
815     C 4) COMPUTE ACTUAL ICE/SNOW THICKNESS; USE MIN/MAX VALUES
816     C TO REGULARIZE SEAICE_SOLVE4TEMP/d_AREA COMPUTATIONS
817    
818     #ifdef ALLOW_AUTODIFF_TAMC
819     CADJ STORE AREApreTH = comlev1_bibj, key = iicekey, byte = isbyte
820     CADJ STORE HEFFpreTH = comlev1_bibj, key = iicekey, byte = isbyte
821     CADJ STORE HSNWpreTH = comlev1_bibj, key = iicekey, byte = isbyte
822     #endif /* ALLOW_AUTODIFF_TAMC */
823 dimitri 1.2 #ifdef SEAICE_ITD
824     DO K=1,nITD
825     #endif
826 dimitri 1.1 DO J=1,sNy
827     DO I=1,sNx
828    
829 dimitri 1.2 #ifdef SEAICE_ITD
830     IF (HEFFITDpreTH(I,J,K) .GT. ZERO) THEN
831     #ifdef SEAICE_GROWTH_LEGACY
832 torge 1.3 tmpscal1 = MAX(SEAICE_area_reg/float(nITD),
833     & AREAITDpreTH(I,J,K))
834 dimitri 1.2 hsnowActualMult(I,J,K) = HSNWITDpreTH(I,J,K)/tmpscal1
835     tmpscal2 = HEFFITDpreTH(I,J,K)/tmpscal1
836     heffActualMult(I,J,K) = MAX(tmpscal2,SEAICE_hice_reg)
837     #else /* SEAICE_GROWTH_LEGACY */
838     cif regularize AREA with SEAICE_area_reg
839     tmpscal1 = SQRT(AREAITDpreTH(I,J,K) * AREAITDpreTH(I,J,K)
840     & + area_reg_sq)
841     cif heffActual calculated with the regularized AREA
842     tmpscal2 = HEFFITDpreTH(I,J,K) / tmpscal1
843     cif regularize heffActual with SEAICE_hice_reg (add lower bound)
844     heffActualMult(I,J,K) = SQRT(tmpscal2 * tmpscal2
845     & + hice_reg_sq)
846     cif hsnowActual calculated with the regularized AREA
847     hsnowActualMult(I,J,K) = HSNWITDpreTH(I,J,K) / tmpscal1
848     #endif /* SEAICE_GROWTH_LEGACY */
849     cif regularize the inverse of heffActual by hice_reg
850     recip_heffActualMult(I,J,K) = AREAITDpreTH(I,J,K) /
851     & sqrt(HEFFITDpreTH(I,J,K) * HEFFITDpreTH(I,J,K)
852     & + hice_reg_sq)
853     cif Do not regularize when HEFFpreTH = 0
854     ELSE
855     heffActualMult(I,J,K) = ZERO
856     hsnowActualMult(I,J,K) = ZERO
857     recip_heffActualMult(I,J,K) = ZERO
858     ENDIF
859 torge 1.3 #else /* SEAICE_ITD */
860 dimitri 1.1 IF (HEFFpreTH(I,J) .GT. ZERO) THEN
861     #ifdef SEAICE_GROWTH_LEGACY
862     tmpscal1 = MAX(SEAICE_area_reg,AREApreTH(I,J))
863     hsnowActual(I,J) = HSNWpreTH(I,J)/tmpscal1
864     tmpscal2 = HEFFpreTH(I,J)/tmpscal1
865     heffActual(I,J) = MAX(tmpscal2,SEAICE_hice_reg)
866     #else /* SEAICE_GROWTH_LEGACY */
867     cif regularize AREA with SEAICE_area_reg
868     tmpscal1 = SQRT(AREApreTH(I,J)* AREApreTH(I,J) + area_reg_sq)
869     cif heffActual calculated with the regularized AREA
870     tmpscal2 = HEFFpreTH(I,J) / tmpscal1
871     cif regularize heffActual with SEAICE_hice_reg (add lower bound)
872     heffActual(I,J) = SQRT(tmpscal2 * tmpscal2 + hice_reg_sq)
873     cif hsnowActual calculated with the regularized AREA
874     hsnowActual(I,J) = HSNWpreTH(I,J) / tmpscal1
875     #endif /* SEAICE_GROWTH_LEGACY */
876     cif regularize the inverse of heffActual by hice_reg
877     recip_heffActual(I,J) = AREApreTH(I,J) /
878     & sqrt(HEFFpreTH(I,J)*HEFFpreTH(I,J) + hice_reg_sq)
879     cif Do not regularize when HEFFpreTH = 0
880     ELSE
881     heffActual(I,J) = ZERO
882     hsnowActual(I,J) = ZERO
883     recip_heffActual(I,J) = ZERO
884     ENDIF
885 torge 1.3 #endif /* SEAICE_ITD */
886 dimitri 1.1
887     ENDDO
888     ENDDO
889 dimitri 1.2 #ifdef SEAICE_ITD
890     ENDDO
891     #endif
892 dimitri 1.1
893     #if (defined ALLOW_AUTODIFF_TAMC && defined SEAICE_MODIFY_GROWTH_ADJ)
894     CALL ZERO_ADJ_1D( sNx*sNy, heffActual, myThid)
895     CALL ZERO_ADJ_1D( sNx*sNy, hsnowActual, myThid)
896     CALL ZERO_ADJ_1D( sNx*sNy, recip_heffActual, myThid)
897     #endif
898    
899     #ifdef SEAICE_CAP_SUBLIM
900     C 5) COMPUTE MAXIMUM LATENT HEAT FLUXES FOR THE CURRENT ICE
901     C AND SNOW THICKNESS
902 dimitri 1.2 #ifdef SEAICE_ITD
903     DO K=1,nITD
904     #endif
905 dimitri 1.1 DO J=1,sNy
906     DO I=1,sNx
907     c The latent heat flux over the sea ice which
908     c will sublimate all of the snow and ice over one time
909     c step (W/m^2)
910 dimitri 1.2 #ifdef SEAICE_ITD
911     IF (HEFFITDpreTH(I,J,K) .GT. ZERO) THEN
912     latentHeatFluxMaxMult(I,J,K) = lhSublim*recip_deltaTtherm *
913     & (HEFFITDpreTH(I,J,K)*SEAICE_rhoIce +
914     & HSNWITDpreTH(I,J,K)*SEAICE_rhoSnow)/AREAITDpreTH(I,J,K)
915     ELSE
916     latentHeatFluxMaxMult(I,J,K) = ZERO
917     ENDIF
918     #else
919 dimitri 1.1 IF (HEFFpreTH(I,J) .GT. ZERO) THEN
920     latentHeatFluxMax(I,J) = lhSublim * recip_deltaTtherm *
921     & (HEFFpreTH(I,J) * SEAICE_rhoIce +
922     & HSNWpreTH(I,J) * SEAICE_rhoSnow)/AREApreTH(I,J)
923     ELSE
924     latentHeatFluxMax(I,J) = ZERO
925     ENDIF
926 dimitri 1.2 #endif
927 dimitri 1.1 ENDDO
928     ENDDO
929 dimitri 1.2 #ifdef SEAICE_ITD
930     ENDDO
931     #endif
932 dimitri 1.1 #endif /* SEAICE_CAP_SUBLIM */
933    
934     C ===================================================================
935     C ================PART 2: determine heat fluxes/stocks===============
936     C ===================================================================
937    
938     C determine available heat due to the atmosphere -- for open water
939     C ================================================================
940    
941     DO j=1,sNy
942     DO i=1,sNx
943     C ocean surface/mixed layer temperature
944     TmixLoc(i,j) = theta(i,j,kSurface,bi,bj)+celsius2K
945     C wind speed from exf
946     UG(I,J) = MAX(SEAICE_EPS,wspeed(I,J,bi,bj))
947     ENDDO
948     ENDDO
949    
950     #ifdef ALLOW_AUTODIFF_TAMC
951     CADJ STORE qnet(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
952     CADJ STORE qsw(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
953     cCADJ STORE UG = comlev1_bibj, key = iicekey,byte=isbyte
954     cCADJ STORE TmixLoc = comlev1_bibj, key = iicekey,byte=isbyte
955     #endif /* ALLOW_AUTODIFF_TAMC */
956    
957     CALL SEAICE_BUDGET_OCEAN(
958     I UG,
959     I TmixLoc,
960     O a_QbyATM_open, a_QSWbyATM_open,
961     I bi, bj, myTime, myIter, myThid )
962    
963     C determine available heat due to the atmosphere -- for ice covered water
964     C =======================================================================
965    
966     #ifdef ALLOW_ATM_WIND
967     IF (useRelativeWind) THEN
968     C Compute relative wind speed over sea ice.
969     DO J=1,sNy
970     DO I=1,sNx
971     SPEED_SQ =
972     & (uWind(I,J,bi,bj)
973     & +0.5 _d 0*(uVel(i,j,kSurface,bi,bj)
974     & +uVel(i+1,j,kSurface,bi,bj))
975     & -0.5 _d 0*(uice(i,j,bi,bj)+uice(i+1,j,bi,bj)))**2
976     & +(vWind(I,J,bi,bj)
977     & +0.5 _d 0*(vVel(i,j,kSurface,bi,bj)
978     & +vVel(i,j+1,kSurface,bi,bj))
979     & -0.5 _d 0*(vice(i,j,bi,bj)+vice(i,j+1,bi,bj)))**2
980     IF ( SPEED_SQ .LE. SEAICE_EPS_SQ ) THEN
981     UG(I,J)=SEAICE_EPS
982     ELSE
983     UG(I,J)=SQRT(SPEED_SQ)
984     ENDIF
985     ENDDO
986     ENDDO
987     ENDIF
988     #endif /* ALLOW_ATM_WIND */
989    
990     #ifdef ALLOW_AUTODIFF_TAMC
991     CADJ STORE tice(:,:,bi,bj)
992     CADJ & = comlev1_bibj, key = iicekey, byte = isbyte
993     CADJ STORE hsnowActual = comlev1_bibj, key = iicekey, byte = isbyte
994     CADJ STORE heffActual = comlev1_bibj, key = iicekey, byte = isbyte
995     CADJ STORE UG = comlev1_bibj, key = iicekey, byte = isbyte
996     CADJ STORE tices(:,:,:,bi,bj)
997     CADJ & = comlev1_bibj, key = iicekey, byte = isbyte
998     CADJ STORE salt(:,:,kSurface,bi,bj) = comlev1_bibj,
999     CADJ & key = iicekey, byte = isbyte
1000     #endif /* ALLOW_AUTODIFF_TAMC */
1001    
1002     C-- Start loop over multi-categories
1003 torge 1.3 #ifdef SEAICE_ITD
1004     CToM SEAICE_multDim = nITD (see SEAICE_SIZE.h and seaice_readparms.F)
1005     #endif
1006 dimitri 1.1 DO IT=1,SEAICE_multDim
1007     c homogeneous distribution between 0 and 2 x heffActual
1008 dimitri 1.2 #ifndef SEAICE_ITD
1009 dimitri 1.1 pFac = (2.0 _d 0*real(IT)-1.0 _d 0)*recip_multDim
1010 dimitri 1.2 #endif
1011 dimitri 1.1 DO J=1,sNy
1012     DO I=1,sNx
1013 dimitri 1.2 #ifndef SEAICE_ITD
1014     CToM for SEAICE_ITD heffActualMult and latentHeatFluxMaxMult are calculated above
1015     C (instead of heffActual and latentHeatFluxMax)
1016 dimitri 1.1 heffActualMult(I,J,IT)= heffActual(I,J)*pFac
1017     #ifdef SEAICE_CAP_SUBLIM
1018     latentHeatFluxMaxMult(I,J,IT) = latentHeatFluxMax(I,J)*pFac
1019     #endif
1020 dimitri 1.2 #endif
1021 dimitri 1.1 ticeInMult(I,J,IT)=TICES(I,J,IT,bi,bj)
1022     ticeOutMult(I,J,IT)=TICES(I,J,IT,bi,bj)
1023     TICE(I,J,bi,bj) = ZERO
1024     TICES(I,J,IT,bi,bj) = ZERO
1025     ENDDO
1026     ENDDO
1027     ENDDO
1028    
1029     #ifdef ALLOW_AUTODIFF_TAMC
1030     CADJ STORE heffActualMult = comlev1_bibj, key = iicekey, byte = isbyte
1031     CADJ STORE ticeInMult = comlev1_bibj, key = iicekey, byte = isbyte
1032     # ifdef SEAICE_CAP_SUBLIM
1033     CADJ STORE latentHeatFluxMaxMult
1034     CADJ & = comlev1_bibj, key = iicekey, byte = isbyte
1035     # endif
1036     CADJ STORE a_QbyATMmult_cover =
1037     CADJ & comlev1_bibj, key = iicekey, byte = isbyte
1038     CADJ STORE a_QSWbyATMmult_cover =
1039     CADJ & comlev1_bibj, key = iicekey, byte = isbyte
1040     CADJ STORE a_FWbySublimMult =
1041     CADJ & comlev1_bibj, key = iicekey, byte = isbyte
1042     #endif /* ALLOW_AUTODIFF_TAMC */
1043    
1044     DO IT=1,SEAICE_multDim
1045     CALL SEAICE_SOLVE4TEMP(
1046 dimitri 1.2 #ifdef SEAICE_ITD
1047     I UG, heffActualMult(1,1,IT), hsnowActualMult(1,1,IT),
1048     #else
1049 dimitri 1.1 I UG, heffActualMult(1,1,IT), hsnowActual,
1050 dimitri 1.2 #endif
1051 dimitri 1.1 #ifdef SEAICE_CAP_SUBLIM
1052     I latentHeatFluxMaxMult(1,1,IT),
1053     #endif
1054     U ticeInMult(1,1,IT), ticeOutMult(1,1,IT),
1055     O a_QbyATMmult_cover(1,1,IT), a_QSWbyATMmult_cover(1,1,IT),
1056     O a_FWbySublimMult(1,1,IT),
1057     I bi, bj, myTime, myIter, myThid )
1058     ENDDO
1059    
1060     #ifdef ALLOW_AUTODIFF_TAMC
1061     CADJ STORE heffActualMult = comlev1_bibj, key = iicekey, byte = isbyte
1062     CADJ STORE ticeOutMult = comlev1_bibj, key = iicekey, byte = isbyte
1063     # ifdef SEAICE_CAP_SUBLIM
1064     CADJ STORE latentHeatFluxMaxMult
1065     CADJ & = comlev1_bibj, key = iicekey, byte = isbyte
1066     # endif
1067     CADJ STORE a_QbyATMmult_cover =
1068     CADJ & comlev1_bibj, key = iicekey, byte = isbyte
1069     CADJ STORE a_QSWbyATMmult_cover =
1070     CADJ & comlev1_bibj, key = iicekey, byte = isbyte
1071     CADJ STORE a_FWbySublimMult =
1072     CADJ & comlev1_bibj, key = iicekey, byte = isbyte
1073     #endif /* ALLOW_AUTODIFF_TAMC */
1074    
1075     DO IT=1,SEAICE_multDim
1076     DO J=1,sNy
1077     DO I=1,sNx
1078     C update TICE & TICES
1079 dimitri 1.2 #ifdef SEAICE_ITD
1080     C calculate area weighted mean
1081 torge 1.3 C (although the ice's temperature relates to its energy content
1082     C and hence should be averaged weighted by ice volume [heffFracFactor],
1083     C the temperature here is a result of the fluxes through the ice surface
1084     C computed individually for each single category in SEAICE_SOLVE4TEMP
1085     C and hence is averaged area weighted [areaFracFactor])
1086 dimitri 1.2 TICE(I,J,bi,bj) = TICE(I,J,bi,bj)
1087     & + ticeOutMult(I,J,IT)*areaFracFactor(I,J,K)
1088     #else
1089 dimitri 1.1 TICE(I,J,bi,bj) = TICE(I,J,bi,bj)
1090     & + ticeOutMult(I,J,IT)*recip_multDim
1091 dimitri 1.2 #endif
1092 dimitri 1.1 TICES(I,J,IT,bi,bj) = ticeOutMult(I,J,IT)
1093     C average over categories
1094 dimitri 1.2 #ifdef SEAICE_ITD
1095     C calculate area weighted mean
1096 torge 1.3 C (fluxes are per unit (ice surface) area and are thus area weighted)
1097 dimitri 1.2 a_QbyATM_cover (I,J) = a_QbyATM_cover(I,J)
1098     & + a_QbyATMmult_cover(I,J,IT)*areaFracFactor(I,J,K)
1099     a_QSWbyATM_cover (I,J) = a_QSWbyATM_cover(I,J)
1100     & + a_QSWbyATMmult_cover(I,J,IT)*areaFracFactor(I,J,K)
1101     a_FWbySublim (I,J) = a_FWbySublim(I,J)
1102     & + a_FWbySublimMult(I,J,IT)*areaFracFactor(I,J,K)
1103     #else
1104 dimitri 1.1 a_QbyATM_cover (I,J) = a_QbyATM_cover(I,J)
1105     & + a_QbyATMmult_cover(I,J,IT)*recip_multDim
1106     a_QSWbyATM_cover (I,J) = a_QSWbyATM_cover(I,J)
1107     & + a_QSWbyATMmult_cover(I,J,IT)*recip_multDim
1108     a_FWbySublim (I,J) = a_FWbySublim(I,J)
1109     & + a_FWbySublimMult(I,J,IT)*recip_multDim
1110 dimitri 1.2 #endif
1111 dimitri 1.1 ENDDO
1112     ENDDO
1113     ENDDO
1114    
1115     #ifdef SEAICE_CAP_SUBLIM
1116     # ifdef ALLOW_DIAGNOSTICS
1117     DO J=1,sNy
1118     DO I=1,sNx
1119     c The actual latent heat flux realized by SOLVE4TEMP
1120     DIAGarrayA(I,J) = a_FWbySublim(I,J) * lhSublim
1121     ENDDO
1122     ENDDO
1123     cif The actual vs. maximum latent heat flux
1124     IF ( useDiagnostics ) THEN
1125     CALL DIAGNOSTICS_FILL(DIAGarrayA,
1126     & 'SIactLHF',0,1,3,bi,bj,myThid)
1127     CALL DIAGNOSTICS_FILL(latentHeatFluxMax,
1128     & 'SImaxLHF',0,1,3,bi,bj,myThid)
1129     ENDIF
1130     # endif /* ALLOW_DIAGNOSTICS */
1131     #endif /* SEAICE_CAP_SUBLIM */
1132    
1133     #ifdef ALLOW_AUTODIFF_TAMC
1134     CADJ STORE AREApreTH = comlev1_bibj, key = iicekey, byte = isbyte
1135     CADJ STORE a_QbyATM_cover = comlev1_bibj, key = iicekey, byte = isbyte
1136     CADJ STORE a_QSWbyATM_cover= comlev1_bibj, key = iicekey, byte = isbyte
1137     CADJ STORE a_QbyATM_open = comlev1_bibj, key = iicekey, byte = isbyte
1138     CADJ STORE a_QSWbyATM_open = comlev1_bibj, key = iicekey, byte = isbyte
1139     CADJ STORE a_FWbySublim = comlev1_bibj, key = iicekey, byte = isbyte
1140     #endif /* ALLOW_AUTODIFF_TAMC */
1141    
1142     C switch heat fluxes from W/m2 to 'effective' ice meters
1143 torge 1.3 #ifdef SEAICE_ITD
1144     DO K=1,nITD
1145     DO J=1,sNy
1146     DO I=1,sNx
1147     a_QbyATMmult_cover(I,J,K) = a_QbyATMmult_cover(I,J,K)
1148     & * convertQ2HI * AREAITDpreTH(I,J,K)
1149     a_QSWbyATMmult_cover(I,J,K) = a_QSWbyATMmult_cover(I,J,K)
1150     & * convertQ2HI * AREAITDpreTH(I,J,K)
1151     C and initialize r_QbyATM_cover
1152     r_QbyATMmult_cover(I,J,K)=a_QbyATMmult_cover(I,J,K)
1153     C Convert fresh water flux by sublimation to 'effective' ice meters.
1154     C Negative sublimation is resublimation and will be added as snow.
1155     #ifdef SEAICE_DISABLE_SUBLIM
1156     a_FWbySublimMult(I,J,K) = ZERO
1157     #endif
1158     a_FWbySublimMult(I,J,K) = SEAICE_deltaTtherm*recip_rhoIce
1159     & * a_FWbySublimMult(I,J,K)*AREAITDpreTH(I,J,K)
1160     r_FWbySublimMult(I,J,K)=a_FWbySublimMult(I,J,K)
1161     ENDDO
1162     ENDDO
1163     ENDDO
1164     DO J=1,sNy
1165     DO I=1,sNx
1166 torge 1.4 a_QbyATM_open(I,J) = a_QbyATM_open(I,J)
1167     & * convertQ2HI * ( ONE - AREApreTH(I,J) )
1168     a_QSWbyATM_open(I,J) = a_QSWbyATM_open(I,J)
1169     & * convertQ2HI * ( ONE - AREApreTH(I,J) )
1170 torge 1.3 C and initialize r_QbyATM_open
1171     r_QbyATM_open(I,J)=a_QbyATM_open(I,J)
1172     ENDDO
1173     ENDDO
1174     #else /* SEAICE_ITD */
1175 dimitri 1.1 DO J=1,sNy
1176     DO I=1,sNx
1177     a_QbyATM_cover(I,J) = a_QbyATM_cover(I,J)
1178     & * convertQ2HI * AREApreTH(I,J)
1179     a_QSWbyATM_cover(I,J) = a_QSWbyATM_cover(I,J)
1180     & * convertQ2HI * AREApreTH(I,J)
1181     a_QbyATM_open(I,J) = a_QbyATM_open(I,J)
1182     & * convertQ2HI * ( ONE - AREApreTH(I,J) )
1183     a_QSWbyATM_open(I,J) = a_QSWbyATM_open(I,J)
1184     & * convertQ2HI * ( ONE - AREApreTH(I,J) )
1185     C and initialize r_QbyATM_cover/r_QbyATM_open
1186     r_QbyATM_cover(I,J)=a_QbyATM_cover(I,J)
1187     r_QbyATM_open(I,J)=a_QbyATM_open(I,J)
1188     C Convert fresh water flux by sublimation to 'effective' ice meters.
1189     C Negative sublimation is resublimation and will be added as snow.
1190     #ifdef SEAICE_DISABLE_SUBLIM
1191     cgf just for those who may need to omit this term to reproduce old results
1192     a_FWbySublim(I,J) = ZERO
1193 dimitri 1.2 #endif
1194 dimitri 1.1 a_FWbySublim(I,J) = SEAICE_deltaTtherm*recip_rhoIce
1195     & * a_FWbySublim(I,J)*AREApreTH(I,J)
1196     r_FWbySublim(I,J)=a_FWbySublim(I,J)
1197     ENDDO
1198     ENDDO
1199 torge 1.3 #endif /* SEAICE_ITD */
1200 dimitri 1.1
1201     #ifdef ALLOW_AUTODIFF_TAMC
1202     CADJ STORE AREApreTH = comlev1_bibj, key = iicekey, byte = isbyte
1203     CADJ STORE a_QbyATM_cover = comlev1_bibj, key = iicekey, byte = isbyte
1204     CADJ STORE a_QSWbyATM_cover= comlev1_bibj, key = iicekey, byte = isbyte
1205     CADJ STORE a_QbyATM_open = comlev1_bibj, key = iicekey, byte = isbyte
1206     CADJ STORE a_QSWbyATM_open = comlev1_bibj, key = iicekey, byte = isbyte
1207     CADJ STORE a_FWbySublim = comlev1_bibj, key = iicekey, byte = isbyte
1208     CADJ STORE r_QbyATM_cover = comlev1_bibj, key = iicekey, byte = isbyte
1209     CADJ STORE r_QbyATM_open = comlev1_bibj, key = iicekey, byte = isbyte
1210     CADJ STORE r_FWbySublim = comlev1_bibj, key = iicekey, byte = isbyte
1211     #endif /* ALLOW_AUTODIFF_TAMC */
1212    
1213     #if (defined ALLOW_AUTODIFF_TAMC && defined SEAICE_MODIFY_GROWTH_ADJ)
1214     Cgf no additional dependency through ice cover
1215     IF ( SEAICEadjMODE.GE.3 ) THEN
1216 dimitri 1.2 #ifdef SEAICE_ITD
1217     DO K=1,nITD
1218     DO J=1,sNy
1219     DO I=1,sNx
1220     a_QbyATMmult_cover(I,J,K) = 0. _d 0
1221     r_QbyATMmult_cover(I,J,K) = 0. _d 0
1222     a_QSWbyATMmult_cover(I,J,K) = 0. _d 0
1223     ENDDO
1224     ENDDO
1225     ENDDO
1226 torge 1.3 #else
1227     DO J=1,sNy
1228     DO I=1,sNx
1229     a_QbyATM_cover(I,J) = 0. _d 0
1230     r_QbyATM_cover(I,J) = 0. _d 0
1231     a_QSWbyATM_cover(I,J) = 0. _d 0
1232     ENDDO
1233     ENDDO
1234 dimitri 1.2 #endif
1235 dimitri 1.1 ENDIF
1236     #endif
1237    
1238     C determine available heat due to the ice pack tying the
1239     C underlying surface water temperature to freezing point
1240     C ======================================================
1241    
1242     #ifdef ALLOW_AUTODIFF_TAMC
1243     CADJ STORE theta(:,:,kSurface,bi,bj) = comlev1_bibj,
1244     CADJ & key = iicekey, byte = isbyte
1245     CADJ STORE salt(:,:,kSurface,bi,bj) = comlev1_bibj,
1246     CADJ & key = iicekey, byte = isbyte
1247     #endif
1248    
1249     DO J=1,sNy
1250     DO I=1,sNx
1251     c FREEZING TEMP. OF SEA WATER (deg C)
1252     tempFrz = SEAICE_tempFrz0 +
1253     & SEAICE_dTempFrz_dS *salt(I,J,kSurface,bi,bj)
1254     c efficiency of turbulent fluxes : dependency to sign of THETA-TBC
1255     IF ( theta(I,J,kSurface,bi,bj) .GE. tempFrz ) THEN
1256     tmpscal1 = SEAICE_mcPheePiston
1257     ELSE
1258     tmpscal1 =SEAICE_frazilFrac*drF(kSurface)/SEAICE_deltaTtherm
1259     ENDIF
1260     c efficiency of turbulent fluxes : dependency to AREA (McPhee cases)
1261     IF ( (AREApreTH(I,J) .GT. 0. _d 0).AND.
1262     & (.NOT.SEAICE_mcPheeStepFunc) ) THEN
1263     MixedLayerTurbulenceFactor = ONE -
1264     & SEAICE_mcPheeTaper * AREApreTH(I,J)
1265     ELSEIF ( (AREApreTH(I,J) .GT. 0. _d 0).AND.
1266     & (SEAICE_mcPheeStepFunc) ) THEN
1267     MixedLayerTurbulenceFactor = ONE - SEAICE_mcPheeTaper
1268     ELSE
1269     MixedLayerTurbulenceFactor = ONE
1270     ENDIF
1271     c maximum turbulent flux, in ice meters
1272     tmpscal2= - (HeatCapacity_Cp*rhoConst * recip_QI)
1273     & * (theta(I,J,kSurface,bi,bj)-tempFrz)
1274     & * SEAICE_deltaTtherm * maskC(i,j,kSurface,bi,bj)
1275     c available turbulent flux
1276     a_QbyOCN(i,j) =
1277     & tmpscal1 * tmpscal2 * MixedLayerTurbulenceFactor
1278     r_QbyOCN(i,j) = a_QbyOCN(i,j)
1279     ENDDO
1280     ENDDO
1281    
1282     #if (defined ALLOW_AUTODIFF_TAMC && defined SEAICE_MODIFY_GROWTH_ADJ)
1283     CALL ZERO_ADJ_1D( sNx*sNy, r_QbyOCN, myThid)
1284     #endif
1285    
1286    
1287     C ===================================================================
1288     C =========PART 3: determine effective thicknesses increments========
1289     C ===================================================================
1290    
1291     C compute snow/ice tendency due to sublimation
1292     C ============================================
1293    
1294     #ifdef ALLOW_AUTODIFF_TAMC
1295     CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1296     CADJ STORE r_FWbySublim = comlev1_bibj,key=iicekey,byte=isbyte
1297     #endif /* ALLOW_AUTODIFF_TAMC */
1298 dimitri 1.2 #ifdef SEAICE_ITD
1299     DO K=1,nITD
1300     #endif
1301 dimitri 1.1 DO J=1,sNy
1302     DO I=1,sNx
1303     C First sublimate/deposite snow
1304     tmpscal2 =
1305 dimitri 1.2 #ifdef SEAICE_ITD
1306     & MAX(MIN(r_FWbySublimMult(I,J,K),HSNOWITD(I,J,K,bi,bj)
1307     & *SNOW2ICE),ZERO)
1308     C accumulate change over ITD categories
1309     d_HSNWbySublim(I,J) = d_HSNWbySublim(I,J) - tmpscal2
1310     & *ICE2SNOW
1311     HSNOWITD(I,J,K,bi,bj) = HSNOWITD(I,J,K,bi,bj) - tmpscal2
1312     & *ICE2SNOW
1313     r_FWbySublimMult(I,J,K) = r_FWbySublimMult(I,J,K) - tmpscal2
1314     C keep total up to date, too
1315     r_FWbySublim(I,J) = r_FWbySublim(I,J) - tmpscal2
1316     #else
1317 dimitri 1.1 & MAX(MIN(r_FWbySublim(I,J),HSNOW(I,J,bi,bj)*SNOW2ICE),ZERO)
1318     d_HSNWbySublim(I,J) = - tmpscal2 * ICE2SNOW
1319     HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj) - tmpscal2*ICE2SNOW
1320     r_FWbySublim(I,J) = r_FWbySublim(I,J) - tmpscal2
1321 dimitri 1.2 #endif
1322 dimitri 1.1 ENDDO
1323     ENDDO
1324     #ifdef ALLOW_AUTODIFF_TAMC
1325     CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1326     CADJ STORE r_FWbySublim = comlev1_bibj,key=iicekey,byte=isbyte
1327     #endif /* ALLOW_AUTODIFF_TAMC */
1328     DO J=1,sNy
1329     DO I=1,sNx
1330     C If anything is left, sublimate ice
1331     tmpscal2 =
1332 dimitri 1.2 #ifdef SEAICE_ITD
1333     & MAX(MIN(r_FWbySublimMult(I,J,K),HEFFITD(I,J,K,bi,bj)),ZERO)
1334 torge 1.3 C accumulate change over ITD categories
1335 dimitri 1.2 d_HSNWbySublim(I,J) = d_HSNWbySublim(I,J) - tmpscal2
1336     HEFFITD(I,J,K,bi,bj) = HEFFITD(I,J,K,bi,bj) - tmpscal2
1337     r_FWbySublimMult(I,J,K) = r_FWbySublimMult(I,J,K) - tmpscal2
1338     C keep total up to date, too
1339     r_FWbySublim(I,J) = r_FWbySublim(I,J) - tmpscal2
1340     #else
1341 dimitri 1.1 & MAX(MIN(r_FWbySublim(I,J),HEFF(I,J,bi,bj)),ZERO)
1342     d_HEFFbySublim(I,J) = - tmpscal2
1343     HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) - tmpscal2
1344     r_FWbySublim(I,J) = r_FWbySublim(I,J) - tmpscal2
1345 dimitri 1.2 #endif
1346 dimitri 1.1 ENDDO
1347     ENDDO
1348     DO J=1,sNy
1349     DO I=1,sNx
1350     C If anything is left, it will be evaporated from the ocean rather than sublimated.
1351 dimitri 1.2 C Since a_QbyATM_cover was computed for sublimation, not simple evaporation, we need to
1352 dimitri 1.1 C remove the fusion part for the residual (that happens to be precisely r_FWbySublim).
1353 dimitri 1.2 #ifdef SEAICE_ITD
1354     a_QbyATMmult_cover(I,J,K) = a_QbyATMmult_cover(I,J,K)
1355     & - r_FWbySublimMult(I,J,K)
1356     r_QbyATMmult_cover(I,J,K) = r_QbyATMmult_cover(I,J,K)
1357     & - r_FWbySublimMult(I,J,K)
1358     ENDDO
1359     ENDDO
1360     C end K loop
1361     ENDDO
1362     C then update totals
1363     DO J=1,sNy
1364     DO I=1,sNx
1365     #endif
1366 dimitri 1.1 a_QbyATM_cover(I,J) = a_QbyATM_cover(I,J)-r_FWbySublim(I,J)
1367     r_QbyATM_cover(I,J) = r_QbyATM_cover(I,J)-r_FWbySublim(I,J)
1368     ENDDO
1369     ENDDO
1370 torge 1.3 c ToM<<< debug seaice_growth
1371     WRITE(msgBuf,'(A,7F6.2)')
1372 torge 1.4 #ifdef SEAICE_ITD
1373 torge 1.3 & ' SEAICE_GROWTH: Heff increments 1, HEFFITD = ',
1374     & HEFFITD(20,20,:,bi,bj)
1375 torge 1.4 #else
1376     & ' SEAICE_GROWTH: Heff increments 1, HEFF = ',
1377     & HEFF(20,20,bi,bj)
1378     #endif
1379 torge 1.3 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
1380     & SQUEEZE_RIGHT , myThid)
1381     c ToM>>>
1382 dimitri 1.1
1383     C compute ice thickness tendency due to ice-ocean interaction
1384     C ===========================================================
1385    
1386     #ifdef ALLOW_AUTODIFF_TAMC
1387     CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1388     CADJ STORE r_QbyOCN = comlev1_bibj,key=iicekey,byte=isbyte
1389     #endif /* ALLOW_AUTODIFF_TAMC */
1390    
1391 dimitri 1.2 #ifdef SEAICE_ITD
1392     DO K=1,nITD
1393     DO J=1,sNy
1394     DO I=1,sNx
1395     C ice growth/melt due to ocean heat is equally distributed under the ice
1396     C and hence weighted by fractional area of each thickness category
1397     tmpscal1=MAX(r_QbyOCN(i,j)*areaFracFactor(I,J,K),
1398     & -HEFFITD(I,J,K,bi,bj))
1399 torge 1.3 d_HEFFbyOCNonICE(I,J)= d_HEFFbyOCNonICE(I,J) + tmpscal1
1400     r_QbyOCN(I,J) = r_QbyOCN(I,J) - tmpscal1
1401     HEFFITD(I,J,K,bi,bj) = HEFFITD(I,J,K,bi,bj) + tmpscal1
1402     #ifdef ALLOW_SITRACER
1403     SItrHEFF(I,J,bi,bj,2) = SItrHEFF(I,J,bi,bj,2)
1404     & + HEFFITD(I,J,K,bi,bj)
1405     #endif
1406 dimitri 1.2 ENDDO
1407     ENDDO
1408     ENDDO
1409 torge 1.3 #else /* SEAICE_ITD */
1410 dimitri 1.1 DO J=1,sNy
1411     DO I=1,sNx
1412     d_HEFFbyOCNonICE(I,J)=MAX(r_QbyOCN(i,j), -HEFF(I,J,bi,bj))
1413     r_QbyOCN(I,J)=r_QbyOCN(I,J)-d_HEFFbyOCNonICE(I,J)
1414     HEFF(I,J,bi,bj)=HEFF(I,J,bi,bj) + d_HEFFbyOCNonICE(I,J)
1415     #ifdef ALLOW_SITRACER
1416     SItrHEFF(I,J,bi,bj,2)=HEFF(I,J,bi,bj)
1417     #endif
1418     ENDDO
1419     ENDDO
1420 torge 1.3 #endif /* SEAICE_ITD */
1421     c ToM<<< debug seaice_growth
1422     WRITE(msgBuf,'(A,7F6.2)')
1423 torge 1.4 #ifdef SEAICE_ITD
1424 torge 1.3 & ' SEAICE_GROWTH: Heff increments 2, HEFFITD = ',
1425     & HEFFITD(20,20,:,bi,bj)
1426 torge 1.4 #else
1427     & ' SEAICE_GROWTH: Heff increments 2, HEFF = ',
1428     & HEFF(20,20,bi,bj)
1429     #endif
1430 torge 1.3 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
1431     & SQUEEZE_RIGHT , myThid)
1432     c ToM>>>
1433 dimitri 1.1
1434     C compute snow melt tendency due to snow-atmosphere interaction
1435     C ==================================================================
1436    
1437     #ifdef ALLOW_AUTODIFF_TAMC
1438     CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1439     CADJ STORE r_QbyATM_cover = comlev1_bibj,key=iicekey,byte=isbyte
1440     #endif /* ALLOW_AUTODIFF_TAMC */
1441    
1442 dimitri 1.2 #ifdef SEAICE_ITD
1443     DO K=1,nITD
1444     DO J=1,sNy
1445     DO I=1,sNx
1446     C Convert to standard units (meters of ice) rather than to meters
1447     C of snow. This appears to be more robust.
1448     tmpscal1=MAX(r_QbyATMmult_cover(I,J,K),-HSNOWITD(I,J,K,bi,bj)
1449     & *SNOW2ICE)
1450     tmpscal2=MIN(tmpscal1,0. _d 0)
1451     #ifdef SEAICE_MODIFY_GROWTH_ADJ
1452     Cgf no additional dependency through snow
1453     IF ( SEAICEadjMODE.GE.2 ) tmpscal2 = 0. _d 0
1454     #endif
1455     d_HSNWbyATMonSNW(I,J)=d_HSNWbyATMonSNW(I,J)+tmpscal2*ICE2SNOW
1456 torge 1.3 HSNOWITD(I,J,K,bi,bj)=HSNOWITD(I,J,K,bi,bj)+tmpscal2*ICE2SNOW
1457 dimitri 1.2 r_QbyATMmult_cover(I,J,K)=r_QbyATMmult_cover(I,J,K) - tmpscal2
1458     C keep the total up to date, too
1459     r_QbyATM_cover(I,J)=r_QbyATM_cover(I,J) - tmpscal2
1460     ENDDO
1461     ENDDO
1462     ENDDO
1463 torge 1.3 #else /* SEAICE_ITD */
1464 dimitri 1.1 DO J=1,sNy
1465     DO I=1,sNx
1466     C Convert to standard units (meters of ice) rather than to meters
1467     C of snow. This appears to be more robust.
1468     tmpscal1=MAX(r_QbyATM_cover(I,J),-HSNOW(I,J,bi,bj)*SNOW2ICE)
1469     tmpscal2=MIN(tmpscal1,0. _d 0)
1470     #ifdef SEAICE_MODIFY_GROWTH_ADJ
1471     Cgf no additional dependency through snow
1472     IF ( SEAICEadjMODE.GE.2 ) tmpscal2 = 0. _d 0
1473     #endif
1474     d_HSNWbyATMonSNW(I,J)= tmpscal2*ICE2SNOW
1475 torge 1.3 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj) + tmpscal2*ICE2SNOW
1476 dimitri 1.1 r_QbyATM_cover(I,J)=r_QbyATM_cover(I,J) - tmpscal2
1477     ENDDO
1478     ENDDO
1479 dimitri 1.2 #endif /* SEAICE_ITD */
1480 torge 1.3 c ToM<<< debug seaice_growth
1481     WRITE(msgBuf,'(A,7F6.2)')
1482 torge 1.4 #ifdef SEAICE_ITD
1483 torge 1.3 & ' SEAICE_GROWTH: Heff increments 3, HEFFITD = ',
1484     & HEFFITD(20,20,:,bi,bj)
1485 torge 1.4 #else
1486     & ' SEAICE_GROWTH: Heff increments 3, HEFF = ',
1487     & HEFF(20,20,bi,bj)
1488     #endif
1489 torge 1.3 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
1490     & SQUEEZE_RIGHT , myThid)
1491     c ToM>>>
1492 dimitri 1.1
1493     C compute ice thickness tendency due to the atmosphere
1494     C ====================================================
1495    
1496     #ifdef ALLOW_AUTODIFF_TAMC
1497     CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1498     CADJ STORE r_QbyATM_cover = comlev1_bibj,key=iicekey,byte=isbyte
1499     #endif /* ALLOW_AUTODIFF_TAMC */
1500    
1501     Cgf note: this block is not actually tested by lab_sea
1502     Cgf where all experiments start in January. So even though
1503     Cgf the v1.81=>v1.82 revision would change results in
1504     Cgf warming conditions, the lab_sea results were not changed.
1505    
1506 dimitri 1.2 #ifdef SEAICE_ITD
1507     DO K=1,nITD
1508     DO J=1,sNy
1509     DO I=1,sNx
1510     #ifdef SEAICE_GROWTH_LEGACY
1511     tmpscal2 =MAX(-HEFFITD(I,J,K,bi,bj),r_QbyATMmult_cover(I,J,K))
1512     #else
1513     tmpscal2 =MAX(-HEFFITD(I,J,K,bi,bj),r_QbyATMmult_cover(I,J,K)
1514     c Limit ice growth by potential melt by ocean
1515 torge 1.3 & + AREAITDpreTH(I,J,K) * r_QbyOCN(I,J))
1516 dimitri 1.2 #endif /* SEAICE_GROWTH_LEGACY */
1517     d_HEFFbyATMonOCN_cover(I,J) = d_HEFFbyATMonOCN_cover(I,J)
1518     & + tmpscal2
1519     d_HEFFbyATMonOCN(I,J) = d_HEFFbyATMonOCN(I,J)
1520     & + tmpscal2
1521     r_QbyATM_cover(I,J) = r_QbyATM_cover(I,J)
1522     & - tmpscal2
1523     HEFFITD(I,J,K,bi,bj) = HEFFITD(I,J,K,bi,bj) + tmpscal2
1524 torge 1.3
1525     #ifdef ALLOW_SITRACER
1526     SItrHEFF(I,J,bi,bj,3) = SItrHEFF(I,J,bi,bj,3)
1527     & + HEFFITD(I,J,K,bi,bj)
1528     #endif
1529 dimitri 1.2 ENDDO
1530     ENDDO
1531     ENDDO
1532 torge 1.3 #else /* SEAICE_ITD */
1533 dimitri 1.1 DO J=1,sNy
1534     DO I=1,sNx
1535    
1536     #ifdef SEAICE_GROWTH_LEGACY
1537     tmpscal2 = MAX(-HEFF(I,J,bi,bj),r_QbyATM_cover(I,J))
1538     #else
1539     tmpscal2 = MAX(-HEFF(I,J,bi,bj),r_QbyATM_cover(I,J)+
1540     c Limit ice growth by potential melt by ocean
1541     & AREApreTH(I,J) * r_QbyOCN(I,J))
1542     #endif /* SEAICE_GROWTH_LEGACY */
1543    
1544     d_HEFFbyATMonOCN_cover(I,J)=tmpscal2
1545     d_HEFFbyATMonOCN(I,J)=d_HEFFbyATMonOCN(I,J)+tmpscal2
1546     r_QbyATM_cover(I,J)=r_QbyATM_cover(I,J)-tmpscal2
1547 torge 1.3 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) + tmpscal2
1548 dimitri 1.1
1549     #ifdef ALLOW_SITRACER
1550     SItrHEFF(I,J,bi,bj,3)=HEFF(I,J,bi,bj)
1551     #endif
1552 torge 1.3 ENDDO
1553     ENDDO
1554     #endif /* SEAICE_ITD */
1555     c ToM<<< debug seaice_growth
1556     WRITE(msgBuf,'(A,7F6.2)')
1557 torge 1.4 #ifdef SEAICE_ITD
1558 torge 1.3 & ' SEAICE_GROWTH: Heff increments 4, HEFFITD = ',
1559     & HEFFITD(20,20,:,bi,bj)
1560 torge 1.4 #else
1561     & ' SEAICE_GROWTH: Heff increments 4, HEFF = ',
1562     & HEFF(20,20,bi,bj)
1563     #endif
1564 torge 1.3 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
1565     & SQUEEZE_RIGHT , myThid)
1566     c ToM>>>
1567 dimitri 1.1
1568     C attribute precip to fresh water or snow stock,
1569     C depending on atmospheric conditions.
1570     C =================================================
1571     #ifdef ALLOW_ATM_TEMP
1572     #ifdef ALLOW_AUTODIFF_TAMC
1573     CADJ STORE a_QbyATM_cover = comlev1_bibj,key=iicekey,byte=isbyte
1574     CADJ STORE PRECIP(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1575     CADJ STORE AREApreTH = comlev1_bibj,key=iicekey,byte=isbyte
1576     #endif /* ALLOW_AUTODIFF_TAMC */
1577     DO J=1,sNy
1578     DO I=1,sNx
1579     C possible alternatives to the a_QbyATM_cover criterium
1580     c IF (TICE(I,J,bi,bj) .LT. TMIX) THEN
1581     c IF (atemp(I,J,bi,bj) .LT. celsius2K) THEN
1582     IF ( a_QbyATM_cover(I,J).GE. 0. _d 0 ) THEN
1583     C add precip as snow
1584     d_HFRWbyRAIN(I,J)=0. _d 0
1585     d_HSNWbyRAIN(I,J)=convertPRECIP2HI*ICE2SNOW*
1586     & PRECIP(I,J,bi,bj)*AREApreTH(I,J)
1587     ELSE
1588     C add precip to the fresh water bucket
1589     d_HFRWbyRAIN(I,J)=-convertPRECIP2HI*
1590     & PRECIP(I,J,bi,bj)*AREApreTH(I,J)
1591     d_HSNWbyRAIN(I,J)=0. _d 0
1592     ENDIF
1593     ENDDO
1594     ENDDO
1595 dimitri 1.2 #ifdef SEAICE_ITD
1596     DO K=1,nITD
1597     DO J=1,sNy
1598     DO I=1,sNx
1599     HSNOWITD(I,J,K,bi,bj) = HSNOWITD(I,J,K,bi,bj)
1600     & + d_HSNWbyRAIN(I,J)*areaFracFactor(I,J,K)
1601     ENDDO
1602     ENDDO
1603     ENDDO
1604 torge 1.3 #else
1605     DO J=1,sNy
1606     DO I=1,sNx
1607     HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj) + d_HSNWbyRAIN(I,J)
1608     ENDDO
1609     ENDDO
1610 dimitri 1.2 #endif
1611 dimitri 1.1 Cgf note: this does not affect air-sea heat flux,
1612     Cgf since the implied air heat gain to turn
1613     Cgf rain to snow is not a surface process.
1614     #endif /* ALLOW_ATM_TEMP */
1615 torge 1.3 c ToM<<< debug seaice_growth
1616     WRITE(msgBuf,'(A,7F6.2)')
1617 torge 1.4 #ifdef SEAICE_ITD
1618 torge 1.3 & ' SEAICE_GROWTH: Heff increments 5, HEFFITD = ',
1619     & HEFFITD(20,20,:,bi,bj)
1620 torge 1.4 #else
1621     & ' SEAICE_GROWTH: Heff increments 5, HEFF = ',
1622     & HEFF(20,20,bi,bj)
1623     #endif
1624 torge 1.3 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
1625     & SQUEEZE_RIGHT , myThid)
1626     c ToM>>>
1627 dimitri 1.1
1628     C compute snow melt due to heat available from ocean.
1629     C =================================================================
1630    
1631     Cgf do we need to keep this comment and cpp bracket?
1632     Cph( very sensitive bit here by JZ
1633     #ifndef SEAICE_EXCLUDE_FOR_EXACT_AD_TESTING
1634     #ifdef ALLOW_AUTODIFF_TAMC
1635     CADJ STORE HSNOW(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1636     CADJ STORE r_QbyOCN = comlev1_bibj,key=iicekey,byte=isbyte
1637     #endif /* ALLOW_AUTODIFF_TAMC */
1638 dimitri 1.2
1639     #ifdef SEAICE_ITD
1640     DO K=1,nITD
1641     DO J=1,sNy
1642     DO I=1,sNx
1643     tmpscal1=MAX(r_QbyOCN(i,j)*ICE2SNOW*areaFracFactor(I,J,K),
1644 torge 1.3 & -HSNOWITD(I,J,K,bi,bj))
1645 dimitri 1.2 tmpscal2=MIN(tmpscal1,0. _d 0)
1646     #ifdef SEAICE_MODIFY_GROWTH_ADJ
1647     Cgf no additional dependency through snow
1648     if ( SEAICEadjMODE.GE.2 ) tmpscal2 = 0. _d 0
1649     #endif
1650 torge 1.3 d_HSNWbyOCNonSNW(I,J) = d_HSNWbyOCNonSNW(I,J) + tmpscal2
1651     r_QbyOCN(I,J)=r_QbyOCN(I,J) - tmpscal2*SNOW2ICE
1652 dimitri 1.2 HSNOWITD(I,J,K,bi,bj) = HSNOWITD(I,J,K,bi,bj) + tmpscal2
1653     ENDDO
1654     ENDDO
1655     ENDDO
1656 torge 1.3 #else /* SEAICE_ITD */
1657 dimitri 1.1 DO J=1,sNy
1658     DO I=1,sNx
1659     tmpscal1=MAX(r_QbyOCN(i,j)*ICE2SNOW, -HSNOW(I,J,bi,bj))
1660     tmpscal2=MIN(tmpscal1,0. _d 0)
1661     #ifdef SEAICE_MODIFY_GROWTH_ADJ
1662     Cgf no additional dependency through snow
1663     if ( SEAICEadjMODE.GE.2 ) tmpscal2 = 0. _d 0
1664     #endif
1665     d_HSNWbyOCNonSNW(I,J) = tmpscal2
1666     r_QbyOCN(I,J)=r_QbyOCN(I,J)
1667     & -d_HSNWbyOCNonSNW(I,J)*SNOW2ICE
1668     HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)+d_HSNWbyOCNonSNW(I,J)
1669     ENDDO
1670     ENDDO
1671 torge 1.3 #endif /* SEAICE_ITD */
1672 dimitri 1.1 #endif /* SEAICE_EXCLUDE_FOR_EXACT_AD_TESTING */
1673     Cph)
1674 torge 1.3 c ToM<<< debug seaice_growth
1675     WRITE(msgBuf,'(A,7F6.2)')
1676 torge 1.4 #ifdef SEAICE_ITD
1677 torge 1.3 & ' SEAICE_GROWTH: Heff increments 6, HEFFITD = ',
1678     & HEFFITD(20,20,:,bi,bj)
1679 torge 1.4 #else
1680     & ' SEAICE_GROWTH: Heff increments 6, HEFF = ',
1681     & HEFF(20,20,bi,bj)
1682     #endif
1683 torge 1.3 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
1684     & SQUEEZE_RIGHT , myThid)
1685     c ToM>>>
1686 dimitri 1.1
1687     C gain of new ice over open water
1688     C ===============================
1689     #ifdef ALLOW_AUTODIFF_TAMC
1690     CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1691     CADJ STORE r_QbyATM_open = comlev1_bibj,key=iicekey,byte=isbyte
1692     CADJ STORE r_QbyOCN = comlev1_bibj,key=iicekey,byte=isbyte
1693     CADJ STORE a_QSWbyATM_cover = comlev1_bibj,key=iicekey,byte=isbyte
1694     CADJ STORE a_QSWbyATM_open = comlev1_bibj,key=iicekey,byte=isbyte
1695     #endif /* ALLOW_AUTODIFF_TAMC */
1696    
1697     DO J=1,sNy
1698     DO I=1,sNx
1699     c Initial ice growth is triggered by open water
1700     c heat flux overcoming potential melt by ocean
1701     tmpscal1=r_QbyATM_open(I,J)+r_QbyOCN(i,j) *
1702     & (1.0 _d 0 - AREApreTH(I,J))
1703     c Penetrative shortwave flux beyond first layer
1704     c that is therefore not available to ice growth/melt
1705     tmpscal2=SWFracB * a_QSWbyATM_open(I,J)
1706     C impose -HEFF as the maxmum melting if SEAICE_doOpenWaterMelt
1707     C or 0. otherwise (no melting if not SEAICE_doOpenWaterMelt)
1708     tmpscal3=facOpenGrow*MAX(tmpscal1-tmpscal2,
1709     & -HEFF(I,J,bi,bj)*facOpenMelt)*HEFFM(I,J,bi,bj)
1710     d_HEFFbyATMonOCN_open(I,J)=tmpscal3
1711     d_HEFFbyATMonOCN(I,J)=d_HEFFbyATMonOCN(I,J)+tmpscal3
1712     r_QbyATM_open(I,J)=r_QbyATM_open(I,J)-tmpscal3
1713 dimitri 1.2 #ifdef SEAICE_ITD
1714 torge 1.3 C open water area fraction
1715     tmpscal0 = ONE-AREApreTH(I,J)
1716 dimitri 1.2 C determine thickness of new ice
1717     C considering the entire open water area to refreeze
1718 torge 1.3 tmpscal1 = tmpscal3/tmpscal0
1719 dimitri 1.2 C then add new ice volume to appropriate thickness category
1720     DO K=1,nITD
1721 torge 1.3 IF (tmpscal1.LT.Hlimit(K)) THEN
1722 dimitri 1.2 HEFFITD(I,J,K,bi,bj) = HEFFITD(I,J,K,bi,bj) + tmpscal3
1723 torge 1.3 tmpscal3=ZERO
1724     C not sure if AREAITD should be changed here since AREA is incremented
1725     C in PART 4 below in non-itd code
1726     C in this scenario all open water is covered by new ice instantaneously,
1727     C i.e. no delayed lead closing is concidered such as is associated with
1728     C Hibler's h_0 parameter
1729 dimitri 1.2 AREAITD(I,J,K,bi,bj) = AREAITD(I,J,K,bi,bj)
1730 torge 1.3 & + tmpscal0
1731     tmpscal0=ZERO
1732 dimitri 1.2 ENDIF
1733     ENDDO
1734 torge 1.3 #else
1735     HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) + tmpscal3
1736 dimitri 1.2 #endif
1737 dimitri 1.1 ENDDO
1738     ENDDO
1739    
1740     #ifdef ALLOW_SITRACER
1741 torge 1.3 #ifdef SEAICE_ITD
1742     DO K=1,nITD
1743     DO J=1,sNy
1744     DO I=1,sNx
1745     c needs to be here to allow use also with LEGACY branch
1746     SItrHEFF(I,J,bi,bj,4) = SItrHEFF(I,J,bi,bj,4)
1747     & + HEFFITD(I,J,K,bi,bj)
1748     ENDDO
1749     ENDDO
1750     ENDDO
1751     #else
1752 dimitri 1.1 DO J=1,sNy
1753     DO I=1,sNx
1754     c needs to be here to allow use also with LEGACY branch
1755     SItrHEFF(I,J,bi,bj,4)=HEFF(I,J,bi,bj)
1756     ENDDO
1757     ENDDO
1758 torge 1.3 #endif
1759 dimitri 1.1 #endif /* ALLOW_SITRACER */
1760 torge 1.3 c ToM<<< debug seaice_growth
1761     WRITE(msgBuf,'(A,7F6.2)')
1762 torge 1.4 #ifdef SEAICE_ITD
1763 torge 1.3 & ' SEAICE_GROWTH: Heff increments 7, HEFFITD = ',
1764     & HEFFITD(20,20,:,bi,bj)
1765 torge 1.4 #else
1766     & ' SEAICE_GROWTH: Heff increments 7, HEFF = ',
1767     & HEFF(20,20,bi,bj)
1768     #endif
1769 torge 1.3 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
1770     & SQUEEZE_RIGHT , myThid)
1771     c ToM>>>
1772 dimitri 1.1
1773     C convert snow to ice if submerged.
1774     C =================================
1775    
1776     #ifndef SEAICE_GROWTH_LEGACY
1777     C note: in legacy, this process is done at the end
1778     #ifdef ALLOW_AUTODIFF_TAMC
1779     CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1780     CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1781     #endif /* ALLOW_AUTODIFF_TAMC */
1782     IF ( SEAICEuseFlooding ) THEN
1783 dimitri 1.2 #ifdef SEAICE_ITD
1784     DO K=1,nITD
1785     DO J=1,sNy
1786     DO I=1,sNx
1787     tmpscal0 = (HSNOWITD(I,J,K,bi,bj)*SEAICE_rhoSnow
1788     & +HEFFITD(I,J,K,bi,bj)*SEAICE_rhoIce)*recip_rhoConst
1789     tmpscal1 = MAX( 0. _d 0, tmpscal0 - HEFFITD(I,J,K,bi,bj))
1790     d_HEFFbyFLOODING(I,J) = d_HEFFbyFLOODING(I,J) + tmpscal1
1791     HEFFITD(I,J,K,bi,bj) = HEFFITD(I,J,K,bi,bj) + tmpscal1
1792     HSNOWITD(I,J,K,bi,bj) = HSNOWITD(I,J,K,bi,bj) - tmpscal1
1793     & * ICE2SNOW
1794     ENDDO
1795     ENDDO
1796     ENDDO
1797     #else
1798 dimitri 1.1 DO J=1,sNy
1799     DO I=1,sNx
1800     tmpscal0 = (HSNOW(I,J,bi,bj)*SEAICE_rhoSnow
1801     & +HEFF(I,J,bi,bj)*SEAICE_rhoIce)*recip_rhoConst
1802     tmpscal1 = MAX( 0. _d 0, tmpscal0 - HEFF(I,J,bi,bj))
1803     d_HEFFbyFLOODING(I,J)=tmpscal1
1804 torge 1.3 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj)+d_HEFFbyFLOODING(I,J)
1805     HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)-
1806     & d_HEFFbyFLOODING(I,J)*ICE2SNOW
1807 dimitri 1.2 ENDDO
1808     ENDDO
1809     #endif
1810 dimitri 1.1 ENDIF
1811     #endif /* SEAICE_GROWTH_LEGACY */
1812 torge 1.3 c ToM<<< debug seaice_growth
1813     WRITE(msgBuf,'(A,7F6.2)')
1814 torge 1.4 #ifdef SEAICE_ITD
1815 torge 1.3 & ' SEAICE_GROWTH: Heff increments 8, HEFFITD = ',
1816     & HEFFITD(20,20,:,bi,bj)
1817 torge 1.4 #else
1818     & ' SEAICE_GROWTH: Heff increments 8, HEFF = ',
1819     & HEFF(20,20,bi,bj)
1820     #endif
1821 torge 1.3 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
1822     & SQUEEZE_RIGHT , myThid)
1823     c ToM>>>
1824 dimitri 1.1
1825     C ===================================================================
1826     C ==========PART 4: determine ice cover fraction increments=========-
1827     C ===================================================================
1828    
1829     #ifdef ALLOW_AUTODIFF_TAMC
1830     CADJ STORE d_HEFFbyATMonOCN = comlev1_bibj,key=iicekey,byte=isbyte
1831     CADJ STORE d_HEFFbyATMonOCN_cover = comlev1_bibj,key=iicekey,byte=isbyte
1832     CADJ STORE d_HEFFbyATMonOCN_open = comlev1_bibj,key=iicekey,byte=isbyte
1833     CADJ STORE d_HEFFbyOCNonICE = comlev1_bibj,key=iicekey,byte=isbyte
1834     CADJ STORE recip_heffActual = comlev1_bibj,key=iicekey,byte=isbyte
1835     CADJ STORE d_hsnwbyatmonsnw = comlev1_bibj,key=iicekey,byte=isbyte
1836     cph(
1837     cphCADJ STORE d_AREAbyATM = comlev1_bibj,key=iicekey,byte=isbyte
1838     cphCADJ STORE d_AREAbyICE = comlev1_bibj,key=iicekey,byte=isbyte
1839     cphCADJ STORE d_AREAbyOCN = comlev1_bibj,key=iicekey,byte=isbyte
1840     cph)
1841     CADJ STORE a_QbyATM_open = comlev1_bibj,key=iicekey,byte=isbyte
1842     CADJ STORE heffActual = comlev1_bibj,key=iicekey,byte=isbyte
1843     CADJ STORE AREApreTH = comlev1_bibj,key=iicekey,byte=isbyte
1844     CADJ STORE HEFF(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1845     CADJ STORE HSNOW(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1846     CADJ STORE AREA(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1847     #endif /* ALLOW_AUTODIFF_TAMC */
1848    
1849 dimitri 1.2 #ifdef SEAICE_ITD
1850     C replaces Hibler '79 scheme and lead closing parameter
1851     C because ITD accounts explicitly for lead openings and
1852     C different melt rates due to varying ice thickness
1853     C
1854     C only consider ice area loss due to total ice thickness loss
1855     C ice area gain due to freezing of open water as handled above
1856     C under "gain of new ice over open water"
1857     C
1858     C does not account for lateral melt of ice floes
1859     C
1860 torge 1.3 C AREAITD is incremented in section "gain of new ice over open water" above
1861     C
1862 dimitri 1.2 DO K=1,nITD
1863     DO J=1,sNy
1864     DO I=1,sNx
1865     IF (HEFFITD(I,J,K,bi,bj).LE.ZERO) THEN
1866     AREAITD(I,J,K,bi,bj)=ZERO
1867     ENDIF
1868 torge 1.3 #ifdef ALLOW_SITRACER
1869     SItrAREA(I,J,bi,bj,3) = SItrAREA(I,J,bi,bj,3)
1870     & + AREAITD(I,J,K,bi,bj)
1871     #endif /* ALLOW_SITRACER */
1872 dimitri 1.2 ENDDO
1873     ENDDO
1874     ENDDO
1875 torge 1.3 #else /* SEAICE_ITD */
1876 dimitri 1.1 DO J=1,sNy
1877     DO I=1,sNx
1878    
1879     IF ( YC(I,J,bi,bj) .LT. ZERO ) THEN
1880     recip_HO=1. _d 0 / HO_south
1881     ELSE
1882     recip_HO=1. _d 0 / HO
1883     ENDIF
1884     #ifdef SEAICE_GROWTH_LEGACY
1885     tmpscal0=HEFF(I,J,bi,bj) - d_HEFFbyATMonOCN(I,J)
1886     recip_HH = AREApreTH(I,J) /(tmpscal0+.00001 _d 0)
1887     #else
1888     recip_HH = recip_heffActual(I,J)
1889     #endif
1890    
1891     C gain of ice over open water : computed from
1892     C (SEAICE_areaGainFormula.EQ.1) from growth by ATM
1893     C (SEAICE_areaGainFormula.EQ.2) from predicted growth by ATM
1894     IF (SEAICE_areaGainFormula.EQ.1) THEN
1895     tmpscal4 = MAX(ZERO,d_HEFFbyATMonOCN_open(I,J))
1896     ELSE
1897     tmpscal4=MAX(ZERO,a_QbyATM_open(I,J))
1898     ENDIF
1899    
1900     C loss of ice cover by melting : computed from
1901     C (SEAICE_areaLossFormula.EQ.1) from all but only melt conributions by ATM and OCN
1902     C (SEAICE_areaLossFormula.EQ.2) from net melt-growth>0 by ATM and OCN
1903     C (SEAICE_areaLossFormula.EQ.3) from predicted melt by ATM
1904     IF (SEAICE_areaLossFormula.EQ.1) THEN
1905     tmpscal3 = MIN( 0. _d 0 , d_HEFFbyATMonOCN_cover(I,J) )
1906     & + MIN( 0. _d 0 , d_HEFFbyATMonOCN_open(I,J) )
1907     & + MIN( 0. _d 0 , d_HEFFbyOCNonICE(I,J) )
1908     ELSEIF (SEAICE_areaLossFormula.EQ.2) THEN
1909     tmpscal3 = MIN( 0. _d 0 , d_HEFFbyATMonOCN_cover(I,J)
1910     & + d_HEFFbyATMonOCN_open(I,J) + d_HEFFbyOCNonICE(I,J) )
1911     ELSE
1912     C compute heff after ice melt by ocn:
1913     tmpscal0=HEFF(I,J,bi,bj) - d_HEFFbyATMonOCN(I,J)
1914     C compute available heat left after snow melt by atm:
1915     tmpscal1= a_QbyATM_open(I,J)+a_QbyATM_cover(I,J)
1916     & - d_HSNWbyATMonSNW(I,J)*SNOW2ICE
1917     C could not melt more than all the ice
1918     tmpscal2 = MAX(-tmpscal0,tmpscal1)
1919     tmpscal3 = MIN(ZERO,tmpscal2)
1920     ENDIF
1921    
1922     C apply tendency
1923     IF ( (HEFF(i,j,bi,bj).GT.0. _d 0).OR.
1924     & (HSNOW(i,j,bi,bj).GT.0. _d 0) ) THEN
1925     AREA(I,J,bi,bj)=MAX(0. _d 0,
1926     & MIN( SEAICE_area_max, AREA(I,J,bi,bj)
1927     & + recip_HO*tmpscal4+HALF*recip_HH*tmpscal3 ))
1928     ELSE
1929     AREA(I,J,bi,bj)=0. _d 0
1930     ENDIF
1931     #ifdef ALLOW_SITRACER
1932     SItrAREA(I,J,bi,bj,3)=AREA(I,J,bi,bj)
1933     #endif /* ALLOW_SITRACER */
1934     #ifdef ALLOW_DIAGNOSTICS
1935     d_AREAbyATM(I,J)=
1936     & recip_HO*MAX(ZERO,d_HEFFbyATMonOCN_open(I,J))
1937     & +HALF*recip_HH*MIN(0. _d 0,d_HEFFbyATMonOCN_open(I,J))
1938     d_AREAbyICE(I,J)=
1939     & HALF*recip_HH*MIN(0. _d 0,d_HEFFbyATMonOCN_cover(I,J))
1940     d_AREAbyOCN(I,J)=
1941     & HALF*recip_HH*MIN( 0. _d 0,d_HEFFbyOCNonICE(I,J) )
1942     #endif /* ALLOW_DIAGNOSTICS */
1943     ENDDO
1944     ENDDO
1945 dimitri 1.2 #endif /* SEAICE_ITD */
1946 dimitri 1.1
1947     #if (defined ALLOW_AUTODIFF_TAMC && defined SEAICE_MODIFY_GROWTH_ADJ)
1948     Cgf 'bulk' linearization of area=f(HEFF)
1949     IF ( SEAICEadjMODE.GE.1 ) THEN
1950 dimitri 1.2 #ifdef SEAICE_ITD
1951     DO K=1,nITD
1952     DO J=1,sNy
1953     DO I=1,sNx
1954     AREAITD(I,J,K,bi,bj) = AREAITDpreTH(I,J,K) + 0.1 _d 0 *
1955     & ( HEFFITD(I,J,K,bi,bj) - HEFFITDpreTH(I,J,K) )
1956     ENDDO
1957     ENDDO
1958     ENDDO
1959     #else
1960 dimitri 1.1 DO J=1,sNy
1961     DO I=1,sNx
1962     C AREA(I,J,bi,bj) = 0.1 _d 0 * HEFF(I,J,bi,bj)
1963     AREA(I,J,bi,bj) = AREApreTH(I,J) + 0.1 _d 0 *
1964     & ( HEFF(I,J,bi,bj) - HEFFpreTH(I,J) )
1965     ENDDO
1966     ENDDO
1967 dimitri 1.2 #endif
1968 dimitri 1.1 ENDIF
1969     #endif
1970 torge 1.3 #ifdef SEAICE_ITD
1971     C check categories for consistency with limits after growth/melt
1972     CALL SEAICE_ITD_REDIST(bi, bj, myTime,myIter,myThid)
1973     C finally update total AREA, HEFF, HSNOW
1974     CALL SEAICE_ITD_SUM(bi, bj, myTime,myIter,myThid)
1975     #endif
1976 dimitri 1.1
1977     C ===================================================================
1978     C =============PART 5: determine ice salinity increments=============
1979     C ===================================================================
1980    
1981     #ifndef SEAICE_VARIABLE_SALINITY
1982     # if (defined ALLOW_AUTODIFF_TAMC && defined ALLOW_SALT_PLUME)
1983     CADJ STORE d_HEFFbyNEG = comlev1_bibj,key=iicekey,byte=isbyte
1984     CADJ STORE d_HEFFbyOCNonICE = comlev1_bibj,key=iicekey,byte=isbyte
1985     CADJ STORE d_HEFFbyATMonOCN = comlev1_bibj,key=iicekey,byte=isbyte
1986     CADJ STORE d_HEFFbyATMonOCN_open = comlev1_bibj,key=iicekey,byte=isbyte
1987     CADJ STORE d_HEFFbyATMonOCN_cover = comlev1_bibj,key=iicekey,byte=isbyte
1988     CADJ STORE d_HEFFbyFLOODING = comlev1_bibj,key=iicekey,byte=isbyte
1989     CADJ STORE d_HEFFbySublim = comlev1_bibj,key=iicekey,byte=isbyte
1990     CADJ STORE salt(:,:,kSurface,bi,bj) = comlev1_bibj,
1991     CADJ & key = iicekey, byte = isbyte
1992     # endif /* ALLOW_AUTODIFF_TAMC and ALLOW_SALT_PLUME */
1993     DO J=1,sNy
1994     DO I=1,sNx
1995     tmpscal1 = d_HEFFbyNEG(I,J) + d_HEFFbyOCNonICE(I,J) +
1996     & d_HEFFbyATMonOCN(I,J) + d_HEFFbyFLOODING(I,J)
1997     & + d_HEFFbySublim(I,J)
1998     #ifdef SEAICE_ALLOW_AREA_RELAXATION
1999     + d_HEFFbyRLX(I,J)
2000     #endif
2001     tmpscal2 = tmpscal1 * SEAICE_salt0 * HEFFM(I,J,bi,bj)
2002     & * recip_deltaTtherm * SEAICE_rhoIce
2003     saltFlux(I,J,bi,bj) = tmpscal2
2004     #ifdef ALLOW_SALT_PLUME
2005     tmpscal3 = tmpscal1*salt(I,J,kSurface,bi,bj)*HEFFM(I,J,bi,bj)
2006     & * recip_deltaTtherm * SEAICE_rhoIce
2007     saltPlumeFlux(I,J,bi,bj) = MAX( tmpscal3-tmpscal2 , 0. _d 0)
2008     & *SPsalFRAC
2009     #endif /* ALLOW_SALT_PLUME */
2010     ENDDO
2011     ENDDO
2012     #endif /* ndef SEAICE_VARIABLE_SALINITY */
2013    
2014     #ifdef SEAICE_VARIABLE_SALINITY
2015    
2016     #ifdef SEAICE_GROWTH_LEGACY
2017     # ifdef ALLOW_AUTODIFF_TAMC
2018     CADJ STORE hsalt(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
2019     # endif /* ALLOW_AUTODIFF_TAMC */
2020     DO J=1,sNy
2021     DO I=1,sNx
2022     C set HSALT = 0 if HSALT < 0 and compute salt to remove from ocean
2023     IF ( HSALT(I,J,bi,bj) .LT. 0.0 ) THEN
2024     saltFluxAdjust(I,J) = - HEFFM(I,J,bi,bj) *
2025     & HSALT(I,J,bi,bj) * recip_deltaTtherm
2026     HSALT(I,J,bi,bj) = 0.0 _d 0
2027     ENDIF
2028     ENDDO
2029     ENDDO
2030     #endif /* SEAICE_GROWTH_LEGACY */
2031    
2032     #ifdef ALLOW_AUTODIFF_TAMC
2033     CADJ STORE hsalt(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
2034     #endif /* ALLOW_AUTODIFF_TAMC */
2035    
2036     DO J=1,sNy
2037     DO I=1,sNx
2038     C sum up the terms that affect the salt content of the ice pack
2039     tmpscal1=d_HEFFbyOCNonICE(I,J)+d_HEFFbyATMonOCN(I,J)
2040    
2041     C recompute HEFF before thermodynamic updates (which is not AREApreTH in legacy code)
2042     tmpscal2=HEFF(I,J,bi,bj)-tmpscal1-d_HEFFbyFLOODING(I,J)
2043     C tmpscal1 > 0 : m of sea ice that is created
2044     IF ( tmpscal1 .GE. 0.0 ) THEN
2045     saltFlux(I,J,bi,bj) =
2046     & HEFFM(I,J,bi,bj)*recip_deltaTtherm
2047     & *SEAICE_saltFrac*salt(I,J,kSurface,bi,bj)
2048     & *tmpscal1*SEAICE_rhoIce
2049     #ifdef ALLOW_SALT_PLUME
2050     C saltPlumeFlux is defined only during freezing:
2051     saltPlumeFlux(I,J,bi,bj)=
2052     & HEFFM(I,J,bi,bj)*recip_deltaTtherm
2053     & *(ONE-SEAICE_saltFrac)*salt(I,J,kSurface,bi,bj)
2054     & *tmpscal1*SEAICE_rhoIce
2055     & *SPsalFRAC
2056     C if SaltPlumeSouthernOcean=.FALSE. turn off salt plume in Southern Ocean
2057     IF ( .NOT. SaltPlumeSouthernOcean ) THEN
2058     IF ( YC(I,J,bi,bj) .LT. 0.0 _d 0 )
2059     & saltPlumeFlux(i,j,bi,bj) = 0.0 _d 0
2060     ENDIF
2061     #endif /* ALLOW_SALT_PLUME */
2062    
2063     C tmpscal1 < 0 : m of sea ice that is melted
2064     ELSE
2065     saltFlux(I,J,bi,bj) =
2066     & HEFFM(I,J,bi,bj)*recip_deltaTtherm
2067     & *HSALT(I,J,bi,bj)
2068     & *tmpscal1/tmpscal2
2069     #ifdef ALLOW_SALT_PLUME
2070     saltPlumeFlux(i,j,bi,bj) = 0.0 _d 0
2071     #endif /* ALLOW_SALT_PLUME */
2072     ENDIF
2073     C update HSALT based on surface saltFlux
2074     HSALT(I,J,bi,bj) = HSALT(I,J,bi,bj) +
2075     & saltFlux(I,J,bi,bj) * SEAICE_deltaTtherm
2076     saltFlux(I,J,bi,bj) =
2077     & saltFlux(I,J,bi,bj) + saltFluxAdjust(I,J)
2078     #ifdef SEAICE_GROWTH_LEGACY
2079     C set HSALT = 0 if HEFF = 0 and compute salt to dump into ocean
2080     IF ( HEFF(I,J,bi,bj) .EQ. 0.0 ) THEN
2081     saltFlux(I,J,bi,bj) = saltFlux(I,J,bi,bj) -
2082     & HEFFM(I,J,bi,bj) * HSALT(I,J,bi,bj) * recip_deltaTtherm
2083     HSALT(I,J,bi,bj) = 0.0 _d 0
2084     #ifdef ALLOW_SALT_PLUME
2085     saltPlumeFlux(i,j,bi,bj) = 0.0 _d 0
2086     #endif /* ALLOW_SALT_PLUME */
2087     ENDIF
2088     #endif /* SEAICE_GROWTH_LEGACY */
2089     ENDDO
2090     ENDDO
2091     #endif /* SEAICE_VARIABLE_SALINITY */
2092    
2093    
2094     C =======================================================================
2095     C ==LEGACY PART 6 (LEGACY) treat pathological cases, then do flooding ===
2096     C =======================================================================
2097    
2098     #ifdef SEAICE_GROWTH_LEGACY
2099    
2100     C treat values of ice cover fraction oustide
2101     C the [0 1] range, and other such issues.
2102     C ===========================================
2103    
2104     Cgf note: this part cannot be heat and water conserving
2105    
2106     #ifdef ALLOW_AUTODIFF_TAMC
2107     CADJ STORE area(:,:,bi,bj) = comlev1_bibj,
2108     CADJ & key = iicekey, byte = isbyte
2109     CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,
2110     CADJ & key = iicekey, byte = isbyte
2111     #endif /* ALLOW_AUTODIFF_TAMC */
2112     DO J=1,sNy
2113     DO I=1,sNx
2114     C NOW SET AREA(I,J,bi,bj)=0 WHERE THERE IS NO ICE
2115     CML replaced "/.0001 _d 0" by "*1. _d 4", 1e-4 is probably
2116     CML meant to be something like a minimum thickness
2117     AREA(I,J,bi,bj)=MIN(AREA(I,J,bi,bj),HEFF(I,J,bi,bj)*1. _d 4)
2118     ENDDO
2119     ENDDO
2120    
2121     #ifdef ALLOW_AUTODIFF_TAMC
2122     CADJ STORE area(:,:,bi,bj) = comlev1_bibj,
2123     CADJ & key = iicekey, byte = isbyte
2124     #endif /* ALLOW_AUTODIFF_TAMC */
2125     DO J=1,sNy
2126     DO I=1,sNx
2127     C NOW TRUNCATE AREA
2128     AREA(I,J,bi,bj)=MIN(ONE,AREA(I,J,bi,bj))
2129     ENDDO
2130     ENDDO
2131    
2132     #ifdef ALLOW_AUTODIFF_TAMC
2133     CADJ STORE area(:,:,bi,bj) = comlev1_bibj,
2134     CADJ & key = iicekey, byte = isbyte
2135     CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
2136     CADJ & key = iicekey, byte = isbyte
2137     #endif /* ALLOW_AUTODIFF_TAMC */
2138     DO J=1,sNy
2139     DO I=1,sNx
2140     AREA(I,J,bi,bj) = MAX(ZERO,AREA(I,J,bi,bj))
2141     HSNOW(I,J,bi,bj) = MAX(ZERO,HSNOW(I,J,bi,bj))
2142     AREA(I,J,bi,bj) = AREA(I,J,bi,bj)*HEFFM(I,J,bi,bj)
2143     HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj)*HEFFM(I,J,bi,bj)
2144     #ifdef SEAICE_CAP_HEFF
2145     C This is not energy conserving, but at least it conserves fresh water
2146     tmpscal0 = -MAX(HEFF(I,J,bi,bj)-MAX_HEFF,0. _d 0)
2147     d_HEFFbyNeg(I,J) = d_HEFFbyNeg(I,J) + tmpscal0
2148     HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) + tmpscal0
2149     #endif /* SEAICE_CAP_HEFF */
2150     HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)*HEFFM(I,J,bi,bj)
2151     ENDDO
2152     ENDDO
2153    
2154     C convert snow to ice if submerged.
2155     C =================================
2156    
2157     IF ( SEAICEuseFlooding ) THEN
2158     DO J=1,sNy
2159     DO I=1,sNx
2160     tmpscal0 = (HSNOW(I,J,bi,bj)*SEAICE_rhoSnow
2161     & +HEFF(I,J,bi,bj)*SEAICE_rhoIce)*recip_rhoConst
2162     tmpscal1 = MAX( 0. _d 0, tmpscal0 - HEFF(I,J,bi,bj))
2163     d_HEFFbyFLOODING(I,J)=tmpscal1
2164     HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj)+d_HEFFbyFLOODING(I,J)
2165     HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)-
2166     & d_HEFFbyFLOODING(I,J)*ICE2SNOW
2167     ENDDO
2168     ENDDO
2169     ENDIF
2170    
2171     #endif /* SEAICE_GROWTH_LEGACY */
2172    
2173     #ifdef ALLOW_SITRACER
2174     DO J=1,sNy
2175     DO I=1,sNx
2176     c needs to be here to allow use also with LEGACY branch
2177     SItrHEFF(I,J,bi,bj,5)=HEFF(I,J,bi,bj)
2178     ENDDO
2179     ENDDO
2180     #endif /* ALLOW_SITRACER */
2181    
2182     C ===================================================================
2183     C ==============PART 7: determine ocean model forcing================
2184     C ===================================================================
2185    
2186     C compute net heat flux leaving/entering the ocean,
2187     C accounting for the part used in melt/freeze processes
2188     C =====================================================
2189    
2190     #ifdef ALLOW_AUTODIFF_TAMC
2191     CADJ STORE d_hsnwbyneg = comlev1_bibj,key=iicekey,byte=isbyte
2192     CADJ STORE d_hsnwbyocnonsnw = comlev1_bibj,key=iicekey,byte=isbyte
2193     #endif /* ALLOW_AUTODIFF_TAMC */
2194    
2195     DO J=1,sNy
2196     DO I=1,sNx
2197     QNET(I,J,bi,bj) = r_QbyATM_cover(I,J) + r_QbyATM_open(I,J)
2198     #ifndef SEAICE_GROWTH_LEGACY
2199     C in principle a_QSWbyATM_cover should always be included here, however
2200     C for backward compatibility it is left out of the LEGACY branch
2201     & + a_QSWbyATM_cover(I,J)
2202     #endif /* SEAICE_GROWTH_LEGACY */
2203     & - ( d_HEFFbyOCNonICE(I,J) +
2204     & d_HSNWbyOCNonSNW(I,J)*SNOW2ICE +
2205     & d_HEFFbyNEG(I,J) +
2206     #ifdef SEAICE_ALLOW_AREA_RELAXATION
2207     & d_HEFFbyRLX(I,J) +
2208     #endif
2209     & d_HSNWbyNEG(I,J)*SNOW2ICE )
2210     & * maskC(I,J,kSurface,bi,bj)
2211     QSW(I,J,bi,bj) = a_QSWbyATM_cover(I,J) + a_QSWbyATM_open(I,J)
2212     ENDDO
2213     ENDDO
2214    
2215     C switch heat fluxes from 'effective' ice meters to W/m2
2216     C ======================================================
2217    
2218     DO J=1,sNy
2219     DO I=1,sNx
2220     QNET(I,J,bi,bj) = QNET(I,J,bi,bj)*convertHI2Q
2221     QSW(I,J,bi,bj) = QSW(I,J,bi,bj)*convertHI2Q
2222     ENDDO
2223     ENDDO
2224    
2225     #ifndef SEAICE_DISABLE_HEATCONSFIX
2226     C treat advective heat flux by ocean to ice water exchange (at 0decC)
2227     C ===================================================================
2228     # ifdef ALLOW_AUTODIFF_TAMC
2229     CADJ STORE d_HEFFbyNEG = comlev1_bibj,key=iicekey,byte=isbyte
2230     CADJ STORE d_HEFFbyOCNonICE = comlev1_bibj,key=iicekey,byte=isbyte
2231     CADJ STORE d_HEFFbyATMonOCN = comlev1_bibj,key=iicekey,byte=isbyte
2232     CADJ STORE d_HSNWbyNEG = comlev1_bibj,key=iicekey,byte=isbyte
2233     CADJ STORE d_HSNWbyOCNonSNW = comlev1_bibj,key=iicekey,byte=isbyte
2234     CADJ STORE d_HSNWbyATMonSNW = comlev1_bibj,key=iicekey,byte=isbyte
2235     CADJ STORE theta(:,:,kSurface,bi,bj) = comlev1_bibj,
2236     CADJ & key = iicekey, byte = isbyte
2237     # endif /* ALLOW_AUTODIFF_TAMC */
2238     IF ( SEAICEheatConsFix ) THEN
2239     c Unlike for evap and precip, the temperature of gained/lost
2240     c ocean liquid water due to melt/freeze of solid water cannot be chosen
2241     c to be e.g. the ocean SST. It must be done at 0degC. The fix below anticipates
2242     c on external_forcing_surf.F and applies the correction to QNET.
2243     IF ((convertFW2Salt.EQ.-1.).OR.(temp_EvPrRn.EQ.UNSET_RL)) THEN
2244     c I leave alone the exotic case when onvertFW2Salt.NE.-1 and temp_EvPrRn.NE.UNSET_RL and
2245     c the small error of the synchronous time stepping case (see external_forcing_surf.F).
2246     DO J=1,sNy
2247     DO I=1,sNx
2248     #ifdef ALLOW_DIAGNOSTICS
2249     c store unaltered QNET for diagnostic purposes
2250     DIAGarrayA(I,J)=QNET(I,J,bi,bj)
2251     #endif
2252     c compute the ocean water going to ice/snow, in precip units
2253     tmpscal3=rhoConstFresh*maskC(I,J,kSurface,bi,bj)*
2254     & ( d_HSNWbyATMonSNW(I,J)*SNOW2ICE
2255     & + d_HSNWbyOCNonSNW(I,J)*SNOW2ICE
2256     & + d_HEFFbyOCNonICE(I,J) + d_HEFFbyATMonOCN(I,J)
2257     & + d_HEFFbyNEG(I,J) + d_HSNWbyNEG(I,J)*SNOW2ICE )
2258     & * convertHI2PRECIP
2259     c factor in the heat content that external_forcing_surf.F
2260     c will associate with EMPMR, and remove it from QNET, so that
2261     c melt/freez water is in effect consistently gained/lost at 0degC
2262     IF (temp_EvPrRn.NE.UNSET_RL) THEN
2263     QNET(I,J,bi,bj)=QNET(I,J,bi,bj) - tmpscal3*
2264     & HeatCapacity_Cp * temp_EvPrRn
2265     ELSE
2266     QNET(I,J,bi,bj)=QNET(I,J,bi,bj) - tmpscal3*
2267     & HeatCapacity_Cp * theta(I,J,kSurface,bi,bj)
2268     ENDIF
2269     #ifdef ALLOW_DIAGNOSTICS
2270     c back out the eventual TFLUX adjustement and fill diag
2271     DIAGarrayA(I,J)=QNET(I,J,bi,bj)-DIAGarrayA(I,J)
2272     #endif
2273     ENDDO
2274     ENDDO
2275     ENDIF
2276     #ifdef ALLOW_DIAGNOSTICS
2277     CALL DIAGNOSTICS_FILL(DIAGarrayA,
2278     & 'SIaaflux',0,1,3,bi,bj,myThid)
2279     #endif
2280     ENDIF
2281     #endif /* ndef SEAICE_DISABLE_HEATCONSFIX */
2282    
2283     C compute net fresh water flux leaving/entering
2284     C the ocean, accounting for fresh/salt water stocks.
2285     C ==================================================
2286    
2287     #ifdef ALLOW_ATM_TEMP
2288     DO J=1,sNy
2289     DO I=1,sNx
2290     tmpscal1= d_HSNWbyATMonSNW(I,J)*SNOW2ICE
2291     & +d_HFRWbyRAIN(I,J)
2292     & +d_HSNWbyOCNonSNW(I,J)*SNOW2ICE
2293     & +d_HEFFbyOCNonICE(I,J)
2294     & +d_HEFFbyATMonOCN(I,J)
2295     & +d_HEFFbyNEG(I,J)
2296     #ifdef SEAICE_ALLOW_AREA_RELAXATION
2297     & +d_HEFFbyRLX(I,J)
2298     #endif
2299     & +d_HSNWbyNEG(I,J)*SNOW2ICE
2300     C If r_FWbySublim>0, then it is evaporated from ocean.
2301     & +r_FWbySublim(I,J)
2302     EmPmR(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*(
2303     & ( EVAP(I,J,bi,bj)-PRECIP(I,J,bi,bj) )
2304     & * ( ONE - AREApreTH(I,J) )
2305     #ifdef ALLOW_RUNOFF
2306     & - RUNOFF(I,J,bi,bj)
2307     #endif /* ALLOW_RUNOFF */
2308     & + tmpscal1*convertHI2PRECIP
2309     & )*rhoConstFresh
2310     ENDDO
2311     ENDDO
2312    
2313     #ifdef ALLOW_SSH_GLOBMEAN_COST_CONTRIBUTION
2314     C--
2315     DO J=1,sNy
2316     DO I=1,sNx
2317     frWtrAtm(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*(
2318     & PRECIP(I,J,bi,bj)
2319     & - EVAP(I,J,bi,bj)*( ONE - AREApreTH(I,J) )
2320     # ifdef ALLOW_RUNOFF
2321     & + RUNOFF(I,J,bi,bj)
2322     # endif /* ALLOW_RUNOFF */
2323     & )*rhoConstFresh
2324     # ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
2325     & - a_FWbySublim(I,J)*AREApreTH(I,J)
2326     # endif /* SEAICE_ADD_SUBLIMATION_TO_FWBUDGET */
2327     ENDDO
2328     ENDDO
2329     C--
2330     #else /* ndef ALLOW_SSH_GLOBMEAN_COST_CONTRIBUTION */
2331     C--
2332     # ifdef ALLOW_MEAN_SFLUX_COST_CONTRIBUTION
2333     DO J=1,sNy
2334     DO I=1,sNx
2335     frWtrAtm(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*(
2336     & PRECIP(I,J,bi,bj)
2337     & - EVAP(I,J,bi,bj)
2338     & *( ONE - AREApreTH(I,J) )
2339     # ifdef ALLOW_RUNOFF
2340     & + RUNOFF(I,J,bi,bj)
2341     # endif /* ALLOW_RUNOFF */
2342     & )*rhoConstFresh
2343     & - a_FWbySublim(I,J) * SEAICE_rhoIce * recip_deltaTtherm
2344     ENDDO
2345     ENDDO
2346     # endif
2347     C--
2348     #endif /* ALLOW_SSH_GLOBMEAN_COST_CONTRIBUTION */
2349    
2350     #endif /* ALLOW_ATM_TEMP */
2351    
2352     #ifdef SEAICE_DEBUG
2353     CALL PLOT_FIELD_XYRL( QSW,'Current QSW ', myIter, myThid )
2354     CALL PLOT_FIELD_XYRL( QNET,'Current QNET ', myIter, myThid )
2355     CALL PLOT_FIELD_XYRL( EmPmR,'Current EmPmR ', myIter, myThid )
2356     #endif /* SEAICE_DEBUG */
2357    
2358     C Sea Ice Load on the sea surface.
2359     C =================================
2360    
2361     #ifdef ALLOW_AUTODIFF_TAMC
2362     CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
2363     CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
2364     #endif /* ALLOW_AUTODIFF_TAMC */
2365    
2366     IF ( useRealFreshWaterFlux ) THEN
2367     DO J=1,sNy
2368     DO I=1,sNx
2369     #ifdef SEAICE_CAP_ICELOAD
2370     tmpscal1 = HEFF(I,J,bi,bj)*SEAICE_rhoIce
2371     & + HSNOW(I,J,bi,bj)*SEAICE_rhoSnow
2372     tmpscal2 = MIN(tmpscal1,heffTooHeavy*rhoConst)
2373     #else
2374     tmpscal2 = HEFF(I,J,bi,bj)*SEAICE_rhoIce
2375     & + HSNOW(I,J,bi,bj)*SEAICE_rhoSnow
2376     #endif
2377     sIceLoad(i,j,bi,bj) = tmpscal2
2378     ENDDO
2379     ENDDO
2380     ENDIF
2381    
2382     C ===================================================================
2383     C ======================PART 8: diagnostics==========================
2384     C ===================================================================
2385    
2386     #ifdef ALLOW_DIAGNOSTICS
2387     IF ( useDiagnostics ) THEN
2388     tmpscal1=1. _d 0 * recip_deltaTtherm
2389     CALL DIAGNOSTICS_SCALE_FILL(a_QbyATM_cover,
2390     & tmpscal1,1,'SIaQbATC',0,1,3,bi,bj,myThid)
2391     CALL DIAGNOSTICS_SCALE_FILL(a_QbyATM_open,
2392     & tmpscal1,1,'SIaQbATO',0,1,3,bi,bj,myThid)
2393     CALL DIAGNOSTICS_SCALE_FILL(a_QbyOCN,
2394     & tmpscal1,1,'SIaQbOCN',0,1,3,bi,bj,myThid)
2395     CALL DIAGNOSTICS_SCALE_FILL(d_HEFFbyOCNonICE,
2396     & tmpscal1,1,'SIdHbOCN',0,1,3,bi,bj,myThid)
2397     CALL DIAGNOSTICS_SCALE_FILL(d_HEFFbyATMonOCN_cover,
2398     & tmpscal1,1,'SIdHbATC',0,1,3,bi,bj,myThid)
2399     CALL DIAGNOSTICS_SCALE_FILL(d_HEFFbyATMonOCN_open,
2400     & tmpscal1,1,'SIdHbATO',0,1,3,bi,bj,myThid)
2401     CALL DIAGNOSTICS_SCALE_FILL(d_HEFFbyFLOODING,
2402     & tmpscal1,1,'SIdHbFLO',0,1,3,bi,bj,myThid)
2403     CALL DIAGNOSTICS_SCALE_FILL(d_HSNWbyOCNonSNW,
2404     & tmpscal1,1,'SIdSbOCN',0,1,3,bi,bj,myThid)
2405     CALL DIAGNOSTICS_SCALE_FILL(d_HSNWbyATMonSNW,
2406     & tmpscal1,1,'SIdSbATC',0,1,3,bi,bj,myThid)
2407     CALL DIAGNOSTICS_SCALE_FILL(d_AREAbyATM,
2408     & tmpscal1,1,'SIdAbATO',0,1,3,bi,bj,myThid)
2409     CALL DIAGNOSTICS_SCALE_FILL(d_AREAbyICE,
2410     & tmpscal1,1,'SIdAbATC',0,1,3,bi,bj,myThid)
2411     CALL DIAGNOSTICS_SCALE_FILL(d_AREAbyOCN,
2412     & tmpscal1,1,'SIdAbOCN',0,1,3,bi,bj,myThid)
2413     CALL DIAGNOSTICS_SCALE_FILL(r_QbyATM_open,
2414     & convertHI2Q,1, 'SIqneto ',0,1,3,bi,bj,myThid)
2415     CALL DIAGNOSTICS_SCALE_FILL(r_QbyATM_cover,
2416     & convertHI2Q,1, 'SIqneti ',0,1,3,bi,bj,myThid)
2417     C three that actually need intermediate storage
2418     DO J=1,sNy
2419     DO I=1,sNx
2420     DIAGarrayA(I,J) = maskC(I,J,kSurface,bi,bj)
2421     & * d_HSNWbyRAIN(I,J)*SEAICE_rhoSnow*recip_deltaTtherm
2422     DIAGarrayB(I,J) = AREA(I,J,bi,bj)-AREApreTH(I,J)
2423     ENDDO
2424     ENDDO
2425     CALL DIAGNOSTICS_FILL(DIAGarrayA,
2426     & 'SIsnPrcp',0,1,3,bi,bj,myThid)
2427     CALL DIAGNOSTICS_SCALE_FILL(DIAGarrayB,
2428     & tmpscal1,1,'SIdA ',0,1,3,bi,bj,myThid)
2429     #ifdef ALLOW_ATM_TEMP
2430     DO J=1,sNy
2431     DO I=1,sNx
2432     CML If I consider the atmosphere above the ice, the surface flux
2433     CML which is relevant for the air temperature dT/dt Eq
2434     CML accounts for sensible and radiation (with different treatment
2435     CML according to wave-length) fluxes but not for "latent heat flux",
2436     CML since it does not contribute to heating the air.
2437     CML So this diagnostic is only good for heat budget calculations within
2438     CML the ice-ocean system.
2439     DIAGarrayA(I,J) = maskC(I,J,kSurface,bi,bj)*convertHI2Q*(
2440     #ifndef SEAICE_GROWTH_LEGACY
2441     & a_QSWbyATM_cover(I,J) +
2442     #endif /* SEAICE_GROWTH_LEGACY */
2443     & a_QbyATM_cover(I,J) + a_QbyATM_open(I,J) )
2444     C
2445     DIAGarrayB(I,J) = maskC(I,J,kSurface,bi,bj) *
2446     & a_FWbySublim(I,J) * SEAICE_rhoIce * recip_deltaTtherm
2447     C
2448     DIAGarrayC(I,J) = maskC(I,J,kSurface,bi,bj)*(
2449     & PRECIP(I,J,bi,bj)
2450     & - EVAP(I,J,bi,bj)*( ONE - AREApreTH(I,J) )
2451     #ifdef ALLOW_RUNOFF
2452     & + RUNOFF(I,J,bi,bj)
2453     #endif /* ALLOW_RUNOFF */
2454     & )*rhoConstFresh
2455     & - a_FWbySublim(I,J) * SEAICE_rhoIce * recip_deltaTtherm
2456     ENDDO
2457     ENDDO
2458     CALL DIAGNOSTICS_FILL(DIAGarrayA,
2459     & 'SIatmQnt',0,1,3,bi,bj,myThid)
2460     CALL DIAGNOSTICS_FILL(DIAGarrayB,
2461     & 'SIfwSubl',0,1,3,bi,bj,myThid)
2462     CALL DIAGNOSTICS_FILL(DIAGarrayC,
2463     & 'SIatmFW ',0,1,3,bi,bj,myThid)
2464     C
2465     DO J=1,sNy
2466     DO I=1,sNx
2467     C the actual Freshwater flux of sublimated ice, >0 decreases ice
2468     DIAGarrayA(I,J) = maskC(I,J,kSurface,bi,bj)
2469     & * (a_FWbySublim(I,J)-r_FWbySublim(I,J))
2470     & * SEAICE_rhoIce * recip_deltaTtherm
2471     c the residual Freshwater flux of sublimated ice
2472     DIAGarrayC(I,J) = maskC(I,J,kSurface,bi,bj)
2473     & * r_FWbySublim(I,J)
2474     & * SEAICE_rhoIce * recip_deltaTtherm
2475     C the latent heat flux
2476     tmpscal1= EVAP(I,J,bi,bj)*( ONE - AREApreTH(I,J) )
2477     & + r_FWbySublim(I,J)*convertHI2PRECIP
2478     tmpscal2= ( a_FWbySublim(I,J)-r_FWbySublim(I,J) )
2479     & * convertHI2PRECIP
2480     tmpscal3= SEAICE_lhEvap+SEAICE_lhFusion
2481     DIAGarrayB(I,J) = -maskC(I,J,kSurface,bi,bj)*rhoConstFresh
2482     & * ( tmpscal1*SEAICE_lhEvap + tmpscal2*tmpscal3 )
2483     ENDDO
2484     ENDDO
2485     CALL DIAGNOSTICS_FILL(DIAGarrayA,'SIacSubl',0,1,3,bi,bj,myThid)
2486     CALL DIAGNOSTICS_FILL(DIAGarrayC,'SIrsSubl',0,1,3,bi,bj,myThid)
2487     CALL DIAGNOSTICS_FILL(DIAGarrayB,'SIhl ',0,1,3,bi,bj,myThid)
2488    
2489     DO J=1,sNy
2490     DO I=1,sNx
2491     c compute ice/snow water going to atm, in precip units
2492     tmpscal1 = rhoConstFresh*maskC(I,J,kSurface,bi,bj)
2493     & * convertHI2PRECIP * ( - d_HSNWbyRAIN(I,J)*SNOW2ICE
2494     & + a_FWbySublim(I,J) - r_FWbySublim(I,J) )
2495     c compute ocean water going to atm, in precip units
2496     tmpscal2=rhoConstFresh*maskC(I,J,kSurface,bi,bj)*
2497     & ( ( EVAP(I,J,bi,bj)-PRECIP(I,J,bi,bj) )
2498     & * ( ONE - AREApreTH(I,J) )
2499     #ifdef ALLOW_RUNOFF
2500     & - RUNOFF(I,J,bi,bj)
2501     #endif /* ALLOW_RUNOFF */
2502     & + ( d_HFRWbyRAIN(I,J) + r_FWbySublim(I,J) )
2503     & *convertHI2PRECIP )
2504     c factor in the advected specific energy (referenced to 0 for 0deC liquid water)
2505     tmpscal1= - tmpscal1*
2506     & ( -SEAICE_lhFusion + HeatCapacity_Cp * ZERO )
2507     IF (temp_EvPrRn.NE.UNSET_RL) THEN
2508     tmpscal2= - tmpscal2*
2509     & ( ZERO + HeatCapacity_Cp * temp_EvPrRn )
2510     ELSE
2511     tmpscal2= - tmpscal2*
2512     & ( ZERO + HeatCapacity_Cp * theta(I,J,kSurface,bi,bj) )
2513     ENDIF
2514     c add to SIatmQnt, leading to SItflux, which is analogous to TFLUX
2515     DIAGarrayA(I,J)=maskC(I,J,kSurface,bi,bj)*convertHI2Q*(
2516     #ifndef SEAICE_GROWTH_LEGACY
2517     & a_QSWbyATM_cover(I,J) +
2518     #endif
2519     & a_QbyATM_cover(I,J) + a_QbyATM_open(I,J) )
2520     & -tmpscal1-tmpscal2
2521     ENDDO
2522     ENDDO
2523     CALL DIAGNOSTICS_FILL(DIAGarrayA,
2524     & 'SItflux ',0,1,3,bi,bj,myThid)
2525     #endif /* ALLOW_ATM_TEMP */
2526    
2527     ENDIF
2528     #endif /* ALLOW_DIAGNOSTICS */
2529    
2530     C close bi,bj loops
2531     ENDDO
2532     ENDDO
2533    
2534     RETURN
2535     END

  ViewVC Help
Powered by ViewVC 1.1.22