/[MITgcm]/MITgcm_contrib/high_res_cube/code-mods/seaice_growth.F
ViewVC logotype

Contents of /MITgcm_contrib/high_res_cube/code-mods/seaice_growth.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.2 - (show annotations) (download)
Thu Jul 19 19:14:40 2007 UTC (17 years, 11 months ago) by dimitri
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +1 -1 lines
FILE REMOVED
cube66 configuration but using the new SEAICE_CAP_HEFF
option rather than code change to seaice_growth.F

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

  ViewVC Help
Powered by ViewVC 1.1.22