Skip to content

Commit bb1f2d8

Browse files
authored
Merge pull request #1154 from CliMA/gb/retoa
Remove radiative_energy_toa
2 parents aae785c + e441397 commit bb1f2d8

File tree

14 files changed

+103
-41
lines changed

14 files changed

+103
-41
lines changed

experiments/ClimaCore/test/coupled_sims.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Test: @test, @testset, @test_throws
22
import ClimaComms
3-
@static pkgversion(ClimaComms) >= v"0.6" && ClimaComms.@import_required_backends
3+
ClimaComms.@import_required_backends
44
import ClimaCore as CC
55

66
# Load file to test

experiments/ClimaEarth/setup_run.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import DelimitedFiles
2525
# ## ClimaESM packages
2626
import ClimaAtmos as CA
2727
import ClimaComms
28-
@static pkgversion(ClimaComms) >= v"0.6" && ClimaComms.@import_required_backends
28+
ClimaComms.@import_required_backends
2929
import ClimaCore as CC
3030

3131
# ## Coupler specific imports
@@ -392,7 +392,7 @@ function CoupledSimulation(config_dict::AbstractDict)
392392
Interfacer.add_coupler_fields!(coupler_field_names, sim)
393393
end
394394
# add coupler fields required to track conservation, if specified
395-
energy_check && push!(coupler_field_names, :radiative_energy_flux_toa, :P_net)
395+
energy_check && push!(coupler_field_names, :P_net)
396396

397397
# allocate space for the coupler fields
398398
coupler_fields = Interfacer.init_coupler_fields(FT, coupler_field_names, boundary_space)

experiments/ClimaEarth/test/component_model_tests/climaatmos_standalone/atmos_driver.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import ClimaComms
2-
@static pkgversion(ClimaComms) >= v"0.6" && ClimaComms.@import_required_backends
2+
ClimaComms.@import_required_backends
33
import ArgParse
44
import ClimaCoupler
55
import ClimaCoupler: Utilities

experiments/ClimaEarth/test/component_model_tests/climaland_tests.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import ClimaCoupler
55
import ClimaCoupler: FluxCalculator, Interfacer
66
import Dates
77
import ClimaComms
8-
@static pkgversion(ClimaComms) >= v"0.6" && ClimaComms.@import_required_backends
8+
ClimaComms.@import_required_backends
99

1010
exp_dir = joinpath(pkgdir(ClimaCoupler), "experiments", "ClimaEarth")
1111

experiments/ClimaEarth/test/debug_plots_tests.jl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import Test: @test, @testset, @test_logs
33
import ClimaCore as CC
44
import ClimaCoupler: Interfacer
55
import ClimaComms
6-
@static pkgversion(ClimaComms) >= v"0.6" && ClimaComms.@import_required_backends
6+
ClimaComms.@import_required_backends
77

88
# Prevent GKS headless operation mode warning
99
ENV["GKSwstype"] = "nul"
@@ -55,7 +55,6 @@ plot_field_names(sim::Interfacer.SurfaceStub) = (:stub_field,)
5555
:beta,
5656
:z0b_sfc,
5757
:z0m_sfc,
58-
:radiative_energy_flux_toa,
5958
]
6059
atmos_names = (:atmos_field,)
6160
surface_names = (:surface_field,)

experiments/ClimaEarth/test/runtests.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using SafeTestsets
22
import ClimaComms
3-
@static pkgversion(ClimaComms) >= v"0.6" && ClimaComms.@import_required_backends
3+
ClimaComms.@import_required_backends
44

55
gpu_broken = ClimaComms.device() isa ClimaComms.CUDADevice
66

src/ConservationChecker.jl

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ This module contains functions that check global conservation of energy and wate
66
module ConservationChecker
77

88
import ..Interfacer, ..Utilities
9+
import ..Utilities: integral
910
import ClimaCore as CC
1011

1112
export AbstractConservationCheck, EnergyConservationCheck, WaterConservationCheck, check_conservation!
@@ -83,15 +84,13 @@ function check_conservation!(
8384
for sim in model_sims
8485
sim_name = Symbol(Interfacer.name(sim))
8586
if sim isa Interfacer.AtmosModelSimulation
86-
radiative_energy_flux_toa = coupler_sim.fields.radiative_energy_flux_toa
87-
# save radiation source
88-
parent(radiative_energy_flux_toa) .= parent(Interfacer.get_field(sim, Val(:radiative_energy_flux_toa)))
87+
radiative_energy_flux_toa = Interfacer.get_field(sim, Val(:radiative_energy_flux_toa))
8988

9089
if isempty(ccs.toa_net_source)
91-
radiation_sources_accum = sum(radiative_energy_flux_toa .* FT(float(coupler_sim.Δt_cpl))) # ∫ J / m^2 dA
90+
radiation_sources_accum = integral(radiative_energy_flux_toa) * FT(float(coupler_sim.Δt_cpl)) # ∫ J / m^2 dA
9291
else
9392
radiation_sources_accum =
94-
sum(radiative_energy_flux_toa .* FT(float(coupler_sim.Δt_cpl))) .+ ccs.toa_net_source[end] # ∫ J / m^2 dA
93+
integral(radiative_energy_flux_toa) * FT(float(coupler_sim.Δt_cpl)) + ccs.toa_net_source[end] # ∫ J / m^2 dA
9594
end
9695
push!(ccs.toa_net_source, radiation_sources_accum)
9796

@@ -101,7 +100,6 @@ function check_conservation!(
101100

102101
push!(previous, current)
103102
total += current + radiation_sources_accum
104-
105103
elseif sim isa Interfacer.SurfaceModelSimulation
106104
# save surfaces
107105
area_fraction = Interfacer.get_field(sim, Val(:area_fraction))
@@ -110,7 +108,7 @@ function check_conservation!(
110108
current = FT(0)
111109
else
112110
previous = getproperty(ccs, sim_name)
113-
current = sum(Interfacer.get_field(sim, Val(:energy)) .* area_fraction) # # ∫ J / m^3 dV
111+
current = integral(Interfacer.get_field(sim, Val(:energy)) .* area_fraction) # # ∫ J / m^3 dV
114112
end
115113
push!(previous, current)
116114
total += current
@@ -120,7 +118,7 @@ function check_conservation!(
120118
push!(ccs.total, total)
121119

122120
if runtime_check
123-
@assert abs((total[end] - total[1]) / total[end]) < 1e-4
121+
@assert abs((ccs.total[end] - ccs.total[1]) / ccs.total[end]) < 1e-4
124122
end
125123
return total
126124

@@ -162,19 +160,19 @@ function check_conservation!(
162160

163161
# save atmos
164162
previous = getproperty(ccs, sim_name)
165-
current = sum(Interfacer.get_field(sim, Val(:water))) # kg (∫kg of water / m^3 dV)
163+
current = integral(Interfacer.get_field(sim, Val(:water))) # kg (∫kg of water / m^3 dV)
166164
push!(previous, current)
167165

168166
elseif sim isa Interfacer.SurfaceModelSimulation
169167
# save surfaces
170168
area_fraction = Interfacer.get_field(sim, Val(:area_fraction))
171169
if isnothing(Interfacer.get_field(sim, Val(:water)))
172170
previous = getproperty(ccs, sim_name)
173-
current = sum(PE_net .* area_fraction) # kg (∫kg of water / m^3 dV)
171+
current = integral(PE_net .* area_fraction) # kg (∫kg of water / m^3 dV)
174172
push!(previous, current)
175173
else
176174
previous = getproperty(ccs, sim_name)
177-
current = sum(Interfacer.get_field(sim, Val(:water)) .* area_fraction) # kg (∫kg of water / m^3 dV)
175+
current = integral(Interfacer.get_field(sim, Val(:water)) .* area_fraction) # kg (∫kg of water / m^3 dV)
178176
push!(previous, current)
179177
end
180178
end
@@ -185,7 +183,7 @@ function check_conservation!(
185183
push!(ccs.total, total)
186184

187185
if runtime_check
188-
@assert abs((total[end] - total[1]) / total[end]) < 1e-4
186+
@assert abs((ccs.total[end] - ccs.total[1]) / ccs.total[end]) < 1e-4
189187
end
190188

191189
return total
@@ -194,7 +192,7 @@ end
194192
"""
195193
surface_water_gain_from_rates(cs::Interfacer.CoupledSimulation)
196194
197-
Determines the total water content gain/loss of a surface from the begining of the simulation based on evaporation and precipitation rates.
195+
Determines the total water content gain/loss of a surface from the beginning of the simulation based on evaporation and precipitation rates.
198196
"""
199197
function surface_water_gain_from_rates(cs::Interfacer.CoupledSimulation)
200198
evaporation = cs.fields.F_turb_moisture # kg / m^2 / s / layer depth

src/Interfacer.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,6 @@ get_field(
190190
Val{:height_sfc},
191191
Val{:liquid_precipitation},
192192
Val{:radiative_energy_flux_sfc},
193-
Val{:radiative_energy_flux_toa},
194193
Val{:snow_precipitation},
195194
Val{:turblent_energy_flux},
196195
Val{:turbulent_moisture_flux},

src/Utilities.jl

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import ClimaCore as CC
1111
import Logging
1212
import ClimaUtilities.OutputPathGenerator: generate_output_path
1313

14-
export swap_space!, get_device, get_comms_context, show_memory_usage, setup_output_dirs, time_to_seconds
14+
export swap_space!, get_device, get_comms_context, show_memory_usage, setup_output_dirs, time_to_seconds, integral
1515

1616
"""
1717
swap_space!(space_out::CC.Spaces.AbstractSpace, field_in::CC.Fields.Field)
@@ -188,4 +188,34 @@ function time_to_seconds(s::String)
188188
end
189189

190190

191+
"""
192+
integral(field)
193+
194+
Return the integral (a scalar) for `field` along its spatial dimensions.
195+
"""
196+
function integral(field::CC.Fields.Field)
197+
if axes(field) isa CC.Spaces.SpectralElementSpace2D
198+
# ClimaCore #1578, if field comes from Fields.level
199+
# TODO: This should be fixed in ClimaCore
200+
rad_grid = CC.Spaces.grid(axes(field))
201+
if rad_grid isa CC.Grids.LevelGrid
202+
if rad_grid.level isa CC.Utilities.PlusHalf
203+
# FaceSpace
204+
return sum(field ./ CC.Fields.Δz_field(field) .* 2)
205+
else
206+
# Center
207+
return sum(field ./ CC.Fields.Δz_field(field))
208+
end
209+
else
210+
return sum(field)
211+
end
212+
else
213+
return sum(field)
214+
end
215+
end
216+
217+
function integral(field::AbstractArray)
218+
return sum(field)
219+
end
220+
191221
end # module

test/checkpointer_tests.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Test: @test, @testset
22
import ClimaComms
3-
@static pkgversion(ClimaComms) >= v"0.6" && ClimaComms.@import_required_backends
3+
ClimaComms.@import_required_backends
44
import ClimaCore as CC
55
import ClimaCoupler: Checkpointer, Interfacer
66

0 commit comments

Comments
 (0)