/[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.45 - (show annotations) (download)
Mon Jan 21 17:39:11 2008 UTC (16 years, 4 months ago) by heimbach
Branch: MAIN
Changes since 1.44: +15 -13 lines
o Update stores after recent IF (DIFFERENT_MULTIPLE ...
o re-initialise to break some dependencies (not sure if all correct)
o turn some scalares into tw-dim.

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

  ViewVC Help
Powered by ViewVC 1.1.22