diff --git a/experiments/AMIP/components/atmosphere/climaatmos_init.jl b/experiments/AMIP/components/atmosphere/climaatmos_init.jl index 336d4a8fee..843721dc1d 100644 --- a/experiments/AMIP/components/atmosphere/climaatmos_init.jl +++ b/experiments/AMIP/components/atmosphere/climaatmos_init.jl @@ -63,7 +63,6 @@ function get_atmos_config(coupler_dict) end function atmos_init(::Type{FT}, atmos_config_dict::Dict) where {FT} - # By passing `parsed_args` to `AtmosConfig`, `parsed_args` overwrites the default atmos config atmos_config = CA.AtmosConfig(atmos_config_dict) simulation = CA.get_simulation(atmos_config) @@ -76,16 +75,27 @@ function atmos_init(::Type{FT}, atmos_config_dict::Dict) where {FT} @warn("Running with ρe_int in coupled mode is not tested yet.", maxlog = 1) end + # define shorter references for long variable names to increase readability + ρ_flux_h_tot = integrator.p.precomputed.sfc_conditions.ρ_flux_h_tot + ρ_flux_q_tot = integrator.p.precomputed.sfc_conditions.ρ_flux_q_tot + ᶠradiation_flux = integrator.p.radiation.ᶠradiation_flux + ρ_flux_uₕ = integrator.p.precomputed.sfc_conditions.ρ_flux_uₕ + col_integrated_rain = integrator.p.precipitation.col_integrated_rain + col_integrated_snow = integrator.p.precipitation.col_integrated_snow + ᶜS_ρq_tot = integrator.p.precipitation.ᶜS_ρq_tot + ᶜ3d_rain = integrator.p.precipitation.ᶜ3d_rain + ᶜ3d_snow = integrator.p.precipitation.ᶜ3d_snow + # set initial fluxes to zero - @. integrator.p.precomputed.sfc_conditions.ρ_flux_h_tot = Geometry.Covariant3Vector(FT(0.0)) - @. integrator.p.precomputed.sfc_conditions.ρ_flux_q_tot = Geometry.Covariant3Vector(FT(0.0)) - @. integrator.p.radiation.ᶠradiation_flux = Geometry.WVector(FT(0)) - integrator.p.precomputed.sfc_conditions.ρ_flux_uₕ.components .= Ref(SMatrix{1, 2}([FT(0), FT(0)])) - integrator.p.precipitation.col_integrated_rain .= FT(0) - integrator.p.precipitation.col_integrated_snow .= FT(0) - integrator.p.precipitation.ᶜS_ρq_tot .= FT(0) - integrator.p.precipitation.ᶜ3d_rain .= FT(0) - integrator.p.precipitation.ᶜ3d_snow .= FT(0) + @. ρ_flux_h_tot = Geometry.Covariant3Vector(FT(0.0)) + @. ρ_flux_q_tot = Geometry.Covariant3Vector(FT(0.0)) + @. ᶠradiation_flux = Geometry.WVector(FT(0)) + ρ_flux_uₕ.components .= Ref(SMatrix{1, 2}([FT(0), FT(0)])) + col_integrated_rain .= FT(0) + col_integrated_snow .= FT(0) + ᶜS_ρq_tot .= FT(0) + ᶜ3d_rain .= FT(0) + ᶜ3d_snow .= FT(0) sim = ClimaAtmosSimulation(integrator.p.params, Y, spaces, integrator) @@ -300,29 +310,19 @@ Extension of Interfacer.get_field to get the net TOA radiation, which is a sum o upward and downward longwave and shortwave radiation. """ function get_field(atmos_sim::ClimaAtmosSimulation, ::Val{:F_radiative_TOA}) - radiation = atmos_sim.integrator.p.radiation.radiation_model FT = eltype(atmos_sim.integrator.u) # save radiation source - if radiation != nothing + if atmos_sim.integrator.p.radiation.radiation_model != nothing face_space = axes(atmos_sim.integrator.u.f) nz_faces = length(Spaces.vertical_topology(face_space).mesh.faces) - LWd_TOA = Fields.level( - CA.RRTMGPI.array2field(FT.(atmos_sim.integrator.p.radiation.radiation_model.face_lw_flux_dn), face_space), - nz_faces - half, - ) - LWu_TOA = Fields.level( - CA.RRTMGPI.array2field(FT.(atmos_sim.integrator.p.radiation.radiation_model.face_lw_flux_up), face_space), - nz_faces - half, - ) - SWd_TOA = Fields.level( - CA.RRTMGPI.array2field(FT.(atmos_sim.integrator.p.radiation.radiation_model.face_sw_flux_dn), face_space), - nz_faces - half, - ) - SWu_TOA = Fields.level( - CA.RRTMGPI.array2field(FT.(atmos_sim.integrator.p.radiation.radiation_model.face_sw_flux_up), face_space), - nz_faces - half, - ) + (; face_lw_flux_dn, face_lw_flux_up, face_sw_flux_dn, face_sw_flux_up) = + atmos_sim.integrator.p.radiation.radiation_model + + LWd_TOA = Fields.level(CA.RRTMGPI.array2field(FT.(face_lw_flux_dn), face_space), nz_faces - half) + LWu_TOA = Fields.level(CA.RRTMGPI.array2field(FT.(face_lw_flux_up), face_space), nz_faces - half) + SWd_TOA = Fields.level(CA.RRTMGPI.array2field(FT.(face_sw_flux_dn), face_space), nz_faces - half) + SWu_TOA = Fields.level(CA.RRTMGPI.array2field(FT.(face_sw_flux_up), face_space), nz_faces - half) return @. -(LWd_TOA + SWd_TOA - LWu_TOA - SWu_TOA) # [W/m^2] else diff --git a/experiments/AMIP/components/land/bucket_utils.jl b/experiments/AMIP/components/land/bucket_utils.jl index 58b94a5613..ccec57788c 100644 --- a/experiments/AMIP/components/land/bucket_utils.jl +++ b/experiments/AMIP/components/land/bucket_utils.jl @@ -15,8 +15,10 @@ function make_land_domain( @assert zlim[1] < zlim[2] depth = zlim[2] - zlim[1] - radius = ClimaCore.Spaces.topology(atmos_boundary_space).mesh.domain.radius - nelements_horz = ClimaCore.Spaces.topology(atmos_boundary_space).mesh.ne + mesh = ClimaCore.Spaces.topology(atmos_boundary_space).mesh + + radius = mesh.domain.radius + nelements_horz = mesh.ne npolynomial = ClimaCore.Spaces.Quadratures.polynomial_degree(ClimaCore.Spaces.quadrature_style(atmos_boundary_space)) nelements = (nelements_horz, nelements_vert) @@ -79,9 +81,10 @@ reinit!(sim::BucketSimulation) = reinit!(sim.integrator) # extensions required by FluxCalculator (partitioned fluxes) function update_turbulent_fluxes_point!(sim::BucketSimulation, fields::NamedTuple, colidx::Fields.ColumnIndex) (; F_turb_energy, F_turb_moisture) = fields - sim.integrator.p.bucket.turbulent_fluxes.shf[colidx] .= F_turb_energy - sim.integrator.p.bucket.turbulent_fluxes.vapor_flux[colidx] .= - F_turb_moisture ./ LP.ρ_cloud_liq(sim.model.parameters.earth_param_set) + turbulent_fluxes = sim.integrator.p.bucket.turbulent_fluxes + turbulent_fluxes.shf[colidx] .= F_turb_energy + earth_params = sim.model.parameters.earth_param_set + turbulent_fluxes.vapor_flux[colidx] .= F_turb_moisture ./ LP.ρ_cloud_liq(earth_params) return nothing end diff --git a/src/ConservationChecker.jl b/src/ConservationChecker.jl index b6a2845775..c70b2e0fbe 100644 --- a/src/ConservationChecker.jl +++ b/src/ConservationChecker.jl @@ -96,14 +96,14 @@ function check_conservation!( for sim in model_sims sim_name = Symbol(Interfacer.name(sim)) if sim isa Interfacer.AtmosModelSimulation + F_radiative_TOA = coupler_sim.fields.F_radiative_TOA # save radiation source - parent(coupler_sim.fields.F_radiative_TOA) .= parent(Interfacer.get_field(sim, Val(:F_radiative_TOA))) + parent(F_radiative_TOA) .= parent(Interfacer.get_field(sim, Val(:F_radiative_TOA))) if isempty(ccs.toa_net_source) - radiation_sources_accum = sum(coupler_sim.fields.F_radiative_TOA .* FT(coupler_sim.Δt_cpl)) # ∫ J / m^2 dA + radiation_sources_accum = sum(F_radiative_TOA .* FT(coupler_sim.Δt_cpl)) # ∫ J / m^2 dA else - radiation_sources_accum = - sum(coupler_sim.fields.F_radiative_TOA .* FT(coupler_sim.Δt_cpl)) .+ ccs.toa_net_source[end] # ∫ J / m^2 dA + radiation_sources_accum = sum(F_radiative_TOA .* FT(coupler_sim.Δt_cpl)) .+ ccs.toa_net_source[end] # ∫ J / m^2 dA end push!(ccs.toa_net_source, radiation_sources_accum)