/[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.20 - (hide annotations) (download)
Fri May 3 20:09:15 2013 UTC (12 years, 3 months ago) by torge
Branch: MAIN
Changes since 1.19: +1 -196 lines
removing all SEAICE_DEBUG lines that were introduced with ITD development

1 torge 1.20 C $Header: /u/gcmpack/MITgcm_contrib/torge/itd/code/seaice_growth.F,v 1.19 2013/05/03 18:59:40 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 dimitri 1.2 #ifdef SEAICE_ITD
1436 torge 1.5 DO IT=1,nITD
1437 dimitri 1.2 DO J=1,sNy
1438     DO I=1,sNx
1439 torge 1.14 C ice growth/melt due to ocean heat r_QbyOCN (W/m^2) is
1440     C equally distributed under the ice and hence weighted by
1441 torge 1.7 C fractional area of each thickness category
1442 torge 1.14 tmpscal1=MAX(r_QbyOCN(i,j)*areaFracFactor(I,J,IT),
1443 torge 1.5 & -HEFFITD(I,J,IT,bi,bj))
1444 torge 1.12 d_HEFFbyOCNonICE_ITD(I,J,IT)=tmpscal1
1445 torge 1.7 d_HEFFbyOCNonICE(I,J) = d_HEFFbyOCNonICE(I,J) + tmpscal1
1446 dimitri 1.2 ENDDO
1447     ENDDO
1448     ENDDO
1449 torge 1.12 #ifdef ALLOW_SITRACER
1450     DO J=1,sNy
1451     DO I=1,sNx
1452     SItrHEFF(I,J,bi,bj,2) = HEFFpreTH(I,J)
1453 torge 1.14 & + d_HEFFbySublim(I,J)
1454     & + d_HEFFbyOCNonICE(I,J)
1455 torge 1.12 ENDDO
1456     ENDDO
1457     #endif
1458 torge 1.7 DO J=1,sNy
1459     DO I=1,sNx
1460     r_QbyOCN(I,J)=r_QbyOCN(I,J)-d_HEFFbyOCNonICE(I,J)
1461     ENDDO
1462     ENDDO
1463 torge 1.3 #else /* SEAICE_ITD */
1464 dimitri 1.1 DO J=1,sNy
1465     DO I=1,sNx
1466     d_HEFFbyOCNonICE(I,J)=MAX(r_QbyOCN(i,j), -HEFF(I,J,bi,bj))
1467     r_QbyOCN(I,J)=r_QbyOCN(I,J)-d_HEFFbyOCNonICE(I,J)
1468     HEFF(I,J,bi,bj)=HEFF(I,J,bi,bj) + d_HEFFbyOCNonICE(I,J)
1469     #ifdef ALLOW_SITRACER
1470     SItrHEFF(I,J,bi,bj,2)=HEFF(I,J,bi,bj)
1471     #endif
1472     ENDDO
1473     ENDDO
1474 torge 1.3 #endif /* SEAICE_ITD */
1475 dimitri 1.1
1476     C compute snow melt tendency due to snow-atmosphere interaction
1477     C ==================================================================
1478    
1479     #ifdef ALLOW_AUTODIFF_TAMC
1480     CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1481     CADJ STORE r_QbyATM_cover = comlev1_bibj,key=iicekey,byte=isbyte
1482     #endif /* ALLOW_AUTODIFF_TAMC */
1483    
1484 dimitri 1.2 #ifdef SEAICE_ITD
1485 torge 1.14 DO IT=1,nITD
1486 dimitri 1.2 DO J=1,sNy
1487     DO I=1,sNx
1488     C Convert to standard units (meters of ice) rather than to meters
1489     C of snow. This appears to be more robust.
1490 torge 1.5 tmpscal1=MAX(r_QbyATMmult_cover(I,J,IT),
1491     & -HSNOWITD(I,J,IT,bi,bj)*SNOW2ICE)
1492     tmpscal2=MIN(tmpscal1,0. _d 0)
1493 dimitri 1.2 #ifdef SEAICE_MODIFY_GROWTH_ADJ
1494     Cgf no additional dependency through snow
1495 torge 1.5 IF ( SEAICEadjMODE.GE.2 ) tmpscal2 = 0. _d 0
1496 dimitri 1.2 #endif
1497 torge 1.12 d_HSNWbyATMonSNW_ITD(I,J,IT) = tmpscal2*ICE2SNOW
1498 torge 1.5 d_HSNWbyATMonSNW(I,J) = d_HSNWbyATMonSNW(I,J)
1499     & + tmpscal2*ICE2SNOW
1500 torge 1.14 r_QbyATMmult_cover(I,J,IT)=r_QbyATMmult_cover(I,J,IT)
1501 torge 1.5 & - tmpscal2
1502 torge 1.14 ENDDO
1503     ENDDO
1504     ENDDO
1505 torge 1.3 #else /* SEAICE_ITD */
1506 dimitri 1.1 DO J=1,sNy
1507     DO I=1,sNx
1508     C Convert to standard units (meters of ice) rather than to meters
1509     C of snow. This appears to be more robust.
1510     tmpscal1=MAX(r_QbyATM_cover(I,J),-HSNOW(I,J,bi,bj)*SNOW2ICE)
1511     tmpscal2=MIN(tmpscal1,0. _d 0)
1512     #ifdef SEAICE_MODIFY_GROWTH_ADJ
1513     Cgf no additional dependency through snow
1514     IF ( SEAICEadjMODE.GE.2 ) tmpscal2 = 0. _d 0
1515     #endif
1516     d_HSNWbyATMonSNW(I,J)= tmpscal2*ICE2SNOW
1517 torge 1.3 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj) + tmpscal2*ICE2SNOW
1518 dimitri 1.1 r_QbyATM_cover(I,J)=r_QbyATM_cover(I,J) - tmpscal2
1519     ENDDO
1520     ENDDO
1521 dimitri 1.2 #endif /* SEAICE_ITD */
1522 dimitri 1.1
1523     C compute ice thickness tendency due to the atmosphere
1524     C ====================================================
1525    
1526     #ifdef ALLOW_AUTODIFF_TAMC
1527     CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1528     CADJ STORE r_QbyATM_cover = comlev1_bibj,key=iicekey,byte=isbyte
1529     #endif /* ALLOW_AUTODIFF_TAMC */
1530    
1531     Cgf note: this block is not actually tested by lab_sea
1532     Cgf where all experiments start in January. So even though
1533     Cgf the v1.81=>v1.82 revision would change results in
1534     Cgf warming conditions, the lab_sea results were not changed.
1535    
1536 dimitri 1.2 #ifdef SEAICE_ITD
1537 torge 1.14 DO IT=1,nITD
1538 dimitri 1.2 DO J=1,sNy
1539     DO I=1,sNx
1540 torge 1.14 tmpscal1 = HEFFITDpreTH(I,J,IT)
1541 torge 1.13 & + d_HEFFbySublim_ITD(I,J,IT)
1542     & + d_HEFFbyOCNonICE_ITD(I,J,IT)
1543     tmpscal2 = MAX(-tmpscal1,
1544 torge 1.5 & r_QbyATMmult_cover(I,J,IT)
1545 dimitri 1.2 c Limit ice growth by potential melt by ocean
1546 torge 1.5 & + AREAITDpreTH(I,J,IT) * r_QbyOCN(I,J))
1547 torge 1.12 d_HEFFbyATMonOCN_cover_ITD(I,J,IT) = tmpscal2
1548 dimitri 1.2 d_HEFFbyATMonOCN_cover(I,J) = d_HEFFbyATMonOCN_cover(I,J)
1549     & + tmpscal2
1550 torge 1.14 d_HEFFbyATMonOCN_ITD(I,J,IT) = d_HEFFbyATMonOCN_ITD(I,J,IT)
1551 torge 1.12 & + tmpscal2
1552 dimitri 1.2 d_HEFFbyATMonOCN(I,J) = d_HEFFbyATMonOCN(I,J)
1553     & + tmpscal2
1554 torge 1.8 r_QbyATMmult_cover(I,J,IT) = r_QbyATMmult_cover(I,J,IT)
1555 dimitri 1.2 & - tmpscal2
1556 torge 1.14 ENDDO
1557     ENDDO
1558     ENDDO
1559 torge 1.3 #ifdef ALLOW_SITRACER
1560 torge 1.12 DO J=1,sNy
1561     DO I=1,sNx
1562     SItrHEFF(I,J,bi,bj,3) = SItrHEFF(I,J,bi,bj,2)
1563 torge 1.14 & + d_HEFFbyATMonOCN_cover(I,J)
1564     ENDDO
1565     ENDDO
1566 torge 1.12 #endif
1567 torge 1.3 #else /* SEAICE_ITD */
1568 dimitri 1.1 DO J=1,sNy
1569     DO I=1,sNx
1570    
1571     tmpscal2 = MAX(-HEFF(I,J,bi,bj),r_QbyATM_cover(I,J)+
1572 torge 1.10 C Limit ice growth by potential melt by ocean
1573 dimitri 1.1 & AREApreTH(I,J) * r_QbyOCN(I,J))
1574    
1575     d_HEFFbyATMonOCN_cover(I,J)=tmpscal2
1576     d_HEFFbyATMonOCN(I,J)=d_HEFFbyATMonOCN(I,J)+tmpscal2
1577     r_QbyATM_cover(I,J)=r_QbyATM_cover(I,J)-tmpscal2
1578 torge 1.3 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) + tmpscal2
1579 dimitri 1.1
1580     #ifdef ALLOW_SITRACER
1581     SItrHEFF(I,J,bi,bj,3)=HEFF(I,J,bi,bj)
1582     #endif
1583 torge 1.10 ENDDO
1584     ENDDO
1585 torge 1.3 #endif /* SEAICE_ITD */
1586 dimitri 1.1
1587 torge 1.10 C add snow precipitation to HSNOW.
1588 dimitri 1.1 C =================================================
1589     #ifdef ALLOW_ATM_TEMP
1590 torge 1.10 # ifdef ALLOW_AUTODIFF_TAMC
1591 dimitri 1.1 CADJ STORE a_QbyATM_cover = comlev1_bibj,key=iicekey,byte=isbyte
1592     CADJ STORE PRECIP(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1593     CADJ STORE AREApreTH = comlev1_bibj,key=iicekey,byte=isbyte
1594 torge 1.10 # endif /* ALLOW_AUTODIFF_TAMC */
1595     IF ( snowPrecipFile .NE. ' ' ) THEN
1596     C add snowPrecip to HSNOW
1597     DO J=1,sNy
1598     DO I=1,sNx
1599     d_HSNWbyRAIN(I,J) = convertPRECIP2HI * ICE2SNOW *
1600     & snowPrecip(i,j,bi,bj) * AREApreTH(I,J)
1601     d_HFRWbyRAIN(I,J) = -convertPRECIP2HI *
1602     & ( PRECIP(I,J,bi,bj) - snowPrecip(I,J,bi,bj) ) *
1603     & AREApreTH(I,J)
1604     HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj) + d_HSNWbyRAIN(I,J)
1605     ENDDO
1606     ENDDO
1607     ELSE
1608     C attribute precip to fresh water or snow stock,
1609     C depending on atmospheric conditions.
1610     DO J=1,sNy
1611     DO I=1,sNx
1612 dimitri 1.1 C possible alternatives to the a_QbyATM_cover criterium
1613     c IF (TICE(I,J,bi,bj) .LT. TMIX) THEN
1614     c IF (atemp(I,J,bi,bj) .LT. celsius2K) THEN
1615 torge 1.10 IF ( a_QbyATM_cover(I,J).GE. 0. _d 0 ) THEN
1616 dimitri 1.1 C add precip as snow
1617     d_HFRWbyRAIN(I,J)=0. _d 0
1618     d_HSNWbyRAIN(I,J)=convertPRECIP2HI*ICE2SNOW*
1619     & PRECIP(I,J,bi,bj)*AREApreTH(I,J)
1620 torge 1.10 ELSE
1621 dimitri 1.1 C add precip to the fresh water bucket
1622     d_HFRWbyRAIN(I,J)=-convertPRECIP2HI*
1623     & PRECIP(I,J,bi,bj)*AREApreTH(I,J)
1624     d_HSNWbyRAIN(I,J)=0. _d 0
1625 torge 1.10 ENDIF
1626 dimitri 1.1 ENDDO
1627     ENDDO
1628 dimitri 1.2 #ifdef SEAICE_ITD
1629 torge 1.14 DO IT=1,nITD
1630 dimitri 1.2 DO J=1,sNy
1631     DO I=1,sNx
1632 torge 1.14 d_HSNWbyRAIN_ITD(I,J,IT)
1633 torge 1.12 & = d_HSNWbyRAIN(I,J)*areaFracFactor(I,J,IT)
1634 dimitri 1.2 ENDDO
1635     ENDDO
1636 torge 1.14 ENDDO
1637 torge 1.3 #else
1638     DO J=1,sNy
1639     DO I=1,sNx
1640     HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj) + d_HSNWbyRAIN(I,J)
1641     ENDDO
1642     ENDDO
1643 dimitri 1.2 #endif
1644 dimitri 1.1 Cgf note: this does not affect air-sea heat flux,
1645     Cgf since the implied air heat gain to turn
1646     Cgf rain to snow is not a surface process.
1647 torge 1.10 C end of IF statement snowPrecipFile:
1648     ENDIF
1649 dimitri 1.1 #endif /* ALLOW_ATM_TEMP */
1650    
1651     C compute snow melt due to heat available from ocean.
1652     C =================================================================
1653    
1654     Cgf do we need to keep this comment and cpp bracket?
1655     Cph( very sensitive bit here by JZ
1656     #ifndef SEAICE_EXCLUDE_FOR_EXACT_AD_TESTING
1657     #ifdef ALLOW_AUTODIFF_TAMC
1658     CADJ STORE HSNOW(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1659     CADJ STORE r_QbyOCN = comlev1_bibj,key=iicekey,byte=isbyte
1660     #endif /* ALLOW_AUTODIFF_TAMC */
1661 dimitri 1.2
1662     #ifdef SEAICE_ITD
1663 torge 1.5 DO IT=1,nITD
1664 dimitri 1.2 DO J=1,sNy
1665     DO I=1,sNx
1666 torge 1.14 tmpscal4 = HSNWITDpreTH(I,J,IT)
1667 torge 1.13 & + d_HSNWbySublim_ITD(I,J,IT)
1668 torge 1.12 & + d_HSNWbyATMonSNW_ITD(I,J,IT)
1669     & + d_HSNWbyRAIN_ITD(I,J,IT)
1670 torge 1.14 tmpscal1=MAX(r_QbyOCN(i,j)*ICE2SNOW*areaFracFactor(I,J,IT),
1671 torge 1.12 & -tmpscal4)
1672 dimitri 1.2 tmpscal2=MIN(tmpscal1,0. _d 0)
1673     #ifdef SEAICE_MODIFY_GROWTH_ADJ
1674     Cgf no additional dependency through snow
1675     if ( SEAICEadjMODE.GE.2 ) tmpscal2 = 0. _d 0
1676     #endif
1677 torge 1.12 d_HSNWbyOCNonSNW_ITD(I,J,IT) = tmpscal2
1678 torge 1.3 d_HSNWbyOCNonSNW(I,J) = d_HSNWbyOCNonSNW(I,J) + tmpscal2
1679     r_QbyOCN(I,J)=r_QbyOCN(I,J) - tmpscal2*SNOW2ICE
1680 dimitri 1.2 ENDDO
1681     ENDDO
1682     ENDDO
1683 torge 1.3 #else /* SEAICE_ITD */
1684 dimitri 1.1 DO J=1,sNy
1685     DO I=1,sNx
1686     tmpscal1=MAX(r_QbyOCN(i,j)*ICE2SNOW, -HSNOW(I,J,bi,bj))
1687     tmpscal2=MIN(tmpscal1,0. _d 0)
1688     #ifdef SEAICE_MODIFY_GROWTH_ADJ
1689     Cgf no additional dependency through snow
1690     if ( SEAICEadjMODE.GE.2 ) tmpscal2 = 0. _d 0
1691     #endif
1692     d_HSNWbyOCNonSNW(I,J) = tmpscal2
1693     r_QbyOCN(I,J)=r_QbyOCN(I,J)
1694     & -d_HSNWbyOCNonSNW(I,J)*SNOW2ICE
1695     HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)+d_HSNWbyOCNonSNW(I,J)
1696     ENDDO
1697     ENDDO
1698 torge 1.3 #endif /* SEAICE_ITD */
1699 dimitri 1.1 #endif /* SEAICE_EXCLUDE_FOR_EXACT_AD_TESTING */
1700     Cph)
1701    
1702     C gain of new ice over open water
1703     C ===============================
1704     #ifdef ALLOW_AUTODIFF_TAMC
1705     CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1706     CADJ STORE r_QbyATM_open = comlev1_bibj,key=iicekey,byte=isbyte
1707     CADJ STORE r_QbyOCN = comlev1_bibj,key=iicekey,byte=isbyte
1708     CADJ STORE a_QSWbyATM_cover = comlev1_bibj,key=iicekey,byte=isbyte
1709     CADJ STORE a_QSWbyATM_open = comlev1_bibj,key=iicekey,byte=isbyte
1710     #endif /* ALLOW_AUTODIFF_TAMC */
1711    
1712     DO J=1,sNy
1713     DO I=1,sNx
1714 torge 1.12 #ifdef SEAICE_ITD
1715     C HEFF will be updated at the end of PART 3,
1716     C hence sum of tendencies so far is needed
1717 torge 1.14 tmpscal4 = HEFFpreTH(I,J)
1718 torge 1.13 & + d_HEFFbySublim(I,J)
1719 torge 1.12 & + d_HEFFbyOCNonICE(I,J)
1720     & + d_HEFFbyATMonOCN(I,J)
1721     #else
1722     C HEFF is updated step by step throughout seaice_growth
1723 torge 1.14 tmpscal4 = HEFF(I,J,bi,bj)
1724 torge 1.12 #endif
1725 torge 1.10 C Initial ice growth is triggered by open water
1726     C heat flux overcoming potential melt by ocean
1727 dimitri 1.1 tmpscal1=r_QbyATM_open(I,J)+r_QbyOCN(i,j) *
1728     & (1.0 _d 0 - AREApreTH(I,J))
1729 torge 1.10 C Penetrative shortwave flux beyond first layer
1730     C that is therefore not available to ice growth/melt
1731 dimitri 1.1 tmpscal2=SWFracB * a_QSWbyATM_open(I,J)
1732     C impose -HEFF as the maxmum melting if SEAICE_doOpenWaterMelt
1733     C or 0. otherwise (no melting if not SEAICE_doOpenWaterMelt)
1734     tmpscal3=facOpenGrow*MAX(tmpscal1-tmpscal2,
1735 torge 1.12 & -tmpscal4*facOpenMelt)*HEFFM(I,J,bi,bj)
1736     #ifdef SEAICE_ITD
1737     C ice growth in open water adds to first category
1738     d_HEFFbyATMonOCN_open_ITD(I,J,1)=tmpscal3
1739     d_HEFFbyATMonOCN_ITD(I,J,1) =d_HEFFbyATMonOCN_ITD(I,J,1)
1740     & +tmpscal3
1741     #endif
1742 dimitri 1.1 d_HEFFbyATMonOCN_open(I,J)=tmpscal3
1743     d_HEFFbyATMonOCN(I,J)=d_HEFFbyATMonOCN(I,J)+tmpscal3
1744     r_QbyATM_open(I,J)=r_QbyATM_open(I,J)-tmpscal3
1745 torge 1.3 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) + tmpscal3
1746 dimitri 1.1 ENDDO
1747     ENDDO
1748    
1749     #ifdef ALLOW_SITRACER
1750     DO J=1,sNy
1751     DO I=1,sNx
1752 torge 1.10 C needs to be here to allow use also with LEGACY branch
1753 torge 1.12 #ifdef SEAICE_ITD
1754     SItrHEFF(I,J,bi,bj,4)=SItrHEFF(I,J,bi,bj,3)
1755     & +d_HEFFbyATMonOCN_open(I,J)
1756     #else
1757 dimitri 1.1 SItrHEFF(I,J,bi,bj,4)=HEFF(I,J,bi,bj)
1758 torge 1.12 #endif
1759 dimitri 1.1 ENDDO
1760     ENDDO
1761     #endif /* ALLOW_SITRACER */
1762    
1763     C convert snow to ice if submerged.
1764     C =================================
1765    
1766     C note: in legacy, this process is done at the end
1767     #ifdef ALLOW_AUTODIFF_TAMC
1768     CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1769     CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1770     #endif /* ALLOW_AUTODIFF_TAMC */
1771     IF ( SEAICEuseFlooding ) THEN
1772 dimitri 1.2 #ifdef SEAICE_ITD
1773 torge 1.14 DO IT=1,nITD
1774 dimitri 1.2 DO J=1,sNy
1775     DO I=1,sNx
1776 torge 1.14 tmpscal3 = HEFFITDpreTH(I,J,IT)
1777 torge 1.13 & + d_HEFFbySublim_ITD(I,J,IT)
1778 torge 1.12 & + d_HEFFbyOCNonICE_ITD(I,J,IT)
1779     & + d_HEFFbyATMonOCN_ITD(I,J,IT)
1780 torge 1.14 tmpscal4 = HSNWITDpreTH(I,J,IT)
1781 torge 1.13 & + d_HSNWbySublim_ITD(I,J,IT)
1782 torge 1.12 & + d_HSNWbyATMonSNW_ITD(I,J,IT)
1783     & + d_HSNWbyRAIN_ITD(I,J,IT)
1784     tmpscal0 = (tmpscal4*SEAICE_rhoSnow
1785     & + tmpscal3*SEAICE_rhoIce)
1786     & * recip_rhoConst
1787     tmpscal1 = MAX( 0. _d 0, tmpscal0 - tmpscal3)
1788     d_HEFFbyFLOODING_ITD(I,J,IT) = tmpscal1
1789 torge 1.5 d_HEFFbyFLOODING(I,J) = d_HEFFbyFLOODING(I,J) + tmpscal1
1790 torge 1.14 ENDDO
1791     ENDDO
1792     ENDDO
1793 dimitri 1.2 #else
1794 dimitri 1.1 DO J=1,sNy
1795     DO I=1,sNx
1796     tmpscal0 = (HSNOW(I,J,bi,bj)*SEAICE_rhoSnow
1797     & +HEFF(I,J,bi,bj)*SEAICE_rhoIce)*recip_rhoConst
1798     tmpscal1 = MAX( 0. _d 0, tmpscal0 - HEFF(I,J,bi,bj))
1799     d_HEFFbyFLOODING(I,J)=tmpscal1
1800 torge 1.3 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj)+d_HEFFbyFLOODING(I,J)
1801     HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)-
1802     & d_HEFFbyFLOODING(I,J)*ICE2SNOW
1803 torge 1.10 ENDDO
1804     ENDDO
1805 dimitri 1.2 #endif
1806 dimitri 1.1 ENDIF
1807 torge 1.16
1808 torge 1.12 #ifdef SEAICE_ITD
1809     C apply ice and snow thickness changes
1810     C =================================================================
1811 torge 1.14 DO IT=1,nITD
1812 torge 1.12 DO J=1,sNy
1813     DO I=1,sNx
1814 torge 1.14 HEFFITD(I,J,IT,bi,bj) = HEFFITD(I,J,IT,bi,bj)
1815 torge 1.13 & + d_HEFFbySublim_ITD(I,J,IT)
1816 torge 1.12 & + d_HEFFbyOCNonICE_ITD(I,J,IT)
1817     & + d_HEFFbyATMonOCN_ITD(I,J,IT)
1818     & + d_HEFFbyFLOODING_ITD(I,J,IT)
1819 torge 1.14 HSNOWITD(I,J,IT,bi,bj) = HSNOWITD(I,J,IT,bi,bj)
1820 torge 1.13 & + d_HSNWbySublim_ITD(I,J,IT)
1821 torge 1.12 & + d_HSNWbyATMonSNW_ITD(I,J,IT)
1822     & + d_HSNWbyRAIN_ITD(I,J,IT)
1823     & + d_HSNWbyOCNonSNW_ITD(I,J,IT)
1824     & - d_HEFFbyFLOODING_ITD(I,J,IT)
1825     & * ICE2SNOW
1826 torge 1.14 ENDDO
1827     ENDDO
1828     ENDDO
1829 torge 1.12 #endif
1830 dimitri 1.1
1831     C ===================================================================
1832     C ==========PART 4: determine ice cover fraction increments=========-
1833     C ===================================================================
1834    
1835     #ifdef ALLOW_AUTODIFF_TAMC
1836     CADJ STORE d_HEFFbyATMonOCN = comlev1_bibj,key=iicekey,byte=isbyte
1837     CADJ STORE d_HEFFbyATMonOCN_cover = comlev1_bibj,key=iicekey,byte=isbyte
1838     CADJ STORE d_HEFFbyATMonOCN_open = comlev1_bibj,key=iicekey,byte=isbyte
1839     CADJ STORE d_HEFFbyOCNonICE = comlev1_bibj,key=iicekey,byte=isbyte
1840     CADJ STORE recip_heffActual = comlev1_bibj,key=iicekey,byte=isbyte
1841     CADJ STORE d_hsnwbyatmonsnw = comlev1_bibj,key=iicekey,byte=isbyte
1842     cph(
1843     cphCADJ STORE d_AREAbyATM = comlev1_bibj,key=iicekey,byte=isbyte
1844     cphCADJ STORE d_AREAbyICE = comlev1_bibj,key=iicekey,byte=isbyte
1845     cphCADJ STORE d_AREAbyOCN = comlev1_bibj,key=iicekey,byte=isbyte
1846     cph)
1847     CADJ STORE a_QbyATM_open = comlev1_bibj,key=iicekey,byte=isbyte
1848     CADJ STORE heffActual = comlev1_bibj,key=iicekey,byte=isbyte
1849     CADJ STORE AREApreTH = comlev1_bibj,key=iicekey,byte=isbyte
1850     CADJ STORE HEFF(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1851     CADJ STORE HSNOW(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1852     CADJ STORE AREA(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1853     #endif /* ALLOW_AUTODIFF_TAMC */
1854    
1855 torge 1.9 #ifdef SEAICE_ITD
1856 torge 1.12 C-- account for lateral ice growth and melt only in thinnest category
1857 torge 1.14 C-- use HEFF, ARE, HSNOW, etc. temporarily for 1st category
1858 torge 1.12 C (this way we can use same code for ITD and non-ITD case)
1859     DO J=1,sNy
1860 torge 1.9 DO I=1,sNx
1861 torge 1.12 HEFF(I,J,bi,bj)=HEFFITD(I,J,1,bi,bj)
1862     AREA(I,J,bi,bj)=AREAITD(I,J,1,bi,bj)
1863     HSNOW(I,J,bi,bj)=HSNOWITD(I,J,1,bi,bj)
1864     HEFFpreTH(I,J)=HEFFITDpreTH(I,J,1)
1865     AREApreTH(I,J)=AREAITDpreTH(I,J,1)
1866     recip_heffActual(I,J)=recip_heffActualMult(I,J,1)
1867 torge 1.14 ENDDO
1868     ENDDO
1869     C all other categories only experience basal growth or melt,
1870 torge 1.12 C i.e. change sin AREA only occur when all ice in a category is melted
1871     IF (nITD .gt. 1) THEN
1872     DO IT=2,nITD
1873     DO J=1,sNy
1874     DO I=1,sNx
1875 torge 1.14 IF (HEFFITD(I,J,IT,bi,bj).LE.ZERO) THEN
1876     AREAITD(I,J,IT,bi,bj)=ZERO
1877 torge 1.17 ELSE
1878 torge 1.18 c actual ice thickness from previous time step
1879     c (actual ice thickness not to increase because of lateral melt!)
1880     tmpscal1=HEFFITDpreTH(I,J,IT)/AREAITDpreTH(I,J,IT)
1881 torge 1.17 c melt ice laterally based on an average floe sice
1882     c following Steele (1992)
1883     AREAITD(I,J,IT,bi,bj) = AREAITD(I,J,IT,bi,bj)
1884     & * (ONE - latMeltFrac(I,J,IT))
1885     AREAITD(I,J,IT,bi,bj) = max(ZERO,AREAITD(I,J,IT,bi,bj))
1886 torge 1.18 c limit area reduction so that actual ice thickness does not increase
1887     AREAITD(I,J,IT,bi,bj) = max(AREAITD(I,J,IT,bi,bj),
1888     & HEFFITD(I,J,IT,bi,bj)/tmpscal1)
1889 torge 1.14 ENDIF
1890     ENDDO
1891     ENDDO
1892     ENDDO
1893     ENDIF
1894 torge 1.12 #endif
1895 dimitri 1.1 DO J=1,sNy
1896     DO I=1,sNx
1897    
1898     IF ( YC(I,J,bi,bj) .LT. ZERO ) THEN
1899     recip_HO=1. _d 0 / HO_south
1900     ELSE
1901     recip_HO=1. _d 0 / HO
1902     ENDIF
1903 torge 1.16 recip_HH = recip_heffActual(I,J)
1904 dimitri 1.1
1905     C gain of ice over open water : computed from
1906     C (SEAICE_areaGainFormula.EQ.1) from growth by ATM
1907     C (SEAICE_areaGainFormula.EQ.2) from predicted growth by ATM
1908     IF (SEAICE_areaGainFormula.EQ.1) THEN
1909     tmpscal4 = MAX(ZERO,d_HEFFbyATMonOCN_open(I,J))
1910     ELSE
1911     tmpscal4=MAX(ZERO,a_QbyATM_open(I,J))
1912     ENDIF
1913    
1914     C loss of ice cover by melting : computed from
1915     C (SEAICE_areaLossFormula.EQ.1) from all but only melt conributions by ATM and OCN
1916     C (SEAICE_areaLossFormula.EQ.2) from net melt-growth>0 by ATM and OCN
1917     C (SEAICE_areaLossFormula.EQ.3) from predicted melt by ATM
1918     IF (SEAICE_areaLossFormula.EQ.1) THEN
1919     tmpscal3 = MIN( 0. _d 0 , d_HEFFbyATMonOCN_cover(I,J) )
1920     & + MIN( 0. _d 0 , d_HEFFbyATMonOCN_open(I,J) )
1921     & + MIN( 0. _d 0 , d_HEFFbyOCNonICE(I,J) )
1922     ELSEIF (SEAICE_areaLossFormula.EQ.2) THEN
1923     tmpscal3 = MIN( 0. _d 0 , d_HEFFbyATMonOCN_cover(I,J)
1924     & + d_HEFFbyATMonOCN_open(I,J) + d_HEFFbyOCNonICE(I,J) )
1925     ELSE
1926     C compute heff after ice melt by ocn:
1927     tmpscal0=HEFF(I,J,bi,bj) - d_HEFFbyATMonOCN(I,J)
1928     C compute available heat left after snow melt by atm:
1929     tmpscal1= a_QbyATM_open(I,J)+a_QbyATM_cover(I,J)
1930     & - d_HSNWbyATMonSNW(I,J)*SNOW2ICE
1931     C could not melt more than all the ice
1932     tmpscal2 = MAX(-tmpscal0,tmpscal1)
1933     tmpscal3 = MIN(ZERO,tmpscal2)
1934     ENDIF
1935    
1936     C apply tendency
1937     IF ( (HEFF(i,j,bi,bj).GT.0. _d 0).OR.
1938     & (HSNOW(i,j,bi,bj).GT.0. _d 0) ) THEN
1939     AREA(I,J,bi,bj)=MAX(0. _d 0,
1940     & MIN( SEAICE_area_max, AREA(I,J,bi,bj)
1941     & + recip_HO*tmpscal4+HALF*recip_HH*tmpscal3 ))
1942     ELSE
1943     AREA(I,J,bi,bj)=0. _d 0
1944     ENDIF
1945     #ifdef ALLOW_SITRACER
1946     SItrAREA(I,J,bi,bj,3)=AREA(I,J,bi,bj)
1947     #endif /* ALLOW_SITRACER */
1948     #ifdef ALLOW_DIAGNOSTICS
1949     d_AREAbyATM(I,J)=
1950     & recip_HO*MAX(ZERO,d_HEFFbyATMonOCN_open(I,J))
1951     & +HALF*recip_HH*MIN(0. _d 0,d_HEFFbyATMonOCN_open(I,J))
1952     d_AREAbyICE(I,J)=
1953     & HALF*recip_HH*MIN(0. _d 0,d_HEFFbyATMonOCN_cover(I,J))
1954     d_AREAbyOCN(I,J)=
1955     & HALF*recip_HH*MIN( 0. _d 0,d_HEFFbyOCNonICE(I,J) )
1956     #endif /* ALLOW_DIAGNOSTICS */
1957     ENDDO
1958     ENDDO
1959 torge 1.12 #ifdef SEAICE_ITD
1960     C transfer 1st category values back into ITD variables
1961     DO J=1,sNy
1962     DO I=1,sNx
1963     HEFFITD(I,J,1,bi,bj)=HEFF(I,J,bi,bj)
1964     AREAITD(I,J,1,bi,bj)=AREA(I,J,bi,bj)
1965     HSNOWITD(I,J,1,bi,bj)=HSNOW(I,J,bi,bj)
1966     ENDDO
1967     ENDDO
1968     #endif
1969 dimitri 1.1
1970     #if (defined ALLOW_AUTODIFF_TAMC && defined SEAICE_MODIFY_GROWTH_ADJ)
1971     Cgf 'bulk' linearization of area=f(HEFF)
1972     IF ( SEAICEadjMODE.GE.1 ) THEN
1973 dimitri 1.2 #ifdef SEAICE_ITD
1974 torge 1.14 DO IT=1,nITD
1975 dimitri 1.2 DO J=1,sNy
1976     DO I=1,sNx
1977 torge 1.5 AREAITD(I,J,IT,bi,bj) = AREAITDpreTH(I,J,IT) + 0.1 _d 0 *
1978     & ( HEFFITD(I,J,IT,bi,bj) - HEFFITDpreTH(I,J,IT) )
1979 dimitri 1.2 ENDDO
1980     ENDDO
1981     ENDDO
1982     #else
1983 dimitri 1.1 DO J=1,sNy
1984     DO I=1,sNx
1985     C AREA(I,J,bi,bj) = 0.1 _d 0 * HEFF(I,J,bi,bj)
1986     AREA(I,J,bi,bj) = AREApreTH(I,J) + 0.1 _d 0 *
1987     & ( HEFF(I,J,bi,bj) - HEFFpreTH(I,J) )
1988     ENDDO
1989     ENDDO
1990 dimitri 1.2 #endif
1991 dimitri 1.1 ENDIF
1992     #endif
1993 torge 1.3 #ifdef SEAICE_ITD
1994     C check categories for consistency with limits after growth/melt
1995     CALL SEAICE_ITD_REDIST(bi, bj, myTime,myIter,myThid)
1996     C finally update total AREA, HEFF, HSNOW
1997     CALL SEAICE_ITD_SUM(bi, bj, myTime,myIter,myThid)
1998     #endif
1999 dimitri 1.1
2000     C ===================================================================
2001     C =============PART 5: determine ice salinity increments=============
2002     C ===================================================================
2003    
2004     #ifndef SEAICE_VARIABLE_SALINITY
2005     # if (defined ALLOW_AUTODIFF_TAMC && defined ALLOW_SALT_PLUME)
2006     CADJ STORE d_HEFFbyNEG = comlev1_bibj,key=iicekey,byte=isbyte
2007     CADJ STORE d_HEFFbyOCNonICE = comlev1_bibj,key=iicekey,byte=isbyte
2008     CADJ STORE d_HEFFbyATMonOCN = comlev1_bibj,key=iicekey,byte=isbyte
2009     CADJ STORE d_HEFFbyATMonOCN_open = comlev1_bibj,key=iicekey,byte=isbyte
2010     CADJ STORE d_HEFFbyATMonOCN_cover = comlev1_bibj,key=iicekey,byte=isbyte
2011     CADJ STORE d_HEFFbyFLOODING = comlev1_bibj,key=iicekey,byte=isbyte
2012     CADJ STORE d_HEFFbySublim = comlev1_bibj,key=iicekey,byte=isbyte
2013     CADJ STORE salt(:,:,kSurface,bi,bj) = comlev1_bibj,
2014     CADJ & key = iicekey, byte = isbyte
2015     # endif /* ALLOW_AUTODIFF_TAMC and ALLOW_SALT_PLUME */
2016     DO J=1,sNy
2017     DO I=1,sNx
2018     tmpscal1 = d_HEFFbyNEG(I,J) + d_HEFFbyOCNonICE(I,J) +
2019     & d_HEFFbyATMonOCN(I,J) + d_HEFFbyFLOODING(I,J)
2020     & + d_HEFFbySublim(I,J)
2021 torge 1.10 #ifdef EXF_ALLOW_SEAICE_RELAX
2022     & + d_HEFFbyRLX(I,J)
2023 dimitri 1.1 #endif
2024     tmpscal2 = tmpscal1 * SEAICE_salt0 * HEFFM(I,J,bi,bj)
2025     & * recip_deltaTtherm * SEAICE_rhoIce
2026     saltFlux(I,J,bi,bj) = tmpscal2
2027     #ifdef ALLOW_SALT_PLUME
2028     tmpscal3 = tmpscal1*salt(I,J,kSurface,bi,bj)*HEFFM(I,J,bi,bj)
2029     & * recip_deltaTtherm * SEAICE_rhoIce
2030     saltPlumeFlux(I,J,bi,bj) = MAX( tmpscal3-tmpscal2 , 0. _d 0)
2031     & *SPsalFRAC
2032     #endif /* ALLOW_SALT_PLUME */
2033     ENDDO
2034     ENDDO
2035     #endif /* ndef SEAICE_VARIABLE_SALINITY */
2036    
2037     #ifdef SEAICE_VARIABLE_SALINITY
2038    
2039     #ifdef ALLOW_AUTODIFF_TAMC
2040     CADJ STORE hsalt(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
2041     #endif /* ALLOW_AUTODIFF_TAMC */
2042    
2043     DO J=1,sNy
2044     DO I=1,sNx
2045     C sum up the terms that affect the salt content of the ice pack
2046     tmpscal1=d_HEFFbyOCNonICE(I,J)+d_HEFFbyATMonOCN(I,J)
2047    
2048     C recompute HEFF before thermodynamic updates (which is not AREApreTH in legacy code)
2049     tmpscal2=HEFF(I,J,bi,bj)-tmpscal1-d_HEFFbyFLOODING(I,J)
2050     C tmpscal1 > 0 : m of sea ice that is created
2051     IF ( tmpscal1 .GE. 0.0 ) THEN
2052     saltFlux(I,J,bi,bj) =
2053     & HEFFM(I,J,bi,bj)*recip_deltaTtherm
2054     & *SEAICE_saltFrac*salt(I,J,kSurface,bi,bj)
2055     & *tmpscal1*SEAICE_rhoIce
2056     #ifdef ALLOW_SALT_PLUME
2057     C saltPlumeFlux is defined only during freezing:
2058     saltPlumeFlux(I,J,bi,bj)=
2059     & HEFFM(I,J,bi,bj)*recip_deltaTtherm
2060     & *(ONE-SEAICE_saltFrac)*salt(I,J,kSurface,bi,bj)
2061     & *tmpscal1*SEAICE_rhoIce
2062     & *SPsalFRAC
2063     C if SaltPlumeSouthernOcean=.FALSE. turn off salt plume in Southern Ocean
2064     IF ( .NOT. SaltPlumeSouthernOcean ) THEN
2065     IF ( YC(I,J,bi,bj) .LT. 0.0 _d 0 )
2066     & saltPlumeFlux(i,j,bi,bj) = 0.0 _d 0
2067     ENDIF
2068     #endif /* ALLOW_SALT_PLUME */
2069    
2070     C tmpscal1 < 0 : m of sea ice that is melted
2071     ELSE
2072     saltFlux(I,J,bi,bj) =
2073     & HEFFM(I,J,bi,bj)*recip_deltaTtherm
2074     & *HSALT(I,J,bi,bj)
2075     & *tmpscal1/tmpscal2
2076     #ifdef ALLOW_SALT_PLUME
2077     saltPlumeFlux(i,j,bi,bj) = 0.0 _d 0
2078     #endif /* ALLOW_SALT_PLUME */
2079     ENDIF
2080     C update HSALT based on surface saltFlux
2081     HSALT(I,J,bi,bj) = HSALT(I,J,bi,bj) +
2082     & saltFlux(I,J,bi,bj) * SEAICE_deltaTtherm
2083     saltFlux(I,J,bi,bj) =
2084     & saltFlux(I,J,bi,bj) + saltFluxAdjust(I,J)
2085     ENDDO
2086     ENDDO
2087     #endif /* SEAICE_VARIABLE_SALINITY */
2088    
2089     #ifdef ALLOW_SITRACER
2090     DO J=1,sNy
2091     DO I=1,sNx
2092 torge 1.10 C needs to be here to allow use also with LEGACY branch
2093 dimitri 1.1 SItrHEFF(I,J,bi,bj,5)=HEFF(I,J,bi,bj)
2094     ENDDO
2095     ENDDO
2096     #endif /* ALLOW_SITRACER */
2097    
2098     C ===================================================================
2099     C ==============PART 7: determine ocean model forcing================
2100     C ===================================================================
2101    
2102     C compute net heat flux leaving/entering the ocean,
2103     C accounting for the part used in melt/freeze processes
2104     C =====================================================
2105    
2106 torge 1.8 #ifdef SEAICE_ITD
2107     C compute total of "mult" fluxes for ocean forcing
2108     DO J=1,sNy
2109     DO I=1,sNx
2110     a_QbyATM_cover(I,J) = 0.0 _d 0
2111     r_QbyATM_cover(I,J) = 0.0 _d 0
2112     a_QSWbyATM_cover(I,J) = 0.0 _d 0
2113     r_FWbySublim(I,J) = 0.0 _d 0
2114     ENDDO
2115     ENDDO
2116     DO IT=1,nITD
2117     DO J=1,sNy
2118     DO I=1,sNx
2119 torge 1.19 C if fluxes in W/m^2 then use:
2120 torge 1.14 c a_QbyATM_cover(I,J)=a_QbyATM_cover(I,J)
2121 torge 1.8 c & + a_QbyATMmult_cover(I,J,IT) * areaFracFactor(I,J,IT)
2122 torge 1.14 c r_QbyATM_cover(I,J)=r_QbyATM_cover(I,J)
2123 torge 1.8 c & + r_QbyATMmult_cover(I,J,IT) * areaFracFactor(I,J,IT)
2124 torge 1.14 c a_QSWbyATM_cover(I,J)=a_QSWbyATM_cover(I,J)
2125 torge 1.8 c & + a_QSWbyATMmult_cover(I,J,IT) * areaFracFactor(I,J,IT)
2126 torge 1.14 c r_FWbySublim(I,J)=r_FWbySublim(I,J)
2127 torge 1.8 c & + r_FWbySublimMult(I,J,IT) * areaFracFactor(I,J,IT)
2128 torge 1.19 C if fluxes in effective ice meters, i.e. ice volume per area, then use:
2129 torge 1.14 a_QbyATM_cover(I,J)=a_QbyATM_cover(I,J)
2130 torge 1.8 & + a_QbyATMmult_cover(I,J,IT)
2131 torge 1.14 r_QbyATM_cover(I,J)=r_QbyATM_cover(I,J)
2132 torge 1.8 & + r_QbyATMmult_cover(I,J,IT)
2133 torge 1.14 a_QSWbyATM_cover(I,J)=a_QSWbyATM_cover(I,J)
2134 torge 1.8 & + a_QSWbyATMmult_cover(I,J,IT)
2135 torge 1.14 r_FWbySublim(I,J)=r_FWbySublim(I,J)
2136 torge 1.8 & + r_FWbySublimMult(I,J,IT)
2137     ENDDO
2138     ENDDO
2139     ENDDO
2140     #endif
2141    
2142 dimitri 1.1 #ifdef ALLOW_AUTODIFF_TAMC
2143     CADJ STORE d_hsnwbyneg = comlev1_bibj,key=iicekey,byte=isbyte
2144     CADJ STORE d_hsnwbyocnonsnw = comlev1_bibj,key=iicekey,byte=isbyte
2145     #endif /* ALLOW_AUTODIFF_TAMC */
2146    
2147     DO J=1,sNy
2148     DO I=1,sNx
2149     QNET(I,J,bi,bj) = r_QbyATM_cover(I,J) + r_QbyATM_open(I,J)
2150     & + a_QSWbyATM_cover(I,J)
2151 torge 1.10 & - ( d_HEFFbyOCNonICE(I,J)
2152     & + d_HSNWbyOCNonSNW(I,J)*SNOW2ICE
2153     & + d_HEFFbyNEG(I,J)
2154     #ifdef EXF_ALLOW_SEAICE_RELAX
2155     & + d_HEFFbyRLX(I,J)
2156     #endif
2157     & + d_HSNWbyNEG(I,J)*SNOW2ICE
2158     & - convertPRECIP2HI *
2159     & snowPrecip(i,j,bi,bj) * (ONE-AREApreTH(I,J))
2160     & ) * maskC(I,J,kSurface,bi,bj)
2161     ENDDO
2162     ENDDO
2163     DO J=1,sNy
2164     DO I=1,sNx
2165 dimitri 1.1 QSW(I,J,bi,bj) = a_QSWbyATM_cover(I,J) + a_QSWbyATM_open(I,J)
2166     ENDDO
2167     ENDDO
2168    
2169     C switch heat fluxes from 'effective' ice meters to W/m2
2170     C ======================================================
2171    
2172     DO J=1,sNy
2173     DO I=1,sNx
2174     QNET(I,J,bi,bj) = QNET(I,J,bi,bj)*convertHI2Q
2175     QSW(I,J,bi,bj) = QSW(I,J,bi,bj)*convertHI2Q
2176     ENDDO
2177     ENDDO
2178    
2179     #ifndef SEAICE_DISABLE_HEATCONSFIX
2180     C treat advective heat flux by ocean to ice water exchange (at 0decC)
2181     C ===================================================================
2182     # ifdef ALLOW_AUTODIFF_TAMC
2183     CADJ STORE d_HEFFbyNEG = comlev1_bibj,key=iicekey,byte=isbyte
2184     CADJ STORE d_HEFFbyOCNonICE = comlev1_bibj,key=iicekey,byte=isbyte
2185     CADJ STORE d_HEFFbyATMonOCN = comlev1_bibj,key=iicekey,byte=isbyte
2186     CADJ STORE d_HSNWbyNEG = comlev1_bibj,key=iicekey,byte=isbyte
2187     CADJ STORE d_HSNWbyOCNonSNW = comlev1_bibj,key=iicekey,byte=isbyte
2188     CADJ STORE d_HSNWbyATMonSNW = comlev1_bibj,key=iicekey,byte=isbyte
2189     CADJ STORE theta(:,:,kSurface,bi,bj) = comlev1_bibj,
2190     CADJ & key = iicekey, byte = isbyte
2191     # endif /* ALLOW_AUTODIFF_TAMC */
2192 torge 1.10 cgf Unlike for evap and precip, the temperature of gained/lost
2193     C ocean liquid water due to melt/freeze of solid water cannot be chosen
2194 torge 1.14 C arbitrarily to be e.g. the ocean SST. Indeed the present seaice model
2195     C implies a constant ice temperature of 0degC. If melt/freeze water is exchanged
2196     C at a different temperature, it leads to a loss of conservation in the
2197     C ocean+ice system. While this is mostly a serious issue in the
2198 torge 1.10 C real fresh water + non linear free surface framework, a mismatch
2199     C between ice and ocean boundary condition can result in all cases.
2200 torge 1.14 C Below we therefore anticipate on external_forcing_surf.F
2201 torge 1.10 C to diagnoze and/or apply the correction to QNET.
2202 dimitri 1.1 DO J=1,sNy
2203     DO I=1,sNx
2204 torge 1.10 C ocean water going to ice/snow, in precip units
2205     tmpscal3=rhoConstFresh*maskC(I,J,kSurface,bi,bj)*(
2206 dimitri 1.1 & ( d_HSNWbyATMonSNW(I,J)*SNOW2ICE
2207     & + d_HSNWbyOCNonSNW(I,J)*SNOW2ICE
2208     & + d_HEFFbyOCNonICE(I,J) + d_HEFFbyATMonOCN(I,J)
2209     & + d_HEFFbyNEG(I,J) + d_HSNWbyNEG(I,J)*SNOW2ICE )
2210     & * convertHI2PRECIP
2211 torge 1.10 & - snowPrecip(i,j,bi,bj) * (ONE-AREApreTH(I,J)) )
2212     C factor in the heat content as done in external_forcing_surf.F
2213     IF ( (temp_EvPrRn.NE.UNSET_RL).AND.useRealFreshWaterFlux
2214     & .AND.(nonlinFreeSurf.NE.0) ) THEN
2215     tmpscal1 = - tmpscal3*
2216 dimitri 1.1 & HeatCapacity_Cp * temp_EvPrRn
2217 torge 1.10 ELSEIF ( (temp_EvPrRn.EQ.UNSET_RL).AND.useRealFreshWaterFlux
2218     & .AND.(nonlinFreeSurf.NE.0) ) THEN
2219     tmpscal1 = - tmpscal3*
2220 dimitri 1.1 & HeatCapacity_Cp * theta(I,J,kSurface,bi,bj)
2221 torge 1.10 ELSEIF ( (temp_EvPrRn.NE.UNSET_RL) ) THEN
2222     tmpscal1 = - tmpscal3*HeatCapacity_Cp*
2223     & ( temp_EvPrRn - theta(I,J,kSurface,bi,bj) )
2224     ELSEIF ( (temp_EvPrRn.EQ.UNSET_RL) ) THEN
2225     tmpscal1 = ZERO
2226     ENDIF
2227 dimitri 1.1 #ifdef ALLOW_DIAGNOSTICS
2228 torge 1.10 C in all cases, diagnoze the boundary condition mismatch to SIaaflux
2229     DIAGarrayA(I,J)=tmpscal1
2230 dimitri 1.1 #endif
2231 torge 1.10 C remove the mismatch when real fresh water is exchanged (at 0degC here)
2232     IF ( useRealFreshWaterFlux.AND.(nonlinFreeSurf.GT.0).AND.
2233     & SEAICEheatConsFix ) QNET(I,J,bi,bj)=QNET(I,J,bi,bj)+tmpscal1
2234 dimitri 1.1 ENDDO
2235     ENDDO
2236     #ifdef ALLOW_DIAGNOSTICS
2237     CALL DIAGNOSTICS_FILL(DIAGarrayA,
2238     & 'SIaaflux',0,1,3,bi,bj,myThid)
2239     #endif
2240 torge 1.10 #endif /* ndef SEAICE_DISABLE_HEATCONSFIX */
2241    
2242     C compute the net heat flux, incl. adv. by water, entering ocean+ice
2243     C ===================================================================
2244     DO J=1,sNy
2245     DO I=1,sNx
2246     cgf 1) SIatmQnt (analogous to qnet; excl. adv. by water exch.)
2247     CML If I consider the atmosphere above the ice, the surface flux
2248     CML which is relevant for the air temperature dT/dt Eq
2249     CML accounts for sensible and radiation (with different treatment
2250     CML according to wave-length) fluxes but not for "latent heat flux",
2251     CML since it does not contribute to heating the air.
2252     CML So this diagnostic is only good for heat budget calculations within
2253     CML the ice-ocean system.
2254 torge 1.14 SIatmQnt(I,J,bi,bj) =
2255 torge 1.10 & maskC(I,J,kSurface,bi,bj)*convertHI2Q*(
2256     & a_QSWbyATM_cover(I,J) +
2257     & a_QbyATM_cover(I,J) + a_QbyATM_open(I,J) )
2258 torge 1.14 cgf 2) SItflux (analogous to tflux; includes advection by water
2259 torge 1.10 C exchanged between atmosphere and ocean+ice)
2260     C solid water going to atm, in precip units
2261     tmpscal1 = rhoConstFresh*maskC(I,J,kSurface,bi,bj)
2262     & * convertHI2PRECIP * ( - d_HSNWbyRAIN(I,J)*SNOW2ICE
2263     & + a_FWbySublim(I,J) - r_FWbySublim(I,J) )
2264     C liquid water going to atm, in precip units
2265     tmpscal2=rhoConstFresh*maskC(I,J,kSurface,bi,bj)*
2266     & ( ( EVAP(I,J,bi,bj)-PRECIP(I,J,bi,bj) )
2267     & * ( ONE - AREApreTH(I,J) )
2268     #ifdef ALLOW_RUNOFF
2269     & - RUNOFF(I,J,bi,bj)
2270     #endif /* ALLOW_RUNOFF */
2271     & + ( d_HFRWbyRAIN(I,J) + r_FWbySublim(I,J) )
2272     & *convertHI2PRECIP )
2273     C In real fresh water flux + nonlinFS, we factor in the advected specific
2274     C energy (referenced to 0 for 0deC liquid water). In virtual salt flux or
2275     C linFS, rain/evap get a special treatment (see external_forcing_surf.F).
2276     tmpscal1= - tmpscal1*
2277     & ( -SEAICE_lhFusion + HeatCapacity_Cp * ZERO )
2278     IF ( (temp_EvPrRn.NE.UNSET_RL).AND.useRealFreshWaterFlux
2279     & .AND.(nonlinFreeSurf.NE.0) ) THEN
2280     tmpscal2= - tmpscal2*
2281     & ( ZERO + HeatCapacity_Cp * temp_EvPrRn )
2282     ELSEIF ( (temp_EvPrRn.EQ.UNSET_RL).AND.useRealFreshWaterFlux
2283     & .AND.(nonlinFreeSurf.NE.0) ) THEN
2284     tmpscal2= - tmpscal2*
2285     & ( ZERO + HeatCapacity_Cp * theta(I,J,kSurface,bi,bj) )
2286     ELSEIF ( (temp_EvPrRn.NE.UNSET_RL) ) THEN
2287     tmpscal2= - tmpscal2*HeatCapacity_Cp*
2288     & ( temp_EvPrRn - theta(I,J,kSurface,bi,bj) )
2289     ELSEIF ( (temp_EvPrRn.EQ.UNSET_RL) ) THEN
2290     tmpscal2= ZERO
2291 dimitri 1.1 ENDIF
2292 torge 1.10 SItflux(I,J,bi,bj)=
2293 torge 1.14 & SIatmQnt(I,J,bi,bj)-tmpscal1-tmpscal2
2294 torge 1.10 ENDDO
2295     ENDDO
2296 dimitri 1.1
2297     C compute net fresh water flux leaving/entering
2298     C the ocean, accounting for fresh/salt water stocks.
2299     C ==================================================
2300    
2301     #ifdef ALLOW_ATM_TEMP
2302     DO J=1,sNy
2303     DO I=1,sNx
2304     tmpscal1= d_HSNWbyATMonSNW(I,J)*SNOW2ICE
2305     & +d_HFRWbyRAIN(I,J)
2306     & +d_HSNWbyOCNonSNW(I,J)*SNOW2ICE
2307     & +d_HEFFbyOCNonICE(I,J)
2308     & +d_HEFFbyATMonOCN(I,J)
2309     & +d_HEFFbyNEG(I,J)
2310 torge 1.10 #ifdef EXF_ALLOW_SEAICE_RELAX
2311 dimitri 1.1 & +d_HEFFbyRLX(I,J)
2312     #endif
2313     & +d_HSNWbyNEG(I,J)*SNOW2ICE
2314     C If r_FWbySublim>0, then it is evaporated from ocean.
2315     & +r_FWbySublim(I,J)
2316     EmPmR(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*(
2317     & ( EVAP(I,J,bi,bj)-PRECIP(I,J,bi,bj) )
2318     & * ( ONE - AREApreTH(I,J) )
2319     #ifdef ALLOW_RUNOFF
2320     & - RUNOFF(I,J,bi,bj)
2321     #endif /* ALLOW_RUNOFF */
2322     & + tmpscal1*convertHI2PRECIP
2323     & )*rhoConstFresh
2324 torge 1.10 c and the flux leaving/entering the ocean+ice
2325     SIatmFW(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*(
2326     & EVAP(I,J,bi,bj)*( ONE - AREApreTH(I,J) )
2327     & - PRECIP(I,J,bi,bj)
2328     #ifdef ALLOW_RUNOFF
2329     & - RUNOFF(I,J,bi,bj)
2330     #endif /* ALLOW_RUNOFF */
2331     & )*rhoConstFresh
2332     & + a_FWbySublim(I,J) * SEAICE_rhoIce * recip_deltaTtherm
2333    
2334 dimitri 1.1 ENDDO
2335 torge 1.14 ENDDO
2336 dimitri 1.1
2337     #ifdef ALLOW_SSH_GLOBMEAN_COST_CONTRIBUTION
2338     C--
2339     DO J=1,sNy
2340     DO I=1,sNx
2341     frWtrAtm(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*(
2342     & PRECIP(I,J,bi,bj)
2343     & - EVAP(I,J,bi,bj)*( ONE - AREApreTH(I,J) )
2344     # ifdef ALLOW_RUNOFF
2345     & + RUNOFF(I,J,bi,bj)
2346     # endif /* ALLOW_RUNOFF */
2347     & )*rhoConstFresh
2348     # ifdef SEAICE_ADD_SUBLIMATION_TO_FWBUDGET
2349     & - a_FWbySublim(I,J)*AREApreTH(I,J)
2350     # endif /* SEAICE_ADD_SUBLIMATION_TO_FWBUDGET */
2351     ENDDO
2352     ENDDO
2353     C--
2354     #else /* ndef ALLOW_SSH_GLOBMEAN_COST_CONTRIBUTION */
2355     C--
2356     # ifdef ALLOW_MEAN_SFLUX_COST_CONTRIBUTION
2357     DO J=1,sNy
2358     DO I=1,sNx
2359     frWtrAtm(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*(
2360     & PRECIP(I,J,bi,bj)
2361     & - EVAP(I,J,bi,bj)
2362     & *( ONE - AREApreTH(I,J) )
2363     # ifdef ALLOW_RUNOFF
2364     & + RUNOFF(I,J,bi,bj)
2365     # endif /* ALLOW_RUNOFF */
2366     & )*rhoConstFresh
2367     & - a_FWbySublim(I,J) * SEAICE_rhoIce * recip_deltaTtherm
2368     ENDDO
2369     ENDDO
2370     # endif
2371     C--
2372     #endif /* ALLOW_SSH_GLOBMEAN_COST_CONTRIBUTION */
2373    
2374     #endif /* ALLOW_ATM_TEMP */
2375    
2376     #ifdef SEAICE_DEBUG
2377     CALL PLOT_FIELD_XYRL( QSW,'Current QSW ', myIter, myThid )
2378     CALL PLOT_FIELD_XYRL( QNET,'Current QNET ', myIter, myThid )
2379     CALL PLOT_FIELD_XYRL( EmPmR,'Current EmPmR ', myIter, myThid )
2380     #endif /* SEAICE_DEBUG */
2381    
2382     C Sea Ice Load on the sea surface.
2383     C =================================
2384    
2385     #ifdef ALLOW_AUTODIFF_TAMC
2386     CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
2387     CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
2388     #endif /* ALLOW_AUTODIFF_TAMC */
2389    
2390     IF ( useRealFreshWaterFlux ) THEN
2391     DO J=1,sNy
2392     DO I=1,sNx
2393     #ifdef SEAICE_CAP_ICELOAD
2394     tmpscal1 = HEFF(I,J,bi,bj)*SEAICE_rhoIce
2395     & + HSNOW(I,J,bi,bj)*SEAICE_rhoSnow
2396     tmpscal2 = MIN(tmpscal1,heffTooHeavy*rhoConst)
2397     #else
2398     tmpscal2 = HEFF(I,J,bi,bj)*SEAICE_rhoIce
2399     & + HSNOW(I,J,bi,bj)*SEAICE_rhoSnow
2400     #endif
2401     sIceLoad(i,j,bi,bj) = tmpscal2
2402     ENDDO
2403     ENDDO
2404     ENDIF
2405    
2406 torge 1.10 #ifdef ALLOW_BALANCE_FLUXES
2407     C Compute tile integrals of heat/fresh water fluxes to/from atm.
2408     C ==============================================================
2409     FWFsiTile(bi,bj) = 0. _d 0
2410     IF ( balanceEmPmR ) THEN
2411     DO j=1,sNy
2412     DO i=1,sNx
2413 torge 1.14 FWFsiTile(bi,bj) =
2414 torge 1.10 & FWFsiTile(bi,bj) + SIatmFW(i,j,bi,bj)
2415     & * rA(i,j,bi,bj) * maskInC(i,j,bi,bj)
2416     ENDDO
2417     ENDDO
2418     ENDIF
2419     c to translate global mean FWF adjustements (see below) we may need :
2420 torge 1.14 FWF2HFsiTile(bi,bj) = 0. _d 0
2421 torge 1.10 IF ( balanceEmPmR.AND.(temp_EvPrRn.EQ.UNSET_RL) ) THEN
2422     DO j=1,sNy
2423     DO i=1,sNx
2424     FWF2HFsiTile(bi,bj) = FWF2HFsiTile(bi,bj) +
2425     & HeatCapacity_Cp * theta(I,J,kSurface,bi,bj)
2426     & * rA(i,j,bi,bj) * maskInC(i,j,bi,bj)
2427     ENDDO
2428     ENDDO
2429     ENDIF
2430     HFsiTile(bi,bj) = 0. _d 0
2431     IF ( balanceQnet ) THEN
2432     DO j=1,sNy
2433     DO i=1,sNx
2434 torge 1.14 HFsiTile(bi,bj) =
2435 torge 1.10 & HFsiTile(bi,bj) + SItflux(i,j,bi,bj)
2436     & * rA(i,j,bi,bj) * maskInC(i,j,bi,bj)
2437     ENDDO
2438     ENDDO
2439     ENDIF
2440     #endif
2441    
2442 dimitri 1.1 C ===================================================================
2443     C ======================PART 8: diagnostics==========================
2444     C ===================================================================
2445    
2446     #ifdef ALLOW_DIAGNOSTICS
2447     IF ( useDiagnostics ) THEN
2448     tmpscal1=1. _d 0 * recip_deltaTtherm
2449     CALL DIAGNOSTICS_SCALE_FILL(a_QbyATM_cover,
2450     & tmpscal1,1,'SIaQbATC',0,1,3,bi,bj,myThid)
2451     CALL DIAGNOSTICS_SCALE_FILL(a_QbyATM_open,
2452     & tmpscal1,1,'SIaQbATO',0,1,3,bi,bj,myThid)
2453     CALL DIAGNOSTICS_SCALE_FILL(a_QbyOCN,
2454     & tmpscal1,1,'SIaQbOCN',0,1,3,bi,bj,myThid)
2455     CALL DIAGNOSTICS_SCALE_FILL(d_HEFFbyOCNonICE,
2456     & tmpscal1,1,'SIdHbOCN',0,1,3,bi,bj,myThid)
2457     CALL DIAGNOSTICS_SCALE_FILL(d_HEFFbyATMonOCN_cover,
2458     & tmpscal1,1,'SIdHbATC',0,1,3,bi,bj,myThid)
2459     CALL DIAGNOSTICS_SCALE_FILL(d_HEFFbyATMonOCN_open,
2460     & tmpscal1,1,'SIdHbATO',0,1,3,bi,bj,myThid)
2461     CALL DIAGNOSTICS_SCALE_FILL(d_HEFFbyFLOODING,
2462     & tmpscal1,1,'SIdHbFLO',0,1,3,bi,bj,myThid)
2463     CALL DIAGNOSTICS_SCALE_FILL(d_HSNWbyOCNonSNW,
2464     & tmpscal1,1,'SIdSbOCN',0,1,3,bi,bj,myThid)
2465     CALL DIAGNOSTICS_SCALE_FILL(d_HSNWbyATMonSNW,
2466     & tmpscal1,1,'SIdSbATC',0,1,3,bi,bj,myThid)
2467     CALL DIAGNOSTICS_SCALE_FILL(d_AREAbyATM,
2468     & tmpscal1,1,'SIdAbATO',0,1,3,bi,bj,myThid)
2469     CALL DIAGNOSTICS_SCALE_FILL(d_AREAbyICE,
2470     & tmpscal1,1,'SIdAbATC',0,1,3,bi,bj,myThid)
2471     CALL DIAGNOSTICS_SCALE_FILL(d_AREAbyOCN,
2472     & tmpscal1,1,'SIdAbOCN',0,1,3,bi,bj,myThid)
2473     CALL DIAGNOSTICS_SCALE_FILL(r_QbyATM_open,
2474     & convertHI2Q,1, 'SIqneto ',0,1,3,bi,bj,myThid)
2475     CALL DIAGNOSTICS_SCALE_FILL(r_QbyATM_cover,
2476     & convertHI2Q,1, 'SIqneti ',0,1,3,bi,bj,myThid)
2477     C three that actually need intermediate storage
2478     DO J=1,sNy
2479     DO I=1,sNx
2480     DIAGarrayA(I,J) = maskC(I,J,kSurface,bi,bj)
2481     & * d_HSNWbyRAIN(I,J)*SEAICE_rhoSnow*recip_deltaTtherm
2482     DIAGarrayB(I,J) = AREA(I,J,bi,bj)-AREApreTH(I,J)
2483     ENDDO
2484     ENDDO
2485     CALL DIAGNOSTICS_FILL(DIAGarrayA,
2486     & 'SIsnPrcp',0,1,3,bi,bj,myThid)
2487     CALL DIAGNOSTICS_SCALE_FILL(DIAGarrayB,
2488     & tmpscal1,1,'SIdA ',0,1,3,bi,bj,myThid)
2489     #ifdef ALLOW_ATM_TEMP
2490     DO J=1,sNy
2491     DO I=1,sNx
2492     DIAGarrayB(I,J) = maskC(I,J,kSurface,bi,bj) *
2493     & a_FWbySublim(I,J) * SEAICE_rhoIce * recip_deltaTtherm
2494     ENDDO
2495     ENDDO
2496     CALL DIAGNOSTICS_FILL(DIAGarrayB,
2497     & 'SIfwSubl',0,1,3,bi,bj,myThid)
2498     C
2499     DO J=1,sNy
2500     DO I=1,sNx
2501     C the actual Freshwater flux of sublimated ice, >0 decreases ice
2502     DIAGarrayA(I,J) = maskC(I,J,kSurface,bi,bj)
2503     & * (a_FWbySublim(I,J)-r_FWbySublim(I,J))
2504     & * SEAICE_rhoIce * recip_deltaTtherm
2505 torge 1.10 C the residual Freshwater flux of sublimated ice
2506 dimitri 1.1 DIAGarrayC(I,J) = maskC(I,J,kSurface,bi,bj)
2507     & * r_FWbySublim(I,J)
2508     & * SEAICE_rhoIce * recip_deltaTtherm
2509     C the latent heat flux
2510     tmpscal1= EVAP(I,J,bi,bj)*( ONE - AREApreTH(I,J) )
2511     & + r_FWbySublim(I,J)*convertHI2PRECIP
2512     tmpscal2= ( a_FWbySublim(I,J)-r_FWbySublim(I,J) )
2513     & * convertHI2PRECIP
2514     tmpscal3= SEAICE_lhEvap+SEAICE_lhFusion
2515     DIAGarrayB(I,J) = -maskC(I,J,kSurface,bi,bj)*rhoConstFresh
2516     & * ( tmpscal1*SEAICE_lhEvap + tmpscal2*tmpscal3 )
2517     ENDDO
2518     ENDDO
2519     CALL DIAGNOSTICS_FILL(DIAGarrayA,'SIacSubl',0,1,3,bi,bj,myThid)
2520     CALL DIAGNOSTICS_FILL(DIAGarrayC,'SIrsSubl',0,1,3,bi,bj,myThid)
2521     CALL DIAGNOSTICS_FILL(DIAGarrayB,'SIhl ',0,1,3,bi,bj,myThid)
2522     #endif /* ALLOW_ATM_TEMP */
2523    
2524     ENDIF
2525     #endif /* ALLOW_DIAGNOSTICS */
2526    
2527     C close bi,bj loops
2528     ENDDO
2529     ENDDO
2530    
2531 torge 1.10
2532     C ===================================================================
2533     C =========PART 9: HF/FWF global integrals and balancing=============
2534     C ===================================================================
2535    
2536     #ifdef ALLOW_BALANCE_FLUXES
2537    
2538     c 1) global sums
2539     # ifdef ALLOW_AUTODIFF_TAMC
2540     CADJ STORE FWFsiTile = comlev1, key=ikey_dynamics, kind=isbyte
2541     CADJ STORE HFsiTile = comlev1, key=ikey_dynamics, kind=isbyte
2542     CADJ STORE FWF2HFsiTile = comlev1, key=ikey_dynamics, kind=isbyte
2543     # endif /* ALLOW_AUTODIFF_TAMC */
2544     FWFsiGlob=0. _d 0
2545     IF ( balanceEmPmR )
2546 torge 1.14 & CALL GLOBAL_SUM_TILE_RL( FWFsiTile, FWFsiGlob, myThid )
2547 torge 1.10 FWF2HFsiGlob=0. _d 0
2548     IF ( balanceEmPmR.AND.(temp_EvPrRn.EQ.UNSET_RL) ) THEN
2549     CALL GLOBAL_SUM_TILE_RL(FWF2HFsiTile, FWF2HFsiGlob, myThid)
2550     ELSEIF ( balanceEmPmR ) THEN
2551     FWF2HFsiGlob=HeatCapacity_Cp * temp_EvPrRn * globalArea
2552     ENDIF
2553     HFsiGlob=0. _d 0
2554     IF ( balanceQnet )
2555     & CALL GLOBAL_SUM_TILE_RL( HFsiTile, HFsiGlob, myThid )
2556    
2557     c 2) global means
2558     c mean SIatmFW
2559     tmpscal0=FWFsiGlob / globalArea
2560     c corresponding mean advection by atm to ocean+ice water exchange
2561     c (if mean SIatmFW was removed uniformely from ocean)
2562     tmpscal1=FWFsiGlob / globalArea * FWF2HFsiGlob / globalArea
2563     c mean SItflux (before potential adjustement due to SIatmFW)
2564     tmpscal2=HFsiGlob / globalArea
2565     c mean SItflux (after potential adjustement due to SIatmFW)
2566     IF ( balanceEmPmR ) tmpscal2=tmpscal2-tmpscal1
2567    
2568     c 3) balancing adjustments
2569     IF ( balanceEmPmR ) THEN
2570     DO bj=myByLo(myThid),myByHi(myThid)
2571     DO bi=myBxLo(myThid),myBxHi(myThid)
2572     DO j=1-OLy,sNy+OLy
2573     DO i=1-OLx,sNx+OLx
2574     empmr(i,j,bi,bj) = empmr(i,j,bi,bj) - tmpscal0
2575     SIatmFW(i,j,bi,bj) = SIatmFW(i,j,bi,bj) - tmpscal0
2576 torge 1.14 c adjust SItflux consistently
2577 torge 1.10 IF ( (temp_EvPrRn.NE.UNSET_RL).AND.
2578     & useRealFreshWaterFlux.AND.(nonlinFreeSurf.NE.0) ) THEN
2579     tmpscal1=
2580     & ( ZERO + HeatCapacity_Cp * temp_EvPrRn )
2581     ELSEIF ( (temp_EvPrRn.EQ.UNSET_RL).AND.
2582     & useRealFreshWaterFlux.AND.(nonlinFreeSurf.NE.0) ) THEN
2583     tmpscal1=
2584     & ( ZERO + HeatCapacity_Cp * theta(I,J,kSurface,bi,bj) )
2585     ELSEIF ( (temp_EvPrRn.NE.UNSET_RL) ) THEN
2586     tmpscal1=
2587     & HeatCapacity_Cp*(temp_EvPrRn - theta(I,J,kSurface,bi,bj))
2588     ELSE
2589     tmpscal1=ZERO
2590     ENDIF
2591     SItflux(i,j,bi,bj) = SItflux(i,j,bi,bj) - tmpscal0*tmpscal1
2592     c no qnet or tflux adjustement is needed
2593     ENDDO
2594     ENDDO
2595     ENDDO
2596     ENDDO
2597     IF ( balancePrintMean ) THEN
2598     _BEGIN_MASTER( myThid )
2599 torge 1.14 WRITE(msgBuf,'(a,a,e24.17)') 'rm Global mean of ',
2600 torge 1.10 & 'SIatmFW = ', tmpscal0
2601     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
2602     & SQUEEZE_RIGHT , myThid)
2603     _END_MASTER( myThid )
2604     ENDIF
2605     ENDIF
2606     IF ( balanceQnet ) THEN
2607     DO bj=myByLo(myThid),myByHi(myThid)
2608     DO bi=myBxLo(myThid),myBxHi(myThid)
2609     DO j=1-OLy,sNy+OLy
2610     DO i=1-OLx,sNx+OLx
2611     SItflux(i,j,bi,bj) = SItflux(i,j,bi,bj) - tmpscal2
2612     qnet(i,j,bi,bj) = qnet(i,j,bi,bj) - tmpscal2
2613     SIatmQnt(i,j,bi,bj) = SIatmQnt(i,j,bi,bj) - tmpscal2
2614     ENDDO
2615     ENDDO
2616     ENDDO
2617     ENDDO
2618     IF ( balancePrintMean ) THEN
2619     _BEGIN_MASTER( myThid )
2620 torge 1.14 WRITE(msgBuf,'(a,a,e24.17)') 'rm Global mean of ',
2621 torge 1.10 & 'SItflux = ', tmpscal2
2622     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
2623     & SQUEEZE_RIGHT , myThid)
2624     _END_MASTER( myThid )
2625     ENDIF
2626     ENDIF
2627 torge 1.14 #endif /* ALLOW_BALANCE_FLUXES */
2628 torge 1.10
2629     #ifdef ALLOW_DIAGNOSTICS
2630     c these diags need to be done outside of the bi,bj loop so that
2631     c we may do potential global mean adjustement to them consistently.
2632     CALL DIAGNOSTICS_FILL(SItflux,
2633     & 'SItflux ',0,1,0,1,1,myThid)
2634     CALL DIAGNOSTICS_FILL(SIatmQnt,
2635     & 'SIatmQnt',0,1,0,1,1,myThid)
2636     c SIatmFW follows the same convention as empmr -- SIatmFW diag does not
2637     tmpscal1= - 1. _d 0
2638     CALL DIAGNOSTICS_SCALE_FILL(SIatmFW,
2639     & tmpscal1,1,'SIatmFW ',0,1,0,1,1,myThid)
2640     #endif /* ALLOW_DIAGNOSTICS */
2641    
2642 dimitri 1.1 RETURN
2643     END

  ViewVC Help
Powered by ViewVC 1.1.22