SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/dustflux_get_mb.F90
Go to the documentation of this file.
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