/[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.6 - (hide 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 dimitri 1.6 C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_growth.F,v 1.5 2006/12/19 16:00:39 mlosch 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 dimitri 1.6 C actual ice thickness with upper and lower limit
73     _RL hIceLoc (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
74    
75 mlosch 1.1 _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 mlosch 1.3 C local copy of AREA
82     _RL areaLoc(1-OLx:sNx+OLx, 1-OLy:sNy+OLy)
83 mlosch 1.1
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 mlosch 1.3 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 mlosch 1.1
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 heimbach 1.2 #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 mlosch 1.1 DO J=1,sNy
138     DO I=1,sNx
139 mlosch 1.3 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 mlosch 1.1 #ifdef SEAICE_MULTILEVEL
143 mlosch 1.3 FICEP(I,J) = 0.0 _d 0
144 mlosch 1.1 #endif
145 mlosch 1.3 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 mlosch 1.1 ENDDO
155     ENDDO
156     #ifdef ALLOW_AUTODIFF_TAMC
157 heimbach 1.2 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 mlosch 1.1 #endif /* ALLOW_AUTODIFF_TAMC */
162 heimbach 1.2 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 dimitri 1.6 C COMPUTE ACTUAL ICE THICKNESS AND PUT MINIMUM/MAXIMUM
167     C ON ICE THICKNESS FOR BUDGET COMPUTATION
168 mlosch 1.3 HICE(I,J) = HEFF(I,J,2,bi,bj)/areaLoc(I,J)
169 dimitri 1.6 HICE(I,J) = MAX(HICE(I,J),0.05 _d +00)
170     HICE(I,J) = MIN(HICE(I,J),9.0 _d +00)
171 mlosch 1.3 hSnwLoc(I,J) = HSNOW(I,J,bi,bj)/areaLoc(I,J)
172 heimbach 1.2 ENDDO
173     ENDDO
174 mlosch 1.1
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 heimbach 1.2 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 mlosch 1.1 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 mlosch 1.5 I UG, HICEP, hSnwLoc,
242 mlosch 1.1 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 mlosch 1.3 #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 mlosch 1.1 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 heimbach 1.2 CADJ STORE fice(:,:) = comlev1_bibj,
320 mlosch 1.1 CADJ & key = iicekey, byte = isbyte
321     #endif /* ALLOW_AUTODIFF_TAMC */
322     cph)
323    
324     DO J=1,sNy
325     DO I=1,sNx
326 mlosch 1.3 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 mlosch 1.1 ENDDO
329     ENDDO
330 heimbach 1.2
331 mlosch 1.1 #ifdef ALLOW_AUTODIFF_TAMC
332 mlosch 1.3 CADJ STORE fice(:,:) = comlev1_bibj,
333     CADJ & key = iicekey, byte = isbyte
334 mlosch 1.1 #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 heimbach 1.2 ENDDO
361     ENDDO
362 mlosch 1.1
363 heimbach 1.2 #ifdef ALLOW_AUTODIFF_TAMC
364 mlosch 1.3 CADJ STORE fice(:,:) = comlev1_bibj,
365     CADJ & key = iicekey, byte = isbyte
366 heimbach 1.2 #endif /* ALLOW_AUTODIFF_TAMC */
367    
368     DO J=1,sNy
369     DO I=1,sNx
370 mlosch 1.1 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 mlosch 1.3 CADJ STORE fice(:,:) = comlev1_bibj,
382 mlosch 1.1 CADJ & key = iicekey, byte = isbyte
383 mlosch 1.3 CADJ STORE fheff(:,:) = comlev1_bibj,
384 mlosch 1.1 CADJ & key = iicekey, byte = isbyte
385 mlosch 1.3 CADJ STORE qneto(:,:) = comlev1_bibj,
386 mlosch 1.1 CADJ & key = iicekey, byte = isbyte
387 mlosch 1.3 CADJ STORE qswi(:,:) = comlev1_bibj,
388 mlosch 1.1 CADJ & key = iicekey, byte = isbyte
389 mlosch 1.3 CADJ STORE qswo(:,:) = comlev1_bibj,
390 mlosch 1.1 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 mlosch 1.3 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 mlosch 1.1 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 mlosch 1.3 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 mlosch 1.1
429     C NOW CALCULATE QNETI UNDER ICE IF ANY
430 mlosch 1.3 QNETI(I,J) = (GHEFF(I,J)-SEAICE_deltaTtherm*
431 mlosch 1.1 & 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 mlosch 1.3 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)+SEAICE_deltaTtherm*
438 mlosch 1.1 & 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 mlosch 1.3 SEAICE_SALT(I,J) = SEAICE_SALT(I,J)
442 mlosch 1.1 & -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 mlosch 1.3 SEAICE_SALT(I,J) = SEAICE_SALT(I,J)
448 mlosch 1.1 & -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 heimbach 1.4 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 mlosch 1.3 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 mlosch 1.1 ENDIF
462 heimbach 1.4 cph)
463 mlosch 1.1
464     C NOW GET FRESH WATER FLUX
465 mlosch 1.3 EmPmR(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*(
466 mlosch 1.1 & 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 mlosch 1.3 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 mlosch 1.1
477     C Now convert YNEG back to deg K.
478 mlosch 1.3 YNEG(I,J,bi,bj) = YNEG(I,J,bi,bj)*recip_dRf(1)*72.0764 _d 0
479 mlosch 1.1
480     C Add YNEG contribution to QNET
481 mlosch 1.3 QNET(I,J,bi,bj) = QNET(I,J,bi,bj)
482 mlosch 1.1 & +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 mlosch 1.3 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 mlosch 1.1 #endif
560 mlosch 1.3 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 mlosch 1.1 #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 mlosch 1.3 HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)*HEFFM(I,J,bi,bj)
566 mlosch 1.1 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 mlosch 1.3 HSNOW(I,J,bi,bj) = MAX(0. _d 0,HSNOW(I,J,bi,bj)-hFlood/SDF)
579 mlosch 1.1 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