SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
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
21 USE modd_dstmbl, ONLY : xflx_mss_fdg_fctm, ntex, nmode, ndp, nbin, xcst_slt, &
22  xdmt_slt_opt
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 IF ( PCLAY(I) >= 0.28 ) THEN IF ( PSAND(I) >= 0.45 ) THEN IF (PCLAY(I) >= 0.36 ) THEN ! Sandy Clay ITEXT(I) = 9 !ZWPRM(I) = 10.0E-2 ELSE ! Sandy Clay Loam ITEXT(I) = 6 !ZWPRM(I) = 6.0E-2 ENDIF ELSEIF ( PCLAY(I) >= 0.40 ) THEN IF ( ZSILT(I) >= 0.40 ) THEN ! Silty Clay ITEXT(I) = 10 !ZWPRM(I) = 10.5E-2 ELSE ! Clay ITEXT(I) = 11 !ZWPRM(I) = 11.5E-2 ENDIF ELSEIF (PSAND(I) >= 0.20 ) THEN ! Clay Loam ITEXT(I) = 8 !ZWPRM(I) = 6.8E-2 ELSE ! Silty Clay Loam ITEXT(I) = 7 !ZWPRM(I) = 6.8E-2 ENDIF ENDIF ! les cas ZSILT >= 0.5 .AND. PCLAY < 0.28 sont traités ! les cas ZSILT < 0.5 .AND. PCLAY >= 0.20 sont traités ! ne sont pas traités les cas PCLAY < 0.20 .AND. ZSILT < 0.5 => SAND >= 0.3 IF ( ZSILT(I) >= 0.8 .AND. PCLAY(I) < 0.12 ) THEN ! Silt ITEXT(I) = 12 !ZWPRM(I) = 2.5E-2 ELSEIF ( PCLAY(I) < 0.28 ) THEN ! ( clay est forcément < 0.28 ) IF ( ZSILT(I) >= 0.5 ) THEN ! Silt Loam ITEXT(I) = 4 !ZWPRM(I) = 5.0E-2 ELSEIF ( PCLAY(I) >= 0.20 ) THEN IF ( ZSILT(I) >= 0.28 ) THEN ! Loam ITEXT(I) = 5 !ZWPRM(I) = 4.0E-2 ELSE ! Sandy Clay Loam ITEXT(I) = 6 !ZWPRM(I) = 4.0E-2 ENDIF ENDIF ENDIF ! les cas SAND >= 0.87 sont traités: silt < 0.13, clay < 0.1 => entrent dans les cas non encore traités ! les cas SAND >= 0.7 => CLAY < 0.15 , SILT < 0.3 sont traités ) => "" ! les cas SAND >=0.52 .AND. CLAY < 0.20 sont traités SILT < 0.48 => "" ! les cas restants considèrement pclay < 0.20, sand >= 0.5 - pclay => sand >= 0.3 ! => clay + sand >= 0.5 => silt < 0.5 IF ( PSAND(I) >= (0.3*PCLAY(I) + 0.87) ) THEN ! Sand ITEXT(I) = 1 !ZWPRM(I) = 1.5E-2 ELSEIF ( PSAND(I) >= (PCLAY(I) + 0.7) ) THEN ! Loamy Sand ITEXT(I) = 2 !ZWPRM(I) = 2.5E-2 ELSEIF ( PSAND(I) >= 0.52 .AND. PCLAY(I) < 0.20 ) THEN ! Sandy Loam ITEXT(I) = 3 !ZWPRM(I) = 3.0E-2 ELSEIF ( PSAND(I) >= (0.5 - PCLAY(I)) ) THEN IF ( PCLAY(I) < 0.07 ) THEN ! Sandy Loam ITEXT(I) = 3 !ZWPRM(I) = 3.0E-2 ELSEIF ( PCLAY(I) < 0.20 ) THEN ! Loam ITEXT(I) = 5 !ZWPRM(I) = 4.0E-2 ENDIF ENDIF ! ENDDO ! ZDLNDP = 0.1d0 ! [µm] Dln(DP) CALL DISTRIBUTION (NMODE, ZDLNDP, ITEXT, ZDP, ZDSRLV, ZZS0) ! ISEUIL = (/0, 30, 40, 65, NDP/) ZPCEN(:,1) = (/0.005, 0.006, 0.1, 0.10/) ZPCEN(:,2) = (/0.005, 0.006, 1.0, 0.12/) ! ZDSBIN(:,:) = 0.0 ! DO IS = 1, NBIN DO IDP = ISEUIL(IS)+1, ISEUIL(IS+1) DO I = 1, KSIZE ITEX = ITEXT(I) ZDSBIN(I,IS) = ZDSBIN(I,IS) + ZDSRLV(ITEX,IDP) / FLOAT(ISEUIL(IS+1)-ISEUIL(IS)) IF (ITEX==4) THEN ZGAMMA(I,IS) = ZPCEN(IS,1) ELSE ZGAMMA(I,IS) = ZPCEN(IS,2) ENDIF ENDDO ENDDO ENDDO ! ! Adjust threshold velocity for inhibition by roughness elements DO I = 1, SIZE(ZFRC_THR_NCR_DRG) ITEX = ITEXT(I) ZRGH_Z0 = PZ0(I) IF (ZRGH_Z0 <= ZZS0(ITEX)) ZRGH_Z0 = ZZS0(ITEX) ! Factor by which surface roughness increases threshold friction velocity !++grini: fxm: USE WHOLE ARRAY OF Z0 INSTEAD OF ONLY RGH_MMN_MBL AS IN OLD CODE CALL FRC_THR_NCR_DRG_GET(ZRGH_Z0, ZZS0(ITEX), ZFRC_THR_NCR_DRG(I)) ENDDO ! ! Convert volumetric water content to gravimetric water content CALL VWC2GWC(GFLG_MBL, PWSAT, PWG, ZGWC_SFC) ! Factor by which soil moisture increases threshold friction velocity CALL FRC_THR_NCR_WTR_GET (GFLG_MBL, ZWPRM, ZGWC_SFC, ZFRC_THR_NCR_WTR) ZFRC_THR_NCR_WTR(:) = MAX(ZFRC_THR_NCR_WTR(:), 1.0) ! ! CALL WND_FRC_THR_SLT_GET(PRHOA, XDMT_SLT_OPT, ZWND_FRC_THR_SLT) ! DO I = 1,KSIZE IF (GFLG_MBL(I)) THEN ZWND_FRC_THR_SLT(I) = ZWND_FRC_THR_SLT(I) * ZFRC_THR_NCR_WTR(I) & ! [frc] Adjustment for moisture * ZFRC_THR_NCR_DRG(I) ! I [frc] Adjustment for roughness ZWND_RFR_THR_SLT(I) = ZWND_RFR(I) * ZWND_FRC_THR_SLT(I) / PUSTAR(I) ENDIF ENDDO ! ! CHECK IF THIS CAN BE USED EASILY ! NEEDS 10M WIND SPEED WHICH IS MAYBE KNOWN MAYBE NOT ! ! Saltation increases friction speed by roughening surface CALL WND_FRC_SLT_GET(GFLG_MBL, PUSTAR, ZWND_RFR, ZWND_RFR_THR_SLT, ZWND_FRC_SLT) ! DO IS = 1,NBIN CALL FLX_MSS_HRZ_SLT_TTL_WHI79_GET(ZGAMMA(:,IS)*ZDSBIN(:,IS), GFLG_MBL, PRHOA, & ZWND_FRC_SLT, ZWND_FRC_THR_SLT, ZFLX_MSS_HRZ_SLT_TTL_WBN(:,IS)) ENDDO ! ! Vertical dust mass flux DO IS = 1,NBIN CALL FLX_MSS_VRT_DST_AUST_GET(GFLG_MBL, PRHOA, ZWND_FRC_THR_SLT, ZFLX_MSS_HRZ_SLT_TTL_WBN(:,IS), & ZDST_SLT_FLX_RAT_TTL, ZFLX_MSS_VRT_DST_TTL_WBN(:,IS)) ! DO I = 1, KSIZE ! Vertically integrated streamwise mass flux in wind bin PSFDST(I) = PSFDST(I) + PDST_EROD(I) * XFLX_MSS_FDG_FCTM * ZFLX_MSS_VRT_DST_TTL_WBN(I,IS) ENDDO ENDDO ! END SUBROUTINE DUSTFLUX_GET_MB
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 ! les cas ZSILT < 0.5 .AND. PCLAY >= 0.20 sont traités ! ne sont pas traités les cas PCLAY < 0.20 .AND. ZSILT < 0.5 => SAND >= 0.3 IF ( ZSILT(I) >= 0.8 .AND. PCLAY(I) < 0.12 ) THEN ! Silt ITEXT(I) = 12 !ZWPRM(I) = 2.5E-2 ELSEIF ( PCLAY(I) < 0.28 ) THEN ! ( clay est forcément < 0.28 ) IF ( ZSILT(I) >= 0.5 ) THEN ! Silt Loam ITEXT(I) = 4 !ZWPRM(I) = 5.0E-2 ELSEIF ( PCLAY(I) >= 0.20 ) THEN IF ( ZSILT(I) >= 0.28 ) THEN ! Loam ITEXT(I) = 5 !ZWPRM(I) = 4.0E-2 ELSE ! Sandy Clay Loam ITEXT(I) = 6 !ZWPRM(I) = 4.0E-2 ENDIF ENDIF ENDIF ! les cas SAND >= 0.87 sont traités: silt < 0.13, clay < 0.1 => entrent dans les cas non encore traités ! les cas SAND >= 0.7 => CLAY < 0.15 , SILT < 0.3 sont traités ) => "" ! les cas SAND >=0.52 .AND. CLAY < 0.20 sont traités SILT < 0.48 => "" ! les cas restants considèrement pclay < 0.20, sand >= 0.5 - pclay => sand >= 0.3 ! => clay + sand >= 0.5 => silt < 0.5 IF ( PSAND(I) >= (0.3*PCLAY(I) + 0.87) ) THEN ! Sand ITEXT(I) = 1 !ZWPRM(I) = 1.5E-2 ELSEIF ( PSAND(I) >= (PCLAY(I) + 0.7) ) THEN ! Loamy Sand ITEXT(I) = 2 !ZWPRM(I) = 2.5E-2 ELSEIF ( PSAND(I) >= 0.52 .AND. PCLAY(I) < 0.20 ) THEN ! Sandy Loam ITEXT(I) = 3 !ZWPRM(I) = 3.0E-2 ELSEIF ( PSAND(I) >= (0.5 - PCLAY(I)) ) THEN IF ( PCLAY(I) < 0.07 ) THEN ! Sandy Loam ITEXT(I) = 3 !ZWPRM(I) = 3.0E-2 ELSEIF ( PCLAY(I) < 0.20 ) THEN ! Loam ITEXT(I) = 5 !ZWPRM(I) = 4.0E-2 ENDIF ENDIF ! ENDDO ! ZDLNDP = 0.1d0 ! [µm] Dln(DP) CALL DISTRIBUTION (NMODE, ZDLNDP, ITEXT, ZDP, ZDSRLV, ZZS0) ! ISEUIL = (/0, 30, 40, 65, NDP/) ZPCEN(:,1) = (/0.005, 0.006, 0.1, 0.10/) ZPCEN(:,2) = (/0.005, 0.006, 1.0, 0.12/) ! ZDSBIN(:,:) = 0.0 ! DO IS = 1, NBIN DO IDP = ISEUIL(IS)+1, ISEUIL(IS+1) DO I = 1, KSIZE ITEX = ITEXT(I) ZDSBIN(I,IS) = ZDSBIN(I,IS) + ZDSRLV(ITEX,IDP) / FLOAT(ISEUIL(IS+1)-ISEUIL(IS)) IF (ITEX==4) THEN ZGAMMA(I,IS) = ZPCEN(IS,1) ELSE ZGAMMA(I,IS) = ZPCEN(IS,2) ENDIF ENDDO ENDDO ENDDO ! ! Adjust threshold velocity for inhibition by roughness elements DO I = 1, SIZE(ZFRC_THR_NCR_DRG) ITEX = ITEXT(I) ZRGH_Z0 = PZ0(I) IF (ZRGH_Z0 <= ZZS0(ITEX)) ZRGH_Z0 = ZZS0(ITEX) ! Factor by which surface roughness increases threshold friction velocity !++grini: fxm: USE WHOLE ARRAY OF Z0 INSTEAD OF ONLY RGH_MMN_MBL AS IN OLD CODE CALL FRC_THR_NCR_DRG_GET(ZRGH_Z0, ZZS0(ITEX), ZFRC_THR_NCR_DRG(I)) ENDDO ! ! Convert volumetric water content to gravimetric water content CALL VWC2GWC(GFLG_MBL, PWSAT, PWG, ZGWC_SFC) ! Factor by which soil moisture increases threshold friction velocity CALL FRC_THR_NCR_WTR_GET (GFLG_MBL, ZWPRM, ZGWC_SFC, ZFRC_THR_NCR_WTR) ZFRC_THR_NCR_WTR(:) = MAX(ZFRC_THR_NCR_WTR(:), 1.0) ! ! CALL WND_FRC_THR_SLT_GET(PRHOA, XDMT_SLT_OPT, ZWND_FRC_THR_SLT) ! DO I = 1,KSIZE IF (GFLG_MBL(I)) THEN ZWND_FRC_THR_SLT(I) = ZWND_FRC_THR_SLT(I) * ZFRC_THR_NCR_WTR(I) & ! [frc] Adjustment for moisture * ZFRC_THR_NCR_DRG(I) ! I [frc] Adjustment for roughness ZWND_RFR_THR_SLT(I) = ZWND_RFR(I) * ZWND_FRC_THR_SLT(I) / PUSTAR(I) ENDIF ENDDO ! ! CHECK IF THIS CAN BE USED EASILY ! NEEDS 10M WIND SPEED WHICH IS MAYBE KNOWN MAYBE NOT ! ! Saltation increases friction speed by roughening surface CALL WND_FRC_SLT_GET(GFLG_MBL, PUSTAR, ZWND_RFR, ZWND_RFR_THR_SLT, ZWND_FRC_SLT) ! DO IS = 1,NBIN CALL FLX_MSS_HRZ_SLT_TTL_WHI79_GET(ZGAMMA(:,IS)*ZDSBIN(:,IS), GFLG_MBL, PRHOA, & ZWND_FRC_SLT, ZWND_FRC_THR_SLT, ZFLX_MSS_HRZ_SLT_TTL_WBN(:,IS)) ENDDO ! ! Vertical dust mass flux DO IS = 1,NBIN CALL FLX_MSS_VRT_DST_AUST_GET(GFLG_MBL, PRHOA, ZWND_FRC_THR_SLT, ZFLX_MSS_HRZ_SLT_TTL_WBN(:,IS), & ZDST_SLT_FLX_RAT_TTL, ZFLX_MSS_VRT_DST_TTL_WBN(:,IS)) ! DO I = 1, KSIZE ! Vertically integrated streamwise mass flux in wind bin PSFDST(I) = PSFDST(I) + PDST_EROD(I) * XFLX_MSS_FDG_FCTM * ZFLX_MSS_VRT_DST_TTL_WBN(I,IS) ENDDO ENDDO ! END SUBROUTINE DUSTFLUX_GET_MB
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 ! les cas SAND >= 0.7 => CLAY < 0.15 , SILT < 0.3 sont traités ) => "" ! les cas SAND >=0.52 .AND. CLAY < 0.20 sont traités SILT < 0.48 => "" ! les cas restants considèrement pclay < 0.20, sand >= 0.5 - pclay => sand >= 0.3 ! => clay + sand >= 0.5 => silt < 0.5 IF ( PSAND(I) >= (0.3*PCLAY(I) + 0.87) ) THEN ! Sand ITEXT(I) = 1 !ZWPRM(I) = 1.5E-2 ELSEIF ( PSAND(I) >= (PCLAY(I) + 0.7) ) THEN ! Loamy Sand ITEXT(I) = 2 !ZWPRM(I) = 2.5E-2 ELSEIF ( PSAND(I) >= 0.52 .AND. PCLAY(I) < 0.20 ) THEN ! Sandy Loam ITEXT(I) = 3 !ZWPRM(I) = 3.0E-2 ELSEIF ( PSAND(I) >= (0.5 - PCLAY(I)) ) THEN IF ( PCLAY(I) < 0.07 ) THEN ! Sandy Loam ITEXT(I) = 3 !ZWPRM(I) = 3.0E-2 ELSEIF ( PCLAY(I) < 0.20 ) THEN ! Loam ITEXT(I) = 5 !ZWPRM(I) = 4.0E-2 ENDIF ENDIF ! ENDDO ! ZDLNDP = 0.1d0 ! [µm] Dln(DP) CALL DISTRIBUTION (NMODE, ZDLNDP, ITEXT, ZDP, ZDSRLV, ZZS0) ! ISEUIL = (/0, 30, 40, 65, NDP/) ZPCEN(:,1) = (/0.005, 0.006, 0.1, 0.10/) ZPCEN(:,2) = (/0.005, 0.006, 1.0, 0.12/) ! ZDSBIN(:,:) = 0.0 ! DO IS = 1, NBIN DO IDP = ISEUIL(IS)+1, ISEUIL(IS+1) DO I = 1, KSIZE ITEX = ITEXT(I) ZDSBIN(I,IS) = ZDSBIN(I,IS) + ZDSRLV(ITEX,IDP) / FLOAT(ISEUIL(IS+1)-ISEUIL(IS)) IF (ITEX==4) THEN ZGAMMA(I,IS) = ZPCEN(IS,1) ELSE ZGAMMA(I,IS) = ZPCEN(IS,2) ENDIF ENDDO ENDDO ENDDO ! ! Adjust threshold velocity for inhibition by roughness elements DO I = 1, SIZE(ZFRC_THR_NCR_DRG) ITEX = ITEXT(I) ZRGH_Z0 = PZ0(I) IF (ZRGH_Z0 <= ZZS0(ITEX)) ZRGH_Z0 = ZZS0(ITEX) ! Factor by which surface roughness increases threshold friction velocity !++grini: fxm: USE WHOLE ARRAY OF Z0 INSTEAD OF ONLY RGH_MMN_MBL AS IN OLD CODE CALL FRC_THR_NCR_DRG_GET(ZRGH_Z0, ZZS0(ITEX), ZFRC_THR_NCR_DRG(I)) ENDDO ! ! Convert volumetric water content to gravimetric water content CALL VWC2GWC(GFLG_MBL, PWSAT, PWG, ZGWC_SFC) ! Factor by which soil moisture increases threshold friction velocity CALL FRC_THR_NCR_WTR_GET (GFLG_MBL, ZWPRM, ZGWC_SFC, ZFRC_THR_NCR_WTR) ZFRC_THR_NCR_WTR(:) = MAX(ZFRC_THR_NCR_WTR(:), 1.0) ! ! CALL WND_FRC_THR_SLT_GET(PRHOA, XDMT_SLT_OPT, ZWND_FRC_THR_SLT) ! DO I = 1,KSIZE IF (GFLG_MBL(I)) THEN ZWND_FRC_THR_SLT(I) = ZWND_FRC_THR_SLT(I) * ZFRC_THR_NCR_WTR(I) & ! [frc] Adjustment for moisture * ZFRC_THR_NCR_DRG(I) ! I [frc] Adjustment for roughness ZWND_RFR_THR_SLT(I) = ZWND_RFR(I) * ZWND_FRC_THR_SLT(I) / PUSTAR(I) ENDIF ENDDO ! ! CHECK IF THIS CAN BE USED EASILY ! NEEDS 10M WIND SPEED WHICH IS MAYBE KNOWN MAYBE NOT ! ! Saltation increases friction speed by roughening surface CALL WND_FRC_SLT_GET(GFLG_MBL, PUSTAR, ZWND_RFR, ZWND_RFR_THR_SLT, ZWND_FRC_SLT) ! DO IS = 1,NBIN CALL FLX_MSS_HRZ_SLT_TTL_WHI79_GET(ZGAMMA(:,IS)*ZDSBIN(:,IS), GFLG_MBL, PRHOA, & ZWND_FRC_SLT, ZWND_FRC_THR_SLT, ZFLX_MSS_HRZ_SLT_TTL_WBN(:,IS)) ENDDO ! ! Vertical dust mass flux DO IS = 1,NBIN CALL FLX_MSS_VRT_DST_AUST_GET(GFLG_MBL, PRHOA, ZWND_FRC_THR_SLT, ZFLX_MSS_HRZ_SLT_TTL_WBN(:,IS), & ZDST_SLT_FLX_RAT_TTL, ZFLX_MSS_VRT_DST_TTL_WBN(:,IS)) ! DO I = 1, KSIZE ! Vertically integrated streamwise mass flux in wind bin PSFDST(I) = PSFDST(I) + PDST_EROD(I) * XFLX_MSS_FDG_FCTM * ZFLX_MSS_VRT_DST_TTL_WBN(I,IS) ENDDO ENDDO ! END SUBROUTINE DUSTFLUX_GET_MB
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 dustflux_get_mb(PUSTAR, PRHOA, PWG, PZ0, PWSAT, PCLAY, PSAND, PDST_EROD, PWIND10M, PSFDST, KSIZE)
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 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 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)