LCOV - code coverage report
Current view: | top level - chemistry/bulk_aero - dust_model.F90 (source / functions) |  |  | Hit | Total | Coverage
Test: | coverage.info |  | Lines: | 5 | 54 | 9.3 %
Date: | 2025-01-13 21:54:50 |  | Functions: | 1 | 4 | 25.0 %

              Line data    Source code
           1             : !===============================================================================
           2             : ! Dust for Bulk Aerosol Model
           3             : !===============================================================================
           4             : module dust_model
           5             :   use shr_kind_mod,    only: r8 => shr_kind_r8, cl => shr_kind_cl
           6             :   use spmd_utils,      only: masterproc
           7             :   use cam_abortutils,  only: endrun
           8             :   use cam_logfile,     only: iulog
           9             :   use shr_dust_emis_mod,only: is_dust_emis_zender, is_zender_soil_erod_from_atm
          10             :
          11             :   implicit none
          12             :   private
          13             :
          14             :   public :: dust_active
          15             :   public :: dust_names
          16             :   public :: dust_nbin
          17             :   public :: dust_indices
          18             :   public :: dust_emis
          19             :   public :: dust_readnl
          20             :   public :: dust_init
          21             :
          22             :   public :: dust_depvel
          23             :
          24             :   logical :: dust_active = .false.
          25             :
          26             :   integer, parameter :: dust_nbin = 4
          27             :   integer, parameter :: dust_nnum = 0
          28             :
          29             :   character(len=6), parameter :: dust_names(dust_nbin) &
          30             :        = (/'DST01 ', 'DST02 ', 'DST03 ', 'DST04 '/)
          31             :
          32             :   real(r8), parameter :: dust_dmt_grd(dust_nbin+1) &
          33             :        = (/ 0.1e-6_r8, 1.0e-6_r8, 2.5e-6_r8, 5.0e-6_r8, 10.0e-6_r8 /)
          34             :
          35             :   integer  :: dust_indices(dust_nbin)
          36             :   real(r8) :: dust_dmt_vwr(dust_nbin)
          37             :   real(r8) :: dust_stk_crc(dust_nbin)
          38             :
          39             :   real(r8)          :: dust_emis_fact = -1.e36_r8  ! tuning parameter for dust emissions
          40             :   character(len=cl) :: soil_erod_file = 'none'     ! full pathname for soil erodibility dataset
          41             :
          42             : contains
          43             :
          44             :   !=============================================================================
          45             :   ! reads dust namelist options
          46             :   !=============================================================================
          47           0 :   subroutine dust_readnl(nlfile)
          48             :
          49             :     use namelist_utils,  only: find_group_name
          50             :     use spmd_utils,      only: mpicom, masterprocid, mpi_character, mpi_real8, mpi_success
          51             :     use shr_dust_emis_mod, only: shr_dust_emis_readnl
          52             :
          53             :     character(len=*), intent(in) :: nlfile  ! filepath for file containing namelist input
          54             :
          55             :     ! Local variables
          56             :     integer :: unitn, ierr
          57             :     character(len=*), parameter :: subname = 'dust_readnl'
          58             :
          59             :     namelist /dust_nl/ dust_emis_fact, soil_erod_file
          60             :
          61             :     !-----------------------------------------------------------------------------
          62             :
          63             :     ! Read namelist
          64           0 :     if (masterproc) then
          65           0 :        open( newunit=unitn, file=trim(nlfile), status='old' )
          66           0 :        call find_group_name(unitn, 'dust_nl', status=ierr)
          67           0 :        if (ierr == 0) then
          68           0 :           read(unitn, dust_nl, iostat=ierr)
          69           0 :           if (ierr /= 0) then
          70           0 :              call endrun(subname // ':: ERROR reading namelist')
          71             :           end if
          72             :        end if
          73           0 :        close(unitn)
          74             :     end if
          75             :
          76             :     ! Broadcast namelist variables
          77           0 :     call mpi_bcast(soil_erod_file, len(soil_erod_file), mpi_character, masterprocid, mpicom, ierr)
          78           0 :     if (ierr/=mpi_success) then
          79           0 :        call endrun(subname//' MPI_BCAST ERROR: soil_erod_file')
          80             :     end if
          81           0 :     call mpi_bcast(dust_emis_fact, 1, mpi_real8, masterprocid, mpicom, ierr)
          82           0 :     if (ierr/=mpi_success) then
          83           0 :        call endrun(subname//' MPI_BCAST ERROR: dust_emis_fact')
          84             :     end if
          85             :
          86           0 :     call shr_dust_emis_readnl(mpicom, 'drv_flds_in')
          87             :
          88           0 :     if ((soil_erod_file /= 'none') .and. (.not.is_zender_soil_erod_from_atm())) then
          89           0 :        call endrun(subname//': should not specify soil_erod_file if Zender soil erosion is not in CAM')
          90             :     end if
          91             :
          92           0 :     if (masterproc) then
          93           0 :        if (is_dust_emis_zender()) then
          94           0 :           write(iulog,*) subname,': Zender_2003 dust emission method is being used.'
          95             :        end if
          96           0 :        if (is_zender_soil_erod_from_atm()) then
          97           0 :           write(iulog,*) subname,': Zender soil erod file is handled in atm'
          98           0 :           write(iulog,*) subname,': soil_erod_file = ',trim(soil_erod_file)
          99           0 :           write(iulog,*) subname,': dust_emis_fact = ',dust_emis_fact
         100             :        end if
         101             :     end if
         102             :
         103           0 :   end subroutine dust_readnl
         104             :
         105             :   !=============================================================================
         106             :   !=============================================================================
         107        1536 :   subroutine dust_init()
         108             :     use soil_erod_mod, only: soil_erod_init
         109             :     use constituents,  only: cnst_get_ind
         110             :     use dust_common,   only: dust_set_params
         111             :
         112             :     integer :: n
         113             :
         114        7680 :     do n = 1, dust_nbin
         115        7680 :        call cnst_get_ind(dust_names(n), dust_indices(n),abort=.false.)
         116             :     end do
         117        7680 :     dust_active = any(dust_indices(:) > 0)
         118        1536 :     if (.not.dust_active) return
         119             :
         120           0 :     if (is_zender_soil_erod_from_atm()) then
         121           0 :        call  soil_erod_init( dust_emis_fact, soil_erod_file )
         122             :     endif
         123             :
         124           0 :     call dust_set_params( dust_nbin, dust_dmt_grd, dust_dmt_vwr, dust_stk_crc )
         125             :
         126             :   end subroutine dust_init
         127             :
         128             :   !==============================================================================
         129             :   !==============================================================================
         130           0 :   subroutine dust_emis( ncol, lchnk, dust_flux_in, cflx, soil_erod )
         131             :     use soil_erod_mod, only : soil_erod_fact
         132             :     use soil_erod_mod, only : soil_erodibility
         133             :     use cam_history_support, only : fillvalue
         134             :
         135             :    ! args
         136             :     integer,  intent(in)    :: ncol, lchnk
         137             :     real(r8), intent(in)    :: dust_flux_in(:,:)
         138             :     real(r8), intent(inout) :: cflx(:,:)
         139             :     real(r8), intent(out)   :: soil_erod(:)
         140             :
         141             :    ! local vars
         142             :     integer :: i, m, idst
         143             :     real(r8) :: erodfctr(ncol)
         144             :     real(r8), parameter :: dust_emis_sclfctr(dust_nbin) &
         145             :          = (/ 0.011_r8/0.032456_r8, 0.087_r8/0.174216_r8, 0.277_r8/0.4085517_r8, 0.625_r8/0.384811_r8 /)
         146             :
         147             :     ! set dust emissions
         148             :
         149           0 :     if (is_zender_soil_erod_from_atm()) then
         150             :
         151           0 :        col_loop1: do i =1,ncol
         152             :
         153           0 :           soil_erod(i) = soil_erodibility( i, lchnk )
         154             :
         155             :           ! adjust emissions
         156           0 :           do m = 1,dust_nbin
         157             :
         158           0 :              idst = dust_indices(m)
         159           0 :              cflx(i,idst) = -dust_flux_in(i,m) &
         160           0 :                   * dust_emis_sclfctr(m)*soil_erod(i)/dust_emis_fact*1.15_r8
         161             :
         162             :           enddo
         163             :
         164             :        end do col_loop1
         165             :
         166             :     else
         167             :
         168           0 :        col_loop2: do i =1,ncol
         169             :
         170             :           ! adjust emissions
         171           0 :           do m = 1,dust_nbin
         172             :
         173           0 :              idst = dust_indices(m)
         174           0 :              cflx(i,idst) = -dust_flux_in(i,m) * dust_emis_sclfctr(m) / dust_emis_fact
         175             :
         176             :           enddo
         177             :
         178             :        end do col_loop2
         179             :
         180             :     end if
         181             :
         182           0 :   end subroutine dust_emis
         183             :
         184             :   !===============================================================================
         185             :   !===============================================================================
         186           0 :   subroutine dust_depvel( temp, pmid, ram1, fv, ncol,  vlc_dry,vlc_trb,vlc_grv )
         187           0 :     use aerosol_depvel, only: aerosol_depvel_compute
         188             :     use mo_constants,   only: dust_density
         189             :     use ppgrid,         only: pver
         190             :
         191             :     real(r8), intent(in) :: temp(:,:)  ! temperature
         192             :     real(r8), intent(in) :: pmid(:,:)  ! mid point pressure
         193             :     real(r8), intent(in) :: ram1(:)    ! aerodynamical resistance (s/m)
         194             :     real(r8), intent(in) :: fv(:)      ! friction velocity (m/s)
         195             :     integer,  intent(in) :: ncol
         196             :
         197             :     real(r8), intent(out) :: vlc_trb(:,:)    !Turbulent deposn velocity (m/s)
         198             :     real(r8), intent(out) :: vlc_grv(:,:,:)  !grav deposn velocity (m/s)
         199             :     real(r8), intent(out) :: vlc_dry(:,:,:)  !dry deposn velocity (m/s)
         200             :
         201           0 :     real(r8) :: diam(ncol,pver,dust_nbin)
         202             :     integer :: m
         203             :
         204           0 :     do m=1,dust_nbin
         205           0 :        diam(:,:,m) = dust_dmt_vwr(m)
         206             :     enddo
         207             :     call aerosol_depvel_compute( ncol, pver, dust_nbin, temp, pmid, ram1, fv, diam, dust_stk_crc, dust_density, &
         208           0 :                                  vlc_dry,vlc_trb,vlc_grv)
         209           0 :   endsubroutine dust_depvel
         210             :
         211             : end module dust_model

Generated by: LCOV version 1.14