From 154065bced11ee47346f8173a4418a2d474c4751 Mon Sep 17 00:00:00 2001 From: Chloe Date: Thu, 13 Jun 2024 09:31:57 -0700 Subject: [PATCH] Added new snow Thermal Conductivity in SoilTemperatureMod.F90 based on Fourteau, et al. (2021) - is now density and temp dependent --- .../namelist_files/namelist_definition.xml | 4 ++ .../elm/src/biogeophys/SoilTemperatureMod.F90 | 61 ++++++++++++++++--- components/elm/src/main/controlMod.F90 | 10 ++- components/elm/src/main/elm_varctl.F90 | 1 + 4 files changed, 67 insertions(+), 9 deletions(-) diff --git a/components/elm/bld/namelist_files/namelist_definition.xml b/components/elm/bld/namelist_files/namelist_definition.xml index 16bca299ddd7..b111c1ff4282 100644 --- a/components/elm/bld/namelist_files/namelist_definition.xml +++ b/components/elm/bld/namelist_files/namelist_definition.xml @@ -728,6 +728,10 @@ This option enables more realistic snowpack conditions on glaciers and ice sheets, including a semi-empirical firn densification model. uses the same physics as use_extrasnowlayers but uses the original 5 snow layer scheme + + +Toggle to use new snow thermal conductivity that relies on snow temperature and density. = snl(c)+1) .AND. (j <= 0)) then + bw(c,j) = (h2osoi_ice(c,j)+h2osoi_liq(c,j))/(frac_sno(c)*dz(c,j)) + !write(iulog,*)"CAW bw(c,j)",bw(c,j) + + do i = 1, 5 + if (i == 1) then + k_snw_vals(i) = 2.564 * (bw(c,j)/ rho_ice)**2 - 0.059 * (bw(c,j)/ rho_ice) + 0.0205 + else if (i == 2) then + k_snw_vals(i) = 2.172 * (bw(c,j)/ rho_ice)**2 + 0.015 * (bw(c,j)/ rho_ice) + 0.0252 + else if (i == 3) then + k_snw_vals(i) = 1.985 * (bw(c,j)/ rho_ice)**2 + 0.073 * (bw(c,j)/ rho_ice) + 0.0336 + else if (i == 4) then + k_snw_vals(i) = 1.883 * (bw(c,j)/ rho_ice)**2 + 0.107 * (bw(c,j)/ rho_ice) + 0.0386 + else if (i == 5) then + k_snw_vals(i) = 1.776 * (bw(c,j)/ rho_ice)**2 + 0.147 * (bw(c,j)/ rho_ice) + 0.0455 + end if + end do + + do i = 1, size(k_snw_tmps) - 1 + if (k_snw_tmps(i) <= t_soisno(c,j) .and. t_soisno(c,j) <= k_snw_tmps(i + 1)) then + thk(c,j) = k_snw_vals(i) + (t_soisno(c,j) - k_snw_tmps(i))*(k_snw_vals(i + 1)-k_snw_vals(i))/(k_snw_tmps(i + 1)-k_snw_tmps(i)) + end if + end do + + ! Handle edge cases if t_soisno(c,j) is outside the given range + if (t_soisno(c,j) < k_snw_tmps(1)) then + thk(c,j) = k_snw_vals(1) + else if (t_soisno(c,j) > k_snw_tmps(size(k_snw_tmps))) then + thk(c,j) = k_snw_vals(size(k_snw_tmps)) + end if + + ! write(iulog,*)"CAW snow layer:",j + ! write(iulog,*)"CAW snow temp:",t_soisno(c,j) + ! write(iulog,*)"CAW snow density:",bw(c,j) + ! write(iulog,*)"CAW snow thk:",thk(c,j) + end if - ! Thermal conductivity of snow, which from Jordan (1991) pp. 18 - ! Only examine levels from snl(c)+1 -> 0 where snl(c) < 1 - if (snl(c)+1 < 1 .AND. (j >= snl(c)+1) .AND. (j <= 0)) then - bw(c,j) = (h2osoi_ice(c,j)+h2osoi_liq(c,j))/(frac_sno(c)*dz(c,j)) - thk(c,j) = tkair + (7.75e-5_r8 *bw(c,j) + 1.105e-6_r8*bw(c,j)*bw(c,j))*(tkice-tkair) - end if + else + ! Thermal conductivity of snow, which from Jordan (1991) pp. 18 + ! Only examine levels from snl(c)+1 -> 0 where snl(c) < 1 + if (snl(c)+1 < 1 .AND. (j >= snl(c)+1) .AND. (j <= 0)) then + bw(c,j) = (h2osoi_ice(c,j)+h2osoi_liq(c,j))/(frac_sno(c)*dz(c,j)) + thk(c,j) = tkair + (7.75e-5_r8 *bw(c,j) + 1.105e-6_r8*bw(c,j)*bw(c,j))*(tkice-tkair) + end if + endif end do end do diff --git a/components/elm/src/main/controlMod.F90 b/components/elm/src/main/controlMod.F90 index 02c3ccf0867f..90f33c603ef4 100755 --- a/components/elm/src/main/controlMod.F90 +++ b/components/elm/src/main/controlMod.F90 @@ -282,7 +282,7 @@ subroutine control_init( ) use_nofire, use_lch4, use_vertsoilc, use_extralakelayers, & use_vichydro, use_century_decomp, use_cn, use_crop, use_snicar_frc, & use_snicar_ad, use_firn_percolation_and_compaction, use_extrasnowlayers,& - use_vancouver, use_mexicocity, use_noio + use_snow_thk, use_vancouver, use_mexicocity, use_noio ! cpl_bypass variables namelist /elm_inparm/ metdata_type, metdata_bypass, metdata_biases, & @@ -723,7 +723,11 @@ subroutine control_spmd() call mpi_bcast (use_vertsoilc, 1, MPI_LOGICAL, 0, mpicom, ier) call mpi_bcast (use_extralakelayers, 1, MPI_LOGICAL, 0, mpicom, ier) call mpi_bcast (use_extrasnowlayers, 1, MPI_LOGICAL, 0, mpicom, ier) +<<<<<<< HEAD call mpi_bcast (use_firn_percolation_and_compaction, 1, MPI_LOGICAL, 0, mpicom, ier) +======= + call mpi_bcast (use_snow_thk, 1, MPI_LOGICAL, 0, mpicom, ier) +>>>>>>> aa0f583905 (Added new snow Thermal Conductivity in SoilTemperatureMod.F90) call mpi_bcast (use_vichydro, 1, MPI_LOGICAL, 0, mpicom, ier) call mpi_bcast (use_century_decomp, 1, MPI_LOGICAL, 0, mpicom, ier) call mpi_bcast (use_cn, 1, MPI_LOGICAL, 0, mpicom, ier) @@ -1024,7 +1028,11 @@ subroutine control_print () write(iulog,*) ' use_lake_wat_storage = ', use_lake_wat_storage write(iulog,*) ' use_extralakelayers = ', use_extralakelayers write(iulog,*) ' use_extrasnowlayers = ', use_extrasnowlayers +<<<<<<< HEAD write(iulog,*) ' use_firn_percolation_and_compaction = ', use_firn_percolation_and_compaction +======= + write(iulog,*) ' use_snow_thk = ', use_snow_thk +>>>>>>> aa0f583905 (Added new snow Thermal Conductivity in SoilTemperatureMod.F90) write(iulog,*) ' use_vichydro = ', use_vichydro write(iulog,*) ' use_century_decomp = ', use_century_decomp write(iulog,*) ' use_cn = ', use_cn diff --git a/components/elm/src/main/elm_varctl.F90 b/components/elm/src/main/elm_varctl.F90 index b9ddd4b24397..29e05cb090e7 100644 --- a/components/elm/src/main/elm_varctl.F90 +++ b/components/elm/src/main/elm_varctl.F90 @@ -373,6 +373,7 @@ module elm_varctl logical, public :: use_snicar_ad = .false. logical, public :: use_extrasnowlayers = .false. logical, public :: use_firn_percolation_and_compaction = .false. + logical, public :: use_snow_thk = .false. logical, public :: use_vancouver = .false. logical, public :: use_mexicocity = .false. logical, public :: use_noio = .false.