diff --git a/experiments/integrated/global/global_soil_canopy.jl b/experiments/integrated/global/global_soil_canopy.jl index 82405e7291..b4597292c2 100644 --- a/experiments/integrated/global/global_soil_canopy.jl +++ b/experiments/integrated/global/global_soil_canopy.jl @@ -223,12 +223,12 @@ exp_tendency! = make_exp_tendency(land); imp_tendency! = ClimaLand.make_imp_tendency(land); jacobian! = ClimaLand.make_jacobian(land); set_initial_cache!(p, Y, t0) -stepper = CTS.ARS343() +stepper = CTS.ARS111() ode_algo = CTS.IMEXAlgorithm( stepper, CTS.NewtonsMethod( - max_iters = 1, - update_j = CTS.UpdateEvery(CTS.NewTimeStep), + max_iters = 3, + update_j = CTS.UpdateEvery(CTS.NewNewtonIteration), ), ) @@ -286,6 +286,11 @@ for short_name in ClimaAnalysis.available_vars(simdir) viz.heatmap2D_on_globe!( fig, ClimaAnalysis.slice(var, time = t; kwargs...), + mask = viz.oceanmask(), + more_kwargs = Dict( + :mask => ClimaAnalysis.Utils.kwargs(color = :white), + :plot => ClimaAnalysis.Utils.kwargs(rasterize = true), + ), ) CairoMakie.save(joinpath(outdir, "$short_name.png"), fig) end diff --git a/src/integrated/land.jl b/src/integrated/land.jl index 24796e7879..7fe49cb9ce 100644 --- a/src/integrated/land.jl +++ b/src/integrated/land.jl @@ -2,20 +2,20 @@ export LandModel """ struct LandModel{ FT, - MM <: Soil.Biogeochemistry.SoilCO2Model{FT}, - SM <: Soil.EnergyHydrology{FT}, - VM <: Canopy.CanopyModel{FT}, + CM <: Canopy.CanopyModel{FT}, SnM <: Snow.SnowModel{FT}, + SM <: Soil.EnergyHydrology{FT}, + MM <: Soil.Biogeochemistry.SoilCO2Model{FT}, } <: AbstractLandModel{FT} - "The soil microbe model to be used" - soilco2::MM - "The soil model to be used" - soil::SM "The canopy model to be used" - canopy::VM + canopy::CM "The snow model to be used" snow::SnM - end + "The soil model to be used" + soil::SM + "The soil microbe model to be used" + soilco2::MM + A concrete type of land model used for simulating systems with soil, canopy, snow, soilco2. @@ -23,40 +23,40 @@ $(DocStringExtensions.FIELDS) """ struct LandModel{ FT, - MM <: Soil.Biogeochemistry.SoilCO2Model{FT}, - SM <: Soil.EnergyHydrology{FT}, - VM <: Canopy.CanopyModel{FT}, + CM <: Canopy.CanopyModel{FT}, SnM <: Snow.SnowModel{FT}, + SM <: Soil.EnergyHydrology{FT}, + MM <: Soil.Biogeochemistry.SoilCO2Model{FT}, } <: AbstractLandModel{FT} - "The soil microbe model to be used" - soilco2::MM - "The soil model to be used" - soil::SM "The canopy model to be used" - canopy::VM + canopy::CM "The snow model to be used" snow::SnM + "The soil model to be used" + soil::SM + "The soil microbe model to be used" + soilco2::MM end """ LandModel{FT}(; - soilco2_type::Type{MM}, - soilco2_args::NamedTuple = (;), land_args::NamedTuple = (;), - soil_model_type::Type{SM}, - soil_args::NamedTuple = (;), canopy_component_types::NamedTuple = (;), canopy_component_args::NamedTuple = (;), canopy_model_args::NamedTuple = (;), snow_model_type::Type{SnM}, snow_args::NamedTuple = (;), + soil_model_type::Type{SM}, + soil_args::NamedTuple = (;), + soilco2_type::Type{MM}, + soilco2_args::NamedTuple = (;), ) where { FT, + SnM <: Snow.SnowModel, SM <: Soil.EnergyHydrology{FT}, MM <: Soil.Biogeochemistry.SoilCO2Model{FT}, - SnM <: Snow.SnowModel{FT} } A constructor for the `LandModel`, which takes in the concrete model @@ -68,23 +68,22 @@ forward in time, including boundary conditions, source terms, and interaction terms. """ function LandModel{FT}(; - soilco2_type::Type{MM}, - soilco2_args::NamedTuple = (;), land_args::NamedTuple = (;), - soil_model_type::Type{SM}, - soil_args::NamedTuple = (;), canopy_component_types::NamedTuple = (;), canopy_component_args::NamedTuple = (;), canopy_model_args::NamedTuple = (;), snow_model_type::Type{SnM}, + soil_model_type::Type{SM}, + soil_args::NamedTuple = (;), snow_args::NamedTuple = (;), + soilco2_type::Type{MM}, + soilco2_args::NamedTuple = (;), ) where { FT, + SnM <: Snow.SnowModel, SM <: Soil.EnergyHydrology{FT}, MM <: Soil.Biogeochemistry.SoilCO2Model{FT}, - SnM <: Snow.SnowModel, } - (; atmos, radiation, soil_organic_carbon) = land_args # These should always be set by the constructor. prognostic_land_components = (:canopy, :snow, :soil, :soilco2) @@ -175,7 +174,7 @@ function LandModel{FT}(; ) soilco2 = soilco2_type(; soilco2_args..., drivers = soilco2_drivers) - args = (soilco2, soil, canopy, snow) + args = (canopy, snow, soil, soilco2) return LandModel{FT, typeof.(args)...}(args...) end @@ -246,13 +245,13 @@ lsm_aux_domain_names(m::LandModel) = ( """ make_update_boundary_fluxes( - land::LandModel{FT, MM, SM, RM, SnM}, + land::LandModel{FT, CM, SnM, SM, MM}, ) where { FT, + CM <: Canopy.CanopyModel{FT}, + SnM <: Snow.SnowModel{FT}, + SM <: Soil.EnergyHydrology{FT}, MM <: Soil.Biogeochemistry.SoilCO2Model{FT}, - SM <: Soil.RichardsModel{FT}, - RM <: Canopy.CanopyModel{FT} - SnM <: Snow.SnowModel{FT} } A method which makes a function; the returned function @@ -264,13 +263,13 @@ This function is called each ode function evaluation, prior to the tendency func evaluation. """ function make_update_boundary_fluxes( - land::LandModel{FT, MM, SM, RM, SnM}, + land::LandModel{FT, CM, SnM, SM, MM}, ) where { FT, - MM <: Soil.Biogeochemistry.SoilCO2Model{FT}, - SM <: Soil.EnergyHydrology{FT}, - RM <: Canopy.CanopyModel{FT}, + CM <: Canopy.CanopyModel{FT}, SnM <: Snow.SnowModel{FT}, + SM <: Soil.EnergyHydrology{FT}, + MM <: Soil.Biogeochemistry.SoilCO2Model{FT}, } update_soil_bf! = make_update_boundary_fluxes(land.soil) update_soilco2_bf! = make_update_boundary_fluxes(land.soilco2) diff --git a/src/integrated/soil_canopy_model.jl b/src/integrated/soil_canopy_model.jl index a4a11f1f4d..bf0f47f8c5 100644 --- a/src/integrated/soil_canopy_model.jl +++ b/src/integrated/soil_canopy_model.jl @@ -2,17 +2,16 @@ export SoilCanopyModel """ struct SoilCanopyModel{ FT, - MM <: Soil.Biogeochemistry.SoilCO2Model{FT}, + CM <: Canopy.CanopyModel{FT}, SM <: Soil.EnergyHydrology{FT}, - VM <: Canopy.CanopyModel{FT}, + MM <: Soil.Biogeochemistry.SoilCO2Model{FT}, } <: AbstractLandModel{FT} - "The soil microbe model to be used" - soilco2::MM + "The canopy model to be used" + canopy::CM "The soil model to be used" soil::SM - "The canopy model to be used" - canopy::VM - end + "The soil microbe model to be used" + soilco2::MM A concrete type of land model used for simulating systems with a canopy and a soil component. @@ -20,31 +19,31 @@ $(DocStringExtensions.FIELDS) """ struct SoilCanopyModel{ FT, - MM <: Soil.Biogeochemistry.SoilCO2Model{FT}, + CM <: Canopy.CanopyModel{FT}, SM <: Soil.EnergyHydrology{FT}, - VM <: Canopy.CanopyModel{FT}, + MM <: Soil.Biogeochemistry.SoilCO2Model{FT}, } <: AbstractLandModel{FT} - "The soil microbe model to be used" - soilco2::MM + "The canopy model to be used" + canopy::CM "The soil model to be used" soil::SM - "The canopy model to be used" - canopy::VM + "The soil microbe model to be used" + soilco2::MM end """ SoilCanopyModel{FT}(; - soilco2_type::Type{MM}, - soilco2_args::NamedTuple = (;), - land_args::NamedTuple = (;), - soil_model_type::Type{SM}, - soil_args::NamedTuple = (;), - canopy_component_types::NamedTuple = (;), - canopy_component_args::NamedTuple = (;), - canopy_model_args::NamedTuple = (;), - ) where { + land_args::NamedTuple = (;), + canopy_component_types::NamedTuple = (;), + canopy_component_args::NamedTuple = (;), + canopy_model_args::NamedTuple = (;), + soil_model_type::Type{SM}, + soil_args::NamedTuple = (;), + soilco2_type::Type{MM}, + soilco2_args::NamedTuple = (;), + ) where { FT, SM <: Soil.EnergyHydrology{FT}, MM <: Soil.Biogeochemistry.SoilCO2Model{FT}, @@ -59,14 +58,14 @@ forward in time, including boundary conditions, source terms, and interaction terms. """ function SoilCanopyModel{FT}(; - soilco2_type::Type{MM}, - soilco2_args::NamedTuple = (;), land_args::NamedTuple = (;), - soil_model_type::Type{SM}, - soil_args::NamedTuple = (;), canopy_component_types::NamedTuple = (;), canopy_component_args::NamedTuple = (;), canopy_model_args::NamedTuple = (;), + soil_model_type::Type{SM}, + soil_args::NamedTuple = (;), + soilco2_type::Type{MM}, + soilco2_args::NamedTuple = (;), ) where { FT, SM <: Soil.EnergyHydrology{FT}, @@ -147,12 +146,8 @@ function SoilCanopyModel{FT}(; atmos, ) soilco2 = soilco2_type(; soilco2_args..., drivers = soilco2_drivers) - - return SoilCanopyModel{FT, typeof(soilco2), typeof(soil), typeof(canopy)}( - soilco2, - soil, - canopy, - ) + args = (canopy, soil, soilco2) + return SoilCanopyModel{FT, typeof.(args)...}(args...) end """ @@ -210,12 +205,12 @@ lsm_aux_domain_names(m::SoilCanopyModel) = ( """ make_update_boundary_fluxes( - land::SoilCanopyModel{FT, MM, SM, RM}, + land::SoilCanopyModel{FT, CM, SM, MM} ) where { FT, - MM <: Soil.Biogeochemistry.SoilCO2Model{FT}, + CM <: Canopy.CanopyModel{FT} SM <: Soil.RichardsModel{FT}, - RM <: Canopy.CanopyModel{FT} + MM <: Soil.Biogeochemistry.SoilCO2Model{FT}, } A method which makes a function; the returned function @@ -227,12 +222,12 @@ This function is called each ode function evaluation, prior to the tendency func evaluation. """ function make_update_boundary_fluxes( - land::SoilCanopyModel{FT, MM, SM, RM}, + land::SoilCanopyModel{FT, CM, SM, MM}, ) where { FT, - MM <: Soil.Biogeochemistry.SoilCO2Model{FT}, + CM <: Canopy.CanopyModel{FT}, SM <: Soil.EnergyHydrology{FT}, - RM <: Canopy.CanopyModel{FT}, + MM <: Soil.Biogeochemistry.SoilCO2Model{FT}, } update_soil_bf! = make_update_boundary_fluxes(land.soil) update_soilco2_bf! = make_update_boundary_fluxes(land.soilco2) diff --git a/src/integrated/soil_energy_hydrology_biogeochemistry.jl b/src/integrated/soil_energy_hydrology_biogeochemistry.jl index 649ed59b50..4899662d6d 100644 --- a/src/integrated/soil_energy_hydrology_biogeochemistry.jl +++ b/src/integrated/soil_energy_hydrology_biogeochemistry.jl @@ -3,8 +3,8 @@ export LandSoilBiogeochemistry, PrognosticMet """ struct LandSoilBiogeochemistry{ FT, - SEH <: Soil.EnergyHydrology{FT}, - SB <: Soil.Biogeochemistry.SoilCO2Model{FT}, + SM <: Soil.EnergyHydrology{FT}, + MM <: Soil.Biogeochemistry.SoilCO2Model{FT}, } <: AbstractLandModel{FT} A concrete type of land model used for simulating systems with a @@ -12,19 +12,20 @@ soil energy, hydrology, and biogeochemistry component. $(DocStringExtensions.FIELDS)""" struct LandSoilBiogeochemistry{ FT, - SEH <: Soil.Soil.EnergyHydrology{FT}, - SB <: Soil.Biogeochemistry.SoilCO2Model{FT}, + SM <: Soil.Soil.EnergyHydrology{FT}, + MM <: Soil.Biogeochemistry.SoilCO2Model{FT}, } <: AbstractLandModel{FT} "The soil model" - soil::SEH + soil::SM "The biochemistry model" - soilco2::SB + soilco2::MM end """ LandSoilBiogeochemistry{FT}(; + land_args::NamedTuple, soil_args::NamedTuple = (;), - biogeochemistry_args::NamedTuple = (;), + soilco2_args::NamedTuple = (;), ) where {FT} A constructor for the `LandSoilBiogeochemistry` model, which takes in the required arguments for each component, constructs those models, diff --git a/src/integrated/soil_snow_model.jl b/src/integrated/soil_snow_model.jl index 4b09dfdfcd..fecd7ae278 100644 --- a/src/integrated/soil_snow_model.jl +++ b/src/integrated/soil_snow_model.jl @@ -6,12 +6,12 @@ using ClimaCore.Operators: column_integral_definite! struct LandHydrologyModel{ FT, SnM <: Snow.SnowModel{FT}, - SoM <: Soil.EnergyHydrology{FT}, + SM <: Soil.EnergyHydrology{FT}, } <: AbstractLandModel{FT} "The snow model to be used" snow::SnM "The soil model to be used" - soil::SoM + soil::SM end A concrete type of land model used for simulating systems with @@ -21,12 +21,12 @@ $(DocStringExtensions.FIELDS) struct LandHydrologyModel{ FT, SnM <: Snow.SnowModel{FT}, - SoM <: Soil.EnergyHydrology{FT}, + SM <: Soil.EnergyHydrology{FT}, } <: AbstractLandModel{FT} "The snow model to be used" snow::SnM "The soil model to be used" - soil::SoM + soil::SM end """ @@ -34,12 +34,12 @@ end land_args::NamedTuple = (;), snow_model_type::Type{SnM}, snow_args::NamedTuple = (;), - soil_model_type::Type{SoM}, + soil_model_type::Type{SM}, soil_args::NamedTuple = (;), ) where { FT, SnM <: Snow.SnowModel{FT}, - SoM <: Soil.EnergyHydrology{FT}, + SM <: Soil.EnergyHydrology{FT}, } A constructor for the `LandHydrology`, which takes in the concrete model @@ -54,9 +54,9 @@ function LandHydrologyModel{FT}(; land_args::NamedTuple = (;), snow_model_type::Type{SnM}, snow_args::NamedTuple = (;), - soil_model_type::Type{SoM}, + soil_model_type::Type{SM}, soil_args::NamedTuple = (;), -) where {FT, SnM <: Snow.SnowModel, SoM <: Soil.EnergyHydrology} +) where {FT, SnM <: Snow.SnowModel, SM <: Soil.EnergyHydrology} (; atmos, radiation, domain) = land_args prognostic_land_components = (:snow, :soil) if :runoff ∈ propertynames(land_args) @@ -144,11 +144,11 @@ lsm_aux_domain_names(m::LandHydrologyModel) = ( """ make_update_boundary_fluxes( - land::LandHydrologyModel{FT, SnM, SoM}, + land::LandHydrologyModel{FT, SnM, SM}, ) where { FT, SnM <: Snow.SnowModel{FT}, - SoM <: Soil.EnergyHydrology{FT}, + SM <: Soil.EnergyHydrology{FT}, } A method which makes a function; the returned function @@ -167,8 +167,8 @@ completely melts in a step. In this case, that excess must go to the soil for co 4. Compute the net flux for the atmosphere, which is useful for assessing conservation. """ function make_update_boundary_fluxes( - land::LandHydrologyModel{FT, SnM, SoM}, -) where {FT, SnM <: Snow.SnowModel{FT}, SoM <: Soil.EnergyHydrology{FT}} + land::LandHydrologyModel{FT, SnM, SM}, +) where {FT, SnM <: Snow.SnowModel{FT}, SM <: Soil.EnergyHydrology{FT}} update_soil_bf! = make_update_boundary_fluxes(land.soil) update_snow_bf! = make_update_boundary_fluxes(land.snow) function update_boundary_fluxes!(p, Y, t)