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

Contents 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 - (show annotations) (download)
Fri Jun 29 18:54:03 2007 UTC (16 years, 10 months ago) by gforget
Branch: MAIN
CVS Tags: HEAD
Ian Fenty sea-ice growth routines (adjointable, in developement)

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