/[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.2 - (show annotations) (download)
Thu Dec 14 22:31:18 2006 UTC (17 years, 4 months ago) by heimbach
Branch: MAIN
Changes since 1.1: +39 -18 lines
Updating seaice adjoint, step 1 (everything, except SEAICE_EVP).

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

  ViewVC Help
Powered by ViewVC 1.1.22