! +-======-+ ! Copyright (c) 2003-2018 United States Government as represented by ! the Admistrator of the National Aeronautics and Space Administration. ! All Rights Reserved. ! ! THIS OPEN SOURCE AGREEMENT ("AGREEMENT") DEFINES THE RIGHTS OF USE, ! REPRODUCTION, DISTRIBUTION, MODIFICATION AND REDISTRIBUTION OF CERTAIN ! COMPUTER SOFTWARE ORIGINALLY RELEASED BY THE UNITED STATES GOVERNMENT AS ! REPRESENTED BY THE GOVERNMENT AGENCY LISTED BELOW ("GOVERNMENT AGENCY"). ! THE UNITED STATES GOVERNMENT, AS REPRESENTED BY GOVERNMENT AGENCY, IS AN ! INTENDED THIRD-PARTY BENEFICIARY OF ALL SUBSEQUENT DISTRIBUTIONS OR ! REDISTRIBUTIONS OF THE SUBJECT SOFTWARE. ANYONE WHO USES, REPRODUCES, ! DISTRIBUTES, MODIFIES OR REDISTRIBUTES THE SUBJECT SOFTWARE, AS DEFINED ! HEREIN, OR ANY PART THEREOF, IS, BY THAT ACTION, ACCEPTING IN FULL THE ! RESPONSIBILITIES AND OBLIGATIONS CONTAINED IN THIS AGREEMENT. ! ! Government Agency: National Aeronautics and Space Administration ! Government Agency Original Software Designation: GSC-15354-1 ! Government Agency Original Software Title: GEOS-5 GCM Modeling Software ! User Registration Requested. Please Visit http://opensource.gsfc.nasa.gov ! Government Agency Point of Contact for Original Software: ! Dale Hithon, SRA Assistant, (301) 286-2691 ! ! +-======-+ !------------------------------------------------------------------------- ! NASA/GSFC, Data Assimilation Office, Code 910.3, GEOS/DAS ! !------------------------------------------------------------------------- !BOP ! ! !MODULE: SeasaltEmissionMod.F90 --- Calculate the Seasalt Emissions ! ! !INTERFACE: ! module SeasaltEmissionMod ! !USES: use Chem_Mod use Chem_ConstMod, only: grav ! Constants ! use Chem_UtilMod use m_mpout implicit none ! !PUBLIC TYPES: ! PRIVATE ! ! !PUBLIC MEMBER FUNCTIONS: ! PUBLIC SeasaltEmission ! PUBLIC SeasaltEmissionGong2003 ! PUBLIC SeasaltEmissionGong1997 ! PUBLIC SeasaltEmissionCaffrey2006 ! !CONSTANTS real, parameter :: r80fac = 1.65 ! ratio of radius(RH=0.8)/radius(RH=0.) [Gerber] real, parameter :: rhop = 2200. ! dry seasalt density [kg m-3] real, parameter :: pi = 3.1415 ! ratio of circumference to diameter of circle ! ! !DESCRIPTION: ! ! This module implements the sea salt aerosol emission parameterizations. ! For all variants, emissions are some function of wind speed (and possibly ! other dynamical parameters) and the sea salt particle radius. Here, ! we assume the model passes in dry radius (or dry radius of size bin edges). ! Output is the mass emission flux (kg m-2 s-1) into that radius bin. ! ! !REVISION HISTORY: ! ! 30Mar2010 Colarco First crack! ! !EOP !------------------------------------------------------------------------- CONTAINS ! ! !IROUTINE: SeasaltEmission - Master driver to compute the sea salt emissions ! ! !INTERFACE: ! subroutine SeasaltEmission ( rLow, rUp, method, w10m, ustar, & memissions, nemissions, rc ) ! !DESCRIPTION: Calculates the seasalt mass emission flux every timestep. ! The particular method (algorithm) used for the calculation is based ! on the value of "method" passed on input. Mostly these algorithms are ! a function of wind speed and particle size (nominally at 80% RH). ! Routine is called once for each size bin, passing in the edge radii ! "rLow" and "rUp" (in dry radius, units of um). Returned in the emission ! mass flux [kg m-2 s-1]. A sub-bin assumption is made to break (possibly) ! large size bins into a smaller space. ! ! !USES: implicit NONE ! !INPUT PARAMETERS: real, intent(in) :: rLow, rUp ! Dry particle bin edge radii [um] real, target, intent(in) :: w10m(:,:) ! 10-m wind speed [m s-1] real, target, intent(in) :: ustar(:,:) ! friction velocity [m s-1] integer, intent(in) :: method ! Algorithm to use ! !OUTPUT PARAMETERS: real, pointer, dimension(:,:) :: memissions ! Mass Emissions Flux [kg m-2 s-1] real, pointer, dimension(:,:) :: nemissions ! Number Emissions Flux [# m-2 s-1] integer, intent(out) :: rc ! Error return code: ! 0 - all is well ! 1 - ! !Local Variables integer :: ir real, pointer :: w(:,:) ! Intermediary wind speed [m s-1] real :: r, dr ! sub-bin radius spacing (dry, um) real :: rwet, drwet ! sub-bin radius spacing (rh=80%, um) real :: aFac, bFac, scalefac, rpow, exppow, wpow integer, parameter :: nr = 10 ! Number of (linear) sub-size bins character(len=*), parameter :: myname = 'SeasaltEmission' ! Define the sub-bins (still in dry radius) dr = (rUp - rLow)/nr r = rLow + 0.5*dr ! Loop over size bins nemissions = 0. memissions = 0. do ir = 1, nr rwet = r80fac * r drwet = r80fac * dr select case(method) case(1) ! Gong 2003 aFac = 4.7*(1.+30.*rwet)**(-0.017*rwet**(-1.44)) bFac = (0.433-log10(rwet))/0.433 scalefac = 1. rpow = 3.45 exppow = 1.607 wpow = 3.41 w => w10m case(2) ! Gong 1997 aFac = 3. bFac = (0.380-log10(rwet))/0.650 scalefac = 1. rpow = 1.05 exppow = 1.19 wpow = 3.41 w => w10m case(3) ! GEOS5 2012 aFac = 4.7*(1.+30.*rwet)**(-0.017*rwet**(-1.44)) bFac = (0.433-log10(rwet))/0.433 scalefac = 33.0e3 rpow = 3.45 exppow = 1.607 wpow = 3.41 - 1. w => ustar case default if(MAPL_AM_I_ROOT()) print *, 'SeasaltEmission missing algorithm method' rc = 1 return end select ! Number emissions flux (# m-2 s-1) nemissions = nemissions + SeasaltEmissionGong( rwet, drwet, w, scalefac, aFac, bFac, rpow, exppow, wpow ) ! Mass emissions flux (kg m-2 s-1) scalefac = scalefac * 4./3.*pi*rhop*r**3.*1.e-18 memissions = memissions + SeasaltEmissionGong( rwet, drwet, w, scalefac, aFac, bFac, rpow, exppow, wpow ) r = r + dr end do rc = 0 end subroutine SeasaltEmission ! Function to compute sea salt emissions following the Gong style ! parameterization. Functional form is from Gong 2003: ! dN/dr = scalefac * 1.373 * (w^wpow) * (r^-aFac) * (1+0.057*r^rpow) * 10^(exppow*exp(-bFac^2)) ! where r is the particle radius at 80% RH, dr is the size bin width at 80% RH, and w is the wind speed function SeasaltEmissionGong ( r, dr, w, scalefac, aFac, bFac, rpow, exppow, wpow ) real, intent(in) :: r, dr ! Wet particle radius, bin width [um] real, pointer, intent(in) :: w(:,:) ! Grid box mean wind speed [m s-1] (10-m or ustar wind) real, intent(in) :: scalefac, aFac, bFac, rpow, exppow, wpow real :: SeasaltEmissionGong(size(w,1),size(w,2)) ! Initialize SeasaltEmissionGong = 0. ! Particle size distribution function SeasaltEmissionGong = scalefac * 1.373*r**(-aFac)*(1.+0.057*r**rpow) & *10**(exppow*exp(-bFac**2.))*dr ! Apply wind speed function SeasaltEmissionGong = w**wpow * SeasaltEmissionGong end function SeasaltEmissionGong end module