/[MITgcm]/MITgcm/pkg/seaice/seaice_growth.F
ViewVC logotype

Contents of /MITgcm/pkg/seaice/seaice_growth.F

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


Revision 1.160 - (show annotations) (download)
Sun Mar 11 13:43:46 2012 UTC (12 years, 3 months ago) by jmc
Branch: MAIN
Changes since 1.159: +38 -38 lines
rename parameters: SIsalFrac to SEAICE_saltFrac & SIsal0 to SEAICE_salt0

1 C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_growth.F,v 1.159 2012/03/05 15:21:44 gforget 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 constants
95 _RL tempFrz, ICE2SNOW, SNOW2ICE
96 _RL QI, QS, recip_QI
97
98 C-- TmixLoc :: ocean surface/mixed-layer temperature (in K)
99 _RL TmixLoc (1:sNx,1:sNy)
100
101 C a_QbyATM_cover :: available heat (in W/m^2) due to the interaction of
102 C the atmosphere and the ocean surface - for ice covered water
103 C a_QbyATM_open :: same but for open water
104 C r_QbyATM_cover :: residual of a_QbyATM_cover after freezing/melting processes
105 C r_QbyATM_open :: same but for open water
106 _RL a_QbyATM_cover (1:sNx,1:sNy)
107 _RL a_QbyATM_open (1:sNx,1:sNy)
108 _RL r_QbyATM_cover (1:sNx,1:sNy)
109 _RL r_QbyATM_open (1:sNx,1:sNy)
110 C a_QSWbyATM_open - short wave heat flux over ocean in W/m^2
111 C a_QSWbyATM_cover - short wave heat flux under ice in W/m^2
112 _RL a_QSWbyATM_open (1:sNx,1:sNy)
113 _RL a_QSWbyATM_cover (1:sNx,1:sNy)
114 C a_QbyOCN :: available heat (in in W/m^2) due to the
115 C interaction of the ice pack and the ocean surface
116 C r_QbyOCN :: residual of a_QbyOCN after freezing/melting
117 C processes have been accounted for
118 _RL a_QbyOCN (1:sNx,1:sNy)
119 _RL r_QbyOCN (1:sNx,1:sNy)
120
121 C conversion factors to go from Q (W/m2) to HEFF (ice meters)
122 _RL convertQ2HI, convertHI2Q
123 C conversion factors to go from precip (m/s) unit to HEFF (ice meters)
124 _RL convertPRECIP2HI, convertHI2PRECIP
125
126 #ifdef ALLOW_DIAGNOSTICS
127 C ICE/SNOW stocks tendencies associated with the various melt/freeze processes
128 _RL d_AREAbyATM (1:sNx,1:sNy)
129 _RL d_AREAbyOCN (1:sNx,1:sNy)
130 _RL d_AREAbyICE (1:sNx,1:sNy)
131 #endif
132
133 c The change of mean ice thickness due to out-of-bounds values following
134 c sea ice dyhnamics
135 _RL d_HEFFbyNEG (1:sNx,1:sNy)
136
137 c The change of mean ice thickness due to turbulent ocean-sea ice heat fluxes
138 _RL d_HEFFbyOCNonICE (1:sNx,1:sNy)
139
140 c The sum of mean ice thickness increments due to atmospheric fluxes over the open water
141 c fraction and ice-covered fractions of the grid cell
142 _RL d_HEFFbyATMonOCN (1:sNx,1:sNy)
143 c The change of mean ice thickness due to flooding by snow
144 _RL d_HEFFbyFLOODING (1:sNx,1:sNy)
145
146 c The mean ice thickness increments due to atmospheric fluxes over the open water
147 c fraction and ice-covered fractions of the grid cell, respectively
148 _RL d_HEFFbyATMonOCN_open(1:sNx,1:sNy)
149 _RL d_HEFFbyATMonOCN_cover(1:sNx,1:sNy)
150
151 _RL d_HSNWbyNEG (1:sNx,1:sNy)
152 _RL d_HSNWbyATMonSNW (1:sNx,1:sNy)
153 _RL d_HSNWbyOCNonSNW (1:sNx,1:sNy)
154 _RL d_HSNWbyRAIN (1:sNx,1:sNy)
155
156 _RL d_HFRWbyRAIN (1:sNx,1:sNy)
157 C
158 C a_FWbySublim :: fresh water flux implied by latent heat of
159 C sublimation to atmosphere, same sign convention
160 C as EVAP (positive upward)
161 _RL a_FWbySublim (1:sNx,1:sNy)
162 _RL r_FWbySublim (1:sNx,1:sNy)
163 _RL d_HEFFbySublim (1:sNx,1:sNy)
164 _RL d_HSNWbySublim (1:sNx,1:sNy)
165
166 #ifdef SEAICE_CAP_SUBLIM
167 C The latent heat flux which will sublimate all snow and ice
168 C over one time step
169 _RL latentHeatFluxMax (1:sNx,1:sNy)
170 _RL latentHeatFluxMaxMult (1:sNx,1:sNy,MULTDIM)
171 #endif
172
173 C actual ice thickness (with upper and lower limit)
174 _RL heffActual (1:sNx,1:sNy)
175 C actual snow thickness
176 _RL hsnowActual (1:sNx,1:sNy)
177 C actual ice thickness (with lower limit only) Reciprocal
178 _RL recip_heffActual (1:sNx,1:sNy)
179 C local value (=1/HO or 1/HO_south)
180 _RL recip_HO
181 C local value (=1/ice thickness)
182 _RL recip_HH
183
184 C AREA_PRE :: hold sea-ice fraction field before any seaice-thermo update
185 _RL AREApreTH (1:sNx,1:sNy)
186 _RL HEFFpreTH (1:sNx,1:sNy)
187 _RL HSNWpreTH (1:sNx,1:sNy)
188
189 C wind speed
190 _RL UG (1:sNx,1:sNy)
191 #ifdef ALLOW_ATM_WIND
192 _RL SPEED_SQ
193 #endif
194
195 C Regularization values squared
196 _RL area_reg_sq, hice_reg_sq
197
198 C pathological cases thresholds
199 _RL heffTooHeavy
200
201 _RL lhSublim
202
203 C temporary variables available for the various computations
204 _RL tmpscal0, tmpscal1, tmpscal2, tmpscal3, tmpscal4
205 _RL tmparr1 (1:sNx,1:sNy)
206
207 #ifdef SEAICE_VARIABLE_SALINITY
208 _RL saltFluxAdjust (1:sNx,1:sNy)
209 #endif
210
211 INTEGER ilockey
212 INTEGER it
213 _RL pFac
214 _RL ticeInMult (1:sNx,1:sNy,MULTDIM)
215 _RL ticeOutMult (1:sNx,1:sNy,MULTDIM)
216 _RL heffActualMult (1:sNx,1:sNy,MULTDIM)
217 _RL a_QbyATMmult_cover (1:sNx,1:sNy,MULTDIM)
218 _RL a_QSWbyATMmult_cover(1:sNx,1:sNy,MULTDIM)
219 _RL a_FWbySublimMult (1:sNx,1:sNy,MULTDIM)
220 C Helper variables: reciprocal of some constants
221 _RL recip_multDim
222 _RL recip_deltaTtherm
223 _RL recip_rhoIce
224
225 C Factor by which we increase the upper ocean friction velocity (u*) when
226 C ice is absent in a grid cell (dimensionless)
227 _RL MixedLayerTurbulenceFactor
228
229 #ifdef ALLOW_SITRACER
230 INTEGER iTr
231 CHARACTER*8 diagName
232 #endif
233 #ifdef ALLOW_DIAGNOSTICS
234 c Helper variables for diagnostics
235 _RL DIAGarrayA (1:sNx,1:sNy)
236 _RL DIAGarrayB (1:sNx,1:sNy)
237 _RL DIAGarrayC (1:sNx,1:sNy)
238 _RL DIAGarrayD (1:sNx,1:sNy)
239 #endif
240
241
242 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
243
244 C ===================================================================
245 C =================PART 0: constants and initializations=============
246 C ===================================================================
247
248 IF ( buoyancyRelation .EQ. 'OCEANICP' ) THEN
249 kSurface = Nr
250 ELSE
251 kSurface = 1
252 ENDIF
253
254 C avoid unnecessary divisions in loops
255 recip_multDim = SEAICE_multDim
256 recip_multDim = ONE / recip_multDim
257 C above/below: double/single precision calculation of recip_multDim
258 c recip_multDim = 1./float(SEAICE_multDim)
259 recip_deltaTtherm = ONE / SEAICE_deltaTtherm
260 recip_rhoIce = ONE / SEAICE_rhoIce
261
262 C Cutoff for iceload
263 heffTooHeavy=drF(kSurface) / 5. _d 0
264
265 C RATIO OF SEA ICE DENSITY to SNOW DENSITY
266 ICE2SNOW = SEAICE_rhoIce/SEAICE_rhoSnow
267 SNOW2ICE = ONE / ICE2SNOW
268
269 C HEAT OF FUSION OF ICE (J/m^3)
270 QI = SEAICE_rhoIce*SEAICE_lhFusion
271 recip_QI = ONE / QI
272 C HEAT OF FUSION OF SNOW (J/m^3)
273 QS = SEAICE_rhoSnow*SEAICE_lhFusion
274
275 C ICE LATENT HEAT CONSTANT
276 lhSublim = SEAICE_lhEvap + SEAICE_lhFusion
277
278 C regularization constants
279 area_reg_sq = SEAICE_area_reg * SEAICE_area_reg
280 hice_reg_sq = SEAICE_hice_reg * SEAICE_hice_reg
281
282 C conversion factors to go from Q (W/m2) to HEFF (ice meters)
283 convertQ2HI=SEAICE_deltaTtherm/QI
284 convertHI2Q = ONE/convertQ2HI
285 C conversion factors to go from precip (m/s) unit to HEFF (ice meters)
286 convertPRECIP2HI=SEAICE_deltaTtherm*rhoConstFresh/SEAICE_rhoIce
287 convertHI2PRECIP = ONE/convertPRECIP2HI
288
289 DO bj=myByLo(myThid),myByHi(myThid)
290 DO bi=myBxLo(myThid),myBxHi(myThid)
291
292 #ifdef ALLOW_AUTODIFF_TAMC
293 act1 = bi - myBxLo(myThid)
294 max1 = myBxHi(myThid) - myBxLo(myThid) + 1
295 act2 = bj - myByLo(myThid)
296 max2 = myByHi(myThid) - myByLo(myThid) + 1
297 act3 = myThid - 1
298 max3 = nTx*nTy
299 act4 = ikey_dynamics - 1
300 iicekey = (act1 + 1) + act2*max1
301 & + act3*max1*max2
302 & + act4*max1*max2*max3
303 #endif /* ALLOW_AUTODIFF_TAMC */
304
305
306 C array initializations
307 C =====================
308
309 DO J=1,sNy
310 DO I=1,sNx
311 a_QbyATM_cover (I,J) = 0.0 _d 0
312 a_QbyATM_open(I,J) = 0.0 _d 0
313 r_QbyATM_cover (I,J) = 0.0 _d 0
314 r_QbyATM_open (I,J) = 0.0 _d 0
315
316 a_QSWbyATM_open (I,J) = 0.0 _d 0
317 a_QSWbyATM_cover (I,J) = 0.0 _d 0
318
319 a_QbyOCN (I,J) = 0.0 _d 0
320 r_QbyOCN (I,J) = 0.0 _d 0
321
322 #ifdef ALLOW_DIAGNOSTICS
323 d_AREAbyATM(I,J) = 0.0 _d 0
324 d_AREAbyICE(I,J) = 0.0 _d 0
325 d_AREAbyOCN(I,J) = 0.0 _d 0
326 #endif
327
328 d_HEFFbyNEG(I,J) = 0.0 _d 0
329 d_HEFFbyOCNonICE(I,J) = 0.0 _d 0
330 d_HEFFbyATMonOCN(I,J) = 0.0 _d 0
331 d_HEFFbyFLOODING(I,J) = 0.0 _d 0
332
333 d_HEFFbyATMonOCN_open(I,J) = 0.0 _d 0
334 d_HEFFbyATMonOCN_cover(I,J) = 0.0 _d 0
335
336 d_HSNWbyNEG(I,J) = 0.0 _d 0
337 d_HSNWbyATMonSNW(I,J) = 0.0 _d 0
338 d_HSNWbyOCNonSNW(I,J) = 0.0 _d 0
339 d_HSNWbyRAIN(I,J) = 0.0 _d 0
340 a_FWbySublim(I,J) = 0.0 _d 0
341 r_FWbySublim(I,J) = 0.0 _d 0
342 d_HEFFbySublim(I,J) = 0.0 _d 0
343 d_HSNWbySublim(I,J) = 0.0 _d 0
344 #ifdef SEAICE_CAP_SUBLIM
345 latentHeatFluxMax(I,J) = 0.0 _d 0
346 #endif
347 c
348 d_HFRWbyRAIN(I,J) = 0.0 _d 0
349
350 tmparr1(I,J) = 0.0 _d 0
351
352 #ifdef SEAICE_VARIABLE_SALINITY
353 saltFluxAdjust(I,J) = 0.0 _d 0
354 #endif
355 DO IT=1,SEAICE_multDim
356 ticeInMult(I,J,IT) = 0.0 _d 0
357 ticeOutMult(I,J,IT) = 0.0 _d 0
358 a_QbyATMmult_cover(I,J,IT) = 0.0 _d 0
359 a_QSWbyATMmult_cover(I,J,IT) = 0.0 _d 0
360 a_FWbySublimMult(I,J,IT) = 0.0 _d 0
361 # ifdef SEAICE_CAP_SUBLIM
362 latentHeatFluxMaxMult(I,J,IT) = 0.0 _d 0
363 # endif
364 ENDDO
365 ENDDO
366 ENDDO
367 #ifdef ALLOW_MEAN_SFLUX_COST_CONTRIBUTION
368 DO J=1-oLy,sNy+oLy
369 DO I=1-oLx,sNx+oLx
370 frWtrAtm(I,J,bi,bj) = 0.0 _d 0
371 ENDDO
372 ENDDO
373 #endif
374
375
376 C =====================================================================
377 C ===========PART 1: treat pathological cases (post advdiff)===========
378 C =====================================================================
379
380 #ifdef SEAICE_GROWTH_LEGACY
381
382 DO J=1,sNy
383 DO I=1,sNx
384 HEFFpreTH(I,J)=HEFFNM1(I,J,bi,bj)
385 HSNWpreTH(I,J)=HSNOW(I,J,bi,bj)
386 AREApreTH(I,J)=AREANM1(I,J,bi,bj)
387 d_HEFFbyNEG(I,J)=0. _d 0
388 d_HSNWbyNEG(I,J)=0. _d 0
389 #ifdef ALLOW_DIAGNOSTICS
390 DIAGarrayA(I,J) = AREANM1(I,J,bi,bj)
391 DIAGarrayB(I,J) = AREANM1(I,J,bi,bj)
392 DIAGarrayC(I,J) = HEFFNM1(I,J,bi,bj)
393 DIAGarrayD(I,J) = HSNOW(I,J,bi,bj)
394 #endif
395 ENDDO
396 ENDDO
397
398 #else /* SEAICE_GROWTH_LEGACY */
399
400 #if (defined ALLOW_AUTODIFF_TAMC && defined SEAICE_MODIFY_GROWTH_ADJ)
401 Cgf no dependency through pathological cases treatment
402 IF ( SEAICEadjMODE.EQ.0 ) THEN
403 #endif
404
405 C 1) treat the case of negative values:
406
407 #ifdef ALLOW_AUTODIFF_TAMC
408 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
409 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
410 CADJ STORE area(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
411 #endif /* ALLOW_AUTODIFF_TAMC */
412 DO J=1,sNy
413 DO I=1,sNx
414 d_HEFFbyNEG(I,J)=MAX(-HEFF(I,J,bi,bj),0. _d 0)
415 HEFF(I,J,bi,bj)=HEFF(I,J,bi,bj)+d_HEFFbyNEG(I,J)
416 d_HSNWbyNEG(I,J)=MAX(-HSNOW(I,J,bi,bj),0. _d 0)
417 HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)+d_HSNWbyNEG(I,J)
418 AREA(I,J,bi,bj)=MAX(AREA(I,J,bi,bj),0. _d 0)
419 ENDDO
420 ENDDO
421
422 C 1.25) treat the case of very thin ice:
423
424 #ifdef ALLOW_AUTODIFF_TAMC
425 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
426 #endif /* ALLOW_AUTODIFF_TAMC */
427 DO J=1,sNy
428 DO I=1,sNx
429 tmpscal2=0. _d 0
430 tmpscal3=0. _d 0
431 IF (HEFF(I,J,bi,bj).LE.siEps) THEN
432 tmpscal2=-HEFF(I,J,bi,bj)
433 tmpscal3=-HSNOW(I,J,bi,bj)
434 TICE(I,J,bi,bj)=celsius2K
435 DO IT=1,SEAICE_multDim
436 TICES(I,J,IT,bi,bj)=celsius2K
437 ENDDO
438 ENDIF
439 HEFF(I,J,bi,bj)=HEFF(I,J,bi,bj)+tmpscal2
440 d_HEFFbyNEG(I,J)=d_HEFFbyNEG(I,J)+tmpscal2
441 HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)+tmpscal3
442 d_HSNWbyNEG(I,J)=d_HSNWbyNEG(I,J)+tmpscal3
443 ENDDO
444 ENDDO
445
446 C 1.5) treat the case of area but no ice/snow:
447
448 #ifdef ALLOW_AUTODIFF_TAMC
449 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
450 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
451 #endif /* ALLOW_AUTODIFF_TAMC */
452 DO J=1,sNy
453 DO I=1,sNx
454 IF ((HEFF(i,j,bi,bj).EQ.0. _d 0).AND.
455 & (HSNOW(i,j,bi,bj).EQ.0. _d 0)) AREA(I,J,bi,bj)=0. _d 0
456 ENDDO
457 ENDDO
458
459 C 2) treat the case of very small area:
460
461 #ifndef DISABLE_AREA_FLOOR
462 #ifdef ALLOW_AUTODIFF_TAMC
463 CADJ STORE area(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
464 #endif /* ALLOW_AUTODIFF_TAMC */
465 DO J=1,sNy
466 DO I=1,sNx
467 IF ((HEFF(i,j,bi,bj).GT.0).OR.(HSNOW(i,j,bi,bj).GT.0)) THEN
468 AREA(I,J,bi,bj)=MAX(AREA(I,J,bi,bj),SEAICE_area_floor)
469 ENDIF
470 ENDDO
471 ENDDO
472 #endif /* DISABLE_AREA_FLOOR */
473
474 C 2.5) treat case of excessive ice cover, e.g., due to ridging:
475
476 #ifdef ALLOW_AUTODIFF_TAMC
477 CADJ STORE area(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
478 #endif /* ALLOW_AUTODIFF_TAMC */
479 DO J=1,sNy
480 DO I=1,sNx
481 #ifdef ALLOW_DIAGNOSTICS
482 DIAGarrayA(I,J) = AREA(I,J,bi,bj)
483 #endif
484 #ifdef ALLOW_SITRACER
485 SItrAREA(I,J,bi,bj,1)=AREA(I,J,bi,bj)
486 #endif
487 AREA(I,J,bi,bj)=MIN(AREA(I,J,bi,bj),SEAICE_area_max)
488 ENDDO
489 ENDDO
490
491 #if (defined ALLOW_AUTODIFF_TAMC && defined SEAICE_MODIFY_GROWTH_ADJ)
492 ENDIF
493 #endif
494
495 C 3) store regularized values of heff, hsnow, area at the onset of thermo.
496 DO J=1,sNy
497 DO I=1,sNx
498 HEFFpreTH(I,J)=HEFF(I,J,bi,bj)
499 HSNWpreTH(I,J)=HSNOW(I,J,bi,bj)
500 AREApreTH(I,J)=AREA(I,J,bi,bj)
501 #ifdef ALLOW_DIAGNOSTICS
502 DIAGarrayB(I,J) = AREA(I,J,bi,bj)
503 DIAGarrayC(I,J) = HEFF(I,J,bi,bj)
504 DIAGarrayD(I,J) = HSNOW(I,J,bi,bj)
505 #endif
506 #ifdef ALLOW_SITRACER
507 SItrHEFF(I,J,bi,bj,1)=HEFF(I,J,bi,bj)
508 SItrAREA(I,J,bi,bj,2)=AREA(I,J,bi,bj)
509 #endif
510 ENDDO
511 ENDDO
512
513 C 4) treat sea ice salinity pathological cases
514 #ifdef SEAICE_VARIABLE_SALINITY
515 #ifdef ALLOW_AUTODIFF_TAMC
516 CADJ STORE hsalt(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
517 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
518 #endif /* ALLOW_AUTODIFF_TAMC */
519 DO J=1,sNy
520 DO I=1,sNx
521 IF ( (HSALT(I,J,bi,bj) .LT. 0.0).OR.
522 & (HEFF(I,J,bi,bj) .EQ. 0.0) ) THEN
523 saltFluxAdjust(I,J) = - HEFFM(I,J,bi,bj) *
524 & HSALT(I,J,bi,bj) * recip_deltaTtherm
525 HSALT(I,J,bi,bj) = 0.0 _d 0
526 ENDIF
527 ENDDO
528 ENDDO
529 #endif /* SEAICE_VARIABLE_SALINITY */
530
531 #endif /* SEAICE_GROWTH_LEGACY */
532
533 #ifdef ALLOW_DIAGNOSTICS
534 IF ( useDiagnostics ) THEN
535 CALL DIAGNOSTICS_FILL(DIAGarrayA,'SIareaPR',0,1,3,bi,bj,myThid)
536 CALL DIAGNOSTICS_FILL(DIAGarrayB,'SIareaPT',0,1,3,bi,bj,myThid)
537 CALL DIAGNOSTICS_FILL(DIAGarrayC,'SIheffPT',0,1,3,bi,bj,myThid)
538 CALL DIAGNOSTICS_FILL(DIAGarrayD,'SIhsnoPT',0,1,3,bi,bj,myThid)
539 #ifdef ALLOW_SITRACER
540 DO iTr = 1, SItrNumInUse
541 WRITE(diagName,'(A4,I2.2,A2)') 'SItr',iTr,'PT'
542 IF (SItrMate(iTr).EQ.'HEFF') THEN
543 CALL DIAGNOSTICS_FRACT_FILL(
544 I SItracer(1-OLx,1-OLy,bi,bj,iTr),HEFF(1-OLx,1-OLy,bi,bj),
545 I ONE, 1, diagName,0,1,2,bi,bj,myThid )
546 ELSE
547 CALL DIAGNOSTICS_FRACT_FILL(
548 I SItracer(1-OLx,1-OLy,bi,bj,iTr),AREA(1-OLx,1-OLy,bi,bj),
549 I ONE, 1, diagName,0,1,2,bi,bj,myThid )
550 ENDIF
551 ENDDO
552 #endif
553 ENDIF
554 #endif
555
556 #if (defined ALLOW_AUTODIFF_TAMC && defined SEAICE_MODIFY_GROWTH_ADJ)
557 Cgf no additional dependency of air-sea fluxes to ice
558 IF ( SEAICEadjMODE.GE.1 ) THEN
559 DO J=1,sNy
560 DO I=1,sNx
561 HEFFpreTH(I,J) = 0. _d 0
562 HSNWpreTH(I,J) = 0. _d 0
563 AREApreTH(I,J) = 0. _d 0
564 ENDDO
565 ENDDO
566 ENDIF
567 #endif
568
569 C 4) COMPUTE ACTUAL ICE/SNOW THICKNESS; USE MIN/MAX VALUES
570 C TO REGULARIZE SEAICE_SOLVE4TEMP/d_AREA COMPUTATIONS
571
572 #ifdef ALLOW_AUTODIFF_TAMC
573 CADJ STORE AREApreTH = comlev1_bibj, key = iicekey, byte = isbyte
574 CADJ STORE HEFFpreTH = comlev1_bibj, key = iicekey, byte = isbyte
575 CADJ STORE HSNWpreTH = comlev1_bibj, key = iicekey, byte = isbyte
576 #endif /* ALLOW_AUTODIFF_TAMC */
577 DO J=1,sNy
578 DO I=1,sNx
579
580 IF (HEFFpreTH(I,J) .GT. ZERO) THEN
581 #ifdef SEAICE_GROWTH_LEGACY
582 tmpscal1 = MAX(SEAICE_area_reg,AREApreTH(I,J))
583 hsnowActual(I,J) = HSNWpreTH(I,J)/tmpscal1
584 tmpscal2 = HEFFpreTH(I,J)/tmpscal1
585 heffActual(I,J) = MAX(tmpscal2,SEAICE_hice_reg)
586 #else
587 cif regularize AREA with SEAICE_area_reg
588 tmpscal1 = SQRT(AREApreTH(I,J)* AREApreTH(I,J) + area_reg_sq)
589 cif heffActual calculated with the regularized AREA
590 tmpscal2 = HEFFpreTH(I,J) / tmpscal1
591 cif regularize heffActual with SEAICE_hice_reg (add lower bound)
592 heffActual(I,J) = SQRT(tmpscal2 * tmpscal2 + hice_reg_sq)
593 cif hsnowActual calculated with the regularized AREA
594 hsnowActual(I,J) = HSNWpreTH(I,J) / tmpscal1
595 #endif
596 cif regularize the inverse of heffActual by hice_reg
597 recip_heffActual(I,J) = AREApreTH(I,J) /
598 & sqrt(HEFFpreTH(I,J)*HEFFpreTH(I,J) + hice_reg_sq)
599 cif Do not regularize when HEFFpreTH = 0
600 ELSE
601 heffActual(I,J) = ZERO
602 hsnowActual(I,J) = ZERO
603 recip_heffActual(I,J) = ZERO
604 ENDIF
605
606 ENDDO
607 ENDDO
608
609 #if (defined ALLOW_AUTODIFF_TAMC && defined SEAICE_MODIFY_GROWTH_ADJ)
610 CALL ZERO_ADJ_1D( sNx*sNy, heffActual, myThid)
611 CALL ZERO_ADJ_1D( sNx*sNy, hsnowActual, myThid)
612 CALL ZERO_ADJ_1D( sNx*sNy, recip_heffActual, myThid)
613 #endif
614
615 #ifdef SEAICE_CAP_SUBLIM
616 C 5) COMPUTE MAXIMUM LATENT HEAT FLUXES FOR THE CURRENT ICE
617 C AND SNOW THICKNESS
618 DO J=1,sNy
619 DO I=1,sNx
620 c The latent heat flux over the sea ice which
621 c will sublimate all of the snow and ice over one time
622 c step (W/m^2)
623 IF (HEFFpreTH(I,J) .GT. ZERO) THEN
624 latentHeatFluxMax(I,J) = lhSublim * recip_deltaTtherm *
625 & (HEFFpreTH(I,J) * SEAICE_rhoIce +
626 & HSNWpreTH(I,J) * SEAICE_rhoSnow)/AREApreTH(I,J)
627 ELSE
628 latentHeatFluxMax(I,J) = ZERO
629 ENDIF
630 ENDDO
631 ENDDO
632 #endif
633
634 C ===================================================================
635 C ================PART 2: determine heat fluxes/stocks===============
636 C ===================================================================
637
638 C determine available heat due to the atmosphere -- for open water
639 C ================================================================
640
641 DO j=1,sNy
642 DO i=1,sNx
643 C ocean surface/mixed layer temperature
644 TmixLoc(i,j) = theta(i,j,kSurface,bi,bj)+celsius2K
645 C wind speed from exf
646 UG(I,J) = MAX(SEAICE_EPS,wspeed(I,J,bi,bj))
647 ENDDO
648 ENDDO
649
650 #ifdef ALLOW_AUTODIFF_TAMC
651 CADJ STORE qnet(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
652 CADJ STORE qsw(:,:,bi,bj) = comlev1_bibj, key = iicekey,byte=isbyte
653 cCADJ STORE UG = comlev1_bibj, key = iicekey,byte=isbyte
654 cCADJ STORE TmixLoc = comlev1_bibj, key = iicekey,byte=isbyte
655 #endif /* ALLOW_AUTODIFF_TAMC */
656
657 CALL SEAICE_BUDGET_OCEAN(
658 I UG,
659 I TmixLoc,
660 O a_QbyATM_open, a_QSWbyATM_open,
661 I bi, bj, myTime, myIter, myThid )
662
663 C determine available heat due to the atmosphere -- for ice covered water
664 C =======================================================================
665
666 #ifdef ALLOW_ATM_WIND
667 IF (useRelativeWind) THEN
668 C Compute relative wind speed over sea ice.
669 DO J=1,sNy
670 DO I=1,sNx
671 SPEED_SQ =
672 & (uWind(I,J,bi,bj)
673 & +0.5 _d 0*(uVel(i,j,kSurface,bi,bj)
674 & +uVel(i+1,j,kSurface,bi,bj))
675 & -0.5 _d 0*(uice(i,j,bi,bj)+uice(i+1,j,bi,bj)))**2
676 & +(vWind(I,J,bi,bj)
677 & +0.5 _d 0*(vVel(i,j,kSurface,bi,bj)
678 & +vVel(i,j+1,kSurface,bi,bj))
679 & -0.5 _d 0*(vice(i,j,bi,bj)+vice(i,j+1,bi,bj)))**2
680 IF ( SPEED_SQ .LE. SEAICE_EPS_SQ ) THEN
681 UG(I,J)=SEAICE_EPS
682 ELSE
683 UG(I,J)=SQRT(SPEED_SQ)
684 ENDIF
685 ENDDO
686 ENDDO
687 ENDIF
688 #endif
689
690 #ifdef ALLOW_AUTODIFF_TAMC
691 CADJ STORE tice(:,:,bi,bj)
692 CADJ & = comlev1_bibj, key = iicekey, byte = isbyte
693 CADJ STORE hsnowActual = comlev1_bibj, key = iicekey, byte = isbyte
694 CADJ STORE heffActual = comlev1_bibj, key = iicekey, byte = isbyte
695 CADJ STORE UG = comlev1_bibj, key = iicekey, byte = isbyte
696 CADJ STORE tices(:,:,:,bi,bj)
697 CADJ & = comlev1_bibj, key = iicekey, byte = isbyte
698 CADJ STORE salt(:,:,kSurface,bi,bj) = comlev1_bibj,
699 CADJ & key = iicekey, byte = isbyte
700 #endif /* ALLOW_AUTODIFF_TAMC */
701
702 C-- Start loop over multi-categories
703 DO IT=1,SEAICE_multDim
704 c homogeneous distribution between 0 and 2 x heffActual
705 pFac = (2.0 _d 0*real(IT)-1.0 _d 0)*recip_multDim
706 DO J=1,sNy
707 DO I=1,sNx
708 heffActualMult(I,J,IT)= heffActual(I,J)*pFac
709 #ifdef SEAICE_CAP_SUBLIM
710 latentHeatFluxMaxMult(I,J,IT) = latentHeatFluxMax(I,J)*pFac
711 #endif
712 ticeInMult(I,J,IT)=TICES(I,J,IT,bi,bj)
713 ticeOutMult(I,J,IT)=TICES(I,J,IT,bi,bj)
714 TICE(I,J,bi,bj) = ZERO
715 TICES(I,J,IT,bi,bj) = ZERO
716 ENDDO
717 ENDDO
718 ENDDO
719
720 #ifdef ALLOW_AUTODIFF_TAMC
721 CADJ STORE heffActualMult = comlev1_bibj, key = iicekey, byte = isbyte
722 CADJ STORE ticeInMult = comlev1_bibj, key = iicekey, byte = isbyte
723 # ifdef SEAICE_CAP_SUBLIM
724 CADJ STORE latentHeatFluxMaxMult
725 CADJ & = comlev1_bibj, key = iicekey, byte = isbyte
726 # endif
727 CADJ STORE a_QbyATMmult_cover =
728 CADJ & comlev1_bibj, key = iicekey, byte = isbyte
729 CADJ STORE a_QSWbyATMmult_cover =
730 CADJ & comlev1_bibj, key = iicekey, byte = isbyte
731 CADJ STORE a_FWbySublimMult =
732 CADJ & comlev1_bibj, key = iicekey, byte = isbyte
733 #endif /* ALLOW_AUTODIFF_TAMC */
734
735 DO IT=1,SEAICE_multDim
736 CALL SEAICE_SOLVE4TEMP(
737 I UG, heffActualMult(1,1,IT), hsnowActual,
738 #ifdef SEAICE_CAP_SUBLIM
739 I latentHeatFluxMaxMult(1,1,IT),
740 #endif
741 U ticeInMult(1,1,IT), ticeOutMult(1,1,IT),
742 O a_QbyATMmult_cover(1,1,IT), a_QSWbyATMmult_cover(1,1,IT),
743 O a_FWbySublimMult(1,1,IT),
744 I bi, bj, myTime, myIter, myThid )
745 ENDDO
746
747 #ifdef ALLOW_AUTODIFF_TAMC
748 CADJ STORE heffActualMult = comlev1_bibj, key = iicekey, byte = isbyte
749 CADJ STORE ticeOutMult = comlev1_bibj, key = iicekey, byte = isbyte
750 # ifdef SEAICE_CAP_SUBLIM
751 CADJ STORE latentHeatFluxMaxMult
752 CADJ & = comlev1_bibj, key = iicekey, byte = isbyte
753 # endif
754 CADJ STORE a_QbyATMmult_cover =
755 CADJ & comlev1_bibj, key = iicekey, byte = isbyte
756 CADJ STORE a_QSWbyATMmult_cover =
757 CADJ & comlev1_bibj, key = iicekey, byte = isbyte
758 CADJ STORE a_FWbySublimMult =
759 CADJ & comlev1_bibj, key = iicekey, byte = isbyte
760 #endif /* ALLOW_AUTODIFF_TAMC */
761
762 DO IT=1,SEAICE_multDim
763 DO J=1,sNy
764 DO I=1,sNx
765 C update TICE & TICES
766 TICE(I,J,bi,bj) = TICE(I,J,bi,bj)
767 & + ticeOutMult(I,J,IT)*recip_multDim
768 TICES(I,J,IT,bi,bj) = ticeOutMult(I,J,IT)
769 C average over categories
770 a_QbyATM_cover (I,J) = a_QbyATM_cover(I,J)
771 & + a_QbyATMmult_cover(I,J,IT)*recip_multDim
772 a_QSWbyATM_cover (I,J) = a_QSWbyATM_cover(I,J)
773 & + a_QSWbyATMmult_cover(I,J,IT)*recip_multDim
774 a_FWbySublim (I,J) = a_FWbySublim(I,J)
775 & + a_FWbySublimMult(I,J,IT)*recip_multDim
776 ENDDO
777 ENDDO
778 ENDDO
779
780 #ifdef SEAICE_CAP_SUBLIM
781 # ifdef ALLOW_DIAGNOSTICS
782 DO J=1,sNy
783 DO I=1,sNx
784 c The actual latent heat flux realized by SOLVE4TEMP
785 DIAGarrayA(I,J) = a_FWbySublim(I,J) * lhSublim
786 ENDDO
787 ENDDO
788 cif The actual vs. maximum latent heat flux
789 IF ( useDiagnostics ) THEN
790 CALL DIAGNOSTICS_FILL(DIAGarrayA,
791 & 'SIactLHF',0,1,3,bi,bj,myThid)
792 CALL DIAGNOSTICS_FILL(latentHeatFluxMax,
793 & 'SImaxLHF',0,1,3,bi,bj,myThid)
794 ENDIF
795 # endif
796 #endif
797
798 #ifdef ALLOW_AUTODIFF_TAMC
799 CADJ STORE AREApreTH = comlev1_bibj, key = iicekey, byte = isbyte
800 CADJ STORE a_QbyATM_cover = comlev1_bibj, key = iicekey, byte = isbyte
801 CADJ STORE a_QSWbyATM_cover= comlev1_bibj, key = iicekey, byte = isbyte
802 CADJ STORE a_QbyATM_open = comlev1_bibj, key = iicekey, byte = isbyte
803 CADJ STORE a_QSWbyATM_open = comlev1_bibj, key = iicekey, byte = isbyte
804 CADJ STORE a_FWbySublim = comlev1_bibj, key = iicekey, byte = isbyte
805 #endif /* ALLOW_AUTODIFF_TAMC */
806
807 C switch heat fluxes from W/m2 to 'effective' ice meters
808 DO J=1,sNy
809 DO I=1,sNx
810 a_QbyATM_cover(I,J) = a_QbyATM_cover(I,J)
811 & * convertQ2HI * AREApreTH(I,J)
812 a_QSWbyATM_cover(I,J) = a_QSWbyATM_cover(I,J)
813 & * convertQ2HI * AREApreTH(I,J)
814 a_QbyATM_open(I,J) = a_QbyATM_open(I,J)
815 & * convertQ2HI * ( ONE - AREApreTH(I,J) )
816 a_QSWbyATM_open(I,J) = a_QSWbyATM_open(I,J)
817 & * convertQ2HI * ( ONE - AREApreTH(I,J) )
818 C and initialize r_QbyATM_cover/r_QbyATM_open
819 r_QbyATM_cover(I,J)=a_QbyATM_cover(I,J)
820 r_QbyATM_open(I,J)=a_QbyATM_open(I,J)
821 C Convert fresh water flux by sublimation to 'effective' ice meters.
822 C Negative sublimation is resublimation and will be added as snow.
823 #ifdef SEAICE_DISABLE_SUBLIM
824 cgf just for those who may need to omit this term to reproduce old results
825 a_FWbySublim(I,J) = ZERO
826 #endif /* SEAICE_CAP_SUBLIM */
827 a_FWbySublim(I,J) = SEAICE_deltaTtherm*recip_rhoIce
828 & * a_FWbySublim(I,J)*AREApreTH(I,J)
829 r_FWbySublim(I,J)=a_FWbySublim(I,J)
830 ENDDO
831 ENDDO
832
833 #ifdef ALLOW_AUTODIFF_TAMC
834 CADJ STORE AREApreTH = comlev1_bibj, key = iicekey, byte = isbyte
835 CADJ STORE a_QbyATM_cover = comlev1_bibj, key = iicekey, byte = isbyte
836 CADJ STORE a_QSWbyATM_cover= comlev1_bibj, key = iicekey, byte = isbyte
837 CADJ STORE a_QbyATM_open = comlev1_bibj, key = iicekey, byte = isbyte
838 CADJ STORE a_QSWbyATM_open = comlev1_bibj, key = iicekey, byte = isbyte
839 CADJ STORE a_FWbySublim = comlev1_bibj, key = iicekey, byte = isbyte
840 CADJ STORE r_QbyATM_cover = comlev1_bibj, key = iicekey, byte = isbyte
841 CADJ STORE r_QbyATM_open = comlev1_bibj, key = iicekey, byte = isbyte
842 CADJ STORE r_FWbySublim = comlev1_bibj, key = iicekey, byte = isbyte
843 #endif /* ALLOW_AUTODIFF_TAMC */
844
845 #if (defined ALLOW_AUTODIFF_TAMC && defined SEAICE_MODIFY_GROWTH_ADJ)
846 Cgf no additional dependency through ice cover
847 IF ( SEAICEadjMODE.GE.3 ) THEN
848 DO J=1,sNy
849 DO I=1,sNx
850 a_QbyATM_cover(I,J) = 0. _d 0
851 r_QbyATM_cover(I,J) = 0. _d 0
852 a_QSWbyATM_cover(I,J) = 0. _d 0
853 ENDDO
854 ENDDO
855 ENDIF
856 #endif
857
858 C determine available heat due to the ice pack tying the
859 C underlying surface water temperature to freezing point
860 C ======================================================
861
862 #ifdef ALLOW_AUTODIFF_TAMC
863 CADJ STORE theta(:,:,kSurface,bi,bj) = comlev1_bibj,
864 CADJ & key = iicekey, byte = isbyte
865 CADJ STORE salt(:,:,kSurface,bi,bj) = comlev1_bibj,
866 CADJ & key = iicekey, byte = isbyte
867 #endif
868
869 DO J=1,sNy
870 DO I=1,sNx
871 c FREEZING TEMP. OF SEA WATER (deg C)
872 tempFrz = SEAICE_tempFrz0 +
873 & SEAICE_dTempFrz_dS *salt(I,J,kSurface,bi,bj)
874 c efficiency of turbulent fluxes : dependency to sign of THETA-TBC
875 IF ( theta(I,J,kSurface,bi,bj) .GE. tempFrz ) THEN
876 tmpscal1 = SEAICE_mcPheePiston
877 ELSE
878 tmpscal1 =SEAICE_frazilFrac*drF(kSurface)/SEAICE_deltaTtherm
879 ENDIF
880 c efficiency of turbulent fluxes : dependency to AREA (McPhee cases)
881 IF ( (AREApreTH(I,J) .GT. 0. _d 0).AND.
882 & (.NOT.SEAICE_mcPheeStepFunc) ) THEN
883 MixedLayerTurbulenceFactor = ONE -
884 & SEAICE_mcPheeTaper * AREApreTH(I,J)
885 ELSEIF ( (AREApreTH(I,J) .GT. 0. _d 0).AND.
886 & (SEAICE_mcPheeStepFunc) ) THEN
887 MixedLayerTurbulenceFactor = ONE - SEAICE_mcPheeTaper
888 ELSE
889 MixedLayerTurbulenceFactor = ONE
890 ENDIF
891 c maximum turbulent flux, in ice meters
892 tmpscal2= - (HeatCapacity_Cp*rhoConst * recip_QI)
893 & * (theta(I,J,kSurface,bi,bj)-tempFrz)
894 & * SEAICE_deltaTtherm * maskC(i,j,kSurface,bi,bj)
895 c available turbulent flux
896 a_QbyOCN(i,j) =
897 & tmpscal1 * tmpscal2 * MixedLayerTurbulenceFactor
898 r_QbyOCN(i,j) = a_QbyOCN(i,j)
899 ENDDO
900 ENDDO
901
902 #if (defined ALLOW_AUTODIFF_TAMC && defined SEAICE_MODIFY_GROWTH_ADJ)
903 CALL ZERO_ADJ_1D( sNx*sNy, r_QbyOCN, myThid)
904 #endif
905
906
907 C ===================================================================
908 C =========PART 3: determine effective thicknesses increments========
909 C ===================================================================
910
911 C compute snow/ice tendency due to sublimation
912 C ============================================
913
914 #ifdef ALLOW_AUTODIFF_TAMC
915 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
916 CADJ STORE r_FWbySublim = comlev1_bibj,key=iicekey,byte=isbyte
917 #endif /* ALLOW_AUTODIFF_TAMC */
918 DO J=1,sNy
919 DO I=1,sNx
920 C First sublimate/deposite snow
921 tmpscal2 =
922 & MAX(MIN(r_FWbySublim(I,J),HSNOW(I,J,bi,bj)*SNOW2ICE),ZERO)
923 d_HSNWbySublim(I,J) = - tmpscal2 * ICE2SNOW
924 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj) - tmpscal2*ICE2SNOW
925 r_FWbySublim(I,J) = r_FWbySublim(I,J) - tmpscal2
926 ENDDO
927 ENDDO
928 #ifdef ALLOW_AUTODIFF_TAMC
929 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
930 CADJ STORE r_FWbySublim = comlev1_bibj,key=iicekey,byte=isbyte
931 #endif /* ALLOW_AUTODIFF_TAMC */
932 DO J=1,sNy
933 DO I=1,sNx
934 C If anything is left, sublimate ice
935 tmpscal2 =
936 & MAX(MIN(r_FWbySublim(I,J),HEFF(I,J,bi,bj)),ZERO)
937 d_HEFFbySublim(I,J) = - tmpscal2
938 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) - tmpscal2
939 r_FWbySublim(I,J) = r_FWbySublim(I,J) - tmpscal2
940 ENDDO
941 ENDDO
942 DO J=1,sNy
943 DO I=1,sNx
944 C If anything is left, it will be evaporated from the ocean rather than sublimated.
945 C Since a_QbyATM_cover was computed for sublimation, not simple evapation, we need to
946 C remove the fusion part for the residual (that happens to be precisely r_FWbySublim).
947 a_QbyATM_cover(I,J) = a_QbyATM_cover(I,J)-r_FWbySublim(I,J)
948 r_QbyATM_cover(I,J) = r_QbyATM_cover(I,J)-r_FWbySublim(I,J)
949 ENDDO
950 ENDDO
951
952 C compute ice thickness tendency due to ice-ocean interaction
953 C ===========================================================
954
955 #ifdef ALLOW_AUTODIFF_TAMC
956 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
957 CADJ STORE r_QbyOCN = comlev1_bibj,key=iicekey,byte=isbyte
958 #endif /* ALLOW_AUTODIFF_TAMC */
959
960 DO J=1,sNy
961 DO I=1,sNx
962 d_HEFFbyOCNonICE(I,J)=MAX(r_QbyOCN(i,j), -HEFF(I,J,bi,bj))
963 r_QbyOCN(I,J)=r_QbyOCN(I,J)-d_HEFFbyOCNonICE(I,J)
964 HEFF(I,J,bi,bj)=HEFF(I,J,bi,bj) + d_HEFFbyOCNonICE(I,J)
965 #ifdef ALLOW_SITRACER
966 SItrHEFF(I,J,bi,bj,2)=HEFF(I,J,bi,bj)
967 #endif
968 ENDDO
969 ENDDO
970
971 C compute snow melt tendency due to snow-atmosphere interaction
972 C ==================================================================
973
974 #ifdef ALLOW_AUTODIFF_TAMC
975 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
976 CADJ STORE r_QbyATM_cover = comlev1_bibj,key=iicekey,byte=isbyte
977 #endif /* ALLOW_AUTODIFF_TAMC */
978
979 DO J=1,sNy
980 DO I=1,sNx
981 C Convert to standard units (meters of ice) rather than to meters
982 C of snow. This appears to be more robust.
983 tmpscal1=MAX(r_QbyATM_cover(I,J),-HSNOW(I,J,bi,bj)*SNOW2ICE)
984 tmpscal2=MIN(tmpscal1,0. _d 0)
985 #ifdef SEAICE_MODIFY_GROWTH_ADJ
986 Cgf no additional dependency through snow
987 IF ( SEAICEadjMODE.GE.2 ) tmpscal2 = 0. _d 0
988 #endif
989 d_HSNWbyATMonSNW(I,J)= tmpscal2*ICE2SNOW
990 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj) + tmpscal2*ICE2SNOW
991 r_QbyATM_cover(I,J)=r_QbyATM_cover(I,J) - tmpscal2
992 ENDDO
993 ENDDO
994
995 C compute ice thickness tendency due to the atmosphere
996 C ====================================================
997
998 #ifdef ALLOW_AUTODIFF_TAMC
999 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1000 CADJ STORE r_QbyATM_cover = comlev1_bibj,key=iicekey,byte=isbyte
1001 #endif /* ALLOW_AUTODIFF_TAMC */
1002
1003 Cgf note: this block is not actually tested by lab_sea
1004 Cgf where all experiments start in January. So even though
1005 Cgf the v1.81=>v1.82 revision would change results in
1006 Cgf warming conditions, the lab_sea results were not changed.
1007
1008 DO J=1,sNy
1009 DO I=1,sNx
1010
1011 #ifdef SEAICE_GROWTH_LEGACY
1012 tmpscal2 = MAX(-HEFF(I,J,bi,bj),r_QbyATM_cover(I,J))
1013 #else
1014 tmpscal2 = MAX(-HEFF(I,J,bi,bj),r_QbyATM_cover(I,J)+
1015 c Limit ice growth by potential melt by ocean
1016 & AREApreTH(I,J) * r_QbyOCN(I,J))
1017 #endif /* SEAICE_GROWTH_LEGACY */
1018
1019 d_HEFFbyATMonOCN_cover(I,J)=tmpscal2
1020 d_HEFFbyATMonOCN(I,J)=d_HEFFbyATMonOCN(I,J)+tmpscal2
1021 r_QbyATM_cover(I,J)=r_QbyATM_cover(I,J)-tmpscal2
1022 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) + tmpscal2
1023
1024 #ifdef ALLOW_SITRACER
1025 SItrHEFF(I,J,bi,bj,3)=HEFF(I,J,bi,bj)
1026 #endif
1027 ENDDO
1028 ENDDO
1029
1030 C attribute precip to fresh water or snow stock,
1031 C depending on atmospheric conditions.
1032 C =================================================
1033 #ifdef ALLOW_ATM_TEMP
1034 #ifdef ALLOW_AUTODIFF_TAMC
1035 CADJ STORE a_QbyATM_cover = comlev1_bibj,key=iicekey,byte=isbyte
1036 CADJ STORE PRECIP(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1037 CADJ STORE AREApreTH = comlev1_bibj,key=iicekey,byte=isbyte
1038 #endif /* ALLOW_AUTODIFF_TAMC */
1039 DO J=1,sNy
1040 DO I=1,sNx
1041 C possible alternatives to the a_QbyATM_cover criterium
1042 c IF (TICE(I,J,bi,bj) .LT. TMIX) THEN
1043 c IF (atemp(I,J,bi,bj) .LT. celsius2K) THEN
1044 IF ( a_QbyATM_cover(I,J).GE. 0. _d 0 ) THEN
1045 C add precip as snow
1046 d_HFRWbyRAIN(I,J)=0. _d 0
1047 d_HSNWbyRAIN(I,J)=convertPRECIP2HI*ICE2SNOW*
1048 & PRECIP(I,J,bi,bj)*AREApreTH(I,J)
1049 ELSE
1050 C add precip to the fresh water bucket
1051 d_HFRWbyRAIN(I,J)=-convertPRECIP2HI*
1052 & PRECIP(I,J,bi,bj)*AREApreTH(I,J)
1053 d_HSNWbyRAIN(I,J)=0. _d 0
1054 ENDIF
1055 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj) + d_HSNWbyRAIN(I,J)
1056 ENDDO
1057 ENDDO
1058 Cgf note: this does not affect air-sea heat flux,
1059 Cgf since the implied air heat gain to turn
1060 Cgf rain to snow is not a surface process.
1061 #endif /* ALLOW_ATM_TEMP */
1062
1063 C compute snow melt due to heat available from ocean.
1064 C =================================================================
1065
1066 Cgf do we need to keep this comment and cpp bracket?
1067 Cph( very sensitive bit here by JZ
1068 #ifndef SEAICE_EXCLUDE_FOR_EXACT_AD_TESTING
1069 #ifdef ALLOW_AUTODIFF_TAMC
1070 CADJ STORE HSNOW(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1071 CADJ STORE r_QbyOCN = comlev1_bibj,key=iicekey,byte=isbyte
1072 #endif /* ALLOW_AUTODIFF_TAMC */
1073 DO J=1,sNy
1074 DO I=1,sNx
1075 tmpscal1=MAX(r_QbyOCN(i,j)*ICE2SNOW, -HSNOW(I,J,bi,bj))
1076 tmpscal2=MIN(tmpscal1,0. _d 0)
1077 #ifdef SEAICE_MODIFY_GROWTH_ADJ
1078 Cgf no additional dependency through snow
1079 if ( SEAICEadjMODE.GE.2 ) tmpscal2 = 0. _d 0
1080 #endif
1081 d_HSNWbyOCNonSNW(I,J) = tmpscal2
1082 r_QbyOCN(I,J)=r_QbyOCN(I,J)
1083 & -d_HSNWbyOCNonSNW(I,J)*SNOW2ICE
1084 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)+d_HSNWbyOCNonSNW(I,J)
1085 ENDDO
1086 ENDDO
1087 #endif /* SEAICE_EXCLUDE_FOR_EXACT_AD_TESTING */
1088 Cph)
1089
1090 C gain of new ice over open water
1091 C ===============================
1092 #ifdef ALLOW_AUTODIFF_TAMC
1093 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1094 CADJ STORE r_QbyATM_open = comlev1_bibj,key=iicekey,byte=isbyte
1095 CADJ STORE r_QbyOCN = comlev1_bibj,key=iicekey,byte=isbyte
1096 CADJ STORE a_QSWbyATM_cover = comlev1_bibj,key=iicekey,byte=isbyte
1097 CADJ STORE a_QSWbyATM_open = comlev1_bibj,key=iicekey,byte=isbyte
1098 #endif /* ALLOW_AUTODIFF_TAMC */
1099
1100 DO J=1,sNy
1101 DO I=1,sNx
1102 c Initial ice growth is triggered by open water
1103 c heat flux overcoming potential melt by ocean
1104 tmpscal1=r_QbyATM_open(I,J)+r_QbyOCN(i,j) *
1105 & (1.0 _d 0 - AREApreTH(I,J))
1106 c Penetrative shortwave flux beyond first layer
1107 c that is therefore not available to ice growth/melt
1108 tmpscal2=SWFracB * a_QSWbyATM_open(I,J)
1109 C impose -HEFF as the maxmum melting if SEAICE_doOpenWaterMelt
1110 C or 0. otherwise (no melting if not SEAICE_doOpenWaterMelt)
1111 tmpscal3=facOpenGrow*MAX(tmpscal1-tmpscal2,
1112 & -HEFF(I,J,bi,bj)*facOpenMelt)*HEFFM(I,J,bi,bj)
1113 d_HEFFbyATMonOCN_open(I,J)=tmpscal3
1114 d_HEFFbyATMonOCN(I,J)=d_HEFFbyATMonOCN(I,J)+tmpscal3
1115 r_QbyATM_open(I,J)=r_QbyATM_open(I,J)-tmpscal3
1116 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) + tmpscal3
1117 ENDDO
1118 ENDDO
1119
1120 #ifdef ALLOW_SITRACER
1121 DO J=1,sNy
1122 DO I=1,sNx
1123 c needs to be here to allow use also with LEGACY branch
1124 SItrHEFF(I,J,bi,bj,4)=HEFF(I,J,bi,bj)
1125 ENDDO
1126 ENDDO
1127 #endif
1128
1129 C convert snow to ice if submerged.
1130 C =================================
1131
1132 #ifndef SEAICE_GROWTH_LEGACY
1133 C note: in legacy, this process is done at the end
1134 #ifdef ALLOW_AUTODIFF_TAMC
1135 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1136 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1137 #endif /* ALLOW_AUTODIFF_TAMC */
1138 IF ( SEAICEuseFlooding ) THEN
1139 DO J=1,sNy
1140 DO I=1,sNx
1141 tmpscal0 = (HSNOW(I,J,bi,bj)*SEAICE_rhoSnow
1142 & +HEFF(I,J,bi,bj)*SEAICE_rhoIce)*recip_rhoConst
1143 tmpscal1 = MAX( 0. _d 0, tmpscal0 - HEFF(I,J,bi,bj))
1144 d_HEFFbyFLOODING(I,J)=tmpscal1
1145 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj)+d_HEFFbyFLOODING(I,J)
1146 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)-
1147 & d_HEFFbyFLOODING(I,J)*ICE2SNOW
1148 ENDDO
1149 ENDDO
1150 ENDIF
1151 #endif /* SEAICE_GROWTH_LEGACY */
1152
1153 C ===================================================================
1154 C ==========PART 4: determine ice cover fraction increments=========-
1155 C ===================================================================
1156
1157 #ifdef ALLOW_AUTODIFF_TAMC
1158 CADJ STORE d_HEFFbyATMonOCN = comlev1_bibj,key=iicekey,byte=isbyte
1159 CADJ STORE d_HEFFbyATMonOCN_cover = comlev1_bibj,key=iicekey,byte=isbyte
1160 CADJ STORE d_HEFFbyATMonOCN_open = comlev1_bibj,key=iicekey,byte=isbyte
1161 CADJ STORE d_HEFFbyOCNonICE = comlev1_bibj,key=iicekey,byte=isbyte
1162 CADJ STORE recip_heffActual = comlev1_bibj,key=iicekey,byte=isbyte
1163 CADJ STORE d_hsnwbyatmonsnw = comlev1_bibj,key=iicekey,byte=isbyte
1164 cph(
1165 cphCADJ STORE d_AREAbyATM = comlev1_bibj,key=iicekey,byte=isbyte
1166 cphCADJ STORE d_AREAbyICE = comlev1_bibj,key=iicekey,byte=isbyte
1167 cphCADJ STORE d_AREAbyOCN = comlev1_bibj,key=iicekey,byte=isbyte
1168 cph)
1169 CADJ STORE a_QbyATM_open = comlev1_bibj,key=iicekey,byte=isbyte
1170 CADJ STORE heffActual = comlev1_bibj,key=iicekey,byte=isbyte
1171 CADJ STORE AREApreTH = comlev1_bibj,key=iicekey,byte=isbyte
1172 CADJ STORE HEFF(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1173 CADJ STORE HSNOW(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1174 CADJ STORE AREA(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1175 #endif /* ALLOW_AUTODIFF_TAMC */
1176
1177 DO J=1,sNy
1178 DO I=1,sNx
1179
1180 IF ( YC(I,J,bi,bj) .LT. ZERO ) THEN
1181 recip_HO=1. _d 0 / HO_south
1182 ELSE
1183 recip_HO=1. _d 0 / HO
1184 ENDIF
1185 #ifdef SEAICE_GROWTH_LEGACY
1186 tmpscal0=HEFF(I,J,bi,bj) - d_HEFFbyATMonOCN(I,J)
1187 recip_HH = AREApreTH(I,J) /(tmpscal0+.00001 _d 0)
1188 #else
1189 recip_HH = recip_heffActual(I,J)
1190 #endif
1191
1192 C gain of ice over open water : computed from
1193 C (SEAICE_areaGainFormula.EQ.1) from growth by ATM
1194 C (SEAICE_areaGainFormula.EQ.2) from predicted growth by ATM
1195 IF (SEAICE_areaGainFormula.EQ.1) THEN
1196 tmpscal4 = MAX(ZERO,d_HEFFbyATMonOCN_open(I,J))
1197 ELSE
1198 tmpscal4=MAX(ZERO,a_QbyATM_open(I,J))
1199 ENDIF
1200
1201 C loss of ice cover by melting : computed from
1202 C (SEAICE_areaLossFormula.EQ.1) from all but only melt conributions by ATM and OCN
1203 C (SEAICE_areaLossFormula.EQ.2) from net melt-growth>0 by ATM and OCN
1204 C (SEAICE_areaLossFormula.EQ.3) from predicted melt by ATM
1205 IF (SEAICE_areaLossFormula.EQ.1) THEN
1206 tmpscal3 = MIN( 0. _d 0 , d_HEFFbyATMonOCN_cover(I,J) )
1207 & + MIN( 0. _d 0 , d_HEFFbyATMonOCN_open(I,J) )
1208 & + MIN( 0. _d 0 , d_HEFFbyOCNonICE(I,J) )
1209 ELSEIF (SEAICE_areaLossFormula.EQ.2) THEN
1210 tmpscal3 = MIN( 0. _d 0 , d_HEFFbyATMonOCN_cover(I,J)
1211 & + d_HEFFbyATMonOCN_open(I,J) + d_HEFFbyOCNonICE(I,J) )
1212 ELSE
1213 C compute heff after ice melt by ocn:
1214 tmpscal0=HEFF(I,J,bi,bj) - d_HEFFbyATMonOCN(I,J)
1215 C compute available heat left after snow melt by atm:
1216 tmpscal1= a_QbyATM_open(I,J)+a_QbyATM_cover(I,J)
1217 & - d_HSNWbyATMonSNW(I,J)*SNOW2ICE
1218 C could not melt more than all the ice
1219 tmpscal2 = MAX(-tmpscal0,tmpscal1)
1220 tmpscal3 = MIN(ZERO,tmpscal2)
1221 ENDIF
1222
1223 C apply tendency
1224 IF ( (HEFF(i,j,bi,bj).GT.0. _d 0).OR.
1225 & (HSNOW(i,j,bi,bj).GT.0. _d 0) ) THEN
1226 AREA(I,J,bi,bj)=MAX(0. _d 0,
1227 & MIN( SEAICE_area_max, AREA(I,J,bi,bj)
1228 & + recip_HO*tmpscal4+HALF*recip_HH*tmpscal3 ))
1229 ELSE
1230 AREA(I,J,bi,bj)=0. _d 0
1231 ENDIF
1232 #ifdef ALLOW_SITRACER
1233 SItrAREA(I,J,bi,bj,3)=AREA(I,J,bi,bj)
1234 #endif
1235 #ifdef ALLOW_DIAGNOSTICS
1236 d_AREAbyATM(I,J)=
1237 & recip_HO*MAX(ZERO,d_HEFFbyATMonOCN_open(I,J))
1238 & +HALF*recip_HH*MIN(0. _d 0,d_HEFFbyATMonOCN_open(I,J))
1239 d_AREAbyICE(I,J)=
1240 & HALF*recip_HH*MIN(0. _d 0,d_HEFFbyATMonOCN_cover(I,J))
1241 d_AREAbyOCN(I,J)=
1242 & HALF*recip_HH*MIN( 0. _d 0,d_HEFFbyOCNonICE(I,J) )
1243 #endif
1244 ENDDO
1245 ENDDO
1246
1247 #if (defined ALLOW_AUTODIFF_TAMC && defined SEAICE_MODIFY_GROWTH_ADJ)
1248 Cgf 'bulk' linearization of area=f(HEFF)
1249 IF ( SEAICEadjMODE.GE.1 ) THEN
1250 DO J=1,sNy
1251 DO I=1,sNx
1252 C AREA(I,J,bi,bj) = 0.1 _d 0 * HEFF(I,J,bi,bj)
1253 AREA(I,J,bi,bj) = AREApreTH(I,J) + 0.1 _d 0 *
1254 & ( HEFF(I,J,bi,bj) - HEFFpreTH(I,J) )
1255 ENDDO
1256 ENDDO
1257 ENDIF
1258 #endif
1259
1260 C ===================================================================
1261 C =============PART 5: determine ice salinity increments=============
1262 C ===================================================================
1263
1264 #ifndef SEAICE_VARIABLE_SALINITY
1265 # if (defined ALLOW_AUTODIFF_TAMC && defined ALLOW_SALT_PLUME)
1266 CADJ STORE d_HEFFbyNEG = comlev1_bibj,key=iicekey,byte=isbyte
1267 CADJ STORE d_HEFFbyOCNonICE = comlev1_bibj,key=iicekey,byte=isbyte
1268 CADJ STORE d_HEFFbyATMonOCN = comlev1_bibj,key=iicekey,byte=isbyte
1269 CADJ STORE d_HEFFbyATMonOCN_open = comlev1_bibj,key=iicekey,byte=isbyte
1270 CADJ STORE d_HEFFbyATMonOCN_cover = comlev1_bibj,key=iicekey,byte=isbyte
1271 CADJ STORE d_HEFFbyFLOODING = comlev1_bibj,key=iicekey,byte=isbyte
1272 CADJ STORE d_HEFFbySublim = comlev1_bibj,key=iicekey,byte=isbyte
1273 CADJ STORE salt(:,:,kSurface,bi,bj) = comlev1_bibj,
1274 CADJ & key = iicekey, byte = isbyte
1275 # endif /* ALLOW_AUTODIFF_TAMC and ALLOW_SALT_PLUME */
1276 DO J=1,sNy
1277 DO I=1,sNx
1278 tmpscal1 = d_HEFFbyNEG(I,J) + d_HEFFbyOCNonICE(I,J) +
1279 & d_HEFFbyATMonOCN(I,J) + d_HEFFbyFLOODING(I,J)
1280 & + d_HEFFbySublim(I,J)
1281 tmpscal2 = tmpscal1 * SEAICE_salt0 * HEFFM(I,J,bi,bj)
1282 & * recip_deltaTtherm * SEAICE_rhoIce
1283 saltFlux(I,J,bi,bj) = tmpscal2
1284 #ifdef ALLOW_SALT_PLUME
1285 tmpscal3 = tmpscal1*salt(I,J,kSurface,bi,bj)*HEFFM(I,J,bi,bj)
1286 & * recip_deltaTtherm * SEAICE_rhoIce
1287 saltPlumeFlux(I,J,bi,bj) = MAX( tmpscal3-tmpscal2 , 0. _d 0)
1288 & *SPsalFRAC
1289 #endif /* ALLOW_SALT_PLUME */
1290 ENDDO
1291 ENDDO
1292 #endif
1293
1294 #ifdef SEAICE_VARIABLE_SALINITY
1295
1296 #ifdef SEAICE_GROWTH_LEGACY
1297 # ifdef ALLOW_AUTODIFF_TAMC
1298 CADJ STORE hsalt(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1299 # endif /* ALLOW_AUTODIFF_TAMC */
1300 DO J=1,sNy
1301 DO I=1,sNx
1302 C set HSALT = 0 if HSALT < 0 and compute salt to remove from ocean
1303 IF ( HSALT(I,J,bi,bj) .LT. 0.0 ) THEN
1304 saltFluxAdjust(I,J) = - HEFFM(I,J,bi,bj) *
1305 & HSALT(I,J,bi,bj) * recip_deltaTtherm
1306 HSALT(I,J,bi,bj) = 0.0 _d 0
1307 ENDIF
1308 ENDDO
1309 ENDDO
1310 #endif /* SEAICE_GROWTH_LEGACY */
1311
1312 #ifdef ALLOW_AUTODIFF_TAMC
1313 CADJ STORE hsalt(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1314 #endif /* ALLOW_AUTODIFF_TAMC */
1315
1316 DO J=1,sNy
1317 DO I=1,sNx
1318 C sum up the terms that affect the salt content of the ice pack
1319 tmpscal1=d_HEFFbyOCNonICE(I,J)+d_HEFFbyATMonOCN(I,J)
1320
1321 C recompute HEFF before thermodynamic updates (which is not AREApreTH in legacy code)
1322 tmpscal2=HEFF(I,J,bi,bj)-tmpscal1-d_HEFFbyFLOODING(I,J)
1323 C tmpscal1 > 0 : m of sea ice that is created
1324 IF ( tmpscal1 .GE. 0.0 ) THEN
1325 saltFlux(I,J,bi,bj) =
1326 & HEFFM(I,J,bi,bj)*recip_deltaTtherm
1327 & *SEAICE_saltFrac*salt(I,J,kSurface,bi,bj)
1328 & *tmpscal1*SEAICE_rhoIce
1329 #ifdef ALLOW_SALT_PLUME
1330 C saltPlumeFlux is defined only during freezing:
1331 saltPlumeFlux(I,J,bi,bj)=
1332 & HEFFM(I,J,bi,bj)*recip_deltaTtherm
1333 & *(ONE-SEAICE_saltFrac)*salt(I,J,kSurface,bi,bj)
1334 & *tmpscal1*SEAICE_rhoIce
1335 & *SPsalFRAC
1336 C if SaltPlumeSouthernOcean=.FALSE. turn off salt plume in Southern Ocean
1337 IF ( .NOT. SaltPlumeSouthernOcean ) THEN
1338 IF ( YC(I,J,bi,bj) .LT. 0.0 _d 0 )
1339 & saltPlumeFlux(i,j,bi,bj) = 0.0 _d 0
1340 ENDIF
1341 #endif /* ALLOW_SALT_PLUME */
1342
1343 C tmpscal1 < 0 : m of sea ice that is melted
1344 ELSE
1345 saltFlux(I,J,bi,bj) =
1346 & HEFFM(I,J,bi,bj)*recip_deltaTtherm
1347 & *HSALT(I,J,bi,bj)
1348 & *tmpscal1/tmpscal2
1349 #ifdef ALLOW_SALT_PLUME
1350 saltPlumeFlux(i,j,bi,bj) = 0.0 _d 0
1351 #endif /* ALLOW_SALT_PLUME */
1352 ENDIF
1353 C update HSALT based on surface saltFlux
1354 HSALT(I,J,bi,bj) = HSALT(I,J,bi,bj) +
1355 & saltFlux(I,J,bi,bj) * SEAICE_deltaTtherm
1356 saltFlux(I,J,bi,bj) =
1357 & saltFlux(I,J,bi,bj) + saltFluxAdjust(I,J)
1358 #ifdef SEAICE_GROWTH_LEGACY
1359 C set HSALT = 0 if HEFF = 0 and compute salt to dump into ocean
1360 IF ( HEFF(I,J,bi,bj) .EQ. 0.0 ) THEN
1361 saltFlux(I,J,bi,bj) = saltFlux(I,J,bi,bj) -
1362 & HEFFM(I,J,bi,bj) * HSALT(I,J,bi,bj) * recip_deltaTtherm
1363 HSALT(I,J,bi,bj) = 0.0 _d 0
1364 #ifdef ALLOW_SALT_PLUME
1365 saltPlumeFlux(i,j,bi,bj) = 0.0 _d 0
1366 #endif /* ALLOW_SALT_PLUME */
1367 ENDIF
1368 #endif /* SEAICE_GROWTH_LEGACY */
1369 ENDDO
1370 ENDDO
1371 #endif /* SEAICE_VARIABLE_SALINITY */
1372
1373
1374 C =======================================================================
1375 C ==LEGACY PART 6 (LEGACY) treat pathological cases, then do flooding ===
1376 C =======================================================================
1377
1378 #ifdef SEAICE_GROWTH_LEGACY
1379
1380 C treat values of ice cover fraction oustide
1381 C the [0 1] range, and other such issues.
1382 C ===========================================
1383
1384 Cgf note: this part cannot be heat and water conserving
1385
1386 #ifdef ALLOW_AUTODIFF_TAMC
1387 CADJ STORE area(:,:,bi,bj) = comlev1_bibj,
1388 CADJ & key = iicekey, byte = isbyte
1389 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,
1390 CADJ & key = iicekey, byte = isbyte
1391 #endif /* ALLOW_AUTODIFF_TAMC */
1392 DO J=1,sNy
1393 DO I=1,sNx
1394 C NOW SET AREA(I,J,bi,bj)=0 WHERE THERE IS NO ICE
1395 CML replaced "/.0001 _d 0" by "*1. _d 4", 1e-4 is probably
1396 CML meant to be something like a minimum thickness
1397 AREA(I,J,bi,bj)=MIN(AREA(I,J,bi,bj),HEFF(I,J,bi,bj)*1. _d 4)
1398 ENDDO
1399 ENDDO
1400
1401 #ifdef ALLOW_AUTODIFF_TAMC
1402 CADJ STORE area(:,:,bi,bj) = comlev1_bibj,
1403 CADJ & key = iicekey, byte = isbyte
1404 #endif /* ALLOW_AUTODIFF_TAMC */
1405 DO J=1,sNy
1406 DO I=1,sNx
1407 C NOW TRUNCATE AREA
1408 AREA(I,J,bi,bj)=MIN(ONE,AREA(I,J,bi,bj))
1409 ENDDO
1410 ENDDO
1411
1412 #ifdef ALLOW_AUTODIFF_TAMC
1413 CADJ STORE area(:,:,bi,bj) = comlev1_bibj,
1414 CADJ & key = iicekey, byte = isbyte
1415 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
1416 CADJ & key = iicekey, byte = isbyte
1417 #endif /* ALLOW_AUTODIFF_TAMC */
1418 DO J=1,sNy
1419 DO I=1,sNx
1420 AREA(I,J,bi,bj) = MAX(ZERO,AREA(I,J,bi,bj))
1421 HSNOW(I,J,bi,bj) = MAX(ZERO,HSNOW(I,J,bi,bj))
1422 AREA(I,J,bi,bj) = AREA(I,J,bi,bj)*HEFFM(I,J,bi,bj)
1423 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj)*HEFFM(I,J,bi,bj)
1424 #ifdef SEAICE_CAP_HEFF
1425 C This is not energy conserving, but at least it conserves fresh water
1426 tmpscal0 = -MAX(HEFF(I,J,bi,bj)-MAX_HEFF,0. _d 0)
1427 d_HEFFbyNeg(I,J) = d_HEFFbyNeg(I,J) + tmpscal0
1428 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) + tmpscal0
1429 #endif /* SEAICE_CAP_HEFF */
1430 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)*HEFFM(I,J,bi,bj)
1431 ENDDO
1432 ENDDO
1433
1434 C convert snow to ice if submerged.
1435 C =================================
1436
1437 IF ( SEAICEuseFlooding ) THEN
1438 DO J=1,sNy
1439 DO I=1,sNx
1440 tmpscal0 = (HSNOW(I,J,bi,bj)*SEAICE_rhoSnow
1441 & +HEFF(I,J,bi,bj)*SEAICE_rhoIce)*recip_rhoConst
1442 tmpscal1 = MAX( 0. _d 0, tmpscal0 - HEFF(I,J,bi,bj))
1443 d_HEFFbyFLOODING(I,J)=tmpscal1
1444 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj)+d_HEFFbyFLOODING(I,J)
1445 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)-
1446 & d_HEFFbyFLOODING(I,J)*ICE2SNOW
1447 ENDDO
1448 ENDDO
1449 ENDIF
1450
1451 #endif /* SEAICE_GROWTH_LEGACY */
1452
1453 #ifdef ALLOW_SITRACER
1454 DO J=1,sNy
1455 DO I=1,sNx
1456 c needs to be here to allow use also with LEGACY branch
1457 SItrHEFF(I,J,bi,bj,5)=HEFF(I,J,bi,bj)
1458 ENDDO
1459 ENDDO
1460 #endif
1461
1462 C ===================================================================
1463 C ==============PART 7: determine ocean model forcing================
1464 C ===================================================================
1465
1466 C compute net heat flux leaving/entering the ocean,
1467 C accounting for the part used in melt/freeze processes
1468 C =====================================================
1469
1470 #ifdef ALLOW_AUTODIFF_TAMC
1471 CADJ STORE d_hsnwbyneg = comlev1_bibj,key=iicekey,byte=isbyte
1472 CADJ STORE d_hsnwbyocnonsnw = comlev1_bibj,key=iicekey,byte=isbyte
1473 #endif /* ALLOW_AUTODIFF_TAMC */
1474
1475 DO J=1,sNy
1476 DO I=1,sNx
1477 QNET(I,J,bi,bj) = r_QbyATM_cover(I,J) + r_QbyATM_open(I,J)
1478 #ifndef SEAICE_GROWTH_LEGACY
1479 C in principle a_QSWbyATM_cover should always be included here, however
1480 C for backward compatibility it is left out of the LEGACY branch
1481 & + a_QSWbyATM_cover(I,J)
1482 #endif /* SEAICE_GROWTH_LEGACY */
1483 & - ( d_HEFFbyOCNonICE(I,J) +
1484 & d_HSNWbyOCNonSNW(I,J)*SNOW2ICE +
1485 & d_HEFFbyNEG(I,J) +
1486 & d_HSNWbyNEG(I,J)*SNOW2ICE )
1487 & * maskC(I,J,kSurface,bi,bj)
1488 QSW(I,J,bi,bj) = a_QSWbyATM_cover(I,J) + a_QSWbyATM_open(I,J)
1489 ENDDO
1490 ENDDO
1491
1492 C switch heat fluxes from 'effective' ice meters to W/m2
1493 C ======================================================
1494
1495 DO J=1,sNy
1496 DO I=1,sNx
1497 QNET(I,J,bi,bj) = QNET(I,J,bi,bj)*convertHI2Q
1498 QSW(I,J,bi,bj) = QSW(I,J,bi,bj)*convertHI2Q
1499 ENDDO
1500 ENDDO
1501
1502 #ifndef SEAICE_DISABLE_HEATCONSFIX
1503 C treat advective heat flux by ocean to ice water exchange (at 0decC)
1504 C ===================================================================
1505 # ifdef ALLOW_AUTODIFF_TAMC
1506 CADJ STORE d_HEFFbyNEG = comlev1_bibj,key=iicekey,byte=isbyte
1507 CADJ STORE d_HEFFbyOCNonICE = comlev1_bibj,key=iicekey,byte=isbyte
1508 CADJ STORE d_HEFFbyATMonOCN = comlev1_bibj,key=iicekey,byte=isbyte
1509 CADJ STORE d_HSNWbyNEG = comlev1_bibj,key=iicekey,byte=isbyte
1510 CADJ STORE d_HSNWbyOCNonSNW = comlev1_bibj,key=iicekey,byte=isbyte
1511 CADJ STORE d_HSNWbyATMonSNW = comlev1_bibj,key=iicekey,byte=isbyte
1512 CADJ STORE theta(:,:,kSurface,bi,bj) = comlev1_bibj,
1513 CADJ & key = iicekey, byte = isbyte
1514 # endif /* ALLOW_AUTODIFF_TAMC */
1515 IF ( SEAICEheatConsFix ) THEN
1516 c Unlike for evap and precip, the temperature of gained/lost
1517 c ocean liquid water due to melt/freeze of solid water cannot be chosen
1518 c to be e.g. the ocean SST. It must be done at 0degC. The fix below anticipates
1519 c on external_forcing_surf.F and applies the correction to QNET.
1520 IF ((convertFW2Salt.EQ.-1.).OR.(temp_EvPrRn.EQ.UNSET_RL)) THEN
1521 c I leave alone the exotic case when onvertFW2Salt.NE.-1 and temp_EvPrRn.NE.UNSET_RL and
1522 c the small error of the synchronous time stepping case (see external_forcing_surf.F).
1523 DO J=1,sNy
1524 DO I=1,sNx
1525 #ifdef ALLOW_DIAGNOSTICS
1526 c store unaltered QNET for diagnostic purposes
1527 DIAGarrayA(I,J)=QNET(I,J,bi,bj)
1528 #endif
1529 c compute the ocean water going to ice/snow, in precip units
1530 tmpscal3=rhoConstFresh*maskC(I,J,kSurface,bi,bj)*
1531 & ( d_HSNWbyATMonSNW(I,J)*SNOW2ICE
1532 & + d_HSNWbyOCNonSNW(I,J)*SNOW2ICE
1533 & + d_HEFFbyOCNonICE(I,J) + d_HEFFbyATMonOCN(I,J)
1534 & + d_HEFFbyNEG(I,J) + d_HSNWbyNEG(I,J)*SNOW2ICE )
1535 & * convertHI2PRECIP
1536 c factor in the heat content that external_forcing_surf.F
1537 c will associate with EMPMR, and remove it from QNET, so that
1538 c melt/freez water is in effect consistently gained/lost at 0degC
1539 IF (temp_EvPrRn.NE.UNSET_RL) THEN
1540 QNET(I,J,bi,bj)=QNET(I,J,bi,bj) - tmpscal3*
1541 & HeatCapacity_Cp * temp_EvPrRn
1542 ELSE
1543 QNET(I,J,bi,bj)=QNET(I,J,bi,bj) - tmpscal3*
1544 & HeatCapacity_Cp * theta(I,J,kSurface,bi,bj)
1545 ENDIF
1546 #ifdef ALLOW_DIAGNOSTICS
1547 c back out the eventual TFLUX adjustement and fill diag
1548 DIAGarrayA(I,J)=QNET(I,J,bi,bj)-DIAGarrayA(I,J)
1549 #endif
1550 ENDDO
1551 ENDDO
1552 ENDIF
1553 #ifdef ALLOW_DIAGNOSTICS
1554 CALL DIAGNOSTICS_FILL(DIAGarrayA,
1555 & 'SIaaflux',0,1,3,bi,bj,myThid)
1556 #endif
1557 ENDIF
1558 #endif
1559
1560 C compute net fresh water flux leaving/entering
1561 C the ocean, accounting for fresh/salt water stocks.
1562 C ==================================================
1563
1564 #ifdef ALLOW_ATM_TEMP
1565 DO J=1,sNy
1566 DO I=1,sNx
1567 tmpscal1= d_HSNWbyATMonSNW(I,J)*SNOW2ICE
1568 & +d_HFRWbyRAIN(I,J)
1569 & +d_HSNWbyOCNonSNW(I,J)*SNOW2ICE
1570 & +d_HEFFbyOCNonICE(I,J)
1571 & +d_HEFFbyATMonOCN(I,J)
1572 & +d_HEFFbyNEG(I,J)
1573 & +d_HSNWbyNEG(I,J)*SNOW2ICE
1574 C If r_FWbySublim>0, then it is evaporated from ocean.
1575 & +r_FWbySublim(I,J)
1576 EmPmR(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*(
1577 & ( EVAP(I,J,bi,bj)-PRECIP(I,J,bi,bj) )
1578 & * ( ONE - AREApreTH(I,J) )
1579 #ifdef ALLOW_RUNOFF
1580 & - RUNOFF(I,J,bi,bj)
1581 #endif /* ALLOW_RUNOFF */
1582 & + tmpscal1*convertHI2PRECIP
1583 & )*rhoConstFresh
1584 ENDDO
1585 ENDDO
1586
1587 #ifdef ALLOW_MEAN_SFLUX_COST_CONTRIBUTION
1588 DO J=1,sNy
1589 DO I=1,sNx
1590 frWtrAtm(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*(
1591 & PRECIP(I,J,bi,bj)
1592 & - EVAP(I,J,bi,bj)
1593 & *( ONE - AREApreTH(I,J) )
1594 #ifdef ALLOW_RUNOFF
1595 & + RUNOFF(I,J,bi,bj)
1596 #endif /* ALLOW_RUNOFF */
1597 & )*rhoConstFresh
1598 & - a_FWbySublim(I,J) * SEAICE_rhoIce * recip_deltaTtherm
1599 ENDDO
1600 ENDDO
1601 #endif
1602 #endif /* ALLOW_ATM_TEMP */
1603
1604 #ifdef SEAICE_DEBUG
1605 CALL PLOT_FIELD_XYRL( QSW,'Current QSW ', myIter, myThid )
1606 CALL PLOT_FIELD_XYRL( QNET,'Current QNET ', myIter, myThid )
1607 CALL PLOT_FIELD_XYRL( EmPmR,'Current EmPmR ', myIter, myThid )
1608 #endif /* SEAICE_DEBUG */
1609
1610 C Sea Ice Load on the sea surface.
1611 C =================================
1612
1613 #ifdef ALLOW_AUTODIFF_TAMC
1614 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1615 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,key=iicekey,byte=isbyte
1616 #endif /* ALLOW_AUTODIFF_TAMC */
1617
1618 IF ( useRealFreshWaterFlux ) THEN
1619 DO J=1,sNy
1620 DO I=1,sNx
1621 #ifdef SEAICE_CAP_ICELOAD
1622 tmpscal1 = HEFF(I,J,bi,bj)*SEAICE_rhoIce
1623 & + HSNOW(I,J,bi,bj)*SEAICE_rhoSnow
1624 tmpscal2 = MIN(tmpscal1,heffTooHeavy*rhoConst)
1625 #else
1626 tmpscal2 = HEFF(I,J,bi,bj)*SEAICE_rhoIce
1627 & + HSNOW(I,J,bi,bj)*SEAICE_rhoSnow
1628 #endif
1629 sIceLoad(i,j,bi,bj) = tmpscal2
1630 ENDDO
1631 ENDDO
1632 ENDIF
1633
1634 C ===================================================================
1635 C ======================PART 8: diagnostics==========================
1636 C ===================================================================
1637
1638 #ifdef ALLOW_DIAGNOSTICS
1639 IF ( useDiagnostics ) THEN
1640 tmpscal1=1. _d 0 * recip_deltaTtherm
1641 CALL DIAGNOSTICS_SCALE_FILL(a_QbyATM_cover,
1642 & tmpscal1,1,'SIaQbATC',0,1,3,bi,bj,myThid)
1643 CALL DIAGNOSTICS_SCALE_FILL(a_QbyATM_open,
1644 & tmpscal1,1,'SIaQbATO',0,1,3,bi,bj,myThid)
1645 CALL DIAGNOSTICS_SCALE_FILL(a_QbyOCN,
1646 & tmpscal1,1,'SIaQbOCN',0,1,3,bi,bj,myThid)
1647 CALL DIAGNOSTICS_SCALE_FILL(d_HEFFbyOCNonICE,
1648 & tmpscal1,1,'SIdHbOCN',0,1,3,bi,bj,myThid)
1649 CALL DIAGNOSTICS_SCALE_FILL(d_HEFFbyATMonOCN_cover,
1650 & tmpscal1,1,'SIdHbATC',0,1,3,bi,bj,myThid)
1651 CALL DIAGNOSTICS_SCALE_FILL(d_HEFFbyATMonOCN_open,
1652 & tmpscal1,1,'SIdHbATO',0,1,3,bi,bj,myThid)
1653 CALL DIAGNOSTICS_SCALE_FILL(d_HEFFbyFLOODING,
1654 & tmpscal1,1,'SIdHbFLO',0,1,3,bi,bj,myThid)
1655 CALL DIAGNOSTICS_SCALE_FILL(d_HSNWbyOCNonSNW,
1656 & tmpscal1,1,'SIdSbOCN',0,1,3,bi,bj,myThid)
1657 CALL DIAGNOSTICS_SCALE_FILL(d_HSNWbyATMonSNW,
1658 & tmpscal1,1,'SIdSbATC',0,1,3,bi,bj,myThid)
1659 CALL DIAGNOSTICS_SCALE_FILL(d_AREAbyATM,
1660 & tmpscal1,1,'SIdAbATO',0,1,3,bi,bj,myThid)
1661 CALL DIAGNOSTICS_SCALE_FILL(d_AREAbyICE,
1662 & tmpscal1,1,'SIdAbATC',0,1,3,bi,bj,myThid)
1663 CALL DIAGNOSTICS_SCALE_FILL(d_AREAbyOCN,
1664 & tmpscal1,1,'SIdAbOCN',0,1,3,bi,bj,myThid)
1665 CALL DIAGNOSTICS_SCALE_FILL(r_QbyATM_open,
1666 & convertHI2Q,1, 'SIqneto ',0,1,3,bi,bj,myThid)
1667 CALL DIAGNOSTICS_SCALE_FILL(r_QbyATM_cover,
1668 & convertHI2Q,1, 'SIqneti ',0,1,3,bi,bj,myThid)
1669 C three that actually need intermediate storage
1670 DO J=1,sNy
1671 DO I=1,sNx
1672 DIAGarrayA(I,J) = maskC(I,J,kSurface,bi,bj)
1673 & * d_HSNWbyRAIN(I,J)*SEAICE_rhoSnow*recip_deltaTtherm
1674 DIAGarrayB(I,J) = AREA(I,J,bi,bj)-AREApreTH(I,J)
1675 ENDDO
1676 ENDDO
1677 CALL DIAGNOSTICS_FILL(DIAGarrayA,
1678 & 'SIsnPrcp',0,1,3,bi,bj,myThid)
1679 CALL DIAGNOSTICS_SCALE_FILL(DIAGarrayB,
1680 & tmpscal1,1,'SIdA ',0,1,3,bi,bj,myThid)
1681 #ifdef ALLOW_ATM_TEMP
1682 DO J=1,sNy
1683 DO I=1,sNx
1684 CML If I consider the atmosphere above the ice, the surface flux
1685 CML which is relevant for the air temperature dT/dt Eq
1686 CML accounts for sensible and radiation (with different treatment
1687 CML according to wave-length) fluxes but not for "latent heat flux",
1688 CML since it does not contribute to heating the air.
1689 CML So this diagnostic is only good for heat budget calculations within
1690 CML the ice-ocean system.
1691 DIAGarrayA(I,J) = maskC(I,J,kSurface,bi,bj)*convertHI2Q*(
1692 #ifndef SEAICE_GROWTH_LEGACY
1693 & a_QSWbyATM_cover(I,J) +
1694 #endif /* SEAICE_GROWTH_LEGACY */
1695 & a_QbyATM_cover(I,J) + a_QbyATM_open(I,J) )
1696 C
1697 DIAGarrayB(I,J) = maskC(I,J,kSurface,bi,bj) *
1698 & a_FWbySublim(I,J) * SEAICE_rhoIce * recip_deltaTtherm
1699 C
1700 DIAGarrayC(I,J) = maskC(I,J,kSurface,bi,bj)*(
1701 & PRECIP(I,J,bi,bj)
1702 & - EVAP(I,J,bi,bj)*( ONE - AREApreTH(I,J) )
1703 #ifdef ALLOW_RUNOFF
1704 & + RUNOFF(I,J,bi,bj)
1705 #endif /* ALLOW_RUNOFF */
1706 & )*rhoConstFresh
1707 & - a_FWbySublim(I,J) * SEAICE_rhoIce * recip_deltaTtherm
1708 ENDDO
1709 ENDDO
1710 CALL DIAGNOSTICS_FILL(DIAGarrayA,
1711 & 'SIatmQnt',0,1,3,bi,bj,myThid)
1712 CALL DIAGNOSTICS_FILL(DIAGarrayB,
1713 & 'SIfwSubl',0,1,3,bi,bj,myThid)
1714 CALL DIAGNOSTICS_FILL(DIAGarrayC,
1715 & 'SIatmFW ',0,1,3,bi,bj,myThid)
1716 C
1717 DO J=1,sNy
1718 DO I=1,sNx
1719 C the actual Freshwater flux of sublimated ice, >0 decreases ice
1720 DIAGarrayA(I,J) = maskC(I,J,kSurface,bi,bj)
1721 & * (a_FWbySublim(I,J)-r_FWbySublim(I,J))
1722 & * SEAICE_rhoIce * recip_deltaTtherm
1723 c the residual Freshwater flux of sublimated ice
1724 DIAGarrayC(I,J) = maskC(I,J,kSurface,bi,bj)
1725 & * r_FWbySublim(I,J)
1726 & * SEAICE_rhoIce * recip_deltaTtherm
1727 C the latent heat flux
1728 tmpscal1= EVAP(I,J,bi,bj)*( ONE - AREApreTH(I,J) )
1729 & + r_FWbySublim(I,J)*convertHI2PRECIP
1730 tmpscal2= ( a_FWbySublim(I,J)-r_FWbySublim(I,J) )
1731 & * convertHI2PRECIP
1732 tmpscal3= SEAICE_lhEvap+SEAICE_lhFusion
1733 DIAGarrayB(I,J) = -maskC(I,J,kSurface,bi,bj)*rhoConstFresh
1734 & * ( tmpscal1*SEAICE_lhEvap + tmpscal2*tmpscal3 )
1735 ENDDO
1736 ENDDO
1737 CALL DIAGNOSTICS_FILL(DIAGarrayA,'SIacSubl',0,1,3,bi,bj,myThid)
1738 CALL DIAGNOSTICS_FILL(DIAGarrayC,'SIrsSubl',0,1,3,bi,bj,myThid)
1739 CALL DIAGNOSTICS_FILL(DIAGarrayB,'SIhl ',0,1,3,bi,bj,myThid)
1740
1741 DO J=1,sNy
1742 DO I=1,sNx
1743 c compute ice/snow water going to atm, in precip units
1744 tmpscal1 = rhoConstFresh*maskC(I,J,kSurface,bi,bj)
1745 & * convertHI2PRECIP * ( - d_HSNWbyRAIN(I,J)*SNOW2ICE
1746 & + a_FWbySublim(I,J) - r_FWbySublim(I,J) )
1747 c compute ocean water going to atm, in precip units
1748 tmpscal2=rhoConstFresh*maskC(I,J,kSurface,bi,bj)*
1749 & ( ( EVAP(I,J,bi,bj)-PRECIP(I,J,bi,bj) )
1750 & * ( ONE - AREApreTH(I,J) )
1751 #ifdef ALLOW_RUNOFF
1752 & - RUNOFF(I,J,bi,bj)
1753 #endif /* ALLOW_RUNOFF */
1754 & + ( d_HFRWbyRAIN(I,J) + r_FWbySublim(I,J) )
1755 & *convertHI2PRECIP )
1756 c factor in the advected specific energy (referenced to 0 for 0deC liquid water)
1757 tmpscal1= - tmpscal1*
1758 & ( -SEAICE_lhFusion + HeatCapacity_Cp * ZERO )
1759 IF (temp_EvPrRn.NE.UNSET_RL) THEN
1760 tmpscal2= - tmpscal2*
1761 & ( ZERO + HeatCapacity_Cp * temp_EvPrRn )
1762 ELSE
1763 tmpscal2= - tmpscal2*
1764 & ( ZERO + HeatCapacity_Cp * theta(I,J,kSurface,bi,bj) )
1765 ENDIF
1766 c add to SIatmQnt, leading to SItflux, which is analogous to TFLUX
1767 DIAGarrayA(I,J)=maskC(I,J,kSurface,bi,bj)*convertHI2Q*(
1768 #ifndef SEAICE_GROWTH_LEGACY
1769 & a_QSWbyATM_cover(I,J) +
1770 #endif
1771 & a_QbyATM_cover(I,J) + a_QbyATM_open(I,J) )
1772 & -tmpscal1-tmpscal2
1773 ENDDO
1774 ENDDO
1775 CALL DIAGNOSTICS_FILL(DIAGarrayA,
1776 & 'SItflux ',0,1,3,bi,bj,myThid)
1777 #endif /* ALLOW_ATM_TEMP */
1778
1779 ENDIF
1780 #endif /* ALLOW_DIAGNOSTICS */
1781
1782 C close bi,bj loops
1783 ENDDO
1784 ENDDO
1785
1786 RETURN
1787 END

  ViewVC Help
Powered by ViewVC 1.1.22