SURFEX v8.1
General documentation of Surfex
ch_dep_isba.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 ch_dep_isba(KK, PK, PEK, D, DM, CHIK, PUSTAR, PTA, PPA, PTRAD, KSIZE )
7 !###########################################################
8 !!
9 !! PURPOSE
10 !! -------
11 !!
12 !! Compute dry deposition velocity for chemical species on nature area
13 !!
14 !! AUTHOR
15 !! ------
16 !! P.Tulet * Laboratoire d'Aerologie*
17 !!
18 !! MODIFICATIONS
19 !! -------------
20 !! Original 20/02/97
21 !! Modification 21/07/00 (Guenais/Tulet) add deposition on town and
22 !! vegetation class
23 !! Modification 18/01/01 (Solmon/Tulet) patch dry deposition
24 !! Modification 18/07/03 (Tulet) surface externalization
25 !! Modification 01/2004 (Tulet Masson) removes patch calculation
26 !! Modification 03/2006 (Le Moigne) pb in where test with some
27 !! compilation options
28 !!
29 !-------------------------------------------------------------------------------
30 !
31 !* 0. DECLARATIONS
32 ! ------------
33 !
34 USE modd_diag_n, ONLY : diag_t
37 USE modd_ch_isba_n, ONLY : ch_isba_t
38 !
39 USE modd_data_cover_par, ONLY : nvt_no, nvt_rock
40 !
41 USE modd_isba_par
42 USE modd_data_cover_par
43 USE modd_csts
46 !
47 USE modd_ch_surf
48 USE modd_surf_par, ONLY: xundef
49 !
50 USE yomhook ,ONLY : lhook, dr_hook
51 USE parkind1 ,ONLY : jprb
52 !
53 IMPLICIT NONE
54 !
55 !* 0.1 Declarations of dummy arguments :
56 !
57 TYPE(isba_k_t), INTENT(INOUT) :: KK
58 TYPE(isba_p_t), INTENT(INOUT) :: PK
59 TYPE(isba_pe_t), INTENT(INOUT) :: PEK
60 TYPE(ch_isba_t), INTENT(INOUT) :: CHIK
61 
62 TYPE(diag_t), INTENT(INOUT) :: D
63 TYPE(diag_misc_isba_t), INTENT(INOUT) :: DM
64 !
65 REAL, DIMENSION(:), INTENT(IN) :: PUSTAR ! friction velocity
66 REAL, DIMENSION(:), INTENT(IN) :: PTA ! air temperature forcing (K)
67 REAL, DIMENSION(:), INTENT(IN) :: PPA ! surface atmospheric pressure
68 REAL, DIMENSION(:), INTENT(IN) :: PTRAD ! radiative temperature (K)
69 !
70 INTEGER, INTENT(IN) :: KSIZE
71 !
72 !* 0.2 Declarations of local variables :
73 !
74 REAL , DIMENSION(SIZE(PTRAD),KSIZE) :: ZDIFFMOLVAL
75 ! Molecular diffusivity
76 REAL , DIMENSION(SIZE(PTRAD),KSIZE) :: ZSCMDT
77 ! Sc(:)hmidt number
78 REAL , DIMENSION(SIZE(PTRAD),KSIZE) :: ZNATRB
79 ! nature quasi-laminar resistances
80 !
81 REAL , DIMENSION(SIZE(PTRAD),KSIZE) :: ZHENRYVALCOR
82 REAL , DIMENSION(SIZE(PTRAD),KSIZE) :: ZSTOMRC
83 ! stomatal surface resistance
84 REAL , DIMENSION(SIZE(PTRAD),KSIZE) :: ZMESORC
85 ! mesophyl resistance
86 REAL , DIMENSION(SIZE(PTRAD),KSIZE) :: ZEXTRC
87 ! leaf uptake external surface resistance
88 !
89 REAL , DIMENSION(SIZE(PTRAD),KSIZE) :: ZSOILRC
90 ! bare soil surface resistance
91 REAL , DIMENSION(SIZE(PTRAD),KSIZE) :: ZNATRC
92 ! nature surface resistances where vegetation is
93 REAL , DIMENSION(SIZE(PTRAD),KSIZE) :: ZSNOWRC
94 ! snow surface resistance
95 REAL , DIMENSION(SIZE(PTRAD),KSIZE) :: ZCLAYRC
96 ! clay surface resistance
97 REAL , DIMENSION(SIZE(PTRAD),KSIZE) :: ZSANDRC
98 ! sand surface resistance
99 REAL , DIMENSION(SIZE(PTRAD),KSIZE) :: ZBARERC
100 ! nature surface resistances for bare soils
101 REAL , DIMENSION(SIZE(PTRAD),KSIZE) :: ZROCKRC
102 ! nature surface resistances for rocks
103 !
104 REAL , DIMENSION(SIZE(PTRAD),KSIZE) :: ZRES_VEGTYPE
105 REAL , DIMENSION(SIZE(PTRAD),KSIZE) :: ZRES_SNOWTYPE
106 !
107 ! final nature resistance by vegtype
108 REAL, DIMENSION(SIZE(PTRAD)) :: ZTYPE1_SAND, ZTYPE1_CLAY, ZTYPE1_SNOW ! Type soil 1
109 REAL, DIMENSION(SIZE(PTRAD)) :: ZUSTAR
110 REAL, DIMENSION(SIZE(PTRAD)) :: ZDIFFMOLH2O
111 ! final nature resistance
112 REAL, DIMENSION(SIZE(PTRAD)) :: ZLANDEXT
113 ! computed Rext from Wesely tabulations (89)
114 REAL, DIMENSION(SIZE(PTRAD)) :: ZINCRC
115 ! in-canopy transport resistance
116 REAL, DIMENSION(SIZE(PTRAD)) :: ZCOEF1, ZCOEF2, ZCOEF3, ZCOEF4, ZCOEF5, ZINV1, ZINV2
117 REAL, DIMENSION(SIZE(PTRAD)) :: ZTCOR
118 !
119 REAL, DIMENSION(KSIZE) :: ZVAR1, ZVAR2, ZFACT1
120 !
121 REAL :: ZTYPE2_SAND, ZTYPE2_CLAY, ZTYPE2_SNOW ! Type soil 2
122 !
123 INTEGER :: JSV, JI
124 !
125 REAL(KIND=JPRB) :: ZHOOK_HANDLE
126 !
127 !============================================================================
128 !
129 ! Primilary
130 ! ---------
131 !Default values
132 !--------------
133 !
134 IF (lhook) CALL dr_hook('CH_DEP_ISBA',0,zhook_handle)
135 !
136 ! Default type soil
137 ! TYPE1 = RCCLAY(SO2) = 1000
138 ! TYPE2 = RCCLAY(O3) = 100
139 IF (xrcclayo3.NE.xundef) THEN
140  ztype2_clay = xrcclayo3
141 ELSE
142  ztype2_clay = 100.
143 ENDIF
144 !
145 ! TYPE1 = RCSAND(SO2) = 1000
146 ! TYPE2 = RCSAND(O3) = 200
147 IF (xrcsando3.NE.xundef) THEN
148  ztype2_sand = xrcsando3
149 ELSE
150  ztype2_sand = 200.
151 ENDIF
152 !
153 ! TYPE1 = RCSNOW(SO2)
154 ! TYPE2 = RCSNOW(O3)
155 IF (xrcsnowo3 /=xundef) THEN
156  ztype2_snow = xrcsnowo3
157 ELSE
158  ztype2_snow = 2000.
159 ENDIF
160 !
161 DO ji = 1, SIZE(pek%XVEG)
162  !
163  IF (xrcclayso2.NE.xundef) THEN
164  ztype1_clay(ji) = xrcclayso2
165  ELSE
166  ztype1_clay(ji) = 1000.
167  ENDIF
168  !
169  IF (xrcsandso2.NE.xundef) THEN
170  ztype1_sand(ji) = xrcsandso2
171  ELSE
172  ztype1_sand(ji) = 1000.
173  ENDIF
174  !
175  IF (xrcsnowso2/=xundef) THEN
176  ztype1_snow(ji) = xrcsnowso2
177  ELSEIF (ptrad(ji) > 275.) THEN
178  ztype1_snow(ji) = 540.
179  ELSE
180  ztype1_snow(ji) = 70. * (275. - ptrad(ji))
181  ENDIF
182  !
183  !
184  zustar(ji) = max(pustar(ji), 1e-9)
185  !
186  zcoef5(ji) = 1./(xkarman*zustar(ji))
187  !
188  ! 3.2.5 In-canopy transport resistance
189  ! ------------------------------
190  !
191  IF (pek%XVEG(ji) > 0.) THEN
192  zincrc(ji) = 14. * pek%XLAI(ji) * 4. * pek%XZ0(ji) / zustar(ji)
193  ELSE
194  zincrc(ji) = 1e-4
195  ENDIF
196  !
197  !
198  ! computed Rext from Wesely tabulations (89)
199  !
200  IF ( xlandrext.NE.xundef ) THEN
201  ! user value
202  zlandext(ji) = xlandrext
203  ELSEIF (pek%XLAI(ji) /= xundef) THEN
204  ! computed value
205  zlandext(ji) = 6000. - 4000. * tanh( 1.6 * (pek%XLAI(ji) - 1.6) )
206  ELSE
207  zlandext(ji) = 9999.
208  END IF
209  !
210  !
211  zcoef1(ji) = 1./298. - 1./pta(ji)
212  !
213  zdiffmolh2o(ji) = 2.22e-05 + 1.46e-07 * (pta(ji) * (ppa(ji)/xp00)**(xrd/xcpd) - 273.)
214  zcoef2(ji) = dm%XRS(ji) * zdiffmolh2o(ji)
215  !
216  zcoef3(ji) = 1./zlandext(ji)
217  !
218  IF ( ptrad(ji) < 271.) THEN
219  zcoef4(ji) = 1000. * exp(-ptrad(ji) + 269.)
220  ELSE
221  zcoef4(ji) = 0.
222  ENDIF
223  !
224  ztcor(ji) = min(2.5e3, zcoef4(ji))
225  !
226  !
227  zinv1(ji) = 1.e-5/chik%XSOILRC_SO2(ji)
228  !
229  zinv2(ji) = 1./chik%XSOILRC_O3(ji)
230  !
231 ENDDO
232 !
233 !
234 DO jsv = 1, ksize
235  !
236  zvar1(jsv) = xsrealreactval(jsv) / 3000.
237  zvar2(jsv) = xsrealreactval(jsv) * 100.
238  !
239  zfact1(jsv) = 1.46e-07 * sqrt(18. / xsrealmassmolval(jsv))
240  !
241 ENDDO
242 !
243 !============================================================================
244 !
245 DO jsv = 1, ksize
246  !
247  DO ji = 1, SIZE(pta)
248  !
249  ! 2.0 Quasi-laminar resistance
250  ! ------------------------
251  !
252  ! compute molecular diffusivity for each species (Langevin, 1905)
253  ! ----------------------------------------------
254  !
255  zdiffmolval(ji,jsv) = 2.22e-05 + (pta(ji) - 273.0) * zfact1(jsv)
256  !
257  ! computation of Rb for each cover type
258  ! -------------------------------------
259  !
260  zscmdt(ji,jsv) = 0.15e-4 / zdiffmolval(ji,jsv)
261  znatrb(ji,jsv) = ((zscmdt(ji,jsv)/0.72)**(2./3.)) * zcoef5(ji)
262  !
263  IF (pek%XLAI(ji)/=xundef) znatrb(ji,jsv) = 2. * znatrb(ji,jsv)
264  !
265  ENDDO
266  !
267 ENDDO
268 !
269 DO jsv = 1, ksize
270  !
271  DO ji = 1, SIZE(pta)
272  !
273  !============================================================================
274  !
275  ! 3.0 Surface resistance on NATURE
276  ! --------------------------------
277  !
278  ! 3.0.1 Stomatal resistance
279  ! -------------------
280  !
281  !ZEXTRC_O3(:) = 1./(1./(3.*ZLANDEXT(:) + 1./3000.))
282  !
283  zhenryvalcor(ji,jsv) = xsrealhenryval(jsv,1) * exp(xsrealhenryval(jsv,2) * zcoef1(ji))
284  !
285  IF (dm%XRS(ji)>0.) THEN
286  !
287  zstomrc(ji,jsv) = zcoef2(ji) / zdiffmolval(ji,jsv)
288  !
289  ! 3.2.2 Mesophyl resistance
290  ! -------------------
291  !
292  zmesorc(ji,jsv) = 1. / ( zhenryvalcor(ji,jsv)/3000. + zvar2(jsv) )
293  !
294  ELSE
295  !
296  zstomrc(ji,jsv) = 9999.
297  !
298  zmesorc(ji,jsv) = 9999.
299  !
300  ENDIF
301  !
302  ! 3.2.4 External leaf uptake resistance (Wesely, 1989)
303  ! -------------------------------
304  !
305  IF (d%XHU(ji) >= 1.) THEN ! for dew-wetted surface
306  !
307  ! compute Rext for any species exept O3
308  ! taking acount of (Walmsley, Wesely, 95, technical note, Atm Env vol 30)
309  zextrc(ji,jsv) = 1./( zcoef3(ji) + 1.0e-7*zhenryvalcor(ji,jsv) + zvar1(jsv) )
310  !
311  ELSEIF ( dm%XRS(ji) > 0. ) THEN
312  !
313  zextrc(ji,jsv) = zlandext(ji) / ( 1.0e-5 * zhenryvalcor(ji,jsv) + xsrealreactval(jsv) )
314  !
315  ELSE
316  !
317  zextrc(ji,jsv) = 9999.
318  !
319  ENDIF
320  !
321  ! Temperature correction
322  ! ----------------------
323  !
324  zextrc(ji,jsv) = zextrc(ji,jsv) + zcoef4(ji)
325  !
326  ENDDO
327  !
328 ENDDO
329 !
330 DO jsv = 1, ksize
331  !
332  DO ji = 1, SIZE(pta)
333  !
334  ! 3.2.6 Surface resistance on soil under veg
335  ! -------------------------------------
336  !
337  zsoilrc(ji,jsv) = 1. / ( zhenryvalcor(ji,jsv)*zinv1(ji) + xsrealreactval(jsv)*zinv2(ji) )
338  !
339  IF ( zstomrc(ji,jsv)>0. .AND. zincrc(ji)>0. .AND. zextrc(ji,jsv)>0. ) THEN
340  !
341  ! 3.2.7 Compute surface resistance on vegetation
342  ! -----------------------------------------
343  !
344  znatrc(ji,jsv) = 1./ &
345  ( 1./(zstomrc(ji,jsv)+zmesorc(ji,jsv)) + 1./(zincrc(ji)+zsoilrc(ji,jsv)) + 1./zextrc(ji,jsv) )
346  !
347  ELSE
348  znatrc(ji,jsv) = 1.e-4
349  ENDIF
350  !
351  ! 3.3 Surface resistance on NATURE with NO VEG (bare soil, rock, snow)
352  ! -----------------------------------------------------------------
353  !
354  ! 3.3.1 Surface resistance on clay
355  ! ---------------------------
356  !
357  zclayrc(ji,jsv) = ( 1.e5 * ztype1_clay(ji) * ztype2_clay ) / &
358  ( zhenryvalcor(ji,jsv)*ztype2_clay + ztype1_clay(ji)*1.e5*xsrealreactval(jsv) )
359  !
360  ! 3.3.2 Surface resistance on sand
361  ! ---------------------------
362  !
363  zsandrc(ji,jsv) = ( 1.e5 * ztype1_sand(ji) * ztype2_sand ) / &
364  ( zhenryvalcor(ji,jsv)*ztype2_sand + ztype1_sand(ji)*1.e5*xsrealreactval(jsv) )
365  !
366  ! 3.3.3 Compute surface resistance on bare soil
367  ! ---------------------------------------
368  !
369  zbarerc(ji,jsv) = 1./ ( kk%XSAND(ji,1)/zsandrc(ji,jsv) + (1.-kk%XSAND(ji,1))/zclayrc(ji,jsv) )
370  !
371  ! 3.3.4 Surface temperature correction
372  ! ------------------------------
373  !
374  zbarerc(ji,jsv) = zbarerc(ji,jsv) + ztcor(ji)
375  !
376  ! 3.3.5 Compute surface resistance on ROCK AREA
377  ! ---------------------------------------
378  !
379  zrockrc(ji,jsv) = ( 1.e5 * chik%XSOILRC_SO2(ji) * chik%XSOILRC_O3(ji) ) / &
380  (zhenryvalcor(ji,jsv)*chik%XSOILRC_O3(ji) + chik%XSOILRC_SO2(ji)*1.e5*xsrealreactval(jsv) )
381  !
382  ! 3.3.6 Surface temperature correction
383  ! ------------------------------
384  !
385  zrockrc(ji,jsv) = zrockrc(ji,jsv) + ztcor(ji)
386  !
387  ! 3.4 Surface resistance on snow
388  ! ----------------------------------
389  !
390  ! 3.4.1 Compute surface resistance on snow
391  ! ----------------------------------
392  !
393  zsnowrc(ji,jsv) = ( 1.e5 * ztype1_snow(ji) * ztype2_snow ) / &
394  ( zhenryvalcor(ji,jsv)*ztype2_snow + ztype1_snow(ji)*1.e5*xsrealreactval(jsv) )
395  !
396  ! 3.4.2 Surface temperature correction
397  ! ------------------------------
398  !
399  zsnowrc(ji,jsv) = zsnowrc(ji,jsv) + ztcor(ji)
400  !
401  ! 3.5 Surface resistance on snow (eternal or explicit)
402  ! --------------------------------------------
403  !
404  ! add rocks into bare soil resistance computation, when present
405  IF ( pk%XVEGTYPE_PATCH(ji,nvt_rock)>0. ) THEN
406  zbarerc(ji,jsv) = ( pk%XVEGTYPE_PATCH(ji,nvt_no)+pk%XVEGTYPE_PATCH(ji,nvt_rock) ) / &
407  ( pk%XVEGTYPE_PATCH(ji,nvt_no)/zbarerc(ji,jsv) + pk%XVEGTYPE_PATCH(ji,nvt_rock)/zrockrc(ji,jsv) )
408  ENDIF
409  !
410  ! computes resistance due to soil and vegetation
411  znatrc(ji,jsv) = 1./ ( pek%XVEG(ji)/znatrc(ji,jsv) + (1.-pek%XVEG(ji))/zbarerc(ji,jsv) )
412  !
413  ENDDO
414  !
415 ENDDO
416 !
417 DO jsv = 1, ksize
418  !
419  DO ji = 1, SIZE(pta)
420  !
421  !---------------------------------------------------------------------
422  !
423  ! 4.0 Compute nature resistance
424  ! --------------------------
425  !
426  zres_vegtype(ji,jsv) = pek%XRESA(ji) + znatrb(ji,jsv) + znatrc(ji,jsv)
427  zres_snowtype(ji,jsv) = pek%XRESA(ji) + znatrb(ji,jsv) + zsnowrc(ji,jsv)
428  !
429  chik%XDEP(ji,jsv) = ( 1-pek%XPSN(ji) )/zres_vegtype(ji,jsv) + pek%XPSN(ji)/zres_snowtype(ji,jsv)
430  !
431  ENDDO
432  !
433 ENDDO
434 !
435 IF (lhook) CALL dr_hook('CH_DEP_ISBA',1,zhook_handle)
436 !
437 !---------------------------------------------------------------------
438 !
439 END SUBROUTINE ch_dep_isba
real, dimension(:), allocatable, save xsrealreactval
real, save xcpd
Definition: modd_csts.F90:63
real, save xrcsnowso2
real, save xrcsando3
real, save xrcsandso2
subroutine ch_dep_isba(KK, PK, PEK, D, DM, CHIK, PUSTAR, PTA, PPA, PTRAD, KSIZE)
Definition: ch_dep_isba.F90:7
real, save xkarman
Definition: modd_csts.F90:48
real, parameter xundef
real, save xrd
Definition: modd_csts.F90:62
integer, parameter jprb
Definition: parkind1.F90:32
real, save xlandrext
real, dimension(:,:), allocatable, save xsrealhenryval
real, save xrcclayso2
logical lhook
Definition: yomhook.F90:15
real, dimension(:), allocatable, save xsrealmassmolval
real, save xrcclayo3
real, save xrcsnowo3
real, save xp00
Definition: modd_csts.F90:57