/[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.37 - (show annotations) (download)
Wed Nov 28 00:18:17 2007 UTC (16 years, 6 months ago) by dimitri
Branch: MAIN
CVS Tags: checkpoint59k
Changes since 1.36: +22 -13 lines
added pkg/salt_plume by gathering code, which were previously
spread around various files in model/inc and model/src
results remain numerically identical to before, as a first step
towards adding more options, etc., to this package

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