Skip to content

Commit 4cbd846

Browse files
Make functions more granular
1 parent 14900d3 commit 4cbd846

File tree

2 files changed

+25
-16
lines changed

2 files changed

+25
-16
lines changed

src/ClimaAtmos.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import LazyBroadcast
88
import LazyBroadcast: lazy
99
import Thermodynamics as TD
1010
import Thermodynamics
11+
import UnrolledUtilities as UU
1112

1213
include("compat.jl")
1314
include(joinpath("parameters", "Parameters.jl"))

src/utils/variable_manipulations.jl

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -173,14 +173,24 @@ Converts every variable of the form `ρχ` in the grid-scale state `gs` into the
173173
specific variable `χ` by dividing it by `ρ`. All other variables in `gs` are
174174
omitted from the result.
175175
"""
176-
@generated function specific_gs(gs)
177-
gs_names = Base._nt_names(gs)
178-
relevant_gs_names =
179-
filter(name -> has_prefix(name, ) && name != , gs_names)
180-
specific_gs_names = map(name -> remove_prefix(name, ), relevant_gs_names)
181-
specific_gs_values = map(name -> :(gs.$name / gs.ρ), relevant_gs_names)
182-
return :(NamedTuple{$specific_gs_names}(($(specific_gs_values...),)))
183-
end
176+
@generated specific_gs(gs) =
177+
:(NamedTuple{$(specific_gs_names(gs))}(($(map(name -> :(gs.$name / gs.ρ), relevant_gs_names(gs))...),)))
178+
179+
"""
180+
relevant_gs_names(gs)
181+
182+
Returns relevant grid-scale state `gs` names for determining specific variables.
183+
"""
184+
@generated relevant_gs_names(gs) =
185+
filter(name -> has_prefix(name, ) && name != , Base._nt_names(gs))
186+
187+
"""
188+
specific_gs_names(gs)
189+
190+
Returns relevant specific grid-scale state `gs` names.
191+
"""
192+
@generated specific_gs_names(gs) =
193+
map(name -> remove_prefix(name, ), relevant_gs_names(gs))
184194

185195
"""
186196
all_specific_gs(gs)
@@ -199,14 +209,12 @@ Arguments:
199209
Returns:
200210
- A new `NamedTuple` containing only the specific quantities (e.g., `:q_tot`, `:e_tot`).
201211
"""
202-
@generated function all_specific_gs(gs)
203-
gs_names = Base._nt_names(gs)
204-
relevant_gs_names =
205-
filter(name -> has_prefix(name, ) && name != , gs_names)
206-
all_specific_gs_names = map(name -> remove_prefix(name, ), relevant_gs_names)
207-
all_specific_gs_values = map(name -> :(lazy.(specific.(gs.$name, gs.ρ))), relevant_gs_names)
208-
return :(NamedTuple{$all_specific_gs_names}(($(all_specific_gs_values...),)))
209-
end
212+
all_specific_gs(gs::Fields.Field) =
213+
NamedTuple{specific_gs_names(eltype(gs))}(
214+
UU.unrolled_map(relevant_gs_names(gs)) do name
215+
lazy.(specific.(getproperty(gs, name), gs.ρ))
216+
end
217+
)
210218

211219
"""
212220
specific_sgs(sgs, gs, turbconv_model)

0 commit comments

Comments
 (0)