SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
isba_ceb.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 isba_ceb(HISBA, HSNOW_ISBA, HCPSURF, OFLOOD, OTEMP_ARP, HIMPLICIT_WIND, &
7  ptstep, psodelx, ppew_a_coef, ppew_b_coef, ppet_a_coef, &
8  ppeq_a_coef, ppet_b_coef, ppeq_b_coef, psnowalb, &
9  psw_rad, plw_rad, pwg, pwgi, pexns, pexna, pta, pvmod, &
10  pqa, prr, psr, pps, prs, pveg, pz0_with_snow, pz0eff, &
11  pz0h_with_snow, pwfc, pwsat, ppsn, ppsng, ppsnv, pzref, &
12  puref, pdircoszw, pf5, pffg, pffv, pff, pffg_nosnow, &
13  pffv_nosnow, pwr, prhoa, pemis, palb, pct, pcs, pcg, &
14  pd_g, pdzg, pdzdif, psoilcondz, psoilhcapz, pfrozen1, &
15  ptdeep_a, ptdeep_b, pgammat, ppsnv_a, psnowfree_alb_veg, &
16  psnowfree_alb_soil, pgrndflux, pflsn_cor, &
17  psnow_thrufal, pffrozen, pfalb, pfemis, psnowswe, psrsfc, &
18  ptg, presa, plvtt, plstt, pcps, pdelta, pch, pcd, pcdn, &
19  pri, phug, phugi, phv, phu, pqs, palbt, pemist, pdeep_flux, &
20  prn, ph, ple, pleg, plegi, plev, ples, pler, pletr, pevap, &
21  pgflux, pmeltadv, pmelt, prestore, pustar, ple_flood, &
22  plei_flood, psnowtemp, pac_agg, phu_agg )
23 ! ##########################################################################
24 !
25 !
26 !!**** *ISBA_CEB*
27 !!
28 !! PURPOSE
29 !! -------
30 ! Monitor for the calculation of the surface composit energy budget
31 !! call of drag, e_budget, and isba_fluxes
32 !
33 !!** METHOD
34 !! ------
35 !
36 !! EXTERNAL
37 !! --------
38 !!
39 !! IMPLICIT ARGUMENTS
40 !! ------------------
41 !!
42 !!
43 !! REFERENCE
44 !! ---------
45 !!
46 !! Noilhan and Planton (1989)
47 !!
48 !! AUTHOR
49 !! ------
50 !! B. Decharme * Meteo-France *
51 !!
52 !! MODIFICATIONS
53 !! -------------
54 !! Original 10/03/95
55 !!
56 !! (B. Decharme) 03/16 Bug : limitation of Er for Interception reservoir
57 !! PTSTEP insted of ZTSTEP in drag.F90
58 !-------------------------------------------------------------------------------
59 !
60 !* 0. DECLARATIONS
61 ! ------------
62 USE modd_surf_par, ONLY : xundef
63 !
64 USE modd_surf_atm, ONLY : lcpl_arp
65 !
66 USE modi_drag
67 USE modi_e_budget
68 USE modi_isba_fluxes
69 !
70 USE mode_thermos
71 !
72 USE yomhook ,ONLY : lhook, dr_hook
73 USE parkind1 ,ONLY : jprb
74 !
75 IMPLICIT NONE
76 !
77 !* 0.1 declarations of arguments
78 ! -------------------------
79 !
80 ! in
81 !
82 !
83  CHARACTER(LEN=*), INTENT(IN) :: hisba ! type of ISBA version:
84 ! ! '2-L' (default)
85 ! ! '3-L'
86 ! ! 'DIF'
87  CHARACTER(LEN=*), INTENT(IN) :: hsnow_isba ! 'DEF' = Default F-R snow scheme
88 ! ! (Douville et al. 1995)
89 ! ! '3-L' = 3-L snow scheme (option)
90 ! ! (Boone and Etchevers 2000)
91  CHARACTER(LEN=*), INTENT(IN) :: hcpsurf ! option for specific heat Cp:
92 ! ! 'DRY' = dry Cp
93 ! ! 'HUM' = Cp as a function of qs
94 !
95 LOGICAL, INTENT(IN) :: oflood ! Activation of the flooding scheme
96 LOGICAL, INTENT(IN) :: otemp_arp ! True = time-varying force-restore soil temperature (as in ARPEGE)
97  ! False = No time-varying force-restore soil temperature (Default)
98 !
99  CHARACTER(LEN=*), INTENT(IN) :: himplicit_wind ! wind implicitation option
100 ! ! 'OLD' = direct
101 ! ! 'NEW' = Taylor serie, order 1
102 !
103 REAL, INTENT(IN) :: ptstep ! timestep of the integration
104 !
105 REAL, DIMENSION(:), INTENT(IN) :: psodelx ! Pulsation for each layer (Only used if LTEMP_ARP=True)
106 !
107 REAL, DIMENSION(:), INTENT(IN) :: ppew_a_coef, ppew_b_coef, &
108  ppet_a_coef, ppeq_a_coef, ppet_b_coef, &
109  ppeq_b_coef
110 ! PPEW_A_COEF = A-wind coefficient (m2s/kg)
111 ! PPEW_B_COEF = B-wind coefficient (m/s)
112 ! PPET_A_COEF = A-air temperature coefficient
113 ! PPET_B_COEF = B-air temperature coefficient
114 ! PPEQ_A_COEF = A-air specific humidity coefficient
115 ! PPEQ_B_COEF = B-air specific humidity coefficient
116 !
117 REAL, DIMENSION(:), INTENT(IN) :: psnowalb
118 ! prognostic variables at time 't-dt'
119 ! PSNOWALB = albedo of the snow
120 !
121 REAL, DIMENSION(:,:), INTENT(IN) :: pwg, pwgi, pwfc, pwsat
122 ! PWG = near-surface volumetric water content
123 ! PWGI = near-surface frozen volumetric water content
124 ! PWFC = field capacity volumetric water content
125 ! PWSAT = volumetric water content at saturation
126 !
127 REAL, DIMENSION(:), INTENT(IN) :: psw_rad, plw_rad
128 ! PSW_RAD = incoming solar radiation
129 ! PLW_RAD = atmospheric infrared radiation
130 
131 REAL, DIMENSION(:), INTENT(IN) :: pexna, pexns, pta, pvmod, pqa, prr, psr, pps
132 ! PEXNA= Exner function near surface atmospheric variables
133 ! PEXNS = Exner function at the surface
134 ! PTA = 2m temperature
135 ! PVMOD = module of the horizontal wind
136 ! NOTE it should be input as >= 1. (m)
137 ! PQA = specific humidity
138 ! PPS = surface pressure
139 ! PRR = rain rate
140 ! PSR = snow rate
141 !
142 REAL, DIMENSION(:), INTENT(IN) :: prs, pveg
143 ! PRS = stomatal resistance
144 ! PVEG = vegetation fraction
145 REAL, DIMENSION(:), INTENT(IN) :: ppsn, ppsng, ppsnv
146 ! PPSN = grid fraction covered by snow
147 ! PPSNG = fraction of the bare ground covered
148 ! by snow
149 ! PPSNV = fraction of the vegetation covered
150 ! by snow
151 REAL, DIMENSION(:), INTENT(IN) :: pzref, puref
152 ! PZREF = reference height of the first
153 ! atmospheric level
154 ! PUREF = reference height of the wind
155 ! NOTE this is different from ZZREF
156 ! ONLY in stand-alone/forced mode,
157 ! NOT when coupled to a model (MesoNH)
158 !
159 REAL, DIMENSION(:), INTENT(IN) :: pz0eff ! roughness length for momentum
160 REAL, DIMENSION(:), INTENT(IN) :: pz0_with_snow ! roughness length for momentum
161 ! ! (with snow taken into account)
162 REAL, DIMENSION(:), INTENT(IN) :: pz0h_with_snow ! roughness length for heat
163 ! ! (with snow taken into account)
164 !
165 REAL, DIMENSION(:), INTENT(IN) :: pf5
166 ! PF5 = water stress function for Hv
167 REAL, DIMENSION(:), INTENT(IN) :: pdircoszw
168 ! PDIRCOSZW = Cosinus of the angle between the normal to the surface and the vertical
169 !
170 REAL, DIMENSION(:), INTENT(IN) :: pffv, pff, pffg, pffg_nosnow, pffv_nosnow
171 ! PFFG = Floodplain fraction over ground
172 ! PFFV = Floodplain fraction over vegetation
173 ! PFF = Floodplain fraction at the surface
174 !
175 REAL, DIMENSION(:), INTENT(IN) :: pwr, prhoa
176 ! PWR = liquid water retained on the foliage
177 ! PRHOA = near-ground air density
178 !
179 REAL, DIMENSION(:), INTENT(IN) :: pemis, palb, pct, pcs, pcg
180 ! PEMIS = emissivity
181 ! PALB = albedo
182 ! PCT = area-averaged heat capacity
183 ! PCS = heat capacity of the snow (K m2 J-1)
184 ! PCG = heat capacity of the soil (K m2 J-1)
185 REAL, DIMENSION(:), INTENT(IN) :: pgrndflux, pflsn_cor, psnow_thrufal
186 ! PGRNDFLUX = soil/snow interface flux (W/m2) using
187 ! ISBA-SNOW3L option
188 ! PFLSN_COR = soil/snow interface correction flux to conserve energy (W/m2)
189 ! PSNOW_THRUFAL = snow runoff/melt leaving pack and available
190 ! at the surface for runoff or infiltration
191 ! [kg/(m2 s)]
192 REAL, DIMENSION(:,:), INTENT(IN) :: pd_g, psoilcondz, psoilhcapz
193 ! PD_G = Depth of bottom of Soil layers (m)
194 ! PSOILCONDZ= ISBA-DF Soil conductivity profile [W/(m K)]
195 ! PSOILHCAPZ=ISBA-DF Soil heat capacity profile [J/(m3 K)]
196 !
197 REAL, DIMENSION(:,:), INTENT(IN) :: pdzg ! soil layers thicknesses (DIF option) (m)
198 REAL, DIMENSION(:,:), INTENT(IN) :: pdzdif ! distance between consecuative layer mid-points (DIF option) (m)
199 !
200 REAL, DIMENSION(:), INTENT(IN) :: pfrozen1
201 ! PFROZEN1 = ice fraction in supurficial soil
202 !
203 REAL, DIMENSION(:), INTENT(IN) :: ptdeep_a, ptdeep_b, pgammat
204 ! PTDEEP_A = Deep soil temperature
205 ! coefficient depending on flux
206 ! PTDEEP_B = Deep soil temperature (prescribed)
207 ! which models heating/cooling from
208 ! below the diurnal wave penetration
209 ! (surface temperature) depth. If it
210 ! is FLAGGED as undefined, then the zero
211 ! flux lower BC is applied.
212 ! Tdeep = PTDEEP_B + PTDEEP_A * PDEEP_FLUX
213 ! (with PDEEP_FLUX in W/m2)
214 ! PGAMMAT = Deep soil heat transfer coefficient:
215 ! assuming homogeneous soil so that
216 ! this can be prescribed in units of
217 ! (1/days): associated time scale with
218 ! PTDEEP.
219 !
220 REAL, DIMENSION(:), INTENT(IN) :: psnowfree_alb_veg !snow free albedo of vegetation for EBA
221 REAL, DIMENSION(:), INTENT(IN) :: psnowfree_alb_soil !snow free albedo of soil for EBA option
222 REAL, DIMENSION(:), INTENT(IN) :: ppsnv_a !fraction of the the vegetation covered by snow for EBA scheme
223 !
224 REAL, DIMENSION(:), INTENT(IN) :: pfalb, pfemis, pffrozen
225 ! PFALB = Floodplain albedo
226 ! PFEMIS= Floodplain emis
227 !
228 REAL, DIMENSION(:), INTENT(IN) :: psnowswe
229 ! PSNOWSWE = equivalent water content of
230 ! the D95 snow reservoir (kg m-2)
231 !
232 REAL, DIMENSION(:), INTENT(IN) :: psrsfc ! Snow rate falling outside of snow
233 ! covered grid area [kg/(m2 s)]
234 !
235 !inout
236 !
237 REAL, DIMENSION(:,:), INTENT(INOUT) :: ptg
238 ! surface temperature
239 REAL, DIMENSION(:), INTENT(INOUT) :: presa
240 ! aerodynamic surface resistance
241 REAL, DIMENSION(:), INTENT(INOUT) :: plvtt
242 ! PLVTT=Vaporization heat
243 REAL, DIMENSION(:), INTENT(INOUT) :: plstt
244 ! PLSTT=Sublimation heat
245 REAL, DIMENSION(:), INTENT(INOUT) :: pcps
246 ! PCPS=specific heat at surface
247 REAL, DIMENSION(:), INTENT(INOUT) :: pdelta
248 ! PDELTA = fraction of the foliage covered
249 ! by intercepted water
250 !
251 !out
252 !
253 REAL, DIMENSION(:), INTENT(OUT) :: pch, pcd, pcdn, pri
254 ! PCH = drag coefficient for heat
255 ! PCD = drag coefficient for momentum
256 ! PCDN= neutral drag coefficient for momentum
257 ! PRI = Richardson number
258 !
259 REAL, DIMENSION(:), INTENT(OUT) :: phug, phugi, phv, phu, pqs
260 ! PHUG = ground relative humidity
261 ! PHUGI = ground (ice) relative humidity
262 ! PHV = Halstead coefficient
263 ! PHU = relative humidity at the surface
264 ! PQS = humidity at surface
265 !
266 REAL, DIMENSION(:), INTENT(OUT) :: palbt, pemist
267 ! PALBT = averaged albedo
268 ! PEMIST = averaged emissivity
269 !
270 REAL, DIMENSION(:), INTENT(OUT) :: pdeep_flux ! Heat flux at bottom of ISBA (W/m2)
271 !
272 REAL, DIMENSION(:), INTENT(OUT) :: prn, ph, ple, pleg, plev, ples
273 REAL, DIMENSION(:), INTENT(OUT) :: pler, pletr, pevap, pgflux, pmeltadv, pmelt, prestore
274 ! PRN = net radiation at the surface
275 ! PH = sensible heat flux
276 ! PLE = latent heat flux
277 ! PLEG = latent heat flux from the soil surface
278 ! PLEV = latent heat flux from the vegetation
279 ! PLES = latent heat flux from the snow
280 ! PLER = direct evaporation from the fraction
281 ! delta of the foliage
282 ! PLETR = transpiration of the remaining
283 ! part of the leaves
284 ! PEVAP = total evaporative flux (kg/m2/s)
285 ! PGFLUX = ground flux
286 ! PMELTADV = heat advection by melting snow
287 ! (acts to restore temperature to
288 ! melting point) (W/m2)
289 ! PMELT = melting rate of snow (kg m-2 s-1)
290 ! PRESTORE = surface restore flux (W m-2)
291 !
292 REAL, DIMENSION(:), INTENT(OUT) :: plegi, pustar
293 ! PLEGI = sublimation component of the
294 ! latent heat flux from the soil surface
295 ! PUSTAR = friction velocity
296 !
297 REAL, DIMENSION(:), INTENT(OUT) :: ple_flood, plei_flood !Floodplains latent heat flux [W/m2]
298 REAL, DIMENSION(:), INTENT(OUT) :: psnowtemp ! snow layer temperatures (K)
299 !
300 REAL, DIMENSION(:), INTENT(OUT) :: pac_agg ! aggregated aerodynamic conductance
301  ! for evaporative flux calculations
302 REAL, DIMENSION(:), INTENT(OUT) :: phu_agg ! aggregated relative humidity
303  ! for evaporative flux calculations
304 !
305 !
306 !* 0.2 declarations of local parameters
307 !
308 REAL, PARAMETER :: zdepth_cor = 0.6
309 ! ZDEPTH_COR = depth over which the correction flux is applied
310 !
311 REAL, PARAMETER :: zdtg1_cor = 10.0
312 ! ZDTG1_COR = Delta temperature limit to comput the correction flux (K)
313 !
314 !
315 !* 0.3 declarations of local variables
316 !
317 REAL, DIMENSION(SIZE(PTA)) :: zqsat ! expression for the saturation specific humidity
318 !
319 REAL, DIMENSION(SIZE(PTA)) :: zdqsat ! expression for the saturation specific humidity derivative
320 !
321 REAL, DIMENSION(SIZE(PTA)) :: zta_ic, zqa_ic, zustar2_ic ! TA, QA and friction updated values
322 ! ! if implicit coupling with atmosphere used.
323 !
324 REAL, DIMENSION(SIZE(PTA)) :: zleg_delta ! soil evaporation delta fn
325 REAL, DIMENSION(SIZE(PTA)) :: zlegi_delta ! soil sublimation delta fn
326 !
327 REAL, DIMENSION(SIZE(PTA)) :: zt2m ! restore temperature before time integration (K)
328 REAL, DIMENSION(SIZE(PTA)) :: ztsm ! surface temperature before time integration (K)
329 !
330 REAL, DIMENSION(SIZE(PTG,1),SIZE(PTG,2)) :: zflux_cor, zlayerhcap
331 ! ZFLUX_COR = correction flux by layer to conserve energy (W/m2)
332 !
333 REAL, DIMENSION(SIZE(PTA)) :: zgrndflux, ztotalhcap, zwork
334 !
335 INTEGER :: ini, inl, ji, jl
336 LOGICAL :: lexplicit_snow
337 !
338 !* 0.4 declarations of local time spliting variables
339 !
340 ! Working arrays for flux averaging over time split
341 !
342 REAL, DIMENSION(SIZE(PTA)) :: zdeep_flux, zle_flood, zlei_flood, &
343  zrn, zh, zle, zleg, zlev, &
344  zles, zler, zletr, zevap, &
345  zgflux, zmeltadv, zmelt, &
346  zrestore, zlegi, zustar2, &
347  zac_agg, zhu_agg
348 !
349 REAL, DIMENSION(SIZE(PTA)) :: zdeep_flux_sum, zle_flood_sum, zlei_flood_sum, &
350  zrn_sum, zh_sum, zle_sum, zleg_sum, zlev_sum, &
351  zles_sum, zler_sum, zletr_sum, zevap_sum, &
352  zgflux_sum, zmeltadv_sum, zmelt_sum, &
353  zrestore_sum, zlegi_sum, zustar2_sum, &
354  zac_agg_sum, zhu_agg_sum
355 !
356 REAL, PARAMETER :: ztsplit = 300. ! s Minimum time tstep required to time-split energy budget
357 INTEGER :: itsplit, jsplit
358 REAL :: ztstep, znsplit
359 !
360 REAL(KIND=JPRB) :: zhook_handle
361 !
362 !-------------------------------------------------------------------------------
363 !
364 IF (lhook) CALL dr_hook('ISBA_CEB',0,zhook_handle)
365 !
366 !-------------------------------------------------------------------------------
367 !
368 !* 1.0 Preliminaries
369 ! -------------
370 !
371 ini=SIZE(ptg,1)
372 inl=SIZE(ptg,2)
373 !
374 !local init
375 !
376 zqsat(:) = xundef
377 zta_ic(:) = xundef
378 zqa_ic(:) = xundef
379 zustar2_ic(:) = xundef
380 zleg_delta(:) = xundef
381 zlegi_delta(:) = xundef
382 zdqsat(:) = xundef
383 !
384 zdeep_flux(:) = xundef
385 zle_flood(:) = xundef
386 zlei_flood(:) = xundef
387 zrn(:) = xundef
388 zh(:) = xundef
389 zle(:) = xundef
390 zleg(:) = xundef
391 zlev(:) = xundef
392 zles(:) = xundef
393 zler(:) = xundef
394 zletr(:) = xundef
395 zevap(:) = xundef
396 zgflux(:) = xundef
397 zmeltadv(:) = xundef
398 zmelt(:) = xundef
399 zrestore(:) = xundef
400 zlegi(:) = xundef
401 zac_agg(:) = xundef
402 zhu_agg(:) = xundef
403 !
404 zustar2_sum(:) = 0.0
405 zevap_sum(:) = 0.0
406 !
407 zrn_sum(:) = 0.0
408 zh_sum(:) = 0.0
409 zgflux_sum(:) = 0.0
410 zle_sum(:) = 0.0
411 !
412 zleg_sum(:) = 0.0
413 zlegi_sum(:) = 0.0
414 zlev_sum(:) = 0.0
415 zles_sum(:) = 0.0
416 zler_sum(:) = 0.0
417 zletr_sum(:) = 0.0
418 zle_flood_sum(:) = 0.0
419 zlei_flood_sum(:) = 0.0
420 !
421 zdeep_flux_sum(:) = 0.0
422 zmeltadv_sum(:) = 0.0
423 zmelt_sum(:) = 0.0
424 zrestore_sum(:) = 0.0
425 zac_agg_sum(:) = 0.0
426 zhu_agg_sum(:) = 0.0
427 !
428 !-------------------------------------------------------------------------------
429 !
430 zgrndflux(: ) = pgrndflux(:)
431 !
432 zflux_cor(:,:) = 0.0
433 !
434 !-------------------------------------------------------------------------------
435 !
436 !* 2.0 Correction flux to conserv energy budget
437 ! ----------------------------------------
438 !
439 lexplicit_snow=(hsnow_isba == '3-L' .OR. hsnow_isba == 'CRO')
440 !
441 IF(lexplicit_snow.AND.hisba/='DIF')THEN
442 !
443  zflux_cor(:,1)=ppsn(:)*pflsn_cor(:)
444 !
445 ELSEIF(lexplicit_snow.AND.hisba=='DIF')THEN
446 !
447  zlayerhcap(:,:) = 0.0
448  ztotalhcap(:) = 0.0
449 !
450 ! To conserv energy, the correction flux is distributed at least
451 ! over the first layers of the soil, ZDEPTH_COR. This method prevent
452 ! numerical oscillations especially when explicit snow vanishes
453 !
454  zwork(:)=min(pd_g(:,inl),zdepth_cor)
455 !
456  zlayerhcap(:,1)= 1.0/pct(:)
457  ztotalhcap(: )= 1.0/pct(:)
458  DO jl=2,inl
459  DO ji=1,ini
460  zlayerhcap(ji,jl)=psoilhcapz(ji,jl)*min(pdzg(ji,jl),max(0.0,zwork(ji)-pd_g(ji,jl)+pdzg(ji,jl)))
461  ztotalhcap(ji )=ztotalhcap(ji)+zlayerhcap(ji,jl)
462  ENDDO
463  ENDDO
464 !
465  DO jl=1,inl
466  DO ji=1,ini
467  IF(ztotalhcap(ji)>0.0)THEN
468  zflux_cor(ji,jl)=ppsn(ji)*pflsn_cor(ji)*zlayerhcap(ji,jl)/ztotalhcap(ji)
469  ENDIF
470  ENDDO
471  ENDDO
472 !
473 ! The second correction is computed if the delta temperature
474 ! due to snow/soil ground flux is superior to ZDTG1_COR (K)
475 ! Especially relevant when PPSN ~ 1 over vegetated area
476 !
477  zwork(:)=ptstep*pct(:)*ppsn(:)*abs(pgrndflux(:))
478 !
479  WHERE(ztotalhcap(:)>0.0.AND.zwork(:)>=zdtg1_cor)
480  zgrndflux(:) = pgrndflux(:)*zlayerhcap(:,1)/ztotalhcap(:)
481  ENDWHERE
482 !
483  DO jl=2,inl
484  DO ji=1,ini
485  IF(ztotalhcap(ji)>0.0.AND.zwork(ji)>=zdtg1_cor)THEN
486  zflux_cor(ji,jl)=zflux_cor(ji,jl)+ppsn(ji)*pgrndflux(ji) &
487  *zlayerhcap(ji,jl)/ztotalhcap(ji)
488  ENDIF
489  ENDDO
490  ENDDO
491 !
492 ENDIF
493 !
494 !-------------------------------------------------------------------------------
495 !
496 IF(lcpl_arp)THEN
497  itsplit = 1
498 ELSE
499  itsplit = max(1,nint(ptstep/ztsplit)) ! number of split-time steps
500 ENDIF
501 !
502 znsplit = REAL(itsplit)
503 !
504 ztstep = ptstep/znsplit ! split time step
505 !
506 !-------------------------------------------------------------------------------
507 !
508 DO jsplit=1,itsplit
509 !
510 ! Save surface and sub-surface temperature values at beginning of time step for
511 ! budget and flux calculations:
512 !
513  ztsm(:) = ptg(:,1)
514  zt2m(:) = ptg(:,2)
515 !
516 !
517 !* 3.0 Aerodynamic drag and heat transfer coefficients
518 ! -----------------------------------------------
519 !
520 ! In DRAG, we use the timestep of ISBA (PTSTEP) and not the split time step (ZTSTEP)
521 ! because diagnostic canopy evaporation (Er) must be consistent with PWR water
522 ! mass to limit negative dripping in hydro_veg
523 !
524  CALL drag(hisba, hsnow_isba, hcpsurf, ptstep, &
525  ptg(:,1), pwg(:,1), pwgi(:,1), pexns, pexna, pta, pvmod, pqa, prr, psr, &
526  pps, prs, pveg, pz0_with_snow, pz0eff, pz0h_with_snow, &
527  pwfc(:,1), pwsat(:,1), ppsng, ppsnv, pzref, puref, &
528  pdircoszw, pdelta, pf5, presa, pch, pcd, pcdn, pri, phug, phugi, &
529  phv, phu, pcps, pqs, pffg, pffv, pff, pffg_nosnow, pffv_nosnow, &
530  zleg_delta, zlegi_delta, pwr, prhoa, plvtt, pqsat=zqsat )
531 !
532 !
533 !
534 !* 4.0 Resolution of the surface and soil energy budget
535 ! ------------------------------------------------
536 !
537  CALL e_budget(hisba, hsnow_isba, oflood, otemp_arp, himplicit_wind, &
538  ztstep, psodelx, puref, &
539  ppew_a_coef, ppew_b_coef, ppet_a_coef, ppeq_a_coef, ppet_b_coef, &
540  ppeq_b_coef, pvmod, pcd, ptg, ztsm, zt2m, psnowalb, psw_rad, plw_rad, &
541  pta, pqa, pps, prhoa, pexns, pexna, pcps, plvtt, plstt, pveg, &
542  phug, phugi, phv, zleg_delta, zlegi_delta, pemis, palb, presa, &
543  pct, pcg, ppsn, ppsnv, ppsng, zgrndflux, zflux_cor, &
544  pd_g, pdzg, pdzdif, psoilcondz, psoilhcapz, palbt, pemist, &
545  zqsat, zdqsat, pfrozen1, ptdeep_a, ptdeep_b, pgammat, &
546  zta_ic, zqa_ic, zustar2_ic, &
547  psnowfree_alb_veg, ppsnv_a, psnowfree_alb_soil, &
548  pffg, pffv, pff, pffrozen, pfalb, pfemis, zdeep_flux, zrestore )
549 !
550 !
551 !* 5.0 Energy and momentum fluxes
552 ! --------------------------
553 !
554 !*******************************************************************************
555 ! WARNING: at this stage, ZALBT and ZEMIST have two different meanings according
556 ! to the ISBA snow-scheme option:
557 ! 'D95' : they represent aggregated (snow + flood + snow-flood-free) albedo and emissivity
558 ! '3-L' : they represent flood + snow-flood-free albedo and emissivity
559 !*******************************************************************************
560 !
561  CALL isba_fluxes(hisba, hsnow_isba, otemp_arp, ztstep, psodelx, &
562  psw_rad, plw_rad, zta_ic, zqa_ic, &
563  prhoa, pexns, pexna, pcps, plvtt, plstt, &
564  pveg, phug, phugi, phv, zleg_delta, zlegi_delta, pdelta, presa, &
565  pf5, prs, pcs, pcg, pct, psnowswe, ztsm, zt2m, &
566  ppsn, ppsnv, ppsng, pfrozen1, &
567  palbt, pemist, zqsat, zdqsat, psnow_thrufal, &
568  zrn, zh, zle, zleg, zlegi, zlev, zles, zler, zletr, zevap, zgflux, &
569  zmeltadv, zmelt, &
570  psoilcondz, pd_g, pdzg, ptg, &
571  psrsfc, ppsnv_a, pffg, pffv, pff, pffrozen, &
572  zle_flood, zlei_flood, psnowtemp )
573 !
574 !
575 !* 6.0 Aggregated coefficients
576 ! -----------------------
577 !
578 ! Compute aggregated coefficients for evaporation
579 ! Sum(LEV+LEG+LEGI+LES) = ACagg * Lv * RHOA * (HUagg.Qsat - Qa)
580 !
581  zac_agg(:) = 1. / presa(:) / plvtt(:) &
582  * ( plvtt(:)* pveg(:) *(1.-ppsnv(:)) *phv(:) &
583  + plvtt(:)*(1.-pveg(:))*(1.-ppsng(:))*(1.-pfrozen1(:)) &
584  + plstt(:)*(1.-pveg(:))*(1.-ppsng(:))* pfrozen1(:) &
585  + plstt(:)* ppsn(:) )
586 !
587  WHERE(zac_agg(:)>0.0)
588  zhu_agg(:) = 1. / (presa(:) * zac_agg(:)) / plvtt(:) &
589  * ( plvtt(:)* pveg(:) *(1.-ppsnv(:)) *phv(:) &
590  + plvtt(:)*(1.-pveg(:))*(1.-ppsng(:))*(1.-pfrozen1(:))*phug(:) &
591  + plstt(:)*(1.-pveg(:))*(1.-ppsng(:))* pfrozen1(:) *phugi(:) &
592  + plstt(:)* ppsn(:) )
593  ENDWHERE
594 !
595  zustar2_sum(:) = zustar2_sum(:) + zustar2_ic(:)
596 !
597  zevap_sum(:) = zevap_sum(:) + zevap(:)
598 !
599  zrn_sum(:) = zrn_sum(:) + zrn(:)
600  zh_sum(:) = zh_sum(:) + zh(:)
601  zgflux_sum(:) = zgflux_sum(:) + zgflux(:)
602  zle_sum(:) = zle_sum(:) + zle(:)
603 !
604  zleg_sum(:) = zleg_sum(:) + zleg(:)
605  zlegi_sum(:) = zlegi_sum(:) + zlegi(:)
606  zlev_sum(:) = zlev_sum(:) + zlev(:)
607  zles_sum(:) = zles_sum(:) + zles(:)
608  zler_sum(:) = zler_sum(:) + zler(:)
609  zletr_sum(:) = zletr_sum(:) + zletr(:)
610  zle_flood_sum(:) = zle_flood_sum(:) + zle_flood(:)
611  zlei_flood_sum(:) = zlei_flood_sum(:) + zlei_flood(:)
612 !
613  zdeep_flux_sum(:) = zdeep_flux_sum(:) + zdeep_flux(:)
614  zmeltadv_sum(:) = zmeltadv_sum(:) + zmeltadv(:)
615  zmelt_sum(:) = zmelt_sum(:) + zmelt(:)
616  zrestore_sum(:) = zrestore_sum(:) + zrestore(:)
617  zac_agg_sum(:) = zac_agg_sum(:) + zac_agg(:)
618  zhu_agg_sum(:) = zhu_agg_sum(:) + zhu_agg(:)
619 !
620 !-------------------------------------------------------------------------------
621 !
622 ENDDO
623 !
624 pustar(:) = sqrt(zustar2_sum(:)/znsplit)
625 !
626 pevap(:) = zevap_sum(:) / znsplit
627 !
628 prn(:) = zrn_sum(:) / znsplit
629 ph(:) = zh_sum(:) / znsplit
630 pgflux(:) = zgflux_sum(:) / znsplit
631 ple(:) = zle_sum(:) / znsplit
632 !
633 pleg(:) = zleg_sum(:) / znsplit
634 plegi(:) = zlegi_sum(:) / znsplit
635 plev(:) = zlev_sum(:) / znsplit
636 ples(:) = zles_sum(:) / znsplit
637 pler(:) = zler_sum(:) / znsplit
638 pletr(:) = zletr_sum(:) / znsplit
639 ple_flood(:) = zle_flood_sum(:) / znsplit
640 plei_flood(:) = zlei_flood_sum(:) / znsplit
641 !
642 pdeep_flux(:) = zdeep_flux_sum(:) / znsplit
643 pmeltadv(:) = zmeltadv_sum(:) / znsplit
644 pmelt(:) = zmelt_sum(:) / znsplit
645 prestore(:) = zrestore_sum(:) / znsplit
646 pac_agg(:) = zac_agg_sum(:) / znsplit
647 phu_agg(:) = zhu_agg_sum(:) / znsplit
648 !
649 !-------------------------------------------------------------------------------
650 !
651 IF (lhook) CALL dr_hook('ISBA_CEB',1,zhook_handle)
652 !
653 !-------------------------------------------------------------------------------
654 !
655 END SUBROUTINE isba_ceb
subroutine e_budget(HISBA, HSNOW_ISBA, OFLOOD, OTEMP_ARP, HIMPLICIT_WIND, PTSTEP, PSODELX, PUREF, PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, PVMOD, PCD, PTG, PTSM, PT2M, PSNOWALBM, PSW_RAD, PLW_RAD, PTA, PQA, PPS, PRHOA, PEXNS, PEXNA, PCPS, PLVTT, PLSTT, PVEG, PHUG, PHUI, PHV, PLEG_DELTA, PLEGI_DELTA, PEMIS, PALB, PRA, PCT, PCG, PPSN, PPSNV, PPSNG, PGRNDFLUX, PFLUX_COR, PD_G, PDZG, PDZDIF, PSOILCONDZ, PSOILHCAPZ, PALBT, PEMIST, PQSAT, PDQSAT, PFROZEN1, PTDEEP_A, PTDEEP_B, PGAMMAT, PTA_IC, PQA_IC, PUSTAR2_IC, PSNOWFREE_ALB_VEG, PPSNV_A, PSNOWFREE_ALB_SOIL, PFFG, PFFV, PFF, PFFROZEN, PFALB, PFEMIS, PDEEP_FLUX, PRESTORE)
Definition: e_budget.F90:6
subroutine isba_ceb(HISBA, HSNOW_ISBA, HCPSURF, OFLOOD, OTEMP_ARP, HIMPLICIT_WIND, PTSTEP, PSODELX, PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, PSNOWALB, PSW_RAD, PLW_RAD, PWG, PWGI, PEXNS, PEXNA, PTA, PVMOD, PQA, PRR, PSR, PPS, PRS, PVEG, PZ0_WITH_SNOW, PZ0EFF, PZ0H_WITH_SNOW, PWFC, PWSAT, PPSN, PPSNG, PPSNV, PZREF, PUREF, PDIRCOSZW, PF5, PFFG, PFFV, PFF, PFFG_NOSNOW, PFFV_NOSNOW, PWR, PRHOA, PEMIS, PALB, PCT, PCS, PCG, PD_G, PDZG, PDZDIF, PSOILCONDZ, PSOILHCAPZ, PFROZEN1, PTDEEP_A, PTDEEP_B, PGAMMAT, PPSNV_A, PSNOWFREE_ALB_VEG, PSNOWFREE_ALB_SOIL, PGRNDFLUX, PFLSN_COR, PSNOW_THRUFAL, PFFROZEN, PFALB, PFEMIS, PSNOWSWE, PSRSFC, PTG, PRESA, PLVTT, PLSTT, PCPS, PDELTA, PCH, PCD, PCDN, PRI, PHUG, PHUGI, PHV, PHU, PQS, PALBT, PEMIST, PDEEP_FLUX, PRN, PH, PLE, PLEG, PLEGI, PLEV, PLES, PLER, PLETR, PEVAP, PGFLUX, PMELTADV, PMELT, PRESTORE, PUSTAR, PLE_FLOOD, PLEI_FLOOD, PSNOWTEMP, PAC_AGG, PHU_AGG)
Definition: isba_ceb.F90:6
subroutine isba_fluxes(HISBA, HSNOW_ISBA, OTEMP_ARP, PTSTEP, PSODELX, PSW_RAD, PLW_RAD, PTA, PQA, PRHOA, PEXNS, PEXNA, PCPS, PLVTT, PLSTT, PVEG, PHUG, PHUI, PHV, PLEG_DELTA, PLEGI_DELTA, PDELTA, PRA, PF5, PRS, PCS, PCG, PCT, PSNOWSWE, PTSM, PT2M, PPSN, PPSNV, PPSNG, PFROZEN1, PALBT, PEMIST, PQSAT, PDQSAT, PSNOW_THRUFAL, PRN, PH, PLE, PLEG, PLEGI, PLEV, PLES, PLER, PLETR, PEVAP, PGFLUX, PMELTADV, PMELT, PSOILCONDZ, PD_G, PDZG, PTG, PSR, PPSNV_A, PFFG, PFFV, PFF, PFFROZEN, PLE_FLOOD, PLEI_FLOOD, PSNOWTEMP)
Definition: isba_fluxes.F90:6
subroutine drag(HISBA, HSNOW_ISBA, HCPSURF, PTSTEP, PTG, PWG, PWGI, PEXNS, PEXNA, PTA, PVMOD, PQA, PRR, PSR, PPS, PRS, PVEG, PZ0, PZ0EFF, PZ0H, PWFC, PWSAT, PPSNG, PPSNV, PZREF, PUREF, PDIRCOSZW, PDELTA, PF5, PRA, PCH, PCD, PCDN, PRI, PHUG, PHUGI, PHV, PHU, PCPS, PQS, PFFG, PFFV, PFF, PFFG_NOSNOW, PFFV_NOSNOW, PLEG_DELTA, PLEGI_DELTA, PWR, PRHOA, PLVTT, PQSAT)
Definition: drag.F90:6