SURFEX v8.1
General documentation of Surfex
garden.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 garden (DTCO, G, T, TOP, TIR, DTV, GB, DK, DEK, DMK, GDO, S, K, P, PEK, &
7  HIMPLICIT_WIND, TPTIME, PTSUN, PPEW_A_COEF, PPEW_B_COEF, &
8  PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, &
9  PTSTEP, PZREF, PTA, PQA, PEXNS, PRHOA, PCO2, PPS, PRR, &
10  PSR, PZENITH, PSW, PLW, PVMOD, PALBNIR_TVEG, &
11  PALBVIS_TVEG, PALBNIR_TSOIL, PALBVIS_TSOIL, &
12  PRN, PH, PLE, PGFLUX, PSFCO2, PEVAP, PUW, PRUNOFF, &
13  PAC, PQSAT, PTSRAD, PAC_AGG, PHU_AGG, PIRRIG )
14 ! ##########################################################################
15 !
16 !!**** *GARDEN*
17 !!
18 !! PURPOSE
19 !! -------
20 !
21 !!call the vegetation scheme (ISBA) inside TEB
22 !
23 !!** METHOD
24 ! ------
25 !
26 !
27 !! EXTERNAL
28 !! --------
29 !!
30 !!
31 !! IMPLICIT ARGUMENTS
32 !! ------------------
33 !!
34 !!
35 !! REFERENCE
36 !! ---------
37 !!
38 !!
39 !! AUTHOR
40 !! ------
41 !!
42 !! A. Lemonsu * Meteo-France *
43 !!
44 !! MODIFICATIONS
45 !! -------------
46 !! Original 05/2009
47 ! B. decharme 04/2013 : variables for surf/atm coupling
48 ! dummy for water table / surface coupling
49 !! P. Samuelsson 10/2014 Introduced dummy variables in call to ISBA for MEB
50 !-------------------------------------------------------------------------------
51 !
52 !* 0. DECLARATIONS
53 ! ------------
54 !
56 USE modd_data_isba_n, ONLY : data_isba_t
57 USE modd_sfx_grid_n, ONLY : grid_t
58 USE modd_sso_n, ONLY : sso_t, sso_init
59 USE modd_teb_n, ONLY : teb_t
61 !
62 USE modd_data_isba_n, ONLY : data_isba_t
63 USE modd_gr_biog_n, ONLY : gr_biog_t
64 !
65 USE modd_diag_n, ONLY : diag_t
68 !
69 USE modd_teb_irrig_n, ONLY : teb_irrig_t
70 !
73 !
74 USE modd_agri_n, ONLY : agri_t,agri_init
75 !
77 USE modd_surf_par, ONLY: xundef
78 USE modd_csts, ONLY: xcpd
79 !
80 !
81 USE modi_isba
82 USE modi_vegetation_update
83 USE mode_thermos
84 !
85 USE modi_flag_teb_veg_n
86 USE modi_carbon_evol
87 USE modi_vegetation_evol
88 USE modi_teb_irrig
89 !
90 USE yomhook ,ONLY : lhook, dr_hook
91 USE parkind1 ,ONLY : jprb
92 !
93 IMPLICIT NONE
94 !
95 !* 0.1 Declarations of arguments
96 !
97 !
98 !
99 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
100 TYPE(grid_t), INTENT(INOUT) :: G
101 TYPE(teb_t), INTENT(INOUT) :: T
102 TYPE(teb_options_t), INTENT(INOUT) :: TOP
103 !
104 TYPE(data_isba_t), INTENT(INOUT) :: DTV
105 TYPE(gr_biog_t), INTENT(INOUT) :: GB
106 !
107 TYPE(diag_t), INTENT(INOUT) :: DK
108 TYPE(diag_evap_isba_t), INTENT(INOUT) :: DEK
109 TYPE(diag_misc_isba_t), INTENT(INOUT) :: DMK
110 !
111 TYPE(isba_options_t), INTENT(INOUT) :: GDO
112 TYPE(isba_s_t), INTENT(INOUT) :: S
113 TYPE(isba_k_t), INTENT(INOUT) :: K
114 TYPE(isba_p_t), INTENT(INOUT) :: P
115 TYPE(isba_pe_t), INTENT(INOUT) :: PEK
116 !
117 TYPE(teb_irrig_t), INTENT(INOUT) :: TIR
118 !
119  CHARACTER(LEN=*), INTENT(IN) :: HIMPLICIT_WIND ! wind implicitation option
120 ! ! 'OLD' = direct
121 ! ! 'NEW' = Taylor serie, order 1
122 TYPE(date_time) , INTENT(IN) :: TPTIME ! current date and time from teb
123 REAL, DIMENSION(:) , INTENT(IN) :: PTSUN ! solar time (s from midnight)
124 REAL, DIMENSION(:) , INTENT(IN) :: PPEW_A_COEF ! implicit coefficients
125 REAL, DIMENSION(:) , INTENT(IN) :: PPEW_B_COEF ! for wind coupling
126 REAL, DIMENSION(:) , INTENT(IN) :: PPEQ_A_COEF ! implicit coefficients
127 REAL, DIMENSION(:) , INTENT(IN) :: PPEQ_B_COEF ! for humidity
128 REAL, DIMENSION(:) , INTENT(IN) :: PPET_A_COEF ! implicit coefficients
129 REAL, DIMENSION(:) , INTENT(IN) :: PPET_B_COEF ! for temperature
130 REAL , INTENT(IN) :: PTSTEP ! time step
131 REAL, DIMENSION(:) , INTENT(IN) :: PZREF ! height of atm. var. near the road
132 REAL, DIMENSION(:) , INTENT(IN) :: PTA ! temp. near the road
133 REAL, DIMENSION(:) , INTENT(IN) :: PQA ! hum. near the road
134 REAL, DIMENSION(:) , INTENT(IN) :: PPS ! pressure at the surface
135 REAL, DIMENSION(:) , INTENT(IN) :: PEXNS ! surface exner function
136 REAL, DIMENSION(:) , INTENT(IN) :: PRHOA ! air density at the lowest level
137 REAL, DIMENSION(:) , INTENT(IN) :: PCO2 ! CO2 concentration in the air (kg/m3)
138 REAL, DIMENSION(:) , INTENT(IN) :: PRR ! rain rate
139 REAL, DIMENSION(:) , INTENT(IN) :: PSR ! snow rate
140 REAL, DIMENSION(:) , INTENT(IN) :: PZENITH ! solar zenithal angle
141 REAL, DIMENSION(:) , INTENT(IN) :: PSW ! incoming total solar rad on an horizontal surface
142 REAL, DIMENSION(:) , INTENT(IN) :: PLW ! atmospheric infrared radiation
143 REAL, DIMENSION(:) , INTENT(IN) :: PVMOD ! wind near the road
144 REAL, DIMENSION(:) , INTENT(IN) :: PALBNIR_TVEG ! nearIR veg tot albedo
145 REAL, DIMENSION(:) , INTENT(IN) :: PALBVIS_TVEG ! visible veg tot albedo
146 REAL, DIMENSION(:) , INTENT(IN) :: PALBNIR_TSOIL ! nearIR soil tot albedo
147 REAL, DIMENSION(:) , INTENT(IN) :: PALBVIS_TSOIL ! visible soil tot albedo
148 !
149 REAL, DIMENSION(:) , INTENT(OUT) :: PRN ! net radiation over green areas
150 REAL, DIMENSION(:) , INTENT(OUT) :: PH ! sensible heat flux over green areas
151 REAL, DIMENSION(:) , INTENT(OUT) :: PLE ! latent heat flux over green areas
152 REAL, DIMENSION(:) , INTENT(OUT) :: PGFLUX ! flux through the green areas
153 REAL, DIMENSION(:) , INTENT(OUT) :: PSFCO2 ! flux of CO2 positive toward the atmosphere (m/s*kg_CO2/kg_air)
154 REAL, DIMENSION(:) , INTENT(OUT) :: PEVAP ! total evaporation over gardens (kg/m2/s)
155 REAL, DIMENSION(:) , INTENT(OUT) :: PUW ! friction flux (m2/s2)
156 REAL, DIMENSION(:) , INTENT(OUT) :: PRUNOFF ! runoff over garden (kg/m2/s)
157 REAL, DIMENSION(:) , INTENT(OUT) :: PAC ! aerodynamical conductance
158 REAL, DIMENSION(:) , INTENT(OUT) :: PQSAT ! saturation humidity
159 REAL, DIMENSION(:) , INTENT(OUT) :: PTSRAD ! garden radiative surface temp. (snow free)
160 REAL, DIMENSION(:) , INTENT(OUT) :: PAC_AGG ! aggreg. aeodynamic resistance for green areas for latent heat flux
161 REAL, DIMENSION(:) , INTENT(OUT) :: PHU_AGG ! aggreg. relative humidity for green areas for latent heat flux
162 REAL, DIMENSION(:) , INTENT(OUT) :: PIRRIG ! garden summer irrigation rate
163 !
164 !
165 !* 0.2 Declarations of local variables
166 !
167 TYPE(sso_t) :: YSS
168 TYPE(agri_t) :: YAG
169 !
170 REAL, DIMENSION(SIZE(PPS)) :: ZDIRCOSZW ! orography slope cosine (=1 in TEB)
171 REAL, DIMENSION(SIZE(PPS),GDO%NNBIOMASS) :: ZRESP_BIOMASS_INST ! instantaneous biomass respiration (kgCO2/kgair m/s)
172 REAL, DIMENSION(SIZE(PPS)) :: ZUSTAR
173 !
174 ! temperatures
175 !
176 REAL, DIMENSION(SIZE(PPS)) :: ZTA ! estimate of air temperature at future time
177 ! ! step as if modified by ISBA flux alone.
178 REAL, DIMENSION(SIZE(PPS)) :: ZDEEP_FLUX ! heat flux at base of the deep soil
179 !
180 ! surfaces relative fractions
181 ! for flood
182 REAL, DIMENSION(SIZE(PPS)) :: ZEMISF
183 !
184 ! variables for deep soil temperature
185 REAL, DIMENSION(SIZE(PPS)) :: ZTDEEP_A
186 !
187 ! Dummy variables for MEB:
188 REAL, DIMENSION(SIZE(PPS)) :: ZP_MEB_SCA_SW, ZPALPHAN, ZZ0G_WITHOUT_SNOW, &
189  ZZ0_MEBV, ZZ0H_MEBV, ZZ0EFF_MEBV, ZZ0_MEBN, &
190  ZZ0H_MEBN, ZZ0EFF_MEBN
191 INTEGER :: ILU
192 LOGICAL :: GMASK, GALB
193 LOGICAL :: GUPDATED
194 !
195 REAL(KIND=JPRB) :: ZHOOK_HANDLE
196 !
197 !-------------------------------------------------------------------------------
198 !
199 !* 1. various initialisations
200 ! -----------------------
201 !
202 IF (lhook) CALL dr_hook('GARDEN',0,zhook_handle)
203 ilu = SIZE(pps)
204 !
205 zdircoszw = 1.
206 !
207  CALL sso_init(yss)
208 !
209  CALL agri_init(yag)
210 !
211 !-------------------------------------------------------------------------------
212 !
213 !* 2. Treatment of green areas
214 ! ------------------------
215 !* 2.1 Automatic irrigation
216 ! --------------------
217 !
218  CALL teb_irrig(tir%LPAR_GD_IRRIG, ptstep, tptime%TDATE%MONTH, ptsun, &
219  tir%XGD_START_MONTH, tir%XGD_END_MONTH, tir%XGD_START_HOUR, &
220  tir%XGD_END_HOUR, tir%XGD_24H_IRRIG, pirrig )
221 !
222 ! --------------------------------------------------------------------------------------
223 ! Vegetation update (in case of non-interactive vegetation):
224 ! --------------------------------------------------------------------------------------
225 !
226 s%TTIME = tptime
227 !
228 gupdated=.false.
229 galb = .false.
230 IF (gdo%CPHOTO=='NIT'.OR.gdo%CPHOTO=='NCB') galb = .true.
231 !
232  CALL vegetation_update(dtco, dtv, g%NDIM, gdo, k, p, pek, 1, &
233  ptstep, s%TTIME, top%XCOVER, top%LCOVER, .false., &
234  'GRD', galb, yss, gupdated, oabsent=(t%XGARDEN==0.) )
235 !
236 !
237 dk%XZ0 (:) = pek%XZ0(:)
238 dk%XZ0H(:) = pek%XZ0(:) / p%XZ0_O_Z0H(:)
239 !
240 dk%XZ0EFF(:) = pek%XZ0(:)
241 !
242 !* 2.2 Call ISBA for green areas
243 ! -------------------------
244 !
245 ALLOCATE(gb%XIACAN(SIZE(pps),SIZE(s%XABC)))
246 !
247  CALL isba(gdo, k, p, pek, g, yag, dk, dek, dmk, &
248  tptime, s%XPOI, s%XABC, gb%XIACAN, .false., ptstep, &
249  himplicit_wind, pzref, pzref, zdircoszw, pta, pqa, pexns, prhoa, pps, &
250  pexns, prr, psr, pzenith, zp_meb_sca_sw, psw, plw, pvmod, ppew_a_coef, &
251  ppew_b_coef, ppet_a_coef, ppeq_a_coef, ppet_b_coef, ppeq_b_coef, &
252  palbnir_tveg, palbvis_tveg, palbnir_tsoil, palbvis_tsoil, zpalphan, &
253  zz0g_without_snow, zz0_mebv, zz0h_mebv, zz0eff_mebv, zz0_mebn, &
254  zz0h_mebn, zz0eff_mebn, ztdeep_a, pco2, k%XFFG(:), k%XFFV(:), &
255  zemisf, zustar, pac_agg, phu_agg, zresp_biomass_inst, zdeep_flux, pirrig )
256 !
257 IF (pek%TSNOW%SCHEME=='3-L' .OR. pek%TSNOW%SCHEME=='CRO') pek%TSNOW%TS(:)= dmk%XSNOWTEMP(:,1)
258 !
259 IF (gdo%LTR_ML) THEN
260  gmask = ( tptime%TIME - ptstep < 0. ) .AND. ( tptime%TIME >= 0. )
261  IF (gmask) THEN
262  ALLOCATE(dmk%XDFAPARC(ilu),dmk%XDFAPIRC(ilu),dmk%XDLAI_EFFC(ilu))
263  dmk%XDFAPARC (:) = pek%XFAPARC (:) / pek%XMUS (:)
264  dmk%XDFAPIRC (:) = pek%XFAPIRC (:) / pek%XMUS (:)
265  dmk%XDLAI_EFFC(:) = pek%XLAI_EFFC (:) / pek%XMUS (:)
266  ENDIF
267 ENDIF
268 !
269 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
270 ! Vegetation evolution for interactive LAI
271 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
272 !
273 IF (gdo%CPHOTO=='NIT') THEN
274  CALL vegetation_evol(gdo, dtv, p, pek, .false., ptstep, tptime%TDATE%MONTH, tptime%TDATE%DAY, &
275  tptime%TIME, g%XLAT, prhoa, pco2, yss, zresp_biomass_inst )
276 END IF
277 !
278 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
279 ! Diagnostic of respiration carbon fluxes and soil carbon evolution
280 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
281 !
282 psfco2(:) = 0.
283 dek%XRESP_ECO (:) = 0.
284 dek%XRESP_AUTO(:) = 0.
285 !
286 IF (gdo%CPHOTO/='NON' .AND. gdo%CRESPSL/='NON' .AND. any(pek%XLAI(:)/=xundef)) THEN
287  CALL carbon_evol(gdo, k, p, pek, dek, ptstep, prhoa, zresp_biomass_inst )
288  ! calculation of vegetation CO2 flux
289  psfco2(:) = - dek%XGPP(:) + dek%XRESP_ECO(:)
290 END IF
291 !
292 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
293 !
294 !* 4. Set undefined values for points where there is no garden
295 ! --------------------------------------------------------
296 !
297 ! This way, these points are clearly flaged, and one will not try to interpret
298 ! the values for those points
299 !
300  CALL flag_teb_veg_n(pek, gdo, t%XGARDEN, 2)
301 !
302 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
303 !
304 !* 9. Fields required for TEB
305 ! -----------------------
306 !
307 WHERE (t%XGARDEN/=0.)
308  !
309  ! energy balance
310  !
311  dk%XLE(:) = pek%XLE(:)
312  !
313  ! Estimate of green area aerodynamic conductance recomputed from heat flux,
314  ! surface (radiative) temp. and forcing air temperature (estimated at future time step)
315  zta = ppet_b_coef + ppet_a_coef * dk%XH
316  pac = 0.
317  WHERE (dk%XTSRAD /= zta)
318  pac(:) = max(dk%XH(:) / xcpd / prhoa(:) / (dk%XTSRAD - zta) , 0.)
319  ENDWHERE
320  !
321  ! Humidity of saturation for green areas
322  pqsat(:) = qsat(pek%XTG(:,1),pps(:))
323  !
324  !* friction flux
325  puw(:) = -zustar(:)**2
326  !
327 ELSEWHERE
328  !
329  dk%XRN (:) = xundef
330  dk%XH (:) = xundef
331  dk%XLE (:) = xundef
332  dk%XGFLUX (:) = xundef
333  dk%XEVAP (:) = xundef
334  dek%XRUNOFF(:) = xundef
335  !
336  pac(:) = xundef
337  pqsat(:) = xundef
338  puw(:) = xundef
339  !
340 END WHERE
341 !
342 !
343 ptsrad(:) = dk%XTSRAD(:)
344 !
345 prn(:) = dk%XRN (:)
346 ph(:) = dk%XH (:)
347 ple(:) = dk%XLE (:)
348 pgflux(:) = dk%XGFLUX (:)
349 pevap(:) = dk%XEVAP (:)
350 prunoff(:) =dek%XRUNOFF(:)
351 !
352 IF (lhook) CALL dr_hook('GARDEN',1,zhook_handle)
353 !
354 !-------------------------------------------------------------------------------
355 !
356 !
357 END SUBROUTINE garden
real, save xcpd
Definition: modd_csts.F90:63
subroutine agri_init(AG)
Definition: modd_agrin.F90:67
subroutine sso_init(YSSO)
Definition: modd_sson.F90:103
subroutine vegetation_evol(IO, DTI, PK, PEK, OAGRIP, PTSTEP, KMONTH, KDAY, PTIME, PLAT, PRHOA, P_CO2, ISSK, PRESP_BIOMASS_INST, PSWDIR)
subroutine flag_teb_veg_n(PEK, IO, PMASK, KFLAG)
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine garden(DTCO, G, T, TOP, TIR, DTV, GB, DK, DEK, DMK, GDO, S, K, P, PEK, HIMPLICIT_WIND, TPTIME, PTSUN, PPEW_A_COEF, PPEW_B_COEF, PPET_A_COEF, PPEQ_A_COEF, PPET_B_COEF, PPEQ_B_COEF, PTSTEP, PZREF, PTA, PQA, PEXNS, PRHOA, PCO2, PPS, PRR, PSR, PZENITH, PSW, PLW, PVMOD, PALBNIR_TVEG, PALBVIS_TVEG, PALBNIR_TSOIL, PALBVIS_TSOIL, PRN, PH, PLE, PGFLUX, PSFCO2, PEVAP, PUW, PRUNOFF, PAC, PQSAT, PTSRAD, PAC_AGG, PHU_AGG, PIRRIG)
Definition: garden.F90:14
subroutine vegetation_update(DTCO, DTV, KDIM, IO, KK, PK, PEK, KPATCH, PTSTEP, TTIME, PCOVER, OCOVER, OAGRIP, HSFTYPE, OALB, ISSK, ODUPDATED, OABSENT)
subroutine isba(IO, KK, PK, PEK, G, AG, DK, DEK, DMK, TPTIME, PPOI
Definition: isba.F90:7
subroutine teb_irrig(OIRRIG, PTSTEP, KMONTH, PSOLAR_TIME, PSTART_MONTH, PEND_MONTH, PSTART_HOUR, PEND_HOUR, P24H_IRRIG, PIRRIG)
Definition: teb_irrig.F90:9
subroutine carbon_evol(IO, KK, PK, PEK, DEK, PTSTEP, PRHOA, PRESP_BIOMASS_INST)
Definition: carbon_evol.F90:7