1 !WRF:MEDIATION_LAYER:PHYSICS
2 ! *** add new modules of schemes here
4 MODULE module_dust_emis
7 !====================================================================================
8 ! simple dust emission scheme outside of WRF_CHEM
9 ! revised from s/r mosaic_dust_gocartemis
10 ! Mei Xu 2017Jan31 and additions by G. Thompson 2017Sep19
11 !====================================================================================
12 subroutine bulk_dust_emis (ktau,dt,num_soil_layers,u_phy,v_phy, &
13 rho_phy,alt,u10,v10,p8w,dz8w,smois,erod, &
14 ivgtyp,isltyp,vegfra,albbck,xland,dx,g, &
16 ids,ide, jds,jde, kds,kde, &
17 ims,ime, jms,jme, kms,kme, &
18 its,ite, jts,jte, kts,kte )
19 !====================================================================================
21 ! ktau - simulation time
22 ! dt - size of timestep
23 ! u_phy,v_phy - state variables of wind
24 ! rho_phy,alt - state variable of density and inverse of density
25 ! dz8w,p8w - model layer depth
26 ! ivgtyp,isltyp - dominant vegetation, soil type
27 ! vegfra - vegetation fraction (0-100)
28 ! albbck - background sfc albedo used to increase erod where desert-like
29 ! xland - land mask (1: land, 2: water)
30 ! dx, g - model grid increment, gravity constant
31 ! smois - soil moisture
32 ! erod - fraction of erodible grid cell, for 1: Sand, 2: Silt, 3: Clay
33 ! - read in from wrfinput
35 ! nifa2d - dust generation in #/kg/s - to be used to update QNIFA (# kg-1)
36 !------------------------------------------------------------------------------------
38 ! nmx - number of dust size bins
39 ! ilwi - land/water flag
40 ! bems - binned dust emission in kg/timestep/cell
41 ! totalemis - dust emission from 0.1-10 um in radius, in ug/m2/s
42 ! erodin - fraction of erodible grid cel,
43 ! w10m - total wind speed at 10 m
44 ! gwet - volumetric soil moisture over porosity
45 ! dxy - model grid box area
46 ! airmas - grid box air mass
47 ! airden - air density
48 ! DSRC - source of each dust type (kg/timestep/cell)
50 ! USED from module_data_gocart_dust:
52 ! ch_dust - Constant to fudge the total emission of dust (s2/m2)
53 ! frac_s - mass fraction of dust
54 !====================================================================================
56 USE module_data_gocart_dust
60 INTEGER, INTENT(IN ) :: ktau, num_soil_layers, &
61 ids,ide, jds,jde, kds,kde, &
62 ims,ime, jms,jme, kms,kme, &
63 its,ite, jts,jte, kts,kte
64 INTEGER,DIMENSION( ims:ime , jms:jme ) , &
68 REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: &
71 REAL, DIMENSION( ims:ime, num_soil_layers, jms:jme ) , &
72 INTENT(INOUT) :: smois
73 REAL, DIMENSION( ims:ime , jms:jme, 3 ) , &
75 REAL, DIMENSION( ims:ime , jms:jme ) , &
80 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
86 REAL, INTENT(IN ) :: dt,dx,g
87 REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: NIFA2D
91 integer :: i,j,k, nmx, month, n, m, maxflux
92 real*8 w10m,gwet,den,diam,airden,airmas,erodin
95 REAL*8 u_ts0, u_ts, dsrc, srce
96 real rhoa, g0, totalemis, pi, dustmas
111 ! consider 5 dust diameter/density as in module_data_gocart_dust
114 den = den_dust(n)*1.0D-3 ! in g/cm3
115 diam = 2.0*reff_dust(n)*1.0D2 ! in cm
116 dustmas = (pi/6.) * den * (diam)**3 ! in g
117 ch_dust(n,:)=1.0D-9 ! default is 1 ug s2 m-5 == 1.e-9 kg s2 m-5
118 month = 3 ! it doesn't matter, ch_dust is not a month dependent now, a constant
119 m = ipoint(n) ! which of the 3 classes of fractional erod data is to be used; ipoint(3)=2
127 ! don't do dust over water!!!
128 ! we still need to add in a check for snow cover on dusty ground. TO DO item
130 if(xland(i,j).lt.1.5) then
132 w10m=sqrt(u10(i,j)*u10(i,j)+v10(i,j)*v10(i,j))
133 airmas=-(p8w(i,kts+1,j)-p8w(i,kts,j))*dxy/g ! kg
135 ! we don't trust the u10,v10 values, if model layers are very thin near surface
136 if(dz8w(i,kts,j).lt.12.)w10m=sqrt(u_phy(i,kts,j)*u_phy(i,kts,j)+v_phy(i,kts,j)*v_phy(i,kts,j))
138 ! consider using a gust factor of 33 percent higher than sustained wind (Cao and Fovell, 2018; also G. Bryan)
143 ! increase erodability where the surface albedo is high to account better for real deserts
144 if (erodin .gt. 1.E-8 .AND. albbck(i,j).gt.0.175 .and. vegfra(i,j).lt.12.5) then
145 erodin = min(0.5d0, dble(erodin + 0.1*albbck(i,j)))
148 ! volumetric soil moisture over porosity
149 gwet=smois(i,1,j)/porosity(isltyp(i,j))
150 airden=rho_phy(i,kts,j)
153 ! Threshold velocity as a function of the dust density and the diameter from Bagnold (1941)
154 u_ts0 = 0.13*1.0D-2*SQRT(den*g0*diam/rhoa)* &
155 SQRT(1.0+0.006/den/g0/(diam)**2.5)/ &
156 SQRT(1.928*(1331.0*(diam)**1.56+0.38)**0.092-1.0)
158 ! Case of surface dry enough to erode
159 IF (gwet < 0.5) THEN ! Pete's modified value
160 ! IF (gwet < 0.2) THEN
161 u_ts = max(0.0d0,dble(u_ts0*(1.2d0+2.0d-1*log10(max(1.0d-3, dble(gwet))))))
163 ! Case of wet surface, no erosion
166 srce = frac_s(n)*erodin*dxy ! (m2)
167 ! srce = 1.1*erodin*dxy ! (m2)
168 dsrc = max(0.0d0, dble(ch_dust(n,month)*srce*w10m*w10m *(w10m - u_ts)*dt)) ! (kg)
170 ! unit change from kg/timestep/cell to ug/m2/s
171 ! totalemis=((dsrc)/dt)*converi/dxy
172 ! totalemis=totalemis*1.01 !to account for the particles larger than 10 um based on assumed size distribution
174 ! convert dust flux to number concentration (#/kg/s)
175 ! nifa2d = dsrc/dt / dustParticle_mas /cell_air_mass
177 nifa2d(i,j) = nifa2d(i,j) + dsrc/dt * 1000.0/dustmas/airmas
180 maxflux = MAX(maxflux,int(nifa2d(i,j)))
185 ! print*,'check maximum dust flux: ', maxflux
187 end subroutine bulk_dust_emis
189 END MODULE module_dust_emis