/[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.41 - (show annotations) (download)
Fri Dec 14 21:52:02 2007 UTC (16 years, 6 months ago) by dimitri
Branch: MAIN
CVS Tags: checkpoint59l
Changes since 1.40: +11 -1 lines
  - reformulated availHeat in seaice_growth.F to be independent of AREA

1 C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_growth.F,v 1.40 2007/12/06 05:23:41 dimitri Exp $
2 C $Name: $
3
4 #include "SEAICE_OPTIONS.h"
5
6 CStartOfInterface
7 SUBROUTINE SEAICE_GROWTH( myTime, myIter, myThid )
8 C /==========================================================\
9 C | SUBROUTINE seaice_growth |
10 C | o Updata ice thickness and snow depth |
11 C |==========================================================|
12 C \==========================================================/
13 IMPLICIT NONE
14
15 C === Global variables ===
16 #include "SIZE.h"
17 #include "EEPARAMS.h"
18 #include "PARAMS.h"
19 #include "DYNVARS.h"
20 #include "GRID.h"
21 #include "FFIELDS.h"
22 #include "SEAICE_PARAMS.h"
23 #include "SEAICE.h"
24 #ifdef ALLOW_EXF
25 # include "EXF_OPTIONS.h"
26 # include "EXF_FIELDS.h"
27 # include "EXF_PARAM.h"
28 #endif
29 #ifdef ALLOW_SALT_PLUME
30 # include "SALT_PLUME.h"
31 #endif
32 #ifdef ALLOW_AUTODIFF_TAMC
33 # include "tamc.h"
34 #endif
35
36 C === Routine arguments ===
37 C myTime - Simulation time
38 C myIter - Simulation timestep number
39 C myThid - Thread no. that called this routine.
40 _RL myTime
41 INTEGER myIter, myThid
42 CEndOfInterface
43
44 C === Local variables ===
45 C i,j,bi,bj - Loop counters
46
47 INTEGER i, j, bi, bj
48 C number of surface interface layer
49 INTEGER kSurface
50 C constants
51 _RL TBC, SDF, ICE2SNOW
52 _RL QI, recip_QI, QS, recip_QS
53 C auxillary variables
54 _RL availHeat, hEffOld, snowEnergy
55 _RL growthHEFF, growthNeg
56 #ifdef ALLOW_SEAICE_FLOODING
57 _RL hDraft
58 #endif /* ALLOW_SEAICE_FLOODING */
59 _RL GAREA (1:sNx,1:sNy)
60 _RL GHEFF (1:sNx,1:sNy)
61 C RESID_HEAT is residual heat above freezing in equivalent m of ice
62 _RL RESID_HEAT (1:sNx,1:sNy)
63 #ifdef SEAICE_SALINITY
64 _RL saltFluxAdjust(1:sNx,1:sNy)
65 #endif
66
67 C FICE - thermodynamic ice growth rate over sea ice in W/m^2
68 C >0 causes ice growth, <0 causes snow and sea ice melt
69 C FHEFF - effective thermodynamic ice growth rate over sea ice in W/m^2
70 C >0 causes ice growth, <0 causes snow and sea ice melt
71 C QNETO - thermodynamic ice growth rate over open water in W/m^2
72 C ( = surface heat flux )
73 C >0 causes ice growth, <0 causes snow and sea ice melt
74 C QNETI - net surface heat flux under ice in W/m^2
75 C QSWO - short wave heat flux over ocean in W/m^2
76 C QSWI - short wave heat flux under ice in W/m^2
77 _RL FHEFF (1:sNx,1:sNy)
78 _RL FICE (1:sNx,1:sNy)
79 _RL QNETO (1:sNx,1:sNy)
80 _RL QNETI (1:sNx,1:sNy)
81 _RL QSWO (1:sNx,1:sNy)
82 _RL QSWI (1:sNx,1:sNy)
83 C
84 _RL HCORR (1:sNx,1:sNy)
85 C saltWtrIce contains m of salty ice melted (<0) or created (>0)
86 _RL saltWtrIce (1:sNx,1:sNy)
87 C frWtrIce contains m of freshwater ice melted (<0) or created (>0)
88 C that is, ice due to precipitation or snow
89 _RL frWtrIce (1:sNx,1:sNy)
90 C frWtrAtm contains freshwater flux from the atmosphere
91 _RL frWtrAtm (1:sNx,1:sNy)
92 C actual ice thickness with upper and lower limit
93 _RL HICE (1:sNx,1:sNy)
94 C actual snow thickness
95 _RL hSnwLoc (1:sNx,1:sNy)
96 C wind speed
97 _RL UG (1:sNx,1:sNy)
98 _RL SPEED_SQ
99 C local copy of AREA
100 _RL areaLoc
101
102 #ifdef SEAICE_MULTICATEGORY
103 INTEGER it
104 INTEGER ilockey
105 _RL RK
106 _RL HICEP (1:sNx,1:sNy)
107 _RL FICEP (1:sNx,1:sNy)
108 _RL QSWIP (1:sNx,1:sNy)
109 #endif
110
111 #ifdef ALLOW_DIAGNOSTICS
112 LOGICAL DIAGNOSTICS_IS_ON
113 EXTERNAL DIAGNOSTICS_IS_ON
114 #endif
115
116 if ( buoyancyRelation .eq. 'OCEANICP' ) then
117 kSurface = Nr
118 else
119 kSurface = 1
120 endif
121
122 C FREEZING TEMP. OF SEA WATER (deg C)
123 TBC = SEAICE_freeze
124 C RATIO OF WATER DESITY TO SNOW DENSITY
125 SDF = 1000.0 _d 0/330.0 _d 0
126 C RATIO OF SEA ICE DENSITY to SNOW DENSITY
127 ICE2SNOW = SDF * ICE2WATR
128 C HEAT OF FUSION OF ICE (m^3/J)
129 QI = 302.0 _d +06
130 recip_QI = 1.0 _d 0 / QI
131 C HEAT OF FUSION OF SNOW (J/m^3)
132 QS = 1.1 _d +08
133 recip_QS = 1.1 _d 0 / QS
134
135 DO bj=myByLo(myThid),myByHi(myThid)
136 DO bi=myBxLo(myThid),myBxHi(myThid)
137 c
138 #ifdef ALLOW_AUTODIFF_TAMC
139 act1 = bi - myBxLo(myThid)
140 max1 = myBxHi(myThid) - myBxLo(myThid) + 1
141 act2 = bj - myByLo(myThid)
142 max2 = myByHi(myThid) - myByLo(myThid) + 1
143 act3 = myThid - 1
144 max3 = nTx*nTy
145 act4 = ikey_dynamics - 1
146 iicekey = (act1 + 1) + act2*max1
147 & + act3*max1*max2
148 & + act4*max1*max2*max3
149 #endif /* ALLOW_AUTODIFF_TAMC */
150 C
151 C initialise a few fields
152 C
153 #ifdef ALLOW_AUTODIFF_TAMC
154 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
155 CADJ & key = iicekey, byte = isbyte
156 CADJ STORE qnet(:,:,bi,bj) = comlev1_bibj,
157 CADJ & key = iicekey, byte = isbyte
158 CADJ STORE qsw(:,:,bi,bj) = comlev1_bibj,
159 CADJ & key = iicekey, byte = isbyte
160 #endif /* ALLOW_AUTODIFF_TAMC */
161 DO J=1,sNy
162 DO I=1,sNx
163 FHEFF(I,J) = 0.0 _d 0
164 FICE (I,J) = 0.0 _d 0
165 QNETO(I,J) = 0.0 _d 0
166 QNETI(I,J) = 0.0 _d 0
167 QSWO (I,J) = 0.0 _d 0
168 QSWI (I,J) = 0.0 _d 0
169 HCORR(I,J) = 0.0 _d 0
170 saltWtrIce(I,J) = 0.0 _d 0
171 frWtrIce(I,J) = 0.0 _d 0
172 frWtrAtm(I,J) = 0.0 _d 0
173 RESID_HEAT(I,J) = 0.0 _d 0
174 #ifdef SEAICE_SALINITY
175 saltFluxAdjust(I,J) = 0.0 _d 0
176 #endif
177 #ifdef SEAICE_MULTICATEGORY
178 FICEP(I,J) = 0.0 _d 0
179 QSWIP(I,J) = 0.0 _d 0
180 #endif
181 ENDDO
182 ENDDO
183 #ifdef ALLOW_AUTODIFF_TAMC
184 CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj,
185 CADJ & key = iicekey, byte = isbyte
186 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
187 CADJ & key = iicekey, byte = isbyte
188 #endif /* ALLOW_AUTODIFF_TAMC */
189 DO J=1,sNy
190 DO I=1,sNx
191 C COMPUTE ACTUAL ICE THICKNESS AND PUT MINIMUM/MAXIMUM
192 C ON ICE THICKNESS FOR BUDGET COMPUTATION
193 C The default of A22 = 0.15 is a common threshold for defining
194 C the ice edge. This ice concentration usually does not occur
195 C due to thermodynamics but due to advection.
196 areaLoc = MAX(A22,AREA(I,J,2,bi,bj))
197 HICE(I,J) = HEFF(I,J,2,bi,bj)/areaLoc
198 C Do we know what this is for?
199 HICE(I,J) = MAX(HICE(I,J),0.05 _d +00)
200 C Capping the actual ice thickness effectively enforces a
201 C minimum of heat flux through the ice and helps getting rid of
202 C very thick ice.
203 cdm actually, this does exactly the opposite, i.e., ice is thicker
204 cdm when HICE is capped, so I am commenting out
205 cdm HICE(I,J) = MIN(HICE(I,J),9.0 _d +00)
206 hSnwLoc(I,J) = HSNOW(I,J,bi,bj)/areaLoc
207 ENDDO
208 ENDDO
209
210 C NOW DETERMINE MIXED LAYER TEMPERATURE
211 DO J=1,sNy
212 DO I=1,sNx
213 TMIX(I,J,bi,bj)=theta(I,J,kSurface,bi,bj)+273.16 _d +00
214 #ifdef SEAICE_DEBUG
215 TMIX(I,J,bi,bj)=MAX(TMIX(I,J,bi,bj),271.2 _d +00)
216 #endif
217 ENDDO
218 ENDDO
219
220 C THERMAL WIND OF ATMOSPHERE
221 DO J=1,sNy
222 DO I=1,sNx
223 CMLC this seems to be more natural as we do compute the wind speed in
224 CMLC pkg/exf/exf_wind.F, but it changes the results
225 CML UG(I,J) = MAX(SEAICE_EPS,wspeed(I,J,bi,bj))
226 SPEED_SQ = UWIND(I,J,bi,bj)**2 + VWIND(I,J,bi,bj)**2
227 IF ( SPEED_SQ .LE. SEAICE_EPS_SQ ) THEN
228 UG(I,J)=SEAICE_EPS
229 ELSE
230 UG(I,J)=SQRT(SPEED_SQ)
231 ENDIF
232 ENDDO
233 ENDDO
234
235
236 #ifdef ALLOW_AUTODIFF_TAMC
237 cphCADJ STORE heff = comlev1, key = ikey_dynamics
238 cphCADJ STORE hsnow = comlev1, key = ikey_dynamics
239 cphCADJ STORE uwind = comlev1, key = ikey_dynamics
240 cphCADJ STORE vwind = comlev1, key = ikey_dynamics
241 c
242 CADJ STORE tice = comlev1, key = ikey_dynamics
243 # ifdef SEAICE_MULTICATEGORY
244 CADJ STORE tices = comlev1, key = ikey_dynamics
245 # endif
246 #endif /* ALLOW_AUTODIFF_TAMC */
247
248 C NOW DETERMINE GROWTH RATES
249 C FIRST DO OPEN WATER
250 CALL SEAICE_BUDGET_OCEAN(
251 I UG,
252 U TMIX,
253 O QNETO, QSWO,
254 I bi, bj, myThid )
255
256 C NOW DO ICE
257 IF (useRelativeWind) THEN
258 C Compute relative wind speed over sea ice.
259 DO J=1,sNy
260 DO I=1,sNx
261 SPEED_SQ =
262 & (uWind(I,J,bi,bj)
263 & +0.5 _d 0*(uVel(i,j,1,bi,bj)+uVel(i+1,j,1,bi,bj))
264 & -0.5 _d 0*(uice(i,j,1,bi,bj)+uice(i+1,j,1,bi,bj)))**2
265 & +(vWind(I,J,bi,bj)
266 & +0.5 _d 0*(vVel(i,j,1,bi,bj)+vVel(i,j+1,1,bi,bj))
267 & -0.5 _d 0*(vice(i,j,1,bi,bj)+vice(i,j+1,1,bi,bj)))**2
268 IF ( SPEED_SQ .LE. SEAICE_EPS_SQ ) THEN
269 UG(I,J)=SEAICE_EPS
270 ELSE
271 UG(I,J)=SQRT(SPEED_SQ)
272 ENDIF
273 ENDDO
274 ENDDO
275 ENDIF
276 #ifdef SEAICE_MULTICATEGORY
277 C-- Start loop over muli-categories
278 DO IT=1,MULTDIM
279 #ifdef ALLOW_AUTODIFF_TAMC
280 ilockey = (iicekey-1)*MULTDIM + IT
281 CADJ STORE tices(:,:,it,bi,bj) = comlev1_multdim,
282 CADJ & key = ilockey, byte = isbyte
283 #endif /* ALLOW_AUTODIFF_TAMC */
284 RK=REAL(IT)
285 DO J=1,sNy
286 DO I=1,sNx
287 HICEP(I,J)=(HICE(I,J)/MULTDIM)*((2.0 _d 0*RK)-1.0 _d 0)
288 TICE(I,J,bi,bj)=TICES(I,J,IT,bi,bj)
289 ENDDO
290 ENDDO
291 CALL SEAICE_BUDGET_ICE(
292 I UG, HICEP, hSnwLoc,
293 U TICE,
294 O FICEP, QSWIP,
295 I bi, bj, myThid )
296 DO J=1,sNy
297 DO I=1,sNx
298 C average surface heat fluxes/growth rates
299 FICE (I,J) = FICE(I,J) + FICEP(I,J)/MULTDIM
300 QSWI (I,J) = QSWI(I,J) + QSWIP(I,J)/MULTDIM
301 TICES(I,J,IT,bi,bj) = TICE(I,J,bi,bj)
302 ENDDO
303 ENDDO
304 ENDDO
305 C-- End loop over multi-categories
306 #else /* SEAICE_MULTICATEGORY */
307 CALL SEAICE_BUDGET_ICE(
308 I UG, HICE, hSnwLoc,
309 U TICE,
310 O FICE, QSWI,
311 I bi, bj, myThid )
312 #endif /* SEAICE_MULTICATEGORY */
313
314 #ifdef ALLOW_AUTODIFF_TAMC
315 CADJ STORE theta(:,:,:,bi,bj)= comlev1_bibj,
316 CADJ & key = iicekey, byte = isbyte
317 CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj,
318 CADJ & key = iicekey, byte = isbyte
319 #endif /* ALLOW_AUTODIFF_TAMC */
320 C
321 C-- compute and apply ice growth due to oceanic heat flux from below
322 C
323 DO J=1,sNy
324 DO I=1,sNx
325 C-- Create or melt sea-ice so that first-level oceanic temperature
326 C is approximately at the freezing point when there is sea-ice.
327 C Initially the units of YNEG/availHeat are m of sea-ice.
328 C The factor dRf(1)/72.0764, used to convert temperature
329 C change in deg K to m of sea-ice, is approximately:
330 C dRf(1) * (sea water heat capacity = 3996 J/kg/K)
331 C * (density of sea-water = 1026 kg/m^3)
332 C / (latent heat of fusion of sea-ice = 334000 J/kg)
333 C / (density of sea-ice = 910 kg/m^3)
334 C Negative YNEG/availHeat leads to ice growth.
335 C Positive YNEG/availHeat leads to ice melting.
336 IF ( .NOT. inAdMode ) THEN
337 #ifdef SEAICE_VARIABLE_FREEZING_POINT
338 TBC = -0.0575 _d 0*salt(I,J,kSurface,bi,bj) + 0.0901 _d 0
339 #endif /* SEAICE_VARIABLE_FREEZING_POINT */
340 #ifdef SEAICE_BREAKS_VERIFICATION
341 C To first order, the "thickness" of ice that melts during a given
342 C period of time due to an excess or to a deficit of heat in the
343 C mixed layer should be the same irrespective of sea ice concentration.
344 C This change breaks the pkg/seaice verification experiments.
345 availHeat = SEAICE_availHeatFrac * AREA(I,J,2,bi,bj)
346 & * (theta(I,J,kSurface,bi,bj)-TBC) * dRf(kSurface)
347 & * hFacC(i,j,kSurface,bi,bj) / 72.0764 _d 0
348 #else
349 availHeat = SEAICE_availHeatFrac
350 & * (theta(I,J,kSurface,bi,bj)-TBC) * dRf(kSurface)
351 & * hFacC(i,j,kSurface,bi,bj) / 72.0764 _d 0
352 #endif SEAICE_BREAKS_VERIFICATION
353 ELSE
354 availHeat = 0.
355 ENDIF
356 C local copy of old effective ice thickness
357 hEffOld = HEFF(I,J,1,bi,bj)
358 C Melt (availHeat>0) or create (availHeat<0) sea ice
359 HEFF(I,J,1,bi,bj) = MAX(ZERO,HEFF(I,J,1,bi,bj)-availHeat)
360 C
361 YNEG(I,J,bi,bj) = hEffOld - HEFF(I,J,1,bi,bj)
362 C
363 saltWtrIce(I,J) = saltWtrIce(I,J) - YNEG(I,J,bi,bj)
364 RESID_HEAT(I,J) = availHeat - YNEG(I,J,bi,bj)
365 C YNEG now contains m of ice melted (>0) or created (<0)
366 C saltWtrIce contains m of ice melted (<0) or created (>0)
367 C RESID_HEAT is residual heat above freezing in equivalent m of ice
368 ENDDO
369 ENDDO
370
371 cph(
372 #ifdef ALLOW_AUTODIFF_TAMC
373 cphCADJ STORE heff = comlev1, key = ikey_dynamics
374 cphCADJ STORE hsnow = comlev1, key = ikey_dynamics
375 #endif
376 cph)
377 c
378 #ifdef ALLOW_AUTODIFF_TAMC
379 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
380 CADJ & key = iicekey, byte = isbyte
381 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
382 CADJ & key = iicekey, byte = isbyte
383 CADJ STORE fice(:,:) = comlev1_bibj,
384 CADJ & key = iicekey, byte = isbyte
385 #endif /* ALLOW_AUTODIFF_TAMC */
386 cph)
387 C
388 C-- compute and apply ice growth due to atmospheric fluxes from above
389 C
390 DO J=1,sNy
391 DO I=1,sNx
392 C NOW CALCULATE CORRECTED effective growth in J/m^2 (>0=melt)
393 GHEFF(I,J)=-SEAICE_deltaTtherm*FICE(I,J)*AREA(I,J,2,bi,bj)
394 ENDDO
395 ENDDO
396
397 #ifdef ALLOW_AUTODIFF_TAMC
398 CADJ STORE fice(:,:) = comlev1_bibj,
399 CADJ & key = iicekey, byte = isbyte
400 #endif /* ALLOW_AUTODIFF_TAMC */
401
402 DO J=1,sNy
403 DO I=1,sNx
404 IF(FICE(I,J).LT.ZERO.AND.AREA(I,J,2,bi,bj).GT.ZERO) THEN
405 C use FICE to melt snow and CALCULATE CORRECTED GROWTH
406 C effective snow thickness in J/m^2
407 snowEnergy=HSNOW(I,J,bi,bj)*QS
408 IF(GHEFF(I,J).LE.snowEnergy) THEN
409 C not enough heat to melt all snow; use up all heat flux FICE
410 HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)-GHEFF(I,J)/QS
411 C SNOW CONVERTED INTO WATER AND THEN INTO equivalent m of ICE melt
412 C The factor 1/ICE2SNOW converts m of snow to m of sea-ice
413 frWtrIce(I,J) = frWtrIce(I,J) - GHEFF(I,J)/(QS*ICE2SNOW)
414 FICE (I,J) = ZERO
415 ELSE
416 C enought heat to melt snow completely;
417 C compute remaining heat flux that will melt ice
418 FICE(I,J)=-(GHEFF(I,J)-snowEnergy)/
419 & SEAICE_deltaTtherm/AREA(I,J,2,bi,bj)
420 C convert all snow to melt water (fresh water flux)
421 frWtrIce(I,J) = frWtrIce(I,J)
422 & -HSNOW(I,J,bi,bj)/ICE2SNOW
423 HSNOW(I,J,bi,bj)=0.0 _d 0
424 END IF
425 END IF
426 ENDDO
427 ENDDO
428
429 #ifdef ALLOW_AUTODIFF_TAMC
430 CADJ STORE fice(:,:) = comlev1_bibj,
431 CADJ & key = iicekey, byte = isbyte
432 #endif /* ALLOW_AUTODIFF_TAMC */
433
434 DO J=1,sNy
435 DO I=1,sNx
436 C now get cell averaged growth rate in W/m^2, >0 causes ice growth
437 FHEFF(I,J)= FICE(I,J) * AREA(I,J,2,bi,bj)
438 & + QNETO(I,J) * (ONE-AREA(I,J,2,bi,bj))
439 ENDDO
440 ENDDO
441 cph(
442 #ifdef ALLOW_AUTODIFF_TAMC
443 CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj,
444 CADJ & key = iicekey, byte = isbyte
445 CADJ STORE fice(:,:) = comlev1_bibj,
446 CADJ & key = iicekey, byte = isbyte
447 CADJ STORE fheff(:,:) = comlev1_bibj,
448 CADJ & key = iicekey, byte = isbyte
449 CADJ STORE qneto(:,:) = comlev1_bibj,
450 CADJ & key = iicekey, byte = isbyte
451 CADJ STORE qswi(:,:) = comlev1_bibj,
452 CADJ & key = iicekey, byte = isbyte
453 CADJ STORE qswo(:,:) = comlev1_bibj,
454 CADJ & key = iicekey, byte = isbyte
455 #endif /* ALLOW_AUTODIFF_TAMC */
456 cph)
457 C
458 C First update (freeze or melt) ice area
459 C
460 DO J=1,sNy
461 DO I=1,sNx
462 C negative growth in meters of ice (>0 for melting)
463 growthNeg = -SEAICE_deltaTtherm*FHEFF(I,J)*recip_QI
464 C negative growth must not exceed effective ice thickness (=volume)
465 C (that is, cannot melt more than all the ice)
466 growthHEFF = -ONE*MIN(HEFF(I,J,1,bi,bj),growthNeg)
467 C growthHEFF < 0 means melting
468 HCORR(I,J) = MIN(ZERO,growthHEFF)
469 C gain of new effective ice thickness over open water (>0 by definition)
470 GAREA(I,J) = MAX(ZERO,SEAICE_deltaTtherm*QNETO(I,J)*recip_QI)
471 CML removed these loops and moved TAMC store directive up
472 CML ENDDO
473 CML ENDDO
474 CML#ifdef ALLOW_AUTODIFF_TAMC
475 CMLCADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
476 CMLCADJ & key = iicekey, byte = isbyte
477 CML#endif
478 CML DO J=1,sNy
479 CML DO I=1,sNx
480 C Here we finally compute the new AREA
481 AREA(I,J,1,bi,bj)=AREA(I,J,1,bi,bj)+
482 & (ONE-AREA(I,J,2,bi,bj))*GAREA(I,J)/HO
483 & +HALF*HCORR(I,J)*AREA(I,J,2,bi,bj)
484 & /(HEFF(I,J,1,bi,bj)+.00001 _d 0)
485 ENDDO
486 ENDDO
487 #ifdef ALLOW_AUTODIFF_TAMC
488 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
489 CADJ & key = iicekey, byte = isbyte
490 #endif
491 C
492 C now update (freeze or melt) HEFF
493 C
494 DO J=1,sNy
495 DO I=1,sNx
496 C negative growth (>0 for melting) of existing ice in meters
497 growthNeg = -SEAICE_deltaTtherm*
498 & FICE(I,J)*recip_QI*AREA(I,J,2,bi,bj)
499 C negative growth must not exceed effective ice thickness (=volume)
500 C (that is, cannot melt more than all the ice)
501 growthHEFF = -ONE*MIN(HEFF(I,J,1,bi,bj),growthNeg)
502 C growthHEFF < 0 means melting
503 HEFF(I,J,1,bi,bj)= HEFF(I,J,1,bi,bj) + growthHEFF
504 C add effective growth to fresh water of ice
505 saltWtrIce(I,J) = saltWtrIce(I,J) + growthHEFF
506
507 C now calculate QNETI under ice (if any) as the difference between
508 C the available "heat flux" growthNeg and the actual growthHEFF;
509 C keep in mind that growthNeg and growthHEFF have different signs
510 C by construction
511 QNETI(I,J) = (growthHEFF + growthNeg)*QI/SEAICE_deltaTtherm
512
513 C now update other things
514
515 #ifdef ALLOW_ATM_TEMP
516 IF(FICE(I,J).GT.ZERO) THEN
517 C freezing, add precip as snow
518 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)+SEAICE_deltaTtherm*
519 & PRECIP(I,J,bi,bj)*AREA(I,J,2,bi,bj)*SDF
520 ELSE
521 C add precip as rain, water converted into equivalent m of
522 C ice by 1/ICE2WATR.
523 C Do not get confused by the sign:
524 C precip > 0 for downward flux of fresh water
525 C frWtrIce > 0 for more ice (corresponds to an upward "fresh water flux"),
526 C so that here the rain is added *as if* it is melted ice (which is not
527 C true, but just a trick; physically the rain just runs as water
528 C through the ice into the ocean)
529 frWtrIce(I,J) = frWtrIce(I,J)
530 & -PRECIP(I,J,bi,bj)*AREA(I,J,2,bi,bj)*
531 & SEAICE_deltaTtherm/ICE2WATR
532 ENDIF
533 #else /* ALLOW_ATM_TEMP */
534 STOP 'ABNORMAL END: S/R THSICE_GROWTH: ATM_TEMP undef'
535 #endif /* ALLOW_ATM_TEMP */
536
537 ENDDO
538 ENDDO
539
540 #ifdef ALLOW_AUTODIFF_TAMC
541 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
542 CADJ & key = iicekey, byte = isbyte
543 #endif
544
545 cph( very sensitive bit here by JZ
546 #ifndef SEAICE_EXCLUDE_FOR_EXACT_AD_TESTING
547 DO J=1,sNy
548 DO I=1,sNx
549 C Now melt snow if there is residual heat left in surface level
550 C Note that units of YNEG and frWtrIce are m of ice
551 IF( RESID_HEAT(I,J) .GT. ZERO .AND.
552 & HSNOW(I,J,bi,bj) .GT. ZERO ) THEN
553 GHEFF(I,J) = MIN( HSNOW(I,J,bi,bj)/SDF/ICE2WATR,
554 & RESID_HEAT(I,J) )
555 YNEG(I,J,bi,bj) = YNEG(I,J,bi,bj) +GHEFF(I,J)
556 ENDIF
557 ENDDO
558 ENDDO
559
560 #ifdef ALLOW_AUTODIFF_TAMC
561 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
562 CADJ & key = iicekey, byte = isbyte
563 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
564 CADJ & key = iicekey, byte = isbyte
565 #endif
566 DO J=1,sNy
567 DO I=1,sNx
568 IF( RESID_HEAT(I,J) .GT. ZERO .AND.
569 & HSNOW(I,J,bi,bj) .GT. ZERO ) THEN
570 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)-GHEFF(I,J)*SDF*ICE2WATR
571 frWtrIce(I,J) = frWtrIce(I,J) -GHEFF(I,J)
572 ENDIF
573 ENDDO
574 ENDDO
575 #endif
576 cph)
577
578 #ifdef ALLOW_AUTODIFF_TAMC
579 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
580 CADJ & key = iicekey, byte = isbyte
581 # ifdef SEAICE_SALINITY
582 CADJ STORE hsalt(:,:,bi,bj) = comlev1_bibj,
583 CADJ & key = iicekey, byte = isbyte
584 # endif /* SEAICE_SALINITY */
585 #endif /* ALLOW_AUTODIFF_TAMC */
586
587 DO J=1,sNy
588 DO I=1,sNx
589
590 #ifdef ALLOW_ATM_TEMP
591
592 C NOW GET FRESH WATER FLUX
593 EmPmR(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*(
594 & ( EVAP(I,J,bi,bj)-PRECIP(I,J,bi,bj) )
595 & * ( ONE - AREA(I,J,2,bi,bj) )
596 #ifdef ALLOW_RUNOFF
597 & - RUNOFF(I,J,bi,bj)
598 #endif /* ALLOW_RUNOFF */
599 & + frWtrIce(I,J)*ICE2WATR/SEAICE_deltaTtherm
600 & + saltWtrIce(I,J)*ICE2WATR/SEAICE_deltaTtherm
601 & )*rhoConstFresh
602 #ifdef ALLOW_DIAGNOSTICS
603 frWtrAtm(I,J) = maskC(I,J,kSurface,bi,bj)*(
604 & PRECIP(I,J,bi,bj)
605 & - EVAP(I,J,bi,bj)
606 & *( ONE - AREA(I,J,2,bi,bj) )
607 & + RUNOFF(I,J,bi,bj)
608 & )
609 #endif /* ALLOW_DIAGNOSTICS */
610
611 C COMPUTE SURFACE SALT FLUX AND ADJUST ICE SALINITY
612 #ifdef SEAICE_SALINITY
613 C set HSALT = 0 if HSALT < 0 and compute salt to remove from ocean
614 IF ( HSALT(I,J,bi,bj) .LT. 0.0 ) THEN
615 saltFluxAdjust(I,J) = - HEFFM(I,J,bi,bj) *
616 & HSALT(I,J,bi,bj) / SEAICE_deltaTtherm
617 HSALT(I,J,bi,bj) = 0.0 _d 0
618 ENDIF
619
620 ENDDO
621 ENDDO
622
623 #ifdef ALLOW_AUTODIFF_TAMC
624 CADJ STORE hsalt(:,:,bi,bj) = comlev1_bibj,
625 CADJ & key = iicekey, byte = isbyte
626 #endif /* ALLOW_AUTODIFF_TAMC */
627
628 DO J=1,sNy
629 DO I=1,sNx
630
631 C saltWtrIce > 0 : m of sea ice that is created
632 IF ( saltWtrIce(I,J) .GE. 0.0 ) THEN
633 saltFlux(I,J,bi,bj) = HEFFM(I,J,bi,bj)*saltWtrIce(I,J)*
634 & ICE2WATR*rhoConstFresh*SEAICE_salinity*
635 & salt(I,j,kSurface,bi,bj)/SEAICE_deltaTtherm
636 #ifdef ALLOW_SALT_PLUME
637 C saltPlumeFlux is defined only during freezing:
638 saltPlumeFlux(I,J,bi,bj)=HEFFM(I,J,bi,bj)*saltWtrIce(I,J)*
639 & ICE2WATR*rhoConstFresh*(1-SEAICE_salinity)*
640 & salt(I,j,kSurface,bi,bj)/SEAICE_deltaTtherm
641 #endif /* ALLOW_SALT_PLUME */
642 C saltWtrIce < 0 : m of sea ice that is melted
643 ELSE
644 saltFlux(I,J,bi,bj) = HEFFM(I,J,bi,bj)*saltWtrIce(I,J)*
645 & HSALT(I,J,bi,bj)/(HEFF(I,J,1,bi,bj)-saltWtrIce(I,J))/
646 & SEAICE_deltaTtherm
647 #ifdef ALLOW_SALT_PLUME
648 saltPlumeFlux(i,j,bi,bj) = 0.0 _d 0
649 #endif /* ALLOW_SALT_PLUME */
650 ENDIF
651 C update HSALT based on surface saltFlux
652 HSALT(I,J,bi,bj) = HSALT(I,J,bi,bj) +
653 & saltFlux(I,J,bi,bj) * SEAICE_deltaTtherm
654 saltFlux(I,J,bi,bj) =
655 & saltFlux(I,J,bi,bj) + saltFluxAdjust(I,J)
656 C set HSALT = 0 if HEFF = 0 and compute salt to dump into ocean
657 IF ( HEFF(I,J,1,bi,bj) .EQ. 0.0 ) THEN
658 saltFlux(I,J,bi,bj) = saltFlux(I,J,bi,bj) -
659 & HEFFM(I,J,bi,bj) * HSALT(I,J,bi,bj) /
660 & SEAICE_deltaTtherm
661 HSALT(I,J,bi,bj) = 0.0 _d 0
662 #ifdef ALLOW_SALT_PLUME
663 saltPlumeFlux(i,j,bi,bj) = 0.0 _d 0
664 #endif /* ALLOW_SALT_PLUME */
665 ENDIF
666 #endif /* SEAICE_SALINITY */
667
668 #else /* ALLOW_ATM_TEMP */
669 STOP 'ABNORMAL END: S/R THSICE_GROWTH: ATM_TEMP undef'
670 #endif /* ALLOW_ATM_TEMP */
671
672 C NOW GET TOTAL QNET AND QSW
673 QNET(I,J,bi,bj) = QNETI(I,J) * AREA(I,J,2,bi,bj)
674 & +QNETO(I,J) * (ONE-AREA(I,J,2,bi,bj))
675 QSW(I,J,bi,bj) = QSWI(I,J) * AREA(I,J,2,bi,bj)
676 & +QSWO(I,J) * (ONE-AREA(I,J,2,bi,bj))
677
678 ENDDO
679 ENDDO
680
681 #ifdef ALLOW_AUTODIFF_TAMC
682 CADJ STORE yneg(:,:,bi,bj) = comlev1_bibj,
683 CADJ & key = iicekey, byte = isbyte
684 #endif
685 DO J=1,sNy
686 DO I=1,sNx
687 C Now convert YNEG back to deg K.
688 YNEG(I,J,bi,bj) = YNEG(I,J,bi,bj)*recip_dRf(kSurface) *
689 & recip_hFacC(i,j,kSurface,bi,bj)*72.0764 _d 0
690 ENDDO
691 ENDDO
692
693 #ifdef ALLOW_AUTODIFF_TAMC
694 CADJ STORE yneg(:,:,bi,bj) = comlev1_bibj,
695 CADJ & key = iicekey, byte = isbyte
696 #endif
697 DO J=1,sNy
698 DO I=1,sNx
699 C Add YNEG contribution to QNET
700 QNET(I,J,bi,bj) = QNET(I,J,bi,bj)
701 & +YNEG(I,J,bi,bj)/SEAICE_deltaTtherm
702 & *maskC(I,J,kSurface,bi,bj)
703 & *HeatCapacity_Cp*rUnit2mass
704 & *drF(kSurface)*hFacC(i,j,kSurface,bi,bj)
705 ENDDO
706 ENDDO
707
708 #ifdef ALLOW_DIAGNOSTICS
709 IF ( useDiagnostics ) THEN
710 CALL DIAGNOSTICS_FILL(frWtrAtm,'SIatmFW ',0,1 ,2,bi,bj,myThid)
711 ENDIF
712 #endif /* ALLOW_DIAGNOSTICS */
713
714 #ifdef SEAICE_DEBUG
715 CALL PLOT_FIELD_XYRS( GWATX,'Current GWATX ', myIter, myThid )
716 CALL PLOT_FIELD_XYRS( GWATY,'Current GWATY ', myIter, myThid )
717 CALL PLOT_FIELD_XYRL( QSW,'Current QSW ', myIter, myThid )
718 CALL PLOT_FIELD_XYRL( QNET,'Current QNET ', myIter, myThid )
719 CALL PLOT_FIELD_XYRL( EmPmR,'Current EmPmR ', myIter, myThid )
720 #endif /* SEAICE_DEBUG */
721
722 crg Added by Ralf Giering: do we need DO_WE_NEED_THIS ?
723 #define DO_WE_NEED_THIS
724 C NOW ZERO OUTSIDE POINTS
725 #ifdef ALLOW_AUTODIFF_TAMC
726 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
727 CADJ & key = iicekey, byte = isbyte
728 CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj,
729 CADJ & key = iicekey, byte = isbyte
730 #endif /* ALLOW_AUTODIFF_TAMC */
731 DO J=1,sNy
732 DO I=1,sNx
733 C NOW SET AREA(I,J,1,bi,bj)=0 WHERE NO ICE IS
734 AREA(I,J,1,bi,bj)=MIN(AREA(I,J,1,bi,bj)
735 & ,HEFF(I,J,1,bi,bj)/.0001 _d 0)
736 ENDDO
737 ENDDO
738 #ifdef ALLOW_AUTODIFF_TAMC
739 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
740 CADJ & key = iicekey, byte = isbyte
741 #endif /* ALLOW_AUTODIFF_TAMC */
742 DO J=1,sNy
743 DO I=1,sNx
744 C NOW TRUNCATE AREA
745 #ifdef DO_WE_NEED_THIS
746 AREA(I,J,1,bi,bj)=MIN(ONE,AREA(I,J,1,bi,bj))
747 ENDDO
748 ENDDO
749 #ifdef ALLOW_AUTODIFF_TAMC
750 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
751 CADJ & key = iicekey, byte = isbyte
752 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
753 CADJ & key = iicekey, byte = isbyte
754 #endif /* ALLOW_AUTODIFF_TAMC */
755 DO J=1,sNy
756 DO I=1,sNx
757 AREA(I,J,1,bi,bj) = MAX(ZERO,AREA(I,J,1,bi,bj))
758 HSNOW(I,J,bi,bj) = MAX(ZERO,HSNOW(I,J,bi,bj))
759 #endif /* DO_WE_NEED_THIS */
760 AREA(I,J,1,bi,bj) = AREA(I,J,1,bi,bj)*HEFFM(I,J,bi,bj)
761 HEFF(I,J,1,bi,bj) = HEFF(I,J,1,bi,bj)*HEFFM(I,J,bi,bj)
762 #ifdef SEAICE_CAP_HEFF
763 HEFF(I,J,1,bi,bj)=MIN(MAX_HEFF,HEFF(I,J,1,bi,bj))
764 #endif /* SEAICE_CAP_HEFF */
765 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)*HEFFM(I,J,bi,bj)
766 ENDDO
767 ENDDO
768
769 #ifdef ALLOW_DIAGNOSTICS
770 IF ( useDiagnostics ) THEN
771 IF ( DIAGNOSTICS_IS_ON('SIthdgrh',myThid) ) THEN
772 C use (abuse) GHEFF to diagnose the total thermodynamic growth rate
773 DO J=1,sNy
774 DO I=1,sNx
775 GHEFF(I,J) = (HEFF(I,J,1,bi,bj)-HEFF(I,J,2,bi,bj))
776 & /SEAICE_deltaTtherm
777 ENDDO
778 ENDDO
779 CALL DIAGNOSTICS_FILL(GHEFF,'SIthdgrh',0,1,2,bi,bj,myThid)
780 ENDIF
781 ENDIF
782 #endif /* ALLOW_DIAGNOSTICS */
783
784 #ifdef ALLOW_SEAICE_FLOODING
785 IF ( SEAICEuseFlooding ) THEN
786 C convert snow to ice if submerged
787 DO J=1,sNy
788 DO I=1,sNx
789 hDraft = (HSNOW(I,J,bi,bj)*330. _d 0
790 & +HEFF(I,J,1,bi,bj)*SEAICE_rhoIce)/1000. _d 0
791 C here GEFF is the gain of ice due to flooding
792 GHEFF(I,J) = hDraft - MIN(hDraft,HEFF(I,J,1,bi,bj))
793 HEFF(I,J,1,bi,bj) = HEFF(I,J,1,bi,bj) + GHEFF(I,J)
794 HSNOW(I,J,bi,bj) = MAX(0. _d 0,
795 & HSNOW(I,J,bi,bj)-GHEFF(I,J)*ICE2SNOW)
796 ENDDO
797 ENDDO
798 #ifdef ALLOW_DIAGNOSTICS
799 IF ( useDiagnostics ) THEN
800 IF ( DIAGNOSTICS_IS_ON('SIsnwice',myThid) ) THEN
801 C turn GHEFF into a rate
802 DO J=1,sNy
803 DO I=1,sNx
804 GHEFF(I,J) = GHEFF(I,J)/SEAICE_deltaTtherm
805 ENDDO
806 ENDDO
807 CALL DIAGNOSTICS_FILL(GHEFF,'SIsnwice',0,1,2,bi,bj,myThid)
808 ENDIF
809 ENDIF
810 #endif /* ALLOW_DIAGNOSTICS */
811 ENDIF
812 #endif /* ALLOW_SEAICE_FLOODING */
813
814 IF ( useRealFreshWaterFlux ) THEN
815 DO J=1,sNy
816 DO I=1,sNx
817 sIceLoad(i,j,bi,bj) = HEFF(I,J,1,bi,bj)*SEAICE_rhoIce
818 & + HSNOW(I,J,bi,bj)* 330. _d 0
819 ENDDO
820 ENDDO
821 ENDIF
822
823 ENDDO
824 ENDDO
825
826 RETURN
827 END

  ViewVC Help
Powered by ViewVC 1.1.22