SURFEX v8.1
General documentation of Surfex
e_budget.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! #########
6  SUBROUTINE e_budget(IO, KK, PK, PEK, DK, DMK, HIMPLICIT_WIND, &
7  PTSTEP, PUREF, PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, &
8  PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, PVMOD, PTSM, PT2M, &
9  PSW_RAD, PLW_RAD, PTA, PQA, PPS, PRHOA, PEXNS, PEXNA, &
10  PHUI, PLEG_DELTA, PLEGI_DELTA, PGRNDFLUX, PFLUX_COR, &
11  PSOILCONDZ, PSOILHCAPZ, PALBT, PEMIST, PQSAT, PDQSAT, &
12  PFROZEN1, PTDEEP_A,PTA_IC, PQA_IC, PUSTAR2_IC, PDEEP_FLUX, &
13  PRESTORE )
14 ! ##########################################################################
15 !
16 !!**** *E_BUDGET*
17 !!
18 !! PURPOSE
19 !! -------
20 !
21 ! Calculates the evolution of the surface and deep-soil temperature
22 ! (i.e., Ts and T2), as well as all the surface fluxes.
23 !
24 !
25 !!** METHOD
26 !! ------
27 !
28 ! 1- find the grid-averaged albedo, emissivity, and roughness length
29 ! 2- compute the za, zb, and zc terms involved in the numerical
30 ! resolution of the equations for Ts and T2.
31 ! 3- find Ts(t) and T2(t).
32 ! 4- derive the surface fluxes.
33 !
34 !! EXTERNAL
35 !! --------
36 !!
37 !! none
38 !!
39 !! IMPLICIT ARGUMENTS
40 !! ------------------
41 !!
42 !!
43 !!
44 !! REFERENCE
45 !! ---------
46 !!
47 !! Noilhan and Planton (1989)
48 !! Belair (199:)
49 !!
50 !! AUTHOR
51 !! ------
52 !!
53 !! S. Belair * Meteo-France *
54 !!
55 !! MODIFICATIONS
56 !! -------------
57 !! Original 14/03/95
58 !! (J.Stein) 15/11/95 use the wind components in the flux computation
59 !! (J.Noilhan) 15/03/96 use the potential temperature instead of the
60 !! temperature for the heat flux computation
61 !! (J.Stein) 27/03/96 use only H and LE in the soil scheme
62 !! (A.Boone, V.Masson) 28/08/98 splits the routine in two for C02 computations
63 !! (A.Boone) 15/03/99 Soil ice tendencies calculated here: heating/cooling
64 !! affects surface and deep soil temperatures.
65 !! (A. Boone, V. Masson) 01/2003 Externalization
66 !! (E. Martin) 07/05 implicit coupling (coeff ZA,ZB,ZC)
67 !! (P. Le Moigne) 07/05 dependence on qs for cp
68 !! (B. Decharme) 05/08 Add floodplains dependencies
69 !! (B. Decharme) 01/09 optional deep soil temperature as in Arpege
70 !! (R. Hamdi) 01/09 Cp and L are not constants (As in ALADIN)
71 !! (B. Decharme) 09/09 When LCPL_ARP, do not calculate x2 each coef
72 !! (A.Boone) 03/10 Add delta fnctions to force LEG ans LEGI=0
73 !! when hug(i)Qsat < Qa and Qsat > Qa
74 !! (B. Decharme) 09/12 new wind implicitation
75 !! (V. Masson) 01/13 Deep soil flux implicitation
76 !! (B. Decharme) 10/14 Bug in DIF composite budget
77 !! Use harmonic mean to compute interfacial thermal conductivities
78 !! "Restore" flux computed here
79 !-------------------------------------------------------------------------------
80 !
81 !* 0. DECLARATIONS
82 ! ------------
83 !
86 USE modd_diag_n, ONLY : diag_t
88 !
89 USE modd_csts, ONLY : xlvtt, xlstt, xstefan, xcpd, xpi, xday, &
90  xtt, xcl, xcpv, xci
91 USE modd_surf_par, ONLY : xundef
92 USE modd_snow_par, ONLY : xemissn, xemcrin
93 !
94 USE modd_surf_atm, ONLY : lcpl_arp, lqvnplus
95 !
96 USE mode_thermos
97 !
98 USE modi_soil_heatdif
99 USE modi_soil_temp_arp
100 !
101 USE yomhook ,ONLY : lhook, dr_hook
102 USE parkind1 ,ONLY : jprb
103 !
104 IMPLICIT NONE
105 !
106 !* 0.1 declarations of arguments
107 !
108 !
109 TYPE(isba_options_t), INTENT(INOUT) :: IO
110 TYPE(isba_k_t), INTENT(INOUT) :: KK
111 TYPE(isba_p_t), INTENT(INOUT) :: PK
112 TYPE(isba_pe_t), INTENT(INOUT) :: PEK
113 TYPE(diag_t), INTENT(INOUT) :: DK
114 TYPE(diag_misc_isba_t), INTENT(INOUT) :: DMK
115 !
116  CHARACTER(LEN=*), INTENT(IN) :: HIMPLICIT_WIND ! wind implicitation option
117 ! ! 'OLD' = direct
118 ! ! 'NEW' = Taylor serie, order 1
119 REAL, INTENT(IN) :: PTSTEP
120 ! timestep of the integration
121 REAL, DIMENSION(:), INTENT(IN) :: PUREF ! reference height of the wind
122 REAL, DIMENSION(:), INTENT (IN) :: PSW_RAD, PLW_RAD, PPS, PRHOA, PTA, PQA, PVMOD
123 ! PSW_RAD = incoming solar radiation
124 ! PLW_RAD = atmospheric infrared radiation
125 ! PRHOA = near-ground air density
126 ! PPS = surface pressure
127 ! PTA = near-ground air temperature
128 ! PQA = near-ground air specific humidity
129 ! PVMOD = wind speed
130 !
131 ! implicit atmospheric coupling coefficients:
132 !
133 REAL, DIMENSION(:), INTENT(IN) :: PPEW_A_COEF, PPEW_B_COEF, &
134  PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, &
135  PPEQ_B_COEF
136 ! PPEW_A_COEF = A-wind coefficient (m2s/kg)
137 ! PPEW_B_COEF = B-wind coefficient (m/s)
138 ! PPET_A_COEF = A-air temperature coefficient
139 ! PPET_B_COEF = B-air temperature coefficient
140 ! PPEQ_A_COEF = A-air specific humidity coefficient
141 ! PPEQ_B_COEF = B-air specific humidity coefficient
142 !
143 REAL, DIMENSION(:), INTENT(IN) :: PEXNS, PEXNA
144 REAL, DIMENSION(:), INTENT(IN) :: PHUI
145 !
146 REAL, DIMENSION(:), INTENT(IN) :: PFROZEN1
147 ! PFROZEN1 = ice fraction in supurficial soil
148 REAL, DIMENSION(:), INTENT(IN) :: PTDEEP_A
149 ! PTDEEP_A = Deep soil temperature
150 ! coefficient depending on flux
151 REAL, DIMENSION(:), INTENT(IN) :: PGRNDFLUX
152 ! PGRNDFLUX = soil/snow interface flux (W/m2) using
153 ! ISBA-SNOW3L option
154 !
155 REAL, DIMENSION(:,:), INTENT(IN) :: PFLUX_COR
156 ! PFLUX_COR = correction flux to conserve energy (W/m2)
157 !
158 REAL, DIMENSION(:,:), INTENT(IN) :: PSOILCONDZ, PSOILHCAPZ
159 ! PSOILCONDZ= ISBA-DF Soil conductivity profile [W/(m K)]
160 ! PSOILHCAPZ=ISBA-DF Soil heat capacity profile [J/(m3 K)]
161 !
162 REAL, DIMENSION(:), INTENT(INOUT) :: PLEG_DELTA, PLEGI_DELTA
163 ! PLEG_DELTA = soil evaporation delta fn
164 ! PLEGI_DELTA = soil evaporation delta fn
165 !
166 REAL, DIMENSION(:), INTENT (OUT) :: PQA_IC, PTA_IC, PUSTAR2_IC
167 ! PTA_IC = near-ground air temperature
168 ! PQA_IC = near-ground air specific humidity
169 ! PUSTAR2_IC = near-ground wind friction (m2/s2)
170 ! (modified if implicit coupling with
171 ! atmosphere used)
172 !
173 REAL, DIMENSION(:), INTENT (IN) :: PTSM, PT2M
174 ! PTSM = surface temperature at start
175 ! of time step (K)
176 ! PT2M = mean surface (or restore) temperature at start
177 ! of time step (K)
178 !
179 REAL, DIMENSION(:), INTENT(OUT) :: PALBT, PEMIST, PDQSAT
180 ! PALBT = averaged albedo
181 ! PEMIST = averaged emissivity
182 ! PDQSAT = saturation vapor humidity derivative
183 REAL, DIMENSION(:), INTENT(IN) :: PQSAT
184 ! PQSAT = saturation vapor humidity
185 !
186 REAL, DIMENSION(:), INTENT(OUT) :: PDEEP_FLUX ! Heat flux at bottom of ISBA (W/m2)
187 !
188 REAL, DIMENSION(:), INTENT(OUT) :: PRESTORE
189 ! PRESTORE = surface restore flux (W m-2)
190 !
191 !* 0.2 declarations of local variables
192 !
193 !
194 REAL, DIMENSION(SIZE(PEK%XSNOWFREE_ALB)) :: ZRORA, &
195 ! rhoa / ra
196 !
197  za,zb,zc
198 ! terms for the calculation of Ts(t)
199 !
200 ! ISBA-DF:
201 !
202 REAL, DIMENSION(SIZE(PEK%XSNOWFREE_ALB)) :: ZCONDAVG, ZCOND1, ZCOND2, ZTERM2, ZTERM1
203 !
204 ! implicit atmospheric coupling coefficients: (modified-form)
205 !
206 REAL, DIMENSION(SIZE(PEK%XSNOWFREE_ALB)) :: ZPET_A_COEF, ZPEQ_A_COEF, ZPET_B_COEF, &
207  ZPEQ_B_COEF, Z_CCOEF, ZHUMS, ZHUMA, ZLAVG, &
208  ZHUMSD, ZHUMAD
209 ! ZPET_A_COEF = A-air temperature coefficient
210 ! ZPET_B_COEF = B-air temperature coefficient
211 ! ZPEQ_A_COEF = A-air specific humidity coefficient
212 ! ZPEQ_B_COEF = B-air specific humidity coefficient
213 ! Z_CCOEF = C-working variable
214 !
215 REAL, DIMENSION(SIZE(PEK%XSNOWFREE_ALB)) :: ZUSTAR2, ZVMOD
216 ! ZUSTAR2 = friction (m2/s2)
217 ! ZVMOD = wind modulus (m/s)
218 REAL, DIMENSION(SIZE(PEK%XSNOWFREE_ALB)) :: ZXCPV_XCL_AVG
219 REAL, DIMENSION(SIZE(PEK%XSNOWFREE_ALB)) :: ZCNHUMA, ZPEQA2, ZDKQB, ZCDQSAT, ZINCR, ZTRAD, &
220  ZCHUMS, ZCHUMA, ZPETA2, ZPETB2,ZTEMP, ZFGNFRZ, &
221  ZFGFRZ, ZFV, ZFG, ZFNFRZ, ZFFRZ, ZFNSNOW, ZCPS,&
222  ZLVTT, ZLSTT
223 REAL :: ZSNOW
224 !
225 REAL(KIND=JPRB) :: ZHOOK_HANDLE
226 !
227 !-------------------------------------------------------------------------------
228 !
229 !* 0. Initialization:
230 ! ---------------
231 !
232 IF (lhook) CALL dr_hook('E_BUDGET',0,zhook_handle)
233 !
234 zcondavg(:) = 0.0
235 zterm2(:) = 0.0
236 zterm1(:) = 0.0
237 zhumsd(:) = 0.0
238 zhumad(:) = 0.0
239 !
240 !-------------------------------------------------------------------------------
241 !
242 !* 1. COEFFICIENTS FOR THE TIME INTEGRATION OF TS
243 ! --------------------------------------------
244 !
245 !
246 ! function dqsat(Ts,ps)
247 !
248 pdqsat(:) = dqsat(pek%XTG(:,1),pps(:),pqsat(:))
249 ! function zrsra
250 !
251 ! Modify flux-form implicit coupling coefficients:
252 ! - wind components:
253 !
254 ztemp(:) = dk%XCD(:)*pvmod(:)
255 !
256 IF(himplicit_wind=='OLD')THEN
257 ! old implicitation (m2/s2)
258  zustar2(:) = ztemp(:) * ppew_b_coef(:) / (1.0- ztemp(:)*prhoa(:)*ppew_a_coef(:))
259 ELSE
260 ! new implicitation (m2/s2)
261  zustar2(:) = ztemp(:) * (2.*ppew_b_coef(:)-pvmod(:)) / (1.0-2.0*ztemp(:)*prhoa(:)*ppew_a_coef(:))
262 ENDIF
263 !
264 !wind modulus at t+1 (m/s)
265 zvmod(:) = prhoa(:)*ppew_a_coef(:)*zustar2(:) + ppew_b_coef(:)
266 zvmod(:) = max(zvmod(:),0.)
267 !
268 WHERE(ppew_a_coef(:)/= 0.)
269  zustar2(:) = max( ( zvmod(:) - ppew_b_coef(:) ) / (prhoa(:)*ppew_a_coef(:)), 0.)
270 ENDWHERE
271 !
272 zustar2(:) = max(zustar2(:),0.)
273 !
274 zrora(:) = prhoa(:) / pek%XRESA(:)
275 !
276 ! terms za, zb, and zc for the
277 ! calculation of ts(t)
278 !
279 ! Modify flux-form implicit coupling coefficients:
280 ! - air temperature:
281 !
282 ztemp(:) = ppet_a_coef(:)*zrora(:)
283 z_ccoef(:) = (1.0 - ztemp(:))/pexna(:)
284 !
285 zpet_a_coef(:) = - ztemp(:)/pexns(:)/z_ccoef(:)
286 !
287 zpet_b_coef(:) = ppet_b_coef(:)/z_ccoef(:)
288 !
289 !-------------------------------------------------------------------------------
290 !
291 !* 2. AIR AND SOIL SPECIFIC HUMIDITIES
292 ! --------------------------------
293 !
294 ! - air specific humidity:
295 !
296 zfv(:) = pek%XVEG(:) *(1-pek%XPSNV(:)-kk%XFFV(:))
297 zfg(:) = (1.-pek%XVEG(:))*(1.-pek%XPSNG(:)-kk%XFFG(:))
298 zfnfrz(:) = (1.-kk%XFFROZEN(:))*kk%XFF(:) + zfv + zfg(:)*(1.-pfrozen1(:))
299 zffrz(:) = kk%XFFROZEN(:) *kk%XFF(:) + zfg(:)*pfrozen1(:) + pek%XPSN(:)
300 !
301 zsnow = 1.
302 zfnsnow(:) = 1.
303 zcps(:) = pk%XCPS(:)
304 !
305 IF (lcpl_arp) THEN
306 
307  ! currently this correction not applied for this option, but can be
308  ! added later after testing...so delta fns set to 1 (turns OFF this correction)
309 
310  pleg_delta(:) = 1.0
311  plegi_delta(:) = 1.0
312 
313  zlavg(:) = pk%XLVTT(:)*zfnfrz(:) + pk%XLSTT(:)*zffrz(:)
314  zxcpv_xcl_avg(:)= (xcpv-xcl)*zfnfrz(:) + (xcpv-xci) *zffrz(:)
315 
316  zlvtt(:) = zlavg(:)
317  zlstt(:) = zlavg(:)
318 
319 ELSE
320 
321  IF(pek%TSNOW%SCHEME == '3-L' .OR. pek%TSNOW%SCHEME == 'CRO' .OR. io%CISBA == 'DIF')THEN
322  zsnow = 0.
323  zfnsnow(:) = 1. - pek%XPSN(:)
324  zcps(:)=xcpd
325  ENDIF
326 
327  zlavg(:) = xlvtt*zfnfrz(:) + xlstt*zffrz(:)
328 
329  zlvtt(:) = xlvtt
330  zlstt(:) = xlstt
331 
332 ENDIF
333 !
334 zfgnfrz(:) = zfg(:) * (1.-pfrozen1(:)) * pleg_delta(:)
335 zfgfrz(:) = zfg(:) * pfrozen1(:) * plegi_delta(:)
336 !
337 zhuma(:) = zlvtt(:)/zlavg(:) * ((1.-kk%XFFROZEN(:))*kk%XFF(:) + zfv(:)*dmk%XHV(:) + zfgnfrz(:)) + &
338  zlstt(:)/zlavg(:) * (kk%XFFROZEN(:) *kk%XFF(:) + zfgfrz(:) + zsnow*pek%XPSN(:) )
339 !
340 zhums(:) = zlvtt(:)/zlavg(:) * ((1.-kk%XFFROZEN(:))*kk%XFF(:) + zfv(:)*dmk%XHV(:) + zfgnfrz(:)*dk%XHUG(:)) + &
341  zlstt(:)/zlavg(:) * (kk%XFFROZEN(:) *kk%XFF(:) + zfgfrz(:)*phui(:) + zsnow*pek%XPSN(:) )
342 !
343 IF(pek%TSNOW%SCHEME == '3-L' .OR. pek%TSNOW%SCHEME == 'CRO' .OR. io%CISBA == 'DIF')THEN
344 !
345 ! humidity considering no snow (done elsewhere) and flooded zones:
346 !
347  zhumad(:) = kk%XFF(:) + zfv(:)*dmk%XHV(:) + zfgnfrz(:) + zfgfrz(:)
348  zhumsd(:) = kk%XFF(:) + zfv(:)*dmk%XHV(:) + zfgnfrz(:)*dk%XHUG(:) + zfgfrz(:)*phui(:)
349 ELSE
350  zhumad(:) = zhuma(:)
351  zhumsd(:) = zhums(:)
352 ENDIF
353 !
354 !-------------------------------------------------------------------------------
355 !
356 !* 3. COEFFICIENTS FOR THE TIME INTEGRATION OF Q
357 ! -------------------------------------------
358 !
359 ! implicit q coefficients:
360 !
361 ztemp(:) = ppeq_a_coef(:)*zrora(:)
362 z_ccoef(:) = 1.0 - ztemp(:)*zhumad(:)
363 !
364 zpeq_a_coef(:) = - ztemp(:)*pdqsat(:)*zhumsd(:)/z_ccoef(:)
365 !
366 zpeq_b_coef(:) = ( ppeq_b_coef(:) - ztemp(:)*zhumsd(:)* (pqsat(:) - pdqsat(:)*pek%XTG(:,1)) )/z_ccoef(:)
367 !
368 !-------------------------------------------------------------------------------
369 !
370 !* 4. TOTAL ALBEDO AND EMISSIVITY
371 ! ---------------------------
372 !
373 !
374 IF(pek%TSNOW%SCHEME == '3-L' .OR. pek%TSNOW%SCHEME == 'CRO' .OR. io%CISBA == 'DIF')THEN
375 !
376 ! NON-SNOW covered Grid averaged albedo and emissivity for explicit
377 ! snow scheme
378 !
379  IF(.NOT.io%LFLOOD)THEN
380 !
381  palbt (:) = pek%XSNOWFREE_ALB(:)
382  pemist(:) = pek%XEMIS(:)
383 !
384  ELSE
385 !
386 ! Taking into account the floodplains with snow grid fractions :
387 ! PFF 1.-PFF-PEK%XPSN(:) PEK%XPSN(:)
388 ! |------------|----|---------------|
389 !
390  WHERE(pek%XPSN(:)<1.0)
391  palbt (:) = ((1.-kk%XFF(:)-pek%XPSN(:))*pek%XSNOWFREE_ALB(:) + kk%XFF(:)*kk%XALBF(:) )/(1.-pek%XPSN(:))
392  pemist(:) = ((1.-kk%XFF(:)-pek%XPSN(:))*pek%XEMIS(:) + kk%XFF(:)*kk%XEMISF(:))/(1.-pek%XPSN(:))
393  ELSEWHERE
394  palbt (:) = pek%XSNOWFREE_ALB(:)
395  pemist(:) = pek%XEMIS(:)
396  ENDWHERE
397 !
398  ENDIF
399 !
400 !
401 ELSE
402 !
403 ! Grid averaged albedo and emissivity for composite snow scheme:
404 !
405  IF(pek%TSNOW%SCHEME=='EBA') THEN
406 !
407  palbt(:) = (1-pek%XVEG(:)) * (pek%XSNOWFREE_ALB_SOIL(:)*(1-pek%XPSNG(:)) + &
408  pek%TSNOW%ALB(:)*pek%XPSNG(:)) + &
409  pek%XVEG(:) * (pek%XSNOWFREE_ALB_VEG (:)*(1-pek%XPSNV_A(:)) + &
410  pek%TSNOW%ALB(:)*pek%XPSNV_A(:))
411 !
412  pemist(:) = pek%XEMIS(:)-pek%XPSN(:)*(pek%XEMIS(:)-xemcrin)
413 !
414  ELSE
415 !
416  palbt(:) = ( 1.-pek%XPSN(:)-kk%XFF(:))* pek%XSNOWFREE_ALB(:) + &
417  pek%XPSN(:) * pek%TSNOW%ALB(:) + kk%XFF(:)*kk%XALBF(:)
418 !
419  pemist(:) = ( 1.-pek%XPSN(:)-kk%XFF(:))* pek%XEMIS(:) + &
420  pek%XPSN(:) * xemissn + kk%XFF(:)*kk%XEMISF(:)
421 !
422  ENDIF
423 
424 ENDIF
425 !
426 !-------------------------------------------------------------------------------
427 !
428 !* 5. CALCULATION OF ZA, ZB, ZC
429 ! -----------------------------
430 !
431 ! 5.1. Default
432 ! ------------
433 !
434 ztrad(:) = pemist(:) * xstefan * (pek%XTG(:,1)**3)
435 zchums(:) = zrora(:)*zlavg(:)*zhums(:)
436 zchuma(:) = zrora(:)*zlavg(:)*zhuma(:)
437 !
438 zpeta2(:) = 1./pexns(:) - zpet_a_coef(:)/pexna(:)
439 zpetb2(:) = zpet_b_coef(:)/pexna(:)
440 !
441 ! Surface Energy Budget linearization coefficients for an explicit
442 ! soil-flood-vegetation energy budget with an insulating fractional overlying
443 ! layer of snow: fluxes partitioned between surface "felt" by atmosphere
444 ! and surface in contact with base of snowpack (flux exchange between
445 ! atmosphere and snow surface calculated in explicit snow routine)
446 ! (Boone and Etchevers, 2001, J Hydromet.)
447 ! NOTE for now, the meltwater advection term (heat source/sink)
448 ! is OFF because the corresponding energy should be compensated for
449 ! (but code is retained for possible future activation).
450 !
451 za(:) = 1. / ptstep + dmk%XCT(:) * &
452  ((zfnsnow(:) * &
453  ( 4.*ztrad(:) + zrora(:)*zcps(:)*zpeta2(:) )) &
454  + zchums(:)*pdqsat(:) - zchuma(:)*zpeq_a_coef(:)) &
455  + 2. * xpi / xday
456 !
457 zb(:) = 1. / ptstep + dmk%XCT(:) * ( zfnsnow(:)* 3.*ztrad(:) + zchums(:)*pdqsat(:) )
458 !
459 zc(:) = 2. * xpi * pek%XTG(:,2) / xday + dmk%XCT(:) * &
460  ( zfnsnow(:) * &
461  ( zrora(:)*zcps(:)*zpetb2(:) &
462  + psw_rad(:)*(1.-palbt(:)) + plw_rad(:)*pemist(:)) &
463  - (zchums(:)*pqsat(:) - zchuma(:)*zpeq_b_coef(:)))
464 !
465 IF(pek%TSNOW%SCHEME == '3-L' .OR. pek%TSNOW%SCHEME == 'CRO' .OR. io%CISBA == 'DIF')THEN
466 !
467 ! 5.2. With CSNOW=SNOW3L or CSNOW=CRO or IO%CISBA=DIF
468 ! -------------------------------------------------
469 !
470  zc(:) = zc(:) + dmk%XCT(:)*(pek%XPSN(:)*pgrndflux(:)+pflux_cor(:,1))
471 !
472 ELSEIF (lcpl_arp) THEN
473 !
474 ! 5.3. With Arpege
475 ! ----------------
476 !
477 zcdqsat(:) = (xcpv-xcpd)*zhums(:)*pdqsat(:)
478 zincr(:)= dmk%XCT(:) * zrora(:) * &
479  (zcdqsat(:) * ( zpeta2(:)*pek%XTG(:,1) - zpetb2(:)) + &
480  zxcpv_xcl_avg(:) * &
481  (zhums(:)*pqsat(:) - zhuma(:) * (zpeq_b_coef(:) + zpeq_a_coef(:) * pek%XTG(:,1))))
482 
483 ! Surface Energy Budget linearization coefficients for a composite
484 ! (soil-vegetation-flood-snow) energy budget: composite fluxes "felt" by
485 ! atmosphere from a mixed soil,snow and vegetation surface:
486 ! (Douville et al. 1995, J. Clim. Dyn.)
487 !
488 
489  za(:) = za(:) + zincr(:)
490 
491  zb(:) = zb(:) + zincr(:)
492 
493  IF (lqvnplus) THEN
494 !
495 ! 5.4. With LQVNPLUS=TRUE
496 ! ------------------------
497 !
498  zcnhuma(:)=(xcpv-xcpd)*(1.-zhuma(:))
499  zpeqa2(:)=zcnhuma(:)*zpeq_a_coef(:)*zpeta2(:)*pek%XTG(:,1)
500  zdkqb(:)=zpeq_b_coef(:)-pqa(:)
501 
502  za(:) = za(:) + dmk%XCT(:) * zrora(:) * &
503  (2.* zpeqa2(:) + &
504  zcnhuma(:) * (zdkqb(:)*zpeta2(:) - zpeq_a_coef(:)*zpetb2(:) ))
505 
506  zb(:) = zb(:) + dmk%XCT(:) * zrora(:) * zpeqa2(:)
507 
508  zc(:) = zc(:) + dmk%XCT(:)*zrora(:)*zcnhuma(:) *zdkqb(:)*zpetb2(:)
509 
510  ENDIF
511 ENDIF
512 !
513 
514 !-------------------------------------------------------------------------------
515 !
516 !* 6. T AT TIME 'T+DT' (before snowmelt or soil ice evolution)
517 ! -----------------
518 !
519 IF(io%CISBA == 'DIF')THEN
520 !
521 ! First determine terms needed for implicit linearization of surface:
522 !
523 ! We use harmonic mean to compute the thermal conductivity at the layers interface
524 !
525  zcond1(:) = pk%XDZG(:,1)/((pk%XDZG(:,1)+pk%XDZG(:,2))*psoilcondz(:,1))
526  zcond2(:) = pk%XDZG(:,2)/((pk%XDZG(:,1)+pk%XDZG(:,2))*psoilcondz(:,2))
527 !
528  zcondavg(:) = 1.0/(zcond1(:)+zcond2(:))
529 !
530  za(:) = za(:) - (2. * xpi / xday) + zcondavg(:)*dmk%XCG(:)/pk%XDZDIF(:,1)
531  zterm2(:) = zcondavg(:)*dmk%XCG(:)/(za(:)*pk%XDZDIF(:,1))
532  zterm1(:) = (pek%XTG(:,1)*zb(:) + (zc(:) - (2. * xpi * pek%XTG(:,2) / xday)) )/za(:)
533 !
534 ! Determine the soil temperatures:
535 !
536  CALL soil_heatdif(ptstep,pk%XDZG(:,:),pk%XDZDIF(:,:),psoilcondz, &
537  psoilhcapz,dmk%XCG,zterm1,zterm2, ptdeep_a, &
538  kk%XTDEEP, pek%XTG(:,:), pdeep_flux, pflux_cor )
539 !
540 !
541 ! "Restore" flux here is actually the heat flux between the surface
542 ! and sub-surface layers (W m-2):
543 !
544  prestore(:) = zcondavg(:)*(pek%XTG(:,1)-pek%XTG(:,2))/pk%XDZDIF(:,1)
545 !
546 ELSE
547 !
548  IF(io%LTEMP_ARP)THEN
549 !
550  CALL soil_temp_arp(ptstep,za,zb,zc,kk%XGAMMAT,kk%XTDEEP,io%XSODELX,pek%XTG(:,:))
551 !
552 ! "Restore" flux between surface and deep layer(W m-2):
553  prestore(:) = 2.0 * xpi * (pek%XTG(:,1)-pek%XTG(:,2)) / &
554  ( dmk%XCT(:)*xday*io%XSODELX(1)*(io%XSODELX(1)+io%XSODELX(2)) )
555 !
556  ELSE
557 !
558  pek%XTG(:,1) = ( pek%XTG(:,1)*zb(:) + zc(:) ) / za(:)
559 !
560  WHERE(kk%XTDEEP(:) /= xundef .AND. kk%XGAMMAT(:) /= xundef)
561  pek%XTG(:,2) = (pek%XTG(:,2) + (ptstep/xday)*(pek%XTG(:,1) + kk%XGAMMAT(:)*kk%XTDEEP(:))) / &
562  (1.+(ptstep/xday)*(1.0+kk%XGAMMAT(:)))
563  ELSEWHERE
564  pek%XTG(:,2) = (pek%XTG(:,2) + (ptstep/xday)*pek%XTG(:,1)) / &
565  (1.+(ptstep/xday) )
566  END WHERE
567 !
568 ! "Restore" flux between surface and deep layer(W m-2):
569  prestore(:) = 2.0*xpi*(pek%XTG(:,1)-pt2m(:))/(dmk%XCT(:)*xday)
570 !
571  ENDIF
572 !
573 ENDIF
574 !
575 !-------------------------------------------------------------------------------
576 !* 7. TA and QA AT TIME 'T+DT'
577 ! ------------------------
578 ! (QA and TA are only modified by these expressions
579 ! if the implicit atmospheric coupling is used)
580 !
581 pqa_ic(:) = zpeq_a_coef(:)*pek%XTG(:,1) + zpeq_b_coef(:)
582 !
583 pta_ic(:) = zpet_a_coef(:)*pek%XTG(:,1) + zpet_b_coef(:)
584 !
585 pustar2_ic(:) = zustar2(:)
586 !
587 !--------------------------------------------------------------------------------------
588 !* 8. Update of LSTT and LVTT for Arpege
589 ! ----------------------------------
590 !
591 IF (lcpl_arp) THEN
592 
593  IF (.NOT.lqvnplus) THEN
594  pk%XCPS(:) = pk%XCPS(:) + (xcpv-xcpd) *zhums(:)*pdqsat(:)*(pek%XTG(:,1)-ptsm(:))
595  ENDIF
596 
597 
598  IF (lqvnplus) THEN
599  pk%XCPS(:) = pk%XCPS(:) + (xcpv-xcpd) *zhums(:)*pdqsat(:)*(pek%XTG(:,1)-ptsm(:)) &
600  + (xcpv-xcpd) *(1-zhuma(:))*(pqa_ic(:)-pqa(:))
601  ENDIF
602 
603  pk%XLSTT(:) = pk%XLSTT(:) + (xcpv-xci)*(pek%XTG(:,1)-ptsm(:))
604 
605  pk%XLVTT(:) = pk%XLVTT(:) + (xcpv-xcl)*(pek%XTG(:,1)-ptsm(:))
606 
607 
608 ENDIF
609 !
610 IF (lhook) CALL dr_hook('E_BUDGET',1,zhook_handle)
611 !
612 !-------------------------------------------------------------------------------
613 !
614 END SUBROUTINE e_budget
subroutine soil_temp_arp(PTSTEP, PA, PB, PC, PGAMMAT, PTDEEP, PSODELX, PT
real, save xcpd
Definition: modd_csts.F90:63
real, save xstefan
Definition: modd_csts.F90:59
real, save xlvtt
Definition: modd_csts.F90:70
real, save xpi
Definition: modd_csts.F90:43
real, save xlstt
Definition: modd_csts.F90:71
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
real, save xci
Definition: modd_csts.F90:65
real, save xcpv
Definition: modd_csts.F90:63
real, save xday
Definition: modd_csts.F90:45
real, save xcl
Definition: modd_csts.F90:65
subroutine e_budget(IO, KK, PK, PEK, DK, DMK, HIMPLICIT_WIND, PTSTEP, PUREF, PPEW_A_COEF, PPEW_B_COEF, PPET_
Definition: e_budget.F90:8
logical lhook
Definition: yomhook.F90:15
real, save xtt
Definition: modd_csts.F90:66
subroutine soil_heatdif(PTSTEP, PDZG, PDZDIF, PSOILCONDZ, PSOILHCAPZ, PCT, PTERM1, PTERM2, PTDEEP_A, PTDEEP_B, PTG, PDEEP_FLUX, PFLUX_COR)