/[MITgcm]/MITgcm/pkg/thsice/thsice_solve4temp.F
ViewVC logotype

Annotation of /MITgcm/pkg/thsice/thsice_solve4temp.F

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


Revision 1.17 - (hide annotations) (download)
Tue May 1 02:26:50 2007 UTC (17 years, 1 month ago) by jmc
Branch: MAIN
CVS Tags: checkpoint60, checkpoint61, checkpoint59q, checkpoint59p, checkpoint59r, checkpoint59e, checkpoint59d, checkpoint59g, checkpoint59f, checkpoint59a, checkpoint59c, checkpoint59b, checkpoint59m, checkpoint59l, checkpoint59o, checkpoint59n, checkpoint59i, checkpoint59h, checkpoint59k, checkpoint59j, checkpoint61f, checkpoint61g, checkpoint61d, checkpoint61e, checkpoint61b, checkpoint61c, checkpoint61a, checkpoint61n, checkpoint61o, checkpoint61l, checkpoint61m, checkpoint61j, checkpoint61k, checkpoint61h, checkpoint61i, checkpoint61t, checkpoint61u, checkpoint61r, checkpoint61s, checkpoint61p, checkpoint61q
Changes since 1.16: +19 -6 lines
assume linear distribution of snow for penetrating short-wave

1 jmc 1.17 C $Header: /u/gcmpack/MITgcm/pkg/thsice/thsice_solve4temp.F,v 1.16 2007/04/29 23:48:44 jmc Exp $
2 jmc 1.1 C $Name: $
3    
4     #include "THSICE_OPTIONS.h"
5    
6     CBOP
7     C !ROUTINE: THSICE_SOLVE4TEMP
8     C !INTERFACE:
9     SUBROUTINE THSICE_SOLVE4TEMP(
10 jmc 1.8 I bi, bj, siLo, siHi, sjLo, sjHi,
11 jmc 1.17 I iMin,iMax, jMin,jMax, dBugFlag,
12 mlosch 1.9 I useBulkForce, useEXF,
13 jmc 1.8 I iceMask, hIce, hSnow, tFrz, flxExSW,
14     U flxSW, tSrf, qIc1, qIc2,
15     O tIc1, tIc2, dTsrf,
16     O sHeat, flxCnB, flxAtm, evpAtm,
17     I myTime, myIter, myThid )
18 jmc 1.1 C !DESCRIPTION: \bv
19     C *==========================================================*
20     C | S/R THSICE_SOLVE4TEMP
21     C *==========================================================*
22     C | Solve (implicitly) for sea-ice and surface temperature
23     C *==========================================================*
24     C \ev
25    
26 jmc 1.8 C ADAPTED FROM:
27     C LANL CICE.v2.0.2
28     C-----------------------------------------------------------------------
29     C.. thermodynamics (vertical physics) based on M. Winton 3-layer model
30     C.. See Bitz, C. M. and W. H. Lipscomb, 1999: "An energy-conserving
31     C.. thermodynamic sea ice model for climate study." J. Geophys.
32     C.. Res., 104, 15669 - 15677.
33     C.. Winton, M., 1999: "A reformulated three-layer sea ice model."
34     C.. Submitted to J. Atmos. Ocean. Technol.
35     C.. authors Elizabeth C. Hunke and William Lipscomb
36     C.. Fluid Dynamics Group, Los Alamos National Laboratory
37     C-----------------------------------------------------------------------
38     Cc****subroutine thermo_winton(n,fice,fsnow,dqice,dTsfc)
39     C.. Compute temperature change using Winton model with 2 ice layers, of
40     C.. which only the top layer has a variable heat capacity.
41    
42 jmc 1.1 C !USES:
43     IMPLICIT NONE
44    
45     C == Global variables ===
46 jmc 1.5 #include "EEPARAMS.h"
47 jmc 1.1 #include "THSICE_SIZE.h"
48     #include "THSICE_PARAMS.h"
49 heimbach 1.14 #ifdef ALLOW_AUTODIFF_TAMC
50     # include "SIZE.h"
51     # include "tamc.h"
52     # include "tamc_keys.h"
53     #endif
54 jmc 1.1
55     C !INPUT/OUTPUT PARAMETERS:
56     C == Routine Arguments ==
57 jmc 1.8 C siLo,siHi :: size of input/output array: 1rst dim. lower,higher bounds
58     C sjLo,sjHi :: size of input/output array: 2nd dim. lower,higher bounds
59     C bi,bj :: tile indices
60     C iMin,iMax :: computation domain: 1rst index range
61     C jMin,jMax :: computation domain: 2nd index range
62     C dBugFlag :: allow to print debugging stuff (e.g. on 1 grid point).
63 mlosch 1.9 C useBulkForce:: use surf. fluxes from bulk-forcing external S/R
64     C useEXF :: use surf. fluxes from exf external S/R
65 jmc 1.8 C--- Input:
66     C iceMask :: sea-ice fractional mask [0-1]
67     C hIce (hi) :: ice height [m]
68     C hSnow (hs) :: snow height [m]
69     C tFrz (Tf) :: sea-water freezing temperature [oC] (function of S)
70     C flxExSW (=) :: surf. heat flux (+=down) except SW, function of surf. temp Ts:
71     C 0: Flx(Ts=0) ; 1: Flx(Ts=Ts^n) ; 2: d.Flx/dTs(Ts=Ts^n)
72     C--- Modified (input&output):
73     C flxSW (netSW) :: net Short-Wave flux (+=down) [W/m2]: input= at surface
74     C (=) :: output= below sea-ice, into the ocean
75     C tSrf (Tsf) :: surface (ice or snow) temperature
76     C qIc1 (qicen) :: ice enthalpy (J/kg), 1rst level
77     C qIc2 (qicen) :: ice enthalpy (J/kg), 2nd level
78     C--- Output
79     C tIc1 (Tice) :: temperature of ice layer 1 [oC]
80     C tIc2 (Tice) :: temperature of ice layer 2 [oC]
81     C dTsrf (dTsf) :: surf. temp adjusment: Ts^n+1 - Ts^n
82     C sHeat(sHeating):: surf heating flux left to melt snow or ice (= Atmos-conduction)
83     C flxCnB (=) :: heat flux conducted through the ice to bottom surface
84     C flxAtm (=) :: net flux of energy from the atmosphere [W/m2] (+=down)
85     C without snow precip. (energy=0 for liquid water at 0.oC)
86     C evpAtm (=) :: evaporation to the atmosphere [kg/m2/s] (>0 if evaporate)
87     C--- Input:
88     C myTime :: current Time of simulation [s]
89     C myIter :: current Iteration number in simulation
90     C myThid :: my Thread Id number
91     INTEGER siLo, siHi, sjLo, sjHi
92     INTEGER bi,bj
93     INTEGER iMin, iMax
94     INTEGER jMin, jMax
95     LOGICAL dBugFlag
96 mlosch 1.9 LOGICAL useBulkForce
97     LOGICAL useEXF
98 jmc 1.8 _RL iceMask(siLo:siHi,sjLo:sjHi)
99     _RL hIce (siLo:siHi,sjLo:sjHi)
100     _RL hSnow (siLo:siHi,sjLo:sjHi)
101     _RL tFrz (siLo:siHi,sjLo:sjHi)
102     _RL flxExSW(iMin:iMax,jMin:jMax,0:2)
103     _RL flxSW (siLo:siHi,sjLo:sjHi)
104     _RL tSrf (siLo:siHi,sjLo:sjHi)
105     _RL qIc1 (siLo:siHi,sjLo:sjHi)
106     _RL qIc2 (siLo:siHi,sjLo:sjHi)
107     _RL tIc1 (siLo:siHi,sjLo:sjHi)
108     _RL tIc2 (siLo:siHi,sjLo:sjHi)
109     c _RL dTsrf (siLo:siHi,sjLo:sjHi)
110     _RL dTsrf (iMin:iMax,jMin:jMax)
111     _RL sHeat (siLo:siHi,sjLo:sjHi)
112     _RL flxCnB (siLo:siHi,sjLo:sjHi)
113     _RL flxAtm (siLo:siHi,sjLo:sjHi)
114     _RL evpAtm (siLo:siHi,sjLo:sjHi)
115     _RL myTime
116     INTEGER myIter
117     INTEGER myThid
118     CEOP
119    
120     #ifdef ALLOW_THSICE
121     C !LOCAL VARIABLES:
122     C--- local copy of input/output argument list variables (see description above)
123     c _RL flxExcSw(0:2)
124 jmc 1.1 _RL Tf
125     _RL hi
126     _RL hs
127 jmc 1.8 _RL netSW
128 jmc 1.1 _RL Tsf
129     _RL qicen(nlyr)
130     _RL Tice (nlyr)
131 jmc 1.8 c _RL sHeating
132     c _RL flxCnB
133 jmc 1.1 _RL dTsf
134 jmc 1.8 c _RL flxAtm
135     c _RL evpAtm
136 jmc 1.1
137     C == Local Variables ==
138 jmc 1.8 INTEGER i,j
139 jmc 1.6 INTEGER k, iterMax
140 jmc 1.1
141     _RL frsnow ! fractional snow cover
142     _RL fswpen ! SW penetrating beneath surface (W m-2)
143     _RL fswdn ! SW absorbed at surface (W m-2)
144     _RL fswint ! SW absorbed in ice (W m-2)
145     _RL fswocn ! SW passed through ice to ocean (W m-2)
146     _RL flxExceptSw ! net surface heat flux, except short-wave (W/m2)
147     C evap :: evaporation over snow/ice [kg/m2/s] (>0 if evaporate)
148     C dEvdT :: derivative of evap. with respect to Tsf [kg/m2/s/K]
149     _RL evap, dEvdT
150     _RL flx0 ! net surf heat flux, from Atmos. to sea-ice (W m-2)
151     _RL fct ! heat conducted to top surface
152     _RL df0dT ! deriv of flx0 wrt Tsf (W m-2 deg-1)
153     _RL k12, k32 ! thermal conductivity terms
154     _RL a10, b10 ! coefficients in quadratic eqn for T1
155     _RL a1, b1, c1 ! coefficients in quadratic eqn for T1
156     c _RL Tsf_start ! old value of Tsf
157     _RL dt ! timestep
158 jmc 1.17 _RL recip_dhSnowLin
159 jmc 1.8 INTEGER iceornot
160 mlosch 1.9 LOGICAL useBlkFlx
161 jmc 1.1
162 jmc 1.8 C- define grid-point location where to print debugging values
163     #include "THSICE_DEBUG.h"
164 jmc 1.1
165 jmc 1.7 1010 FORMAT(A,I3,3F11.6)
166     1020 FORMAT(A,1P4E14.6)
167 jmc 1.1
168 jmc 1.8 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
169    
170 heimbach 1.14 #ifdef ALLOW_AUTODIFF_TAMC
171 heimbach 1.15 act1 = bi - myBxLo(myThid)
172     max1 = myBxHi(myThid) - myBxLo(myThid) + 1
173     act2 = bj - myByLo(myThid)
174     max2 = myByHi(myThid) - myByLo(myThid) + 1
175     act3 = myThid - 1
176     max3 = nTx*nTy
177     act4 = ikey_dynamics - 1
178 heimbach 1.14 #endif /* ALLOW_AUTODIFF_TAMC */
179    
180 mlosch 1.9 useBlkFlx = useEXF .OR. useBulkForce
181 jmc 1.17 IF ( dhSnowLin.GT.0. _d 0 ) THEN
182     recip_dhSnowLin = 1. _d 0 / dhSnowLin
183     ELSE
184     recip_dhSnowLin = 0. _d 0
185     ENDIF
186 mlosch 1.9
187 jscott 1.13 dt = thSIce_dtTemp
188 jmc 1.8 DO j = jMin, jMax
189     DO i = iMin, iMax
190 heimbach 1.14 #ifdef ALLOW_AUTODIFF_TAMC
191     ikey_1 = i
192     & + sNx*(j-1)
193     & + sNx*sNy*act1
194     & + sNx*sNy*max1*act2
195     & + sNx*sNy*max1*max2*act3
196     & + sNx*sNy*max1*max2*max3*act4
197     #endif /* ALLOW_AUTODIFF_TAMC */
198     C--
199     #ifdef ALLOW_AUTODIFF_TAMC
200 heimbach 1.15 CADJ STORE devdt = comlev1_thsice_1, key=ikey_1
201     CADJ STORE df0dt = comlev1_thsice_1, key=ikey_1
202     CADJ STORE flxexceptsw = comlev1_thsice_1, key=ikey_1
203     CADJ STORE flxsw(i,j) = comlev1_thsice_1, key=ikey_1
204     CADJ STORE qic1(i,j) = comlev1_thsice_1, key=ikey_1
205     CADJ STORE qic2(i,j) = comlev1_thsice_1, key=ikey_1
206     CADJ STORE tsrf(i,j) = comlev1_thsice_1, key=ikey_1
207 heimbach 1.14 #endif
208 jmc 1.8 IF ( iceMask(i,j).GT.0. _d 0) THEN
209     hi = hIce(i,j)
210     hs = hSnow(i,j)
211     Tf = tFrz(i,j)
212     netSW = flxSW(i,j)
213     Tsf = tSrf(i,j)
214     qicen(1)= qIc1(i,j)
215     qicen(2)= qIc2(i,j)
216     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
217     #ifdef ALLOW_DBUG_THSICE
218     IF ( dBug(i,j,bi,bj) ) WRITE(6,'(A,2I4,2I2)')
219     & 'ThSI_SOLVE4T: i,j=',i,j,bi,bj
220     #endif
221 jmc 1.16 IF ( hi.LT.hIceMin ) THEN
222     C If hi < hIceMin, melt the ice.
223     STOP 'THSICE_SOLVE4TEMP: should not enter if hi<hIceMin'
224 heimbach 1.15 ENDIF
225 jmc 1.1
226     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
227    
228     C fractional snow cover
229 jmc 1.17 C assume a linear distribution of snow thickness, with dhSnowLin slope,
230     C from hs-dhSnowLin to hs+dhSnowLin if full ice & snow cover.
231     C frsnow = fraction of snow over the ice-covered part of the grid cell
232     IF ( hs .GT. iceMask(i,j)*dhSnowLin ) THEN
233     frsnow = 1. _d 0
234     ELSE
235     frsnow = hs*recip_dhSnowLin/iceMask(i,j)
236     IF ( frsnow.GT.0. _d 0 ) frsnow = SQRT(frsnow)
237     ENDIF
238 jmc 1.1
239     C Compute SW flux absorbed at surface and penetrating to layer 1.
240 jmc 1.16 fswpen = netSW * (1. _d 0 - frsnow) * i0swFrac
241 jmc 1.1 fswocn = fswpen * exp(-ksolar*hi)
242     fswint = fswpen - fswocn
243    
244 jmc 1.8 fswdn = netSW - fswpen
245 jmc 1.1
246     C Compute conductivity terms at layer interfaces.
247    
248 jmc 1.16 k12 = 4. _d 0*kIce*kSnow / (kSnow*hi + 4. _d 0*kIce*hs)
249     k32 = 2. _d 0*kIce / hi
250 jmc 1.1
251     C compute ice temperatures
252 jmc 1.16 a1 = cpIce
253     b1 = qicen(1) + (cpWater-cpIce )*Tmlt1 - Lfresh
254 jmc 1.1 c1 = Lfresh * Tmlt1
255 jmc 1.6 Tice(1) = 0.5 _d 0 *(-b1 - SQRT(b1*b1-4. _d 0*a1*c1))/a1
256 jmc 1.16 Tice(2) = (Lfresh-qicen(2)) / cpIce
257 jmc 1.1
258 jmc 1.12 IF (Tice(1).GT.0. _d 0 ) THEN
259 jmc 1.17 WRITE (standardMessageUnit,'(A,I12,1PE14.6)')
260 jmc 1.12 & ' BBerr: Tice(1) > 0 ; it=', myIter, qicen(1)
261 mlosch 1.10 WRITE (standardMessageUnit,'(A,4I5,2F11.4)')
262 jmc 1.12 & ' BBerr: i,j,bi,bj,Tice = ',i,j,bi,bj,Tice
263 mlosch 1.10 ENDIF
264     IF ( Tice(2).GT.0. _d 0) THEN
265 jmc 1.17 WRITE (standardMessageUnit,'(A,I12,1PE14.6)')
266 jmc 1.12 & ' BBerr: Tice(2) > 0 ; it=', myIter, qicen(2)
267 mlosch 1.10 WRITE (standardMessageUnit,'(A,4I5,2F11.4)')
268 jmc 1.12 & ' BBerr: i,j,bi,bj,Tice = ',i,j,bi,bj,Tice
269 jmc 1.6 ENDIF
270 jmc 1.8 #ifdef ALLOW_DBUG_THSICE
271     IF ( dBug(i,j,bi,bj) ) WRITE(6,1010)
272     & 'ThSI_SOLVE4T: k, Ts, Tice=',0,Tsf,Tice
273     #endif
274 jmc 1.1
275     C Compute coefficients used in quadratic formula.
276    
277 jmc 1.16 a10 = rhoi*cpIce *hi/(2. _d 0*dt) +
278     & k32 * (4. _d 0*dt*k32 + rhoi*cpIce *hi)
279     & / (6. _d 0*dt*k32 + rhoi*cpIce *hi)
280 jmc 1.1 b10 = -hi*
281 jmc 1.16 & (rhoi*cpIce*Tice(1)+rhoi*Lfresh*Tmlt1/Tice(1))
282 jmc 1.1 & /(2. _d 0*dt)
283 jmc 1.16 & - k32 * (4. _d 0*dt*k32*Tf+rhoi*cpIce *hi*Tice(2))
284     & / (6. _d 0*dt*k32 + rhoi*cpIce *hi) - fswint
285 jmc 1.1 c1 = rhoi*Lfresh*hi*Tmlt1 / (2. _d 0*dt)
286    
287 jmc 1.4 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
288 jmc 1.1 C Compute new surface and internal temperatures; iterate until
289     C Tsfc converges.
290    
291 jmc 1.6 IF ( useBlkFlx ) THEN
292     iterMax = nitMaxTsf
293     ELSE
294     iterMax = 1
295     ENDIF
296     dTsf = Terrmax
297    
298 jmc 1.1 C ----- begin iteration -----
299 jmc 1.6 DO k = 1,iterMax
300 heimbach 1.14
301     #ifdef ALLOW_AUTODIFF_TAMC
302     ikey_3 = (ikey_1-1)*MaxTsf + k
303     #endif
304    
305     #ifdef ALLOW_AUTODIFF_TAMC
306 heimbach 1.15 CADJ STORE tsf = comlev1_thsice_3, key=ikey_3
307     CADJ STORE dtsf = comlev1_thsice_3, key=ikey_3
308     CADJ STORE df0dt = comlev1_thsice_3, key=ikey_3
309     CADJ STORE flxexceptsw = comlev1_thsice_3, key=ikey_3
310 heimbach 1.14 #endif
311 jmc 1.6 IF ( ABS(dTsf).GE.Terrmax ) THEN
312 jmc 1.1
313     C Save temperatures at start of iteration.
314     c Tsf_start = Tsf
315    
316     IF ( useBlkFlx ) THEN
317 heimbach 1.15 #ifdef ALLOW_AUTODIFF_TAMC
318     CADJ STORE tsf = comlev1_thsice_3, key=ikey_3
319     #endif
320 jmc 1.1 C Compute top surface flux.
321 jmc 1.6 IF (hs.GT.3. _d -1) THEN
322 jmc 1.1 iceornot=2
323 jmc 1.6 ELSE
324 jmc 1.1 iceornot=1
325 jmc 1.6 ENDIF
326 mlosch 1.9 IF ( useBulkForce ) THEN
327     CALL THSICE_GET_BULKF(
328     I iceornot, Tsf,
329     O flxExceptSw, df0dT, evap, dEvdT,
330     I i,j,bi,bj,myThid )
331     ELSEIF ( useEXF ) THEN
332     CALL THSICE_GET_EXF (
333     I iceornot, Tsf,
334     O flxExceptSw, df0dT, evap, dEvdT,
335     I i,j,bi,bj,myThid )
336     ENDIF
337 jmc 1.1 ELSE
338 jmc 1.8 flxExceptSw = flxExSW(i,j,1)
339     df0dT = flxExSW(i,j,2)
340 jmc 1.1 ENDIF
341 jmc 1.7 flx0 = fswdn + flxExceptSw
342 jmc 1.8 #ifdef ALLOW_DBUG_THSICE
343     IF ( dBug(i,j,bi,bj) ) WRITE(6,1020)
344     & 'ThSI_SOLVE4T: flx0,df0dT,k12,D=', flx0,df0dT,k12,k12-df0dT
345     #endif
346 jmc 1.1
347     C Compute new top layer and surface temperatures.
348     C If Tsfc is computed to be > 0 C, fix Tsfc = 0 and recompute T1
349 jmc 1.7 C with different coefficients.
350 jmc 1.1
351 heimbach 1.14 #ifdef ALLOW_AUTODIFF_TAMC
352     CADJ STORE tsf = comlev1_thsice_3, key=ikey_3
353     #endif
354 jmc 1.1 a1 = a10 - k12*df0dT / (k12-df0dT)
355     b1 = b10 - k12*(flx0-df0dT*Tsf) / (k12-df0dT)
356 jmc 1.6 Tice(1) = -(b1 + SQRT(b1*b1-4. _d 0*a1*c1))/(2. _d 0*a1)
357 jmc 1.1 dTsf = (flx0 + k12*(Tice(1)-Tsf)) / (k12-df0dT)
358     Tsf = Tsf + dTsf
359 jmc 1.6 IF (Tsf .GT. 0. _d 0) THEN
360 jmc 1.8 #ifdef ALLOW_DBUG_THSICE
361     IF ( dBug(i,j,bi,bj) ) WRITE(6,1010)
362     & 'ThSI_SOLVE4T: k,ts,t1,dTs=', k,Tsf,Tice(1),dTsf
363     #endif
364 jmc 1.1 a1 = a10 + k12
365     b1 = b10 ! note b1 = b10 - k12*Tf0
366 jmc 1.6 Tice(1) = (-b1 - SQRT(b1*b1-4. _d 0*a1*c1))/(2. _d 0*a1)
367 jmc 1.1 Tsf = 0. _d 0
368     IF ( useBlkFlx ) THEN
369 jmc 1.6 IF (hs.GT.3. _d -1) THEN
370 jmc 1.1 iceornot=2
371 jmc 1.6 ELSE
372 jmc 1.1 iceornot=1
373 jmc 1.6 ENDIF
374 mlosch 1.9 IF ( useBulkForce ) THEN
375     CALL THSICE_GET_BULKF(
376     I iceornot, Tsf,
377     O flxExceptSw, df0dT, evap, dEvdT,
378     I i,j,bi,bj,myThid )
379     ELSEIF ( useEXF ) THEN
380     CALL THSICE_GET_EXF (
381     I iceornot, Tsf,
382     O flxExceptSw, df0dT, evap, dEvdT,
383     I i,j,bi,bj,myThid )
384     ENDIF
385 jmc 1.1 dTsf = 0. _d 0
386     ELSE
387 jmc 1.8 flxExceptSw = flxExSW(i,j,0)
388 jmc 1.1 dTsf = 1000.
389     df0dT = 0.
390     ENDIF
391 jmc 1.7 flx0 = fswdn + flxExceptSw
392 jmc 1.6 ENDIF
393 jmc 1.1
394     C Check for convergence. If no convergence, then repeat.
395     C
396 jmc 1.7 C Convergence test: Make sure Tsfc has converged, within prescribed error.
397 jmc 1.1 C (Energy conservation is guaranteed within machine roundoff, even
398     C if Tsfc has not converged.)
399     C If no convergence, then repeat.
400    
401 jmc 1.8 #ifdef ALLOW_DBUG_THSICE
402     IF ( dBug(i,j,bi,bj) ) WRITE(6,1010)
403     & 'ThSI_SOLVE4T: k,ts,t1,dTs=', k,Tsf,Tice(1),dTsf
404     #endif
405 jmc 1.6 IF ( useBlkFlx .AND. k.EQ.nitMaxTsf
406     & .AND. ABS(dTsf).GE.Terrmax ) THEN
407 jmc 1.11 WRITE (6,'(A,4I4,I12,F15.9)')
408 jmc 1.12 & ' BB: not converge: i,j,it,hi=',i,j,bi,bj,
409 jmc 1.11 & myIter,hi
410 jmc 1.12 WRITE (6,*) 'BB: not converge: Tsf, dTsf=', Tsf,dTsf
411     WRITE (6,*) 'BB: not converge: flx0,dfdT=',flx0,df0dT
412 jmc 1.6 IF (Tsf.LT.-70. _d 0) STOP
413 jmc 1.1 ENDIF
414    
415 jmc 1.6 ENDIF
416     ENDDO
417 jmc 1.1 C ------ end iteration ------------
418    
419     C Compute new bottom layer temperature.
420    
421 heimbach 1.15 #ifdef ALLOW_AUTODIFF_TAMC
422     CADJ STORE Tice(:) = comlev1_thsice_1, key=ikey_1
423     CADJ STORE df0dt = comlev1_thsice_1, key=ikey_1
424     #endif
425 jmc 1.1 Tice(2) = (2. _d 0*dt*k32*(Tice(1)+2. _d 0*Tf)
426 jmc 1.16 & + rhoi*cpIce *hi*Tice(2))
427     & /(6. _d 0*dt*k32 + rhoi*cpIce *hi)
428 jmc 1.8 #ifdef ALLOW_DBUG_THSICE
429     IF ( dBug(i,j,bi,bj) ) WRITE(6,1010)
430     & 'ThSI_SOLVE4T: k, Ts, Tice=',k,Tsf,Tice
431     #endif
432 jmc 1.1
433     C Compute final flux values at surfaces.
434    
435     fct = k12*(Tsf-Tice(1))
436 jmc 1.16 flxCnB(i,j) = 4. _d 0*kIce *(Tice(2)-Tf)/hi
437 jmc 1.1 flx0 = flx0 + df0dT*dTsf
438     IF ( useBlkFlx ) THEN
439     C-- needs to update also Evap (Tsf changes) since Latent heat has been updated
440 jmc 1.8 evpAtm(i,j) = evap + dEvdT*dTsf
441 jmc 1.1 ELSE
442 jmc 1.7 C- WARNING: Evap & +Evap*Lfresh are missing ! (but only affects Diagnostics)
443 jmc 1.8 evpAtm(i,j) = 0.
444 jmc 1.1 ENDIF
445 jmc 1.7 C- energy flux to Atmos: use net short-wave flux at surf. and
446     C use latent heat = Lvap (energy=0 for liq. water at 0.oC)
447 jmc 1.8 flxAtm(i,j) = netSW + flxExceptSw
448     & + df0dT*dTsf + evpAtm(i,j)*Lfresh
449 jmc 1.7 C- excess of energy @ surface (used for surface melting):
450 jmc 1.8 sHeat(i,j) = flx0 - fct
451 jmc 1.1
452     C- SW flux at sea-ice base left to the ocean
453 jmc 1.8 flxSW(i,j) = fswocn
454 jmc 1.1
455 jmc 1.8 #ifdef ALLOW_DBUG_THSICE
456     IF ( dBug(i,j,bi,bj) ) WRITE(6,1020)
457     & 'ThSI_SOLVE4T: flx0,fct,Dif,flxCnB=',
458     & flx0,fct,flx0-fct,flxCnB(i,j)
459     #endif
460 jmc 1.1
461     C Compute new enthalpy for each layer.
462    
463 jmc 1.16 qicen(1) = -cpWater*Tmlt1 + cpIce *(Tmlt1-Tice(1))
464 jmc 1.7 & + Lfresh*(1. _d 0-Tmlt1/Tice(1))
465 jmc 1.16 qicen(2) = -cpIce *Tice(2) + Lfresh
466 jmc 1.1
467     C Make sure internal ice temperatures do not exceed Tmlt.
468 jmc 1.16 C (This should not happen for reasonable values of i0swFrac)
469 jmc 1.1
470 jmc 1.7 IF (Tice(1) .GE. Tmlt1) THEN
471 jmc 1.6 WRITE (6,'(A,2I4,2I3,1P2E14.6)')
472 jmc 1.12 & ' BBerr - Bug: IceT(1) > Tmlt',i,j,bi,bj,Tice(1),Tmlt1
473 jmc 1.6 ENDIF
474     IF (Tice(2) .GE. 0. _d 0) THEN
475     WRITE (6,'(A,2I4,2I3,1P2E14.6)')
476 jmc 1.12 & ' BBerr - Bug: IceT(2) > 0',i,j,bi,bj,Tice(2)
477 jmc 1.6 ENDIF
478 jmc 1.1
479 jmc 1.8 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
480     C-- Update Sea-Ice state :
481     tSrf(i,j) = Tsf
482     tIc1(i,j) = Tice(1)
483     tic2(i,j) = Tice(2)
484     qIc1(i,j) = qicen(1)
485     qIc2(i,j) = qicen(2)
486     c dTsrf(i,j) = dTsf
487     IF ( .NOT.useBlkFlx ) dTsrf(i,j) = dTsf
488     c sHeat(i,j) = sHeating
489     c flxCnB(i,j)= flxCnB
490     c flxAtm(i,j)= flxAtm
491     c evpAtm(i,j)= evpAtm
492     #ifdef ALLOW_DBUG_THSICE
493     IF ( dBug(i,j,bi,bj) ) THEN
494     WRITE(6,1020) 'ThSI_SOLV_4T: Tsf, Tice(1,2), dTsurf=',
495     & Tsf, Tice, dTsf
496     WRITE(6,1020) 'ThSI_SOLV_4T: sHeat, flxCndBt, Qice =',
497     & sHeat(i,j), flxCnB(i,j), qicen
498     WRITE(6,1020) 'ThSI_SOLV_4T: flxA, evpA, fxSW_bf,af=',
499     & flxAtm(i,j), evpAtm(i,j), netSW, flxSW(i,j)
500     ENDIF
501     #endif
502     ELSE
503     IF ( .NOT.useBlkFlx ) dTsrf(i,j) = 0. _d 0
504     ENDIF
505     ENDDO
506     ENDDO
507 jmc 1.1 #endif /* ALLOW_THSICE */
508    
509     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
510    
511     RETURN
512     END

  ViewVC Help
Powered by ViewVC 1.1.22