/[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.72 - (show annotations) (download)
Fri Oct 1 01:45:15 2010 UTC (13 years, 8 months ago) by gforget
Branch: MAIN
Changes since 1.71: +85 -87 lines
Merging seaice_growth codes -- preliminary steps.

Part 1: replacing variable names with more
 meaningful ones, aiming for improved readability
 + introducing variables for the various updates,
 aiming for improved modularity.

Next commit is expected to wrap this part up...

1 C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_growth.F,v 1.70 2010/09/23 22:46:24 jmc Exp $
2 C $Name: $
3
4 #include "SEAICE_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: SEAICE_GROWTH
8 C !INTERFACE:
9 SUBROUTINE SEAICE_GROWTH( myTime, myIter, myThid )
10 C !DESCRIPTION: \bv
11 C *==========================================================*
12 C | SUBROUTINE seaice_growth
13 C | o Updata ice thickness and snow depth
14 C *==========================================================*
15 C \ev
16
17 C !USES:
18 IMPLICIT NONE
19 C === Global variables ===
20 #include "SIZE.h"
21 #include "EEPARAMS.h"
22 #include "PARAMS.h"
23 #include "DYNVARS.h"
24 #include "GRID.h"
25 #include "FFIELDS.h"
26 #include "SEAICE_PARAMS.h"
27 #include "SEAICE.h"
28 #ifdef ALLOW_EXF
29 # include "EXF_OPTIONS.h"
30 # include "EXF_FIELDS.h"
31 # include "EXF_PARAM.h"
32 #endif
33 #ifdef ALLOW_SALT_PLUME
34 # include "SALT_PLUME.h"
35 #endif
36 #ifdef ALLOW_AUTODIFF_TAMC
37 # include "tamc.h"
38 #endif
39
40 C !INPUT/OUTPUT PARAMETERS:
41 C === Routine arguments ===
42 C myTime :: Simulation time
43 C myIter :: Simulation timestep number
44 C myThid :: Thread no. that called this routine.
45 _RL myTime
46 INTEGER myIter, myThid
47 CEOP
48
49 C !LOCAL VARIABLES:
50 C === Local variables ===
51 C i,j,bi,bj :: Loop counters
52 INTEGER i, j, bi, bj
53 C number of surface interface layer
54 INTEGER kSurface
55 C constants
56 _RL TBC, SDF, ICE2SNOW
57 _RL QI, recip_QI, QS
58 C auxillary variables
59 _RL snowEnergy
60 _RL growthHEFF, growthNeg
61 #ifdef ALLOW_SEAICE_FLOODING
62 _RL hDraft
63 #endif /* ALLOW_SEAICE_FLOODING */
64 _RL GHEFF (1:sNx,1:sNy)
65
66 #ifdef SEAICE_SALINITY
67 _RL saltFluxAdjust(1:sNx,1:sNy)
68 #endif
69
70 cgf new variables:
71 _RL d_HSNWbyATMonSNW (1:sNx,1:sNy)
72 _RL d_HFRWbyATMonSNW (1:sNx,1:sNy)
73 _RL d_QbyATMonSNW (1:sNx,1:sNy)
74 c
75 _RL d_AREAbyATM (1:sNx,1:sNy)
76 c
77 _RL tmpscal1, tmpscal2, tmpscal3, tmpscal4
78 c
79 _RL a_QbyICE (1:sNx,1:sNy)
80 _RL r_QbyICE (1:sNx,1:sNy)
81 _RL d_QbyICE (1:sNx,1:sNy)
82 _RL d_QbySNW (1:sNx,1:sNy)
83 _RL d_HEFFbyICEonOCN (1:sNx,1:sNy)
84 _RL d_HEFFbySNWonOCN (1:sNx,1:sNy)
85
86
87
88 C a_QbyATM_cover - thermodynamic ice growth rate over sea ice in W/m^2
89 C >0 causes ice growth, <0 causes snow and sea ice melt
90 C a_QbyATM - effective thermodynamic ice growth rate over sea ice in W/m^2
91 C >0 causes ice growth, <0 causes snow and sea ice melt
92 C a_QbyATM_open - thermodynamic ice growth rate over open water in W/m^2
93 C ( = surface heat flux )
94 C >0 causes ice growth, <0 causes snow and sea ice melt
95 C QNETI - net surface heat flux under ice in W/m^2
96 C a_QSWbyATM_open - short wave heat flux over ocean in W/m^2
97 C a_QSWbyATM_cover - short wave heat flux under ice in W/m^2
98 _RL a_QbyATM (1:sNx,1:sNy)
99 _RL a_QbyATM_cover (1:sNx,1:sNy)
100 _RL a_QbyATM_open (1:sNx,1:sNy)
101 _RL QNETI (1:sNx,1:sNy)
102 _RL a_QSWbyATM_open (1:sNx,1:sNy)
103 _RL a_QSWbyATM_cover (1:sNx,1:sNy)
104 C
105 C actual ice thickness with upper and lower limit
106 _RL HICE (1:sNx,1:sNy)
107 C actual snow thickness
108 _RL hSnwLoc (1:sNx,1:sNy)
109 C wind speed
110 _RL UG (1:sNx,1:sNy)
111 _RL SPEED_SQ
112 C local copy of AREA
113 _RL areaLoc
114
115 #ifdef SEAICE_MULTICATEGORY
116 INTEGER it
117 INTEGER ilockey
118 _RL RK
119 _RL HICEP (1:sNx,1:sNy)
120 _RL a_QbyATMmult_cover (1:sNx,1:sNy)
121 _RL a_QSWbyATMmult_cover (1:sNx,1:sNy)
122 #endif
123
124 #ifdef SEAICE_AGE
125 C old_AREA :: hold sea-ice fraction field before any seaice-thermo update
126 _RL old_AREA (1:sNx,1:sNy)
127 # ifdef SEAICE_AGE_VOL
128 C old_HEFF :: hold sea-ice effective thicness field before any seaice-thermo update
129 _RL old_HEFF (1:sNx,1:sNy)
130 _RL age_actual
131 # endif /* SEAICE_AGE_VOL */
132 #endif /* SEAICE_AGE */
133
134 #ifdef ALLOW_DIAGNOSTICS
135 _RL DIAGarray (1:sNx,1:sNy)
136 LOGICAL DIAGNOSTICS_IS_ON
137 EXTERNAL DIAGNOSTICS_IS_ON
138 #endif
139
140 IF ( buoyancyRelation .EQ. 'OCEANICP' ) THEN
141 kSurface = Nr
142 ELSE
143 kSurface = 1
144 ENDIF
145
146 C FREEZING TEMP. OF SEA WATER (deg C)
147 TBC = SEAICE_freeze
148 C RATIO OF WATER DESITY TO SNOW DENSITY
149 SDF = 1000.0 _d 0/SEAICE_rhoSnow
150 C RATIO OF SEA ICE DENSITY to SNOW DENSITY
151 ICE2SNOW = SDF * ICE2WATR
152 C HEAT OF FUSION OF ICE (J/m^3)
153 QI = 302.0 _d +06
154 recip_QI = 1.0 _d 0 / QI
155 C HEAT OF FUSION OF SNOW (J/m^3)
156 QS = 1.1 _d +08
157
158
159 DO bj=myByLo(myThid),myByHi(myThid)
160 DO bi=myBxLo(myThid),myBxHi(myThid)
161 c
162 #ifdef ALLOW_AUTODIFF_TAMC
163 act1 = bi - myBxLo(myThid)
164 max1 = myBxHi(myThid) - myBxLo(myThid) + 1
165 act2 = bj - myByLo(myThid)
166 max2 = myByHi(myThid) - myByLo(myThid) + 1
167 act3 = myThid - 1
168 max3 = nTx*nTy
169 act4 = ikey_dynamics - 1
170 iicekey = (act1 + 1) + act2*max1
171 & + act3*max1*max2
172 & + act4*max1*max2*max3
173 #endif /* ALLOW_AUTODIFF_TAMC */
174 C
175 C initialise a few fields
176 C
177 #ifdef ALLOW_AUTODIFF_TAMC
178 CADJ STORE area(:,:,bi,bj) = comlev1_bibj,
179 CADJ & key = iicekey, byte = isbyte
180 CADJ STORE qnet(:,:,bi,bj) = comlev1_bibj,
181 CADJ & key = iicekey, byte = isbyte
182 CADJ STORE qsw(:,:,bi,bj) = comlev1_bibj,
183 CADJ & key = iicekey, byte = isbyte
184 #endif /* ALLOW_AUTODIFF_TAMC */
185 DO J=1,sNy
186 DO I=1,sNx
187 a_QbyATM(I,J) = 0.0 _d 0
188 a_QbyATM_cover (I,J) = 0.0 _d 0
189 a_QbyATM_open(I,J) = 0.0 _d 0
190 QNETI(I,J) = 0.0 _d 0
191 a_QSWbyATM_open (I,J) = 0.0 _d 0
192 a_QSWbyATM_cover (I,J) = 0.0 _d 0
193 #ifdef SEAICE_SALINITY
194 saltFluxAdjust(I,J) = 0.0 _d 0
195 #endif
196 #ifdef SEAICE_MULTICATEGORY
197 a_QbyATMmult_cover(I,J) = 0.0 _d 0
198 a_QSWbyATMmult_cover(I,J) = 0.0 _d 0
199 #endif
200 cgf new variables:
201 d_HSNWbyATMonSNW(I,J) = 0.0 _d 0
202 d_HFRWbyATMonSNW(I,J) = 0.0 _d 0
203 d_QbyATMonSNW(I,J) = 0.0 _d 0
204 c
205 d_AREAbyATM(I,J) = 0.0 _d 0
206 c
207 d_HEFFbyICEonOCN(I,J) = 0.0 _d 0
208 d_HEFFbySNWonOCN(I,J) = 0.0 _d 0
209 ENDDO
210 ENDDO
211 DO J=1-oLy,sNy+oLy
212 DO I=1-oLx,sNx+oLx
213 saltWtrIce(I,J,bi,bj) = 0.0 _d 0
214 frWtrIce(I,J,bi,bj) = 0.0 _d 0
215 #ifdef ALLOW_MEAN_SFLUX_COST_CONTRIBUTION
216 frWtrAtm(I,J,bi,bj) = 0.0 _d 0
217 #endif
218 ENDDO
219 ENDDO
220
221 #ifdef SEAICE_AGE
222 C store the initial ice fraction over the domain
223 DO J=1,sNy
224 DO I=1,sNx
225 old_AREA(i,j) = AREA(I,J,bi,bj)
226 # ifdef SEAICE_AGE_VOL
227 old_HEFF(i,j) = HEFF(I,J,bi,bj)
228 # endif
229 ENDDO
230 ENDDO
231 #endif /* SEAICE_AGE */
232
233
234 #ifdef ALLOW_AUTODIFF_TAMC
235 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,
236 CADJ & key = iicekey, byte = isbyte
237 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
238 CADJ & key = iicekey, byte = isbyte
239 #endif /* ALLOW_AUTODIFF_TAMC */
240 DO J=1,sNy
241 DO I=1,sNx
242 C COMPUTE ACTUAL ICE THICKNESS AND PUT MINIMUM/MAXIMUM
243 C ON ICE THICKNESS FOR BUDGET COMPUTATION
244 C The default of A22 = 0.15 is a common threshold for defining
245 C the ice edge. This ice concentration usually does not occur
246 C due to thermodynamics but due to advection.
247 areaLoc = MAX(A22,AREANm1(I,J,bi,bj))
248 HICE(I,J) = HEFFNm1(I,J,bi,bj)/areaLoc
249 C Do we know what this is for?
250 HICE(I,J) = MAX(HICE(I,J),0.05 _d +00)
251 C Capping the actual ice thickness effectively enforces a
252 C minimum of heat flux through the ice and helps getting rid of
253 C very thick ice.
254 cdm actually, this does exactly the opposite, i.e., ice is thicker
255 cdm when HICE is capped, so I am commenting out
256 cdm HICE(I,J) = MIN(HICE(I,J),9.0 _d +00)
257 hSnwLoc(I,J) = HSNOW(I,J,bi,bj)/areaLoc
258 ENDDO
259 ENDDO
260
261 C NOW DETERMINE MIXED LAYER TEMPERATURE
262 DO J=1,sNy
263 DO I=1,sNx
264 TMIX(I,J,bi,bj)=theta(I,J,kSurface,bi,bj)+273.16 _d +00
265 #ifdef SEAICE_DEBUG
266 TMIX(I,J,bi,bj)=MAX(TMIX(I,J,bi,bj),271.2 _d +00)
267 #endif
268 ENDDO
269 ENDDO
270
271 C THERMAL WIND OF ATMOSPHERE
272 DO J=1,sNy
273 DO I=1,sNx
274 C copy the wind speed computed in exf_wind.F to UG
275 UG(I,J) = MAX(SEAICE_EPS,wspeed(I,J,bi,bj))
276 CML this is the old code, which does the same
277 CML SPEED_SQ = UWIND(I,J,bi,bj)**2 + VWIND(I,J,bi,bj)**2
278 CML IF ( SPEED_SQ .LE. SEAICE_EPS_SQ ) THEN
279 CML UG(I,J)=SEAICE_EPS
280 CML ELSE
281 CML UG(I,J)=SQRT(SPEED_SQ)
282 CML ENDIF
283 ENDDO
284 ENDDO
285
286
287 #ifdef ALLOW_AUTODIFF_TAMC
288 cphCADJ STORE heff = comlev1, key = ikey_dynamics, byte = isbyte
289 cphCADJ STORE hsnow = comlev1, key = ikey_dynamics, byte = isbyte
290 cphCADJ STORE uwind = comlev1, key = ikey_dynamics, byte = isbyte
291 cphCADJ STORE vwind = comlev1, key = ikey_dynamics, byte = isbyte
292 c
293 CADJ STORE tice = comlev1, key = ikey_dynamics, byte = isbyte
294 # ifdef SEAICE_MULTICATEGORY
295 CADJ STORE tices = comlev1, key = ikey_dynamics, byte = isbyte
296 # endif
297 #endif /* ALLOW_AUTODIFF_TAMC */
298
299 C NOW DETERMINE GROWTH RATES
300 C FIRST DO OPEN WATER
301 CALL SEAICE_BUDGET_OCEAN(
302 I UG,
303 U TMIX,
304 O a_QbyATM_open, a_QSWbyATM_open,
305 I bi, bj, myTime, myIter, myThid )
306
307 C NOW DO ICE
308 IF (useRelativeWind) THEN
309 C Compute relative wind speed over sea ice.
310 DO J=1,sNy
311 DO I=1,sNx
312 SPEED_SQ =
313 & (uWind(I,J,bi,bj)
314 & +0.5 _d 0*(uVel(i,j,kSurface,bi,bj)
315 & +uVel(i+1,j,kSurface,bi,bj))
316 & -0.5 _d 0*(uice(i,j,bi,bj)+uice(i+1,j,bi,bj)))**2
317 & +(vWind(I,J,bi,bj)
318 & +0.5 _d 0*(vVel(i,j,kSurface,bi,bj)
319 & +vVel(i,j+1,kSurface,bi,bj))
320 & -0.5 _d 0*(vice(i,j,bi,bj)+vice(i,j+1,bi,bj)))**2
321 IF ( SPEED_SQ .LE. SEAICE_EPS_SQ ) THEN
322 UG(I,J)=SEAICE_EPS
323 ELSE
324 UG(I,J)=SQRT(SPEED_SQ)
325 ENDIF
326 ENDDO
327 ENDDO
328 ENDIF
329 #ifdef SEAICE_MULTICATEGORY
330 C-- Start loop over muli-categories
331 DO IT=1,MULTDIM
332 #ifdef ALLOW_AUTODIFF_TAMC
333 ilockey = (iicekey-1)*MULTDIM + IT
334 CADJ STORE tices(:,:,it,bi,bj) = comlev1_multdim,
335 CADJ & key = ilockey, byte = isbyte
336 #endif /* ALLOW_AUTODIFF_TAMC */
337 RK=REAL(IT)
338 DO J=1,sNy
339 DO I=1,sNx
340 HICEP(I,J)=(HICE(I,J)/MULTDIM)*((2.0 _d 0*RK)-1.0 _d 0)
341 TICE(I,J,bi,bj)=TICES(I,J,IT,bi,bj)
342 ENDDO
343 ENDDO
344 CALL SEAICE_SOLVE4TEMP(
345 I UG, HICEP, hSnwLoc,
346 U TICE,
347 O a_QbyATMmult_cover, a_QSWbyATMmult_cover,
348 I bi, bj, myTime, myIter, myThid )
349 DO J=1,sNy
350 DO I=1,sNx
351 C average surface heat fluxes/growth rates
352 a_QbyATM_cover (I,J) =
353 & a_QbyATM_cover(I,J) + a_QbyATMmult_cover(I,J)/MULTDIM
354 a_QSWbyATM_cover (I,J) =
355 & a_QSWbyATM_cover(I,J) + a_QSWbyATMmult_cover(I,J)/MULTDIM
356 TICES(I,J,IT,bi,bj) = TICE(I,J,bi,bj)
357 ENDDO
358 ENDDO
359 ENDDO
360 C-- End loop over multi-categories
361 #else /* SEAICE_MULTICATEGORY */
362 CALL SEAICE_SOLVE4TEMP(
363 I UG, HICE, hSnwLoc,
364 U TICE,
365 O a_QbyATM_cover, a_QSWbyATM_cover,
366 I bi, bj, myTime, myIter, myThid )
367 #endif /* SEAICE_MULTICATEGORY */
368
369 #ifdef ALLOW_DIAGNOSTICS
370 IF ( useDiagnostics ) THEN
371 IF ( DIAGNOSTICS_IS_ON('SIatmQnt',myThid) ) THEN
372 DO J=1,sNy
373 DO I=1,sNx
374 DIAGarray(I,J) = maskC(I,J,kSurface,bi,bj) * (
375 & a_QbyATM_cover(I,J) * areaNm1(I,J,bi,bj) +
376 & a_QbyATM_open(I,J) * ( ONE - areaNm1(I,J,bi,bj) ) )
377 ENDDO
378 ENDDO
379 CALL DIAGNOSTICS_FILL(DIAGarray,'SIatmQnt',0,1,3,bi,bj,myThid)
380 ENDIF
381 ENDIF
382 #endif
383
384 #ifdef ALLOW_AUTODIFF_TAMC
385 CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj,
386 CADJ & key = iicekey, byte = isbyte
387 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,
388 CADJ & key = iicekey, byte = isbyte
389 #endif
390 C
391 C-- compute and apply ice growth due to oceanic heat flux from below
392 C
393
394 c a_QbyICE: available heat that may be extracted by the ICE acting
395 c on the OCN surface/mixed layer to bring it back to freezig point
396 c (in m, negative out of the ocean -- different convention than a_QbyATM)
397 cgf unit change that breaks lab_sea (in W/m2, positive out of the ocean -- same convention as a_QbyATM)
398 DO J=1,sNy
399 DO I=1,sNx
400 IF ( .NOT. inAdMode ) THEN
401 #ifdef SEAICE_VARIABLE_FREEZING_POINT
402 TBC = -0.0575 _d 0*salt(I,J,kSurface,bi,bj) + 0.0901 _d 0
403 #endif /* SEAICE_VARIABLE_FREEZING_POINT */
404 IF ( theta(I,J,kSurface,bi,bj) .GE. TBC ) THEN
405 a_QbyICE(i,j) = SEAICE_availHeatFrac
406 & * (theta(I,J,kSurface,bi,bj)-TBC) * dRf(kSurface)
407 & * hFacC(i,j,kSurface,bi,bj) / 72.0764 _d 0
408 #ifdef SEAICE_QBYICE_IS_WPERM2
409 cgf using W/m2 as the Q unit changes lab_sea results...
410 & * ( - QI / SEAICE_deltaTtherm )
411 #endif
412 ELSE
413 a_QbyICE(i,j) = SEAICE_availHeatFracFrz
414 & * (theta(I,J,kSurface,bi,bj)-TBC) * dRf(kSurface)
415 & * hFacC(i,j,kSurface,bi,bj) / 72.0764 _d 0
416 #ifdef SEAICE_QBYICE_IS_WPERM2
417 & * ( - QI / SEAICE_deltaTtherm )
418 #endif
419 ENDIF
420 ELSE
421 a_QbyICE(i,j) = 0.
422 ENDIF
423 ENDDO
424 ENDDO
425
426 DO J=1,sNy
427 DO I=1,sNx
428 tmpscal1=a_QbyICE(i,j)
429 #ifdef SEAICE_QBYICE_IS_WPERM2
430 & / ( - QI / SEAICE_deltaTtherm )
431 #endif
432 d_HEFFbyICEonOCN(I,J) =
433 & MAX(ZERO, HEFF(I,J,bi,bj)-tmpscal1)- HEFF(I,J,bi,bj)
434 d_QbyICE(I,J)=-d_HEFFbyICEonOCN(I,J)
435 #ifdef SEAICE_QBYICE_IS_WPERM2
436 & * ( - QI / SEAICE_deltaTtherm )
437 #endif
438 r_QbyICE(I,J)=a_QbyICE(I,J)-d_QbyICE(I,J)
439 c
440 HEFF(I,J,bi,bj)=HEFF(I,J,bi,bj) + d_HEFFbyICEonOCN(I,J)
441 saltWtrIce(I,J,bi,bj) = saltWtrIce(I,J,bi,bj)
442 & + d_HEFFbyICEonOCN(I,J)
443 C d_HEFFbyICEonOCN now contains m of ice melted (>0) or created (<0)
444 C saltWtrIce contains m of ice melted (<0) or created (>0)
445 C r_QbyICE is residual heat above freezing in equivalent m of ice
446 ENDDO
447 ENDDO
448
449 #ifdef ALLOW_DIAGNOSTICS
450 IF ( useDiagnostics ) THEN
451 IF ( DIAGNOSTICS_IS_ON('SIyneg ',myThid) ) THEN
452 CALL DIAGNOSTICS_FILL(d_HEFFbyICEonOCN,
453 & 'SIyneg ',0,1,1,bi,bj,myThid)
454 ENDIF
455 ENDIF
456 #endif
457
458 cph(
459 #ifdef ALLOW_AUTODIFF_TAMC
460 cphCADJ STORE heff = comlev1, key = ikey_dynamics, byte = isbyte
461 cphCADJ STORE hsnow = comlev1, key = ikey_dynamics, byte = isbyte
462 #endif
463 cph)
464 c
465 #ifdef ALLOW_AUTODIFF_TAMC
466 CADJ STORE area(:,:,bi,bj) = comlev1_bibj,
467 CADJ & key = iicekey, byte = isbyte
468 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
469 CADJ & key = iicekey, byte = isbyte
470 CADJ STORE a_QbyATM_cover(:,:) = comlev1_bibj,
471 CADJ & key = iicekey, byte = isbyte
472 #endif /* ALLOW_AUTODIFF_TAMC */
473 cph)
474 C
475 C-- compute and apply ice growth due to atmospheric fluxes from above
476 C
477 DO J=1,sNy
478 DO I=1,sNx
479 C NOW CALCULATE CORRECTED effective growth in J/m^2 (>0=melt)
480 GHEFF(I,J)=-SEAICE_deltaTtherm*
481 & a_QbyATM_cover(I,J)*AREANm1(I,J,bi,bj)
482 ENDDO
483 ENDDO
484
485 #ifdef ALLOW_AUTODIFF_TAMC
486 CADJ STORE a_QbyATM_cover(:,:) = comlev1_bibj,
487 CADJ & key = iicekey, byte = isbyte
488 #endif /* ALLOW_AUTODIFF_TAMC */
489
490 DO J=1,sNy
491 DO I=1,sNx
492 IF(a_QbyATM_cover(I,J).LT.ZERO.AND.
493 & AREANm1(I,J,bi,bj).GT.ZERO) THEN
494 C use a_QbyATM_cover to melt snow and CALCULATE CORRECTED GROWTH
495 C effective snow thickness in J/m^2
496 snowEnergy=HSNOW(I,J,bi,bj)*QS
497 IF(GHEFF(I,J).LE.snowEnergy) THEN
498 C not enough heat to melt all snow; use up all heat flux a_QbyATM_cover
499 d_HSNWbyATMonSNW(I,J)=-GHEFF(I,J)/QS
500 C SNOW CONVERTED INTO WATER AND THEN INTO equivalent m of ICE melt
501 C The factor 1/ICE2SNOW converts m of snow to m of sea-ice
502 d_HFRWbyATMonSNW(I,J)= - GHEFF(I,J)/(QS*ICE2SNOW)
503 d_QbyATMonSNW(I,J) = -a_QbyATM_cover(I,J)
504 ELSE
505 C enought heat to melt snow completely;
506 C compute remaining heat flux that will melt ice
507 d_QbyATMonSNW(I,J)=-(GHEFF(I,J)-snowEnergy)/
508 & SEAICE_deltaTtherm/AREANm1(I,J,bi,bj)-a_QbyATM_cover(I,J)
509 C convert all snow to melt water (fresh water flux)
510 d_HFRWbyATMonSNW(I,J)=-HSNOW(I,J,bi,bj)/ICE2SNOW
511 d_HSNWbyATMonSNW(I,J)=-HSNOW(I,J,bi,bj)
512 END IF
513 END IF
514 frWtrIce(I,J,bi,bj) = frWtrIce(I,J,bi,bj) +
515 & d_HFRWbyATMonSNW(I,J)
516 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj) + d_HSNWbyATMonSNW(I,J)
517 a_QbyATM_cover(I,J)= a_QbyATM_cover(I,J) + d_QbyATMonSNW(I,J)
518 ENDDO
519 ENDDO
520
521 #ifdef ALLOW_AUTODIFF_TAMC
522 CADJ STORE a_QbyATM_cover(:,:) = comlev1_bibj,
523 CADJ & key = iicekey, byte = isbyte
524 #endif /* ALLOW_AUTODIFF_TAMC */
525
526 DO J=1,sNy
527 DO I=1,sNx
528 C now get cell averaged growth rate in W/m^2, >0 causes ice growth
529 a_QbyATM(I,J)= a_QbyATM_cover(I,J) * AREANm1(I,J,bi,bj)
530 & + a_QbyATM_open(I,J) * (ONE-AREANm1(I,J,bi,bj))
531 ENDDO
532 ENDDO
533 cph(
534 #ifdef ALLOW_AUTODIFF_TAMC
535 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,
536 CADJ & key = iicekey, byte = isbyte
537 CADJ STORE a_QbyATM_cover(:,:) = comlev1_bibj,
538 CADJ & key = iicekey, byte = isbyte
539 CADJ STORE a_QbyATM(:,:) = comlev1_bibj,
540 CADJ & key = iicekey, byte = isbyte
541 CADJ STORE a_QbyATM_open(:,:) = comlev1_bibj,
542 CADJ & key = iicekey, byte = isbyte
543 CADJ STORE a_QSWbyATM_cover(:,:) = comlev1_bibj,
544 CADJ & key = iicekey, byte = isbyte
545 CADJ STORE a_QSWbyATM_open(:,:) = comlev1_bibj,
546 CADJ & key = iicekey, byte = isbyte
547 #endif /* ALLOW_AUTODIFF_TAMC */
548 cph)
549 C
550 C First update (freeze or melt) ice area
551 C
552 DO J=1,sNy
553 DO I=1,sNx
554 C negative growth in meters of ice (>0 for melting)
555 tmpscal1 = -SEAICE_deltaTtherm*a_QbyATM(I,J)*recip_QI
556 C negative growth must not exceed effective ice thickness (=volume)
557 C (that is, cannot melt more than all the ice)
558 tmpscal2 = -ONE*MIN(HEFF(I,J,bi,bj),tmpscal1)
559 #ifdef ALLOW_DIAGNOSTICS
560 DIAGarray(I,J) = tmpscal2
561 #endif
562 C tmpscal2 < 0 means melting
563 tmpscal3 = MIN(ZERO,tmpscal2)
564 C gain of new effective ice thickness over open water (>0 by definition)
565 tmpscal4 = MAX(ZERO,SEAICE_deltaTtherm*
566 & a_QbyATM_open(I,J)*recip_QI)
567 CML removed these loops and moved TAMC store directive up
568 CML ENDDO
569 CML ENDDO
570 CML#ifdef ALLOW_AUTODIFF_TAMC
571 CMLCADJ STORE area(:,:,bi,bj) = comlev1_bibj,
572 CMLCADJ & key = iicekey, byte = isbyte
573 CML#endif
574 CML DO J=1,sNy
575 CML DO I=1,sNx
576 C Here we finally compute the new AREA
577 IF ( YC(I,J,bi,bj) .LT. ZERO ) THEN
578 d_AREAbyATM(I,J)=
579 & (ONE-AREANm1(I,J,bi,bj))*tmpscal4/HO_south
580 & +HALF*tmpscal3*AREANm1(I,J,bi,bj)
581 & /(HEFF(I,J,bi,bj)+.00001 _d 0)
582 ELSE
583 d_AREAbyATM(I,J)=
584 & (ONE-AREANm1(I,J,bi,bj))*tmpscal4/HO
585 & +HALF*tmpscal3*AREANm1(I,J,bi,bj)
586 & /(HEFF(I,J,bi,bj)+.00001 _d 0)
587 ENDIF
588 AREA(I,J,bi,bj)=AREA(I,J,bi,bj)+d_AREAbyATM(I,J)
589 ENDDO
590 ENDDO
591
592 #ifdef ALLOW_DIAGNOSTICS
593 IF ( useDiagnostics ) THEN
594 IF ( DIAGNOSTICS_IS_ON('SIfice ',myThid) ) THEN
595 CALL DIAGNOSTICS_FILL(DIAGarray,'SIfice ',0,1,3,bi,bj,myThid)
596 ENDIF
597 ENDIF
598 #endif
599
600 #ifdef ALLOW_AUTODIFF_TAMC
601 CADJ STORE area(:,:,bi,bj) = comlev1_bibj,
602 CADJ & key = iicekey, byte = isbyte
603 #endif
604 C
605 C now update (freeze or melt) HEFF
606 C
607 DO J=1,sNy
608 DO I=1,sNx
609 C negative growth (>0 for melting) of existing ice in meters
610 growthNeg = -SEAICE_deltaTtherm*
611 & a_QbyATM_cover(I,J)*recip_QI*AREANm1(I,J,bi,bj)
612 C negative growth must not exceed effective ice thickness (=volume)
613 C (that is, cannot melt more than all the ice)
614 growthHEFF = -ONE*MIN(HEFF(I,J,bi,bj),growthNeg)
615 C growthHEFF < 0 means melting
616 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) + growthHEFF
617 C add effective growth to fresh water of ice
618 saltWtrIce(I,J,bi,bj) = saltWtrIce(I,J,bi,bj) + growthHEFF
619
620 C now calculate QNETI under ice (if any) as the difference between
621 C the available "heat flux" growthNeg and the actual growthHEFF;
622 C keep in mind that growthNeg and growthHEFF have different signs
623 C by construction
624 QNETI(I,J) = (growthHEFF + growthNeg)*QI/SEAICE_deltaTtherm
625
626 C now update other things
627
628 #ifdef ALLOW_ATM_TEMP
629 IF(a_QbyATM_cover(I,J).GT.ZERO) THEN
630 C freezing, add precip as snow
631 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)+SEAICE_deltaTtherm*
632 & PRECIP(I,J,bi,bj)*AREANm1(I,J,bi,bj)*SDF
633 ELSE
634 C add precip as rain, water converted into equivalent m of
635 C ice by 1/ICE2WATR.
636 C Do not get confused by the sign:
637 C precip > 0 for downward flux of fresh water
638 C frWtrIce > 0 for more ice (corresponds to an upward "fresh water flux"),
639 C so that here the rain is added *as if* it is melted ice (which is not
640 C true, but just a trick; physically the rain just runs as water
641 C through the ice into the ocean)
642 frWtrIce(I,J,bi,bj) = frWtrIce(I,J,bi,bj)
643 & -PRECIP(I,J,bi,bj)*AREANm1(I,J,bi,bj)*
644 & SEAICE_deltaTtherm/ICE2WATR
645 ENDIF
646 #endif /* ALLOW_ATM_TEMP */
647
648 ENDDO
649 ENDDO
650
651 #ifdef ALLOW_AUTODIFF_TAMC
652 cphCADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
653 cphCADJ & key = iicekey, byte = isbyte
654 #endif
655
656 cph( very sensitive bit here by JZ
657 #ifndef SEAICE_EXCLUDE_FOR_EXACT_AD_TESTING
658 DO J=1,sNy
659 DO I=1,sNx
660 C Now melt snow if there is residual heat left in surface level
661 C Note that units of d_HEFFbyICEonOCN and frWtrIce are m of ice
662
663 tmpscal1=r_QbyICE(i,j)
664 #ifdef SEAICE_QBYICE_IS_WPERM2
665 & / ( - QI / SEAICE_deltaTtherm )
666 #endif
667 IF( tmpscal1 .GT. ZERO .AND.
668 & HSNOW(I,J,bi,bj) .GT. ZERO ) THEN
669 d_HEFFbySNWonOCN(I,J) =
670 & - MIN( HSNOW(I,J,bi,bj)/SDF/ICE2WATR , tmpscal1 )
671 ELSE
672 d_HEFFbySNWonOCN(I,J) = 0. _d 0
673 ENDIF
674 d_QbySNW(I,J)=-d_HEFFbySNWonOCN(I,J)
675 #ifdef SEAICE_QBYICE_IS_WPERM2
676 & * ( - QI / SEAICE_deltaTtherm )
677 #endif
678 r_QbyICE(I,J)=a_QbyICE(I,J)-d_QbySNW(I,J)
679 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)
680 & +d_HEFFbySNWonOCN(I,J)*SDF*ICE2WATR
681 frWtrIce(I,J,bi,bj) = frWtrIce(I,J,bi,bj)
682 & +d_HEFFbySNWonOCN(I,J)
683 ENDDO
684 ENDDO
685 #endif
686 cph)
687
688 #ifdef ALLOW_AUTODIFF_TAMC
689 CADJ STORE area(:,:,bi,bj) = comlev1_bibj,
690 CADJ & key = iicekey, byte = isbyte
691 # ifdef SEAICE_SALINITY
692 CADJ STORE hsalt(:,:,bi,bj) = comlev1_bibj,
693 CADJ & key = iicekey, byte = isbyte
694 # endif /* SEAICE_SALINITY */
695 #endif /* ALLOW_AUTODIFF_TAMC */
696
697 #ifdef ALLOW_ATM_TEMP
698 DO J=1,sNy
699 DO I=1,sNx
700 C NOW GET FRESH WATER FLUX
701 EmPmR(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*(
702 & ( EVAP(I,J,bi,bj)-PRECIP(I,J,bi,bj) )
703 & * ( ONE - AREANm1(I,J,bi,bj) )
704 #ifdef ALLOW_RUNOFF
705 & - RUNOFF(I,J,bi,bj)
706 #endif
707 & + frWtrIce(I,J,bi,bj)*ICE2WATR/SEAICE_deltaTtherm
708 & + saltWtrIce(I,J,bi,bj)*ICE2WATR/SEAICE_deltaTtherm
709 & )*rhoConstFresh
710 ENDDO
711 ENDDO
712
713 #ifdef ALLOW_DIAGNOSTICS
714 IF ( useDiagnostics ) THEN
715 IF ( DIAGNOSTICS_IS_ON('SIatmFW ',myThid) ) THEN
716 DO J=1,sNy
717 DO I=1,sNx
718 DIAGarray(I,J) = maskC(I,J,kSurface,bi,bj)*(
719 & PRECIP(I,J,bi,bj)
720 & - EVAP(I,J,bi,bj)
721 & *( ONE - AREANm1(I,J,bi,bj) )
722 & + RUNOFF(I,J,bi,bj)
723 & )*rhoConstFresh
724 ENDDO
725 ENDDO
726 CALL DIAGNOSTICS_FILL(DIAGarray,'SIatmFW ',0,1,3,bi,bj,myThid)
727 ENDIF
728 ENDIF
729 #endif
730 #ifdef ALLOW_MEAN_SFLUX_COST_CONTRIBUTION
731 DO J=1,sNy
732 DO I=1,sNx
733 frWtrAtm(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*(
734 & PRECIP(I,J,bi,bj)
735 & - EVAP(I,J,bi,bj)
736 & *( ONE - AREANm1(I,J,bi,bj) )
737 & + RUNOFF(I,J,bi,bj)
738 & )*rhoConstFresh
739 ENDDO
740 ENDDO
741 #endif
742
743 C COMPUTE SURFACE SALT FLUX AND ADJUST ICE SALINITY
744
745 #ifdef SEAICE_SALINITY
746
747 DO J=1,sNy
748 DO I=1,sNx
749 C set HSALT = 0 if HSALT < 0 and compute salt to remove from ocean
750 IF ( HSALT(I,J,bi,bj) .LT. 0.0 ) THEN
751 saltFluxAdjust(I,J) = - HEFFM(I,J,bi,bj) *
752 & HSALT(I,J,bi,bj) / SEAICE_deltaTtherm
753 HSALT(I,J,bi,bj) = 0.0 _d 0
754 ENDIF
755 ENDDO
756 ENDDO
757
758 #ifdef ALLOW_AUTODIFF_TAMC
759 CADJ STORE hsalt(:,:,bi,bj) = comlev1_bibj,
760 CADJ & key = iicekey, byte = isbyte
761 #endif /* ALLOW_AUTODIFF_TAMC */
762
763 DO J=1,sNy
764 DO I=1,sNx
765 C saltWtrIce > 0 : m of sea ice that is created
766 IF ( saltWtrIce(I,J,bi,bj) .GE. 0.0 ) THEN
767 saltFlux(I,J,bi,bj) =
768 & HEFFM(I,J,bi,bj)*saltWtrIce(I,J,bi,bj)*
769 & ICE2WATR*rhoConstFresh*SEAICE_salinity*
770 & salt(I,j,kSurface,bi,bj)/SEAICE_deltaTtherm
771 #ifdef ALLOW_SALT_PLUME
772 C saltPlumeFlux is defined only during freezing:
773 saltPlumeFlux(I,J,bi,bj)=
774 & HEFFM(I,J,bi,bj)*saltWtrIce(I,J,bi,bj)*
775 & ICE2WATR*rhoConstFresh*(1-SEAICE_salinity)*
776 & salt(I,j,kSurface,bi,bj)/SEAICE_deltaTtherm
777 C if SaltPlumeSouthernOcean=.FALSE. turn off salt plume in Southern Ocean
778 IF ( .NOT. SaltPlumeSouthernOcean ) THEN
779 IF ( YC(I,J,bi,bj) .LT. 0.0 _d 0 )
780 & saltPlumeFlux(i,j,bi,bj) = 0.0 _d 0
781 ENDIF
782
783 #endif /* ALLOW_SALT_PLUME */
784 C saltWtrIce < 0 : m of sea ice that is melted
785 ELSE
786 saltFlux(I,J,bi,bj) =
787 & HEFFM(I,J,bi,bj)*saltWtrIce(I,J,bi,bj)*
788 & HSALT(I,J,bi,bj)/
789 & (HEFF(I,J,bi,bj)-saltWtrIce(I,J,bi,bj))/
790 & SEAICE_deltaTtherm
791 #ifdef ALLOW_SALT_PLUME
792 saltPlumeFlux(i,j,bi,bj) = 0.0 _d 0
793 #endif /* ALLOW_SALT_PLUME */
794 ENDIF
795 C update HSALT based on surface saltFlux
796 HSALT(I,J,bi,bj) = HSALT(I,J,bi,bj) +
797 & saltFlux(I,J,bi,bj) * SEAICE_deltaTtherm
798 saltFlux(I,J,bi,bj) =
799 & saltFlux(I,J,bi,bj) + saltFluxAdjust(I,J)
800 C set HSALT = 0 if HEFF = 0 and compute salt to dump into ocean
801 IF ( HEFF(I,J,bi,bj) .EQ. 0.0 ) THEN
802 saltFlux(I,J,bi,bj) = saltFlux(I,J,bi,bj) -
803 & HEFFM(I,J,bi,bj) * HSALT(I,J,bi,bj) /
804 & SEAICE_deltaTtherm
805 HSALT(I,J,bi,bj) = 0.0 _d 0
806 #ifdef ALLOW_SALT_PLUME
807 saltPlumeFlux(i,j,bi,bj) = 0.0 _d 0
808 #endif /* ALLOW_SALT_PLUME */
809 ENDIF
810 ENDDO
811 ENDDO
812 #endif /* SEAICE_SALINITY */
813 #endif /* ALLOW_ATM_TEMP */
814
815 DO J=1,sNy
816 DO I=1,sNx
817 C NOW GET TOTAL QNET AND QSW
818 QNET(I,J,bi,bj) = QNETI(I,J) * AREANm1(I,J,bi,bj)
819 & +a_QbyATM_open(I,J) * (ONE-AREANm1(I,J,bi,bj))
820 QSW(I,J,bi,bj) = a_QSWbyATM_cover(I,J) * AREANm1(I,J,bi,bj)
821 & +a_QSWbyATM_open(I,J) * (ONE-AREANm1(I,J,bi,bj))
822 ENDDO
823 ENDDO
824
825 #ifdef ALLOW_DIAGNOSTICS
826 IF ( useDiagnostics ) THEN
827 IF ( DIAGNOSTICS_IS_ON('SIqneto ',myThid) ) THEN
828 DO J=1,sNy
829 DO I=1,sNx
830 DIAGarray(I,J) = a_QbyATM_open(I,J) *
831 & (ONE-areaNm1(I,J,bi,bj))
832 ENDDO
833 ENDDO
834 CALL DIAGNOSTICS_FILL(DIAGarray,'SIqneto ',0,1,3,bi,bj,myThid)
835 ENDIF
836 IF ( DIAGNOSTICS_IS_ON('SIqneti ',myThid) ) THEN
837 DO J=1,sNy
838 DO I=1,sNx
839 DIAGarray(I,J) = QNETI(I,J) * areaNm1(I,J,bi,bj)
840 ENDDO
841 ENDDO
842 CALL DIAGNOSTICS_FILL(DIAGarray,'SIqneti ',0,1,3,bi,bj,myThid)
843 ENDIF
844 ENDIF
845 #endif
846
847
848 DO J=1,sNy
849 DO I=1,sNx
850
851 C Add d_HEFFbyICEonOCN contribution to QNET
852 #ifdef SEAICE_QBYICE_IS_WPERM2
853 tmpscal1=
854 & -maskC(I,J,kSurface,bi,bj)
855 & *(HeatCapacity_Cp*rUnit2mass/QI)
856 & *72.0764 _d 0
857 QNET(I,J,bi,bj) = QNET(I,J,bi,bj)
858 & + ( d_QbyICE(I,J) + d_QbySNW(I,J) )
859 & * tmpscal1
860 #else
861 tmpscal1 =
862 & - ( d_HEFFbyICEonOCN(I,J)+d_HEFFbySNWonOCN(I,J) )
863 & *recip_dRf(kSurface)*recip_hFacC(i,j,kSurface,bi,bj)
864 & *72.0764 _d 0
865 QNET(I,J,bi,bj) = QNET(I,J,bi,bj)
866 & +tmpscal1
867 & /SEAICE_deltaTtherm*maskC(I,J,kSurface,bi,bj)
868 & *HeatCapacity_Cp*rUnit2mass
869 & *drF(kSurface)*hFacC(i,j,kSurface,bi,bj)
870 #endif
871
872 ENDDO
873 ENDDO
874
875 #ifdef SEAICE_DEBUG
876 CALL PLOT_FIELD_XYRL( QSW,'Current QSW ', myIter, myThid )
877 CALL PLOT_FIELD_XYRL( QNET,'Current QNET ', myIter, myThid )
878 CALL PLOT_FIELD_XYRL( EmPmR,'Current EmPmR ', myIter, myThid )
879 #endif /* SEAICE_DEBUG */
880
881 crg Added by Ralf Giering: do we need DO_WE_NEED_THIS ?
882 #define DO_WE_NEED_THIS
883 C NOW ZERO OUTSIDE POINTS
884 #ifdef ALLOW_AUTODIFF_TAMC
885 CADJ STORE area(:,:,bi,bj) = comlev1_bibj,
886 CADJ & key = iicekey, byte = isbyte
887 CADJ STORE heff(:,:,bi,bj) = comlev1_bibj,
888 CADJ & key = iicekey, byte = isbyte
889 #endif /* ALLOW_AUTODIFF_TAMC */
890 DO J=1,sNy
891 DO I=1,sNx
892 C NOW SET AREA(I,J,bi,bj)=0 WHERE NO ICE IS
893 AREA(I,J,bi,bj)=MIN(AREA(I,J,bi,bj)
894 & ,HEFF(I,J,bi,bj)/.0001 _d 0)
895 ENDDO
896 ENDDO
897 #ifdef ALLOW_AUTODIFF_TAMC
898 CADJ STORE area(:,:,bi,bj) = comlev1_bibj,
899 CADJ & key = iicekey, byte = isbyte
900 #endif /* ALLOW_AUTODIFF_TAMC */
901 DO J=1,sNy
902 DO I=1,sNx
903 C NOW TRUNCATE AREA
904 #ifdef DO_WE_NEED_THIS
905 AREA(I,J,bi,bj)=MIN(ONE,AREA(I,J,bi,bj))
906 ENDDO
907 ENDDO
908 #ifdef ALLOW_AUTODIFF_TAMC
909 CADJ STORE area(:,:,bi,bj) = comlev1_bibj,
910 CADJ & key = iicekey, byte = isbyte
911 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
912 CADJ & key = iicekey, byte = isbyte
913 #endif /* ALLOW_AUTODIFF_TAMC */
914 DO J=1,sNy
915 DO I=1,sNx
916 AREA(I,J,bi,bj) = MAX(ZERO,AREA(I,J,bi,bj))
917 HSNOW(I,J,bi,bj) = MAX(ZERO,HSNOW(I,J,bi,bj))
918 #endif /* DO_WE_NEED_THIS */
919 AREA(I,J,bi,bj) = AREA(I,J,bi,bj)*HEFFM(I,J,bi,bj)
920 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj)*HEFFM(I,J,bi,bj)
921 #ifdef SEAICE_CAP_HEFF
922 HEFF(I,J,bi,bj)=MIN(MAX_HEFF,HEFF(I,J,bi,bj))
923 #endif /* SEAICE_CAP_HEFF */
924 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)*HEFFM(I,J,bi,bj)
925 ENDDO
926 ENDDO
927
928 #ifdef ALLOW_DIAGNOSTICS
929 IF ( useDiagnostics ) THEN
930 IF ( DIAGNOSTICS_IS_ON('SIthdgrh',myThid) ) THEN
931 C use (abuse) GHEFF to diagnose the total thermodynamic growth rate
932 DO J=1,sNy
933 DO I=1,sNx
934 GHEFF(I,J) = (HEFF(I,J,bi,bj)-HEFFNm1(I,J,bi,bj))
935 & /SEAICE_deltaTtherm
936 ENDDO
937 ENDDO
938 CALL DIAGNOSTICS_FILL(GHEFF,'SIthdgrh',0,1,3,bi,bj,myThid)
939 ENDIF
940 ENDIF
941 #endif /* ALLOW_DIAGNOSTICS */
942
943 #ifdef ALLOW_SEAICE_FLOODING
944 IF ( SEAICEuseFlooding ) THEN
945 C convert snow to ice if submerged
946 DO J=1,sNy
947 DO I=1,sNx
948 hDraft = (HSNOW(I,J,bi,bj)*SEAICE_rhoSnow
949 & +HEFF(I,J,bi,bj)*SEAICE_rhoIce)/1000. _d 0
950 C here GEFF is the gain of ice due to flooding
951 GHEFF(I,J) = hDraft - MIN(hDraft,HEFF(I,J,bi,bj))
952 HEFF(I,J,bi,bj) = HEFF(I,J,bi,bj) + GHEFF(I,J)
953 HSNOW(I,J,bi,bj) = MAX(0. _d 0,
954 & HSNOW(I,J,bi,bj)-GHEFF(I,J)*ICE2SNOW)
955 ENDDO
956 ENDDO
957 #ifdef ALLOW_DIAGNOSTICS
958 IF ( useDiagnostics ) THEN
959 IF ( DIAGNOSTICS_IS_ON('SIsnwice',myThid) ) THEN
960 C turn GHEFF into a rate
961 DO J=1,sNy
962 DO I=1,sNx
963 GHEFF(I,J) = GHEFF(I,J)/SEAICE_deltaTtherm
964 ENDDO
965 ENDDO
966 CALL DIAGNOSTICS_FILL(GHEFF,'SIsnwice',0,1,3,bi,bj,myThid)
967 ENDIF
968 ENDIF
969 #endif /* ALLOW_DIAGNOSTICS */
970 ENDIF
971 #endif /* ALLOW_SEAICE_FLOODING */
972
973 IF ( useRealFreshWaterFlux ) THEN
974 DO J=1,sNy
975 DO I=1,sNx
976 sIceLoad(i,j,bi,bj) = HEFF(I,J,bi,bj)*SEAICE_rhoIce
977 & + HSNOW(I,J,bi,bj)*SEAICE_rhoSnow
978 ENDDO
979 ENDDO
980 ENDIF
981
982 #ifdef SEAICE_AGE
983 # ifndef SEAICE_AGE_VOL
984 C Sources and sinks for sea ice age:
985 C assume that a) freezing: new ice fraction forms with zero age
986 C b) melting: ice fraction vanishes with current age
987 DO J=1,sNy
988 DO I=1,sNx
989 IF ( AREA(I,J,bi,bj) .GT. 0.15 ) THEN
990 IF ( AREA(i,j,bi,bj) .LT. old_AREA(i,j) ) THEN
991 C-- scale effective ice-age to account for ice-age sink associated with melting
992 IceAge(i,j,bi,bj) = IceAge(i,j,bi,bj)
993 & *AREA(i,j,bi,bj)/old_AREA(i,j)
994 ENDIF
995 C-- account for aging:
996 IceAge(i,j,bi,bj) = IceAge(i,j,bi,bj)
997 & + AREA(i,j,bi,bj) * SEAICE_deltaTtherm
998 ELSE
999 IceAge(i,j,bi,bj) = ZERO
1000 ENDIF
1001 ENDDO
1002 ENDDO
1003 # else /* ifdef SEAICE_AGE_VOL */
1004 C Sources and sinks for sea ice age:
1005 C assume that a) freezing: new ice volume forms with zero age
1006 C b) melting: ice volume vanishes with current age
1007 DO J=1,sNy
1008 DO I=1,sNx
1009 C-- compute actual age from effective age:
1010 IF (OLD_AREA(i,j).GT.0. _d 0) THEN
1011 age_actual=IceAge(i,j,bi,bj)/OLD_AREA(i,j)
1012 ELSE
1013 age_actual=0. _d 0
1014 ENDIF
1015 IF ( (OLD_HEFF(i,j).LT.HEFF(i,j,bi,bj)).AND.
1016 & (AREA(i,j,bi,bj).GT.0.15) ) THEN
1017 age_actual=age_actual*OLD_HEFF(i,j)/
1018 & HEFF(i,j,bi,bj)+SEAICE_deltaTtherm
1019 ELSEIF (AREA(i,j,bi,bj).LE.0.15) THEN
1020 age_actual=0. _d 0
1021 ELSE
1022 age_actual=age_actual+SEAICE_deltaTtherm
1023 ENDIF
1024 C-- re-scale to effective age:
1025 IceAge(i,j,bi,bj) = age_actual*AREA(i,j,bi,bj)
1026 ENDDO
1027 ENDDO
1028 # endif /* SEAICE_AGE_VOL */
1029 #endif /* SEAICE_AGE */
1030
1031 ENDDO
1032 ENDDO
1033
1034 RETURN
1035 END

  ViewVC Help
Powered by ViewVC 1.1.22