/[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.21 - (hide annotations) (download)
Fri May 3 20:20:21 2013 UTC (12 years, 3 months ago) by torge
Branch: MAIN
CVS Tags: HEAD
Changes since 1.20: +10 -1 lines
include updates from main branch

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

  ViewVC Help
Powered by ViewVC 1.1.22