/[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.4 - (show annotations) (download)
Fri Dec 15 15:48:23 2006 UTC (17 years, 4 months ago) by heimbach
Branch: MAIN
Changes since 1.3: +5 -6 lines
Just remove one CADJ STORE
(and add a comment marking sensitive piece of code)

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

  ViewVC Help
Powered by ViewVC 1.1.22