/[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.6 - (show annotations) (download)
Tue Dec 19 18:57:10 2006 UTC (17 years, 4 months ago) by dimitri
Branch: MAIN
Changes since 1.5: +8 -2 lines
transfering all regularization of local ice thickness to seaice_growth
as a first step towards possibly getting rid of A22 alltogether

1 C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_growth.F,v 1.5 2006/12/19 16:00:39 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
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(1-OLx:sNx+OLx, 1-OLy:sNy+OLy)
83
84 #ifdef SEAICE_MULTILEVEL
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 #endif
91
92 if ( buoyancyRelation .eq. 'OCEANICP' ) then
93 kSurface = Nr
94 else
95 kSurface = 1
96 endif
97
98 C ICE SALINITY (g/kg)
99 salinity_ice = 4.0 _d 0
100 C FREEZING TEMP. OF SEA WATER (deg C)
101 TBC = SEAICE_freeze
102 C RATIO OF WATER DESITY TO SNOW DENSITY
103 SDF = 1000.0 _d 0/330.0 _d 0
104 C RATIO OF SEA ICE DESITY TO WATER DENSITY
105 ICE_DENS = 0.920 _d 0
106 C INVERSE HEAT OF FUSION OF ICE (m^3/J)
107 Q0 = 1.0 _d -06 / 302.0 _d +00
108 C HEAT OF FUSION OF SNOW (J/m^3)
109 QS = 1.1 _d +08
110
111 DO bj=myByLo(myThid),myByHi(myThid)
112 DO bi=myBxLo(myThid),myBxHi(myThid)
113 c
114 #ifdef ALLOW_AUTODIFF_TAMC
115 act1 = bi - myBxLo(myThid)
116 max1 = myBxHi(myThid) - myBxLo(myThid) + 1
117 act2 = bj - myByLo(myThid)
118 max2 = myByHi(myThid) - myByLo(myThid) + 1
119 act3 = myThid - 1
120 max3 = nTx*nTy
121 act4 = ikey_dynamics - 1
122 iicekey = (act1 + 1) + act2*max1
123 & + act3*max1*max2
124 & + act4*max1*max2*max3
125 #endif /* ALLOW_AUTODIFF_TAMC */
126 C
127 C initialise a few fields
128 C
129 #ifdef ALLOW_AUTODIFF_TAMC
130 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
131 CADJ & key = iicekey, byte = isbyte
132 CADJ STORE qnet(:,:,bi,bj) = comlev1_bibj,
133 CADJ & key = iicekey, byte = isbyte
134 CADJ STORE qsw(:,:,bi,bj) = comlev1_bibj,
135 CADJ & key = iicekey, byte = isbyte
136 #endif /* ALLOW_AUTODIFF_TAMC */
137 DO J=1,sNy
138 DO I=1,sNx
139 areaLoc(I,J) = MAX(A22,AREA(I,J,2,bi,bj))
140 FHEFF(I,J) = 0.0 _d 0
141 FICE (I,J) = 0.0 _d 0
142 #ifdef SEAICE_MULTILEVEL
143 FICEP(I,J) = 0.0 _d 0
144 #endif
145 FHEFF(I,J) = 0.0 _d 0
146 FICE (I,J) = 0.0 _d 0
147 QNETO(I,J) = 0.0 _d 0
148 QNETI(I,J) = 0.0 _d 0
149 QSWO (I,J) = 0.0 _d 0
150 QSWI (I,J) = 0.0 _d 0
151 HCORR(I,J) = 0.0 _d 0
152 SEAICE_SALT(I,J) = 0.0 _d 0
153 RESID_HEAT (I,J) = 0.0 _d 0
154 ENDDO
155 ENDDO
156 #ifdef ALLOW_AUTODIFF_TAMC
157 CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj,
158 CADJ & key = iicekey, byte = isbyte
159 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
160 CADJ & key = iicekey, byte = isbyte
161 #endif /* ALLOW_AUTODIFF_TAMC */
162 DO J=1,sNy
163 DO I=1,sNx
164 cph need to adjoint-store AREA again before using it in further init.
165 cph (all these initialisations involving AREA are nasty "non-linear")
166 C COMPUTE ACTUAL ICE THICKNESS AND PUT MINIMUM/MAXIMUM
167 C ON ICE THICKNESS FOR BUDGET COMPUTATION
168 HICE(I,J) = HEFF(I,J,2,bi,bj)/areaLoc(I,J)
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(I,J)
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_MULTILEVEL
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_MULTILEVEL
226 C-- Start loop over muli-levels
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 DO J=1,sNy
234 DO I=1,sNx
235 RK=IT*1.0
236 HICEP(I,J)=(HICE(I,J)/7.0 _d 0)*((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 FICE, QSWI,
244 I bi, bj)
245 DO J=1,sNy
246 DO I=1,sNx
247 FICEP(I,J)=(FICE(I,J)/7.0 _d 0)+FICEP(I,J)
248 TICES(I,J,IT,bi,bj)=TICE(I,J,bi,bj)
249 ENDDO
250 ENDDO
251 ENDDO
252 C-- End loop over muli-levels
253 DO J=1,sNy
254 DO I=1,sNx
255 FICE(I,J)=FICEP(I,J)
256 ENDDO
257 ENDDO
258 #else /* SEAICE_MULTILEVEL */
259 CALL SEAICE_BUDGET_ICE(
260 I UG, HICE, hSnwLoc,
261 U TICE,
262 O FICE, QSWI,
263 I bi, bj)
264 #endif /* SEAICE_MULTILEVEL */
265
266 #ifdef ALLOW_AUTODIFF_TAMC
267 CADJ STORE theta(:,:,:,bi,bj)= comlev1_bibj,
268 CADJ & key = iicekey, byte = isbyte
269 CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj,
270 CADJ & key = iicekey, byte = isbyte
271 #endif /* ALLOW_AUTODIFF_TAMC */
272 DO J=1,sNy
273 DO I=1,sNx
274 C-- Create or melt sea-ice so that first-level oceanic temperature
275 C is approximately at the freezing point when there is sea-ice.
276 C Initially the units of YNEG are m of sea-ice.
277 C The factor dRf(1)/72.0764, used to convert temperature
278 C change in deg K to m of sea-ice, is approximately:
279 C dRf(1) * (sea water heat capacity = 3996 J/kg/K)
280 C * (density of sea-water = 1026 kg/m^3)
281 C / (latent heat of fusion of sea-ice = 334000 J/kg)
282 C / (density of sea-ice = 910 kg/m^3)
283 C Negative YNEG leads to ice growth.
284 C Positive YNEG leads to ice melting.
285 IF ( .NOT. inAdMode ) THEN
286 #ifdef SEAICE_VARIABLE_FREEZING_POINT
287 TBC = -0.0575 _d 0*salt(I,J,kSurface,bi,bj) + 0.0901 _d 0
288 #endif /* SEAICE_VARIABLE_FREEZING_POINT */
289 YNEG(I,J,bi,bj) = (theta(I,J,kSurface,bi,bj)-TBC)
290 & *dRf(1)/72.0764 _d 0
291 ELSE
292 YNEG(I,J,bi,bj)= 0.
293 ENDIF
294 GHEFF(I,J)=HEFF(I,J,1,bi,bj)
295 C Melt (YNEG>0) or create (YNEG<0) sea ice
296 HEFF(I,J,1,bi,bj)=MAX(ZERO,HEFF(I,J,1,bi,bj)-YNEG(I,J,bi,bj))
297 RESID_HEAT(I,J) = YNEG(I,J,bi,bj)
298 YNEG(I,J,bi,bj) = GHEFF(I,J)-HEFF(I,J,1,bi,bj)
299 SEAICE_SALT(I,J) = SEAICE_SALT(I,J)-YNEG(I,J,bi,bj)
300 RESID_HEAT(I,J) = RESID_HEAT(I,J)-YNEG(I,J,bi,bj)
301 C YNEG now contains m of ice melted (>0) or created (<0)
302 C SEAICE_SALT contains m of ice melted (<0) or created (>0)
303 C RESID_HEAT is residual heat above freezing in equivalent m of ice
304 ENDDO
305 ENDDO
306
307 cph(
308 #ifdef ALLOW_AUTODIFF_TAMC
309 cphCADJ STORE heff = comlev1, key = ikey_dynamics
310 cphCADJ STORE hsnow = comlev1, key = ikey_dynamics
311 #endif
312 cph)
313 c
314 #ifdef ALLOW_AUTODIFF_TAMC
315 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
316 CADJ & key = iicekey, byte = isbyte
317 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
318 CADJ & key = iicekey, byte = isbyte
319 CADJ STORE fice(:,:) = comlev1_bibj,
320 CADJ & key = iicekey, byte = isbyte
321 #endif /* ALLOW_AUTODIFF_TAMC */
322 cph)
323
324 DO J=1,sNy
325 DO I=1,sNx
326 C NOW CALCULATE CORRECTED effective growth in J/m^2 (>0=melt)
327 GHEFF(I,J)=-SEAICE_deltaTtherm*FICE(I,J)*AREA(I,J,2,bi,bj)
328 ENDDO
329 ENDDO
330
331 #ifdef ALLOW_AUTODIFF_TAMC
332 CADJ STORE fice(:,:) = comlev1_bibj,
333 CADJ & key = iicekey, byte = isbyte
334 #endif /* ALLOW_AUTODIFF_TAMC */
335
336 DO J=1,sNy
337 DO I=1,sNx
338 IF(FICE(I,J).LT.ZERO.AND.AREA(I,J,2,bi,bj).GT.ZERO) THEN
339 C use FICE to melt snow and CALCULATE CORRECTED GROWTH
340 GAREA(I,J)=HSNOW(I,J,bi,bj)*QS ! effective snow thickness in J/m^2
341 IF(GHEFF(I,J).LE.GAREA(I,J)) THEN
342 C not enough heat to melt all snow; use up all heat flux FICE
343 HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)-GHEFF(I,J)/QS
344 C SNOW CONVERTED INTO WATER AND THEN INTO equivalent m of ICE melt
345 C The factor 1/SDF/ICE_DENS converts m of snow to m of sea-ice
346 SEAICE_SALT(I,J)=SEAICE_SALT(I,J)
347 & -GHEFF(I,J)/QS/SDF/ICE_DENS
348 FICE(I,J)=ZERO
349 ELSE
350 C enought heat to melt snow completely;
351 C compute remaining heat flux that will melt ice
352 FICE(I,J)=-(GHEFF(I,J)-GAREA(I,J))/
353 & SEAICE_deltaTtherm/AREA(I,J,2,bi,bj)
354 C convert all snow to melt water (fresh water flux)
355 SEAICE_SALT(I,J)=SEAICE_SALT(I,J)
356 & -HSNOW(I,J,bi,bj)/SDF/ICE_DENS
357 HSNOW(I,J,bi,bj)=0.0
358 END IF
359 END IF
360 ENDDO
361 ENDDO
362
363 #ifdef ALLOW_AUTODIFF_TAMC
364 CADJ STORE fice(:,:) = comlev1_bibj,
365 CADJ & key = iicekey, byte = isbyte
366 #endif /* ALLOW_AUTODIFF_TAMC */
367
368 DO J=1,sNy
369 DO I=1,sNx
370 C NOW GET TOTAL GROWTH RATE in W/m^2, >0 causes ice growth
371 FHEFF(I,J)= FICE(I,J) * AREA(I,J,2,bi,bj)
372 & + QNETO(I,J) * (ONE-AREA(I,J,2,bi,bj))
373 ENDDO
374 ENDDO
375 cph(
376 #ifdef ALLOW_AUTODIFF_TAMC
377 CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj,
378 CADJ & key = iicekey, byte = isbyte
379 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
380 CADJ & key = iicekey, byte = isbyte
381 CADJ STORE fice(:,:) = comlev1_bibj,
382 CADJ & key = iicekey, byte = isbyte
383 CADJ STORE fheff(:,:) = comlev1_bibj,
384 CADJ & key = iicekey, byte = isbyte
385 CADJ STORE qneto(:,:) = comlev1_bibj,
386 CADJ & key = iicekey, byte = isbyte
387 CADJ STORE qswi(:,:) = comlev1_bibj,
388 CADJ & key = iicekey, byte = isbyte
389 CADJ STORE qswo(:,:) = comlev1_bibj,
390 CADJ & key = iicekey, byte = isbyte
391 #endif /* ALLOW_AUTODIFF_TAMC */
392 cph)
393 DO J=1,sNy
394 DO I=1,sNx
395 C NOW UPDATE AREA
396 GHEFF(I,J) = -SEAICE_deltaTtherm*FHEFF(I,J)*Q0
397 GAREA(I,J) = SEAICE_deltaTtherm*QNETO(I,J)*Q0
398 GHEFF(I,J) = -ONE*MIN(HEFF(I,J,1,bi,bj),GHEFF(I,J))
399 GAREA(I,J) = MAX(ZERO,GAREA(I,J))
400 HCORR(I,J) = MIN(ZERO,GHEFF(I,J))
401 ENDDO
402 ENDDO
403 #ifdef ALLOW_AUTODIFF_TAMC
404 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
405 CADJ & key = iicekey, byte = isbyte
406 #endif
407 DO J=1,sNy
408 DO I=1,sNx
409 GAREA(I,J)=(ONE-AREA(I,J,2,bi,bj))*GAREA(I,J)/HO
410 & +HALF*HCORR(I,J)*AREA(I,J,2,bi,bj)
411 & /(HEFF(I,J,1,bi,bj)+.00001 _d 0)
412 AREA(I,J,1,bi,bj)=AREA(I,J,1,bi,bj)+GAREA(I,J)
413 ENDDO
414 ENDDO
415 #ifdef ALLOW_AUTODIFF_TAMC
416 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
417 CADJ & key = iicekey, byte = isbyte
418 #endif
419 DO J=1,sNy
420 DO I=1,sNx
421
422 C NOW UPDATE HEFF
423 GHEFF(I,J) = -SEAICE_deltaTtherm*
424 & FICE(I,J)*Q0*AREA(I,J,2,bi,bj)
425 GHEFF(I,J) = -ONE*MIN(HEFF(I,J,1,bi,bj),GHEFF(I,J))
426 HEFF(I,J,1,bi,bj)= HEFF(I,J,1,bi,bj)+GHEFF(I,J)
427 SEAICE_SALT(I,J) = SEAICE_SALT(I,J)+GHEFF(I,J)
428
429 C NOW CALCULATE QNETI UNDER ICE IF ANY
430 QNETI(I,J) = (GHEFF(I,J)-SEAICE_deltaTtherm*
431 & FICE(I,J)*Q0*AREA(I,J,2,bi,bj))/Q0/SEAICE_deltaTtherm
432
433 C NOW UPDATE OTHER THINGS
434
435 IF(FICE(I,J).GT.ZERO) THEN
436 C FREEZING, PRECIP ADDED AS SNOW
437 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)+SEAICE_deltaTtherm*
438 & PRECIP(I,J,bi,bj)*AREA(I,J,2,bi,bj)*SDF
439 ELSE
440 C ADD PRECIP AS RAIN, WATER CONVERTED INTO equivalent m of ICE BY 1/ICE_DENS
441 SEAICE_SALT(I,J) = SEAICE_SALT(I,J)
442 & -PRECIP(I,J,bi,bj)*AREA(I,J,2,bi,bj)*
443 & SEAICE_deltaTtherm/ICE_DENS
444 ENDIF
445
446 C Now add in precip over open water directly into ocean as negative salt
447 SEAICE_SALT(I,J) = SEAICE_SALT(I,J)
448 & -PRECIP(I,J,bi,bj)*(ONE-AREA(I,J,2,bi,bj))
449 & *SEAICE_deltaTtherm/ICE_DENS
450
451 C Now melt snow if there is residual heat left in surface level
452 C Note that units of YNEG and SEAICE_SALT are m of ice
453 cph( very sensitive bit here by JZ
454 IF( RESID_HEAT(I,J) .GT. ZERO
455 & .AND. HSNOW(I,J,bi,bj) .GT. ZERO ) THEN
456 GHEFF(I,J) = MIN( HSNOW(I,J,bi,bj)/SDF/ICE_DENS,
457 & RESID_HEAT(I,J) )
458 YNEG(I,J,bi,bj) = YNEG(I,J,bi,bj)+GHEFF(I,J)
459 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)-GHEFF(I,J)*SDF*ICE_DENS
460 SEAICE_SALT(I,J) = SEAICE_SALT(I,J)-GHEFF(I,J)
461 ENDIF
462 cph)
463
464 C NOW GET FRESH WATER FLUX
465 EmPmR(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*(
466 & EVAP(I,J,bi,bj)*(ONE-AREA(I,J,2,bi,bj))
467 & -RUNOFF(I,J,bi,bj)
468 & +SEAICE_SALT(I,J)*ICE_DENS/SEAICE_deltaTtherm
469 & )
470
471 C NOW GET TOTAL QNET AND QSW
472 QNET(I,J,bi,bj) = QNETI(I,J) * AREA(I,J,2,bi,bj)
473 & +QNETO(I,J) * (ONE-AREA(I,J,2,bi,bj))
474 QSW(I,J,bi,bj) = QSWI(I,J) * AREA(I,J,2,bi,bj)
475 & +QSWO(I,J) * (ONE-AREA(I,J,2,bi,bj))
476
477 C Now convert YNEG back to deg K.
478 YNEG(I,J,bi,bj) = YNEG(I,J,bi,bj)*recip_dRf(1)*72.0764 _d 0
479
480 C Add YNEG contribution to QNET
481 QNET(I,J,bi,bj) = QNET(I,J,bi,bj)
482 & +YNEG(I,J,bi,bj)/SEAICE_deltaTtherm
483 & *maskC(I,J,kSurface,bi,bj)
484 & *HeatCapacity_Cp*recip_horiVertRatio*rhoConst
485 & *drF(kSurface)*hFacC(i,j,kSurface,bi,bj)
486
487 ENDDO
488 ENDDO
489
490 #ifdef SEAICE_DEBUG
491 c CALL PLOT_FIELD_XYRS( UWIND,'Current UWIND ', myIter, myThid )
492 c CALL PLOT_FIELD_XYRS( VWIND,'Current VWIND ', myIter, myThid )
493 CALL PLOT_FIELD_XYRS( GWATX,'Current GWATX ', myIter, myThid )
494 CALL PLOT_FIELD_XYRS( GWATY,'Current GWATY ', myIter, myThid )
495 CML CALL PLOT_FIELD_XYRL( FO,'Current FO ', myIter, myThid )
496 CML CALL PLOT_FIELD_XYRL( FHEFF,'Current FHEFF ', myIter, myThid )
497 CALL PLOT_FIELD_XYRL( QSW,'Current QSW ', myIter, myThid )
498 CALL PLOT_FIELD_XYRL( QNET,'Current QNET ', myIter, myThid )
499 CALL PLOT_FIELD_XYRL( EmPmR,'Current EmPmR ', myIter, myThid )
500 DO j=1-OLy,sNy+OLy
501 DO i=1-OLx,sNx+OLx
502 GHEFF(I,J)=SQRT(UICE(I,J,1,bi,bj)**2+VICE(I,J,1,bi,bj)**2)
503 GAREA(I,J)=HEFF(I,J,1,bi,bj)
504 print*,'I J QNET:',I, J, QNET(i,j,bi,bj), QSW(I,J,bi,bj)
505 ENDDO
506 ENDDO
507 CALL PLOT_FIELD_XYRL( GHEFF,'Current UICE ', myIter, myThid )
508 CALL PLOT_FIELD_XYRL( GAREA,'Current HEFF ', myIter, myThid )
509 DO j=1-OLy,sNy+OLy
510 DO i=1-OLx,sNx+OLx
511 if(HEFF(i,j,1,bi,bj).gt.1.) then
512 print '(A,2i4,3f10.2)','#### i j heff theta yneg',i,j,
513 & HEFF(i,j,1,bi,bj),theta(I,J,1,bi,bj),yneg(I,J,bi,bj)
514 print '(A,3f10.2)','QSW, QNET before/after correction',
515 & QSW(I,J,bi,bj),QNETI(I,J)*AREA(I,J,2,bi,bj)+
516 & (ONE-AREA(I,J,2,bi,bj))*QNETO(I,J), QNET(I,J,bi,bj)
517 endif
518 ENDDO
519 ENDDO
520 #endif /* SEAICE_DEBUG */
521
522 crg Added by Ralf Giering: do we need DO_WE_NEED_THIS ?
523 #define DO_WE_NEED_THIS
524 C NOW ZERO OUTSIDE POINTS
525 #ifdef ALLOW_AUTODIFF_TAMC
526 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
527 CADJ & key = iicekey, byte = isbyte
528 CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj,
529 CADJ & key = iicekey, byte = isbyte
530 #endif /* ALLOW_AUTODIFF_TAMC */
531 DO J=1,sNy
532 DO I=1,sNx
533 C NOW SET AREA(I,J,1,bi,bj)=0 WHERE NO ICE IS
534 AREA(I,J,1,bi,bj)=MIN(AREA(I,J,1,bi,bj)
535 & ,HEFF(I,J,1,bi,bj)/.0001 _d 0)
536 ENDDO
537 ENDDO
538 #ifdef ALLOW_AUTODIFF_TAMC
539 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
540 CADJ & key = iicekey, byte = isbyte
541 #endif /* ALLOW_AUTODIFF_TAMC */
542 DO J=1,sNy
543 DO I=1,sNx
544 C NOW TRUNCATE AREA
545 #ifdef DO_WE_NEED_THIS
546 AREA(I,J,1,bi,bj)=MIN(ONE,AREA(I,J,1,bi,bj))
547 ENDDO
548 ENDDO
549 #ifdef ALLOW_AUTODIFF_TAMC
550 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
551 CADJ & key = iicekey, byte = isbyte
552 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
553 CADJ & key = iicekey, byte = isbyte
554 #endif /* ALLOW_AUTODIFF_TAMC */
555 DO J=1,sNy
556 DO I=1,sNx
557 AREA(I,J,1,bi,bj) = MAX(ZERO,AREA(I,J,1,bi,bj))
558 HSNOW(I,J,bi,bj) = MAX(ZERO,HSNOW(I,J,bi,bj))
559 #endif
560 AREA(I,J,1,bi,bj) = AREA(I,J,1,bi,bj)*HEFFM(I,J,bi,bj)
561 HEFF(I,J,1,bi,bj) = HEFF(I,J,1,bi,bj)*HEFFM(I,J,bi,bj)
562 #ifdef DO_WE_NEED_THIS
563 c HEFF(I,J,1,bi,bj)=MIN(MAX_HEFF,HEFF(I,J,1,bi,bj))
564 #endif
565 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)*HEFFM(I,J,bi,bj)
566 ENDDO
567 ENDDO
568
569 #ifdef ALLOW_SEAICE_FLOODING
570 IF ( SEAICEuseFlooding ) THEN
571 C convert snow to ice if submerged
572 DO J=1,sNy
573 DO I=1,sNx
574 hDraft = (HSNOW(I,J,bi,bj)*330. _d 0
575 & +HEFF(I,J,1,bi,bj)*SEAICE_rhoIce)/1000. _d 0
576 hFlood = hDraft - MIN(hDraft,HEFF(I,J,1,bi,bj))
577 HEFF(I,J,1,bi,bj) = HEFF(I,J,1,bi,bj) + hFlood
578 HSNOW(I,J,bi,bj) = MAX(0. _d 0,HSNOW(I,J,bi,bj)-hFlood/SDF)
579 ENDDO
580 ENDDO
581 ENDIF
582 #endif /* ALLOW_SEAICE_FLOODING */
583
584 #ifdef ATMOSPHERIC_LOADING
585 IF ( useRealFreshWaterFlux ) THEN
586 DO J=1,sNy
587 DO I=1,sNx
588 sIceLoad(i,j,bi,bj) = HEFF(I,J,1,bi,bj)*SEAICE_rhoIce
589 & + HSNOW(I,J,bi,bj)* 330. _d 0
590 ENDDO
591 ENDDO
592 ENDIF
593 #endif
594
595 ENDDO
596 ENDDO
597
598 RETURN
599 END

  ViewVC Help
Powered by ViewVC 1.1.22