/[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.1 - (hide annotations) (download)
Thu Dec 14 08:36:20 2006 UTC (17 years, 4 months ago) by mlosch
Branch: MAIN
 overhaul of thermodynamics
- growth.F and groatb.F are replaced by new routine seaice_growth.F
- budget.F is replaced by two new routines seaice_budget_ocean/ice.F
- move a few global fields out of SEAICE.h into seaice_growth.F and
  make them 2D (FICE/QNETO/ ...)
- remove FO (it is the same as QNETO)
- introduce a few local fields to avoid modifying external fields such
  as atemp, etc.

  lab_sea does not change, but hopefully it will be easier for Patrick
  do the adjoint

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

  ViewVC Help
Powered by ViewVC 1.1.22