SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
dslt_dep.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 dslt_dep (PSVT, PFSVT, PUSTAR, PRESA, PTA, PRHODREF, &
7  pemissig, pemisradius, kpmode, pdensity, pmolarweight, &
8  pconvertfacm0, pconvertfacm6, pconvertfacm3, &
9  ovarsig, orgfix, hvermod )
10 !###########################################################
11 !!
12 !! PURPOSE
13 !! -------
14 !!
15 !! Compute dry deposition velocity for dust species
16 !!
17 !! AUTHOR
18 !! ------
19 !! P.Tulet * CNRM *
20 !!
21 !! MODIFICATIONS
22 !! -------------
23 !! Original 20/02/05
24 !! J.Escobar 06/2013 for REAL4/8 add EPSILON management
25 !!
26 !-------------------------------------------------------------------------------
27 !
28 !* 0. DECLARATIONS
29 ! ------------
30 !
31 USE modd_csts, ONLY : xpi, xavogadro, xg
32 !
34 USE modi_dslt_velgrav1d
35 !
36 USE yomhook ,ONLY : lhook, dr_hook
37 USE parkind1 ,ONLY : jprb
38 USE modd_surf_par , ONLY : xsurf_tiny
39 !
40 IMPLICIT NONE
41 !
42 !* 0.1 Declarations of dummy arguments :
43 !
44 REAL, DIMENSION(:,:), INTENT(IN) :: psvt ! friction velocity
45 REAL, DIMENSION(:,:), INTENT(INOUT) :: pfsvt ! flux
46 REAL, DIMENSION(:), INTENT(IN) :: pustar ! friction velocity
47 REAL, DIMENSION(:), INTENT(IN) :: presa ! aerodynamical resistance
48 REAL, DIMENSION(:), INTENT(IN) :: pta ! ait temperature
49 REAL, DIMENSION(:), INTENT(IN) :: prhodref ! air density
50 REAL, DIMENSION(:), INTENT(IN) :: pemissig
51 REAL, DIMENSION(:), INTENT(IN) :: pemisradius
52 INTEGER, INTENT(IN) :: kpmode
53 REAL, INTENT(IN) :: pdensity
54 REAL, INTENT(IN) :: pmolarweight
55 REAL, INTENT(OUT) :: pconvertfacm0
56 REAL, INTENT(OUT) :: pconvertfacm6
57 REAL, INTENT(OUT) :: pconvertfacm3
58 LOGICAL, INTENT(IN) :: ovarsig
59 LOGICAL, INTENT(IN) :: orgfix
60  CHARACTER(LEN=6), INTENT(IN) :: hvermod
61 !
62 !* 0.2 Declarations of local variables :
63 !
64 REAL , DIMENSION(SIZE(PSVT,1), KPMODE) :: zsig, zrg, zvg, zdg
65 REAL , DIMENSION(SIZE(PSVT,1), KPMODE) :: zstn ! Stockes number
66 REAL , DIMENSION(SIZE(PSVT,1), KPMODE) :: zsc ! Schmidt number
67 REAL , DIMENSION(SIZE(PSVT,1), KPMODE) :: zrd ! surface resistance
68 REAL , DIMENSION(SIZE(PSVT,1), KPMODE*3) :: zvgk, zdpk
69 REAL , DIMENSION(SIZE(PSVT,1), KPMODE*3) :: zvd ! [m/s] dry deposition velocity
70 REAL , DIMENSION(SIZE(PSVT,1), SIZE(PSVT,2)) :: zsvt
71 REAL , DIMENSION(SIZE(PSVT,1)) :: zustar, zresa
72 REAL , DIMENSION(SIZE(PSVT,1)) :: znu
73 REAL , DIMENSION(SIZE(PSVT,1)) :: zmu
74 INTEGER,DIMENSION(KPMODE) :: nm0 ! [idx] index for Mode 0 in passed variables
75 INTEGER,DIMENSION(KPMODE) :: nm3 ! [idx] indexes for Mode 3 in passed variables
76 INTEGER,DIMENSION(KPMODE) :: nm6 ! [idx] indexes for Mode 6 in passed variables
77 INTEGER :: jn, j0
78 REAL(KIND=JPRB) :: zhook_handle
79 !
80 !============================================================================
81 !
82 ! Primilary
83 ! ---------
84 !Default values
85 !--------------
86 ! Cf Ackermann (all to black carbon except water)
87 IF (lhook) CALL dr_hook('DSLT_DEP',0,zhook_handle)
88 !
89 zustar(:) = max(pustar(:), 1.e-20)
90 zresa(:) = min(max(presa(:), 1.e-20), 9999.)
91 ! Save scalars in local array
92 zsvt(:,:) = max(psvt(:,:), xsurf_tiny)
93 !
94 zmu(:) = 0.
95 zvgk(:,:) = 0.
96 zvg(:,:) = 0.
97 zdpk(:,:) = 0.
98 !
99 IF (ovarsig) THEN
100  DO jn=1,kpmode
101  nm0(jn) = 1+(jn-1)*3
102  nm3(jn) = 2+(jn-1)*3
103  nm6(jn) = 3+(jn-1)*3
104  END DO
105 ELSE IF (orgfix) THEN
106  DO jn=1,kpmode
107  nm3(jn) = jn
108  END DO
109 ELSE
110  DO jn=1,kpmode
111  nm0(jn) = 1+(jn-1)*2
112  nm3(jn) = 2+(jn-1)*2
113  END DO
114 END IF
115 !
116 pconvertfacm0 = pmolarweight / xavogadro
117 pconvertfacm6 = pconvertfacm0 * 1.d6
118 pconvertfacm3 = 4./3. * xpi * pdensity / 1.d18
119 !
120  CALL dsltmoment2size(zsvt, prhodref, pemisradius, pemissig, nm0, nm3, nm6, &
121  pconvertfacm0, pconvertfacm6, pconvertfacm3, &
122  ovarsig, orgfix, psig1d=zsig, prg1d=zrg )
123 !
124  CALL dslt_velgrav1d(zsig, zrg, pta, prhodref, pdensity, zmu, zvgk, zdpk, zvg, zdg)
125 !
126 znu(:) = zmu(:)/prhodref(:)
127 !
128 zvgk(:,:) = max(zvgk(:,:),1.e-20)
129 zdpk(:,:) = max(zdpk(:,:),1.e-40)
130 !
131 zvg(:,:) = max(zvg(:,:),1.e-20)
132 zdg(:,:) = max(zdg(:,:),1.e-40)
133 !
134 zstn(:,:) =0.
135 !
136 DO jn = 1,kpmode
137  !
138  ! deposition velocity for each cover type
139  ! ----------------------------------------
140  !Stoke's number, Seinfeld & Pandis, pp 965
141  zstn(:,jn) = zvg(:,jn)*zustar(:)**2/(xg*znu(:))
142  zstn(:,jn) = max(zstn(:,jn), 0.05)
143  !
144  ! compute Schmidt number
145  ! ----------------------
146  zsc(:,jn) = znu(:)/zdg(:,jn)
147  !
148  !Get nominator of equation 19.18 Seinfeld & Pandis==> 1/rd
149  zrd(:,jn) = zustar(:) * (zsc(:,jn)**(-2./3.)+ 10**(-3./zstn(:,jn)))
150  !
151  !Limit to reasonable values
152  !ZRD(:,JN) = MAX(ZRD(:,JN),1.E-10)
153  !Get rd
154  zrd(:,jn) = 1. / zrd(:,jn)
155  !
156 ENDDO
157 !
158 DO jn = 1,kpmode*3
159  !
160  j0 = (jn-1)/3+1
161  !
162  ! deposition velocity for each cover type
163  ! ----------------------------------------
164  zvd(:,jn) = 0.
165  !
166  !Get ra + rd + ra*rd*vg which is equal to
167  !getting nominator of equation 19.7 Seinfeld & Pandis
168  zvd(:,jn)= zresa(:) + zrd(:,j0) + zresa(:)*zrd(:,j0)*zvgk(:,jn)
169  !
170  !Limit to reasonable values
171  zvd(:,jn)= max(zvd(:,jn), 1.e-10)
172  !
173  !Get the total dry dep velocity (Seinfeld & Pandis, eqn 19.7)
174  IF (hvermod=='CMDVER') THEN
175  zvd(:,jn)= zvgk(:,jn) & ! Gravitation term
176  + 1./zvd(:,jn) ! turbulence and surface resistance term
177  ELSE
178 ! ZVD(:,JN)=zvs(:,JN) & !Gravitation term
179 ! + 1./ZVD(:,JN) !turbulence and surface resistance term
180  ! The gravitation term as been computed by MesoNH (see sedim_dust.f90)
181  zvd(:,jn) = 1./zvd(:,jn) ! turbulence and surface resistance term
182  END IF
183  !
184 END DO
185 
186 ! Only M3 flux (mass) has been used ; flux for over moment has been made after
187 DO jn = 1,kpmode
188  pfsvt(:,nm3(jn)) = pfsvt(:,nm3(jn)) - psvt(:,nm3(jn)) * zvd(:,2+(jn-1)*3)
189 ENDDO
190 !
191 IF (lhook) CALL dr_hook('DSLT_DEP',1,zhook_handle)
192 !---------------------------------------------------------------------
193 !
194 END SUBROUTINE dslt_dep
subroutine dslt_velgrav1d(PSIG, PRG, PTA, PRHODREF, PRHOP, PMU, PVGK, PDPK, PVGG, PDPG)
subroutine dslt_dep(PSVT, PFSVT, PUSTAR, PRESA, PTA, PRHODREF, PEMISSIG, PEMISRADIUS, KPMODE, PDENSITY, PMOLARWEIGHT, PCONVERTFACM0, PCONVERTFACM6, PCONVERTFACM3, OVARSIG, ORGFIX, HVERMOD)
Definition: dslt_dep.F90:6
subroutine dsltmoment2size(PSVT, PRHODREF, PEMISRADIUS, PEMISSIG, KM0, KM3, KM6, PCONVERTFACM0, PCONVERTFACM6, PCONVERTFACM3, OVARSIG, ORGFIX, PSIG1D, PRG1D, PN1D, PMASS1D, PM1D)