Skip to content

Commit 0d008f7

Browse files
committed
Clean up and allow grouped structs passed into AtmosModel
1 parent 060a3c3 commit 0d008f7

File tree

2 files changed

+44
-20
lines changed

2 files changed

+44
-20
lines changed

src/solver/types.jl

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -826,35 +826,36 @@ Internal testing and calibration components for single-column setups:
826826
## Top-level Options
827827
- `vert_diff`: nothing, VerticalDiffusion(), DecayWithHeightDiffusion()
828828
- `disable_surface_flux_tendency`: Bool
829-
830829
"""
831830
function AtmosModel(; kwargs...)
832831
group_kwargs, atmos_model_kwargs = _partition_atmos_model_kwargs(kwargs)
833832

834-
moisture = AtmosWater(; group_kwargs[:water]...)
835-
836-
# Create SCM forcing directly
837-
scm_setup = SCMSetup(; group_kwargs[:scm_setup]...)
838-
839-
radiation = AtmosRadiation(; group_kwargs[:radiation]...)
840-
turbconv = AtmosTurbconv(; group_kwargs[:turbconv]...)
841-
gravity_wave = AtmosGravityWave(; group_kwargs[:gravity_wave]...)
842-
sponge = AtmosSponge(; group_kwargs[:sponge]...)
843-
surface = AtmosSurface(; group_kwargs[:surface]...)
844-
845-
# Handle numerics - if not provided, create default from individual fields
846-
numerics = get(atmos_model_kwargs, :numerics, nothing)
847-
if isnothing(numerics)
848-
# Create default AtmosNumerics from grouped kwargs if numerics not provided
849-
numerics = AtmosNumerics(; group_kwargs[:numerics]...)
850-
end
833+
# Create grouped structs - use provided complete objects or create from individual fields
834+
water = _create_grouped_struct(AtmosWater, atmos_model_kwargs, group_kwargs)
835+
scm_setup =
836+
_create_grouped_struct(SCMSetup, atmos_model_kwargs, group_kwargs)
837+
radiation =
838+
_create_grouped_struct(AtmosRadiation, atmos_model_kwargs, group_kwargs)
839+
turbconv =
840+
_create_grouped_struct(AtmosTurbconv, atmos_model_kwargs, group_kwargs)
841+
gravity_wave = _create_grouped_struct(
842+
AtmosGravityWave,
843+
atmos_model_kwargs,
844+
group_kwargs,
845+
)
846+
sponge =
847+
_create_grouped_struct(AtmosSponge, atmos_model_kwargs, group_kwargs)
848+
surface =
849+
_create_grouped_struct(AtmosSurface, atmos_model_kwargs, group_kwargs)
850+
numerics =
851+
_create_grouped_struct(AtmosNumerics, atmos_model_kwargs, group_kwargs)
851852

852853
vert_diff = get(atmos_model_kwargs, :vert_diff, nothing)
853854
disable_surface_flux_tendency =
854855
get(atmos_model_kwargs, :disable_surface_flux_tendency, false)
855856

856857
return AtmosModel{
857-
typeof(moisture),
858+
typeof(water),
858859
typeof(scm_setup),
859860
typeof(radiation),
860861
typeof(turbconv),
@@ -864,7 +865,7 @@ function AtmosModel(; kwargs...)
864865
typeof(surface),
865866
typeof(numerics),
866867
}(
867-
moisture,
868+
water,
868869
scm_setup,
869870
radiation,
870871
turbconv,
@@ -877,6 +878,21 @@ function AtmosModel(; kwargs...)
877878
)
878879
end
879880

881+
"""
882+
_create_grouped_struct(StructType, atmos_model_kwargs, group_kwargs)
883+
884+
Helper function that creates a single grouped struct.
885+
Uses the ATMOS_MODEL_GROUPS mapping to find the field name from the struct type.
886+
Uses provided complete object or creates from individual fields.
887+
"""
888+
function _create_grouped_struct(StructType, atmos_model_kwargs, group_kwargs)
889+
field_name = get(Dict(ATMOS_MODEL_GROUPS), StructType, nothing)
890+
@assert !isnothing(field_name) "StructType $StructType not found in ATMOS_MODEL_GROUPS"
891+
complete_object = get(atmos_model_kwargs, field_name, nothing)
892+
return isnothing(complete_object) ?
893+
StructType(; group_kwargs[field_name]...) : complete_object
894+
end
895+
880896
const _DEFAULT_ATMOS_MODEL_KWARGS = (
881897
moisture_model = DryModel(),
882898
precip_model = NoPrecipitation(),

test/solver/atmos_model_constructor.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,14 @@ end
166166
@test model.water.moisture_model isa CA.NonEquilMoistModel
167167
end
168168

169+
@testset "Complete Grouped Struct Support" begin
170+
# Test passing complete grouped struct
171+
water = CA.AtmosWater(; moisture_model = CA.EquilMoistModel())
172+
model = CA.AtmosModel(; water = water)
173+
@test model.water === water
174+
@test model.moisture_model isa CA.EquilMoistModel
175+
end
176+
169177
@testset "Error Handling" begin
170178
# Test invalid parameter error with helpful message
171179
@test_throws ErrorException CA.AtmosModel(; w = 2, invalid_param = "test")

0 commit comments

Comments
 (0)