/[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.53 - (show annotations) (download)
Tue Mar 17 10:21:56 2009 UTC (15 years, 3 months ago) by mlosch
Branch: MAIN
CVS Tags: checkpoint61j, checkpoint61k
Changes since 1.52: +2 -2 lines
turn a few hard wired parameters into run time parameters
this does not change any results

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

  ViewVC Help
Powered by ViewVC 1.1.22