LCOV - code coverage report
Current view: | top level - chemistry/bulk_aero - seasalt_model.F90 (source / functions) |  |  | Hit | Total | Coverage
Test: | coverage.info |  | Lines: | 7 | 30 | 23.3 %
Date: | 2024-12-17 17:57:11 |  | Functions: | 1 | 3 | 33.3 %

              Line data    Source code
           1             : !===============================================================================
           2             : ! Seasalt for Bulk Aerosol Model
           3             : !===============================================================================
           4             : module seasalt_model
           5             :   use shr_kind_mod, only: r8 => shr_kind_r8, cl => shr_kind_cl
           6             :   use ppgrid,       only: pcols, pver
           7             :
           8             :   implicit none
           9             :   private
          10             :
          11             :   public :: seasalt_nbin
          12             :   public :: seasalt_nnum
          13             :   public :: seasalt_names
          14             :   public :: seasalt_indices
          15             :   public :: seasalt_init
          16             :   public :: seasalt_emis
          17             :   public :: seasalt_active
          18             :
          19             :   public :: seasalt_depvel
          20             :
          21             :   logical :: seasalt_active = .false.
          22             :
          23             :   integer, parameter :: seasalt_nbin = 4
          24             :   integer, parameter :: seasalt_nnum = 0
          25             :
          26             :   character(len=6), parameter :: seasalt_names(seasalt_nbin) &
          27             :        = (/'SSLT01', 'SSLT02', 'SSLT03', 'SSLT04'/)
          28             :
          29             :   integer :: seasalt_indices(seasalt_nbin)
          30             :
          31             :  contains
          32             :
          33             :    !=============================================================================
          34             :    !=============================================================================
          35        1536 :    subroutine seasalt_init
          36             :      use cam_history,   only: addfld, fieldname_len
          37             :      use constituents,  only: cnst_get_ind
          38             :
          39             :      character(len=fieldname_len) :: dummy
          40             :      integer :: m
          41             :
          42        7680 :      do m = 1, seasalt_nbin
          43        7680 :         call cnst_get_ind(seasalt_names(m), seasalt_indices(m),abort=.false.)
          44             :      enddo
          45        7680 :      seasalt_active = any(seasalt_indices(:) > 0)
          46             :
          47        1536 :      if (.not.seasalt_active) return
          48             :
          49           0 :      dummy = 'RH'
          50           0 :      call addfld (dummy,(/ 'lev' /), 'A','frac','RH in dry dep calc')
          51           0 :      do m = 1,seasalt_nbin
          52           0 :         dummy = trim(seasalt_names(m)) // 'DI'
          53           0 :         call addfld (dummy,(/ 'lev' /), 'A','m/s',trim(seasalt_names(m))//' deposition diameter')
          54             :      enddo
          55             :
          56        1536 :    end subroutine seasalt_init
          57             :
          58             :   !=============================================================================
          59             :   !=============================================================================
          60           0 :   subroutine seasalt_emis( u10cubed,  srf_temp, ocnfrc, ncol, cflx )
          61             :
          62             :     ! dummy arguments
          63             :     real(r8), intent(in) :: u10cubed(:)
          64             :     real(r8), intent(in) :: srf_temp(:)
          65             :     real(r8), intent(in) :: ocnfrc(:)
          66             :     integer,  intent(in) :: ncol
          67             :     real(r8), intent(inout) :: cflx(:,:)
          68             :
          69             :     ! local vars
          70             :     integer :: ix,m
          71             :     real(r8), parameter :: sslt_source(seasalt_nbin) = (/ 4.77e-15_r8, 5.19e-14_r8, 1.22e-13_r8, 6.91e-14_r8 /)
          72             :
          73           0 :     do m = 1, seasalt_nbin
          74           0 :        ix = seasalt_indices(m)
          75           0 :        cflx(:ncol,ix) = sslt_source(m) * u10cubed(:ncol) * ocnfrc(:ncol)
          76             :     enddo
          77             :
          78        1536 :   end subroutine seasalt_emis
          79             :
          80             :   !=============================================================================
          81             :   !=============================================================================
          82           0 :   subroutine seasalt_depvel( temp, pmid, q, ram1, fv, ncol, lchnk, vlc_dry,vlc_trb,vlc_grv )
          83             :     use aerosol_depvel, only: aerosol_depvel_compute
          84             :     use wv_saturation,  only: qsat
          85             :     use cam_history,    only: outfld
          86             :     use mo_constants,   only: dns_aer_sst=>seasalt_density
          87             :
          88             :     integer,  intent(in) :: ncol, lchnk
          89             :     real(r8), intent(in) :: temp(:,:)  ! temperature
          90             :     real(r8), intent(in) :: pmid(:,:)  ! mid point pressure
          91             :     real(r8), intent(in) :: q(:,:)     ! water vapor
          92             :     real(r8), intent(in) :: ram1(:)    ! aerodynamical resistance (s/m)
          93             :     real(r8), intent(in) :: fv(:)      ! friction velocity (m/s)
          94             :
          95             :     real(r8), intent(out) :: vlc_trb(:,:)    !Turbulent deposn velocity (m/s)
          96             :     real(r8), intent(out) :: vlc_grv(:,:,:)  !grav deposn velocity (m/s)
          97             :     real(r8), intent(out) :: vlc_dry(:,:,:)  !dry deposn velocity (m/s)
          98             :
          99             :     real(r8) :: r
         100             :     real(r8) :: wetdia(pcols,pver,seasalt_nbin)
         101             :     real(r8) :: RH(pcols,pver),es(pcols,pver),qs(pcols,pver)  ! for wet radius calculation
         102             :     real(r8),parameter:: c1=0.7674_r8, c2=3.0790_r8, c3=2.57e-11_r8,c4=-1.424_r8  ! wet radius calculation constants
         103             :     integer :: m, i,k
         104             :
         105             :     ! set stokes correction to 1.0 for now not a bad assumption for our size range)
         106             :     real(r8), parameter :: sslt_stk_crc(seasalt_nbin) = (/ 1.0_r8, 1.0_r8, 1.0_r8, 1.0_r8 /)
         107             :     real(r8), parameter :: sslt_smt_vwr(seasalt_nbin) = (/0.52e-6_r8,2.38e-6_r8,4.86e-6_r8,15.14e-6_r8/)
         108             :
         109             :     !-----------------------------------------------------------------------
         110           0 :     do k = 1, pver
         111           0 :        call qsat(temp(1:ncol,k),pmid(1:ncol,k),es(1:ncol,k),qs(1:ncol,k),ncol)
         112             :     end do
         113           0 :     RH(:ncol,:)=q(:ncol,:)/qs(:ncol,:)
         114           0 :     RH(:ncol,:)=max(0.01_r8,min(0.99_r8,RH(:ncol,:)))
         115             :     ! set stokes correction to 1.0 for now not a bad assumption for our size range)
         116           0 :     do m=1,seasalt_nbin
         117           0 :        r=sslt_smt_vwr(m)/2.0_r8
         118           0 :        do k=1,pver
         119           0 :           do i=1,ncol
         120           0 :              wetdia(i,k,m)=((r**3+c1*r**c2/(c3*r**c4-log(RH(i,k))))**(1._r8/3._r8))*2.0_r8
         121             :           enddo
         122             :        enddo
         123           0 :        call outfld( trim(seasalt_names(m))//'DI',wetdia(:,:,m), pcols, lchnk)
         124             :     enddo
         125           0 :     call outfld( 'RH',RH(:,:), pcols, lchnk)
         126             :
         127             :     call aerosol_depvel_compute( ncol, pver, seasalt_nbin, temp, pmid, ram1, fv, wetdia, sslt_stk_crc, dns_aer_sst, &
         128           0 :                                  vlc_dry,vlc_trb,vlc_grv)
         129             :
         130           0 :   endsubroutine seasalt_depvel
         131             :
         132             : end module seasalt_model

Generated by: LCOV version 1.14