/[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.7 - (show annotations) (download)
Wed Dec 20 12:25:15 2006 UTC (17 years, 4 months ago) by mlosch
Branch: MAIN
Changes since 1.6: +22 -25 lines
o fix multi-category seaice:
 - change cpp flag SEAICE_MULTILEVEL to more meaningful name:
   SEAICE_MULTICATEGORY
 - fix short wave heat flux
o replace field areaLoc by scalar variable

1 C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_growth.F,v 1.6 2006/12/19 18:57:10 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 _RL TBC, salinity_ice, SDF, ICE_DENS, Q0, QS
44 #ifdef ALLOW_SEAICE_FLOODING
45 _RL hDraft, hFlood
46 #endif /* ALLOW_SEAICE_FLOODING */
47 _RL GAREA ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
48 _RL GHEFF ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
49 C RESID_HEAT is residual heat above freezing in equivalent m of ice
50 _RL RESID_HEAT ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
51
52 C FICE - thermodynamic ice growth rate over sea ice in W/m^2
53 C >0 causes ice growth, <0 causes snow and sea ice melt
54 C FHEFF - effective thermodynamic ice growth rate over sea ice in W/m^2
55 C >0 causes ice growth, <0 causes snow and sea ice melt
56 C QNETO - thermodynamic ice growth rate over open water in W/m^2
57 C ( = surface heat flux )
58 C >0 causes ice growth, <0 causes snow and sea ice melt
59 C QNETI - net surface heat flux under ice in W/m^2
60 C QSWO - short wave heat flux over ocean in W/m^2
61 C QSWI - short wave heat flux under ice in W/m^2
62 _RL FHEFF (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
63 _RL FICE (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
64 _RL QNETO (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
65 _RL QNETI (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
66 _RL QSWO (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
67 _RL QSWI (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
68 C
69 _RL HCORR (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
70 C SEAICE_SALT contains m of ice melted (<0) or created (>0)
71 _RL SEAICE_SALT(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
72 C actual ice thickness with upper and lower limit
73 _RL hIceLoc (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
74
75 _RL HICE (1-OLx:sNx+OLx, 1-OLy:sNy+OLy)
76 C actual snow thickness
77 _RL hSnwLoc(1-OLx:sNx+OLx, 1-OLy:sNy+OLy)
78 C wind speed
79 _RL UG (1-OLx:sNx+OLx, 1-OLy:sNy+OLy)
80 _RL SPEED_SQ
81 C local copy of AREA
82 _RL areaLoc
83
84 #ifdef SEAICE_MULTICATEGORY
85 INTEGER it
86 INTEGER ilockey
87 _RL RK
88 _RL HICEP(1-OLx:sNx+OLx, 1-OLy:sNy+OLy)
89 _RL FICEP(1-OLx:sNx+OLx, 1-OLy:sNy+OLy)
90 _RL QSWIP(1-OLx:sNx+OLx, 1-OLy:sNy+OLy)
91 #endif
92
93 if ( buoyancyRelation .eq. 'OCEANICP' ) then
94 kSurface = Nr
95 else
96 kSurface = 1
97 endif
98
99 C ICE SALINITY (g/kg)
100 salinity_ice = 4.0 _d 0
101 C FREEZING TEMP. OF SEA WATER (deg C)
102 TBC = SEAICE_freeze
103 C RATIO OF WATER DESITY TO SNOW DENSITY
104 SDF = 1000.0 _d 0/330.0 _d 0
105 C RATIO OF SEA ICE DESITY TO WATER DENSITY
106 ICE_DENS = 0.920 _d 0
107 C INVERSE HEAT OF FUSION OF ICE (m^3/J)
108 Q0 = 1.0 _d -06 / 302.0 _d +00
109 C HEAT OF FUSION OF SNOW (J/m^3)
110 QS = 1.1 _d +08
111
112 DO bj=myByLo(myThid),myByHi(myThid)
113 DO bi=myBxLo(myThid),myBxHi(myThid)
114 c
115 #ifdef ALLOW_AUTODIFF_TAMC
116 act1 = bi - myBxLo(myThid)
117 max1 = myBxHi(myThid) - myBxLo(myThid) + 1
118 act2 = bj - myByLo(myThid)
119 max2 = myByHi(myThid) - myByLo(myThid) + 1
120 act3 = myThid - 1
121 max3 = nTx*nTy
122 act4 = ikey_dynamics - 1
123 iicekey = (act1 + 1) + act2*max1
124 & + act3*max1*max2
125 & + act4*max1*max2*max3
126 #endif /* ALLOW_AUTODIFF_TAMC */
127 C
128 C initialise a few fields
129 C
130 #ifdef ALLOW_AUTODIFF_TAMC
131 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
132 CADJ & key = iicekey, byte = isbyte
133 CADJ STORE qnet(:,:,bi,bj) = comlev1_bibj,
134 CADJ & key = iicekey, byte = isbyte
135 CADJ STORE qsw(:,:,bi,bj) = comlev1_bibj,
136 CADJ & key = iicekey, byte = isbyte
137 #endif /* ALLOW_AUTODIFF_TAMC */
138 DO J=1,sNy
139 DO I=1,sNx
140 FHEFF(I,J) = 0.0 _d 0
141 FICE (I,J) = 0.0 _d 0
142 #ifdef SEAICE_MULTICATEGORY
143 FICEP(I,J) = 0.0 _d 0
144 QSWIP(I,J) = 0.0 _d 0
145 #endif
146 FHEFF(I,J) = 0.0 _d 0
147 FICE (I,J) = 0.0 _d 0
148 QNETO(I,J) = 0.0 _d 0
149 QNETI(I,J) = 0.0 _d 0
150 QSWO (I,J) = 0.0 _d 0
151 QSWI (I,J) = 0.0 _d 0
152 HCORR(I,J) = 0.0 _d 0
153 SEAICE_SALT(I,J) = 0.0 _d 0
154 RESID_HEAT (I,J) = 0.0 _d 0
155 ENDDO
156 ENDDO
157 #ifdef ALLOW_AUTODIFF_TAMC
158 CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj,
159 CADJ & key = iicekey, byte = isbyte
160 CADJ STORE hsnow(:,:,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 C COMPUTE ACTUAL ICE THICKNESS AND PUT MINIMUM/MAXIMUM
166 C ON ICE THICKNESS FOR BUDGET COMPUTATION
167 areaLoc = MAX(A22,AREA(I,J,2,bi,bj))
168 HICE(I,J) = HEFF(I,J,2,bi,bj)/areaLoc
169 HICE(I,J) = MAX(HICE(I,J),0.05 _d +00)
170 HICE(I,J) = MIN(HICE(I,J),9.0 _d +00)
171 hSnwLoc(I,J) = HSNOW(I,J,bi,bj)/areaLoc
172 ENDDO
173 ENDDO
174
175 C NOW DETERMINE MIXED LAYER TEMPERATURE
176 DO J=1,sNy
177 DO I=1,sNx
178 TMIX(I,J,bi,bj)=theta(I,J,kSurface,bi,bj)+273.16 _d +00
179 #ifdef SEAICE_DEBUG
180 TMIX(I,J,bi,bj)=MAX(TMIX(I,J,bi,bj),271.2 _d +00)
181 #endif
182 ENDDO
183 ENDDO
184
185 C THERMAL WIND OF ATMOSPHERE
186 DO J=1,sNy
187 DO I=1,sNx
188 CML#ifdef SEAICE_EXTERNAL_FORCING
189 CMLC this seems to be more natural as we do compute the wind speed in
190 CMLC pkg/exf/exf_wind.F, but it changes the results
191 CML UG(I,J) = MAX(SEAICE_EPS,wspeed(I,J,bi,bj))
192 CML#else
193 SPEED_SQ = UWIND(I,J,bi,bj)**2 + VWIND(I,J,bi,bj)**2
194 IF ( SPEED_SQ .LE. SEAICE_EPS_SQ ) THEN
195 UG(I,J)=SEAICE_EPS
196 ELSE
197 UG(I,J)=SQRT(SPEED_SQ)
198 ENDIF
199 CML#endif /* SEAICE_EXTERNAL_FORCING */
200 ENDDO
201 ENDDO
202
203
204 #ifdef ALLOW_AUTODIFF_TAMC
205 cphCADJ STORE heff = comlev1, key = ikey_dynamics
206 cphCADJ STORE hsnow = comlev1, key = ikey_dynamics
207 cphCADJ STORE uwind = comlev1, key = ikey_dynamics
208 cphCADJ STORE vwind = comlev1, key = ikey_dynamics
209 c
210 CADJ STORE tice = comlev1, key = ikey_dynamics
211 # ifdef SEAICE_MULTICATEGORY
212 CADJ STORE tices = comlev1, key = ikey_dynamics
213 # endif
214 #endif /* ALLOW_AUTODIFF_TAMC */
215
216 C NOW DETERMINE GROWTH RATES
217 C FIRST DO OPEN WATER
218 CALL SEAICE_BUDGET_OCEAN(
219 I UG,
220 U TMIX,
221 O QNETO, QSWO,
222 I bi, bj)
223
224 C NOW DO ICE
225 #ifdef SEAICE_MULTICATEGORY
226 C-- Start loop over muli-categories
227 DO IT=1,MULTDIM
228 #ifdef ALLOW_AUTODIFF_TAMC
229 ilockey = (iicekey-1)*MULTDIM + IT
230 CADJ STORE tices(:,:,it,bi,bj) = comlev1_multdim,
231 CADJ & key = ilockey, byte = isbyte
232 #endif /* ALLOW_AUTODIFF_TAMC */
233 RK=REAL(IT)
234 DO J=1,sNy
235 DO I=1,sNx
236 HICEP(I,J)=(HICE(I,J)/MULTDIM)*((2.0 _d 0*RK)-1.0 _d 0)
237 TICE(I,J,bi,bj)=TICES(I,J,IT,bi,bj)
238 ENDDO
239 ENDDO
240 CALL SEAICE_BUDGET_ICE(
241 I UG, HICEP, hSnwLoc,
242 U TICE,
243 O FICEP, QSWIP,
244 I bi, bj)
245 DO J=1,sNy
246 DO I=1,sNx
247 C average surface heat fluxes/growth rates
248 FICE (I,J) = FICE(I,J) + FICEP(I,J)/MULTDIM
249 QSWI (I,J) = QSWI(I,J) + QSWIP(I,J)/MULTDIM
250 TICES(I,J,IT,bi,bj) = TICE(I,J,bi,bj)
251 ENDDO
252 ENDDO
253 ENDDO
254 C-- End loop over multi-categories
255 #else /* SEAICE_MULTICATEGORY */
256 CALL SEAICE_BUDGET_ICE(
257 I UG, HICE, hSnwLoc,
258 U TICE,
259 O FICE, QSWI,
260 I bi, bj)
261 #endif /* SEAICE_MULTICATEGORY */
262
263 #ifdef ALLOW_AUTODIFF_TAMC
264 CADJ STORE theta(:,:,:,bi,bj)= comlev1_bibj,
265 CADJ & key = iicekey, byte = isbyte
266 CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj,
267 CADJ & key = iicekey, byte = isbyte
268 #endif /* ALLOW_AUTODIFF_TAMC */
269 DO J=1,sNy
270 DO I=1,sNx
271 C-- Create or melt sea-ice so that first-level oceanic temperature
272 C is approximately at the freezing point when there is sea-ice.
273 C Initially the units of YNEG are m of sea-ice.
274 C The factor dRf(1)/72.0764, used to convert temperature
275 C change in deg K to m of sea-ice, is approximately:
276 C dRf(1) * (sea water heat capacity = 3996 J/kg/K)
277 C * (density of sea-water = 1026 kg/m^3)
278 C / (latent heat of fusion of sea-ice = 334000 J/kg)
279 C / (density of sea-ice = 910 kg/m^3)
280 C Negative YNEG leads to ice growth.
281 C Positive YNEG leads to ice melting.
282 IF ( .NOT. inAdMode ) THEN
283 #ifdef SEAICE_VARIABLE_FREEZING_POINT
284 TBC = -0.0575 _d 0*salt(I,J,kSurface,bi,bj) + 0.0901 _d 0
285 #endif /* SEAICE_VARIABLE_FREEZING_POINT */
286 YNEG(I,J,bi,bj) = (theta(I,J,kSurface,bi,bj)-TBC)
287 & *dRf(1)/72.0764 _d 0
288 ELSE
289 YNEG(I,J,bi,bj)= 0.
290 ENDIF
291 GHEFF(I,J)=HEFF(I,J,1,bi,bj)
292 C Melt (YNEG>0) or create (YNEG<0) sea ice
293 HEFF(I,J,1,bi,bj)=MAX(ZERO,HEFF(I,J,1,bi,bj)-YNEG(I,J,bi,bj))
294 RESID_HEAT(I,J) = YNEG(I,J,bi,bj)
295 YNEG(I,J,bi,bj) = GHEFF(I,J)-HEFF(I,J,1,bi,bj)
296 SEAICE_SALT(I,J) = SEAICE_SALT(I,J)-YNEG(I,J,bi,bj)
297 RESID_HEAT(I,J) = RESID_HEAT(I,J)-YNEG(I,J,bi,bj)
298 C YNEG now contains m of ice melted (>0) or created (<0)
299 C SEAICE_SALT contains m of ice melted (<0) or created (>0)
300 C RESID_HEAT is residual heat above freezing in equivalent m of ice
301 ENDDO
302 ENDDO
303
304 cph(
305 #ifdef ALLOW_AUTODIFF_TAMC
306 cphCADJ STORE heff = comlev1, key = ikey_dynamics
307 cphCADJ STORE hsnow = comlev1, key = ikey_dynamics
308 #endif
309 cph)
310 c
311 #ifdef ALLOW_AUTODIFF_TAMC
312 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
313 CADJ & key = iicekey, byte = isbyte
314 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
315 CADJ & key = iicekey, byte = isbyte
316 CADJ STORE fice(:,:) = comlev1_bibj,
317 CADJ & key = iicekey, byte = isbyte
318 #endif /* ALLOW_AUTODIFF_TAMC */
319 cph)
320
321 DO J=1,sNy
322 DO I=1,sNx
323 C NOW CALCULATE CORRECTED effective growth in J/m^2 (>0=melt)
324 GHEFF(I,J)=-SEAICE_deltaTtherm*FICE(I,J)*AREA(I,J,2,bi,bj)
325 ENDDO
326 ENDDO
327
328 #ifdef ALLOW_AUTODIFF_TAMC
329 CADJ STORE fice(:,:) = comlev1_bibj,
330 CADJ & key = iicekey, byte = isbyte
331 #endif /* ALLOW_AUTODIFF_TAMC */
332
333 DO J=1,sNy
334 DO I=1,sNx
335 IF(FICE(I,J).LT.ZERO.AND.AREA(I,J,2,bi,bj).GT.ZERO) THEN
336 C use FICE to melt snow and CALCULATE CORRECTED GROWTH
337 GAREA(I,J)=HSNOW(I,J,bi,bj)*QS ! effective snow thickness in J/m^2
338 IF(GHEFF(I,J).LE.GAREA(I,J)) THEN
339 C not enough heat to melt all snow; use up all heat flux FICE
340 HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)-GHEFF(I,J)/QS
341 C SNOW CONVERTED INTO WATER AND THEN INTO equivalent m of ICE melt
342 C The factor 1/SDF/ICE_DENS converts m of snow to m of sea-ice
343 SEAICE_SALT(I,J)=SEAICE_SALT(I,J)
344 & -GHEFF(I,J)/QS/SDF/ICE_DENS
345 FICE(I,J)=ZERO
346 ELSE
347 C enought heat to melt snow completely;
348 C compute remaining heat flux that will melt ice
349 FICE(I,J)=-(GHEFF(I,J)-GAREA(I,J))/
350 & SEAICE_deltaTtherm/AREA(I,J,2,bi,bj)
351 C convert all snow to melt water (fresh water flux)
352 SEAICE_SALT(I,J)=SEAICE_SALT(I,J)
353 & -HSNOW(I,J,bi,bj)/SDF/ICE_DENS
354 HSNOW(I,J,bi,bj)=0.0
355 END IF
356 END IF
357 ENDDO
358 ENDDO
359
360 #ifdef ALLOW_AUTODIFF_TAMC
361 CADJ STORE fice(:,:) = comlev1_bibj,
362 CADJ & key = iicekey, byte = isbyte
363 #endif /* ALLOW_AUTODIFF_TAMC */
364
365 DO J=1,sNy
366 DO I=1,sNx
367 C NOW GET TOTAL GROWTH RATE in W/m^2, >0 causes ice growth
368 FHEFF(I,J)= FICE(I,J) * AREA(I,J,2,bi,bj)
369 & + QNETO(I,J) * (ONE-AREA(I,J,2,bi,bj))
370 ENDDO
371 ENDDO
372 cph(
373 #ifdef ALLOW_AUTODIFF_TAMC
374 CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj,
375 CADJ & key = iicekey, byte = isbyte
376 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
377 CADJ & key = iicekey, byte = isbyte
378 CADJ STORE fice(:,:) = comlev1_bibj,
379 CADJ & key = iicekey, byte = isbyte
380 CADJ STORE fheff(:,:) = comlev1_bibj,
381 CADJ & key = iicekey, byte = isbyte
382 CADJ STORE qneto(:,:) = comlev1_bibj,
383 CADJ & key = iicekey, byte = isbyte
384 CADJ STORE qswi(:,:) = comlev1_bibj,
385 CADJ & key = iicekey, byte = isbyte
386 CADJ STORE qswo(:,:) = comlev1_bibj,
387 CADJ & key = iicekey, byte = isbyte
388 #endif /* ALLOW_AUTODIFF_TAMC */
389 cph)
390 DO J=1,sNy
391 DO I=1,sNx
392 C NOW UPDATE AREA
393 GHEFF(I,J) = -SEAICE_deltaTtherm*FHEFF(I,J)*Q0
394 GAREA(I,J) = SEAICE_deltaTtherm*QNETO(I,J)*Q0
395 GHEFF(I,J) = -ONE*MIN(HEFF(I,J,1,bi,bj),GHEFF(I,J))
396 GAREA(I,J) = MAX(ZERO,GAREA(I,J))
397 HCORR(I,J) = MIN(ZERO,GHEFF(I,J))
398 ENDDO
399 ENDDO
400 #ifdef ALLOW_AUTODIFF_TAMC
401 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
402 CADJ & key = iicekey, byte = isbyte
403 #endif
404 DO J=1,sNy
405 DO I=1,sNx
406 GAREA(I,J)=(ONE-AREA(I,J,2,bi,bj))*GAREA(I,J)/HO
407 & +HALF*HCORR(I,J)*AREA(I,J,2,bi,bj)
408 & /(HEFF(I,J,1,bi,bj)+.00001 _d 0)
409 AREA(I,J,1,bi,bj)=AREA(I,J,1,bi,bj)+GAREA(I,J)
410 ENDDO
411 ENDDO
412 #ifdef ALLOW_AUTODIFF_TAMC
413 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
414 CADJ & key = iicekey, byte = isbyte
415 #endif
416 DO J=1,sNy
417 DO I=1,sNx
418
419 C NOW UPDATE HEFF
420 GHEFF(I,J) = -SEAICE_deltaTtherm*
421 & FICE(I,J)*Q0*AREA(I,J,2,bi,bj)
422 GHEFF(I,J) = -ONE*MIN(HEFF(I,J,1,bi,bj),GHEFF(I,J))
423 HEFF(I,J,1,bi,bj)= HEFF(I,J,1,bi,bj)+GHEFF(I,J)
424 SEAICE_SALT(I,J) = SEAICE_SALT(I,J)+GHEFF(I,J)
425
426 C NOW CALCULATE QNETI UNDER ICE IF ANY
427 QNETI(I,J) = (GHEFF(I,J)-SEAICE_deltaTtherm*
428 & FICE(I,J)*Q0*AREA(I,J,2,bi,bj))/Q0/SEAICE_deltaTtherm
429
430 C NOW UPDATE OTHER THINGS
431
432 IF(FICE(I,J).GT.ZERO) THEN
433 C FREEZING, PRECIP ADDED AS SNOW
434 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)+SEAICE_deltaTtherm*
435 & PRECIP(I,J,bi,bj)*AREA(I,J,2,bi,bj)*SDF
436 ELSE
437 C ADD PRECIP AS RAIN, WATER CONVERTED INTO equivalent m of ICE BY 1/ICE_DENS
438 SEAICE_SALT(I,J) = SEAICE_SALT(I,J)
439 & -PRECIP(I,J,bi,bj)*AREA(I,J,2,bi,bj)*
440 & SEAICE_deltaTtherm/ICE_DENS
441 ENDIF
442
443 C Now add in precip over open water directly into ocean as negative salt
444 SEAICE_SALT(I,J) = SEAICE_SALT(I,J)
445 & -PRECIP(I,J,bi,bj)*(ONE-AREA(I,J,2,bi,bj))
446 & *SEAICE_deltaTtherm/ICE_DENS
447
448 C Now melt snow if there is residual heat left in surface level
449 C Note that units of YNEG and SEAICE_SALT are m of ice
450 cph( very sensitive bit here by JZ
451 IF( RESID_HEAT(I,J) .GT. ZERO
452 & .AND. HSNOW(I,J,bi,bj) .GT. ZERO ) THEN
453 GHEFF(I,J) = MIN( HSNOW(I,J,bi,bj)/SDF/ICE_DENS,
454 & RESID_HEAT(I,J) )
455 YNEG(I,J,bi,bj) = YNEG(I,J,bi,bj)+GHEFF(I,J)
456 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)-GHEFF(I,J)*SDF*ICE_DENS
457 SEAICE_SALT(I,J) = SEAICE_SALT(I,J)-GHEFF(I,J)
458 ENDIF
459 cph)
460
461 C NOW GET FRESH WATER FLUX
462 EmPmR(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*(
463 & EVAP(I,J,bi,bj)*(ONE-AREA(I,J,2,bi,bj))
464 & -RUNOFF(I,J,bi,bj)
465 & +SEAICE_SALT(I,J)*ICE_DENS/SEAICE_deltaTtherm
466 & )
467
468 C NOW GET TOTAL QNET AND QSW
469 QNET(I,J,bi,bj) = QNETI(I,J) * AREA(I,J,2,bi,bj)
470 & +QNETO(I,J) * (ONE-AREA(I,J,2,bi,bj))
471 QSW(I,J,bi,bj) = QSWI(I,J) * AREA(I,J,2,bi,bj)
472 & +QSWO(I,J) * (ONE-AREA(I,J,2,bi,bj))
473
474 C Now convert YNEG back to deg K.
475 YNEG(I,J,bi,bj) = YNEG(I,J,bi,bj)*recip_dRf(1)*72.0764 _d 0
476
477 C Add YNEG contribution to QNET
478 QNET(I,J,bi,bj) = QNET(I,J,bi,bj)
479 & +YNEG(I,J,bi,bj)/SEAICE_deltaTtherm
480 & *maskC(I,J,kSurface,bi,bj)
481 & *HeatCapacity_Cp*recip_horiVertRatio*rhoConst
482 & *drF(kSurface)*hFacC(i,j,kSurface,bi,bj)
483
484 ENDDO
485 ENDDO
486
487 #ifdef SEAICE_DEBUG
488 c CALL PLOT_FIELD_XYRS( UWIND,'Current UWIND ', myIter, myThid )
489 c CALL PLOT_FIELD_XYRS( VWIND,'Current VWIND ', myIter, myThid )
490 CALL PLOT_FIELD_XYRS( GWATX,'Current GWATX ', myIter, myThid )
491 CALL PLOT_FIELD_XYRS( GWATY,'Current GWATY ', myIter, myThid )
492 CML CALL PLOT_FIELD_XYRL( FO,'Current FO ', myIter, myThid )
493 CML CALL PLOT_FIELD_XYRL( FHEFF,'Current FHEFF ', myIter, myThid )
494 CALL PLOT_FIELD_XYRL( QSW,'Current QSW ', myIter, myThid )
495 CALL PLOT_FIELD_XYRL( QNET,'Current QNET ', myIter, myThid )
496 CALL PLOT_FIELD_XYRL( EmPmR,'Current EmPmR ', myIter, myThid )
497 DO j=1-OLy,sNy+OLy
498 DO i=1-OLx,sNx+OLx
499 GHEFF(I,J)=SQRT(UICE(I,J,1,bi,bj)**2+VICE(I,J,1,bi,bj)**2)
500 GAREA(I,J)=HEFF(I,J,1,bi,bj)
501 print*,'I J QNET:',I, J, QNET(i,j,bi,bj), QSW(I,J,bi,bj)
502 ENDDO
503 ENDDO
504 CALL PLOT_FIELD_XYRL( GHEFF,'Current UICE ', myIter, myThid )
505 CALL PLOT_FIELD_XYRL( GAREA,'Current HEFF ', myIter, myThid )
506 DO j=1-OLy,sNy+OLy
507 DO i=1-OLx,sNx+OLx
508 if(HEFF(i,j,1,bi,bj).gt.1.) then
509 print '(A,2i4,3f10.2)','#### i j heff theta yneg',i,j,
510 & HEFF(i,j,1,bi,bj),theta(I,J,1,bi,bj),yneg(I,J,bi,bj)
511 print '(A,3f10.2)','QSW, QNET before/after correction',
512 & QSW(I,J,bi,bj),QNETI(I,J)*AREA(I,J,2,bi,bj)+
513 & (ONE-AREA(I,J,2,bi,bj))*QNETO(I,J), QNET(I,J,bi,bj)
514 endif
515 ENDDO
516 ENDDO
517 #endif /* SEAICE_DEBUG */
518
519 crg Added by Ralf Giering: do we need DO_WE_NEED_THIS ?
520 #define DO_WE_NEED_THIS
521 C NOW ZERO OUTSIDE POINTS
522 #ifdef ALLOW_AUTODIFF_TAMC
523 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
524 CADJ & key = iicekey, byte = isbyte
525 CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj,
526 CADJ & key = iicekey, byte = isbyte
527 #endif /* ALLOW_AUTODIFF_TAMC */
528 DO J=1,sNy
529 DO I=1,sNx
530 C NOW SET AREA(I,J,1,bi,bj)=0 WHERE NO ICE IS
531 AREA(I,J,1,bi,bj)=MIN(AREA(I,J,1,bi,bj)
532 & ,HEFF(I,J,1,bi,bj)/.0001 _d 0)
533 ENDDO
534 ENDDO
535 #ifdef ALLOW_AUTODIFF_TAMC
536 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
537 CADJ & key = iicekey, byte = isbyte
538 #endif /* ALLOW_AUTODIFF_TAMC */
539 DO J=1,sNy
540 DO I=1,sNx
541 C NOW TRUNCATE AREA
542 #ifdef DO_WE_NEED_THIS
543 AREA(I,J,1,bi,bj)=MIN(ONE,AREA(I,J,1,bi,bj))
544 ENDDO
545 ENDDO
546 #ifdef ALLOW_AUTODIFF_TAMC
547 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
548 CADJ & key = iicekey, byte = isbyte
549 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
550 CADJ & key = iicekey, byte = isbyte
551 #endif /* ALLOW_AUTODIFF_TAMC */
552 DO J=1,sNy
553 DO I=1,sNx
554 AREA(I,J,1,bi,bj) = MAX(ZERO,AREA(I,J,1,bi,bj))
555 HSNOW(I,J,bi,bj) = MAX(ZERO,HSNOW(I,J,bi,bj))
556 #endif
557 AREA(I,J,1,bi,bj) = AREA(I,J,1,bi,bj)*HEFFM(I,J,bi,bj)
558 HEFF(I,J,1,bi,bj) = HEFF(I,J,1,bi,bj)*HEFFM(I,J,bi,bj)
559 #ifdef DO_WE_NEED_THIS
560 c HEFF(I,J,1,bi,bj)=MIN(MAX_HEFF,HEFF(I,J,1,bi,bj))
561 #endif
562 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)*HEFFM(I,J,bi,bj)
563 ENDDO
564 ENDDO
565
566 #ifdef ALLOW_SEAICE_FLOODING
567 IF ( SEAICEuseFlooding ) THEN
568 C convert snow to ice if submerged
569 DO J=1,sNy
570 DO I=1,sNx
571 hDraft = (HSNOW(I,J,bi,bj)*330. _d 0
572 & +HEFF(I,J,1,bi,bj)*SEAICE_rhoIce)/1000. _d 0
573 hFlood = hDraft - MIN(hDraft,HEFF(I,J,1,bi,bj))
574 HEFF(I,J,1,bi,bj) = HEFF(I,J,1,bi,bj) + hFlood
575 HSNOW(I,J,bi,bj) = MAX(0. _d 0,HSNOW(I,J,bi,bj)-hFlood/SDF)
576 ENDDO
577 ENDDO
578 ENDIF
579 #endif /* ALLOW_SEAICE_FLOODING */
580
581 #ifdef ATMOSPHERIC_LOADING
582 IF ( useRealFreshWaterFlux ) THEN
583 DO J=1,sNy
584 DO I=1,sNx
585 sIceLoad(i,j,bi,bj) = HEFF(I,J,1,bi,bj)*SEAICE_rhoIce
586 & + HSNOW(I,J,bi,bj)* 330. _d 0
587 ENDDO
588 ENDDO
589 ENDIF
590 #endif
591
592 ENDDO
593 ENDDO
594
595 RETURN
596 END

  ViewVC Help
Powered by ViewVC 1.1.22