SURFEX v7.3
General documentation of Surfex
|
00001 SUBROUTINE DUSTFLUX_GET_MB( & 00002 PUSTAR & !I [m/s] Wind friction speed 00003 ,PRHOA & !I [kg/m3] air density at 2m height 00004 ,PWG & !I [m3/m3] volumetric water content 00005 ,PZ0 & !I [m] roughness length of surface 00006 ,PWSAT & !I [m3 m-3] saturation liquid water content 00007 ,PCLAY & !I [frc] mass fraction clay 00008 ,PSAND & !I [frc] mass fraction sand 00009 ,PDST_EROD & !I [frc] erodible surface 00010 ,PWIND10M & !I [m/s] wind at 10m altitude 00011 ,PSFDST & !O [kg/m2/sec] Vertical dust flux 00012 ,KSIZE & !I [nbr] number of points for calculation 00013 ) 00014 ! 00015 USE MODE_DSTMBLUTL !Dust mobilization subroutines 00016 USE MODD_DST_SURF, ONLY : CVERMOD 00017 USE MODD_DSTMBL, ONLY : XFLX_MSS_FDG_FCTM, NTEX, NMODE, NDP, NBIN, XCST_SLT, & 00018 XDMT_SLT_OPT 00019 USE MODD_CSTS, only: XPI 00020 ! 00021 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00022 USE PARKIND1 ,ONLY : JPRB 00023 ! 00024 IMPLICIT NONE 00025 ! 00026 !INPUT, set their dimensions to their passed lengths or to KSIZE ? 00027 INTEGER, INTENT(IN) :: KSIZE ![nbr] length of passed arrays 00028 REAL, INTENT(IN), DIMENSION(KSIZE) :: PUSTAR ![m/s] wind friction speed 00029 REAL, INTENT(IN), DIMENSION(KSIZE) :: PRHOA ![kg/m3] air density at 2m height 00030 REAL, INTENT(IN), DIMENSION(KSIZE) :: PCLAY ![frc] mass fraction clay 00031 REAL, INTENT(IN), DIMENSION(KSIZE) :: PSAND ![frc] mass fraction sand 00032 REAL, INTENT(IN), DIMENSION(KSIZE) :: PDST_EROD![frc] 00033 REAL, INTENT(IN), DIMENSION(KSIZE) :: PWG ![m3 m-3] volumetric water fraction 00034 REAL, INTENT(IN), DIMENSION(KSIZE) :: PWSAT ![m3 m-3] saturation water content 00035 REAL, INTENT(IN), DIMENSION(KSIZE) :: PZ0 ![m] surface roughness length 00036 REAL, INTENT(IN), DIMENSION(KSIZE) :: PWIND10M ![m/s] wind at 10m altitude 00037 !OUTPUT the flux of dust 00038 REAL, INTENT(OUT), DIMENSION(KSIZE) :: PSFDST ! [kg m-2 s-1] Output flux of atmospheric dust 00039 ! 00040 !!!!!!!&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&!!!!!! 00041 00042 !#ifdef AlG01 00043 ! real,parameter::XFLX_MSS_FDG_FCT=28. ! [frc] Global mass flux tuning factor (a posteriori) 00044 !#else 00045 ! real,parameter::XFLX_MSS_FDG_FCT=7.0e-4 ! [frc] Global mass flux tuning factor (a posteriori) 00046 ! real,parameter::XFLX_MSS_FDG_FCT=21.0e-4 ! [frc] Global mass flux tuning factor (a posteriori) 00047 ! real,parameter::XFLX_MSS_FDG_FCT=12.0e-4 ! [frc] values used in Masdev47 00048 ! 00049 !Define local variables: 00050 LOGICAL, DIMENSION(KSIZE) :: GFLG_MBL ! [frc] Mobilization candidate flag 00051 !REAL, DIMENSION(KSIZE) :: ZMBL_BSN_FCT ! [frc] enhancement factor for grid cells with higher erodibility 00052 REAL, DIMENSION(KSIZE) :: ZWND_RFR ! [m s-1] wind speed at reference level 00053 REAL, DIMENSION(KSIZE) :: ZWND_FRC_THR_SLT ! [m/s] Threshold wind friction speed when all effects taken into account 00054 REAL, DIMENSION(KSIZE) :: ZWND_RFR_THR_SLT ! [m s-1] Threshold wind speed at reference level 00055 REAL, DIMENSION(KSIZE) :: ZGWC_SFC ! [kg/kg] Gravimetric water content 00056 REAL, DIMENSION(KSIZE) :: ZFRC_THR_NCR_WTR ! [frc] Fraction by which soil wetness increases threshold wind 00057 REAL, DIMENSION(KSIZE) :: ZFRC_THR_NCR_DRG ! [frc] fraction by which drag partitioning increases threshold wind 00058 REAL, DIMENSION(KSIZE) :: ZWND_FRC_SLT ! [m/s] wind friction speed after modified for saltation feedbacks 00059 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 00060 REAL, DIMENSION(KSIZE,NBIN) :: ZFLX_MSS_VRT_DST_TTL_WBN ! [kg m-2 s-1] 00061 REAL, DIMENSION(KSIZE) :: ZDST_SLT_FLX_RAT_TTL ! [m-1] ratio of vertical to horizontal flux (alpha in several papers) 00062 REAL, DIMENSION(KSIZE) :: ZSILT ! [frc] dummy for fraction of silt 00063 REAL, DIMENSION(KSIZE) :: ZWPRM ! threshold soil wetness 00064 INTEGER, DIMENSION(KSIZE) :: ITEXT ! soil texture 00065 REAL, DIMENSION(NTEX,NDP) :: ZDSRLV ! Surface relative des grains du sol 00066 REAL, DIMENSION(KSIZE,NBIN) :: ZDSBIN ! 00067 REAL, DIMENSION(KSIZE,NBIN) :: ZGAMMA ! 00068 INTEGER, DIMENSION(NBIN+1) :: ISEUIL 00069 REAL, DIMENSION(NBIN,2) :: ZPCEN 00070 REAL, DIMENSION(NTEX) :: ZZS0 ! rugosité de la surface lisse 00071 REAL, DIMENSION(NDP) :: ZDP ! [µm] diamètre du particule 00072 REAL :: ZDLNDP, ZRGH_Z0 00073 INTEGER :: I !Counter for number of points (used in loops) 00074 INTEGER :: IDP !Counter for number of particle 00075 INTEGER :: ITEX !Counter for number of texture 00076 INTEGER :: IS 00077 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00078 ! 00079 IF (LHOOK) CALL DR_HOOK('DUSTFLUX_GET_MB',0,ZHOOK_HANDLE) 00080 ! 00081 !Initialize mobilization candidate flag 00082 GFLG_MBL(:) = .TRUE. 00083 !fxm: Get erodibility limitation factor, use something connected to amount of sand 00084 !Discuss with Valery Masson 00085 !ZMBL_BSN_FCT(:) = PSAND(:) 00086 ! utilisé dans le calcul de l'effet Owen 00087 ZWND_RFR(:) = PWIND10M(:) 00088 ! 00089 ! Initialize vertical dust flux 00090 ZFLX_MSS_VRT_DST_TTL_WBN(:,:) = 0.d0 00091 ZFLX_MSS_HRZ_SLT_TTL_WBN(:,:) = 0.d0 00092 ! 00093 PSFDST(:) = 0.0d0 00094 ! 00095 ! CLAY : CLAY >= 0.40 SILT < 0.40 SAND < 0.45 00096 ! SANDY CLAY : CLAY >= 0.36 SAND >= 0.45 00097 ! SILTY CLAY : CLAY >= 0.40 SILT >= 0.40 00098 ! SILT : SILT >= 0.8 CLAY < 0.12 00099 ! SAND : SAND >= 0.3*CLAY + 0.87 00100 ! SANDY CLAY LOAM : CLAY >= 0.28 CLAY < 0.36 SAND >= 0.45 | CLAY >= 0.20 CLAY < 0.28 SILT < 0.28 00101 ! SILTY CLAY LOAM : CLAY >= 0.28 CLAY < 0.40 SAND < 0.20 00102 ! CLAY LOAM : CLAY >= 0.28 CLAY < 0.40 SAND >= 0.20 SAND < 0.45 00103 ! SILT LOAM : SILT >= 0.8 CLAY >= 0.12 | SILT >= 0.5 SILT < 0.8 CLAY < 0.28 00104 ! LOAMY SAND : SAND >= CLAY + 0.7 SAND < 0.3*CLAY + 0.87 00105 ! SANDY LOAM : SAND >= 0.52 CLAY < 0.20 | SAND >= (0.5 - CLAY) CLAY < 0.07 00106 ! LOAM : CLAY >= 0.20 CLAY < 0.28 SILT >= 0.28 SILT < 0.5 | SAND >= (0.5 - CLAY) CLAY < 0.20 00107 DO I = 1, KSIZE 00108 ! 00109 ZSILT(I) = 1.0 - PCLAY(I) - PSAND(I) 00110 IF (ZSILT(I) <= 0.) ZSILT(I) = 0.0 00111 ZWPRM(I) = 3.0*PCLAY(I) * (0.17 + 0.0014 * PCLAY(I)) 00112 ZWPRM(I) = MIN( 0.15, MAX(0.053, ZWPRM(I)) ) 00113 ! 00114 !tous les cas CLAY >= 0.28 sont traités 00115 IF ( PCLAY(I) >= 0.28 ) THEN 00116 IF ( PSAND(I) >= 0.45 ) THEN 00117 IF (PCLAY(I) >= 0.36 ) THEN ! Sandy Clay 00118 ITEXT(I) = 9 00119 !ZWPRM(I) = 10.0E-2 00120 ELSE ! Sandy Clay Loam 00121 ITEXT(I) = 6 00122 !ZWPRM(I) = 6.0E-2 00123 ENDIF 00124 ELSEIF ( PCLAY(I) >= 0.40 ) THEN 00125 IF ( ZSILT(I) >= 0.40 ) THEN ! Silty Clay 00126 ITEXT(I) = 10 00127 !ZWPRM(I) = 10.5E-2 00128 ELSE ! Clay 00129 ITEXT(I) = 11 00130 !ZWPRM(I) = 11.5E-2 00131 ENDIF 00132 ELSEIF (PSAND(I) >= 0.20 ) THEN ! Clay Loam 00133 ITEXT(I) = 8 00134 !ZWPRM(I) = 6.8E-2 00135 ELSE ! Silty Clay Loam 00136 ITEXT(I) = 7 00137 !ZWPRM(I) = 6.8E-2 00138 ENDIF 00139 ENDIF 00140 ! les cas ZSILT >= 0.5 .AND. PCLAY < 0.28 sont traités 00141 ! les cas ZSILT < 0.5 .AND. PCLAY >= 0.20 sont traités 00142 ! ne sont pas traités les cas PCLAY < 0.20 .AND. ZSILT < 0.5 => SAND >= 0.3 00143 IF ( ZSILT(I) >= 0.8 .AND. PCLAY(I) < 0.12 ) THEN ! Silt 00144 ITEXT(I) = 12 00145 !ZWPRM(I) = 2.5E-2 00146 ELSEIF ( PCLAY(I) < 0.28 ) THEN ! ( clay est forcément < 0.28 ) 00147 IF ( ZSILT(I) >= 0.5 ) THEN ! Silt Loam 00148 ITEXT(I) = 4 00149 !ZWPRM(I) = 5.0E-2 00150 ELSEIF ( PCLAY(I) >= 0.20 ) THEN 00151 IF ( ZSILT(I) >= 0.28 ) THEN ! Loam 00152 ITEXT(I) = 5 00153 !ZWPRM(I) = 4.0E-2 00154 ELSE ! Sandy Clay Loam 00155 ITEXT(I) = 6 00156 !ZWPRM(I) = 4.0E-2 00157 ENDIF 00158 ENDIF 00159 ENDIF 00160 ! les cas SAND >= 0.87 sont traités: silt < 0.13, clay < 0.1 => entrent dans les cas non encore traités 00161 ! les cas SAND >= 0.7 => CLAY < 0.15 , SILT < 0.3 sont traités ) => "" 00162 ! les cas SAND >=0.52 .AND. CLAY < 0.20 sont traités SILT < 0.48 => "" 00163 ! les cas restants considèrement pclay < 0.20, sand >= 0.5 - pclay => sand >= 0.3 00164 ! => clay + sand >= 0.5 => silt < 0.5 00165 IF ( PSAND(I) >= (0.3*PCLAY(I) + 0.87) ) THEN ! Sand 00166 ITEXT(I) = 1 00167 !ZWPRM(I) = 1.5E-2 00168 ELSEIF ( PSAND(I) >= (PCLAY(I) + 0.7) ) THEN ! Loamy Sand 00169 ITEXT(I) = 2 00170 !ZWPRM(I) = 2.5E-2 00171 ELSEIF ( PSAND(I) >= 0.52 .AND. PCLAY(I) < 0.20 ) THEN ! Sandy Loam 00172 ITEXT(I) = 3 00173 !ZWPRM(I) = 3.0E-2 00174 ELSEIF ( PSAND(I) >= (0.5 - PCLAY(I)) ) THEN 00175 IF ( PCLAY(I) < 0.07 ) THEN ! Sandy Loam 00176 ITEXT(I) = 3 00177 !ZWPRM(I) = 3.0E-2 00178 ELSEIF ( PCLAY(I) < 0.20 ) THEN ! Loam 00179 ITEXT(I) = 5 00180 !ZWPRM(I) = 4.0E-2 00181 ENDIF 00182 ENDIF 00183 ! 00184 ENDDO 00185 ! 00186 ZDLNDP = 0.1d0 ! [µm] Dln(DP) 00187 CALL DISTRIBUTION (NMODE, ZDLNDP, ITEXT, ZDP, ZDSRLV, ZZS0) 00188 ! 00189 ISEUIL = (/0, 30, 40, 65, NDP/) 00190 ZPCEN(:,1) = (/0.005, 0.006, 0.1, 0.10/) 00191 ZPCEN(:,2) = (/0.005, 0.006, 1.0, 0.12/) 00192 ! 00193 ZDSBIN(:,:) = 0.0 00194 ! 00195 DO IS = 1, NBIN 00196 DO IDP = ISEUIL(IS)+1, ISEUIL(IS+1) 00197 DO I = 1, KSIZE 00198 ITEX = ITEXT(I) 00199 ZDSBIN(I,IS) = ZDSBIN(I,IS) + ZDSRLV(ITEX,IDP) / FLOAT(ISEUIL(IS+1)-ISEUIL(IS)) 00200 IF (ITEX==4) THEN 00201 ZGAMMA(I,IS) = ZPCEN(IS,1) 00202 ELSE 00203 ZGAMMA(I,IS) = ZPCEN(IS,2) 00204 ENDIF 00205 ENDDO 00206 ENDDO 00207 ENDDO 00208 ! 00209 ! Adjust threshold velocity for inhibition by roughness elements 00210 DO I = 1, SIZE(ZFRC_THR_NCR_DRG) 00211 ITEX = ITEXT(I) 00212 ZRGH_Z0 = PZ0(I) 00213 IF (ZRGH_Z0 <= ZZS0(ITEX)) ZRGH_Z0 = ZZS0(ITEX) 00214 ! Factor by which surface roughness increases threshold friction velocity 00215 !++grini: fxm: USE WHOLE ARRAY OF Z0 INSTEAD OF ONLY RGH_MMN_MBL AS IN OLD CODE 00216 CALL FRC_THR_NCR_DRG_GET(ZRGH_Z0, ZZS0(ITEX), ZFRC_THR_NCR_DRG(I)) 00217 ENDDO 00218 ! 00219 ! Convert volumetric water content to gravimetric water content 00220 CALL VWC2GWC(GFLG_MBL, PWSAT, PWG, ZGWC_SFC) 00221 ! Factor by which soil moisture increases threshold friction velocity 00222 CALL FRC_THR_NCR_WTR_GET (GFLG_MBL, ZWPRM, ZGWC_SFC, ZFRC_THR_NCR_WTR) 00223 ZFRC_THR_NCR_WTR(:) = MAX(ZFRC_THR_NCR_WTR(:), 1.0) 00224 ! 00225 ! 00226 CALL WND_FRC_THR_SLT_GET(PRHOA, XDMT_SLT_OPT, ZWND_FRC_THR_SLT) 00227 ! 00228 DO I = 1,KSIZE 00229 IF (GFLG_MBL(I)) THEN 00230 ZWND_FRC_THR_SLT(I) = ZWND_FRC_THR_SLT(I) * ZFRC_THR_NCR_WTR(I) & ! [frc] Adjustment for moisture 00231 * ZFRC_THR_NCR_DRG(I) ! I [frc] Adjustment for roughness 00232 ZWND_RFR_THR_SLT(I) = ZWND_RFR(I) * ZWND_FRC_THR_SLT(I) / PUSTAR(I) 00233 ENDIF 00234 ENDDO 00235 ! 00236 ! CHECK IF THIS CAN BE USED EASILY 00237 ! NEEDS 10M WIND SPEED WHICH IS MAYBE KNOWN MAYBE NOT ! 00238 ! Saltation increases friction speed by roughening surface 00239 CALL WND_FRC_SLT_GET(GFLG_MBL, PUSTAR, ZWND_RFR, ZWND_RFR_THR_SLT, ZWND_FRC_SLT) 00240 ! 00241 DO IS = 1,NBIN 00242 CALL FLX_MSS_HRZ_SLT_TTL_WHI79_GET(ZGAMMA(:,IS)*ZDSBIN(:,IS), GFLG_MBL, PRHOA, & 00243 ZWND_FRC_SLT, ZWND_FRC_THR_SLT, ZFLX_MSS_HRZ_SLT_TTL_WBN(:,IS)) 00244 ENDDO 00245 ! 00246 ! Vertical dust mass flux 00247 DO IS = 1,NBIN 00248 CALL FLX_MSS_VRT_DST_AUST_GET(GFLG_MBL, PRHOA, ZWND_FRC_THR_SLT, ZFLX_MSS_HRZ_SLT_TTL_WBN(:,IS), & 00249 ZDST_SLT_FLX_RAT_TTL, ZFLX_MSS_VRT_DST_TTL_WBN(:,IS)) 00250 ! 00251 DO I = 1, KSIZE 00252 ! Vertically integrated streamwise mass flux in wind bin 00253 PSFDST(I) = PSFDST(I) + PDST_EROD(I) * XFLX_MSS_FDG_FCTM * ZFLX_MSS_VRT_DST_TTL_WBN(I,IS) 00254 ENDDO 00255 ENDDO 00256 ! 00257 END SUBROUTINE DUSTFLUX_GET_MB