/[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.2 - (hide annotations) (download)
Thu Dec 14 22:31:18 2006 UTC (17 years, 4 months ago) by heimbach
Branch: MAIN
Changes since 1.1: +39 -18 lines
Updating seaice adjoint, step 1 (everything, except SEAICE_EVP).

1 heimbach 1.2 C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_growth.F,v 1.1 2006/12/14 08:36:20 mlosch Exp $
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     _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 heimbach 1.2 #ifdef ALLOW_AUTODIFF_TAMC
122     CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
123     CADJ & key = iicekey, byte = isbyte
124     CADJ STORE qnet(:,:,bi,bj) = comlev1_bibj,
125     CADJ & key = iicekey, byte = isbyte
126     CADJ STORE qsw(:,:,bi,bj) = comlev1_bibj,
127     CADJ & key = iicekey, byte = isbyte
128     #endif /* ALLOW_AUTODIFF_TAMC */
129 mlosch 1.1 DO J=1,sNy
130     DO I=1,sNx
131     AREA(I,J,3,bi,bj) = MAX(A22,AREA(I,J,2,bi,bj))
132     FHEFF(I,J) = 0.0 _d 0
133     FICE (I,J) = 0.0 _d 0
134     #ifdef SEAICE_MULTILEVEL
135     FICEP(I,J) = 0.0 _d 0
136     #endif
137     FHEFF(I,J) = 0.0 _d 0
138     FICE (I,J) = 0.0 _d 0
139     QNETO(I,J) = 0.0 _d 0
140     QNETI(I,J) = 0.0 _d 0
141     QSWO (I,J) = 0.0 _d 0
142     QSWI (I,J) = 0.0 _d 0
143     HCORR(I,J) = 0.0 _d 0
144     SEAICE_SALT(I,J) = 0.0 _d 0
145     RESID_HEAT (I,J) = 0.0 _d 0
146     ENDDO
147     ENDDO
148     #ifdef ALLOW_AUTODIFF_TAMC
149     CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
150     CADJ & key = iicekey, byte = isbyte
151 heimbach 1.2 CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj,
152     CADJ & key = iicekey, byte = isbyte
153     CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
154     CADJ & key = iicekey, byte = isbyte
155 mlosch 1.1 #endif /* ALLOW_AUTODIFF_TAMC */
156 heimbach 1.2 DO J=1,sNy
157     DO I=1,sNx
158     cph need to adjoint-store AREA again before using it in further init.
159     cph (all these initialisations involving AREA are nasty "non-linear")
160     HICE(I,J) = HEFF(I,J,2,bi,bj)/AREA(I,J,3,bi,bj)
161     hSnwLoc(I,J) = HSNOW(I,J,bi,bj)/AREA(I,J,3,bi,bj)
162     ENDDO
163     ENDDO
164 mlosch 1.1
165     C NOW DETERMINE MIXED LAYER TEMPERATURE
166     DO J=1,sNy
167     DO I=1,sNx
168     TMIX(I,J,bi,bj)=theta(I,J,kSurface,bi,bj)+273.16 _d +00
169     #ifdef SEAICE_DEBUG
170     TMIX(I,J,bi,bj)=MAX(TMIX(I,J,bi,bj),271.2 _d +00)
171     #endif
172     ENDDO
173     ENDDO
174    
175     C THERMAL WIND OF ATMOSPHERE
176     DO J=1,sNy
177     DO I=1,sNx
178     CML#ifdef SEAICE_EXTERNAL_FORCING
179     CMLC this seems to be more natural as we do compute the wind speed in
180     CMLC pkg/exf/exf_wind.F, but it changes the results
181     CML UG(I,J) = MAX(SEAICE_EPS,wspeed(I,J,bi,bj))
182     CML#else
183     SPEED_SQ = UWIND(I,J,bi,bj)**2 + VWIND(I,J,bi,bj)**2
184     IF ( SPEED_SQ .LE. SEAICE_EPS_SQ ) THEN
185     UG(I,J)=SEAICE_EPS
186     ELSE
187     UG(I,J)=SQRT(SPEED_SQ)
188     ENDIF
189     CML#endif /* SEAICE_EXTERNAL_FORCING */
190     ENDDO
191     ENDDO
192    
193     #ifdef ALLOW_AUTODIFF_TAMC
194     CADJ STORE theta(:,:,:,bi,bj)= comlev1_bibj,
195     CADJ & key = iicekey, byte = isbyte
196     CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj,
197     CADJ & key = iicekey, byte = isbyte
198     #endif /* ALLOW_AUTODIFF_TAMC */
199     DO J=1,sNy
200     DO I=1,sNx
201     C-- Create or melt sea-ice so that first-level oceanic temperature
202     C is approximately at the freezing point when there is sea-ice.
203     C Initially the units of YNEG are m of sea-ice.
204     C The factor dRf(1)/72.0764, used to convert temperature
205     C change in deg K to m of sea-ice, is approximately:
206     C dRf(1) * (sea water heat capacity = 3996 J/kg/K)
207     C * (density of sea-water = 1026 kg/m^3)
208     C / (latent heat of fusion of sea-ice = 334000 J/kg)
209     C / (density of sea-ice = 910 kg/m^3)
210     C Negative YNEG leads to ice growth.
211     C Positive YNEG leads to ice melting.
212     if ( .NOT. inAdMode ) then
213     #ifdef SEAICE_VARIABLE_FREEZING_POINT
214     TBC = -0.0575 _d 0*salt(I,J,kSurface,bi,bj) + 0.0901 _d 0
215     #endif /* SEAICE_VARIABLE_FREEZING_POINT */
216     YNEG(I,J,bi,bj)=(theta(I,J,kSurface,bi,bj)-TBC)
217     & *dRf(1)/72.0764 _d 0
218     else
219     YNEG(I,J,bi,bj)= 0.
220     endif
221     GHEFF(I,J)=HEFF(I,J,1,bi,bj)
222     C Melt (YNEG>0) or create (YNEG<0) sea ice
223     HEFF(I,J,1,bi,bj)=MAX(ZERO,HEFF(I,J,1,bi,bj)-YNEG(I,J,bi,bj))
224     RESID_HEAT(I,J) =YNEG(I,J,bi,bj)
225     YNEG(I,J,bi,bj) =GHEFF(I,J)-HEFF(I,J,1,bi,bj)
226     SEAICE_SALT(I,J) =SEAICE_SALT(I,J)-YNEG(I,J,bi,bj)
227     RESID_HEAT(I,J) =RESID_HEAT(I,J)-YNEG(I,J,bi,bj)
228     C YNEG now contains m of ice melted (>0) or created (<0)
229     C SEAICE_SALT contains m of ice melted (<0) or created (>0)
230     C RESID_HEAT is residual heat above freezing in equivalent m of ice
231     ENDDO
232     ENDDO
233    
234     #ifdef ALLOW_AUTODIFF_TAMC
235 heimbach 1.2 cphCADJ STORE heff = comlev1, key = ikey_dynamics
236     cphCADJ STORE hsnow = comlev1, key = ikey_dynamics
237     cphCADJ STORE uwind = comlev1, key = ikey_dynamics
238     cphCADJ STORE vwind = comlev1, key = ikey_dynamics
239     c
240 mlosch 1.1 CADJ STORE tice = comlev1, key = ikey_dynamics
241     # ifdef SEAICE_MULTILEVEL
242     CADJ STORE tices = comlev1, key = ikey_dynamics
243     # endif
244     #endif /* ALLOW_AUTODIFF_TAMC */
245    
246     C GROWTH SUBROUTINE CALCULATES TOTAL GROWTH TENDENCIES,
247     C INCLUDING SNOWFALL
248     CML beginning of groatb code
249    
250     C NOW DETERMINE GROWTH RATES
251     C FIRST DO OPEN WATER
252     CALL SEAICE_BUDGET_OCEAN(
253     I UG,
254     U TMIX,
255     O QNETO, QSWO,
256     I bi, bj)
257    
258     C NOW DO ICE
259     #ifdef SEAICE_MULTILEVEL
260     C-- Start loop over muli-levels
261     DO IT=1,MULTDIM
262     #ifdef ALLOW_AUTODIFF_TAMC
263     ilockey = (iicekey-1)*MULTDIM + IT
264     CADJ STORE tices(:,:,it,bi,bj) = comlev1_multdim,
265     CADJ & key = ilockey, byte = isbyte
266     #endif /* ALLOW_AUTODIFF_TAMC */
267     DO J=1,sNy
268     DO I=1,sNx
269     RK=IT*1.0
270     HICEP(I,J)=(HICE(I,J)/7.0 _d 0)*((2.0 _d 0*RK)-1.0 _d 0)
271     TICE(I,J,bi,bj)=TICES(I,J,IT,bi,bj)
272     ENDDO
273     ENDDO
274     CALL SEAICE_BUDGET_ICE(
275     I UG, HICE, hSnwLoc,
276     U TICE,
277     O FICE, QSWI,
278     I bi, bj)
279     DO J=1,sNy
280     DO I=1,sNx
281     FICEP(I,J)=(FICE(I,J)/7.0 _d 0)+FICEP(I,J)
282     TICES(I,J,IT,bi,bj)=TICE(I,J,bi,bj)
283     ENDDO
284     ENDDO
285     ENDDO
286     C-- End loop over muli-levels
287     DO J=1,sNy
288     DO I=1,sNx
289     FICE(I,J)=FICEP(I,J)
290     ENDDO
291     ENDDO
292     #else /* SEAICE_MULTILEVEL */
293     CALL SEAICE_BUDGET_ICE(
294     I UG, HICE, hSnwLoc,
295     U TICE,
296     O FICE, QSWI,
297     I bi, bj)
298     #endif /* SEAICE_MULTILEVEL */
299     CML end of groatb code
300    
301     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     C NOW CALCULATE CORRECTED GROWTH
321     GHEFF(I,J)=-SEAICE_deltaTtherm*FICE(I,J)
322     & *AREA(I,J,2,bi,bj) ! effective growth in J/m^2 (>0=melt)
323     ENDDO
324     ENDDO
325 heimbach 1.2
326 mlosch 1.1 #ifdef ALLOW_AUTODIFF_TAMC
327     CADJ STORE fice(:,:) = comlev1_bibj,
328 heimbach 1.2 CADJ & key = iicekey, byte = isbyte
329 mlosch 1.1 #endif /* ALLOW_AUTODIFF_TAMC */
330    
331     DO J=1,sNy
332     DO I=1,sNx
333     IF(FICE(I,J).LT.ZERO.AND.AREA(I,J,2,bi,bj).GT.ZERO) THEN
334     C use FICE to melt snow and CALCULATE CORRECTED GROWTH
335     GAREA(I,J)=HSNOW(I,J,bi,bj)*QS ! effective snow thickness in J/m^2
336     IF(GHEFF(I,J).LE.GAREA(I,J)) THEN
337     C not enough heat to melt all snow; use up all heat flux FICE
338     HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)-GHEFF(I,J)/QS
339     C SNOW CONVERTED INTO WATER AND THEN INTO equivalent m of ICE melt
340     C The factor 1/SDF/ICE_DENS converts m of snow to m of sea-ice
341     SEAICE_SALT(I,J)=SEAICE_SALT(I,J)
342     & -GHEFF(I,J)/QS/SDF/ICE_DENS
343     FICE(I,J)=ZERO
344     ELSE
345     C enought heat to melt snow completely;
346     C compute remaining heat flux that will melt ice
347     FICE(I,J)=-(GHEFF(I,J)-GAREA(I,J))/
348     & SEAICE_deltaTtherm/AREA(I,J,2,bi,bj)
349     C convert all snow to melt water (fresh water flux)
350     SEAICE_SALT(I,J)=SEAICE_SALT(I,J)
351     & -HSNOW(I,J,bi,bj)/SDF/ICE_DENS
352     HSNOW(I,J,bi,bj)=0.0
353     END IF
354     END IF
355 heimbach 1.2 ENDDO
356     ENDDO
357 mlosch 1.1
358 heimbach 1.2 #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 mlosch 1.1 C NOW GET TOTAL GROWTH RATE in W/m^2, >0 causes ice growth
366     FHEFF(I,J)= FICE(I,J) * AREA(I,J,2,bi,bj)
367     & + QNETO(I,J) * (ONE-AREA(I,J,2,bi,bj))
368     ENDDO
369     ENDDO
370     cph(
371     #ifdef ALLOW_AUTODIFF_TAMC
372     CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj,
373     CADJ & key = iicekey, byte = isbyte
374     CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
375     CADJ & key = iicekey, byte = isbyte
376     CADJ STORE fice(:,:) = comlev1_bibj,
377     CADJ & key = iicekey, byte = isbyte
378     CADJ STORE fheff(:,:) = comlev1_bibj,
379     CADJ & key = iicekey, byte = isbyte
380     CADJ STORE qneto(:,:) = comlev1_bibj,
381     CADJ & key = iicekey, byte = isbyte
382     CADJ STORE qswi(:,:) = comlev1_bibj,
383     CADJ & key = iicekey, byte = isbyte
384     CADJ STORE qswo(:,:) = comlev1_bibj,
385     CADJ & key = iicekey, byte = isbyte
386     #endif /* ALLOW_AUTODIFF_TAMC */
387     cph)
388     DO J=1,sNy
389     DO I=1,sNx
390     C NOW UPDATE AREA
391     GHEFF(I,J)=-SEAICE_deltaTtherm*FHEFF(I,J)*Q0
392     GAREA(I,J)=SEAICE_deltaTtherm*QNETO(I,J)*Q0
393     GHEFF(I,J)=-ONE*MIN(HEFF(I,J,1,bi,bj),GHEFF(I,J))
394     GAREA(I,J)=MAX(ZERO,GAREA(I,J))
395     HCORR(I,J)=MIN(ZERO,GHEFF(I,J))
396     ENDDO
397     ENDDO
398     #ifdef ALLOW_AUTODIFF_TAMC
399     CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
400     CADJ & key = iicekey, byte = isbyte
401     #endif
402     DO J=1,sNy
403     DO I=1,sNx
404     GAREA(I,J)=(ONE-AREA(I,J,2,bi,bj))*GAREA(I,J)/HO
405     & +HALF*HCORR(I,J)*AREA(I,J,2,bi,bj)
406     & /(HEFF(I,J,1,bi,bj)+.00001 _d 0)
407     AREA(I,J,1,bi,bj)=AREA(I,J,1,bi,bj)+GAREA(I,J)
408     ENDDO
409     ENDDO
410     #ifdef ALLOW_AUTODIFF_TAMC
411     CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
412     CADJ & key = iicekey, byte = isbyte
413     #endif
414     DO J=1,sNy
415     DO I=1,sNx
416    
417     C NOW UPDATE HEFF
418     GHEFF(I,J)=-SEAICE_deltaTtherm*
419     & FICE(I,J)*Q0*AREA(I,J,2,bi,bj)
420     GHEFF(I,J)=-ONE*MIN(HEFF(I,J,1,bi,bj),GHEFF(I,J))
421     HEFF(I,J,1,bi,bj)=HEFF(I,J,1,bi,bj)+GHEFF(I,J)
422     SEAICE_SALT(I,J)=SEAICE_SALT(I,J)+GHEFF(I,J)
423    
424     C NOW CALCULATE QNETI UNDER ICE IF ANY
425     QNETI(I,J)=(GHEFF(I,J)-SEAICE_deltaTtherm*
426     & FICE(I,J)*Q0*AREA(I,J,2,bi,bj))/Q0/SEAICE_deltaTtherm
427    
428     C NOW UPDATE OTHER THINGS
429    
430     IF(FICE(I,J).GT.ZERO) THEN
431     C FREEZING, PRECIP ADDED AS SNOW
432     HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)+SEAICE_deltaTtherm*
433     & PRECIP(I,J,bi,bj)*AREA(I,J,2,bi,bj)*SDF
434     ELSE
435     C ADD PRECIP AS RAIN, WATER CONVERTED INTO equivalent m of ICE BY 1/ICE_DENS
436     SEAICE_SALT(I,J)=SEAICE_SALT(I,J)
437     & -PRECIP(I,J,bi,bj)*AREA(I,J,2,bi,bj)*
438     & SEAICE_deltaTtherm/ICE_DENS
439     ENDIF
440    
441     C Now add in precip over open water directly into ocean as negative salt
442     SEAICE_SALT(I,J)=SEAICE_SALT(I,J)
443     & -PRECIP(I,J,bi,bj)*(ONE-AREA(I,J,2,bi,bj))
444     & *SEAICE_deltaTtherm/ICE_DENS
445    
446     C Now melt snow if there is residual heat left in surface level
447     C Note that units of YNEG and SEAICE_SALT are m of ice
448     IF(RESID_HEAT(I,J).GT.ZERO.AND.
449     & HSNOW(I,J,bi,bj).GT.ZERO) THEN
450     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     ENDIF
456    
457     C NOW GET FRESH WATER FLUX
458     EmPmR(I,J,bi,bj)= maskC(I,J,kSurface,bi,bj)*(
459     & EVAP(I,J,bi,bj)*(ONE-AREA(I,J,2,bi,bj))
460     & -RUNOFF(I,J,bi,bj)
461     & +SEAICE_SALT(I,J)*ICE_DENS/SEAICE_deltaTtherm
462     & )
463    
464     C NOW GET TOTAL QNET AND QSW
465     QNET(I,J,bi,bj)=QNETI(I,J) *AREA(I,J,2,bi,bj)
466     & +QNETO(I,J) *(ONE-AREA(I,J,2,bi,bj))
467     QSW(I,J,bi,bj) =QSWI(I,J) *AREA(I,J,2,bi,bj)
468     & +QSWO(I,J) *(ONE-AREA(I,J,2,bi,bj))
469     c #ifndef SHORTWAVE_HEATING
470     c QNET(I,J,bi,bj)=QNET(I,J,bi,bj)+QSW(I,J,bi,bj)
471     c #endif
472    
473     C Now convert YNEG back to deg K.
474     YNEG(I,J,bi,bj)=YNEG(I,J,bi,bj)*recip_dRf(1)*72.0764 _d 0
475    
476     C Add YNEG contribution to QNET
477     QNET(I,J,bi,bj)=QNET(I,J,bi,bj)
478     & +YNEG(I,J,bi,bj)/SEAICE_deltaTtherm
479     & *maskC(I,J,kSurface,bi,bj)
480     & *HeatCapacity_Cp*recip_horiVertRatio*rhoConst
481     & *drF(kSurface)*hFacC(i,j,kSurface,bi,bj)
482    
483     ENDDO
484     ENDDO
485    
486     #ifdef SEAICE_DEBUG
487     c CALL PLOT_FIELD_XYRS( UWIND,'Current UWIND ', myIter, myThid )
488     c CALL PLOT_FIELD_XYRS( VWIND,'Current VWIND ', myIter, myThid )
489     CALL PLOT_FIELD_XYRS( GWATX,'Current GWATX ', myIter, myThid )
490     CALL PLOT_FIELD_XYRS( GWATY,'Current GWATY ', myIter, myThid )
491     CML CALL PLOT_FIELD_XYRL( FO,'Current FO ', myIter, myThid )
492     CML CALL PLOT_FIELD_XYRL( FHEFF,'Current FHEFF ', myIter, myThid )
493     CALL PLOT_FIELD_XYRL( QSW,'Current QSW ', myIter, myThid )
494     CALL PLOT_FIELD_XYRL( QNET,'Current QNET ', myIter, myThid )
495     CALL PLOT_FIELD_XYRL( EmPmR,'Current EmPmR ', myIter, myThid )
496     DO j=1-OLy,sNy+OLy
497     DO i=1-OLx,sNx+OLx
498     GHEFF(I,J)=SQRT(UICE(I,J,1,bi,bj)**2+VICE(I,J,1,bi,bj)**2)
499     GAREA(I,J)=HEFF(I,J,1,bi,bj)
500     print*,'I J QNET:',I, J, QNET(i,j,bi,bj), QSW(I,J,bi,bj)
501     ENDDO
502     ENDDO
503     CALL PLOT_FIELD_XYRL( GHEFF,'Current UICE ', myIter, myThid )
504     CALL PLOT_FIELD_XYRL( GAREA,'Current HEFF ', myIter, myThid )
505     DO j=1-OLy,sNy+OLy
506     DO i=1-OLx,sNx+OLx
507     if(HEFF(i,j,1,bi,bj).gt.1.) then
508     print '(A,2i4,3f10.2)','#### i j heff theta yneg',i,j,
509     & HEFF(i,j,1,bi,bj),theta(I,J,1,bi,bj),yneg(I,J,bi,bj)
510     print '(A,3f10.2)','QSW, QNET before/after correction',
511     & QSW(I,J,bi,bj),QNETI(I,J)*AREA(I,J,2,bi,bj)+
512     & (ONE-AREA(I,J,2,bi,bj))*QNETO(I,J), QNET(I,J,bi,bj)
513     endif
514     ENDDO
515     ENDDO
516     #endif /* SEAICE_DEBUG */
517    
518     crg Added by Ralf Giering: do we need DO_WE_NEED_THIS ?
519     #define DO_WE_NEED_THIS
520     C NOW ZERO OUTSIDE POINTS
521     #ifdef ALLOW_AUTODIFF_TAMC
522     CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
523     CADJ & key = iicekey, byte = isbyte
524     CADJ STORE heff(:,:,:,bi,bj) = comlev1_bibj,
525     CADJ & key = iicekey, byte = isbyte
526     #endif /* ALLOW_AUTODIFF_TAMC */
527     DO J=1,sNy
528     DO I=1,sNx
529     C NOW SET AREA(I,J,1,bi,bj)=0 WHERE NO ICE IS
530     AREA(I,J,1,bi,bj)=MIN(AREA(I,J,1,bi,bj)
531     & ,HEFF(I,J,1,bi,bj)/.0001 _d 0)
532     ENDDO
533     ENDDO
534     #ifdef ALLOW_AUTODIFF_TAMC
535     CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
536     CADJ & key = iicekey, byte = isbyte
537     #endif /* ALLOW_AUTODIFF_TAMC */
538     DO J=1,sNy
539     DO I=1,sNx
540     C NOW TRUNCATE AREA
541     #ifdef DO_WE_NEED_THIS
542     AREA(I,J,1,bi,bj)=MIN(ONE,AREA(I,J,1,bi,bj))
543     ENDDO
544     ENDDO
545     #ifdef ALLOW_AUTODIFF_TAMC
546     CADJ STORE area(:,:,:,bi,bj) = comlev1_bibj,
547     CADJ & key = iicekey, byte = isbyte
548     CADJ STORE hsnow(:,:,bi,bj) = comlev1_bibj,
549     CADJ & key = iicekey, byte = isbyte
550     #endif /* ALLOW_AUTODIFF_TAMC */
551     DO J=1,sNy
552     DO I=1,sNx
553     AREA(I,J,1,bi,bj)=MAX(ZERO,AREA(I,J,1,bi,bj))
554     HSNOW(I,J,bi,bj)=MAX(ZERO,HSNOW(I,J,bi,bj))
555     #endif
556     AREA(I,J,1,bi,bj)=AREA(I,J,1,bi,bj)*HEFFM(I,J,bi,bj)
557     HEFF(I,J,1,bi,bj)=HEFF(I,J,1,bi,bj)*HEFFM(I,J,bi,bj)
558     #ifdef DO_WE_NEED_THIS
559     c HEFF(I,J,1,bi,bj)=MIN(MAX_HEFF,HEFF(I,J,1,bi,bj))
560     #endif
561     HSNOW(I,J,bi,bj)=HSNOW(I,J,bi,bj)*HEFFM(I,J,bi,bj)
562     ENDDO
563     ENDDO
564    
565     #ifdef ALLOW_SEAICE_FLOODING
566     IF ( SEAICEuseFlooding ) THEN
567     C convert snow to ice if submerged
568     DO J=1,sNy
569     DO I=1,sNx
570     hDraft = (HSNOW(I,J,bi,bj)*330. _d 0
571     & +HEFF(I,J,1,bi,bj)*SEAICE_rhoIce)/1000. _d 0
572     hFlood = hDraft - MIN(hDraft,HEFF(I,J,1,bi,bj))
573     HEFF(I,J,1,bi,bj) = HEFF(I,J,1,bi,bj) + hFlood
574     HSNOW(I,J,bi,bj) = MAX(0. _d 0,HSNOW(I,J,bi,bj)-hFlood/SDF)
575     ENDDO
576     ENDDO
577     ENDIF
578     #endif /* ALLOW_SEAICE_FLOODING */
579    
580     #ifdef ATMOSPHERIC_LOADING
581     IF ( useRealFreshWaterFlux ) THEN
582     DO J=1,sNy
583     DO I=1,sNx
584     sIceLoad(i,j,bi,bj) = HEFF(I,J,1,bi,bj)*SEAICE_rhoIce
585     & + HSNOW(I,J,bi,bj)* 330. _d 0
586     ENDDO
587     ENDDO
588     ENDIF
589     #endif
590    
591     ENDDO
592     ENDDO
593    
594     RETURN
595     END

  ViewVC Help
Powered by ViewVC 1.1.22