SURFEX v8.1
General documentation of Surfex
dustflux_get_mb.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 SUBROUTINE dustflux_get_mb( &
6  PUSTAR & !I [m/s] Wind friction speed
7  ,PRHOA & !I [kg/m3] air density at 2m height
8  ,PWG & !I [m3/m3] volumetric water content
9  ,PZ0 & !I [m] roughness length of surface
10  ,PWSAT & !I [m3 m-3] saturation liquid water content
11  ,PCLAY & !I [frc] mass fraction clay
12  ,PSAND & !I [frc] mass fraction sand
13  ,PDST_EROD & !I [frc] erodible surface
14  ,PWIND10M & !I [m/s] wind at 10m altitude
15  ,PSFDST & !O [kg/m2/sec] Vertical dust flux
16  ,KSIZE & !I [nbr] number of points for calculation
17  )
18 !
19 USE mode_dstmblutl !Dust mobilization subroutines
20 USE modd_dst_surf, ONLY : cvermod
23 USE modd_csts, only: xpi
24 !
25 USE yomhook ,ONLY : lhook, dr_hook
26 USE parkind1 ,ONLY : jprb
27 !
28 IMPLICIT NONE
29 !
30 !INPUT, set their dimensions to their passed lengths or to KSIZE ?
31 INTEGER, INTENT(IN) :: KSIZE ![nbr] length of passed arrays
32 REAL, INTENT(IN), DIMENSION(KSIZE) :: PUSTAR ![m/s] wind friction speed
33 REAL, INTENT(IN), DIMENSION(KSIZE) :: PRHOA ![kg/m3] air density at 2m height
34 REAL, INTENT(IN), DIMENSION(KSIZE) :: PCLAY ![frc] mass fraction clay
35 REAL, INTENT(IN), DIMENSION(KSIZE) :: PSAND ![frc] mass fraction sand
36 REAL, INTENT(IN), DIMENSION(KSIZE) :: PDST_EROD![frc]
37 REAL, INTENT(IN), DIMENSION(KSIZE) :: PWG ![m3 m-3] volumetric water fraction
38 REAL, INTENT(IN), DIMENSION(KSIZE) :: PWSAT ![m3 m-3] saturation water content
39 REAL, INTENT(IN), DIMENSION(KSIZE) :: PZ0 ![m] surface roughness length
40 REAL, INTENT(IN), DIMENSION(KSIZE) :: PWIND10M ![m/s] wind at 10m altitude
41 !OUTPUT the flux of dust
42 REAL, INTENT(OUT), DIMENSION(KSIZE) :: PSFDST ! [kg m-2 s-1] Output flux of atmospheric dust
43 !
44 !!!!!!!&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&!!!!!!
45 
46 !#ifdef AlG01
47 ! real,parameter::XFLX_MSS_FDG_FCT=28. ! [frc] Global mass flux tuning factor (a posteriori)
48 !#else
49 ! real,parameter::XFLX_MSS_FDG_FCT=7.0e-4 ! [frc] Global mass flux tuning factor (a posteriori)
50 ! real,parameter::XFLX_MSS_FDG_FCT=21.0e-4 ! [frc] Global mass flux tuning factor (a posteriori)
51 ! real,parameter::XFLX_MSS_FDG_FCT=12.0e-4 ! [frc] values used in Masdev47
52 !
53 !Define local variables:
54 LOGICAL, DIMENSION(KSIZE) :: GFLG_MBL ! [frc] Mobilization candidate flag
55 !REAL, DIMENSION(KSIZE) :: ZMBL_BSN_FCT ! [frc] enhancement factor for grid cells with higher erodibility
56 REAL, DIMENSION(KSIZE) :: ZWND_RFR ! [m s-1] wind speed at reference level
57 REAL, DIMENSION(KSIZE) :: ZWND_FRC_THR_SLT ! [m/s] Threshold wind friction speed when all effects taken into account
58 REAL, DIMENSION(KSIZE) :: ZWND_RFR_THR_SLT ! [m s-1] Threshold wind speed at reference level
59 REAL, DIMENSION(KSIZE) :: ZGWC_SFC ! [kg/kg] Gravimetric water content
60 REAL, DIMENSION(KSIZE) :: ZFRC_THR_NCR_WTR ! [frc] Fraction by which soil wetness increases threshold wind
61 REAL, DIMENSION(KSIZE) :: ZFRC_THR_NCR_DRG ! [frc] fraction by which drag partitioning increases threshold wind
62 REAL, DIMENSION(KSIZE) :: ZWND_FRC_SLT ! [m/s] wind friction speed after modified for saltation feedbacks
63 REAL, DIMENSION(KSIZE,NBIN) :: ZFLX_MSS_HRZ_SLT_TTL_WBN ! [kg m-1 s-1] Vertically integrated horizontal saltation soil flux for a wind bin
64 REAL, DIMENSION(KSIZE,NBIN) :: ZFLX_MSS_VRT_DST_TTL_WBN ! [kg m-2 s-1]
65 REAL, DIMENSION(KSIZE) :: ZDST_SLT_FLX_RAT_TTL ! [m-1] ratio of vertical to horizontal flux (alpha in several papers)
66 REAL, DIMENSION(KSIZE) :: ZSILT ! [frc] dummy for fraction of silt
67 REAL, DIMENSION(KSIZE) :: ZWPRM ! threshold soil wetness
68 INTEGER, DIMENSION(KSIZE) :: ITEXT ! soil texture
69 REAL, DIMENSION(NTEX,NDP) :: ZDSRLV ! Surface relative des grains du sol
70 REAL, DIMENSION(KSIZE,NBIN) :: ZDSBIN !
71 REAL, DIMENSION(KSIZE,NBIN) :: ZGAMMA !
72 INTEGER, DIMENSION(NBIN+1) :: ISEUIL
73 REAL, DIMENSION(NBIN,2) :: ZPCEN
74 REAL, DIMENSION(NTEX) :: ZZS0 ! rugosité de la surface lisse
75 REAL, DIMENSION(NDP) :: ZDP ! [µm] diamètre du particule
76 REAL :: ZDLNDP, ZRGH_Z0
77 INTEGER :: I !Counter for number of points (used in loops)
78 INTEGER :: IDP !Counter for number of particle
79 INTEGER :: ITEX !Counter for number of texture
80 INTEGER :: IS
81 REAL(KIND=JPRB) :: ZHOOK_HANDLE
82 !
83 IF (lhook) CALL dr_hook('DUSTFLUX_GET_MB',0,zhook_handle)
84 !
85 !Initialize mobilization candidate flag
86 gflg_mbl(:) = .true.
87 !fxm: Get erodibility limitation factor, use something connected to amount of sand
88 !Discuss with Valery Masson
89 !ZMBL_BSN_FCT(:) = PSAND(:)
90 ! utilisé dans le calcul de l'effet Owen
91 zwnd_rfr(:) = pwind10m(:)
92 !
93 ! Initialize vertical dust flux
94 zflx_mss_vrt_dst_ttl_wbn(:,:) = 0.d0
95 zflx_mss_hrz_slt_ttl_wbn(:,:) = 0.d0
96 !
97 psfdst(:) = 0.0d0
98 !
99 ! CLAY : CLAY >= 0.40 SILT < 0.40 SAND < 0.45
100 ! SANDY CLAY : CLAY >= 0.36 SAND >= 0.45
101 ! SILTY CLAY : CLAY >= 0.40 SILT >= 0.40
102 ! SILT : SILT >= 0.8 CLAY < 0.12
103 ! SAND : SAND >= 0.3*CLAY + 0.87
104 ! SANDY CLAY LOAM : CLAY >= 0.28 CLAY < 0.36 SAND >= 0.45 | CLAY >= 0.20 CLAY < 0.28 SILT < 0.28
105 ! SILTY CLAY LOAM : CLAY >= 0.28 CLAY < 0.40 SAND < 0.20
106 ! CLAY LOAM : CLAY >= 0.28 CLAY < 0.40 SAND >= 0.20 SAND < 0.45
107 ! SILT LOAM : SILT >= 0.8 CLAY >= 0.12 | SILT >= 0.5 SILT < 0.8 CLAY < 0.28
108 ! LOAMY SAND : SAND >= CLAY + 0.7 SAND < 0.3*CLAY + 0.87
109 ! SANDY LOAM : SAND >= 0.52 CLAY < 0.20 | SAND >= (0.5 - CLAY) CLAY < 0.07
110 ! LOAM : CLAY >= 0.20 CLAY < 0.28 SILT >= 0.28 SILT < 0.5 | SAND >= (0.5 - CLAY) CLAY < 0.20
111 DO i = 1, ksize
112  !
113  zsilt(i) = 1.0 - pclay(i) - psand(i)
114  IF (zsilt(i) <= 0.) zsilt(i) = 0.0
115  zwprm(i) = 3.0*pclay(i) * (0.17 + 0.0014 * pclay(i))
116  zwprm(i) = min( 0.15, max(0.053, zwprm(i)) )
117  !
118  !tous les cas CLAY >= 0.28 sont traités
119  IF ( pclay(i) >= 0.28 ) THEN
120  IF ( psand(i) >= 0.45 ) THEN
121  IF (pclay(i) >= 0.36 ) THEN ! Sandy Clay
122  itext(i) = 9
123  !ZWPRM(I) = 10.0E-2
124  ELSE ! Sandy Clay Loam
125  itext(i) = 6
126  !ZWPRM(I) = 6.0E-2
127  ENDIF
128  ELSEIF ( pclay(i) >= 0.40 ) THEN
129  IF ( zsilt(i) >= 0.40 ) THEN ! Silty Clay
130  itext(i) = 10
131  !ZWPRM(I) = 10.5E-2
132  ELSE ! Clay
133  itext(i) = 11
134  !ZWPRM(I) = 11.5E-2
135  ENDIF
136  ELSEIF (psand(i) >= 0.20 ) THEN ! Clay Loam
137  itext(i) = 8
138  !ZWPRM(I) = 6.8E-2
139  ELSE ! Silty Clay Loam
140  itext(i) = 7
141  !ZWPRM(I) = 6.8E-2
142  ENDIF
143  ENDIF
144  ! les cas ZSILT >= 0.5 .AND. PCLAY < 0.28 sont traités
145  ! les cas ZSILT < 0.5 .AND. PCLAY >= 0.20 sont traités
146  ! ne sont pas traités les cas PCLAY < 0.20 .AND. ZSILT < 0.5 => SAND >= 0.3
147  IF ( zsilt(i) >= 0.8 .AND. pclay(i) < 0.12 ) THEN ! Silt
148  itext(i) = 12
149  !ZWPRM(I) = 2.5E-2
150  ELSEIF ( pclay(i) < 0.28 ) THEN ! ( clay est forcément < 0.28 )
151  IF ( zsilt(i) >= 0.5 ) THEN ! Silt Loam
152  itext(i) = 4
153  !ZWPRM(I) = 5.0E-2
154  ELSEIF ( pclay(i) >= 0.20 ) THEN
155  IF ( zsilt(i) >= 0.28 ) THEN ! Loam
156  itext(i) = 5
157  !ZWPRM(I) = 4.0E-2
158  ELSE ! Sandy Clay Loam
159  itext(i) = 6
160  !ZWPRM(I) = 4.0E-2
161  ENDIF
162  ENDIF
163  ENDIF
164  ! les cas SAND >= 0.87 sont traités: silt < 0.13, clay < 0.1 => entrent dans les cas non encore traités
165  ! les cas SAND >= 0.7 => CLAY < 0.15 , SILT < 0.3 sont traités ) => ""
166  ! les cas SAND >=0.52 .AND. CLAY < 0.20 sont traités SILT < 0.48 => ""
167  ! les cas restants considèrement pclay < 0.20, sand >= 0.5 - pclay => sand >= 0.3
168  ! => clay + sand >= 0.5 => silt < 0.5
169  IF ( psand(i) >= (0.3*pclay(i) + 0.87) ) THEN ! Sand
170  itext(i) = 1
171  !ZWPRM(I) = 1.5E-2
172  ELSEIF ( psand(i) >= (pclay(i) + 0.7) ) THEN ! Loamy Sand
173  itext(i) = 2
174  !ZWPRM(I) = 2.5E-2
175  ELSEIF ( psand(i) >= 0.52 .AND. pclay(i) < 0.20 ) THEN ! Sandy Loam
176  itext(i) = 3
177  !ZWPRM(I) = 3.0E-2
178  ELSEIF ( psand(i) >= (0.5 - pclay(i)) ) THEN
179  IF ( pclay(i) < 0.07 ) THEN ! Sandy Loam
180  itext(i) = 3
181  !ZWPRM(I) = 3.0E-2
182  ELSEIF ( pclay(i) < 0.20 ) THEN ! Loam
183  itext(i) = 5
184  !ZWPRM(I) = 4.0E-2
185  ENDIF
186  ENDIF
187  !
188 ENDDO
189 !
190 zdlndp = 0.1d0 ! [µm] Dln(DP)
191  CALL distribution (nmode, zdlndp, itext, zdp, zdsrlv, zzs0)
192 !
193 iseuil = (/0, 30, 40, 65, ndp/)
194 zpcen(:,1) = (/0.005, 0.006, 0.1, 0.10/)
195 zpcen(:,2) = (/0.005, 0.006, 1.0, 0.12/)
196 !
197 zdsbin(:,:) = 0.0
198 !
199 DO is = 1, nbin
200  DO idp = iseuil(is)+1, iseuil(is+1)
201  DO i = 1, ksize
202  itex = itext(i)
203  zdsbin(i,is) = zdsbin(i,is) + zdsrlv(itex,idp) / float(iseuil(is+1)-iseuil(is))
204  IF (itex==4) THEN
205  zgamma(i,is) = zpcen(is,1)
206  ELSE
207  zgamma(i,is) = zpcen(is,2)
208  ENDIF
209  ENDDO
210  ENDDO
211 ENDDO
212 !
213 ! Adjust threshold velocity for inhibition by roughness elements
214 DO i = 1, SIZE(zfrc_thr_ncr_drg)
215  itex = itext(i)
216  zrgh_z0 = pz0(i)
217  IF (zrgh_z0 <= zzs0(itex)) zrgh_z0 = zzs0(itex)
218  ! Factor by which surface roughness increases threshold friction velocity
219  !++grini: fxm: USE WHOLE ARRAY OF Z0 INSTEAD OF ONLY RGH_MMN_MBL AS IN OLD CODE
220  CALL frc_thr_ncr_drg_get(zrgh_z0, zzs0(itex), zfrc_thr_ncr_drg(i))
221 ENDDO
222 !
223 ! Convert volumetric water content to gravimetric water content
224  CALL vwc2gwc(gflg_mbl, pwsat, pwg, zgwc_sfc)
225 ! Factor by which soil moisture increases threshold friction velocity
226  CALL frc_thr_ncr_wtr_get (gflg_mbl, zwprm, zgwc_sfc, zfrc_thr_ncr_wtr)
227 zfrc_thr_ncr_wtr(:) = max(zfrc_thr_ncr_wtr(:), 1.0)
228 !
229 !
230  CALL wnd_frc_thr_slt_get(prhoa, xdmt_slt_opt, zwnd_frc_thr_slt)
231 !
232 DO i = 1,ksize
233  IF (gflg_mbl(i)) THEN
234  zwnd_frc_thr_slt(i) = zwnd_frc_thr_slt(i) * zfrc_thr_ncr_wtr(i) & ! [frc] Adjustment for moisture
235  * zfrc_thr_ncr_drg(i) ! I [frc] Adjustment for roughness
236  zwnd_rfr_thr_slt(i) = zwnd_rfr(i) * zwnd_frc_thr_slt(i) / pustar(i)
237  ENDIF
238 ENDDO
239 !
240 ! CHECK IF THIS CAN BE USED EASILY
241 ! NEEDS 10M WIND SPEED WHICH IS MAYBE KNOWN MAYBE NOT !
242 ! Saltation increases friction speed by roughening surface
243  CALL wnd_frc_slt_get(gflg_mbl, pustar, zwnd_rfr, zwnd_rfr_thr_slt, zwnd_frc_slt)
244 !
245 DO is = 1,nbin
246  CALL flx_mss_hrz_slt_ttl_whi79_get(zgamma(:,is)*zdsbin(:,is), gflg_mbl, prhoa, &
247  zwnd_frc_slt, zwnd_frc_thr_slt, zflx_mss_hrz_slt_ttl_wbn(:,is))
248 ENDDO
249 !
250 ! Vertical dust mass flux
251 DO is = 1,nbin
252  CALL flx_mss_vrt_dst_aust_get(gflg_mbl, prhoa, zwnd_frc_thr_slt, zflx_mss_hrz_slt_ttl_wbn(:,is), &
253  zdst_slt_flx_rat_ttl, zflx_mss_vrt_dst_ttl_wbn(:,is))
254  !
255  DO i = 1, ksize
256  ! Vertically integrated streamwise mass flux in wind bin
257  psfdst(i) = psfdst(i) + pdst_erod(i) * xflx_mss_fdg_fctm * zflx_mss_vrt_dst_ttl_wbn(i,is)
258  ENDDO
259 ENDDO
260 !
261 END SUBROUTINE dustflux_get_mb
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)
integer, parameter ntex
Definition: modd_dstmbl.F90:20
integer, parameter nmode
Definition: modd_dstmbl.F90:21
subroutine dustflux_get_mb(PUSTAR, PRHOA, PWG, PZ0, PWSAT, PCLAY, PSAND, PDST_EROD, PWIND10M, PSFDST, KSIZE)
integer, parameter ndp
Definition: modd_dstmbl.F90:22
real, save xpi
Definition: modd_csts.F90:43
real, parameter xcst_slt
Definition: modd_dstmbl.F90:14
integer, parameter jprb
Definition: parkind1.F90:32
real, parameter xflx_mss_fdg_fctm
Definition: modd_dstmbl.F90:19
subroutine vwc2gwc(OFLG_MBL, PVWC_SAT, PVWC_SFC, PGWC_SFC)
subroutine distribution(KMODE, PDLNDP, KTEXT, PDP, PDSRLV, PZS0)
subroutine frc_thr_ncr_wtr_get(OFLG_MBL, PGWC_THR, PGWC_SFC, PFRC_THR_NCR_WTR)
logical lhook
Definition: yomhook.F90:15
character(len=6) cvermod
real, parameter xdmt_slt_opt
Definition: modd_dstmbl.F90:10
integer, parameter nbin
Definition: modd_dstmbl.F90:23
subroutine wnd_frc_slt_get(OFLG_MBL, PWND_FRC, PWND_RFR, PWND_RFR_THR_SLT, PWND_FRC_SLT)
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)
subroutine wnd_frc_thr_slt_get(PDNS_MDP, PDP, PWND_FRC_THR_SLT)