From 9b73adef756d7ec144890e16f12c38f8536e987d Mon Sep 17 00:00:00 2001 From: kmdeck Date: Mon, 14 Oct 2024 12:15:50 -0700 Subject: [PATCH] compute fractional absorbances --- docs/src/APIs/canopy/RadiativeTransfer.md | 6 +- .../standalone/Canopy/canopy_tutorial.jl | 1 - .../fluxnet/US-Ha1/US-Ha1_parameters.jl | 1 - .../fluxnet/US-MOz/US-MOz_parameters.jl | 1 - .../fluxnet/US-NR1/US-NR1_parameters.jl | 1 - .../fluxnet/US-Var/US-Var_parameters.jl | 1 - .../standalone/Vegetation/no_vegetation.jl | 1 - .../standalone/Vegetation/timestep_test.jl | 1 - .../standalone/Vegetation/varying_lai.jl | 1 - .../Vegetation/varying_lai_with_stem.jl | 1 - ext/CreateParametersExt.jl | 2 - .../fluxnet_sites/US-Ha1/US-Ha1_parameters.jl | 2 - .../fluxnet_sites/US-MOz/US-MOz_parameters.jl | 2 - .../fluxnet_sites/US-NR1/US-NR1_parameters.jl | 2 - .../fluxnet_sites/US-Var/US-Var_parameters.jl | 2 - .../src/Fluxnet/run_fluxnet.jl | 1 - src/diagnostics/land_compute_methods.jl | 40 ++----- src/integrated/soil_canopy_model.jl | 33 +++--- src/standalone/Vegetation/Canopy.jl | 25 ++-- .../Vegetation/canopy_parameterizations.jl | 108 +++++------------- .../Vegetation/optimality_farquhar.jl | 32 ++++-- src/standalone/Vegetation/photosynthesis.jl | 24 ++-- src/standalone/Vegetation/radiation.jl | 27 ++--- .../Vegetation/solar_induced_fluorescence.jl | 7 +- test/standalone/Vegetation/canopy_model.jl | 27 ++--- .../test_bigleaf_parameterizations.jl | 32 ++++-- test/standalone/Vegetation/test_two_stream.jl | 3 +- 27 files changed, 146 insertions(+), 238 deletions(-) diff --git a/docs/src/APIs/canopy/RadiativeTransfer.md b/docs/src/APIs/canopy/RadiativeTransfer.md index 2ab97b2e64..dd35bc5fa2 100644 --- a/docs/src/APIs/canopy/RadiativeTransfer.md +++ b/docs/src/APIs/canopy/RadiativeTransfer.md @@ -13,9 +13,9 @@ ClimaLand.Canopy.BeerLambertParameters ## Methods ```@docs -ClimaLand.Canopy.compute_absorbances! -ClimaLand.Canopy.plant_absorbed_pfd_beer_lambert -ClimaLand.Canopy.plant_absorbed_pfd_two_stream +ClimaLand.Canopy.compute_fractional_absorbances +ClimaLand.Canopy.canopy_sw_rt_beer_lambert +ClimaLand.Canopy.canopy_sw_rt_two_stream ClimaLand.Canopy.extinction_coeff ClimaLand.Canopy.canopy_radiant_energy_fluxes! ``` \ No newline at end of file diff --git a/docs/tutorials/standalone/Canopy/canopy_tutorial.jl b/docs/tutorials/standalone/Canopy/canopy_tutorial.jl index ee307594d2..5280cbb267 100644 --- a/docs/tutorials/standalone/Canopy/canopy_tutorial.jl +++ b/docs/tutorials/standalone/Canopy/canopy_tutorial.jl @@ -163,7 +163,6 @@ rt_params = TwoStreamParameters( τ_NIR_leaf = FT(0.25), Ω = FT(0.69), λ_γ_PAR = FT(5e-7), - λ_γ_NIR = FT(1.65e-6), ) rt_model = TwoStreamModel{FT}(rt_params); diff --git a/experiments/integrated/fluxnet/US-Ha1/US-Ha1_parameters.jl b/experiments/integrated/fluxnet/US-Ha1/US-Ha1_parameters.jl index 601e0baa32..3909278cae 100644 --- a/experiments/integrated/fluxnet/US-Ha1/US-Ha1_parameters.jl +++ b/experiments/integrated/fluxnet/US-Ha1/US-Ha1_parameters.jl @@ -39,7 +39,6 @@ ld = FT(0.5) G_Function = ConstantGFunction(ld) α_PAR_leaf = FT(0.1) λ_γ_PAR = FT(5e-7) -λ_γ_NIR = FT(1.65e-6) τ_PAR_leaf = FT(0.05) α_NIR_leaf = FT(0.45) τ_NIR_leaf = FT(0.25) diff --git a/experiments/integrated/fluxnet/US-MOz/US-MOz_parameters.jl b/experiments/integrated/fluxnet/US-MOz/US-MOz_parameters.jl index 3e91359850..ae922ed5a9 100644 --- a/experiments/integrated/fluxnet/US-MOz/US-MOz_parameters.jl +++ b/experiments/integrated/fluxnet/US-MOz/US-MOz_parameters.jl @@ -38,7 +38,6 @@ soil_α_NIR = FT(0.2) G_Function = CLMGFunction(χl) α_PAR_leaf = FT(0.1) λ_γ_PAR = FT(5e-7) -λ_γ_NIR = FT(1.65e-6) τ_PAR_leaf = FT(0.05) α_NIR_leaf = FT(0.45) τ_NIR_leaf = FT(0.25) diff --git a/experiments/integrated/fluxnet/US-NR1/US-NR1_parameters.jl b/experiments/integrated/fluxnet/US-NR1/US-NR1_parameters.jl index 39b8378f6b..e3c6a3fc81 100644 --- a/experiments/integrated/fluxnet/US-NR1/US-NR1_parameters.jl +++ b/experiments/integrated/fluxnet/US-NR1/US-NR1_parameters.jl @@ -42,7 +42,6 @@ ld = FT(0.5) G_Function = ConstantGFunction(ld) α_PAR_leaf = FT(0.1) λ_γ_PAR = FT(5e-7) -λ_γ_NIR = FT(1.65e-6) τ_PAR_leaf = FT(0.05) α_NIR_leaf = FT(0.35) τ_NIR_leaf = FT(0.25) diff --git a/experiments/integrated/fluxnet/US-Var/US-Var_parameters.jl b/experiments/integrated/fluxnet/US-Var/US-Var_parameters.jl index 638f05d7b3..9ae81835fe 100644 --- a/experiments/integrated/fluxnet/US-Var/US-Var_parameters.jl +++ b/experiments/integrated/fluxnet/US-Var/US-Var_parameters.jl @@ -46,7 +46,6 @@ ld = FT(0.5) G_Function = ConstantGFunction(ld) α_PAR_leaf = FT(0.11) λ_γ_PAR = FT(5e-7) -λ_γ_NIR = FT(1.65e-6) τ_PAR_leaf = FT(0.05) α_NIR_leaf = FT(0.35) τ_NIR_leaf = FT(0.34) diff --git a/experiments/standalone/Vegetation/no_vegetation.jl b/experiments/standalone/Vegetation/no_vegetation.jl index 6ba629b02d..8b7d8acd8e 100644 --- a/experiments/standalone/Vegetation/no_vegetation.jl +++ b/experiments/standalone/Vegetation/no_vegetation.jl @@ -74,7 +74,6 @@ rt_params = TwoStreamParameters( τ_NIR_leaf = FT(0.25), Ω = FT(0.69), λ_γ_PAR = FT(5e-7), - λ_γ_NIR = FT(1.65e-6), ) rt_model = TwoStreamModel{FT}(rt_params); diff --git a/experiments/standalone/Vegetation/timestep_test.jl b/experiments/standalone/Vegetation/timestep_test.jl index ae47cd1bca..6838aefa1d 100644 --- a/experiments/standalone/Vegetation/timestep_test.jl +++ b/experiments/standalone/Vegetation/timestep_test.jl @@ -113,7 +113,6 @@ rt_params = TwoStreamParameters( τ_NIR_leaf = FT(0.25), Ω = FT(0.69), λ_γ_PAR = FT(5e-7), - λ_γ_NIR = FT(1.65e-6), ) rt_model = TwoStreamModel{FT}(rt_params); diff --git a/experiments/standalone/Vegetation/varying_lai.jl b/experiments/standalone/Vegetation/varying_lai.jl index d7c1930ded..ffbe8dc54b 100644 --- a/experiments/standalone/Vegetation/varying_lai.jl +++ b/experiments/standalone/Vegetation/varying_lai.jl @@ -74,7 +74,6 @@ rt_params = TwoStreamParameters( τ_NIR_leaf = FT(0.25), Ω = FT(0.69), λ_γ_PAR = FT(5e-7), - λ_γ_NIR = FT(1.65e-6), ) rt_model = TwoStreamModel{FT}(rt_params); diff --git a/experiments/standalone/Vegetation/varying_lai_with_stem.jl b/experiments/standalone/Vegetation/varying_lai_with_stem.jl index 79de400588..fde26180a5 100644 --- a/experiments/standalone/Vegetation/varying_lai_with_stem.jl +++ b/experiments/standalone/Vegetation/varying_lai_with_stem.jl @@ -74,7 +74,6 @@ rt_params = TwoStreamParameters( τ_NIR_leaf = FT(0.25), Ω = FT(0.69), λ_γ_PAR = FT(5e-7), - λ_γ_NIR = FT(1.65e-6), ) rt_model = TwoStreamModel{FT}(rt_params); diff --git a/ext/CreateParametersExt.jl b/ext/CreateParametersExt.jl index ddedcd45ec..bd75f8ae58 100644 --- a/ext/CreateParametersExt.jl +++ b/ext/CreateParametersExt.jl @@ -613,7 +613,6 @@ function TwoStreamParameters( ) where {F} name_map = (; :wavelength_per_PAR_photon => :λ_γ_PAR, - :wavelength_per_NIR_photon => :λ_γ_NIR, :canopy_emissivity => :ϵ_canopy, ) @@ -670,7 +669,6 @@ function BeerLambertParameters( ) where {F} name_map = (; :wavelength_per_PAR_photon => :λ_γ_PAR, - :wavelength_per_NIR_photon => :λ_γ_NIR, :canopy_emissivity => :ϵ_canopy, ) diff --git a/lib/ClimaLandSimulations/src/Fluxnet/fluxnet_sites/US-Ha1/US-Ha1_parameters.jl b/lib/ClimaLandSimulations/src/Fluxnet/fluxnet_sites/US-Ha1/US-Ha1_parameters.jl index cc6b100104..81249e980c 100644 --- a/lib/ClimaLandSimulations/src/Fluxnet/fluxnet_sites/US-Ha1/US-Ha1_parameters.jl +++ b/lib/ClimaLandSimulations/src/Fluxnet/fluxnet_sites/US-Ha1/US-Ha1_parameters.jl @@ -105,7 +105,6 @@ function radiative_transfer_harvard(; ld = ConstantGFunction(FT(0.5)), α_PAR_leaf = FT(0.1), λ_γ_PAR = FT(5e-7), - λ_γ_NIR = FT(1.65e-6), τ_PAR_leaf = FT(0.05), α_NIR_leaf = FT(0.45), τ_NIR_leaf = FT(0.25), @@ -121,7 +120,6 @@ function radiative_transfer_harvard(; ϵ_canopy = ϵ_canopy, Ω = Ω, λ_γ_PAR = λ_γ_PAR, - λ_γ_NIR = λ_γ_NIR, n_layers = n_layers, ) end diff --git a/lib/ClimaLandSimulations/src/Fluxnet/fluxnet_sites/US-MOz/US-MOz_parameters.jl b/lib/ClimaLandSimulations/src/Fluxnet/fluxnet_sites/US-MOz/US-MOz_parameters.jl index 58c5496ddb..14b6612cbe 100644 --- a/lib/ClimaLandSimulations/src/Fluxnet/fluxnet_sites/US-MOz/US-MOz_parameters.jl +++ b/lib/ClimaLandSimulations/src/Fluxnet/fluxnet_sites/US-MOz/US-MOz_parameters.jl @@ -105,7 +105,6 @@ function radiative_transfer_ozark(; ld = ConstantGFunction(FT(0.5)), α_PAR_leaf = FT(0.1), λ_γ_PAR = FT(5e-7), - λ_γ_NIR = FT(1.65e-6), τ_PAR_leaf = FT(0.05), α_NIR_leaf = FT(0.45), τ_NIR_leaf = FT(0.25), @@ -121,7 +120,6 @@ function radiative_transfer_ozark(; ϵ_canopy = ϵ_canopy, Ω = Ω, λ_γ_PAR = λ_γ_PAR, - λ_γ_NIR = λ_γ_NIR, n_layers = n_layers, ) end diff --git a/lib/ClimaLandSimulations/src/Fluxnet/fluxnet_sites/US-NR1/US-NR1_parameters.jl b/lib/ClimaLandSimulations/src/Fluxnet/fluxnet_sites/US-NR1/US-NR1_parameters.jl index bafdb21c53..2cbf6ccc69 100644 --- a/lib/ClimaLandSimulations/src/Fluxnet/fluxnet_sites/US-NR1/US-NR1_parameters.jl +++ b/lib/ClimaLandSimulations/src/Fluxnet/fluxnet_sites/US-NR1/US-NR1_parameters.jl @@ -105,7 +105,6 @@ function radiative_transfer_niwotridge(; ld = ConstantGFunction(FT(0.5)), α_PAR_leaf = FT(0.1), λ_γ_PAR = FT(5e-7), - λ_γ_NIR = FT(1.65e-6), τ_PAR_leaf = FT(0.05), α_NIR_leaf = FT(0.35), τ_NIR_leaf = FT(0.25), @@ -121,7 +120,6 @@ function radiative_transfer_niwotridge(; ϵ_canopy = ϵ_canopy, Ω = Ω, λ_γ_PAR = λ_γ_PAR, - λ_γ_NIR = λ_γ_NIR, n_layers = n_layers, ) end diff --git a/lib/ClimaLandSimulations/src/Fluxnet/fluxnet_sites/US-Var/US-Var_parameters.jl b/lib/ClimaLandSimulations/src/Fluxnet/fluxnet_sites/US-Var/US-Var_parameters.jl index 6fac7afa48..1d9c76c276 100644 --- a/lib/ClimaLandSimulations/src/Fluxnet/fluxnet_sites/US-Var/US-Var_parameters.jl +++ b/lib/ClimaLandSimulations/src/Fluxnet/fluxnet_sites/US-Var/US-Var_parameters.jl @@ -105,7 +105,6 @@ function radiative_transfer_vairaranch(; ld = ConstantGFunction(FT(0.5)), α_PAR_leaf = FT(0.1), λ_γ_PAR = FT(5e-7), - λ_γ_NIR = FT(1.65e-6), τ_PAR_leaf = FT(0.05), α_NIR_leaf = FT(0.45), τ_NIR_leaf = FT(0.25), @@ -121,7 +120,6 @@ function radiative_transfer_vairaranch(; ϵ_canopy = ϵ_canopy, Ω = Ω, λ_γ_PAR = λ_γ_PAR, - λ_γ_NIR = λ_γ_NIR, n_layers = n_layers, ) end diff --git a/lib/ClimaLandSimulations/src/Fluxnet/run_fluxnet.jl b/lib/ClimaLandSimulations/src/Fluxnet/run_fluxnet.jl index 15df581761..ca6b7242d8 100644 --- a/lib/ClimaLandSimulations/src/Fluxnet/run_fluxnet.jl +++ b/lib/ClimaLandSimulations/src/Fluxnet/run_fluxnet.jl @@ -112,7 +112,6 @@ function run_fluxnet( G_Function = params.radiative_transfer.G_Function, α_PAR_leaf = params.radiative_transfer.α_PAR_leaf, λ_γ_PAR = params.radiative_transfer.λ_γ_PAR, - λ_γ_NIR = params.radiative_transfer.λ_γ_NIR, τ_PAR_leaf = params.radiative_transfer.τ_PAR_leaf, α_NIR_leaf = params.radiative_transfer.α_NIR_leaf, τ_NIR_leaf = params.radiative_transfer.τ_NIR_leaf, diff --git a/src/diagnostics/land_compute_methods.jl b/src/diagnostics/land_compute_methods.jl index 875f52345d..8a5db9220f 100644 --- a/src/diagnostics/land_compute_methods.jl +++ b/src/diagnostics/land_compute_methods.jl @@ -111,38 +111,14 @@ end @diagnostic_compute "vcmax25" Union{SoilCanopyModel, LandModel} p.canopy.photosynthesis.Vcmax25 # Canopy - Radiative Transfer -@diagnostic_compute "near_infrared_radiation_down" Union{ - SoilCanopyModel, - LandModel, -} p.canopy.radiative_transfer.inc_nir -@diagnostic_compute "near_infrared_radiation_absorbed" Union{ - SoilCanopyModel, - LandModel, -} p.canopy.radiative_transfer.nir.abs -@diagnostic_compute "near_infrared_radiation_reflected" Union{ - SoilCanopyModel, - LandModel, -} p.canopy.radiative_transfer.nir.refl -@diagnostic_compute "near_infrared_radiation_transmitted" Union{ - SoilCanopyModel, - LandModel, -} p.canopy.radiative_transfer.nir.trans -@diagnostic_compute "photosynthetically_active_radiation_down" Union{ - SoilCanopyModel, - LandModel, -} p.canopy.radiative_transfer.inc_par -@diagnostic_compute "photosynthetically_active_radiation_absorbed" Union{ - SoilCanopyModel, - LandModel, -} p.canopy.radiative_transfer.par.abs -@diagnostic_compute "photosynthetically_active_radiation_reflected" Union{ - SoilCanopyModel, - LandModel, -} p.canopy.radiative_transfer.par.refl -@diagnostic_compute "photosynthetically_active_radiation_transmitted" Union{ - SoilCanopyModel, - LandModel, -} p.canopy.radiative_transfer.par.trans +@diagnostic_compute "near_infrared_radiation_down" Union{SoilCanopyModel, LandModel} p.canopy.radiative_transfer.nir_d +@diagnostic_compute "near_infrared_radiation_absorbed" Union{SoilCanopyModel, LandModel} p.canopy.radiative_transfer.nir.abs +@diagnostic_compute "near_infrared_radiation_reflected" Union{SoilCanopyModel, LandModel} p.canopy.radiative_transfer.nir.refl +@diagnostic_compute "near_infrared_radiation_transmitted" Union{SoilCanopyModel, LandModel} p.canopy.radiative_transfer.nir.trans +@diagnostic_compute "photosynthetically_active_radiation_down" Union{SoilCanopyModel, LandModel} p.canopy.radiative_transfer.par_d +@diagnostic_compute "photosynthetically_active_radiation_absorbed" Union{SoilCanopyModel, LandModel} p.canopy.radiative_transfer.par.abs +@diagnostic_compute "photosynthetically_active_radiation_reflected" Union{SoilCanopyModel, LandModel} p.canopy.radiative_transfer.par.refl +@diagnostic_compute "photosynthetically_active_radiation_transmitted" Union{SoilCanopyModel, LandModel} p.canopy.radiative_transfer.par.trans @diagnostic_compute "radiation_longwave_net" Union{SoilCanopyModel, LandModel} p.canopy.radiative_transfer.LW_n @diagnostic_compute "radiation_shortwave_net" Union{SoilCanopyModel, LandModel} p.canopy.radiative_transfer.SW_n diff --git a/src/integrated/soil_canopy_model.jl b/src/integrated/soil_canopy_model.jl index a4a11f1f4d..d7823ada75 100644 --- a/src/integrated/soil_canopy_model.jl +++ b/src/integrated/soil_canopy_model.jl @@ -293,12 +293,7 @@ function lsm_radiant_energy_fluxes!( _σ = LP.Stefan(earth_param_set) LW_d = p.drivers.LW_d SW_d = p.drivers.SW_d - c = LP.light_speed(earth_param_set) - h = LP.planck_constant(earth_param_set) - N_a = LP.avogadro_constant(earth_param_set) - (; λ_γ_PAR, λ_γ_NIR) = canopy_radiation.parameters - energy_per_photon_PAR = h * c / λ_γ_PAR - energy_per_photon_NIR = h * c / λ_γ_NIR + T_canopy = ClimaLand.Canopy.canopy_temperature(canopy.energy, canopy, Y, p, t) @@ -315,27 +310,25 @@ function lsm_radiant_energy_fluxes!( R_net_soil = p.soil.R_n LW_u = p.LW_u SW_u = p.SW_u + par_d = p.canopy.radiative_transfer.par_d + nir_d = p.canopy.radiative_transfer.nir_d + f_abs_par = p.canopy.radiative_transfer.par.abs + f_abs_nir = p.canopy.radiative_transfer.nir.abs + f_refl_par = p.canopy.radiative_transfer.par.refl + f_refl_nir = p.canopy.radiative_transfer.nir.refl + f_trans_par = p.canopy.radiative_transfer.par.trans + f_trans_nir = p.canopy.radiative_transfer.nir.trans # in total: d - u = CANOPY_ABS + (1-α_soil)*CANOPY_TRANS # SW upwelling = reflected par + reflected nir - @. SW_u = - energy_per_photon_NIR * N_a * p.canopy.radiative_transfer.nir.refl + - energy_per_photon_PAR * N_a * p.canopy.radiative_transfer.par.refl + @. SW_u = par_d * f_refl_par + f_refl_nir * nir_d # net canopy - @. SW_net_canopy = - energy_per_photon_NIR * N_a * p.canopy.radiative_transfer.nir.abs + - energy_per_photon_PAR * N_a * p.canopy.radiative_transfer.par.abs + @. SW_net_canopy = f_abs_par * par_d + f_abs_nir * nir_d # net soil = (1-α)*trans for par and nir @. R_net_soil .= - energy_per_photon_NIR * - N_a * - p.canopy.radiative_transfer.nir.trans * - (1 - α_soil_NIR) + - energy_per_photon_PAR * - N_a * - p.canopy.radiative_transfer.par.trans * - (1 - α_soil_PAR) + f_trans_nir * nir_d * (1 - α_soil_NIR) + + f_trans_par * par_d * (1 - α_soil_PAR) # Working through the math, this satisfies: LW_d - LW_u = LW_c + LW_soil ϵ_canopy = p.canopy.radiative_transfer.ϵ # this takes into account LAI/SAI diff --git a/src/standalone/Vegetation/Canopy.jl b/src/standalone/Vegetation/Canopy.jl index 91a6d173c4..5102a03c30 100644 --- a/src/standalone/Vegetation/Canopy.jl +++ b/src/standalone/Vegetation/Canopy.jl @@ -412,8 +412,8 @@ function ClimaLand.make_update_aux( ψ = p.canopy.hydraulics.ψ ϑ_l = Y.canopy.hydraulics.ϑ_l fa = p.canopy.hydraulics.fa - inc_par = p.canopy.radiative_transfer.inc_par - inc_nir = p.canopy.radiative_transfer.inc_nir + par_d = p.canopy.radiative_transfer.par_d + nir_d = p.canopy.radiative_transfer.nir_d frac_diff = p.canopy.radiative_transfer.frac_diff bc = canopy.boundary_conditions @@ -436,10 +436,8 @@ function ClimaLand.make_update_aux( R = FT(LP.gas_constant(earth_param_set)) T_freeze = FT(LP.T_freeze(earth_param_set)) thermo_params = earth_param_set.thermo_params - (; G_Function, Ω, λ_γ_PAR, λ_γ_NIR) = - canopy.radiative_transfer.parameters - energy_per_photon_PAR = planck_h * c / λ_γ_PAR - energy_per_photon_NIR = planck_h * c / λ_γ_NIR + (; G_Function, Ω, λ_γ_PAR) = canopy.radiative_transfer.parameters + energy_per_mole_photon_par = planck_h * c / λ_γ_PAR * N_a (; g1, g0, Drel) = canopy.conductance.parameters area_index = p.canopy.hydraulics.area_index LAI = area_index.leaf @@ -453,8 +451,8 @@ function ClimaLand.make_update_aux( (1 - exp(-(LAI + SAI))) #from CLM 5.0, Tech note 4.20 p.canopy.radiative_transfer.G .= compute_G(G_Function, θs) RT = canopy.radiative_transfer - compute_PAR!(inc_par, RT, bc.radiation, p, t) - compute_NIR!(inc_nir, RT, bc.radiation, p, t) + compute_PAR!(par_d, RT, bc.radiation, p, t) + compute_NIR!(nir_d, RT, bc.radiation, p, t) K = p.canopy.radiative_transfer.K @. K = extinction_coeff(p.canopy.radiative_transfer.G, θs) DOY = @@ -469,11 +467,9 @@ function ClimaLand.make_update_aux( thermo_params, ) - compute_absorbances!( + compute_fractional_absorbances!( p, RT, - inc_par, - inc_nir, LAI, K, ground_albedo_PAR( @@ -490,9 +486,6 @@ function ClimaLand.make_update_aux( p, t, ), - energy_per_photon_PAR, - energy_per_photon_NIR, - N_a, θs, frac_diff, ) @@ -573,6 +566,8 @@ function ClimaLand.make_update_aux( medlyn_factor, c_co2_air, R, + energy_per_mole_photon_par, + par_d, ) # update SIF SIF = p.canopy.sif.SIF @@ -585,6 +580,8 @@ function ClimaLand.make_update_aux( R, T_freeze, canopy.photosynthesis.parameters, + energy_per_mole_photon_par, + par_d, ) @. GPP = compute_GPP(An, K, LAI, Ω) @. gs = medlyn_conductance(g0, Drel, medlyn_factor, An, c_co2_air) diff --git a/src/standalone/Vegetation/canopy_parameterizations.jl b/src/standalone/Vegetation/canopy_parameterizations.jl index 2a4c6bc937..19382f415a 100644 --- a/src/standalone/Vegetation/canopy_parameterizations.jl +++ b/src/standalone/Vegetation/canopy_parameterizations.jl @@ -1,6 +1,6 @@ using ..ClimaLand.Canopy -export plant_absorbed_pfd_beer_lambert, - plant_absorbed_pfd_two_stream, +export canopy_sw_rt_beer_lambert, + canopy_sw_rt_two_stream, extinction_coeff, compute_G, arrhenius_function, @@ -72,84 +72,55 @@ function compute_G_CLMG(χl::FT, θs::FT) where {FT} end """ - compute_absorbances!( + compute_fractional_absorbances( RT::BeerLambertModel{FT}, - PAR, - NIR, LAI, K, α_soil_PAR, α_soil_NIR, - energy_per_photon_PAR, - energy_per_photon_NIR, - N_a, _, _, ) -Computes the PAR and NIR absorbances, reflectances, and tranmittances +Computes the PAR and NIR fractional absorbances, reflectances, and tranmittances for a canopy in the case of the Beer-Lambert model. The absorbances are a function of the radiative transfer -model, as well as the magnitude of downwelling PAR and NIR radiation in W/m^2, - the leaf area index, the extinction coefficient, and the +model, as well as the leaf area index, the extinction coefficient, and the soil albedo in the PAR and NIR bands. Returns a NamedTuple of NamedTuple, of the form: (; par = (; refl = , trans = , abs = ), nir = (; refl = , trans = , abs = )) """ -function compute_absorbances!( +function compute_fractional_absorbances!( p, RT::BeerLambertModel{FT}, - PAR, - NIR, LAI, K, α_soil_PAR, α_soil_NIR, - energy_per_photon_PAR, - energy_per_photon_NIR, - N_a, _..., ) where {FT} RTP = RT.parameters - @. p.canopy.radiative_transfer.par = plant_absorbed_pfd_beer_lambert( - RTP.Ω, - PAR / (N_a * energy_per_photon_PAR), - RTP.α_PAR_leaf, - LAI, - K, - α_soil_PAR, - ) - @. p.canopy.radiative_transfer.nir = plant_absorbed_pfd_beer_lambert( - RTP.Ω, - NIR / (N_a * energy_per_photon_NIR), - RTP.α_NIR_leaf, - LAI, - K, - α_soil_NIR, - ) + @. p.canopy.radiative_transfer.par = + canopy_sw_rt_beer_lambert(RTP.Ω, RTP.α_PAR_leaf, LAI, K, α_soil_PAR) + @. p.canopy.radiative_transfer.nir = + canopy_sw_rt_beer_lambert(RTP.Ω, RTP.α_NIR_leaf, LAI, K, α_soil_NIR) end """ - compute_absorbances!(p, + compute_fractional_absorbances!(p, RT::TwoStreamModel{FT}, - PAR, - NIR, LAI, K, α_soil_PAR, α_soil_NIR, - energy_per_photon_PAR, - energy_per_photon_NIR, - N_a, θs, frac_diff, ) -Computes the PAR and NIR absorbances, reflectances, and tranmittances +Computes the PAR and NIR fractional absorbances, reflectances, and tranmittances for a canopy in the case of the -Beer-Lambert model. The absorbances are a function of the radiative transfer -model, as well as the magnitude of downwelling PAR and NIR radiation in W/m^2, -the leaf area index, the extinction coefficient, and the +Two-stream model. The absorbances are a function of the radiative transfer +model, as well as the leaf area index, the extinction coefficient, and the soil albedo in the PAR and NIR bands. This model also depends on the diffuse fraction and the zenith angle. @@ -157,27 +128,21 @@ Returns a NamedTuple of NamedTuple, of the form: (; par = (; refl = , trans = , abs = ), nir = (; refl = , trans = , abs = )) """ -function compute_absorbances!( +function compute_fractional_absorbances!( p, RT::TwoStreamModel{FT}, - PAR, - NIR, LAI, K, α_soil_PAR, α_soil_NIR, - energy_per_photon_PAR, - energy_per_photon_NIR, - N_a, θs, frac_diff, ) where {FT} RTP = RT.parameters - @. p.canopy.radiative_transfer.par = plant_absorbed_pfd_two_stream( + @. p.canopy.radiative_transfer.par = canopy_sw_rt_two_stream( p.canopy.radiative_transfer.G, RTP.Ω, RTP.n_layers, - PAR / (energy_per_photon_PAR * N_a), RTP.α_PAR_leaf, RTP.τ_PAR_leaf, LAI, @@ -186,11 +151,10 @@ function compute_absorbances!( α_soil_PAR, frac_diff, ) - @. p.canopy.radiative_transfer.nir = plant_absorbed_pfd_two_stream( + @. p.canopy.radiative_transfer.nir = canopy_sw_rt_two_stream( p.canopy.radiative_transfer.G, RTP.Ω, RTP.n_layers, - NIR / (energy_per_photon_NIR * N_a), RTP.α_NIR_leaf, RTP.τ_NIR_leaf, LAI, @@ -202,7 +166,7 @@ function compute_absorbances!( end """ - plant_absorbed_pfd_beer_lambert( + canopy_sw_rt_beer_lambert( Ω::FT, SW_d:FT, α_leaf::FT, @@ -211,34 +175,29 @@ end α_soil::FT ) -Computes the absorbed, reflected, and transmitted photon flux density -in terms of mol photons per m^2 per -second for a radiation band. +Computes the absorbed, reflected, and transmitted flux fractions by radiation band. -This applies the Beer-Lambert law, which is a function of downwelling -radiation (`SW_d`; moles of photons/m^2/), leaf reflectance +This applies the Beer-Lambert law, which is a function of leaf reflectance (`α_leaf`), the extinction coefficient (`K`), leaf area index (`LAI`), and the albedo of the soil (`α_soil`). -Returns a tuple of reflected, absorbed, and transmitted radiation in -mol photons/m^2/s. +Returns a tuple of reflected, absorbed, and transmitted radiation fractions. """ -function plant_absorbed_pfd_beer_lambert( +function canopy_sw_rt_beer_lambert( Ω::FT, - SW_d::FT, α_leaf::FT, LAI::FT, K::FT, α_soil::FT, ) where {FT} - AR = SW_d * (1 - α_leaf) * (1 - exp(-K * LAI * Ω)) * (1 - α_soil) - TR = SW_d * exp(-K * LAI * Ω) - RR = SW_d - AR - TR * (1 - α_soil) + AR = (1 - α_leaf) * (1 - exp(-K * LAI * Ω)) * (1 - α_soil) + TR = exp(-K * LAI * Ω) + RR = FT(1) - AR - TR * (1 - α_soil) return (; abs = AR, refl = RR, trans = TR) end """ - plant_absorbed_pfd_two_stream( + canopy_sw_rt_two_stream( G::FT, Ω::FT, n_layers::UInt64, @@ -252,8 +211,7 @@ end frac_diff::FT, ) -Computes the absorbed, transmitted, and reflected photon flux density -in terms of mol photons per m^2 per second for a radiation band. +Computes the absorbed, reflected, and transmitted flux fractions by radiation band. This applies the two-stream radiative transfer solution which takes into account the impacts of scattering within the canopy. The function takes in all @@ -261,14 +219,12 @@ parameters from the parameter struct of a TwoStreamModel, along with the incident radiation, LAI, extinction coefficient K, soil albedo from the canopy soil_driver, solar zenith angle, and τ. -Returns a tuple of reflected, absorbed, and transmitted radiation in -mol photons/m^2/s. +Returns a tuple of reflected, absorbed, and transmitted radiation fractions. """ -function plant_absorbed_pfd_two_stream( +function canopy_sw_rt_two_stream( G::FT, Ω::FT, n_layers::UInt64, - SW_d::FT, α_leaf::FT, τ_leaf::FT, LAI::FT, @@ -419,11 +375,7 @@ function plant_absorbed_pfd_two_stream( # Convert fractional absorption into absorption and return # Ensure floating point precision is correct (it may be different for PAR) F_trans = (1 - F_abs - F_refl) / (1 - α_soil) - return (; - abs = FT(SW_d * F_abs), - refl = FT(SW_d * F_refl), - trans = FT(SW_d * F_trans), - ) + return (; abs = FT(F_abs), refl = FT(F_refl), trans = FT(F_trans)) end """ diff --git a/src/standalone/Vegetation/optimality_farquhar.jl b/src/standalone/Vegetation/optimality_farquhar.jl index ee8228b8fa..497056672f 100644 --- a/src/standalone/Vegetation/optimality_farquhar.jl +++ b/src/standalone/Vegetation/optimality_farquhar.jl @@ -82,23 +82,31 @@ ClimaLand.auxiliary_domain_names(::OptimalityFarquharModel) = (:surface, :surface, :surface, :surface) """ - update_photosynthesis!(Rd, An, Vcmax25, + update_photosynthesis!( + Rd, + An, + Vcmax25, model::OptimalityFarquharModel, T, - APAR, + f_abs, β, medlyn_factor, c_co2, R, + energy_per_mole_photon_par, + par_d, ) - Computes the net photosynthesis rate `An` for the Optimality Farquhar model, along with the dark respiration `Rd`, and the value of `Vcmax25`, and updates them in place. - To do so, we require the canopy leaf temperature `T`, Medlyn factor, `APAR` in -photons per m^2 per second, CO2 concentration in the atmosphere, + To do so, we require the canopy leaf temperature `T`, Medlyn factor, fraction of +PAR radiation absorbed `f_abs`, incoming PAR radiation `par_d` in W/m^2, + CO2 concentration in the atmosphere, moisture stress factor `β` (unitless), and the universal gas constant `R`. + +The typical `energy_per_mole_photon_par` is used to convert from an absorbed energy +flux to a flux of moles of photons, as needed by photosynthetic rate computations. """ function update_photosynthesis!( Rd, @@ -106,11 +114,13 @@ function update_photosynthesis!( Vcmax25, model::OptimalityFarquharModel, T, - APAR, + f_abs, β, medlyn_factor, c_co2, R, + energy_per_mole_photon_par, + par_d, ) (; Γstar25, @@ -136,7 +146,7 @@ function update_photosynthesis!( Ko = MM_Ko.(Ko25, ΔHko, T, To, R) rates = optimality_max_photosynthetic_rates.( - APAR, + f_abs * par_d / energy_per_mole_photon_par, θj, ϕ, oi, @@ -148,7 +158,13 @@ function update_photosynthesis!( ) Jmax = rates.:1 Vcmax = rates.:2 - J = electron_transport.(APAR, Jmax, θj, ϕ) + J = + electron_transport.( + f_abs * par_d / energy_per_mole_photon_par, + Jmax, + θj, + ϕ, + ) Aj = light_assimilation.(is_c3, J, ci, Γstar) Ac = rubisco_assimilation.(is_c3, Vcmax, ci, Γstar, Kc, Ko, oi) diff --git a/src/standalone/Vegetation/photosynthesis.jl b/src/standalone/Vegetation/photosynthesis.jl index 8d220f3c12..a504464116 100644 --- a/src/standalone/Vegetation/photosynthesis.jl +++ b/src/standalone/Vegetation/photosynthesis.jl @@ -114,23 +114,31 @@ function photosynthesis_at_a_point_Farquhar( end """ - update_photosynthesis!(Rd, An, Vcmax25, + update_photosynthesis!( + Rd, + An, + Vcmax25field, model::FarquharModel, T, - APAR, + f_abs, β, medlyn_factor, c_co2, R, - ) + energy_per_mole_photon_par, + par_d, +) Computes the net photosynthesis rate `An` for the Farquhar model, along with the dark respiration `Rd`, and updates them in place. -To do so, we require the canopy leaf temperature `T`, Medlyn factor, `APAR` in -photons per m^2 per second, CO2 concentration in the atmosphere, +To do so, we require the canopy leaf temperature `T`, Medlyn factor, fraction +of `par_d` aborbed `f_abs`, CO2 concentration in the atmosphere, moisture stress factor `β` (unitless), and the universal gas constant `R`. + +The typical `energy_per_mole_photon_par` is used to convert from an absorbed energy +flux to a flux of moles of photons, as needed by photosynthetic rate computations. """ function update_photosynthesis!( Rd, @@ -138,11 +146,13 @@ function update_photosynthesis!( Vcmax25field, model::FarquharModel, T, - APAR, + f_abs, β, medlyn_factor, c_co2, R, + energy_per_mole_photon_par, + par_d, ) (; Vcmax25, @@ -170,7 +180,7 @@ function update_photosynthesis!( T, β, Rd, - APAR, + f_abs * par_d / energy_per_mole_photon_par, # This function requires flux in moles of photons, not J c_co2, medlyn_factor, R, diff --git a/src/standalone/Vegetation/radiation.jl b/src/standalone/Vegetation/radiation.jl index e7780e7e39..3e15058029 100644 --- a/src/standalone/Vegetation/radiation.jl +++ b/src/standalone/Vegetation/radiation.jl @@ -61,8 +61,6 @@ Base.@kwdef struct BeerLambertParameters{ Ω::FT "Typical wavelength per PAR photon (m)" λ_γ_PAR::FT - "Typical wavelength per NIR photon (m)" - λ_γ_NIR::FT "Leaf angle distribution function" G_Function::G end @@ -105,8 +103,6 @@ Base.@kwdef struct TwoStreamParameters{ Ω::F "Typical wavelength per PAR photon (m)" λ_γ_PAR::FT - "Typical wavelength per NIR photon (m)" - λ_γ_NIR::FT "Number of layers to partition the canopy into when integrating the absorption over the canopy vertically. Unrelated to the number of layers in the vertical discretization of the canopy for the plant hydraulics model. @@ -180,7 +176,7 @@ Base.broadcastable(RT::AbstractRadiationModel) = tuple(RT) ClimaLand.name(model::AbstractRadiationModel) = :radiative_transfer ClimaLand.auxiliary_vars(model::Union{BeerLambertModel, TwoStreamModel}) = - (:inc_nir, :inc_par, :nir, :par, :LW_n, :SW_n, :ϵ, :frac_diff, :G, :K) + (:nir_d, :par_d, :nir, :par, :LW_n, :SW_n, :ϵ, :frac_diff, :G, :K) ClimaLand.auxiliary_types( model::Union{BeerLambertModel{FT}, TwoStreamModel{FT}}, ) where {FT} = ( @@ -219,7 +215,7 @@ ClimaLand.auxiliary_domain_names(::Union{BeerLambertModel, TwoStreamModel}) = ( ) where {PSE} -Computes and stores the net long and short wave radition, in W/m^2, +Computes and stores the net long and short wave radiation, in W/m^2, over all bands, absorbed by the canopy when the canopy is run in standalone mode, with only a :canopy model as a prognostic component, with PrescribedGroundConditions. @@ -237,20 +233,11 @@ function canopy_radiant_energy_fluxes!( t, ) where {PSE} FT = eltype(earth_param_set) - - # Short wave makes use of precomputed APAR and ANIR - # in moles of photons per m^2 per s - c = FT(LP.light_speed(earth_param_set)) - h = FT(LP.planck_constant(earth_param_set)) - N_a = FT(LP.avogadro_constant(earth_param_set)) - (; α_PAR_leaf, λ_γ_PAR, λ_γ_NIR) = canopy.radiative_transfer.parameters - APAR = p.canopy.radiative_transfer.par.abs - ANIR = p.canopy.radiative_transfer.nir.abs - energy_per_photon_PAR = h * c / λ_γ_PAR - energy_per_photon_NIR = h * c / λ_γ_NIR - @. p.canopy.radiative_transfer.SW_n = - (energy_per_photon_PAR * N_a * APAR) + - (energy_per_photon_NIR * N_a * ANIR) + par_d = p.canopy.radiative_transfer.par_d + nir_d = p.canopy.radiative_transfer.nir_d + f_abs_par = p.canopy.radiative_transfer.par.abs + f_abs_nir = p.canopy.radiative_transfer.nir.abs + @. p.canopy.radiative_transfer.SW_n = f_abs_par * par_d + f_abs_nir * nir_d ϵ_canopy = p.canopy.radiative_transfer.ϵ # this takes into account LAI/SAI # Long wave: use ground conditions from the ground driver T_ground::FT = ground.T(t) diff --git a/src/standalone/Vegetation/solar_induced_fluorescence.jl b/src/standalone/Vegetation/solar_induced_fluorescence.jl index c7910c353b..b60a73272c 100644 --- a/src/standalone/Vegetation/solar_induced_fluorescence.jl +++ b/src/standalone/Vegetation/solar_induced_fluorescence.jl @@ -60,6 +60,7 @@ ClimaLand.auxiliary_domain_names(::Lee2015SIFModel) = (:surface,) R::FT, T_freeze::FT, photosynthesis_parameters, + energy_per_mole_photon_PAR, ) where {FT} Updates observed SIF at 755 nm in W/m^2. Note that Tc is in Kelvin, and photo @@ -69,17 +70,19 @@ Lee et al, 2015. Global Change Biology 21, 3469-3477, doi:10.1111/gcb.12948 function update_SIF!( SIF, sif_model::Lee2015SIFModel, - APAR, + f_abs_par, Tc, Vcmax25, R, T_freeze, photosynthesis_parameters, + energy_per_mole_photon_par, + par_d, ) (; ΔHJmax, To, θj, ϕ) = photosynthesis_parameters sif_parameters = sif_model.parameters @. SIF = compute_SIF_at_a_point( - APAR, + par_d * f_abs_par / energy_per_mole_photon_par, Tc, Vcmax25, R, diff --git a/test/standalone/Vegetation/canopy_model.jl b/test/standalone/Vegetation/canopy_model.jl index bb6b5b9ab6..cbb0102dc0 100644 --- a/test/standalone/Vegetation/canopy_model.jl +++ b/test/standalone/Vegetation/canopy_model.jl @@ -282,20 +282,13 @@ import ClimaParams @test p.canopy.energy.turbulent_fluxes.lhf == turb_fluxes.lhf @test p.canopy.energy.turbulent_fluxes.transpiration == turb_fluxes.transpiration - c = FT(LP.light_speed(earth_param_set)) - h = FT(LP.planck_constant(earth_param_set)) - N_a = FT(LP.avogadro_constant(earth_param_set)) _σ = FT(LP.Stefan(earth_param_set)) - (; α_PAR_leaf, λ_γ_PAR, λ_γ_NIR) = - canopy.radiative_transfer.parameters - APAR = p.canopy.radiative_transfer.par.abs - ANIR = p.canopy.radiative_transfer.nir.abs - energy_per_photon_PAR = h * c / λ_γ_PAR - energy_per_photon_NIR = h * c / λ_γ_NIR - + f_abs_par = p.canopy.radiative_transfer.par.abs + f_abs_nir = p.canopy.radiative_transfer.nir.abs + nir_d = p.canopy.radiative_transfer.nir_d + par_d = p.canopy.radiative_transfer.par_d @test p.canopy.radiative_transfer.SW_n == - @. (energy_per_photon_PAR * N_a * APAR) + - (energy_per_photon_NIR * N_a * ANIR) + @. f_abs_par * par_d + f_abs_nir * nir_d ϵ_canopy = p.canopy.radiative_transfer.ϵ T_canopy = FT.(T_atmos(t0)) T_soil = FT.(soil_driver.T(t0)) @@ -1196,15 +1189,9 @@ end # TwoStreamModel parameters G_Function = CLMGFunction(χl) λ_γ_PAR = FT(5e-7) - λ_γ_NIR = FT(1.65e-6) ϵ_canopy = FT(0.97) - BeerLambertparams = BeerLambertParameters( - FT; - α_PAR_leaf, - α_NIR_leaf, - λ_γ_PAR, - λ_γ_NIR, - ) + BeerLambertparams = + BeerLambertParameters(FT; α_PAR_leaf, α_NIR_leaf, λ_γ_PAR) TwoStreamparams = TwoStreamParameters( FT; Ω, diff --git a/test/standalone/Vegetation/test_bigleaf_parameterizations.jl b/test/standalone/Vegetation/test_bigleaf_parameterizations.jl index a32626dbbf..1e3125ed12 100644 --- a/test/standalone/Vegetation/test_bigleaf_parameterizations.jl +++ b/test/standalone/Vegetation/test_bigleaf_parameterizations.jl @@ -21,6 +21,9 @@ for FT in (Float32, Float64) Kc = FT(41.03) / P# convert from Pa to mol/mol Ko = FT(28210) / P# convert from Pa to mol/mol c = FT(0.05336251) + c_light = FT(LP.light_speed(earth_param_set)) + planck_h = FT(LP.planck_constant(earth_param_set)) + N_a = FT(LP.avogadro_constant(earth_param_set)) Jmax, Vcmax = ClimaLand.Canopy.optimality_max_photosynthetic_rates( APAR, θj, @@ -53,17 +56,23 @@ for FT in (Float32, Float64) medlyn_factor = FT(10.0) c_co2 = FT(4.8e-4) R = FT(LP.gas_constant(earth_param_set)) + f_abs = FT(0.5) + par_d = FT(1) + λ_γ_PAR = FT(5e-7) + energy_per_mole_photon_par = planck_h * c_light / λ_γ_PAR * N_a ClimaLand.Canopy.update_photosynthesis!( Rd, An, Vcmax25, model, T, - APAR, + f_abs, β, medlyn_factor, c_co2, R, + energy_per_mole_photon_par, + par_d, ) @test Rd[1] != 0.0 @test Vcmax25[1] != 0.0 @@ -100,29 +109,27 @@ for FT in (Float32, Float64) R = FT(LP.gas_constant(earth_param_set)) θs = FT.(Array(0:0.1:(π / 2))) SW(θs) = cos.(θs) * FT.(500) # W/m^2 - PAR = SW(θs) ./ (energy_per_photon * N_a) # convert 500 W/m^2 to mol of photons per m^2/s G = compute_G(RTparams.G_Function, θs) K_c = extinction_coeff.(G, θs) α_soil_PAR = FT(0.2) output = - plant_absorbed_pfd_beer_lambert.( + canopy_sw_rt_beer_lambert.( RTparams.Ω, - PAR, RTparams.α_PAR_leaf, LAI, K_c, α_soil_PAR, ) - APAR = getproperty.(output, :abs) - TPAR = getproperty.(output, :trans) - RPAR = getproperty.(output, :refl) - @test all(@. TPAR ≈ PAR * exp(-K_c * LAI * RTparams.Ω)) - @test all(@. RPAR ≈ PAR - APAR - TPAR * (1 - α_soil_PAR)) + FAPAR = getproperty.(output, :abs) + FTPAR = getproperty.(output, :trans) + FRPAR = getproperty.(output, :refl) + @test all(@. FTPAR ≈ exp(-K_c * LAI * RTparams.Ω)) + @test all(@. FRPAR ≈ FT(1) - FAPAR - FTPAR * (1 - α_soil_PAR)) @test all( - @. APAR ≈ - PAR * (1 - RTparams.α_PAR_leaf) .* - (1 - exp(-K_c * LAI * RTparams.Ω)) * (1 - α_soil_PAR) + @. FAPAR ≈ + (1 - RTparams.α_PAR_leaf) .* (1 - exp(-K_c * LAI * RTparams.Ω)) * + (1 - α_soil_PAR) ) To = photosynthesisparams.To Vcmax = @@ -189,6 +196,7 @@ for FT in (Float32, Float64) photosynthesisparams.Vcmax25 * FT(exp(1)) * arrhenius_function(T, To, R, photosynthesisparams.ΔHJmax) + APAR = FT(1) J = electron_transport.( APAR, diff --git a/test/standalone/Vegetation/test_two_stream.jl b/test/standalone/Vegetation/test_two_stream.jl index 7e31290a17..59a13d3569 100644 --- a/test/standalone/Vegetation/test_two_stream.jl +++ b/test/standalone/Vegetation/test_two_stream.jl @@ -84,11 +84,10 @@ for FT in (Float32, Float64) G = compute_G(RT_params.G_Function, θs) K = extinction_coeff.(G, θs[i]) output = - plant_absorbed_pfd_two_stream.( + canopy_sw_rt_two_stream.( G, RT_params.Ω, RT_params.n_layers, - FT(1), RT_params.α_PAR_leaf, RT_params.τ_PAR_leaf, LAI[i],