/[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.3 - (show annotations) (download)
Fri Dec 15 15:04:53 2006 UTC (17 years, 4 months ago) by mlosch
Branch: MAIN
Changes since 1.2: +118 -119 lines
- replace area(i,j,3,bi,bj) by a local array.
- rearrange routine a little more (Patrick is going to love this, but
  I moved the store directives as well): move the budget computations
  (seaice_budget_ocean/ice) to the beginning of the routine. Results
  are not changed and I don't expect any problems for the adjoint
  because the switched blocks are completely independent.

1 C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_growth.F,v 1.2 2006/12/14 22:31:18 heimbach 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 cph(
113 #ifdef ALLOW_AUTODIFF_TAMC
114 act1 = bi - myBxLo(myThid)
115 max1 = myBxHi(myThid) - myBxLo(myThid) + 1
116 act2 = bj - myByLo(myThid)
117 max2 = myByHi(myThid) - myByLo(myThid) + 1
118 act3 = myThid - 1
119 max3 = nTx*nTy
120 act4 = ikey_dynamics - 1
121 iicekey = (act1 + 1) + act2*max1
122 & + act3*max1*max2
123 & + act4*max1*max2*max3
124 #endif /* ALLOW_AUTODIFF_TAMC */
125 C
126 C initialise a few fields
127 C
128 #ifdef ALLOW_AUTODIFF_TAMC
129 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
130 CADJ & key = iicekey, byte = isbyte
131 CADJ STORE qnet(:,:,bi,bj) = comlev1_bibj,
132 CADJ & key = iicekey, byte = isbyte
133 CADJ STORE qsw(:,:,bi,bj) = comlev1_bibj,
134 CADJ & key = iicekey, byte = isbyte
135 #endif /* ALLOW_AUTODIFF_TAMC */
136 DO J=1,sNy
137 DO I=1,sNx
138 areaLoc(I,J) = MAX(A22,AREA(I,J,2,bi,bj))
139 FHEFF(I,J) = 0.0 _d 0
140 FICE (I,J) = 0.0 _d 0
141 #ifdef SEAICE_MULTILEVEL
142 FICEP(I,J) = 0.0 _d 0
143 #endif
144 FHEFF(I,J) = 0.0 _d 0
145 FICE (I,J) = 0.0 _d 0
146 QNETO(I,J) = 0.0 _d 0
147 QNETI(I,J) = 0.0 _d 0
148 QSWO (I,J) = 0.0 _d 0
149 QSWI (I,J) = 0.0 _d 0
150 HCORR(I,J) = 0.0 _d 0
151 SEAICE_SALT(I,J) = 0.0 _d 0
152 RESID_HEAT (I,J) = 0.0 _d 0
153 ENDDO
154 ENDDO
155 #ifdef ALLOW_AUTODIFF_TAMC
156 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
157 CADJ & key = iicekey, byte = isbyte
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 cph need to adjoint-store AREA again before using it in further init.
166 cph (all these initialisations involving AREA are nasty "non-linear")
167 HICE(I,J) = HEFF(I,J,2,bi,bj)/areaLoc(I,J)
168 hSnwLoc(I,J) = HSNOW(I,J,bi,bj)/areaLoc(I,J)
169 ENDDO
170 ENDDO
171
172 C NOW DETERMINE MIXED LAYER TEMPERATURE
173 DO J=1,sNy
174 DO I=1,sNx
175 TMIX(I,J,bi,bj)=theta(I,J,kSurface,bi,bj)+273.16 _d +00
176 #ifdef SEAICE_DEBUG
177 TMIX(I,J,bi,bj)=MAX(TMIX(I,J,bi,bj),271.2 _d +00)
178 #endif
179 ENDDO
180 ENDDO
181
182 C THERMAL WIND OF ATMOSPHERE
183 DO J=1,sNy
184 DO I=1,sNx
185 CML#ifdef SEAICE_EXTERNAL_FORCING
186 CMLC this seems to be more natural as we do compute the wind speed in
187 CMLC pkg/exf/exf_wind.F, but it changes the results
188 CML UG(I,J) = MAX(SEAICE_EPS,wspeed(I,J,bi,bj))
189 CML#else
190 SPEED_SQ = UWIND(I,J,bi,bj)**2 + VWIND(I,J,bi,bj)**2
191 IF ( SPEED_SQ .LE. SEAICE_EPS_SQ ) THEN
192 UG(I,J)=SEAICE_EPS
193 ELSE
194 UG(I,J)=SQRT(SPEED_SQ)
195 ENDIF
196 CML#endif /* SEAICE_EXTERNAL_FORCING */
197 ENDDO
198 ENDDO
199
200
201 #ifdef ALLOW_AUTODIFF_TAMC
202 cphCADJ STORE heff = comlev1, key = ikey_dynamics
203 cphCADJ STORE hsnow = comlev1, key = ikey_dynamics
204 cphCADJ STORE uwind = comlev1, key = ikey_dynamics
205 cphCADJ STORE vwind = comlev1, key = ikey_dynamics
206 c
207 CADJ STORE tice = comlev1, key = ikey_dynamics
208 # ifdef SEAICE_MULTILEVEL
209 CADJ STORE tices = comlev1, key = ikey_dynamics
210 # endif
211 #endif /* ALLOW_AUTODIFF_TAMC */
212
213 C NOW DETERMINE GROWTH RATES
214 C FIRST DO OPEN WATER
215 CALL SEAICE_BUDGET_OCEAN(
216 I UG,
217 U TMIX,
218 O QNETO, QSWO,
219 I bi, bj)
220
221 C NOW DO ICE
222 #ifdef SEAICE_MULTILEVEL
223 C-- Start loop over muli-levels
224 DO IT=1,MULTDIM
225 #ifdef ALLOW_AUTODIFF_TAMC
226 ilockey = (iicekey-1)*MULTDIM + IT
227 CADJ STORE tices(:,:,it,bi,bj) = comlev1_multdim,
228 CADJ & key = ilockey, byte = isbyte
229 #endif /* ALLOW_AUTODIFF_TAMC */
230 DO J=1,sNy
231 DO I=1,sNx
232 RK=IT*1.0
233 HICEP(I,J)=(HICE(I,J)/7.0 _d 0)*((2.0 _d 0*RK)-1.0 _d 0)
234 TICE(I,J,bi,bj)=TICES(I,J,IT,bi,bj)
235 ENDDO
236 ENDDO
237 CALL SEAICE_BUDGET_ICE(
238 I UG, HICE, hSnwLoc,
239 U TICE,
240 O FICE, QSWI,
241 I bi, bj)
242 DO J=1,sNy
243 DO I=1,sNx
244 FICEP(I,J)=(FICE(I,J)/7.0 _d 0)+FICEP(I,J)
245 TICES(I,J,IT,bi,bj)=TICE(I,J,bi,bj)
246 ENDDO
247 ENDDO
248 ENDDO
249 C-- End loop over muli-levels
250 DO J=1,sNy
251 DO I=1,sNx
252 FICE(I,J)=FICEP(I,J)
253 ENDDO
254 ENDDO
255 #else /* SEAICE_MULTILEVEL */
256 CALL SEAICE_BUDGET_ICE(
257 I UG, HICE, hSnwLoc,
258 U TICE,
259 O FICE, QSWI,
260 I bi, bj)
261 #endif /* SEAICE_MULTILEVEL */
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 IF( RESID_HEAT(I,J) .GT.ZERO
451 & .AND.HSNOW(I,J,bi,bj).GT.ZERO ) THEN
452 GHEFF(I,J) = MIN( HSNOW(I,J,bi,bj)/SDF/ICE_DENS,
453 & RESID_HEAT(I,J) )
454 YNEG(I,J,bi,bj) = YNEG(I,J,bi,bj)+GHEFF(I,J)
455 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)-GHEFF(I,J)*SDF*ICE_DENS
456 SEAICE_SALT(I,J) = SEAICE_SALT(I,J)-GHEFF(I,J)
457 ENDIF
458
459 C NOW GET FRESH WATER FLUX
460 EmPmR(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*(
461 & EVAP(I,J,bi,bj)*(ONE-AREA(I,J,2,bi,bj))
462 & -RUNOFF(I,J,bi,bj)
463 & +SEAICE_SALT(I,J)*ICE_DENS/SEAICE_deltaTtherm
464 & )
465
466 C NOW GET TOTAL QNET AND QSW
467 QNET(I,J,bi,bj) = QNETI(I,J) * AREA(I,J,2,bi,bj)
468 & +QNETO(I,J) * (ONE-AREA(I,J,2,bi,bj))
469 QSW(I,J,bi,bj) = QSWI(I,J) * AREA(I,J,2,bi,bj)
470 & +QSWO(I,J) * (ONE-AREA(I,J,2,bi,bj))
471
472 C Now convert YNEG back to deg K.
473 YNEG(I,J,bi,bj) = YNEG(I,J,bi,bj)*recip_dRf(1)*72.0764 _d 0
474
475 C Add YNEG contribution to QNET
476 QNET(I,J,bi,bj) = QNET(I,J,bi,bj)
477 & +YNEG(I,J,bi,bj)/SEAICE_deltaTtherm
478 & *maskC(I,J,kSurface,bi,bj)
479 & *HeatCapacity_Cp*recip_horiVertRatio*rhoConst
480 & *drF(kSurface)*hFacC(i,j,kSurface,bi,bj)
481
482 ENDDO
483 ENDDO
484
485 #ifdef SEAICE_DEBUG
486 c CALL PLOT_FIELD_XYRS( UWIND,'Current UWIND ', myIter, myThid )
487 c CALL PLOT_FIELD_XYRS( VWIND,'Current VWIND ', myIter, myThid )
488 CALL PLOT_FIELD_XYRS( GWATX,'Current GWATX ', myIter, myThid )
489 CALL PLOT_FIELD_XYRS( GWATY,'Current GWATY ', myIter, myThid )
490 CML CALL PLOT_FIELD_XYRL( FO,'Current FO ', myIter, myThid )
491 CML CALL PLOT_FIELD_XYRL( FHEFF,'Current FHEFF ', myIter, myThid )
492 CALL PLOT_FIELD_XYRL( QSW,'Current QSW ', myIter, myThid )
493 CALL PLOT_FIELD_XYRL( QNET,'Current QNET ', myIter, myThid )
494 CALL PLOT_FIELD_XYRL( EmPmR,'Current EmPmR ', myIter, myThid )
495 DO j=1-OLy,sNy+OLy
496 DO i=1-OLx,sNx+OLx
497 GHEFF(I,J)=SQRT(UICE(I,J,1,bi,bj)**2+VICE(I,J,1,bi,bj)**2)
498 GAREA(I,J)=HEFF(I,J,1,bi,bj)
499 print*,'I J QNET:',I, J, QNET(i,j,bi,bj), QSW(I,J,bi,bj)
500 ENDDO
501 ENDDO
502 CALL PLOT_FIELD_XYRL( GHEFF,'Current UICE ', myIter, myThid )
503 CALL PLOT_FIELD_XYRL( GAREA,'Current HEFF ', myIter, myThid )
504 DO j=1-OLy,sNy+OLy
505 DO i=1-OLx,sNx+OLx
506 if(HEFF(i,j,1,bi,bj).gt.1.) then
507 print '(A,2i4,3f10.2)','#### i j heff theta yneg',i,j,
508 & HEFF(i,j,1,bi,bj),theta(I,J,1,bi,bj),yneg(I,J,bi,bj)
509 print '(A,3f10.2)','QSW, QNET before/after correction',
510 & QSW(I,J,bi,bj),QNETI(I,J)*AREA(I,J,2,bi,bj)+
511 & (ONE-AREA(I,J,2,bi,bj))*QNETO(I,J), QNET(I,J,bi,bj)
512 endif
513 ENDDO
514 ENDDO
515 #endif /* SEAICE_DEBUG */
516
517 crg Added by Ralf Giering: do we need DO_WE_NEED_THIS ?
518 #define DO_WE_NEED_THIS
519 C NOW ZERO OUTSIDE POINTS
520 #ifdef ALLOW_AUTODIFF_TAMC
521 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
522 CADJ & key = iicekey, byte = isbyte
523 CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj,
524 CADJ & key = iicekey, byte = isbyte
525 #endif /* ALLOW_AUTODIFF_TAMC */
526 DO J=1,sNy
527 DO I=1,sNx
528 C NOW SET AREA(I,J,1,bi,bj)=0 WHERE NO ICE IS
529 AREA(I,J,1,bi,bj)=MIN(AREA(I,J,1,bi,bj)
530 & ,HEFF(I,J,1,bi,bj)/.0001 _d 0)
531 ENDDO
532 ENDDO
533 #ifdef ALLOW_AUTODIFF_TAMC
534 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
535 CADJ & key = iicekey, byte = isbyte
536 #endif /* ALLOW_AUTODIFF_TAMC */
537 DO J=1,sNy
538 DO I=1,sNx
539 C NOW TRUNCATE AREA
540 #ifdef DO_WE_NEED_THIS
541 AREA(I,J,1,bi,bj)=MIN(ONE,AREA(I,J,1,bi,bj))
542 ENDDO
543 ENDDO
544 #ifdef ALLOW_AUTODIFF_TAMC
545 CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
546 CADJ & key = iicekey, byte = isbyte
547 CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
548 CADJ & key = iicekey, byte = isbyte
549 #endif /* ALLOW_AUTODIFF_TAMC */
550 DO J=1,sNy
551 DO I=1,sNx
552 AREA(I,J,1,bi,bj) = MAX(ZERO,AREA(I,J,1,bi,bj))
553 HSNOW(I,J,bi,bj) = MAX(ZERO,HSNOW(I,J,bi,bj))
554 #endif
555 AREA(I,J,1,bi,bj) = AREA(I,J,1,bi,bj)*HEFFM(I,J,bi,bj)
556 HEFF(I,J,1,bi,bj) = HEFF(I,J,1,bi,bj)*HEFFM(I,J,bi,bj)
557 #ifdef DO_WE_NEED_THIS
558 c HEFF(I,J,1,bi,bj)=MIN(MAX_HEFF,HEFF(I,J,1,bi,bj))
559 #endif
560 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)*HEFFM(I,J,bi,bj)
561 ENDDO
562 ENDDO
563
564 #ifdef ALLOW_SEAICE_FLOODING
565 IF ( SEAICEuseFlooding ) THEN
566 C convert snow to ice if submerged
567 DO J=1,sNy
568 DO I=1,sNx
569 hDraft = (HSNOW(I,J,bi,bj)*330. _d 0
570 & +HEFF(I,J,1,bi,bj)*SEAICE_rhoIce)/1000. _d 0
571 hFlood = hDraft - MIN(hDraft,HEFF(I,J,1,bi,bj))
572 HEFF(I,J,1,bi,bj) = HEFF(I,J,1,bi,bj) + hFlood
573 HSNOW(I,J,bi,bj) = MAX(0. _d 0,HSNOW(I,J,bi,bj)-hFlood/SDF)
574 ENDDO
575 ENDDO
576 ENDIF
577 #endif /* ALLOW_SEAICE_FLOODING */
578
579 #ifdef ATMOSPHERIC_LOADING
580 IF ( useRealFreshWaterFlux ) THEN
581 DO J=1,sNy
582 DO I=1,sNx
583 sIceLoad(i,j,bi,bj) = HEFF(I,J,1,bi,bj)*SEAICE_rhoIce
584 & + HSNOW(I,J,bi,bj)* 330. _d 0
585 ENDDO
586 ENDDO
587 ENDIF
588 #endif
589
590 ENDDO
591 ENDDO
592
593 RETURN
594 END

  ViewVC Help
Powered by ViewVC 1.1.22