/[MITgcm]/MITgcm/pkg/seaice/seaice_growth.F
ViewVC logotype

Annotation of /MITgcm/pkg/seaice/seaice_growth.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.5 - (hide annotations) (download)
Tue Dec 19 16:00:39 2006 UTC (17 years, 4 months ago) by mlosch
Branch: MAIN
Changes since 1.4: +2 -2 lines
fix bug reported by DM

1 mlosch 1.5 C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_growth.F,v 1.4 2006/12/15 15:48:23 heimbach Exp $
2 heimbach 1.2 C $Name: $
3 mlosch 1.1
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 mlosch 1.3 C number of surface interface layer
42     INTEGER kSurface
43 mlosch 1.1 _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 mlosch 1.3 C local copy of AREA
80     _RL areaLoc(1-OLx:sNx+OLx, 1-OLy:sNy+OLy)
81 mlosch 1.1
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 mlosch 1.3 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 mlosch 1.1
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 heimbach 1.2 #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 mlosch 1.1 DO J=1,sNy
136     DO I=1,sNx
137 mlosch 1.3 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 mlosch 1.1 #ifdef SEAICE_MULTILEVEL
141 mlosch 1.3 FICEP(I,J) = 0.0 _d 0
142 mlosch 1.1 #endif
143 mlosch 1.3 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 mlosch 1.1 ENDDO
153     ENDDO
154     #ifdef ALLOW_AUTODIFF_TAMC
155 heimbach 1.2 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 mlosch 1.1 #endif /* ALLOW_AUTODIFF_TAMC */
160 heimbach 1.2 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 mlosch 1.3 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 heimbach 1.2 ENDDO
167     ENDDO
168 mlosch 1.1
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 heimbach 1.2 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 mlosch 1.1 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 mlosch 1.5 I UG, HICEP, hSnwLoc,
236 mlosch 1.1 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 mlosch 1.3 #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 mlosch 1.1 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 heimbach 1.2 CADJ STORE fice(:,:) = comlev1_bibj,
314 mlosch 1.1 CADJ & key = iicekey, byte = isbyte
315     #endif /* ALLOW_AUTODIFF_TAMC */
316     cph)
317    
318     DO J=1,sNy
319     DO I=1,sNx
320 mlosch 1.3 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 mlosch 1.1 ENDDO
323     ENDDO
324 heimbach 1.2
325 mlosch 1.1 #ifdef ALLOW_AUTODIFF_TAMC
326 mlosch 1.3 CADJ STORE fice(:,:) = comlev1_bibj,
327     CADJ & key = iicekey, byte = isbyte
328 mlosch 1.1 #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 heimbach 1.2 ENDDO
355     ENDDO
356 mlosch 1.1
357 heimbach 1.2 #ifdef ALLOW_AUTODIFF_TAMC
358 mlosch 1.3 CADJ STORE fice(:,:) = comlev1_bibj,
359     CADJ & key = iicekey, byte = isbyte
360 heimbach 1.2 #endif /* ALLOW_AUTODIFF_TAMC */
361    
362     DO J=1,sNy
363     DO I=1,sNx
364 mlosch 1.1 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 mlosch 1.3 CADJ STORE fice(:,:) = comlev1_bibj,
376 mlosch 1.1 CADJ & key = iicekey, byte = isbyte
377 mlosch 1.3 CADJ STORE fheff(:,:) = comlev1_bibj,
378 mlosch 1.1 CADJ & key = iicekey, byte = isbyte
379 mlosch 1.3 CADJ STORE qneto(:,:) = comlev1_bibj,
380 mlosch 1.1 CADJ & key = iicekey, byte = isbyte
381 mlosch 1.3 CADJ STORE qswi(:,:) = comlev1_bibj,
382 mlosch 1.1 CADJ & key = iicekey, byte = isbyte
383 mlosch 1.3 CADJ STORE qswo(:,:) = comlev1_bibj,
384 mlosch 1.1 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 mlosch 1.3 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 mlosch 1.1 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 mlosch 1.3 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 mlosch 1.1
423     C NOW CALCULATE QNETI UNDER ICE IF ANY
424 mlosch 1.3 QNETI(I,J) = (GHEFF(I,J)-SEAICE_deltaTtherm*
425 mlosch 1.1 & 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 mlosch 1.3 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)+SEAICE_deltaTtherm*
432 mlosch 1.1 & 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 mlosch 1.3 SEAICE_SALT(I,J) = SEAICE_SALT(I,J)
436 mlosch 1.1 & -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 mlosch 1.3 SEAICE_SALT(I,J) = SEAICE_SALT(I,J)
442 mlosch 1.1 & -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 heimbach 1.4 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 mlosch 1.3 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 mlosch 1.1 ENDIF
456 heimbach 1.4 cph)
457 mlosch 1.1
458     C NOW GET FRESH WATER FLUX
459 mlosch 1.3 EmPmR(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*(
460 mlosch 1.1 & 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 mlosch 1.3 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 mlosch 1.1
471     C Now convert YNEG back to deg K.
472 mlosch 1.3 YNEG(I,J,bi,bj) = YNEG(I,J,bi,bj)*recip_dRf(1)*72.0764 _d 0
473 mlosch 1.1
474     C Add YNEG contribution to QNET
475 mlosch 1.3 QNET(I,J,bi,bj) = QNET(I,J,bi,bj)
476 mlosch 1.1 & +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 mlosch 1.3 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 mlosch 1.1 #endif
554 mlosch 1.3 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 mlosch 1.1 #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 mlosch 1.3 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)*HEFFM(I,J,bi,bj)
560 mlosch 1.1 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 mlosch 1.3 HSNOW(I,J,bi,bj) = MAX(0. _d 0,HSNOW(I,J,bi,bj)-hFlood/SDF)
573 mlosch 1.1 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