/[MITgcm]/MITgcm_contrib/high_res_cube/code-mods/seaice_growth.F
ViewVC logotype

Annotation of /MITgcm_contrib/high_res_cube/code-mods/seaice_growth.F

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


Revision 1.1 - (hide annotations) (download)
Mon Jul 9 12:46:16 2007 UTC (18 years ago) by dimitri
Branch: MAIN
One more thing that is needed for cube66 to run stably is that HEFF_MAX be
reenabled.

1 dimitri 1.1 C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_growth.F,v 1.19 2007/07/06 02:37:34 dimitri 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     C constants
44     _RL TBC, SDF, ICE2WATR, ICE2SNOW
45     _RL QI, recip_QI, QS, recip_QS
46     C auxillary variables
47     _RL availHeat, hEffOld, snowEnergy, snowAsIce
48     _RL growthHEFF, growthNeg
49     #ifdef ALLOW_SEAICE_FLOODING
50     _RL hDraft, hFlood
51     #endif /* ALLOW_SEAICE_FLOODING */
52     _RL GAREA ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
53     _RL GHEFF ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
54     C RESID_HEAT is residual heat above freezing in equivalent m of ice
55     _RL RESID_HEAT ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
56    
57     C FICE - thermodynamic ice growth rate over sea ice in W/m^2
58     C >0 causes ice growth, <0 causes snow and sea ice melt
59     C FHEFF - effective thermodynamic ice growth rate over sea ice in W/m^2
60     C >0 causes ice growth, <0 causes snow and sea ice melt
61     C QNETO - thermodynamic ice growth rate over open water in W/m^2
62     C ( = surface heat flux )
63     C >0 causes ice growth, <0 causes snow and sea ice melt
64     C QNETI - net surface heat flux under ice in W/m^2
65     C QSWO - short wave heat flux over ocean in W/m^2
66     C QSWI - short wave heat flux under ice in W/m^2
67     _RL FHEFF (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
68     _RL FICE (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
69     _RL QNETO (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
70     _RL QNETI (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
71     _RL QSWO (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
72     _RL QSWI (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
73     C
74     _RL HCORR (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
75     C saltWtrIce contains m of salty ice melted (<0) or created (>0)
76     C for time being its salinity is assumed constant SEAICE_salinity
77     _RL saltWtrIce(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
78     C frWtrIce contains m of freshwater ice melted (<0) or created (>0)
79     C that is, ice due to precipitation or snow
80     _RL frWtrIce(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
81     C frWtrAtm contains freshwater flux from the atmosphere
82     _RL frWtrAtm(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
83     C actual ice thickness with upper and lower limit
84     _RL HICE (1-OLx:sNx+OLx, 1-OLy:sNy+OLy)
85     C actual snow thickness
86     _RL hSnwLoc(1-OLx:sNx+OLx, 1-OLy:sNy+OLy)
87     C wind speed
88     _RL UG (1-OLx:sNx+OLx, 1-OLy:sNy+OLy)
89     _RL SPEED_SQ
90     C local copy of AREA
91     _RL areaLoc
92    
93     #ifdef SEAICE_MULTICATEGORY
94     INTEGER it
95     INTEGER ilockey
96     _RL RK
97     _RL HICEP(1-OLx:sNx+OLx, 1-OLy:sNy+OLy)
98     _RL FICEP(1-OLx:sNx+OLx, 1-OLy:sNy+OLy)
99     _RL QSWIP(1-OLx:sNx+OLx, 1-OLy:sNy+OLy)
100     #endif
101    
102     if ( buoyancyRelation .eq. 'OCEANICP' ) then
103     kSurface = Nr
104     else
105     kSurface = 1
106     endif
107    
108     C FREEZING TEMP. OF SEA WATER (deg C)
109     TBC = SEAICE_freeze
110     C RATIO OF WATER DESITY TO SNOW DENSITY
111     SDF = 1000.0 _d 0/330.0 _d 0
112     C RATIO OF SEA ICE DESITY TO WATER DENSITY
113     ICE2WATR = 0.920 _d 0
114     C this makes more sense, but changes the results
115     C ICE2WATR = SEAICE_rhoIce * 1. _d -03
116     C RATIO OF SEA ICE DENSITY to SNOW DENSITY
117     ICE2SNOW = SDF * ICE2WATR
118     C HEAT OF FUSION OF ICE (m^3/J)
119     QI = 302.0 _d +06
120     recip_QI = 1.0 _d 0 / QI
121     C HEAT OF FUSION OF SNOW (J/m^3)
122     QS = 1.1 _d +08
123     recip_QS = 1.1 _d 0 / QS
124    
125     DO bj=myByLo(myThid),myByHi(myThid)
126     DO bi=myBxLo(myThid),myBxHi(myThid)
127     c
128     #ifdef ALLOW_AUTODIFF_TAMC
129     act1 = bi - myBxLo(myThid)
130     max1 = myBxHi(myThid) - myBxLo(myThid) + 1
131     act2 = bj - myByLo(myThid)
132     max2 = myByHi(myThid) - myByLo(myThid) + 1
133     act3 = myThid - 1
134     max3 = nTx*nTy
135     act4 = ikey_dynamics - 1
136     iicekey = (act1 + 1) + act2*max1
137     & + act3*max1*max2
138     & + act4*max1*max2*max3
139     #endif /* ALLOW_AUTODIFF_TAMC */
140     C
141     C initialise a few fields
142     C
143     #ifdef ALLOW_AUTODIFF_TAMC
144     CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
145     CADJ & key = iicekey, byte = isbyte
146     CADJ STORE qnet(:,:,bi,bj) = comlev1_bibj,
147     CADJ & key = iicekey, byte = isbyte
148     CADJ STORE qsw(:,:,bi,bj) = comlev1_bibj,
149     CADJ & key = iicekey, byte = isbyte
150     #endif /* ALLOW_AUTODIFF_TAMC */
151     DO J=1,sNy
152     DO I=1,sNx
153     FHEFF(I,J) = 0.0 _d 0
154     FICE (I,J) = 0.0 _d 0
155     #ifdef SEAICE_MULTICATEGORY
156     FICEP(I,J) = 0.0 _d 0
157     QSWIP(I,J) = 0.0 _d 0
158     #endif
159     FHEFF(I,J) = 0.0 _d 0
160     FICE (I,J) = 0.0 _d 0
161     QNETO(I,J) = 0.0 _d 0
162     QNETI(I,J) = 0.0 _d 0
163     QSWO (I,J) = 0.0 _d 0
164     QSWI (I,J) = 0.0 _d 0
165     HCORR(I,J) = 0.0 _d 0
166     saltWtrIce(I,J) = 0.0 _d 0
167     frWtrIce(I,J) = 0.0 _d 0
168     frWtrAtm(I,J) = 0.0 _d 0
169     RESID_HEAT(I,J) = 0.0 _d 0
170     ENDDO
171     ENDDO
172     #ifdef ALLOW_AUTODIFF_TAMC
173     CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj,
174     CADJ & key = iicekey, byte = isbyte
175     CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
176     CADJ & key = iicekey, byte = isbyte
177     #endif /* ALLOW_AUTODIFF_TAMC */
178     DO J=1,sNy
179     DO I=1,sNx
180     C COMPUTE ACTUAL ICE THICKNESS AND PUT MINIMUM/MAXIMUM
181     C ON ICE THICKNESS FOR BUDGET COMPUTATION
182     C The default of A22 = 0.15 is a common threshold for defining
183     C the ice edge. This ice concentration usually does not occur
184     C due to thermodynamics but due to advection.
185     areaLoc = MAX(A22,AREA(I,J,2,bi,bj))
186     HICE(I,J) = HEFF(I,J,2,bi,bj)/areaLoc
187     C Do we know what this is for?
188     HICE(I,J) = MAX(HICE(I,J),0.05 _d +00)
189     C Capping the actual ice thickness effectively enforces a
190     C minimum of heat flux through the ice and helps getting rid of
191     C very thick ice.
192     HICE(I,J) = MIN(HICE(I,J),MAX_HEFF)
193     hSnwLoc(I,J) = HSNOW(I,J,bi,bj)/areaLoc
194     ENDDO
195     ENDDO
196    
197     C NOW DETERMINE MIXED LAYER TEMPERATURE
198     DO J=1,sNy
199     DO I=1,sNx
200     TMIX(I,J,bi,bj)=theta(I,J,kSurface,bi,bj)+273.16 _d +00
201     #ifdef SEAICE_DEBUG
202     TMIX(I,J,bi,bj)=MAX(TMIX(I,J,bi,bj),271.2 _d +00)
203     #endif
204     ENDDO
205     ENDDO
206    
207     C THERMAL WIND OF ATMOSPHERE
208     DO J=1,sNy
209     DO I=1,sNx
210     CML#ifdef SEAICE_EXTERNAL_FORCING
211     CMLC this seems to be more natural as we do compute the wind speed in
212     CMLC pkg/exf/exf_wind.F, but it changes the results
213     CML UG(I,J) = MAX(SEAICE_EPS,wspeed(I,J,bi,bj))
214     CML#else
215     SPEED_SQ = UWIND(I,J,bi,bj)**2 + VWIND(I,J,bi,bj)**2
216     IF ( SPEED_SQ .LE. SEAICE_EPS_SQ ) THEN
217     UG(I,J)=SEAICE_EPS
218     ELSE
219     UG(I,J)=SQRT(SPEED_SQ)
220     ENDIF
221     CML#endif /* SEAICE_EXTERNAL_FORCING */
222     ENDDO
223     ENDDO
224    
225    
226     #ifdef ALLOW_AUTODIFF_TAMC
227     cphCADJ STORE heff = comlev1, key = ikey_dynamics
228     cphCADJ STORE hsnow = comlev1, key = ikey_dynamics
229     cphCADJ STORE uwind = comlev1, key = ikey_dynamics
230     cphCADJ STORE vwind = comlev1, key = ikey_dynamics
231     c
232     CADJ STORE tice = comlev1, key = ikey_dynamics
233     # ifdef SEAICE_MULTICATEGORY
234     CADJ STORE tices = comlev1, key = ikey_dynamics
235     # endif
236     #endif /* ALLOW_AUTODIFF_TAMC */
237    
238     C NOW DETERMINE GROWTH RATES
239     C FIRST DO OPEN WATER
240     CALL SEAICE_BUDGET_OCEAN(
241     I UG,
242     U TMIX,
243     O QNETO, QSWO,
244     I bi, bj, myThid )
245    
246     C NOW DO ICE
247     #ifdef SEAICE_MULTICATEGORY
248     C-- Start loop over muli-categories
249     DO IT=1,MULTDIM
250     #ifdef ALLOW_AUTODIFF_TAMC
251     ilockey = (iicekey-1)*MULTDIM + IT
252     CADJ STORE tices(:,:,it,bi,bj) = comlev1_multdim,
253     CADJ & key = ilockey, byte = isbyte
254     #endif /* ALLOW_AUTODIFF_TAMC */
255     RK=REAL(IT)
256     DO J=1,sNy
257     DO I=1,sNx
258     HICEP(I,J)=(HICE(I,J)/MULTDIM)*((2.0 _d 0*RK)-1.0 _d 0)
259     TICE(I,J,bi,bj)=TICES(I,J,IT,bi,bj)
260     ENDDO
261     ENDDO
262     CALL SEAICE_BUDGET_ICE(
263     I UG, HICEP, hSnwLoc,
264     U TICE,
265     O FICEP, QSWIP,
266     I bi, bj, myThid )
267     DO J=1,sNy
268     DO I=1,sNx
269     C average surface heat fluxes/growth rates
270     FICE (I,J) = FICE(I,J) + FICEP(I,J)/MULTDIM
271     QSWI (I,J) = QSWI(I,J) + QSWIP(I,J)/MULTDIM
272     TICES(I,J,IT,bi,bj) = TICE(I,J,bi,bj)
273     ENDDO
274     ENDDO
275     ENDDO
276     C-- End loop over multi-categories
277     #else /* SEAICE_MULTICATEGORY */
278     CALL SEAICE_BUDGET_ICE(
279     I UG, HICE, hSnwLoc,
280     U TICE,
281     O FICE, QSWI,
282     I bi, bj, myThid )
283     #endif /* SEAICE_MULTICATEGORY */
284    
285     #ifdef ALLOW_AUTODIFF_TAMC
286     CADJ STORE theta(:,:,:,bi,bj)= comlev1_bibj,
287     CADJ & key = iicekey, byte = isbyte
288     CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj,
289     CADJ & key = iicekey, byte = isbyte
290     #endif /* ALLOW_AUTODIFF_TAMC */
291     C
292     C-- compute and apply ice growth due to oceanic heat flux from below
293     C
294     DO J=1,sNy
295     DO I=1,sNx
296     C-- Create or melt sea-ice so that first-level oceanic temperature
297     C is approximately at the freezing point when there is sea-ice.
298     C Initially the units of YNEG/availHeat are m of sea-ice.
299     C The factor dRf(1)/72.0764, used to convert temperature
300     C change in deg K to m of sea-ice, is approximately:
301     C dRf(1) * (sea water heat capacity = 3996 J/kg/K)
302     C * (density of sea-water = 1026 kg/m^3)
303     C / (latent heat of fusion of sea-ice = 334000 J/kg)
304     C / (density of sea-ice = 910 kg/m^3)
305     C Negative YNEG/availHeat leads to ice growth.
306     C Positive YNEG/availHeat leads to ice melting.
307     IF ( .NOT. inAdMode ) THEN
308     #ifdef SEAICE_VARIABLE_FREEZING_POINT
309     TBC = -0.0575 _d 0*salt(I,J,kSurface,bi,bj) + 0.0901 _d 0
310     #endif /* SEAICE_VARIABLE_FREEZING_POINT */
311     availHeat = SEAICE_availHeatFrac
312     & * (theta(I,J,kSurface,bi,bj)-TBC) * dRf(kSurface)
313     & * hFacC(i,j,kSurface,bi,bj) / 72.0764 _d 0
314     ELSE
315     availHeat = 0.
316     ENDIF
317     C local copy of old effective ice thickness
318     hEffOld = HEFF(I,J,1,bi,bj)
319     C Melt (availHeat>0) or create (availHeat<0) sea ice
320     HEFF(I,J,1,bi,bj) = MAX(ZERO,HEFF(I,J,1,bi,bj)-availHeat)
321     C
322     YNEG(I,J,bi,bj) = hEffOld - HEFF(I,J,1,bi,bj)
323     C
324     saltWtrIce(I,J) = saltWtrIce(I,J) - YNEG(I,J,bi,bj)
325     RESID_HEAT(I,J) = availHeat - YNEG(I,J,bi,bj)
326     C YNEG now contains m of ice melted (>0) or created (<0)
327     C saltWtrIce contains m of ice melted (<0) or created (>0)
328     C RESID_HEAT is residual heat above freezing in equivalent m of ice
329     ENDDO
330     ENDDO
331    
332     cph(
333     #ifdef ALLOW_AUTODIFF_TAMC
334     cphCADJ STORE heff = comlev1, key = ikey_dynamics
335     cphCADJ STORE hsnow = comlev1, key = ikey_dynamics
336     #endif
337     cph)
338     c
339     #ifdef ALLOW_AUTODIFF_TAMC
340     CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
341     CADJ & key = iicekey, byte = isbyte
342     CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
343     CADJ & key = iicekey, byte = isbyte
344     CADJ STORE fice(:,:) = comlev1_bibj,
345     CADJ & key = iicekey, byte = isbyte
346     #endif /* ALLOW_AUTODIFF_TAMC */
347     cph)
348     C
349     C-- compute and apply ice growth due to atmospheric fluxes from above
350     C
351     DO J=1,sNy
352     DO I=1,sNx
353     C NOW CALCULATE CORRECTED effective growth in J/m^2 (>0=melt)
354     GHEFF(I,J)=-SEAICE_deltaTtherm*FICE(I,J)*AREA(I,J,2,bi,bj)
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     IF(FICE(I,J).LT.ZERO.AND.AREA(I,J,2,bi,bj).GT.ZERO) THEN
366     C use FICE to melt snow and CALCULATE CORRECTED GROWTH
367     C effective snow thickness in J/m^2
368     snowEnergy=HSNOW(I,J,bi,bj)*QS
369     IF(GHEFF(I,J).LE.snowEnergy) THEN
370     C not enough heat to melt all snow; use up all heat flux FICE
371     HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)-GHEFF(I,J)/QS
372     C SNOW CONVERTED INTO WATER AND THEN INTO equivalent m of ICE melt
373     C The factor 1/ICE2SNOW converts m of snow to m of sea-ice
374     frWtrIce(I,J) = frWtrIce(I,J) - GHEFF(I,J)/(QS*ICE2SNOW)
375     FICE (I,J) = ZERO
376     ELSE
377     C enought heat to melt snow completely;
378     C compute remaining heat flux that will melt ice
379     FICE(I,J)=-(GHEFF(I,J)-snowEnergy)/
380     & SEAICE_deltaTtherm/AREA(I,J,2,bi,bj)
381     C convert all snow to melt water (fresh water flux)
382     frWtrIce(I,J) = frWtrIce(I,J)
383     & -HSNOW(I,J,bi,bj)/ICE2SNOW
384     HSNOW(I,J,bi,bj)=0.0
385     END IF
386     END IF
387     ENDDO
388     ENDDO
389    
390     #ifdef ALLOW_AUTODIFF_TAMC
391     CADJ STORE fice(:,:) = comlev1_bibj,
392     CADJ & key = iicekey, byte = isbyte
393     #endif /* ALLOW_AUTODIFF_TAMC */
394    
395     DO J=1,sNy
396     DO I=1,sNx
397     C now get cell averaged growth rate in W/m^2, >0 causes ice growth
398     FHEFF(I,J)= FICE(I,J) * AREA(I,J,2,bi,bj)
399     & + QNETO(I,J) * (ONE-AREA(I,J,2,bi,bj))
400     ENDDO
401     ENDDO
402     cph(
403     #ifdef ALLOW_AUTODIFF_TAMC
404     CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj,
405     CADJ & key = iicekey, byte = isbyte
406     CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
407     CADJ & key = iicekey, byte = isbyte
408     CADJ STORE fice(:,:) = comlev1_bibj,
409     CADJ & key = iicekey, byte = isbyte
410     CADJ STORE fheff(:,:) = comlev1_bibj,
411     CADJ & key = iicekey, byte = isbyte
412     CADJ STORE qneto(:,:) = comlev1_bibj,
413     CADJ & key = iicekey, byte = isbyte
414     CADJ STORE qswi(:,:) = comlev1_bibj,
415     CADJ & key = iicekey, byte = isbyte
416     CADJ STORE qswo(:,:) = comlev1_bibj,
417     CADJ & key = iicekey, byte = isbyte
418     #endif /* ALLOW_AUTODIFF_TAMC */
419     cph)
420     #ifdef ALLOW_AUTODIFF_TAMC
421     CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
422     CADJ & key = iicekey, byte = isbyte
423     #endif
424     C
425     C First update (freeze or melt) ice area
426     C
427     DO J=1,sNy
428     DO I=1,sNx
429     C negative growth in meters of ice (>0 for melting)
430     growthNeg = -SEAICE_deltaTtherm*FHEFF(I,J)*recip_QI
431     C negative growth must not exceed effective ice thickness (=volume)
432     C (that is, cannot melt more than all the ice)
433     growthHEFF = -ONE*MIN(HEFF(I,J,1,bi,bj),growthNeg)
434     C growthHEFF < 0 means melting
435     HCORR(I,J) = MIN(ZERO,growthHEFF)
436     C gain of new effective ice thickness over open water (>0 by definition)
437     GAREA(I,J) = MAX(ZERO,SEAICE_deltaTtherm*QNETO(I,J)*recip_QI)
438     CML removed these loops and moved TAMC store directive up
439     CML ENDDO
440     CML ENDDO
441     CML#ifdef ALLOW_AUTODIFF_TAMC
442     CMLCADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
443     CMLCADJ & key = iicekey, byte = isbyte
444     CML#endif
445     CML DO J=1,sNy
446     CML DO I=1,sNx
447     C Here we finally compute the new AREA
448     AREA(I,J,1,bi,bj)=AREA(I,J,1,bi,bj)+
449     & (ONE-AREA(I,J,2,bi,bj))*GAREA(I,J)/HO
450     & +HALF*HCORR(I,J)*AREA(I,J,2,bi,bj)
451     & /(HEFF(I,J,1,bi,bj)+.00001 _d 0)
452     ENDDO
453     ENDDO
454     #ifdef ALLOW_AUTODIFF_TAMC
455     CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
456     CADJ & key = iicekey, byte = isbyte
457     #endif
458     C
459     C now update (freeze or melt) HEFF
460     C
461     DO J=1,sNy
462     DO I=1,sNx
463     C negative growth (>0 for melting) of existing ice in meters
464     growthNeg = -SEAICE_deltaTtherm*
465     & FICE(I,J)*recip_QI*AREA(I,J,2,bi,bj)
466     C negative growth must not exceed effective ice thickness (=volume)
467     C (that is, cannot melt more than all the ice)
468     growthHEFF = -ONE*MIN(HEFF(I,J,1,bi,bj),growthNeg)
469     C growthHEFF < 0 means melting
470     HEFF(I,J,1,bi,bj)= HEFF(I,J,1,bi,bj) + growthHEFF
471     C add effective growth to fresh water of ice
472     saltWtrIce(I,J) = saltWtrIce(I,J) + growthHEFF
473    
474     C now calculate QNETI under ice (if any) as the difference between
475     C the available "heat flux" growthNeg and the actual growthHEFF;
476     C keep in mind that growthNeg and growthHEFF have different signs
477     C by construction
478     QNETI(I,J) = (growthHEFF + growthNeg)*QI/SEAICE_deltaTtherm
479    
480     C now update other things
481    
482     #ifdef ALLOW_ATM_TEMP
483     IF(FICE(I,J).GT.ZERO) THEN
484     C freezing, add precip as snow
485     HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)+SEAICE_deltaTtherm*
486     & PRECIP(I,J,bi,bj)*AREA(I,J,2,bi,bj)*SDF
487     ELSE
488     C add precip as rain, water converted into equivalent m of
489     C ice by 1/ICE2WATR.
490     C Do not get confused by the sign:
491     C precip > 0 for downward flux of fresh water
492     C frWtrIce > 0 for more ice (corresponds to an upward "fresh water flux"),
493     C so that here the rain is added *as if* it is melted ice (which is not
494     C true, but just a trick; physically the rain just runs as water
495     C through the ice into the ocean)
496     frWtrIce(I,J) = frWtrIce(I,J)
497     & -PRECIP(I,J,bi,bj)*AREA(I,J,2,bi,bj)*
498     & SEAICE_deltaTtherm/ICE2WATR
499     ENDIF
500     #else /* ALLOW_ATM_TEMP */
501     STOP 'ABNORMAL END: S/R THSICE_GROWTH: ATM_TEMP undef'
502     #endif /* ALLOW_ATM_TEMP */
503    
504     C Now melt snow if there is residual heat left in surface level
505     C Note that units of YNEG and frWtrIce are m of ice
506     cph( very sensitive bit here by JZ
507     IF( RESID_HEAT(I,J) .GT. ZERO .AND.
508     & HSNOW(I,J,bi,bj) .GT. ZERO ) THEN
509     GHEFF(I,J) = MIN( HSNOW(I,J,bi,bj)/SDF/ICE2WATR,
510     & RESID_HEAT(I,J) )
511     YNEG(I,J,bi,bj) = YNEG(I,J,bi,bj) +GHEFF(I,J)
512     HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)-GHEFF(I,J)*SDF*ICE2WATR
513     frWtrIce(I,J) = frWtrIce(I,J) -GHEFF(I,J)
514     ENDIF
515     cph)
516    
517     #ifdef ALLOW_ATM_TEMP
518    
519     C NOW GET FRESH WATER FLUX
520     EmPmR(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*(
521     & ( EVAP(I,J,bi,bj)-PRECIP(I,J,bi,bj) )
522     & * ( ONE - AREA(I,J,2,bi,bj) )
523     #ifdef ALLOW_RUNOFF
524     & - RUNOFF(I,J,bi,bj)
525     #endif
526     & + frWtrIce(I,J)*ICE2WATR/SEAICE_deltaTtherm
527     & + saltWtrIce(I,J)*ICE2WATR/SEAICE_deltaTtherm
528     & )
529     #ifdef ALLOW_DIAGNOSTICS
530     frWtrAtm(I,J) = maskC(I,J,kSurface,bi,bj)*(
531     & PRECIP(I,J,bi,bj)
532     & - EVAP(I,J,bi,bj)
533     & *( ONE - AREA(I,J,2,bi,bj) )
534     & + RUNOFF(I,J,bi,bj)
535     & )
536     #endif
537    
538     C NOW GET SALT FLUX
539     saltFlux(I,J,bi,bj) = maskC(I,J,kSurface,bi,bj)*
540     & saltWtrIce(I,J)*ICE2WATR/SEAICE_deltaTtherm*
541     & rhoConstFresh*SEAICE_salinity
542    
543     #else /* ALLOW_ATM_TEMP */
544     STOP 'ABNORMAL END: S/R THSICE_GROWTH: ATM_TEMP undef'
545     #endif /* ALLOW_ATM_TEMP */
546    
547     C NOW GET TOTAL QNET AND QSW
548     QNET(I,J,bi,bj) = QNETI(I,J) * AREA(I,J,2,bi,bj)
549     & +QNETO(I,J) * (ONE-AREA(I,J,2,bi,bj))
550     QSW(I,J,bi,bj) = QSWI(I,J) * AREA(I,J,2,bi,bj)
551     & +QSWO(I,J) * (ONE-AREA(I,J,2,bi,bj))
552    
553     C Now convert YNEG back to deg K.
554     YNEG(I,J,bi,bj) = YNEG(I,J,bi,bj)*recip_dRf(kSurface) *
555     & recip_hFacC(i,j,kSurface,bi,bj)*72.0764 _d 0
556    
557     C Add YNEG contribution to QNET
558     QNET(I,J,bi,bj) = QNET(I,J,bi,bj)
559     & +YNEG(I,J,bi,bj)/SEAICE_deltaTtherm
560     & *maskC(I,J,kSurface,bi,bj)
561     & *HeatCapacity_Cp*recip_horiVertRatio*rhoConst
562     & *drF(kSurface)*hFacC(i,j,kSurface,bi,bj)
563    
564     ENDDO
565     ENDDO
566     #ifdef ALLOW_DIAGNOSTICS
567     IF ( useDiagnostics ) THEN
568     CALL DIAGNOSTICS_FILL(frWtrAtm,'SIatmFW ',0,1 ,2,bi,bj,myThid)
569     ENDIF
570     #endif /* ALLOW_DIAGNOSTICS */
571    
572     #ifdef SEAICE_DEBUG
573     c CALL PLOT_FIELD_XYRS( UWIND,'Current UWIND ', myIter, myThid )
574     c CALL PLOT_FIELD_XYRS( VWIND,'Current VWIND ', myIter, myThid )
575     CALL PLOT_FIELD_XYRS( GWATX,'Current GWATX ', myIter, myThid )
576     CALL PLOT_FIELD_XYRS( GWATY,'Current GWATY ', myIter, myThid )
577     CML CALL PLOT_FIELD_XYRL( FO,'Current FO ', myIter, myThid )
578     CML CALL PLOT_FIELD_XYRL( FHEFF,'Current FHEFF ', myIter, myThid )
579     CALL PLOT_FIELD_XYRL( QSW,'Current QSW ', myIter, myThid )
580     CALL PLOT_FIELD_XYRL( QNET,'Current QNET ', myIter, myThid )
581     CALL PLOT_FIELD_XYRL( EmPmR,'Current EmPmR ', myIter, myThid )
582     CML DO j=1-OLy,sNy+OLy
583     CML DO i=1-OLx,sNx+OLx
584     CML GHEFF(I,J)=SQRT(UICE(I,J,1,bi,bj)**2+VICE(I,J,1,bi,bj)**2)
585     CML GAREA(I,J)=HEFF(I,J,1,bi,bj)
586     CML print*,'I J QNET:',I, J, QNET(i,j,bi,bj), QSW(I,J,bi,bj)
587     CML ENDDO
588     CML ENDDO
589     CML CALL PLOT_FIELD_XYRL( GHEFF,'Current UICE ', myIter, myThid )
590     CML CALL PLOT_FIELD_XYRL( GAREA,'Current HEFF ', myIter, myThid )
591     DO j=1-OLy,sNy+OLy
592     DO i=1-OLx,sNx+OLx
593     if(HEFF(i,j,1,bi,bj).gt.1.) then
594     print '(A,2i4,3f10.2)','#### i j heff theta yneg',i,j,
595     & HEFF(i,j,1,bi,bj),theta(I,J,1,bi,bj),yneg(I,J,bi,bj)
596     print '(A,3f10.2)','QSW, QNET before/after correction',
597     & QSW(I,J,bi,bj),QNETI(I,J)*AREA(I,J,2,bi,bj)+
598     & (ONE-AREA(I,J,2,bi,bj))*QNETO(I,J), QNET(I,J,bi,bj)
599     endif
600     ENDDO
601     ENDDO
602     #endif /* SEAICE_DEBUG */
603    
604     crg Added by Ralf Giering: do we need DO_WE_NEED_THIS ?
605     #define DO_WE_NEED_THIS
606     C NOW ZERO OUTSIDE POINTS
607     #ifdef ALLOW_AUTODIFF_TAMC
608     CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
609     CADJ & key = iicekey, byte = isbyte
610     CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj,
611     CADJ & key = iicekey, byte = isbyte
612     #endif /* ALLOW_AUTODIFF_TAMC */
613     DO J=1,sNy
614     DO I=1,sNx
615     C NOW SET AREA(I,J,1,bi,bj)=0 WHERE NO ICE IS
616     AREA(I,J,1,bi,bj)=MIN(AREA(I,J,1,bi,bj)
617     & ,HEFF(I,J,1,bi,bj)/.0001 _d 0)
618     ENDDO
619     ENDDO
620     #ifdef ALLOW_AUTODIFF_TAMC
621     CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
622     CADJ & key = iicekey, byte = isbyte
623     #endif /* ALLOW_AUTODIFF_TAMC */
624     DO J=1,sNy
625     DO I=1,sNx
626     C NOW TRUNCATE AREA
627     #ifdef DO_WE_NEED_THIS
628     AREA(I,J,1,bi,bj)=MIN(ONE,AREA(I,J,1,bi,bj))
629     ENDDO
630     ENDDO
631     #ifdef ALLOW_AUTODIFF_TAMC
632     CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
633     CADJ & key = iicekey, byte = isbyte
634     CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
635     CADJ & key = iicekey, byte = isbyte
636     #endif /* ALLOW_AUTODIFF_TAMC */
637     DO J=1,sNy
638     DO I=1,sNx
639     AREA(I,J,1,bi,bj) = MAX(ZERO,AREA(I,J,1,bi,bj))
640     HSNOW(I,J,bi,bj) = MAX(ZERO,HSNOW(I,J,bi,bj))
641     #endif /* DO_WE_NEED_THIS */
642     AREA(I,J,1,bi,bj) = AREA(I,J,1,bi,bj)*HEFFM(I,J,bi,bj)
643     HEFF(I,J,1,bi,bj) = HEFF(I,J,1,bi,bj)*HEFFM(I,J,bi,bj)
644     #ifdef DO_WE_NEED_THIS
645     HEFF(I,J,1,bi,bj)=MIN(MAX_HEFF,HEFF(I,J,1,bi,bj))
646     #endif
647     HSNOW(I,J,bi,bj) = HSNOW(I,J,bi,bj)*HEFFM(I,J,bi,bj)
648     ENDDO
649     ENDDO
650    
651     #ifdef ALLOW_SEAICE_FLOODING
652     IF ( SEAICEuseFlooding ) THEN
653     C convert snow to ice if submerged
654     C for time being, sea ice salinity is assumed constant, that is,
655     C contribution of snow flooding to freshening of sea ice is neglected
656     DO J=1,sNy
657     DO I=1,sNx
658     hDraft = (HSNOW(I,J,bi,bj)*330. _d 0
659     & +HEFF(I,J,1,bi,bj)*SEAICE_rhoIce)/1000. _d 0
660     hFlood = hDraft - MIN(hDraft,HEFF(I,J,1,bi,bj))
661     HEFF(I,J,1,bi,bj) = HEFF(I,J,1,bi,bj) + hFlood
662     HSNOW(I,J,bi,bj) = MAX(0. _d 0,
663     & HSNOW(I,J,bi,bj)-hFlood*ICE2SNOW)
664     ENDDO
665     ENDDO
666     ENDIF
667     #endif /* ALLOW_SEAICE_FLOODING */
668    
669     IF ( useRealFreshWaterFlux ) THEN
670     DO J=1,sNy
671     DO I=1,sNx
672     sIceLoad(i,j,bi,bj) = HEFF(I,J,1,bi,bj)*SEAICE_rhoIce
673     & + HSNOW(I,J,bi,bj)* 330. _d 0
674     ENDDO
675     ENDDO
676     ENDIF
677    
678     ENDDO
679     ENDDO
680    
681     RETURN
682     END

  ViewVC Help
Powered by ViewVC 1.1.22