@@ -826,35 +826,36 @@ Internal testing and calibration components for single-column setups:
826
826
## Top-level Options
827
827
- `vert_diff`: nothing, VerticalDiffusion(), DecayWithHeightDiffusion()
828
828
- `disable_surface_flux_tendency`: Bool
829
-
830
829
"""
831
830
function AtmosModel (; kwargs... )
832
831
group_kwargs, atmos_model_kwargs = _partition_atmos_model_kwargs (kwargs)
833
832
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)
851
852
852
853
vert_diff = get (atmos_model_kwargs, :vert_diff , nothing )
853
854
disable_surface_flux_tendency =
854
855
get (atmos_model_kwargs, :disable_surface_flux_tendency , false )
855
856
856
857
return AtmosModel{
857
- typeof (moisture ),
858
+ typeof (water ),
858
859
typeof (scm_setup),
859
860
typeof (radiation),
860
861
typeof (turbconv),
@@ -864,7 +865,7 @@ function AtmosModel(; kwargs...)
864
865
typeof (surface),
865
866
typeof (numerics),
866
867
}(
867
- moisture ,
868
+ water ,
868
869
scm_setup,
869
870
radiation,
870
871
turbconv,
@@ -877,6 +878,21 @@ function AtmosModel(; kwargs...)
877
878
)
878
879
end
879
880
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
+
880
896
const _DEFAULT_ATMOS_MODEL_KWARGS = (
881
897
moisture_model = DryModel (),
882
898
precip_model = NoPrecipitation (),
0 commit comments