Calculate albedo of snow containing impurities and the evolution of snow effective radius
USES:
use shr_kind_mod , only : r8 => shr_kind_r8 use shr_sys_mod , only : shr_sys_flush use clm_varctl , only : iulog use shr_const_mod , only : SHR_CONST_RHOICE use abortutils , only : endrun implicit none savePUBLIC MEMBER FUNCTIONS:
public :: SNICAR_RT ! Snow albedo and vertically-resolved solar absorption public :: SnowAge_grain ! Snow effective grain size evolution public :: SnowAge_init ! Initial read in of snow-aging file public :: SnowOptics_init ! Initial read in of snow-optics filePUBLIC DATA MEMBERS:
real(r8), public, parameter :: snw_rds_min = 54.526_r8 ! minimum allowed snow effective radius (also "fresh snow" value) [microns] integer, public, parameter :: sno_nbr_aer = 8 ! number of aerosol species in snowpack (indices described above) [nbr] logical, public, parameter :: DO_SNO_OC = .false. ! parameter to include organic carbon (OC) in snowpack radiative calculations logical, public, parameter :: DO_SNO_AER = .true. ! parameter to include aerosols in snowpack radiative calculations real(r8), public, parameter :: scvng_fct_mlt_bcphi = 0.20_r8 ! scavenging factor for hydrophillic BC inclusion in meltwater [frc] real(r8), public, parameter :: scvng_fct_mlt_bcpho = 0.03_r8 ! scavenging factor for hydrophobic BC inclusion in meltwater [frc] real(r8), public, parameter :: scvng_fct_mlt_ocphi = 0.20_r8 ! scavenging factor for hydrophillic OC inclusion in meltwater [frc] real(r8), public, parameter :: scvng_fct_mlt_ocpho = 0.03_r8 ! scavenging factor for hydrophobic OC inclusion in meltwater [frc] real(r8), public, parameter :: scvng_fct_mlt_dst1 = 0.02_r8 ! scavenging factor for dust species 1 inclusion in meltwater [frc] real(r8), public, parameter :: scvng_fct_mlt_dst2 = 0.02_r8 ! scavenging factor for dust species 2 inclusion in meltwater [frc] real(r8), public, parameter :: scvng_fct_mlt_dst3 = 0.01_r8 ! scavenging factor for dust species 3 inclusion in meltwater [frc] real(r8), public, parameter :: scvng_fct_mlt_dst4 = 0.01_r8 ! scavenging factor for dust species 4 inclusion in meltwater [frc]PRIVATE MEMBER FUNCTIONS:
!PRIVATE DATA MEMBERS: ! Aerosol species indices: ! 1= hydrophillic black carbon ! 2= hydrophobic black carbon ! 3= hydrophilic organic carbon ! 4= hydrophobic organic carbon ! 5= dust species 1 ! 6= dust species 2 ! 7= dust species 3 ! 8= dust species 4 integer, parameter :: numrad_snw = 5 ! number of spectral bands used in snow model [nbr] integer, parameter :: nir_bnd_bgn = 2 ! first band index in near-IR spectrum [idx] integer, parameter :: nir_bnd_end = 5 ! ending near-IR band index [idx] integer, parameter :: idx_Mie_snw_mx = 1471 ! number of effective radius indices used in Mie lookup table [idx] integer, parameter :: idx_T_max = 11 ! maxiumum temperature index used in aging lookup table [idx] integer, parameter :: idx_T_min = 1 ! minimum temperature index used in aging lookup table [idx] integer, parameter :: idx_Tgrd_max = 31 ! maxiumum temperature gradient index used in aging lookup table [idx] integer, parameter :: idx_Tgrd_min = 1 ! minimum temperature gradient index used in aging lookup table [idx] integer, parameter :: idx_rhos_max = 8 ! maxiumum snow density index used in aging lookup table [idx] integer, parameter :: idx_rhos_min = 1 ! minimum snow density index used in aging lookup table [idx] integer, parameter :: snw_rds_max_tbl = 1500 ! maximum effective radius defined in Mie lookup table [microns] integer, parameter :: snw_rds_min_tbl = 30 ! minimium effective radius defined in Mie lookup table [microns] real(r8), parameter :: snw_rds_max = 1500._r8 ! maximum allowed snow effective radius [microns] real(r8), parameter :: snw_rds_refrz = 1000._r8 ! effective radius of re-frozen snow [microns] real(r8), parameter :: min_snw = 1.0E-30_r8 ! minimum snow mass required for SNICAR RT calculation [kg m-2] !real(r8), parameter :: C1_liq_Brun89 = 1.28E-17_r8 ! constant for liquid water grain growth [m3 s-1], from Brun89 real(r8), parameter :: C1_liq_Brun89 = 0._r8 ! constant for liquid water grain growth [m3 s-1], from Brun89: zeroed to accomodate dry snow aging real(r8), parameter :: C2_liq_Brun89 = 4.22E-13_r8 ! constant for liquid water grain growth [m3 s-1], from Brun89: corrected for LWC in units of percent real(r8), parameter :: tim_cns_bc_rmv = 2.2E-8_r8 ! time constant for removal of BC in snow on sea-ice [s-1] (50% mass removal/year) real(r8), parameter :: tim_cns_oc_rmv = 2.2E-8_r8 ! time constant for removal of OC in snow on sea-ice [s-1] (50% mass removal/year) real(r8), parameter :: tim_cns_dst_rmv = 2.2E-8_r8 ! time constant for removal of dust in snow on sea-ice [s-1] (50% mass removal/year) ! scaling of the snow aging rate (tuning option): logical :: flg_snoage_scl = .false. ! flag for scaling the snow aging rate by some arbitrary factor real(r8), parameter :: xdrdt = 1.0_r8 ! arbitrary factor applied to snow aging rate ! snow and aerosol Mie parameters: ! (arrays declared here, but are set in iniTimeConst) ! (idx_Mie_snw_mx is number of snow radii with defined parameters (i.e. from 30um to 1500um)) ! direct-beam weighted ice optical properties real(r8) :: ss_alb_snw_drc(idx_Mie_snw_mx,numrad_snw) real(r8) :: asm_prm_snw_drc(idx_Mie_snw_mx,numrad_snw) real(r8) :: ext_cff_mss_snw_drc(idx_Mie_snw_mx,numrad_snw) ! diffuse radiation weighted ice optical properties real(r8) :: ss_alb_snw_dfs(idx_Mie_snw_mx,numrad_snw) real(r8) :: asm_prm_snw_dfs(idx_Mie_snw_mx,numrad_snw) real(r8) :: ext_cff_mss_snw_dfs(idx_Mie_snw_mx,numrad_snw) ! hydrophiliic BC real(r8) :: ss_alb_bc1(numrad_snw) real(r8) :: asm_prm_bc1(numrad_snw) real(r8) :: ext_cff_mss_bc1(numrad_snw) ! hydrophobic BC real(r8) :: ss_alb_bc2(numrad_snw) real(r8) :: asm_prm_bc2(numrad_snw) real(r8) :: ext_cff_mss_bc2(numrad_snw) ! hydrophobic OC real(r8) :: ss_alb_oc1(numrad_snw) real(r8) :: asm_prm_oc1(numrad_snw) real(r8) :: ext_cff_mss_oc1(numrad_snw) ! hydrophilic OC real(r8) :: ss_alb_oc2(numrad_snw) real(r8) :: asm_prm_oc2(numrad_snw) real(r8) :: ext_cff_mss_oc2(numrad_snw) ! dust species 1: real(r8) :: ss_alb_dst1(numrad_snw) real(r8) :: asm_prm_dst1(numrad_snw) real(r8) :: ext_cff_mss_dst1(numrad_snw) ! dust species 2: real(r8) :: ss_alb_dst2(numrad_snw) real(r8) :: asm_prm_dst2(numrad_snw) real(r8) :: ext_cff_mss_dst2(numrad_snw) ! dust species 3: real(r8) :: ss_alb_dst3(numrad_snw) real(r8) :: asm_prm_dst3(numrad_snw) real(r8) :: ext_cff_mss_dst3(numrad_snw) ! dust species 4: real(r8) :: ss_alb_dst4(numrad_snw) real(r8) :: asm_prm_dst4(numrad_snw) real(r8) :: ext_cff_mss_dst4(numrad_snw) ! best-fit parameters for snow aging defined over: ! 11 temperatures from 225 to 273 K ! 31 temperature gradients from 0 to 300 K/m ! 8 snow densities from 0 to 350 kg/m3 ! (arrays declared here, but are set in iniTimeConst) real(r8), pointer :: snowage_tau(:,:,:) ! (idx_rhos_max,idx_Tgrd_max,idx_T_max) real(r8), pointer :: snowage_kappa(:,:,:) ! (idx_rhos_max,idx_Tgrd_max,idx_T_max) real(r8), pointer :: snowage_drdt0(:,:,:) ! idx_rhos_max,idx_Tgrd_max,idx_T_max)REVISION HISTORY:
Created by Mark Flanner