SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
mode_dstmblutl.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 ! ######spl
6 MODULE mode_dstmblutl ! [mdl] Mobilization utilities
7 !
8 USE yomhook ,ONLY : lhook, dr_hook
9 USE parkind1 ,ONLY : jprb
10 !
11 IMPLICIT NONE
12 !
13  CONTAINS
14 !
15 !----------------------------------------------------------------------------------------
16 SUBROUTINE wnd_frc_thr_slt_get(PDNS_MDP, PDP, PWND_FRC_THR_SLT)
17 ! Purpose: Compute dry threshold friction velocity for saltation
18 !++grini use dstgrd ! [mdl] Dust grid sizes
19 !++grini use pmgrid ! [mdl] Spatial resolution parameters
20 !++grini use dstcst ! [mdl] Physical constants for dust routines
21 USE modd_dstmbl, ONLY : xdns_slt
22 USE modd_csts, ONLY : xg
23 USE modi_abor1_sfx
24 !
25 IMPLICIT NONE
26 !
27 ! Input
28 !++grini real,intent(in)::dns_aer(dst_nbr) ! [kg m-3] Particle density
29 !++grini real,intent(in)::dmt_aer(dst_nbr) ! [m] Particle diameter
30 REAL, DIMENSION(:), INTENT(IN) :: pdns_mdp ! [kg m-3] Midlayer density
31 REAL, INTENT(IN) :: pdp
32 ! Output
33 REAL, DIMENSION(:), INTENT(OUT) :: pwnd_frc_thr_slt ! [m s-1] Threshold friction velocity for saltation
34 !
35 ! Local
36 REAL :: zryn, zryn1 ! [frc] Threshold friction Reynolds number approximation for optimal size
37 REAL :: zdns_fct ! Density ratio factor for saltation calculation
38 REAL :: zicf_fct ! Interparticle cohesive forces factor for saltation calculation
39 REAL :: ztmp ! Factor in saltation computation
40 INTEGER :: i ! [idx] Counting index
41 !
42 REAL(KIND=JPRB) :: zhook_handle
43 !
44 IF (lhook) CALL dr_hook('MODE_DSTMBLUTL:WND_FRC_THR_SLT_GET',0,zhook_handle)
45 !
46 ! Initialize some variables
47 ! MaB95 pzn. for Re*t(D_opt) circumvents iterative solution
48 zryn = 0.38d0 + 1331.0d0*(100.0d0*pdp)**1.56d0 ! [frc] "B" MaB95 p. 16417 (5)
49 ! Given Re*t(D_opt), compute time independent factors contributing to u*t
50 zdns_fct = xdns_slt * xg * pdp ! IvW82 p. 115 (6) MaB95 p. 16417 (4)
51 zicf_fct = 1.0d0 + 6.0d-07/(xdns_slt*xg*(pdp**2.5d0)) ! [frc] IvW82 p. 115 (6) MaB95 p. 16417 (4) Interparticle cohesive forces
52 !
53 IF (zryn < 0.03d0) THEN
54  CALL abor1_sfx('MODE_DSTMBLUTL:WND_FRC_THR_SLT_GET: RYN < 0.03')
55 ELSEIF (zryn < 10.0d0) THEN
56  zryn1 = -1.0d0 + 1.928d0 * (zryn**0.0922d0) ! [frc] IvW82 p. 114 (3), MaB95 p. 16417 (6)
57  zryn1 = 0.1291d0 * 0.1291d0 / zryn1 ! [frc]
58 ELSE
59  zryn1 = 1.0d0 - 0.0858d0 * exp(-0.0617d0*(zryn-10.0d0)) ! [frc] IvW82 p. 114 (3), MaB95 p. 16417 (7)
60  zryn1 = 0.120d0 **2 * zryn1**2 ! [frc]
61  !ryn1=0.129*0.129*ryn1*ryn1 dans le cas mm, à vérifier
62 ENDIF
63 !
64 ! This method minimizes the number of square root computations performed
65 ztmp = sqrt(zicf_fct*zdns_fct*zryn1)
66 DO i = 1, SIZE(pdns_mdp)
67  pwnd_frc_thr_slt(i) = ztmp / sqrt(pdns_mdp(i))
68 ENDDO
69 !
70 IF (lhook) CALL dr_hook('MODE_DSTMBLUTL:WND_FRC_THR_SLT_GET',1,zhook_handle)
71 !
72 END SUBROUTINE wnd_frc_thr_slt_get
73 !
74 !----------------------------------------------------------------------------------------
75 SUBROUTINE vwc2gwc (OFLG_MBL, PVWC_SAT, PVWC_SFC, PGWC_SFC)
76 ! Purpose: Convert volumetric water content to gravimetric water content
77 !++alfgr use pmgrid ! [mdl] Spatial resolution parameters
78 use modd_csts, only : xrholi ! [kg/m3] density of liquid water
79 USE modd_dstmbl, ONLY : xdns_slt
80 !
81 !++alfgr use dstblm,only:dns_H2O_lqd_std ! [mdl] Boundary layer meteorology for non-vegetated land surfaces
82 IMPLICIT NONE
83 ! Input
84 LOGICAL, DIMENSION(:), INTENT(IN) :: oflg_mbl ! [flg] Mobilization candidate flag
85 REAL, DIMENSION(:), INTENT(IN) :: pvwc_sat ! [m3 m-3] Saturated volumetric water content (sand-dependent)
86 REAL, DIMENSION(:), INTENT(IN) :: pvwc_sfc ! [m3 m-3] Volumetric water content
87 REAL, DIMENSION(:), INTENT(OUT):: pgwc_sfc ! [kg kg-1] Gravimetric water content
88 ! Local
89 REAL, DIMENSION(SIZE(PVWC_SAT)) :: zdns_blk_dry ! [kg m-3] Bulk density of dry surface soil
90 INTEGER :: i
91 REAL(KIND=JPRB) :: zhook_handle
92 ! Main Code
93 IF (lhook) CALL dr_hook('MODE_DSTMBLUTL:VWC2GWC',0,zhook_handle)
94 !
95 ! Initialize output
96 DO i=1,SIZE(pvwc_sat)
97  IF (oflg_mbl(i)) THEN
98  ! Assume volume of air pores when dry equals saturated VWC
99  ! This implies air pores are completely filled by water in saturated soil
100  zdns_blk_dry(i) = xdns_slt * (1.0 - pvwc_sat(i)) ! [kg m-3] Bulk density of dry surface soil
101  pgwc_sfc(i) = pvwc_sfc(i) * xrholi / zdns_blk_dry(i)
102  ENDIF
103 ENDDO
104 !
105 IF (lhook) CALL dr_hook('MODE_DSTMBLUTL:VWC2GWC',1,zhook_handle)
106 END SUBROUTINE vwc2gwc
107 !
108 !----------------------------------------------------------------------------------------
109 SUBROUTINE frc_thr_ncr_wtr_get(OFLG_MBL, PGWC_THR, PGWC_SFC, PFRC_THR_NCR_WTR)
110 ! Purpose: Compute factor by which soil moisture increases threshold friction velocity
111 ! This parameterization is based on FMB99
112 !++alfgr use pmgrid ! [mdl] Spatial resolution parameters
113 IMPLICIT NONE
114 ! dans le calcul de l'humidit? du sol(a posteriori)
115 ! Input
116 LOGICAL, DIMENSION(:), INTENT(IN) :: oflg_mbl ! I [flg] Mobilization candidate flag
117 REAL, DIMENSION(:), INTENT(IN) :: pgwc_thr ! [kg kg-1] Threshold gravimetric water content
118 REAL, DIMENSION(:), INTENT(IN) :: pgwc_sfc ! [kg kg-1] Gravimetric water content
119 REAL, DIMENSION(:), INTENT(OUT):: pfrc_thr_ncr_wtr ! [frc] Factor by which moisture increases threshold friction velocity
120 ! Local
121 INTEGER :: i ! [idx] Counting index
122 REAL(KIND=JPRB) :: zhook_handle
123 
124 IF (lhook) CALL dr_hook('MODE_DSTMBLUTL:FRC_THR_NCR_WTR_GET',0,zhook_handle)
125 ! Main Code
126 ! Initialize output
127 pfrc_thr_ncr_wtr(:) = 1.0d0 ! [frc] Factor by which moisture increases threshold friction velocity
128 !
129 DO i = 1, SIZE(pgwc_sfc)
130  IF (oflg_mbl(i)) THEN
131  ! Adjust threshold velocity for inhibition by moisture
132  ! frc_thr_ncr_wtr(lon_idx)=exp(22.7d0*vwc_sfc(lon_idx)) ! [frc] SRL96
133  ! Compute threshold soil moisture based on clay content
134  IF (pgwc_sfc(i) > pgwc_thr(i)) &
135  pfrc_thr_ncr_wtr(i) = sqrt(1.0d0 + 1.21d0 * (100.0d0*(pgwc_sfc(i)-pgwc_thr(i)))**0.68d0) ! [frc] FMB99 p. 155 (15)
136  ENDIF
137 ENDDO
138 ! Uncomment following line to remove all dependence on gwc_sfc
139 ! frc_thr_ncr_wtr(lon_idx)=1.0d0 ! [frc]
140 IF (lhook) CALL dr_hook('MODE_DSTMBLUTL:FRC_THR_NCR_WTR_GET',1,zhook_handle)
141 END SUBROUTINE frc_thr_ncr_wtr_get
142 !
143 !----------------------------------------------------------------------------------------
144 !++alfgr fxm: Fix this so that we can actually use rgh_mmn_mbl different for grid cells
145 SUBROUTINE frc_thr_ncr_drg_get(PRGH_MMN_MBL, PRGH_MMN_SMT, PFRC_THR_NCR_DRG)
146 ! Purpose: Compute factor by which surface roughness increases threshold friction velocity
147 ! This parameterization is based on MaB95 and GMB98
148 !++alfgr use pmgrid ! [mdl] Spatial resolution parameters
149 USE modi_abor1_sfx
150 !
151 IMPLICIT NONE
152 ! Input
153 REAL, INTENT(IN) :: prgh_mmn_mbl ! [m] Roughness length momentum for erodible surfaces
154 REAL, INTENT(IN) :: prgh_mmn_smt ! [m] Smooth roughness length
155 ! Output
156 REAL, INTENT(OUT):: pfrc_thr_ncr_drg ! [frc] Factor by which roughness increases threshold friction velocity
157 ! Local
158 REAL :: zwnd_frc_fsh_frc ! [frc] Efficient fraction of wind friction
159 REAL(KIND=JPRB) :: zhook_handle
160 !
161 IF (lhook) CALL dr_hook('MODE_DSTMBLUTL:FRC_THR_NCR_DRG_GET',0,zhook_handle)
162 ! Main Code
163 !
164 ! Adjust threshold velocity for inhibition by roughness elements
165 zwnd_frc_fsh_frc = & ! [frc] MaB95 p. 16420, GMB98 p. 6207
166  1.0d0 - log(prgh_mmn_mbl/prgh_mmn_smt) / log(0.35d0 * ((0.1d0/prgh_mmn_smt)**0.8d0))
167 zwnd_frc_fsh_frc = max(1.e-6, min(1., zwnd_frc_fsh_frc))
168 IF (zwnd_frc_fsh_frc <= 0.0d0 .OR. zwnd_frc_fsh_frc > 1.0d0) &
169  CALL abor1_sfx("MODE_DSTMBLUTL:FRC_THR_NCR_DRG_GET0: WND_FRC_FSH_FRC OUT OF RANGE")
170 pfrc_thr_ncr_drg = 1.0d0 / zwnd_frc_fsh_frc! [frc]
171 ! fxm: 19991012 Set frc_thr_ncr_drg=1.0, equivalent to assuming mobilization takes place at smooth roughness length
172 !++alfgr removed this frc_thr_ncr_drg=1.0d0
173 !
174 IF (lhook) CALL dr_hook('MODE_DSTMBLUTL:FRC_THR_NCR_DRG_GET',1,zhook_handle)
175 END SUBROUTINE frc_thr_ncr_drg_get
176 !
177 !----------------------------------------------------------------------------------------
178 SUBROUTINE wnd_frc_slt_get(OFLG_MBL, PWND_FRC, PWND_RFR, PWND_RFR_THR_SLT, PWND_FRC_SLT)
179 ! Purpose: Compute the saltating friction velocity
180 ! Saltation increases friction speed by roughening surface, AKA "Owen's effect"
181 ! This acts as a positive feedback to the friction speed
182 ! GMB98 parameterized this feedback in terms of 10 m windspeeds
183 !++alfgr use pmgrid ! [mdl] Spatial resolution parameters
184 IMPLICIT NONE
185 ! Input
186 LOGICAL, DIMENSION(:), INTENT(IN) :: oflg_mbl ! I [flg] Mobilization candidate flag
187 REAL, DIMENSION(:), INTENT(IN) :: pwnd_frc ! I [m s-1] Surface friction velocity
188 REAL, DIMENSION(:), INTENT(IN) :: pwnd_rfr ! I [m s-1] Wind speed at reference height
189 REAL, DIMENSION(:), INTENT(IN) :: pwnd_rfr_thr_slt ! I [m s-1] Threshold 10 m wind speed for saltation
190 REAL, DIMENSION(:), INTENT(OUT):: pwnd_frc_slt ! O [m s-1] Saltating friction velocity
191 ! Local
192 REAL :: zwnd_rfr_dlt ! [m s-1] Reference windspeed excess over threshold
193 REAL :: zwnd_frc_slt_dlt ! [m s-1] Friction velocity increase from saltation
194 INTEGER :: i ! [idx] Counting index
195 REAL(KIND=JPRB) :: zhook_handle
196 !
197 IF (lhook) CALL dr_hook('MODE_DSTMBLUTL:WND_FRC_SLT_GET',0,zhook_handle)
198 ! Main Code
199 ! Compute saltating friction velocity, accounting for "Owen's effect"
200 pwnd_frc_slt(:) = pwnd_frc(:) ! [m s-1] Saltating friction velocity
201 !
202 DO i = 1, SIZE(pwnd_frc)
203  IF (oflg_mbl(i) .AND. pwnd_rfr(i) >= pwnd_rfr_thr_slt(i)) THEN
204  ! Saltation roughens the boundary layer, AKA "Owen's effect"
205  ! GMB98 p. 6206 Fig. 1 shows observed/computed u* dependence on observed U(1 m)
206  ! GMB98 p. 6209 (12) has u* in cm s-1 and U, Ut in m s-1, personal communication, D. Gillette, 19990529
207  ! With everything in MKS, the 0.3 coefficient in GMB98 (12) becomes 0.003
208  ! Increase in friction velocity due to saltation varies as square of
209  ! difference between reference wind speed and reference threshold speed
210  zwnd_rfr_dlt = pwnd_rfr(i) - pwnd_rfr_thr_slt(i)
211  zwnd_frc_slt_dlt = 0.003d0 * zwnd_rfr_dlt**2 ! [m s-1] Friction velocity increase from saltation GMB98 p. 6209
212  pwnd_frc_slt(i) = pwnd_frc_slt(i) + zwnd_frc_slt_dlt ! [m s-1] Saltating friction velocity
213  ENDIF
214 ENDDO
215 IF (lhook) CALL dr_hook('MODE_DSTMBLUTL:WND_FRC_SLT_GET',1,zhook_handle)
216 END SUBROUTINE wnd_frc_slt_get
217 !
218 !----------------------------------------------------------------------------------------
219 SUBROUTINE flx_mss_hrz_slt_ttl_whi79_get(PCOEFF, OFLG_MBL, PDNS_MDP, PWND_FRC, &
220  pwnd_frc_thr_slt, pflx_mss_hrz_slt_ttl)
221 ! Purpose: Compute vertically integrated streamwise mass flux of particles
222 ! Theory: Uses method proposed by White (1979)
223 ! fxm: use surface air density not midlayer density
224 !++alfgr use pmgrid ! [mdl] Spatial resolution parameters
225 !++alfgr use dstcst ! [mdl] Physical constants for dust routines
226 use modd_csts, ONLY : xg ! Gravitation constant
227 !
228 IMPLICIT NONE
229 ! Input
230 REAL, DIMENSION(:), INTENT(IN) :: pcoeff
231 LOGICAL, DIMENSION(:), INTENT(IN) :: oflg_mbl ! I [flg] Mobilization candidate flag
232 REAL, DIMENSION(:), INTENT(IN) :: pdns_mdp ! I [kg m-3] Midlayer density
233 REAL, DIMENSION(:), INTENT(IN) :: pwnd_frc ! I [m s-1] Surface friction velocity
234 REAL, DIMENSION(:), INTENT(IN) :: pwnd_frc_thr_slt ! I [m s-1] Threshold friction speed for saltation
235 REAL, DIMENSION(:), INTENT(OUT):: pflx_mss_hrz_slt_ttl ! O [kg m-1 s-1] Vertically integrated streamwise mass flux
236 ! Local
237 REAL :: zwnd_frc_rat ! [frc] Ratio of wind friction threshold to wind friction
238 INTEGER :: i ! [idx] Counting index for lon
239 REAL(KIND=JPRB) :: zhook_handle
240 !
241 IF (lhook) CALL dr_hook('MODE_DSTMBLUTL:FLX_MSS_HRZ_SLT_TTL_WHI79_GET',0,zhook_handle)
242 ! Main Code
243 ! Initialize output
244 pflx_mss_hrz_slt_ttl(:) = 0.0d0 ! [kg m-1 s-1]
245 !
246 DO i = 1, SIZE(pdns_mdp)
247  IF (oflg_mbl(i) .AND. pwnd_frc(i) > pwnd_frc_thr_slt(i)) THEN
248  zwnd_frc_rat = pwnd_frc_thr_slt(i) / pwnd_frc(i) ! [frc]
249  pflx_mss_hrz_slt_ttl(i) = & ! [kg m-1 s-1]
250  pcoeff(i) * pdns_mdp(i) * (pwnd_frc(i)**3.0d0) * &
251  (1.0d0 - zwnd_frc_rat) * (1.0d0 + zwnd_frc_rat)**2 / xg ! Whi79 p. 4648 (19), MaB97 p. 16422 (28)
252  ENDIF
253 ENDDO
254 
255 IF (lhook) CALL dr_hook('MODE_DSTMBLUTL:FLX_MSS_HRZ_SLT_TTL_WHI79_GET',1,zhook_handle)
256 END SUBROUTINE flx_mss_hrz_slt_ttl_whi79_get
257 !
258 !----------------------------------------------------------------------------------------
259 SUBROUTINE flx_mss_vrt_dst_ttl_mab95_get(OFLG_MBL, PMSS_FRC_CLY, PFLX_MSS_HRZ_SLT_TTL, &
260  pdst_slt_flx_rat_ttl, pflx_mss_vrt_dst_ttl)
261 ! Purpose: Diagnose total vertical mass flux of dust from vertically integrated streamwise mass flux
262 ! Theory: Uses clay-based method proposed by Marticorena & Bergametti (1995)
263 ! Their parameterization is based only on data for mss_frc_cly < 0.20
264 ! For clayier soils, dst_slt_flx_rat_ttl may behave dramatically differently
265 ! Whether this behavior changes when mss_frc_cly > 0.20 is unknown
266 ! Anecdotal evidence suggests vertical flux decreases for mss_frc_cly > 0.20
267 ! Thus we use min[mss_frc_cly,0.20] in MaB95 parameterization
268 IMPLICIT NONE
269 ! Input
270 LOGICAL, DIMENSION(:), INTENT(IN) :: oflg_mbl ! I [flg] Mobilization candidate flag
271 REAL, DIMENSION(:), INTENT(IN) :: pmss_frc_cly ! I [frc] Mass fraction clay
272 REAL, DIMENSION(:), INTENT(IN) :: pflx_mss_hrz_slt_ttl ! I [kg m-1 s-1] Vertically integrated streamwise mass flux
273 REAL, DIMENSION(:), INTENT(OUT):: pdst_slt_flx_rat_ttl ! O [m-1] Ratio of vertical dust flux to streamwise mass flux
274 REAL, DIMENSION(:), INTENT(OUT):: pflx_mss_vrt_dst_ttl ! O [kg m-2 s-1] Total vertical mass flux of dust
275 ! Local
276 REAL :: zmss_frc_cly_vld ! [frc] Mass fraction clay limited to 0.20
277 INTEGER :: i ! [idx] Counting index for lon
278 REAL(KIND=JPRB) :: zhook_handle
279 !
280 IF (lhook) CALL dr_hook('MODE_DSTMBLUTL:FLX_MSS_VRT_DST_TTL_MAB95_GET',0,zhook_handle)
281 !
282 DO i = 1, SIZE(pmss_frc_cly)
283  IF (oflg_mbl(i)) THEN
284  ! 19990603: fxm: Dust production is EXTREMELY sensitive to this parameter, which changes flux by 3 orders of magnitude in 0.0 < mss_frc_cly < 0.20
285  zmss_frc_cly_vld = min(pmss_frc_cly(i), 0.2) ! [frc]
286  pdst_slt_flx_rat_ttl(i) = & ! [m-1]
287  100.0d0 * exp(log(10.0d0)*(13.4d0*zmss_frc_cly_vld - 6.0d0)) ! MaB95 p. 16423 (47)
288  pflx_mss_vrt_dst_ttl(i) = pflx_mss_hrz_slt_ttl(i) * pdst_slt_flx_rat_ttl(i) ! [kg m-1 s-1]
289  ENDIF
290 ENDDO
291 !
292 IF (lhook) CALL dr_hook('MODE_DSTMBLUTL:FLX_MSS_VRT_DST_TTL_MAB95_GET',1,zhook_handle)
293 END SUBROUTINE flx_mss_vrt_dst_ttl_mab95_get
294 !
295 !----------------------------------------------------------------------------------------
296 SUBROUTINE flx_mss_vrt_dst_aust_get(OFLG_MBL, PDNS_MDP, PWND_FRC_THR_SLT, &
297  pflx_mss_hrz_slt_ttl, pdst_slt_flx_rat_ttl, pflx_mss_vrt_dst_ttl)
298 ! Purpose: Diagnose total vertical mass flux of dust from vertically integrated streamwise mass flux
299 use modd_csts, ONLY : xg ! Gravitation constant
300 USE modd_dstmbl, ONLY : xdmt_slt_opt, xdmt_ero_opt, xdns_slt, xgama
301 !
302 IMPLICIT NONE
303 ! Input
304 LOGICAL, DIMENSION(:), INTENT(IN) :: oflg_mbl ! I [flg] Mobilization candidate flag
305 REAL, DIMENSION(:), INTENT(IN) :: pdns_mdp ! I [kg m-3] Midlayer density
306 REAL, DIMENSION(:), INTENT(IN) :: pwnd_frc_thr_slt ! I [m s-1] Threshold friction speed for saltation
307 REAL, DIMENSION(:), INTENT(IN) :: pflx_mss_hrz_slt_ttl ! I [kg m-1 s-1] Vertically integrated streamwise mass flux
308 REAL, DIMENSION(:), INTENT(OUT):: pdst_slt_flx_rat_ttl ! O [m-1] Ratio of vertical dust flux to streamwise mass flux
309 REAL, DIMENSION(:), INTENT(OUT):: pflx_mss_vrt_dst_ttl ! O [kg m-2 s-1] Total vertical mass flux of dust
310 ! Local
311 REAL, DIMENSION(SIZE(PDNS_MDP)) :: zrop_roa ! [frc] ratio of particle densite to Midlayer density
312 REAL :: zexpdd, zlnds, zbeta, zbgxg
313 INTEGER :: i
314 REAL(KIND=JPRB) :: zhook_handle
315 !
316 IF (lhook) CALL dr_hook('MODE_DSTMBLUTL:FLX_MSS_VRT_DST_AUST_GET',0,zhook_handle)
317 !
318 ! Initialize some variables
319 zexpdd = exp(-140.7d0 * xdmt_ero_opt + 0.37d0)
320 zlnds = (0.328*1.0d-4) + (0.125d0*1.0d-4*log(xdmt_slt_opt*1.0e+3))
321 zbeta = zlnds * zexpdd ! [mm]
322 zbgxg = zbeta * xgama * xg
323 !
324 DO i = 1, SIZE(pdns_mdp)
325  IF (oflg_mbl(i)) THEN
326  zrop_roa(i) = xdns_slt / pdns_mdp(i)
327  pdst_slt_flx_rat_ttl(i) = & ! [mm/m]
328  (2.0d0/3.0d0) * zbgxg * zrop_roa(i) / (pwnd_frc_thr_slt(i)**2.0d0)
329  pflx_mss_vrt_dst_ttl(i) = 1.0d-3 * & ! [kg m-1 s-1]
330  pflx_mss_hrz_slt_ttl(i) * pdst_slt_flx_rat_ttl(i)
331  ENDIF
332 ENDDO
333 !
334 IF (lhook) CALL dr_hook('MODE_DSTMBLUTL:FLX_MSS_VRT_DST_AUST_GET',1,zhook_handle)
335 END SUBROUTINE flx_mss_vrt_dst_aust_get
336 !
337 !----------------------------------------------------------------------------------------
338 SUBROUTINE distribution(KMODE, PDLNDP, KTEXT, PDP, PDSRLV, PZS0)
339 !
340 USE modd_csts, ONLY : xpi
341 USE modd_dstmbl, ONLY : xdns_slt
342 !
343 IMPLICIT NONE
344 !
345 !INPUT, set their dimensions to their passed lengths or to KSIZE ?
346 INTEGER, INTENT(IN) :: kmode ![nbr] loop over mode
347 REAL, INTENT(IN) :: pdlndp ! delta Dp [?m]
348 INTEGER, DIMENSION(:), INTENT(IN) :: ktext ! texture
349 REAL, DIMENSION(:), INTENT(OUT) :: pdp
350 REAL, DIMENSION(:,:), INTENT(OUT) :: pdsrlv ! [--] Output surface relative
351 REAL, DIMENSION(:), INTENT(OUT) :: pzs0 ! [m] Output rugosit? de la surface lisse (Dp/30)
352 !Define local variables:
353 REAL, DIMENSION(KMODE,12) :: zsigma ! déviation géométrique standard du mode
354 REAL, DIMENSION(KMODE,12) :: zmfrac ! fraction massique du mode
355 REAL, DIMENSION(KMODE,12) :: zdmed ! diametre median du mode
356 REAL, DIMENSION(SIZE(PDSRLV,1),SIZE(PDSRLV,2)) :: zds
357 REAL, DIMENSION(SIZE(PDSRLV,2)) :: zdpln, zsp, zdmln
358 REAL :: zdm1, zdm2
359 INTEGER :: imod ! Counter for number of mode
360 INTEGER :: idp ! Counter for number of particle
361 INTEGER :: itex ! Counter for number of texture
362 REAL(KIND=JPRB) :: zhook_handle
363 !
364 IF (lhook) CALL dr_hook('MODE_DSTMBLUTL:DISTRIBUTION',0,zhook_handle)
365 !
366 !1 Sand
367 !2 Loamy Sand
368 !3 Sandy Loam
369 !4 Silt Loam
370 !5 Loam
371 !6 Sandy Clay Loam
372 !7 Silty Clay Loam
373 !8 Clay Loam
374 !9 Sandy Clay
375 !10 Silty Clay
376 !11 Clay
377 !12 Silt
378 zmfrac(1,:) = (/0.0, 0.1, 0.1, 0.15, 0.15, 0.2, 0.2, 0.3, 0.35, 0.4, 0.5, 0.15/)
379 zmfrac(2,:) = (/0.1, 0.3, 0.3, 0.35, 0.50, 0.5, 0.5, 0.5, 0.00, 0.0, 0.0, 0.40/)
380 zmfrac(3,:) = (/0.9, 0.6, 0.6, 0.50, 0.35, 0.3, 0.3, 0.2, 0.65, 0.6, 0.5, 0.45/)
381 !
382 zsigma(1,:) = (/1.8, 1.8, 1.8, 1.8, 1.8, 1.8, 1.8, 1.8, 1.8, 1.8, 1.8, 1.8/)
383 zsigma(2,:) = (/1.7, 1.7, 1.7, 1.7, 1.7, 1.7, 1.7, 1.7, 1.8, 1.8, 1.8, 1.7/)
384 zsigma(3,:) = (/1.6, 1.6, 1.6, 1.6, 1.6, 1.7, 1.7, 1.7, 1.8, 1.8, 1.8, 1.6/)
385 !
386 zdmed(1,:) = (/ 10., 10., 5., 5., 2.5, 2.5, 2.5, 1., 1., 0.5, 0.5, 2.5/)
387 zdmed(2,:) = (/ 100.,100.,100.,100., 75., 75., 50., 50., 10., 10., 10., 75./)
388 zdmed(3,:) = (/1000.,690.,520.,520.,520.,210.,210.,125.,100.,100.,100.,520./)
389 !
390 DO itex = 1, SIZE(pzs0)
391  pzs0(itex) =1e-6*zdmed(3,itex)/30.0
392 ENDDO
393 !
394 ! Initialisation pour IDP = 1
395 pdp(1) = 0.1 ! ?m
396 zdpln(1) = log(pdp(1)) ! ?m
397 !
398 DO idp = 2, SIZE(pdsrlv,2)
399  zdpln(idp) = zdpln(idp-1) + pdlndp
400  pdp(idp) = exp(zdpln(idp))
401 END DO
402 !
403 ! calcul pour chaque particule
404 ! Boucle NDP
405 ! Initialisation
406 ! surface basale totale
407 zsp(:) = 0.d0
408 ! Calcul de la distribution massique des particules (dm(Dp)/dln(Dp)) pour chaque particule de diametre Dp
409 DO itex = 1, SIZE(pdsrlv,1)
410  DO idp = 1, SIZE(pdsrlv,2)
411  zdmln(idp) = 0.0d0
412  DO imod = 1, kmode
413  zdm1 = zmfrac(imod,itex) / (sqrt(2.d0*xpi) * log(zsigma(imod,itex)))
414  zdm2 = exp((log(pdp(idp)) - log(zdmed(imod,itex)))**2. / (-2.d0 * (log(zsigma(imod,itex)))**2.d0))
415  zdmln(idp) = zdmln(idp) + zdm1*zdm2
416  END DO
417  ! Calcul de la surface basale occup?e par chaque particule de diam?tre Dp
418  zds(itex,idp) = 3.d0 * zdmln(idp) * pdlndp / (2.* xdns_slt * pdp(idp))
419  ! Calcul de la surface basale totale Sp= (somme (ds(Dp)):
420  zsp(itex) = zsp(itex) + zds(itex,idp)
421  ENDDO
422 ENDDO
423 !
424 ! Calcul de la distribution de surface relative des particules
425 DO itex = 1, SIZE(pzs0)
426  DO idp = 1, SIZE(pdsrlv,2)
427  pdsrlv(itex,idp) = zds(itex,idp) / zsp(itex)
428  ENDDO
429 END DO
430 !
431 IF (lhook) CALL dr_hook('MODE_DSTMBLUTL:DISTRIBUTION',1,zhook_handle)
432 END SUBROUTINE distribution
433 !
434 END MODULE mode_dstmblutl
subroutine wnd_frc_slt_get(OFLG_MBL, PWND_FRC, PWND_RFR, PWND_RFR_THR_SLT, PWND_FRC_SLT)
subroutine distribution(KMODE, PDLNDP, KTEXT, PDP, PDSRLV, PZS0)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine wnd_frc_thr_slt_get(PDNS_MDP, PDP, PWND_FRC_THR_SLT)
subroutine frc_thr_ncr_wtr_get(OFLG_MBL, PGWC_THR, PGWC_SFC, PFRC_THR_NCR_WTR)
subroutine vwc2gwc(OFLG_MBL, PVWC_SAT, PVWC_SFC, PGWC_SFC)
subroutine flx_mss_vrt_dst_aust_get(OFLG_MBL, PDNS_MDP, PWND_FRC_THR_SLT, PFLX_MSS_HRZ_SLT_TTL, PDST_SLT_FLX_RAT_TTL, PFLX_MSS_VRT_DST_TTL)
subroutine flx_mss_vrt_dst_ttl_mab95_get(OFLG_MBL, PMSS_FRC_CLY, PFLX_MSS_HRZ_SLT_TTL, PDST_SLT_FLX_RAT_TTL, PFLX_MSS_VRT_DST_TTL)
subroutine frc_thr_ncr_drg_get(PRGH_MMN_MBL, PRGH_MMN_SMT, PFRC_THR_NCR_DRG)
subroutine flx_mss_hrz_slt_ttl_whi79_get(PCOEFF, OFLG_MBL, PDNS_MDP, PWND_FRC, PWND_FRC_THR_SLT, PFLX_MSS_HRZ_SLT_TTL)