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

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

  ViewVC Help
Powered by ViewVC 1.1.22