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

Contents 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 - (show 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 C $Header: /u/gcmpack/MITgcm_contrib/torge/itd/code/seaice_growth.F,v 1.19 2013/05/03 18:59:40 torge Exp $
2 C $Name: $
3
4 #include "SEAICE_OPTIONS.h"
5 #ifdef ALLOW_EXF
6 # include "EXF_OPTIONS.h"
7 #endif
8
9 CBOP
10 C !ROUTINE: SEAICE_GROWTH
11 C !INTERFACE:
12 SUBROUTINE SEAICE_GROWTH( myTime, myIter, myThid )
13 C !DESCRIPTION: \bv
14 C *==========================================================*
15 C | SUBROUTINE seaice_growth
16 C | o Updata ice thickness and snow depth
17 C *==========================================================*
18 C \ev
19
20 C !USES:
21 IMPLICIT NONE
22 C === Global variables ===
23 #include "SIZE.h"
24 #include "EEPARAMS.h"
25 #include "PARAMS.h"
26 #include "DYNVARS.h"
27 #include "GRID.h"
28 #include "FFIELDS.h"
29 #include "SEAICE_SIZE.h"
30 #include "SEAICE_PARAMS.h"
31 #include "SEAICE.h"
32 #include "SEAICE_TRACER.h"
33 #ifdef ALLOW_EXF
34 # include "EXF_PARAM.h"
35 # include "EXF_FIELDS.h"
36 #endif
37 #ifdef ALLOW_SALT_PLUME
38 # include "SALT_PLUME.h"
39 #endif
40 #ifdef ALLOW_AUTODIFF_TAMC
41 # include "tamc.h"
42 #endif
43
44 C !INPUT/OUTPUT PARAMETERS:
45 C === Routine arguments ===
46 C myTime :: Simulation time
47 C myIter :: Simulation timestep number
48 C myThid :: Thread no. that called this routine.
49 _RL myTime
50 INTEGER myIter, myThid
51 CEOP
52
53 C !FUNCTIONS:
54 #ifdef ALLOW_DIAGNOSTICS
55 LOGICAL DIAGNOSTICS_IS_ON
56 EXTERNAL DIAGNOSTICS_IS_ON
57 #endif
58
59 C !LOCAL VARIABLES:
60 C === Local variables ===
61 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 C IT :: ice thickness category index (MULTICATEGORIES and ITD code)
95 INTEGER IT
96 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 _RL pFac
105 _RL tempFrz, ICE2SNOW, SNOW2ICE
106 _RL QI, QS, recip_QI
107 _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
120 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 #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
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 C-- TmixLoc :: ocean surface/mixed-layer temperature (in K)
155 _RL TmixLoc (1:sNx,1:sNy)
156
157 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 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 #endif
205
206 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 C a_QbyOCN :: available heat (in W/m^2) due to the
220 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 C The change of mean ice thickness due to out-of-bounds values following
227 C sea ice dyhnamics
228 _RL d_HEFFbyNEG (1:sNx,1:sNy)
229
230 C The change of mean ice thickness due to turbulent ocean-sea ice heat fluxes
231 _RL d_HEFFbyOCNonICE (1:sNx,1:sNy)
232
233 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 _RL d_HEFFbyATMonOCN (1:sNx,1:sNy)
236 C The change of mean ice thickness due to flooding by snow
237 _RL d_HEFFbyFLOODING (1:sNx,1:sNy)
238
239 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 _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
251 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 #ifdef SEAICE_CAP_SUBLIM
260 C The latent heat flux which will sublimate all snow and ice
261 C over one time step
262 _RL latentHeatFluxMax (1:sNx,1:sNy)
263 _RL latentHeatFluxMaxMult(1:sNx,1:sNy,MULTDIM)
264 #endif
265
266 #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 #endif
272
273 #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 #ifdef ALLOW_DIAGNOSTICS
287 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 _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 #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 #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 #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 c (this is currently computed as a function of ice concentration
362 c following a suggestion by Luepkes at al. (2012))
363 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
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 #ifdef EXF_ALLOW_SEAICE_RELAX
408 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 #ifdef SEAICE_CAP_SUBLIM
443 latentHeatFluxMaxMult(I,J,IT) = 0.0 _d 0
444 #endif
445 #ifdef SEAICE_ITD
446 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 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 #endif
462 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 #ifdef EXF_ALLOW_SEAICE_RELAX
483 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 #ifdef SEAICE_ITD
502 AREAITD(I,J,1,bi,bj) = AREAITD(I,J,1,bi,bj)
503 & + 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 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 #endif /* EXF_ALLOW_SEAICE_RELAX */
513
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 #ifdef SEAICE_ITD
522 DO IT=1,nITD
523 #endif
524 DO J=1,sNy
525 DO I=1,sNx
526 #ifdef SEAICE_ITD
527 tmpscal2=0. _d 0
528 tmpscal3=0. _d 0
529 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 d_HEFFbyNEG(I,J)=d_HEFFbyNEG(I,J)+tmpscal2
532 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 d_HSNWbyNEG(I,J)=d_HSNWbyNEG(I,J)+tmpscal3
535 AREAITD(I,J,IT,bi,bj)=MAX(AREAITD(I,J,IT,bi,bj),0. _d 0)
536 C AREA, HEFF, and HSNOW will be updated at end of PART 1
537 C by calling SEAICE_ITD_SUM
538 #else
539 d_HEFFbyNEG(I,J)=MAX(-HEFF(I,J,bi,bj),0. _d 0)
540 HEFF(I,J,bi,bj)=HEFF(I,J,bi,bj)+d_HEFFbyNEG(I,J)
541 d_HSNWbyNEG(I,J)=MAX(-HSNOW(I,J,bi,bj),0. _d 0)
542 HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)+d_HSNWbyNEG(I,J)
543 AREA(I,J,bi,bj)=MAX(AREA(I,J,bi,bj),0. _d 0)
544 #endif
545 ENDDO
546 ENDDO
547 #ifdef SEAICE_ITD
548 ENDDO
549 #endif
550
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 #ifdef SEAICE_ITD
557 DO IT=1,nITD
558 #endif
559 DO J=1,sNy
560 DO I=1,sNx
561 tmpscal2=0. _d 0
562 tmpscal3=0. _d 0
563 #ifdef SEAICE_ITD
564 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 C TICE will be updated at end of Part 1 together with AREA and HEFF
569 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 #else
573 IF (HEFF(I,J,bi,bj).LE.siEps) THEN
574 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 ENDIF
581 HEFF(I,J,bi,bj)=HEFF(I,J,bi,bj)+tmpscal2
582 HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)+tmpscal3
583 #endif
584 d_HEFFbyNEG(I,J)=d_HEFFbyNEG(I,J)+tmpscal2
585 d_HSNWbyNEG(I,J)=d_HSNWbyNEG(I,J)+tmpscal3
586 ENDDO
587 ENDDO
588 #ifdef SEAICE_ITD
589 ENDDO
590 #endif
591
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 #ifdef SEAICE_ITD
599 DO IT=1,nITD
600 #endif
601 DO J=1,sNy
602 DO I=1,sNx
603 #ifdef SEAICE_ITD
604 IF ((HEFFITD(I,J,IT,bi,bj).EQ.0. _d 0).AND.
605 & (HSNOWITD(I,J,IT,bi,bj).EQ.0. _d 0))
606 & AREAITD(I,J,IT,bi,bj)=0. _d 0
607 #else
608 IF ((HEFF(i,j,bi,bj).EQ.0. _d 0).AND.
609 & (HSNOW(i,j,bi,bj).EQ.0. _d 0)) AREA(I,J,bi,bj)=0. _d 0
610 #endif
611 ENDDO
612 ENDDO
613 #ifdef SEAICE_ITD
614 ENDDO
615 #endif
616
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 #ifdef SEAICE_ITD
624 DO IT=1,nITD
625 #endif
626 DO J=1,sNy
627 DO I=1,sNx
628 #ifdef SEAICE_ITD
629 IF ((HEFFITD(I,J,IT,bi,bj).GT.0).OR.
630 & (HSNOWITD(I,J,IT,bi,bj).GT.0)) THEN
631 C SEAICE_area_floor*nITD cannot be allowed to exceed 1
632 C hence use SEAICE_area_floor devided by nITD
633 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 #else
638 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 ENDIF
641 #endif
642 ENDDO
643 ENDDO
644 #ifdef SEAICE_ITD
645 ENDDO
646 #endif
647 #endif /* DISABLE_AREA_FLOOR */
648
649 C 2.5) treat case of excessive ice cover, e.g., due to ridging:
650
651 C for SEAICE_ITD this case is treated in SEAICE_ITD_REDIST,
652 C which is called at end of PART 1 below
653 #ifndef SEAICE_ITD
654 #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 ENDDO
667 ENDDO
668 #endif /* notSEAICE_ITD */
669
670 #ifdef SEAICE_ITD
671 C catch up with items 1.25 and 2.5 involving category sums AREA and HEFF
672 DO IT=1,nITD
673 DO J=1,sNy
674 DO I=1,sNx
675 C TICES was changed above (item 1.25), now update TICE as ice volume
676 C weighted average of TICES
677 C also compute total of AREAITD (needed for finishing item 2.5, see below)
678 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 ENDIF
683 tmpscal1itd(i,j)=tmpscal1itd(i,j) + TICES(I,J,IT,bi,bj)
684 & * HEFFITD(I,J,IT,bi,bj)
685 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 TICE(I,J,bi,bj)=tmpscal1itd(i,j)/tmpscal2itd(i,j)
689 C lines of item 2.5 that were omitted:
690 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 DIAGarrayA(I,J) = tmpscal3itd(i,j)
695 #endif
696 #ifdef ALLOW_SITRACER
697 SItrAREA(I,J,bi,bj,1)=tmpscal3itd(i,j)
698 #endif
699 ENDIF
700 ENDDO
701 ENDDO
702 ENDDO
703
704 C finally make sure that all categories meet their thickness limits
705 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 #endif /* SEAICE_ITD */
710
711 #if (defined ALLOW_AUTODIFF_TAMC && defined SEAICE_MODIFY_GROWTH_ADJ)
712 C end SEAICEadjMODE.EQ.0 statement:
713 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 #ifdef SEAICE_ITD
734 DO IT=1,nITD
735 DO J=1,sNy
736 DO I=1,sNx
737 HEFFITDpreTH(I,J,IT)=HEFFITD(I,J,IT,bi,bj)
738 HSNWITDpreTH(I,J,IT)=HSNOWITD(I,J,IT,bi,bj)
739 AREAITDpreTH(I,J,IT)=AREAITD(I,J,IT,bi,bj)
740
741 C memorize areal and volume fraction of each ITD category
742 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 ENDDO
753 ENDDO
754 ENDDO
755 #ifdef ALLOW_SITRACER
756 C prepare SItrHEFF to be computed as cumulative sum
757 DO iTr=2,5
758 DO J=1,sNy
759 DO I=1,sNx
760 SItrHEFF(I,J,bi,bj,iTr)=ZERO
761 ENDDO
762 ENDDO
763 ENDDO
764 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 #endif
771 #endif /* SEAICE_ITD */
772
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 #ifdef SEAICE_ITD
825 DO IT=1,nITD
826 DO J=1,sNy
827 DO I=1,sNx
828 HEFFITDpreTH(I,J,IT) = 0. _d 0
829 HSNWITDpreTH(I,J,IT) = 0. _d 0
830 AREAITDpreTH(I,J,IT) = 0. _d 0
831 ENDDO
832 ENDDO
833 ENDDO
834 #endif
835 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 #ifdef SEAICE_ITD
855 DO IT=1,nITD
856 #endif
857 DO J=1,sNy
858 DO I=1,sNx
859
860 #ifdef SEAICE_ITD
861 IF (HEFFITDpreTH(I,J,IT) .GT. ZERO) THEN
862 cif regularize AREA with SEAICE_area_reg
863 tmpscal1 = SQRT(AREAITDpreTH(I,J,IT) * AREAITDpreTH(I,J,IT)
864 & + area_reg_sq)
865 cif heffActual calculated with the regularized AREA
866 tmpscal2 = HEFFITDpreTH(I,J,IT) / tmpscal1
867 cif regularize heffActual with SEAICE_hice_reg (add lower bound)
868 heffActualMult(I,J,IT) = SQRT(tmpscal2 * tmpscal2
869 & + hice_reg_sq)
870 cif hsnowActual calculated with the regularized AREA
871 hsnowActualMult(I,J,IT) = HSNWITDpreTH(I,J,IT) / tmpscal1
872 cif regularize the inverse of heffActual by hice_reg
873 recip_heffActualMult(I,J,IT) = AREAITDpreTH(I,J,IT) /
874 & sqrt(HEFFITDpreTH(I,J,IT) * HEFFITDpreTH(I,J,IT)
875 & + hice_reg_sq)
876 cif Do not regularize when HEFFpreTH = 0
877 ELSE
878 heffActualMult(I,J,IT) = ZERO
879 hsnowActualMult(I,J,IT) = ZERO
880 recip_heffActualMult(I,J,IT) = ZERO
881 ENDIF
882 #else /* SEAICE_ITD */
883 IF (HEFFpreTH(I,J) .GT. ZERO) THEN
884 Cif regularize AREA with SEAICE_area_reg
885 tmpscal1 = SQRT(AREApreTH(I,J)* AREApreTH(I,J) + area_reg_sq)
886 Cif heffActual calculated with the regularized AREA
887 tmpscal2 = HEFFpreTH(I,J) / tmpscal1
888 Cif regularize heffActual with SEAICE_hice_reg (add lower bound)
889 heffActual(I,J) = SQRT(tmpscal2 * tmpscal2 + hice_reg_sq)
890 Cif hsnowActual calculated with the regularized AREA
891 hsnowActual(I,J) = HSNWpreTH(I,J) / tmpscal1
892 Cif regularize the inverse of heffActual by hice_reg
893 recip_heffActual(I,J) = AREApreTH(I,J) /
894 & sqrt(HEFFpreTH(I,J)*HEFFpreTH(I,J) + hice_reg_sq)
895 Cif Do not regularize when HEFFpreTH = 0
896 ELSE
897 heffActual(I,J) = ZERO
898 hsnowActual(I,J) = ZERO
899 recip_heffActual(I,J) = ZERO
900 ENDIF
901 #endif /* SEAICE_ITD */
902
903 ENDDO
904 ENDDO
905 #ifdef SEAICE_ITD
906 ENDDO
907 #endif
908
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 #ifdef SEAICE_ITD
919 DO IT=1,nITD
920 #endif
921 DO J=1,sNy
922 DO I=1,sNx
923 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 #ifdef SEAICE_ITD
927 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 ELSE
933 latentHeatFluxMaxMult(I,J,IT) = ZERO
934 ENDIF
935 #else
936 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 #endif
944 ENDDO
945 ENDDO
946 #ifdef SEAICE_ITD
947 ENDDO
948 #endif
949 #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 IF (useRelativeWind.AND.useAtmWind) THEN
984 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 #ifdef SEAICE_ITD
1019 DO IT=1,nITD
1020 DO J=1,sNy
1021 DO I=1,sNx
1022 C for SEAICE_ITD heffActualMult and latentHeatFluxMaxMult are calculated above
1023 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 DO IT=1,SEAICE_multDim
1033 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 DO J=1,sNy
1038 DO I=1,sNx
1039 heffActualMult(I,J,IT)= heffActual(I,J)*pFac
1040 hsnowActualMult(I,J,IT)=hsnowActual(I,J)*pFacSnow
1041 #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 #endif
1052
1053 #ifdef ALLOW_AUTODIFF_TAMC
1054 CADJ STORE heffActualMult = comlev1_bibj, key = iicekey, byte = isbyte
1055 CADJ STORE hsnowActualMult= comlev1_bibj, key = iicekey, byte = isbyte
1056 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 I UG, heffActualMult(1,1,IT), hsnowActualMult(1,1,IT),
1072 #ifdef SEAICE_CAP_SUBLIM
1073 I latentHeatFluxMaxMult(1,1,IT),
1074 #endif
1075 U ticeInMult(1,1,IT), ticeOutMult(1,1,IT),
1076 O a_QbyATMmult_cover(1,1,IT),
1077 O a_QSWbyATMmult_cover(1,1,IT),
1078 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 CADJ STORE hsnowActualMult= comlev1_bibj, key = iicekey, byte = isbyte
1085 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 #ifdef SEAICE_ITD
1103 C calculate area weighted mean
1104 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 C and hence is averaged area weighted [areaFracFactor])
1109 TICE(I,J,bi,bj) = TICE(I,J,bi,bj)
1110 & + ticeOutMult(I,J,IT)*areaFracFactor(I,J,IT)
1111 #else
1112 TICE(I,J,bi,bj) = TICE(I,J,bi,bj)
1113 & + ticeOutMult(I,J,IT)*recip_multDim
1114 #endif
1115 TICES(I,J,IT,bi,bj) = ticeOutMult(I,J,IT)
1116 C average over categories
1117 #ifdef SEAICE_ITD
1118 C calculate area weighted mean
1119 C (fluxes are per unit (ice surface) area and are thus area weighted)
1120 a_QbyATM_cover (I,J) = a_QbyATM_cover(I,J)
1121 & + a_QbyATMmult_cover(I,J,IT)*areaFracFactor(I,J,IT)
1122 a_QSWbyATM_cover (I,J) = a_QSWbyATM_cover(I,J)
1123 & + a_QSWbyATMmult_cover(I,J,IT)*areaFracFactor(I,J,IT)
1124 a_FWbySublim (I,J) = a_FWbySublim(I,J)
1125 & + a_FWbySublimMult(I,J,IT)*areaFracFactor(I,J,IT)
1126 #else
1127 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 #endif
1134 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 C The actual latent heat flux realized by SOLVE4TEMP
1143 DIAGarrayA(I,J) = a_FWbySublim(I,J) * lhSublim
1144 ENDDO
1145 ENDDO
1146 Cif The actual vs. maximum latent heat flux
1147 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 #ifdef SEAICE_ITD
1167 DO IT=1,nITD
1168 DO J=1,sNy
1169 DO I=1,sNx
1170 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 C and initialize r_QbyATMmult_cover
1175 r_QbyATMmult_cover(I,J,IT)=a_QbyATMmult_cover(I,J,IT)
1176 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 a_FWbySublimMult(I,J,IT) = ZERO
1180 #endif
1181 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 ENDDO
1185 ENDDO
1186 ENDDO
1187 DO J=1,sNy
1188 DO I=1,sNx
1189 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 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 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 Cgf just for those who may need to omit this term to reproduce old results
1215 a_FWbySublim(I,J) = ZERO
1216 #endif /* SEAICE_DISABLE_SUBLIM */
1217 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 #endif /* SEAICE_ITD */
1223
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 #ifdef SEAICE_ITD
1240 DO IT=1,nITD
1241 DO J=1,sNy
1242 DO I=1,sNx
1243 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 ENDDO
1247 ENDDO
1248 ENDDO
1249 #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 #endif
1258 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 C FREEZING TEMP. OF SEA WATER (deg C)
1275 tempFrz = SEAICE_tempFrz0 +
1276 & SEAICE_dTempFrz_dS *salt(I,J,kSurface,bi,bj)
1277 C efficiency of turbulent fluxes : dependency to sign of THETA-TBC
1278 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 C efficiency of turbulent fluxes : dependency to AREA (McPhee cases)
1284 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 C maximum turbulent flux, in ice meters
1295 tmpscal2= - (HeatCapacity_Cp*rhoConst * recip_QI)
1296 & * (theta(I,J,kSurface,bi,bj)-tempFrz)
1297 & * SEAICE_deltaTtherm * maskC(i,j,kSurface,bi,bj)
1298 C available turbulent flux
1299 a_QbyOCN(i,j) =
1300 & tmpscal1 * tmpscal2 * MixedLayerTurbulenceFactor
1301 r_QbyOCN(i,j) = a_QbyOCN(i,j)
1302 ENDDO
1303 ENDDO
1304
1305 #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 floeDiameter = floeDiameterMin
1318 & * (tmpscal3 / (tmpscal3-AREApreTH(I,J)))
1319 DO IT=1,nITD
1320 C following the idea of SEAICE_areaLossFormula == 1:
1321 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 c lateral melt rate as suggested by Perovich, 1983 (PhD thesis)
1325 latMeltRate(i,j,it) = 1.6 _d -6 * tmpscal1**1.36
1326 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 c latMeltRate(i,j,it) = (1.6 _d -6 + 13.5 _d -6 * tmpscal2)
1330 c & * tmpscal1**1.3
1331 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 latMeltRate(i,j,it)=0.0 _d 0
1339 latMeltFrac(i,j,it)=0.0 _d 0
1340 ENDIF
1341 ENDDO
1342 ENDDO
1343 ENDDO
1344 #endif
1345
1346 #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 #ifdef SEAICE_ITD
1362 DO IT=1,nITD
1363 #endif
1364 DO J=1,sNy
1365 DO I=1,sNx
1366 C First sublimate/deposite snow
1367 tmpscal2 =
1368 #ifdef SEAICE_ITD
1369 & MAX(MIN(r_FWbySublimMult(I,J,IT),HSNOWITD(I,J,IT,bi,bj)
1370 & *SNOW2ICE),ZERO)
1371 d_HSNWbySublim_ITD(I,J,IT) = - tmpscal2 * ICE2SNOW
1372 C accumulate change over ITD categories
1373 d_HSNWbySublim(I,J) = d_HSNWbySublim(I,J) - tmpscal2
1374 & *ICE2SNOW
1375 r_FWbySublimMult(I,J,IT)= r_FWbySublimMult(I,J,IT) - tmpscal2
1376 #else
1377 & 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 #endif
1382 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 #ifdef SEAICE_ITD
1393 & MAX(MIN(r_FWbySublimMult(I,J,IT),HEFFITD(I,J,IT,bi,bj)),ZERO)
1394 d_HEFFbySublim_ITD(I,J,IT) = - tmpscal2
1395 C accumulate change over ITD categories
1396 d_HEFFbySublim(I,J) = d_HEFFbySublim(I,J) - tmpscal2
1397 r_FWbySublimMult(I,J,IT) = r_FWbySublimMult(I,J,IT) - tmpscal2
1398 #else
1399 & 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 #endif
1404 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 C Since a_QbyATM_cover was computed for sublimation, not simple evaporation, we need to
1410 C remove the fusion part for the residual (that happens to be precisely r_FWbySublim).
1411 #ifdef SEAICE_ITD
1412 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 #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 ENDDO
1421 ENDDO
1422 #ifdef SEAICE_ITD
1423 C end IT loop
1424 ENDDO
1425 #endif
1426
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 #ifdef SEAICE_ITD
1436 DO IT=1,nITD
1437 DO J=1,sNy
1438 DO I=1,sNx
1439 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 C fractional area of each thickness category
1442 tmpscal1=MAX(r_QbyOCN(i,j)*areaFracFactor(I,J,IT),
1443 & -HEFFITD(I,J,IT,bi,bj))
1444 d_HEFFbyOCNonICE_ITD(I,J,IT)=tmpscal1
1445 d_HEFFbyOCNonICE(I,J) = d_HEFFbyOCNonICE(I,J) + tmpscal1
1446 ENDDO
1447 ENDDO
1448 ENDDO
1449 #ifdef ALLOW_SITRACER
1450 DO J=1,sNy
1451 DO I=1,sNx
1452 SItrHEFF(I,J,bi,bj,2) = HEFFpreTH(I,J)
1453 & + d_HEFFbySublim(I,J)
1454 & + d_HEFFbyOCNonICE(I,J)
1455 ENDDO
1456 ENDDO
1457 #endif
1458 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 #else /* SEAICE_ITD */
1464 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 #endif /* SEAICE_ITD */
1475
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 #ifdef SEAICE_ITD
1485 DO IT=1,nITD
1486 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 tmpscal1=MAX(r_QbyATMmult_cover(I,J,IT),
1491 & -HSNOWITD(I,J,IT,bi,bj)*SNOW2ICE)
1492 tmpscal2=MIN(tmpscal1,0. _d 0)
1493 #ifdef SEAICE_MODIFY_GROWTH_ADJ
1494 Cgf no additional dependency through snow
1495 IF ( SEAICEadjMODE.GE.2 ) tmpscal2 = 0. _d 0
1496 #endif
1497 d_HSNWbyATMonSNW_ITD(I,J,IT) = tmpscal2*ICE2SNOW
1498 d_HSNWbyATMonSNW(I,J) = d_HSNWbyATMonSNW(I,J)
1499 & + tmpscal2*ICE2SNOW
1500 r_QbyATMmult_cover(I,J,IT)=r_QbyATMmult_cover(I,J,IT)
1501 & - tmpscal2
1502 ENDDO
1503 ENDDO
1504 ENDDO
1505 #else /* SEAICE_ITD */
1506 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 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj) + tmpscal2*ICE2SNOW
1518 r_QbyATM_cover(I,J)=r_QbyATM_cover(I,J) - tmpscal2
1519 ENDDO
1520 ENDDO
1521 #endif /* SEAICE_ITD */
1522
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 #ifdef SEAICE_ITD
1537 DO IT=1,nITD
1538 DO J=1,sNy
1539 DO I=1,sNx
1540 tmpscal1 = HEFFITDpreTH(I,J,IT)
1541 & + d_HEFFbySublim_ITD(I,J,IT)
1542 & + d_HEFFbyOCNonICE_ITD(I,J,IT)
1543 tmpscal2 = MAX(-tmpscal1,
1544 & r_QbyATMmult_cover(I,J,IT)
1545 c Limit ice growth by potential melt by ocean
1546 & + AREAITDpreTH(I,J,IT) * r_QbyOCN(I,J))
1547 d_HEFFbyATMonOCN_cover_ITD(I,J,IT) = tmpscal2
1548 d_HEFFbyATMonOCN_cover(I,J) = d_HEFFbyATMonOCN_cover(I,J)
1549 & + tmpscal2
1550 d_HEFFbyATMonOCN_ITD(I,J,IT) = d_HEFFbyATMonOCN_ITD(I,J,IT)
1551 & + tmpscal2
1552 d_HEFFbyATMonOCN(I,J) = d_HEFFbyATMonOCN(I,J)
1553 & + tmpscal2
1554 r_QbyATMmult_cover(I,J,IT) = r_QbyATMmult_cover(I,J,IT)
1555 & - tmpscal2
1556 ENDDO
1557 ENDDO
1558 ENDDO
1559 #ifdef ALLOW_SITRACER
1560 DO J=1,sNy
1561 DO I=1,sNx
1562 SItrHEFF(I,J,bi,bj,3) = SItrHEFF(I,J,bi,bj,2)
1563 & + d_HEFFbyATMonOCN_cover(I,J)
1564 ENDDO
1565 ENDDO
1566 #endif
1567 #else /* SEAICE_ITD */
1568 DO J=1,sNy
1569 DO I=1,sNx
1570
1571 tmpscal2 = MAX(-HEFF(I,J,bi,bj),r_QbyATM_cover(I,J)+
1572 C Limit ice growth by potential melt by ocean
1573 & 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 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) + tmpscal2
1579
1580 #ifdef ALLOW_SITRACER
1581 SItrHEFF(I,J,bi,bj,3)=HEFF(I,J,bi,bj)
1582 #endif
1583 ENDDO
1584 ENDDO
1585 #endif /* SEAICE_ITD */
1586
1587 C add snow precipitation to HSNOW.
1588 C =================================================
1589 #ifdef ALLOW_ATM_TEMP
1590 # ifdef ALLOW_AUTODIFF_TAMC
1591 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 # 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 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 IF ( a_QbyATM_cover(I,J).GE. 0. _d 0 ) THEN
1616 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 ELSE
1621 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 ENDIF
1626 ENDDO
1627 ENDDO
1628 #ifdef SEAICE_ITD
1629 DO IT=1,nITD
1630 DO J=1,sNy
1631 DO I=1,sNx
1632 d_HSNWbyRAIN_ITD(I,J,IT)
1633 & = d_HSNWbyRAIN(I,J)*areaFracFactor(I,J,IT)
1634 ENDDO
1635 ENDDO
1636 ENDDO
1637 #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 #endif
1644 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 C end of IF statement snowPrecipFile:
1648 ENDIF
1649 #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
1662 #ifdef SEAICE_ITD
1663 DO IT=1,nITD
1664 DO J=1,sNy
1665 DO I=1,sNx
1666 tmpscal4 = HSNWITDpreTH(I,J,IT)
1667 & + d_HSNWbySublim_ITD(I,J,IT)
1668 & + d_HSNWbyATMonSNW_ITD(I,J,IT)
1669 & + d_HSNWbyRAIN_ITD(I,J,IT)
1670 tmpscal1=MAX(r_QbyOCN(i,j)*ICE2SNOW*areaFracFactor(I,J,IT),
1671 & -tmpscal4)
1672 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 d_HSNWbyOCNonSNW_ITD(I,J,IT) = tmpscal2
1678 d_HSNWbyOCNonSNW(I,J) = d_HSNWbyOCNonSNW(I,J) + tmpscal2
1679 r_QbyOCN(I,J)=r_QbyOCN(I,J) - tmpscal2*SNOW2ICE
1680 ENDDO
1681 ENDDO
1682 ENDDO
1683 #else /* SEAICE_ITD */
1684 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 #endif /* SEAICE_ITD */
1699 #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 #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 tmpscal4 = HEFFpreTH(I,J)
1718 & + d_HEFFbySublim(I,J)
1719 & + d_HEFFbyOCNonICE(I,J)
1720 & + d_HEFFbyATMonOCN(I,J)
1721 #else
1722 C HEFF is updated step by step throughout seaice_growth
1723 tmpscal4 = HEFF(I,J,bi,bj)
1724 #endif
1725 C Initial ice growth is triggered by open water
1726 C heat flux overcoming potential melt by ocean
1727 tmpscal1=r_QbyATM_open(I,J)+r_QbyOCN(i,j) *
1728 & (1.0 _d 0 - AREApreTH(I,J))
1729 C Penetrative shortwave flux beyond first layer
1730 C that is therefore not available to ice growth/melt
1731 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 & -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 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 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) + tmpscal3
1746 ENDDO
1747 ENDDO
1748
1749 #ifdef ALLOW_SITRACER
1750 DO J=1,sNy
1751 DO I=1,sNx
1752 C needs to be here to allow use also with LEGACY branch
1753 #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 SItrHEFF(I,J,bi,bj,4)=HEFF(I,J,bi,bj)
1758 #endif
1759 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 #ifdef SEAICE_ITD
1773 DO IT=1,nITD
1774 DO J=1,sNy
1775 DO I=1,sNx
1776 tmpscal3 = HEFFITDpreTH(I,J,IT)
1777 & + d_HEFFbySublim_ITD(I,J,IT)
1778 & + d_HEFFbyOCNonICE_ITD(I,J,IT)
1779 & + d_HEFFbyATMonOCN_ITD(I,J,IT)
1780 tmpscal4 = HSNWITDpreTH(I,J,IT)
1781 & + d_HSNWbySublim_ITD(I,J,IT)
1782 & + 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 d_HEFFbyFLOODING(I,J) = d_HEFFbyFLOODING(I,J) + tmpscal1
1790 ENDDO
1791 ENDDO
1792 ENDDO
1793 #else
1794 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 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 ENDDO
1804 ENDDO
1805 #endif
1806 ENDIF
1807
1808 #ifdef SEAICE_ITD
1809 C apply ice and snow thickness changes
1810 C =================================================================
1811 DO IT=1,nITD
1812 DO J=1,sNy
1813 DO I=1,sNx
1814 HEFFITD(I,J,IT,bi,bj) = HEFFITD(I,J,IT,bi,bj)
1815 & + d_HEFFbySublim_ITD(I,J,IT)
1816 & + d_HEFFbyOCNonICE_ITD(I,J,IT)
1817 & + d_HEFFbyATMonOCN_ITD(I,J,IT)
1818 & + d_HEFFbyFLOODING_ITD(I,J,IT)
1819 HSNOWITD(I,J,IT,bi,bj) = HSNOWITD(I,J,IT,bi,bj)
1820 & + d_HSNWbySublim_ITD(I,J,IT)
1821 & + 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 ENDDO
1827 ENDDO
1828 ENDDO
1829 #endif
1830
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 #ifdef SEAICE_ITD
1856 C-- account for lateral ice growth and melt only in thinnest category
1857 C-- use HEFF, ARE, HSNOW, etc. temporarily for 1st category
1858 C (this way we can use same code for ITD and non-ITD case)
1859 DO J=1,sNy
1860 DO I=1,sNx
1861 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 ENDDO
1868 ENDDO
1869 C all other categories only experience basal growth or melt,
1870 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 IF (HEFFITD(I,J,IT,bi,bj).LE.ZERO) THEN
1876 AREAITD(I,J,IT,bi,bj)=ZERO
1877 ELSE
1878 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 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 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 ENDIF
1890 ENDDO
1891 ENDDO
1892 ENDDO
1893 ENDIF
1894 #endif
1895 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 recip_HH = recip_heffActual(I,J)
1904
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 #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
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 #ifdef SEAICE_ITD
1974 DO IT=1,nITD
1975 DO J=1,sNy
1976 DO I=1,sNx
1977 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 ENDDO
1980 ENDDO
1981 ENDDO
1982 #else
1983 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 #endif
1991 ENDIF
1992 #endif
1993 #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
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 #ifdef EXF_ALLOW_SEAICE_RELAX
2022 & + d_HEFFbyRLX(I,J)
2023 #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 C needs to be here to allow use also with LEGACY branch
2093 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 #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 C if fluxes in W/m^2 then use:
2120 c a_QbyATM_cover(I,J)=a_QbyATM_cover(I,J)
2121 c & + a_QbyATMmult_cover(I,J,IT) * areaFracFactor(I,J,IT)
2122 c r_QbyATM_cover(I,J)=r_QbyATM_cover(I,J)
2123 c & + r_QbyATMmult_cover(I,J,IT) * areaFracFactor(I,J,IT)
2124 c a_QSWbyATM_cover(I,J)=a_QSWbyATM_cover(I,J)
2125 c & + a_QSWbyATMmult_cover(I,J,IT) * areaFracFactor(I,J,IT)
2126 c r_FWbySublim(I,J)=r_FWbySublim(I,J)
2127 c & + r_FWbySublimMult(I,J,IT) * areaFracFactor(I,J,IT)
2128 C if fluxes in effective ice meters, i.e. ice volume per area, then use:
2129 a_QbyATM_cover(I,J)=a_QbyATM_cover(I,J)
2130 & + a_QbyATMmult_cover(I,J,IT)
2131 r_QbyATM_cover(I,J)=r_QbyATM_cover(I,J)
2132 & + r_QbyATMmult_cover(I,J,IT)
2133 a_QSWbyATM_cover(I,J)=a_QSWbyATM_cover(I,J)
2134 & + a_QSWbyATMmult_cover(I,J,IT)
2135 r_FWbySublim(I,J)=r_FWbySublim(I,J)
2136 & + r_FWbySublimMult(I,J,IT)
2137 ENDDO
2138 ENDDO
2139 ENDDO
2140 #endif
2141
2142 #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 & - ( 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 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 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 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 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 C Below we therefore anticipate on external_forcing_surf.F
2201 C to diagnoze and/or apply the correction to QNET.
2202 DO J=1,sNy
2203 DO I=1,sNx
2204 C ocean water going to ice/snow, in precip units
2205 tmpscal3=rhoConstFresh*maskC(I,J,kSurface,bi,bj)*(
2206 & ( 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 & - 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 & HeatCapacity_Cp * temp_EvPrRn
2217 ELSEIF ( (temp_EvPrRn.EQ.UNSET_RL).AND.useRealFreshWaterFlux
2218 & .AND.(nonlinFreeSurf.NE.0) ) THEN
2219 tmpscal1 = - tmpscal3*
2220 & HeatCapacity_Cp * theta(I,J,kSurface,bi,bj)
2221 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 #ifdef ALLOW_DIAGNOSTICS
2228 C in all cases, diagnoze the boundary condition mismatch to SIaaflux
2229 DIAGarrayA(I,J)=tmpscal1
2230 #endif
2231 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 ENDDO
2235 ENDDO
2236 #ifdef ALLOW_DIAGNOSTICS
2237 CALL DIAGNOSTICS_FILL(DIAGarrayA,
2238 & 'SIaaflux',0,1,3,bi,bj,myThid)
2239 #endif
2240 #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 SIatmQnt(I,J,bi,bj) =
2255 & 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 cgf 2) SItflux (analogous to tflux; includes advection by water
2259 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 ENDIF
2292 SItflux(I,J,bi,bj)=
2293 & SIatmQnt(I,J,bi,bj)-tmpscal1-tmpscal2
2294 ENDDO
2295 ENDDO
2296
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 #ifdef EXF_ALLOW_SEAICE_RELAX
2311 & +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 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 ENDDO
2335 ENDDO
2336
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 #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 FWFsiTile(bi,bj) =
2414 & 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 FWF2HFsiTile(bi,bj) = 0. _d 0
2421 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 HFsiTile(bi,bj) =
2435 & 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 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 C the residual Freshwater flux of sublimated ice
2506 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
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 & CALL GLOBAL_SUM_TILE_RL( FWFsiTile, FWFsiGlob, myThid )
2547 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 c adjust SItflux consistently
2577 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 WRITE(msgBuf,'(a,a,e24.17)') 'rm Global mean of ',
2600 & '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 WRITE(msgBuf,'(a,a,e24.17)') 'rm Global mean of ',
2621 & 'SItflux = ', tmpscal2
2622 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
2623 & SQUEEZE_RIGHT , myThid)
2624 _END_MASTER( myThid )
2625 ENDIF
2626 ENDIF
2627 #endif /* ALLOW_BALANCE_FLUXES */
2628
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 RETURN
2643 END

  ViewVC Help
Powered by ViewVC 1.1.22