Skip to content

Commit dd0fce0

Browse files
Fix type instabilities
1 parent b761ab8 commit dd0fce0

File tree

2 files changed

+16
-44
lines changed

2 files changed

+16
-44
lines changed

src/utils/variable_manipulations.jl

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -159,28 +159,14 @@ Converts every variable of the form `ρχ` in the grid-scale state `gs` into the
159159
specific variable `χ` by dividing it by `ρ`. All other variables in `gs` are
160160
omitted from the result.
161161
"""
162-
specific_gs(gs) =
163-
NamedTuple{specific_gs_names(gs)}(map(name -> gs.:($name) / gs.ρ, relevant_gs_names(gs)))
164-
165-
"""
166-
relevant_gs_names(gs)
167-
168-
Returns relevant grid-scale state `gs` names for determining specific variables.
169-
"""
170-
@generated relevant_gs_names(::Type{GS}) where {GS} =
171-
filter(name -> has_prefix(name, ) && name != , Base._nt_names(GS))
172-
173-
@inline relevant_gs_names(gs) = relevant_gs_names(typeof(gs))
174-
175-
"""
176-
specific_gs_names(gs)
177-
178-
Returns relevant specific grid-scale state `gs` names.
179-
"""
180-
@generated specific_gs_names(::Type{GS}) where {GS} =
181-
map(name -> remove_prefix(name, ), relevant_gs_names(GS))
182-
183-
@inline specific_gs_names(gs) = specific_gs_names(typeof(gs))
162+
@generated function specific_gs(gs)
163+
gs_names = Base._nt_names(gs)
164+
relevant_gs_names =
165+
filter(name -> has_prefix(name, ) && name != , gs_names)
166+
specific_gs_names = map(name -> remove_prefix(name, ), relevant_gs_names)
167+
specific_gs_values = map(name -> :(gs.$name / gs.ρ), relevant_gs_names)
168+
return :(NamedTuple{$specific_gs_names}(($(specific_gs_values...),)))
169+
end
184170

185171
"""
186172
all_specific_gs(gs)
@@ -199,12 +185,14 @@ Arguments:
199185
Returns:
200186
- A new `NamedTuple` containing only the specific quantities (e.g., `:q_tot`, `:e_tot`).
201187
"""
202-
all_specific_gs(gs) =
203-
NamedTuple{specific_gs_names(eltype(gs))}(
204-
UU.unrolled_map(relevant_gs_names(eltype(gs))) do name
205-
lazy.(specific.(getproperty(gs, name), gs.ρ))
206-
end
207-
)
188+
@generated function all_specific_gs(gs)
189+
gs_names = Base._nt_names(gs)
190+
relevant_gs_names =
191+
filter(name -> has_prefix(name, ) && name != , gs_names)
192+
specific_gs_names = map(name -> remove_prefix(name, ), relevant_gs_names)
193+
specific_gs_values = map(name -> :(lazy.(specific.(gs.$name, gs.ρ))), relevant_gs_names)
194+
return :(NamedTuple{$specific_gs_names}(($(specific_gs_values...),)))
195+
end
208196

209197
"""
210198
specific_sgs(sgs, gs, turbconv_model)

test/utilities.jl

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import Dates
55
using Random
66
Random.seed!(1234)
77
import ClimaAtmos as CA
8-
import LazyBroadcast: lazy
98
using NCDatasets
109

1110
include("test_helpers.jl")
@@ -34,21 +33,6 @@ end
3433
@test CA.isdivisible(Dates.Month(1), Dates.Hour(1))
3534
end
3635

37-
@testset "Variable manipulations" begin
38-
(; helem, cent_space, face_space) = get_cartesian_spaces()
39-
ccoords, fcoords = get_coords(cent_space, face_space)
40-
FT = eltype(ccoords.x)
41-
nt = (;ρ=FT(2),ρa=FT(4), ρe_tot=FT(4))
42-
@test CA.relevant_gs_names(typeof(nt)) == (:ρa, :ρe_tot)
43-
@test CA.specific_gs_names(nt) == (:a, :e_tot)
44-
@test CA.specific_gs(nt) == (a = 2.0, e_tot = 2.0)
45-
f = Fields.Field(typeof(nt), cent_space)
46-
@test CA.all_specific_gs(f) == (;
47-
a = lazy.(CA.specific.(f.ρa, f.ρ)),
48-
e_tot = lazy.(CA.specific.(f.ρe_tot, f.ρ)),
49-
)
50-
end
51-
5236
@testset "kinetic_energy (c.f. analytical function)" begin
5337
# Test kinetic energy function for staggered grids
5438
# given an analytical expression for the velocity profiles

0 commit comments

Comments
 (0)