/[MITgcm]/MITgcm_contrib/ifenty/seaiceAdjointCode/seaice_budget_ice.F
ViewVC logotype

Annotation of /MITgcm_contrib/ifenty/seaiceAdjointCode/seaice_budget_ice.F

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


Revision 1.1 - (hide annotations) (download)
Fri Jun 29 18:54:03 2007 UTC (18 years, 1 month ago) by gforget
Branch: MAIN
CVS Tags: HEAD
Ian Fenty sea-ice growth routines (adjointable, in developement)

1 gforget 1.1 C $Header: /u/gcmpack/MITgcm/pkg/seaice/seaice_budget_ice.F,v 1.3 2006/12/19 18:57:09 dimitri Exp $
2     C $Name: $
3    
4     #include "SEAICE_OPTIONS.h"
5    
6     CStartOfInterface
7     SUBROUTINE SEAICE_BUDGET_ICE(
8     I UG, HICE_ACTUAL, HSNOW_ACTUAL,
9     U TSURF,
10     O F_io_net,F_ia_net,F_ia, IcePenetratingShortwaveFlux,
11     I bi, bj )
12     C /================================================================\
13     C | SUBROUTINE seaice_budget_ice |
14     C | o Calculate ice growth rate, surface fluxes and temperature of |
15     C | ice surface. |
16     C | see Hibler, MWR, 108, 1943-1973, 1980 |
17     C |================================================================|
18     C \================================================================/
19     IMPLICIT NONE
20    
21     C === Global variables ===
22     #include "SIZE.h"
23     #include "EEPARAMS.h"
24     #include "FFIELDS.h"
25     #include "SEAICE_PARAMS.h"
26     #include "SEAICE_FFIELDS.h"
27     #ifdef SEAICE_VARIABLE_FREEZING_POINT
28     #include "DYNVARS.h"
29     #endif /* SEAICE_VARIABLE_FREEZING_POINT */
30    
31     C === Routine arguments ===
32     C INPUT:
33     C UG :: thermal wind of atmosphere
34     C TSURF :: surface temperature of ice in Kelvin, updated
35     C HICE_ACTUAL :: (actual) ice thickness with upper and lower limit
36     C HSNOW_ACTUAL :: actual snow thickness
37     C bi,bj :: loop indices
38     C OUTPUT:
39     C netHeatFlux :: net heat flux under ice = growth rate
40     C IcePenetratingShortwaveFlux :: short wave heat flux under ice
41     _RL UG (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
42     _RL TSURF (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
43     _RL HICE_ACTUAL (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
44     _RL HSNOW_ACTUAL (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
45    
46     _RL F_ia (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
47     _RL F_io_net (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
48     _RL F_ia_net (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
49    
50     _RL F_swi (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
51     _RL F_lwd (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
52     _RL F_lwu (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
53     _RL F_lh (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
54     _RL F_sens (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
55     _RL F_c (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
56     _RL qhice_mm (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
57    
58     _RL IcePenetratingShortwaveFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
59     _RL AbsorbedShortwaveFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
60     _RL IcePenetratingShortwaveFluxFraction
61     & (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
62    
63     INTEGER bi, bj
64     INTEGER KOPEN
65    
66     C === Local variables ===
67     C i,j - Loop counters
68     INTEGER i, j
69     INTEGER ITER
70     _RL QS1, C1, C2, C3, C4, C5, TB, D1, D1I, D3,IAN1
71     _RL TMELT, TMELTP, XKI, XKS, HCUT, ASNOW, XIO
72     C effective conductivity of combined ice and snow
73     _RL effConduct
74     C specific humidity at ice surface
75     _RL mm_pi,mm_log10pi,dqhice_dTice
76    
77     C powers of temperature
78     _RL t1, t2, t3, t4
79    
80     C local copies of global variables
81     _RL tsurfLoc (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
82     _RL atempLoc (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
83     _RL lwdownLoc (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
84     _RL ALB (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
85     _RL tsurfLocOld
86    
87     c Ian Saturation Vapor Pressure
88     _RL aa1,aa2,bb1,bb2,Ppascals,cc0,cc1,cc2,cc3t,dFiDTs1
89    
90     aa1 = 2663.5
91     aa2 = 12.537
92     bb1 = 0.622
93     bb2 = 1.0 - bb1
94     Ppascals = 1000.*100.
95     cc0 = 10**aa2
96     cc1 = cc0*aa1*bb1*Ppascals*log(10.0)
97     cc2 = cc0*bb2
98    
99     C FREEZING TEMPERATURE OF SEAWATER
100     TB=273.15 _d + 00 - 1.96 _d + 00
101     C SENSIBLE HEAT CONSTANT
102     D1=SEAICE_sensHeat
103     C ICE LATENT HEAT CONSTANT
104     D1I=SEAICE_latentIce
105     C STEFAN BOLTZMAN CONSTANT TIMES 0.97 EMISSIVITY
106     D3=SEAICE_emissivity
107     C MELTING TEMPERATURE OF ICE
108     TMELT=273.15 _d +00
109    
110     C ICE CONDUCTIVITY
111     XKI=2.0340
112     C SNOW CONDUCTIVITY
113     XKS=SEAICE_snowConduct
114     C CUTOFF SNOW THICKNESS
115     HCUT=SEAICE_snowThick
116     C PENETRATION SHORTWAVE RADIATION FACTOR
117     XIO=SEAICE_shortwave
118    
119     DO J=1,sNy
120     DO I=1,sNx
121     IcePenetratingShortwaveFlux (I,J) = 0. _d 0
122     IcePenetratingShortwaveFluxFraction (I,J) = 0. _d 0
123     AbsorbedShortwaveFlux (I,J) = 0. _d 0
124    
125     qhice_mm (I,J) = 0.0 _d 0
126     F_ia (I,J) = 0.0 _d 0
127     F_io_net (I,J) = 0.0 _d 0
128     F_ia_net (I,J) = 0.0 _d 0
129    
130     F_swi (I,J) = 0.0 _d 0
131     F_lwd (I,J) = 0.0 _d 0
132     F_lwu (I,J) = 0.0 _d 0
133     F_lh (I,J) = 0.0 _d 0
134     F_sens (I,J) = 0.0 _d 0
135    
136     c set the surface temperature to zero if there is no ice there.
137     IF (HICE_ACTUAL(I,J) .NE. 0.0) THEN
138     tsurfLoc (I,J) = MIN(TMELT, TSURF(I,J,bi,bj))
139     ELSE
140     tsurfLoc(I,J) = TMELT
141     ENDIF
142    
143     TSURF(I,J,bi,bj) = tsurfLoc(I,J)
144    
145     atempLoc (I,J) = MAX(TMELT + MIN_ATEMP,ATEMP(I,J,bi,bj))
146     lwdownLoc(I,J) = LWDOWN(I,J,bi,bj)
147    
148     ENDDO
149     ENDDO
150    
151     C COME HERE AT START OF ITERATION
152    
153     DO J=1,sNy
154     DO I=1,sNx
155    
156     IF (HICE_ACTUAL(I,J) .NE. 0.0) THEN
157    
158     C DECIDE ON ALBEDO
159     IF (tsurfLoc(I,J) .GE. TMELT) THEN
160     IF (HSNOW_ACTUAL(I,J) .EQ. 0.0) THEN
161     ALB(I,J) = SEAICE_wetIceAlb
162     ELSE ! some snow
163     ALB(I,J) = SEAICE_wetSnowAlb
164     ENDIF
165     ELSE ! no surface melting
166     IF (HSNOW_ACTUAL(I,J) .EQ. 0.0) THEN
167     ALB(I,J) = SEAICE_dryIceAlb
168     ELSE ! some snow
169     ALB(I,J) = SEAICE_drySnowAlb
170     ENDIF
171     ENDIF
172    
173     F_lwd(I,J) = - 0.97 _d 0 * lwdownLoc(I,J)
174    
175     IF (HSNOW_ACTUAL(I,J) .GT. 0.0) THEN
176     IcePenetratingShortwaveFluxFraction(I,J) = ZERO
177     ELSE
178     IcePenetratingShortwaveFluxFraction(I,J) =
179     & XIO*EXP(-1.5 _d 0 * HICE_ACTUAL(I,J))
180     ENDIF
181    
182     AbsorbedShortwaveFlux(I,J) = -(ONE - ALB(I,J))*
183     & (1.0 - IcePenetratingShortwaveFluxFraction(I,J))
184     & *SWDOWN(I,J,bi,bj)
185    
186     IcePenetratingShortwaveFlux(I,J) = -(ONE - ALB(I,J))*
187     & IcePenetratingShortwaveFluxFraction(I,J)
188     & *SWDOWN(I,J,bi,bj)
189    
190     F_swi(I,J) = AbsorbedShortwaveFlux(I,J)
191    
192     c set a min ice as 5 cm to limit arbitrarily large conduction.
193     HICE_ACTUAL(I,J) = max(HICE_ACTUAL(I,J),0.05)
194    
195     effConduct = XKI * XKS /
196     & (XKS * HICE_ACTUAL(I,J) + XKI * HSNOW_ACTUAL(I,J))
197    
198     DO ITER=1,IMAX_TICE
199    
200     t1 = tsurfLoc(I,J)
201     t2 = t1*t1
202     t3 = t2*t1
203     t4 = t2*t2
204    
205     tsurfLocOld = t1
206    
207     c log 10 of the sat vap pressure
208     mm_log10pi = -aa1 / t1 + aa2
209     c saturation vapor pressure
210     mm_pi = 10**(mm_log10pi)
211     c over ice specific humidity
212     qhice_mm(I,J) = bb1*mm_pi / (Ppascals - (1.0 - bb1) * mm_pi)
213    
214     c constant for sat vap pressure derivative w.r.t tice
215     cc3t = 10**(aa1 / t1)
216     c the actual derivative
217     dqhice_dTice = cc1 * cc3t /( (cc2-cc3t*Ppascals)**2 * t2)
218    
219     c the full derivative
220     dFiDTs1 = 4.0 * D3*t3 + effConduct + D1*UG(I,J) +
221     & D1I*UG(I,J)*dqhice_dTice
222    
223    
224     F_lh(I,J) = D1I * UG(I,J) * (qhice_mm(I,J)-AQH(I,J,bi,bj))
225     F_c(I,J) = -effConduct * (TB - t1)
226     F_lwu(I,J) = t4 * D3
227     F_sens(I,J) = D1 * UG(I,J) * (t1 - atempLoc(I,J))
228    
229     F_ia(I,J) = F_lwd(I,J) + F_swi(I,J) + F_lwu(I,J) +
230     & F_c(I,J) + F_sens(I,J) + F_lh(I,J)
231    
232     tsurfLoc(I,J) = tsurfLoc(I,J) - F_ia(I,J) / dFiDTs1
233    
234     #ifdef SEAICE_DEBUG
235     print *,'ice-iter tsurfLc,|dif|', I,J, ITER,tsurfLoc(I,J),
236     & log10(abs(tsurfLoc(I,J) - tsurfLocOld))
237     #endif
238     ENDDO !/* Iterations */
239    
240     tsurfLoc(I,J) = MIN(tsurfLoc(I,J),TMELT)
241     TSURF(I,J,bi,bj) = tsurfLoc(I,J)
242    
243     t1 = tsurfLoc(I,J)
244     t2 = t1*t1
245     t3 = t2*t1
246     t4 = t2*t2
247    
248     c log 10 of the sat vap pressure
249     mm_log10pi = -aa1 / t1 + aa2
250     c saturation vapor pressure
251     mm_pi = 10**(mm_log10pi)
252     c over ice specific humidity
253     qhice_mm(I,J) = bb1*mm_pi / (Ppascals - (1.0 - bb1) * mm_pi)
254    
255     F_lh(I,J) = D1I * UG(I,J) * (qhice_mm(I,J)-AQH(I,J,bi,bj))
256     F_c(I,J) = -effConduct * (TB - t1)
257     F_lwu(I,J) = t4 * D3
258     F_sens(I,J) = D1 * UG(I,J) * (t1 - atempLoc(I,J))
259    
260     c exlude conductive flux, the actual flux with the atmosphere.
261     F_ia(I,J) = F_lwd(I,J) + F_swi(I,J) + F_lwu(I,J) +
262     & F_sens(I,J) + F_lh(I,J)
263    
264     IF (F_c(I,J) .LT. 0.0) THEN
265     F_io_net(I,J) = -F_c(I,J)
266     F_ia_net(I,J) = 0.0
267     ELSE
268     F_io_net(I,J) = 0.0
269     F_ia_net(I,J) = F_lwd(I,J) + F_swi(I,J) + F_lwu(I,J) +
270     & F_sens(I,J) + F_lh(I,J)
271     ENDIF !/* conductive fluxes up or down */
272    
273    
274     #ifdef SEAICE_DEBUG
275     print '(A,2i4,3(1x,1P2E15.3))',
276     & 'ibi i j T(SURF, surfLoc,atmos)',I,J,
277     & TSURF(I,J,bi,bj), tsurfLoc(I,J),atempLoc(I,J)
278    
279     print '(A,2i4,3(1x,1P2E15.3))',
280     & 'ibi i j QSW(Tot, Abs, Pen) ',I,J,
281     & SWDOWN(I,J,bi,bj), AbsorbedShortwaveFlux(I,J),
282     & IcePenetratingShortwaveFlux(I,J)
283    
284     print '(A,2i4,3(1x,1P2E15.3))',
285     & 'ibi i j IcePenSWFluxFrac, Alb ',I,J,
286     ^ IcePenetratingShortwaveFluxFraction(I,J), ALB(I,J)
287    
288     print '(A,2i4,3(1x,1P2E15.3))',
289     & 'ibi i j qh(ATM ICE) ',I,J,
290     & AQH(I,J,bi,bj),qhice_mm(I,J)
291    
292     print '(A,2i4,3(1x,1P2E15.3))',
293     & 'ibi i j F(lwd,swi,lwu) ',I,J,
294     & F_lwd(I,J), F_swi(I,J), F_lwu(I,J)
295    
296     print '(A,2i4,3(1x,1P2E15.3))',
297     & 'ibi i j F(c,lh,sens) ',I,J,
298     & F_c(I,J), F_lh(I,J), F_sens(I,J)
299    
300     print '(A,2i4,3(1x,1P2E15.3))',
301     & 'ibi i j F(io_net,ia_net,ia) ',I,J,
302     & F_io_net(I,J), F_ia_net(I,J), F_ia(I,J)
303     #endif
304    
305     ENDIF !/* HICE_ACTUAL > 0 */
306    
307     ENDDO !/* i */
308     ENDDO !/* j */
309    
310     RETURN
311     END

  ViewVC Help
Powered by ViewVC 1.1.22