diff --git a/.github/validation_grid_utils.py b/.github/validation_grid_utils.py index 2d77efe5ef..2e80900faf 100755 --- a/.github/validation_grid_utils.py +++ b/.github/validation_grid_utils.py @@ -24,15 +24,15 @@ import typer -from icon4py.model.testing import definitions, grid_utils +from icon4py.model.testing import definitions as test_defs, grid_utils VALIDATION_GRIDS = ( - definitions.Grids.R01B01_GLOBAL, - definitions.Grids.R02B04_GLOBAL, - definitions.Grids.MCH_CH_R04B09_DSL, - definitions.Grids.MCH_OPR_R04B07_DOMAIN01, - definitions.Grids.TORUS_50000x5000, + test_defs.Grids.R01B01_GLOBAL, + test_defs.Grids.R02B04_GLOBAL, + test_defs.Grids.MCH_CH_R04B09_DSL, + test_defs.Grids.MCH_OPR_R04B07_DOMAIN01, + test_defs.Grids.TORUS_50000x5000, ) # change to MCH_OPR_R04B07_DOMAIN01 app = typer.Typer() diff --git a/.gitignore b/.gitignore index ee47a0e04a..060afac5bf 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ testdata simple_mesh*.nc /prof .profile +pyrightconfig.json ### Sphinx ### **/docs/_source/*.rst diff --git a/model/atmosphere/advection/tests/advection/integration_tests/test_advection.py b/model/atmosphere/advection/tests/advection/integration_tests/test_advection.py index fc17a97d3c..e660a5136d 100644 --- a/model/atmosphere/advection/tests/advection/integration_tests/test_advection.py +++ b/model/atmosphere/advection/tests/advection/integration_tests/test_advection.py @@ -20,7 +20,7 @@ from icon4py.model.common.interpolation.interpolation_fields import compute_lsq_coeffs from icon4py.model.common.utils import data_allocation as data_alloc from icon4py.model.testing import ( - definitions, + definitions as test_defs, grid_utils, grid_utils as gridtest_utils, serialbox as sb, @@ -66,7 +66,7 @@ @pytest.mark.embedded_remap_error @pytest.mark.datatest -@pytest.mark.parametrize("experiment", [definitions.Experiments.MCH_CH_R04B09]) +@pytest.mark.parametrize("experiment", [test_defs.Experiments.MCH_CH_R04B09]) @pytest.mark.parametrize( "date, even_timestep, ntracer, horizontal_advection_type, horizontal_advection_limiter, vertical_advection_type, vertical_advection_limiter", [ @@ -125,7 +125,7 @@ def test_advection_run_single_step( backend, advection_init_savepoint, advection_exit_savepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, ): # TODO(OngChia): the last datatest fails on GPU (or even CPU) backend when there is no advection because the horizontal flux is not zero. Further check required. if ( @@ -223,7 +223,7 @@ def test_compute_lsq_coeffs( grid_savepoint: sb.IconGridSavepoint, backend: gtx_typing.Backend, interpolation_savepoint: sb.InterpolationSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: gm = grid_utils.get_grid_manager_from_identifier( experiment.grid, diff --git a/model/atmosphere/diffusion/tests/diffusion/fixtures.py b/model/atmosphere/diffusion/tests/diffusion/fixtures.py index 78131b9505..335ff724f2 100644 --- a/model/atmosphere/diffusion/tests/diffusion/fixtures.py +++ b/model/atmosphere/diffusion/tests/diffusion/fixtures.py @@ -24,6 +24,7 @@ download_ser_data, exner_expol, experiment, + experiment_config, flat_height, grid_savepoint, htop_moist_proc, diff --git a/model/atmosphere/diffusion/tests/diffusion/integration_tests/test_diffusion.py b/model/atmosphere/diffusion/tests/diffusion/integration_tests/test_diffusion.py index 630c560ff5..f7462b973d 100644 --- a/model/atmosphere/diffusion/tests/diffusion/integration_tests/test_diffusion.py +++ b/model/atmosphere/diffusion/tests/diffusion/integration_tests/test_diffusion.py @@ -19,7 +19,7 @@ from icon4py.model.common.grid import geometry_attributes as geometry_meta, vertical as v_grid from icon4py.model.common.utils import data_allocation as data_alloc from icon4py.model.testing import ( - definitions, + definitions as test_defs, grid_utils, reference_funcs as ref_funcs, serialbox as sb, @@ -38,23 +38,23 @@ grid_functionality = collections.defaultdict(dict) -def get_grid_for_experiment(experiment: definitions.Experiment, backend: gtx_typing.Backend): +def get_grid_for_experiment(experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend): return _get_or_initialize(experiment, backend, "grid") def get_edge_geometry_for_experiment( - experiment: definitions.Experiment, backend: gtx_typing.Backend + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend ): return _get_or_initialize(experiment, backend, "edge_geometry") def get_cell_geometry_for_experiment( - experiment: definitions.Experiment, backend: gtx_typing.Backend + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend ): return _get_or_initialize(experiment, backend, "cell_geometry") -def _get_or_initialize(experiment: definitions.Experiment, backend: gtx_typing.Backend, name: str): +def _get_or_initialize(experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend, name: str): if not grid_functionality[experiment.name].get(name): geometry_ = grid_utils.get_grid_geometry(backend, experiment) grid = geometry_.grid @@ -95,7 +95,7 @@ def _get_or_initialize(experiment: definitions.Experiment, backend: gtx_typing.B def test_diffusion_coefficients_with_hdiff_efdt_ratio(experiment): - config = definitions.construct_diffusion_config(experiment, ndyn_substeps=5) + config = test_defs.construct_diffusion_config(experiment, ndyn_substeps=5) config.hdiff_efdt_ratio = 1.0 config.hdiff_w_efdt_ratio = 2.0 @@ -108,7 +108,7 @@ def test_diffusion_coefficients_with_hdiff_efdt_ratio(experiment): def test_diffusion_coefficients_without_hdiff_efdt_ratio(experiment): - config = definitions.construct_diffusion_config(experiment) + config = test_defs.construct_diffusion_config(experiment) config.hdiff_efdt_ratio = 0.0 config.hdiff_w_efdt_ratio = 0.0 @@ -121,7 +121,7 @@ def test_diffusion_coefficients_without_hdiff_efdt_ratio(experiment): def test_smagorinski_factor_for_diffusion_type_4(experiment): - config = definitions.construct_diffusion_config(experiment, ndyn_substeps=5) + config = test_defs.construct_diffusion_config(experiment, ndyn_substeps=5) config.smagorinski_scaling_factor = 0.15 config.diffusion_type = 4 @@ -134,7 +134,7 @@ def test_smagorinski_factor_for_diffusion_type_4(experiment): def test_smagorinski_heights_diffusion_type_5_are_consistent( experiment, ): - config = definitions.construct_diffusion_config(experiment, ndyn_substeps=5) + config = test_defs.construct_diffusion_config(experiment, ndyn_substeps=5) config.smagorinski_scaling_factor = 0.15 config.diffusion_type = 5 @@ -150,7 +150,7 @@ def test_smagorinski_heights_diffusion_type_5_are_consistent( def test_smagorinski_factor_diffusion_type_5(experiment): params = diffusion.DiffusionParams( - definitions.construct_diffusion_config(experiment, ndyn_substeps=5) + test_defs.construct_diffusion_config(experiment, ndyn_substeps=5) ) assert len(params.smagorinski_factor) == len(params.smagorinski_height) assert len(params.smagorinski_factor) == 4 @@ -163,8 +163,8 @@ def test_smagorinski_factor_diffusion_type_5(experiment): @pytest.mark.parametrize( "experiment,step_date_init", [ - (definitions.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000"), - (definitions.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:20.000"), + (test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000"), + (test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:20.000"), ], ) def test_diffusion_init( @@ -173,27 +173,19 @@ def test_diffusion_init( metric_state: diffusion_states.DiffusionMetricState, experiment, step_date_init, - lowest_layer_thickness, - model_top_height, - stretch_factor, - damping_height, + experiment_config, ndyn_substeps, backend, ): - config = definitions.construct_diffusion_config(experiment, ndyn_substeps=ndyn_substeps) + config = experiment_config.diffusion + config.n_substeps = ndyn_substeps additional_parameters = diffusion.DiffusionParams(config) grid = get_grid_for_experiment(experiment, backend) cell_params = get_cell_geometry_for_experiment(experiment, backend) edge_params = get_edge_geometry_for_experiment(experiment, backend) - vertical_config = v_grid.VerticalGridConfig( - grid.num_levels, - lowest_layer_thickness=lowest_layer_thickness, - model_top_height=model_top_height, - stretch_factor=stretch_factor, - rayleigh_damping_height=damping_height, - ) + vertical_config = experiment_config.vertical_grid vct_a, vct_b = v_grid.get_vct_a_and_vct_b(vertical_config, backend) vertical_params = v_grid.VerticalGrid( config=vertical_config, @@ -294,10 +286,10 @@ def _verify_init_values_against_savepoint( @pytest.mark.parametrize( "experiment,step_date_init", [ - (definitions.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000"), - (definitions.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:20.000"), - (definitions.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000"), - (definitions.Experiments.EXCLAIM_APE, "2000-01-01T00:00:04.000"), + (test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000"), + (test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:20.000"), + (test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000"), + (test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:04.000"), ], ) @pytest.mark.parametrize("ndyn_substeps", (2,)) @@ -308,25 +300,17 @@ def test_verify_diffusion_init_against_savepoint( interpolation_state: diffusion_states.DiffusionInterpolationState, metric_state: diffusion_states.DiffusionMetricState, savepoint_diffusion_init, - lowest_layer_thickness, - model_top_height, - stretch_factor, - damping_height, + experiment_config, ndyn_substeps, backend, ): grid = get_grid_for_experiment(experiment, backend) cell_params = get_cell_geometry_for_experiment(experiment, backend) edge_params = get_edge_geometry_for_experiment(experiment, backend) - config = definitions.construct_diffusion_config(experiment, ndyn_substeps=ndyn_substeps) + config = experiment_config.diffusion + config.n_substeps = ndyn_substeps additional_parameters = diffusion.DiffusionParams(config) - vertical_config = v_grid.VerticalGridConfig( - grid.num_levels, - lowest_layer_thickness=lowest_layer_thickness, - model_top_height=model_top_height, - stretch_factor=stretch_factor, - rayleigh_damping_height=damping_height, - ) + vertical_config = experiment_config.vertical_grid vct_a, vct_b = v_grid.get_vct_a_and_vct_b(vertical_config, backend) vertical_params = v_grid.VerticalGrid( config=vertical_config, @@ -356,12 +340,12 @@ def test_verify_diffusion_init_against_savepoint( "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), ( - definitions.Experiments.EXCLAIM_APE, + test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000", ), @@ -379,10 +363,7 @@ def test_run_diffusion_single_step( savepoint_diffusion_exit, interpolation_state: diffusion_states.DiffusionInterpolationState, metric_state: diffusion_states.DiffusionMetricState, - lowest_layer_thickness, - model_top_height, - stretch_factor, - damping_height, + experiment_config, ndyn_substeps, backend, orchestration, @@ -404,13 +385,7 @@ def test_run_diffusion_single_step( ) prognostic_state = savepoint_diffusion_init.construct_prognostics() - vertical_config = v_grid.VerticalGridConfig( - grid.num_levels, - lowest_layer_thickness=lowest_layer_thickness, - model_top_height=model_top_height, - stretch_factor=stretch_factor, - rayleigh_damping_height=damping_height, - ) + vertical_config = experiment_config.vertical_grid vct_a, vct_b = v_grid.get_vct_a_and_vct_b(vertical_config, backend) vertical_params = v_grid.VerticalGrid( config=vertical_config, @@ -418,7 +393,8 @@ def test_run_diffusion_single_step( vct_b=vct_b, ) - config = definitions.construct_diffusion_config(experiment, ndyn_substeps) + config = experiment_config.diffusion + config.n_substeps = ndyn_substeps additional_parameters = diffusion.DiffusionParams(config) diffusion_granule = diffusion.Diffusion( @@ -447,7 +423,7 @@ def test_run_diffusion_single_step( "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), @@ -464,10 +440,7 @@ def test_run_diffusion_multiple_steps( interpolation_state: diffusion_states.DiffusionInterpolationState, metric_state: diffusion_states.DiffusionMetricState, grid_savepoint, - lowest_layer_thickness, - model_top_height, - stretch_factor, - damping_height, + experiment_config, ndyn_substeps, backend, icon_grid, @@ -482,19 +455,14 @@ def test_run_diffusion_multiple_steps( edge_geometry: grid_states.EdgeParams = grid_savepoint.construct_edge_geometry() cell_geometry: grid_states.CellParams = grid_savepoint.construct_cell_geometry() - vertical_config = v_grid.VerticalGridConfig( - icon_grid.num_levels, - lowest_layer_thickness=lowest_layer_thickness, - model_top_height=model_top_height, - stretch_factor=stretch_factor, - rayleigh_damping_height=damping_height, - ) + vertical_config = experiment_config.vertical_grid vertical_params = v_grid.VerticalGrid( config=vertical_config, vct_a=grid_savepoint.vct_a(), vct_b=grid_savepoint.vct_b() ) - config = definitions.construct_diffusion_config(experiment, ndyn_substeps) + config = experiment_config.diffusion + config.n_substeps = ndyn_substeps additional_parameters = diffusion.DiffusionParams(config) ###################################################################### @@ -574,17 +542,14 @@ def test_run_diffusion_multiple_steps( @pytest.mark.datatest @pytest.mark.embedded_remap_error -@pytest.mark.parametrize("experiment", [definitions.Experiments.MCH_CH_R04B09]) +@pytest.mark.parametrize("experiment", [test_defs.Experiments.MCH_CH_R04B09]) @pytest.mark.parametrize("linit", [True]) # TODO(): Enable dace orchestration, currently broken by precompiled programs @pytest.mark.parametrize("orchestration", [False]) def test_run_diffusion_initial_step( experiment, linit, - lowest_layer_thickness, - model_top_height, - stretch_factor, - damping_height, + experiment_config, savepoint_diffusion_init, savepoint_diffusion_exit, interpolation_state: diffusion_states.DiffusionInterpolationState, @@ -599,13 +564,7 @@ def test_run_diffusion_initial_step( edge_geometry = get_edge_geometry_for_experiment(experiment, backend) dtime = savepoint_diffusion_init.get_metadata("dtime").get("dtime") - vertical_config = v_grid.VerticalGridConfig( - grid.num_levels, - lowest_layer_thickness=lowest_layer_thickness, - model_top_height=model_top_height, - stretch_factor=stretch_factor, - rayleigh_damping_height=damping_height, - ) + vertical_config = experiment_config.vertical_grid vct_a, vct_b = v_grid.get_vct_a_and_vct_b(vertical_config, backend) vertical_grid = v_grid.VerticalGrid( config=vertical_config, @@ -619,7 +578,8 @@ def test_run_diffusion_initial_step( dwdy=savepoint_diffusion_init.dwdy(), ) prognostic_state = savepoint_diffusion_init.construct_prognostics() - config = definitions.construct_diffusion_config(experiment, ndyn_substeps=2) + config = experiment_config.diffusion + config.n_substeps = 2 params = diffusion.DiffusionParams(config) diffusion_granule = diffusion.Diffusion( @@ -657,14 +617,15 @@ def test_run_diffusion_initial_step( @pytest.mark.parametrize( "experiment,step_date_init", [ - (definitions.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000"), + (test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000"), ], ) def test_verify_special_diffusion_inital_step_values_against_initial_savepoint( - savepoint_diffusion_init, experiment, icon_grid, linit, ndyn_substeps, backend + savepoint_diffusion_init, experiment, icon_grid, linit, experiment_config, ndyn_substeps, backend ): savepoint = savepoint_diffusion_init - config = definitions.construct_diffusion_config(experiment, ndyn_substeps=ndyn_substeps) + config = experiment_config.diffusion + config.n_substeps = ndyn_substeps params = diffusion.DiffusionParams(config) expected_diff_multfac_vn = savepoint.diff_multfac_vn() diff --git a/model/atmosphere/diffusion/tests/diffusion/mpi_tests/test_parallel_diffusion.py b/model/atmosphere/diffusion/tests/diffusion/mpi_tests/test_parallel_diffusion.py index c50885d158..8fbc7c6567 100644 --- a/model/atmosphere/diffusion/tests/diffusion/mpi_tests/test_parallel_diffusion.py +++ b/model/atmosphere/diffusion/tests/diffusion/mpi_tests/test_parallel_diffusion.py @@ -16,7 +16,7 @@ from icon4py.model.common import dimension as dims, type_alias as ta from icon4py.model.common.decomposition import definitions as decomposition, mpi_decomposition from icon4py.model.common.grid import icon, vertical as v_grid -from icon4py.model.testing import definitions, parallel_helpers, serialbox, test_utils +from icon4py.model.testing import definitions as test_defs, parallel_helpers, serialbox, test_utils from .. import utils from ..fixtures import * # noqa: F403 @@ -34,18 +34,18 @@ "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), - (definitions.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000"), + (test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000"), ], ) @pytest.mark.parametrize("ndyn_substeps", [2]) @pytest.mark.parametrize("orchestration", [False]) @pytest.mark.parametrize("processor_props", [True], indirect=True) def test_parallel_diffusion( - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, step_date_init: str, step_date_exit: str, linit: bool, @@ -71,7 +71,7 @@ def test_parallel_diffusion( caplog.set_level("INFO") parallel_helpers.check_comm_size(processor_props) _log.info( - f"rank={processor_props.rank}/{processor_props.comm_size}: initializing diffusion for experiment '{definitions.Experiments.MCH_CH_R04B09}'" + f"rank={processor_props.rank}/{processor_props.comm_size}: initializing diffusion for experiment '{experiment}'" ) _log.info( f"local cells = {decomposition_info.global_index(dims.CellDim, decomposition.DecompositionInfo.EntryType.ALL).shape} " @@ -85,7 +85,7 @@ def test_parallel_diffusion( _log.info( f"rank={processor_props.rank}/{processor_props.comm_size}: using local grid with {icon_grid.num_cells} Cells, {icon_grid.num_edges} Edges, {icon_grid.num_vertices} Vertices" ) - config = definitions.construct_diffusion_config(experiment, ndyn_substeps=ndyn_substeps) + config = test_defs.construct_diffusion_config(experiment, ndyn_substeps=ndyn_substeps) dtime = savepoint_diffusion_init.get_metadata("dtime").get("dtime") _log.info( f"rank={processor_props.rank}/{processor_props.comm_size}: setup: using {processor_props.comm_name} with {processor_props.comm_size} nodes" @@ -161,17 +161,17 @@ def test_parallel_diffusion( "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), - (definitions.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000"), + (test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000"), ], ) @pytest.mark.parametrize("ndyn_substeps", [2]) @pytest.mark.parametrize("processor_props", [True], indirect=True) def test_parallel_diffusion_multiple_steps( - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, step_date_init: str, step_date_exit: str, linit: bool, @@ -198,7 +198,7 @@ def test_parallel_diffusion_multiple_steps( caplog.set_level("INFO") parallel_helpers.check_comm_size(processor_props) _log.info( - f"rank={processor_props.rank}/{processor_props.comm_size}: initializing diffusion for experiment '{definitions.Experiments.MCH_CH_R04B09}'" + f"rank={processor_props.rank}/{processor_props.comm_size}: initializing diffusion for experiment '{experiment}'" ) _log.info( f"local cells = {decomposition_info.global_index(dims.CellDim, decomposition.DecompositionInfo.EntryType.ALL).shape} " @@ -222,7 +222,7 @@ def test_parallel_diffusion_multiple_steps( stretch_factor=stretch_factor, rayleigh_damping_height=damping_height, ) - config = definitions.construct_diffusion_config(experiment, ndyn_substeps=ndyn_substeps) + config = test_defs.construct_diffusion_config(experiment, ndyn_substeps=ndyn_substeps) diffusion_params = diffusion_.DiffusionParams(config) dtime = savepoint_diffusion_init.get_metadata("dtime").get("dtime") _log.info( diff --git a/model/atmosphere/diffusion/tests/diffusion/stencil_tests/test_apply_diffusion_to_w_and_compute_horizontal_gradients_for_turbulence.py b/model/atmosphere/diffusion/tests/diffusion/stencil_tests/test_apply_diffusion_to_w_and_compute_horizontal_gradients_for_turbulence.py index 4e9652ac76..9f3b47855c 100644 --- a/model/atmosphere/diffusion/tests/diffusion/stencil_tests/test_apply_diffusion_to_w_and_compute_horizontal_gradients_for_turbulence.py +++ b/model/atmosphere/diffusion/tests/diffusion/stencil_tests/test_apply_diffusion_to_w_and_compute_horizontal_gradients_for_turbulence.py @@ -16,7 +16,6 @@ from icon4py.model.common import dimension as dims from icon4py.model.common.grid import base, horizontal as h_grid from icon4py.model.common.utils.data_allocation import random_field, zero_field -from icon4py.model.testing import definitions from icon4py.model.testing.stencil_tests import StandardStaticVariants, StencilTest from .test_apply_nabla2_to_w import apply_nabla2_to_w_numpy diff --git a/model/atmosphere/diffusion/tests/diffusion/stencil_tests/test_calculate_nabla2_and_smag_coefficients_for_vn.py b/model/atmosphere/diffusion/tests/diffusion/stencil_tests/test_calculate_nabla2_and_smag_coefficients_for_vn.py index e9cd84bde4..8844151f3e 100644 --- a/model/atmosphere/diffusion/tests/diffusion/stencil_tests/test_calculate_nabla2_and_smag_coefficients_for_vn.py +++ b/model/atmosphere/diffusion/tests/diffusion/stencil_tests/test_calculate_nabla2_and_smag_coefficients_for_vn.py @@ -16,7 +16,7 @@ from icon4py.model.common import dimension as dims, type_alias as ta from icon4py.model.common.grid import base, horizontal as h_grid from icon4py.model.common.utils import data_allocation as data_alloc -from icon4py.model.testing import definitions, stencil_tests +from icon4py.model.testing import stencil_tests @pytest.mark.continuous_benchmarking diff --git a/model/atmosphere/dycore/src/icon4py/model/atmosphere/dycore/solve_nonhydro.py b/model/atmosphere/dycore/src/icon4py/model/atmosphere/dycore/solve_nonhydro.py index 21a177e86f..212c66fe32 100644 --- a/model/atmosphere/dycore/src/icon4py/model/atmosphere/dycore/solve_nonhydro.py +++ b/model/atmosphere/dycore/src/icon4py/model/atmosphere/dycore/solve_nonhydro.py @@ -62,6 +62,7 @@ vertical as v_grid, ) from icon4py.model.common.math import smagorinsky +from icon4py.model.common.metrics import metrics_factory from icon4py.model.common.model_options import setup_program from icon4py.model.common.states import prognostic_state as prognostics from icon4py.model.common.utils import data_allocation as data_alloc @@ -151,14 +152,10 @@ def __init__( itime_scheme: dycore_states.TimeSteppingScheme = dycore_states.TimeSteppingScheme.MOST_EFFICIENT, iadv_rhotheta: dycore_states.RhoThetaAdvectionType = dycore_states.RhoThetaAdvectionType.MIURA, igradp_method: dycore_states.HorizontalPressureDiscretizationType = dycore_states.HorizontalPressureDiscretizationType.TAYLOR_HYDRO, - rayleigh_type: constants.RayleighType = constants.RayleighType.KLEMP, - rayleigh_coeff: float = 0.05, divdamp_order: dycore_states.DivergenceDampingOrder = dycore_states.DivergenceDampingOrder.COMBINED, # the ICON default is 4, is_iau_active: bool = False, iau_wgt_dyn: float = 0.0, divdamp_type: dycore_states.DivergenceDampingType = dycore_states.DivergenceDampingType.THREE_DIMENSIONAL, - divdamp_trans_start: float = 12500.0, - divdamp_trans_end: float = 17500.0, l_vert_nested: bool = False, deepatmos_mode: bool = False, rhotheta_offctr: float = -0.1, @@ -183,19 +180,11 @@ def __init__( #: stability without heavy orography smoothing self.igradp_method: dycore_states.HorizontalPressureDiscretizationType = igradp_method - #: type of Rayleigh damping - self.rayleigh_type: constants.RayleighType = rayleigh_type - # used for calculation of rayleigh_w, rayleigh_vn in mo_vertical_grid.f90 - self.rayleigh_coeff: float = rayleigh_coeff - #: order of divergence damping self.divdamp_order: dycore_states.DivergenceDampingOrder = divdamp_order #: type of divergence damping self.divdamp_type: dycore_states.DivergenceDampingType = divdamp_type - #: Lower and upper bound of transition zone between 2D and 3D divergence damping in case of divdamp_type = 32 [m] - self.divdamp_trans_start: float = divdamp_trans_start - self.divdamp_trans_end: float = divdamp_trans_end #: off-centering for density and potential temperature at interface levels. #: Specifying a negative value here reduces the amount of vertical @@ -317,11 +306,6 @@ def _validate(self): "`DivergenceDampingType.TWO_DIMENSIONAL` (2) is not yet implemented" ) - if self.rayleigh_type != constants.RayleighType.KLEMP: - raise NotImplementedError( - "Only Klemp type of the Rayleigh damping (nudging vertical wind towards zero) is implemented." - ) - class NonHydrostaticParams: """Calculates derived quantities depending on the NonHydrostaticConfig.""" @@ -360,6 +344,7 @@ def __init__( grid: icon_grid.IconGrid, config: NonHydrostaticConfig, params: NonHydrostaticParams, + metrics_config: metrics_factory.MetricsConfig, metric_state_nonhydro: dycore_states.MetricStateNonHydro, interpolation_state: dycore_states.InterpolationState, vertical_params: v_grid.VerticalGrid, @@ -376,6 +361,7 @@ def __init__( self._grid = grid self._config = config + self._metrics_config = metrics_config self._params = params self._metric_state_nonhydro = metric_state_nonhydro self._interpolation_state = interpolation_state @@ -576,7 +562,7 @@ def __init__( "wgtfacq_c": self._metric_state_nonhydro.wgtfacq_c, "iau_wgt_dyn": self._config.iau_wgt_dyn, "is_iau_active": self._config.is_iau_active, - "rayleigh_type": self._config.rayleigh_type, + "rayleigh_type": self._metrics_config.rayleigh_type, "divdamp_type": self._config.divdamp_type, }, variants={ @@ -611,7 +597,7 @@ def __init__( "advection_implicit_weight_parameter": self._params.advection_implicit_weight_parameter, "iau_wgt_dyn": self._config.iau_wgt_dyn, "is_iau_active": self._config.is_iau_active, - "rayleigh_type": self._config.rayleigh_type, + "rayleigh_type": self._metrics_config.rayleigh_type, }, variants={ "at_first_substep": [False, True], diff --git a/model/atmosphere/dycore/tests/dycore/integration_tests/test_benchmark_solve_nonhydro.py b/model/atmosphere/dycore/tests/dycore/integration_tests/test_benchmark_solve_nonhydro.py index ef9bc2eb8f..2e674cd96c 100644 --- a/model/atmosphere/dycore/tests/dycore/integration_tests/test_benchmark_solve_nonhydro.py +++ b/model/atmosphere/dycore/tests/dycore/integration_tests/test_benchmark_solve_nonhydro.py @@ -52,7 +52,6 @@ def solve_nonhydro( mesh = geometry_field_source.grid config = solve_nh.NonHydrostaticConfig( - rayleigh_coeff=0.1, divdamp_order=dycore_states.DivergenceDampingOrder.COMBINED, # type: ignore[arg-type] iau_wgt_dyn=1.0, fourth_order_divdamp_factor=0.004, @@ -202,6 +201,9 @@ def solve_nonhydro( cell_geometry=cell_geometry, owner_mask=geometry_field_source.get("cell_owner_mask"), backend=backend_like, + metrics_config=metrics_factory.MetricsConfig( + exner_expol=0.333, vwind_offctr=0.2, thslp_zdiffu=0.02, thhgtd_zdiffu=125.0 + ), ) return solve_nonhydro diff --git a/model/atmosphere/dycore/tests/dycore/integration_tests/test_solve_nonhydro.py b/model/atmosphere/dycore/tests/dycore/integration_tests/test_solve_nonhydro.py index 011800753a..8eca5a6d07 100644 --- a/model/atmosphere/dycore/tests/dycore/integration_tests/test_solve_nonhydro.py +++ b/model/atmosphere/dycore/tests/dycore/integration_tests/test_solve_nonhydro.py @@ -25,8 +25,9 @@ from icon4py.model.common import constants, dimension as dims from icon4py.model.common.grid import horizontal as h_grid, vertical as v_grid from icon4py.model.common.math import smagorinsky +from icon4py.model.common.metrics import metrics_factory from icon4py.model.common.utils import data_allocation as data_alloc -from icon4py.model.testing import definitions, test_utils +from icon4py.model.testing import definitions as test_defs, test_utils from .. import utils from ..fixtures import * # noqa: F403 @@ -40,7 +41,7 @@ @pytest.mark.datatest -@pytest.mark.parametrize("experiment", [definitions.Experiments.MCH_CH_R04B09]) +@pytest.mark.parametrize("experiment", [test_defs.Experiments.MCH_CH_R04B09]) def test_validate_divdamp_fields_against_savepoint_values( grid_savepoint: sb.IconGridSavepoint, savepoint_nonhydro_init: sb.IconNonHydroInitSavepoint, @@ -107,7 +108,7 @@ def test_validate_divdamp_fields_against_savepoint_values( @pytest.mark.datatest -@pytest.mark.parametrize("experiment", [definitions.Experiments.MCH_CH_R04B09]) +@pytest.mark.parametrize("experiment", [test_defs.Experiments.MCH_CH_R04B09]) @pytest.mark.parametrize( "istep_init, step_date_init, substep_init, at_initial_timestep", [ @@ -144,12 +145,12 @@ def test_time_step_flags( "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), ( - definitions.Experiments.EXCLAIM_APE, + test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000", ), @@ -178,7 +179,7 @@ def test_nonhydro_predictor_step( backend, ): caplog.set_level(logging.WARN) - config = definitions.construct_nonhydrostatic_config(experiment) + config = test_defs.construct_nonhydrostatic_config(experiment) sp = savepoint_nonhydro_init sp_exit = savepoint_nonhydro_exit nonhydro_params = solve_nh.NonHydrostaticParams(config) @@ -211,6 +212,9 @@ def test_nonhydro_predictor_step( cell_geometry=cell_geometry, owner_mask=grid_savepoint.c_owner_mask(), backend=backend, + metrics_config=metrics_factory.MetricsConfig( + exner_expol=0.333, vwind_offctr=0.2, thslp_zdiffu=0.02, thhgtd_zdiffu=125.0 + ), ) nlev = icon_grid.num_levels at_first_substep = substep_init == 1 @@ -472,12 +476,12 @@ def test_nonhydro_predictor_step( "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), ( - definitions.Experiments.EXCLAIM_APE, + test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000", ), @@ -508,7 +512,7 @@ def test_nonhydro_corrector_step( backend, ): caplog.set_level(logging.WARN) - config = definitions.construct_nonhydrostatic_config(experiment) + config = test_defs.construct_nonhydrostatic_config(experiment) init_savepoint = savepoint_nonhydro_init nonhydro_params = solve_nh.NonHydrostaticParams(config) vertical_config = v_grid.VerticalGridConfig( @@ -561,6 +565,9 @@ def test_nonhydro_corrector_step( cell_geometry=cell_geometry, owner_mask=grid_savepoint.c_owner_mask(), backend=backend, + metrics_config=metrics_factory.MetricsConfig( + exner_expol=0.333, vwind_offctr=0.2, thslp_zdiffu=0.02, thhgtd_zdiffu=125.0 + ), ) at_first_substep = substep_init == 1 at_last_substep = substep_init == ndyn_substeps @@ -669,12 +676,12 @@ def test_nonhydro_corrector_step( "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), ( - definitions.Experiments.EXCLAIM_APE, + test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000", ), @@ -706,7 +713,7 @@ def test_run_solve_nonhydro_single_step( backend, ): caplog.set_level(logging.WARN) - config = definitions.construct_nonhydrostatic_config(experiment) + config = test_defs.construct_nonhydrostatic_config(experiment) sp = savepoint_nonhydro_init sp_step_exit = savepoint_nonhydro_step_final @@ -749,6 +756,9 @@ def test_run_solve_nonhydro_single_step( cell_geometry=cell_geometry, owner_mask=grid_savepoint.c_owner_mask(), backend=backend, + metrics_config=metrics_factory.MetricsConfig( + exner_expol=0.333, vwind_offctr=0.2, thslp_zdiffu=0.02, thhgtd_zdiffu=125.0 + ), ) prognostic_states = utils.create_prognostic_states(sp) @@ -803,7 +813,7 @@ def test_run_solve_nonhydro_single_step( # why is this not run for APE? @pytest.mark.embedded_remap_error @pytest.mark.datatest -@pytest.mark.parametrize("experiment", [definitions.Experiments.MCH_CH_R04B09]) +@pytest.mark.parametrize("experiment", [test_defs.Experiments.MCH_CH_R04B09]) @pytest.mark.parametrize( "istep_init, substep_init, step_date_init, istep_exit, substep_exit, step_date_exit, at_initial_timestep", [ @@ -835,7 +845,7 @@ def test_run_solve_nonhydro_multi_step( ndyn_substeps, backend, ): - config = definitions.construct_nonhydrostatic_config(experiment) + config = test_defs.construct_nonhydrostatic_config(experiment) sp = savepoint_nonhydro_init sp_step_exit = savepoint_nonhydro_step_final nonhydro_params = solve_nh.NonHydrostaticParams(config) @@ -882,6 +892,9 @@ def test_run_solve_nonhydro_multi_step( cell_geometry=cell_geometry, owner_mask=grid_savepoint.c_owner_mask(), backend=backend, + metrics_config=metrics_factory.MetricsConfig( + exner_expol=0.333, vwind_offctr=0.2, thslp_zdiffu=0.02, thhgtd_zdiffu=125.0 + ), ) for i_substep in range(ndyn_substeps): @@ -978,7 +991,7 @@ def test_run_solve_nonhydro_multi_step( @pytest.mark.datatest -@pytest.mark.parametrize("experiment", [definitions.Experiments.MCH_CH_R04B09]) +@pytest.mark.parametrize("experiment", [test_defs.Experiments.MCH_CH_R04B09]) def test_non_hydrostatic_params(savepoint_nonhydro_init): config = solve_nh.NonHydrostaticConfig() params = solve_nh.NonHydrostaticParams(config) @@ -996,12 +1009,12 @@ def test_non_hydrostatic_params(savepoint_nonhydro_init): "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), ( - definitions.Experiments.EXCLAIM_APE, + test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000", ), @@ -1074,7 +1087,7 @@ def test_compute_perturbed_quantities_and_interpolation( icon_grid, dims.CellDim, dims.KDim, allocator=backend ) - config = definitions.construct_nonhydrostatic_config(experiment) + config = test_defs.construct_nonhydrostatic_config(experiment) igradp_method = config.igradp_method nflatlev = vertical_params.nflatlev @@ -1209,12 +1222,12 @@ def test_compute_perturbed_quantities_and_interpolation( "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), ( - definitions.Experiments.EXCLAIM_APE, + test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000", ), @@ -1354,12 +1367,12 @@ def test_compute_interpolation_and_nonhydro_buoy( "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), ( - definitions.Experiments.EXCLAIM_APE, + test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000", ), @@ -1438,7 +1451,7 @@ def test_compute_rho_theta_pgrad_and_update_vn( grf_tend_vn = sp_nh_init.grf_tend_vn() rho_at_edges_on_model_levels = sp_stencil_init.z_rho_e() theta_v_at_edges_on_model_levels = sp_stencil_init.z_theta_v_e() - config = definitions.construct_nonhydrostatic_config(experiment) + config = test_defs.construct_nonhydrostatic_config(experiment) primal_normal_cell_1 = grid_savepoint.primal_normal_cell_x() primal_normal_cell_2 = grid_savepoint.primal_normal_cell_y() dual_normal_cell_1 = grid_savepoint.dual_normal_cell_x() @@ -1565,12 +1578,12 @@ def test_compute_rho_theta_pgrad_and_update_vn( "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), ( - definitions.Experiments.EXCLAIM_APE, + test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000", ), @@ -1619,7 +1632,7 @@ def test_apply_divergence_damping_and_update_vn( current_vn = sp_stencil_init.vn() next_vn = savepoint_nonhydro_init.vn_new() horizontal_gradient_of_normal_wind_divergence = sp_nh_init.z_graddiv_vn() - config = definitions.construct_nonhydrostatic_config(experiment) + config = test_defs.construct_nonhydrostatic_config(experiment) mean_cell_area = grid_savepoint.mean_cell_area() # TODO: Use serialized data ('enh_divdamp_fac' in icon) instead of computing 'interpolated_fourth_order_divdamp_factor' @@ -1720,12 +1733,12 @@ def test_apply_divergence_damping_and_update_vn( "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), ( - definitions.Experiments.EXCLAIM_APE, + test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000", ), @@ -1900,12 +1913,12 @@ def test_compute_horizontal_velocity_quantities_and_fluxes( "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), ( - definitions.Experiments.EXCLAIM_APE, + test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000", ), @@ -2017,12 +2030,12 @@ def test_compute_averaged_vn_and_fluxes( "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), ( - definitions.Experiments.EXCLAIM_APE, + test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000", ), @@ -2054,7 +2067,7 @@ def test_vertically_implicit_solver_at_predictor_step( ): sp_nh_exit = savepoint_nonhydro_exit sp_stencil_init = savepoint_vertically_implicit_dycore_solver_init - config = definitions.construct_nonhydrostatic_config(experiment) + config = test_defs.construct_nonhydrostatic_config(experiment) xp = data_alloc.import_array_ns(backend) vertical_config = v_grid.VerticalGridConfig( @@ -2156,7 +2169,7 @@ def test_vertically_implicit_solver_at_predictor_step( iau_wgt_dyn=iau_wgt_dyn, dtime=savepoint_nonhydro_init.get_metadata("dtime").get("dtime"), is_iau_active=is_iau_active, - rayleigh_type=config.rayleigh_type, + rayleigh_type=constants.RayleighType.KLEMP, divdamp_type=divdamp_type, at_first_substep=at_first_substep, end_index_of_damping_layer=grid_savepoint.nrdmax(), @@ -2219,12 +2232,12 @@ def test_vertically_implicit_solver_at_predictor_step( "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), ( - definitions.Experiments.EXCLAIM_APE, + test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000", ), @@ -2267,7 +2280,7 @@ def test_vertically_implicit_solver_at_corrector_step( at_first_substep = substep_init == 0 at_last_substep = substep_exit == 0 - config = definitions.construct_nonhydrostatic_config(experiment) + config = test_defs.construct_nonhydrostatic_config(experiment) nonhydro_params = solve_nh.NonHydrostaticParams(config) @@ -2363,7 +2376,7 @@ def test_vertically_implicit_solver_at_corrector_step( iau_wgt_dyn=iau_wgt_dyn, dtime=savepoint_nonhydro_init.get_metadata("dtime").get("dtime"), is_iau_active=is_iau_active, - rayleigh_type=config.rayleigh_type, + rayleigh_type=constants.RayleighType.KLEMP, at_first_substep=at_first_substep, at_last_substep=at_last_substep, end_index_of_damping_layer=grid_savepoint.nrdmax(), diff --git a/model/atmosphere/dycore/tests/dycore/integration_tests/test_velocity_advection.py b/model/atmosphere/dycore/tests/dycore/integration_tests/test_velocity_advection.py index cacfda444c..544d4391fa 100644 --- a/model/atmosphere/dycore/tests/dycore/integration_tests/test_velocity_advection.py +++ b/model/atmosphere/dycore/tests/dycore/integration_tests/test_velocity_advection.py @@ -32,7 +32,7 @@ ) from icon4py.model.common.states import prognostic_state as prognostics from icon4py.model.common.utils import data_allocation as data_alloc -from icon4py.model.testing import definitions, serialbox, test_utils +from icon4py.model.testing import definitions as test_defs, serialbox, test_utils from .. import utils from ..fixtures import * # noqa: F403 @@ -72,8 +72,8 @@ def create_vertical_params( @pytest.mark.parametrize( "experiment, step_date_init", [ - (definitions.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000"), - (definitions.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000"), + (test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000"), + (test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000"), ], ) def test_verify_velocity_init_against_savepoint( @@ -86,7 +86,7 @@ def test_verify_velocity_init_against_savepoint( model_top_height: ta.wpfloat, stretch_factor: ta.wpfloat, damping_height: ta.wpfloat, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend | None, ) -> None: interpolation_state = utils.construct_interpolation_state(interpolation_savepoint) @@ -119,8 +119,8 @@ def test_verify_velocity_init_against_savepoint( @pytest.mark.parametrize( "experiment, step_date_init", [ - (definitions.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000"), - (definitions.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000"), + (test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000"), + (test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000"), ], ) def test_scale_factors_by_dtime( @@ -169,16 +169,16 @@ def test_scale_factors_by_dtime( "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:20.000", "2021-06-20T12:00:20.000", ), - (definitions.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000"), + (test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000"), ], ) def test_velocity_predictor_step( @@ -324,16 +324,16 @@ def test_velocity_predictor_step( "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:20.000", "2021-06-20T12:00:20.000", ), - (definitions.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000"), + (test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000"), ], ) def test_velocity_corrector_step( @@ -457,11 +457,11 @@ def test_velocity_corrector_step( "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), - (definitions.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000"), + (test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000"), ], ) def test_compute_diagnostics_from_normal_wind( @@ -588,16 +588,16 @@ def test_compute_diagnostics_from_normal_wind( "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:20.000", "2021-06-20T12:00:20.000", ), - (definitions.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000"), + (test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000"), ], ) @pytest.mark.parametrize("istep_init, istep_exit", [(1, 1)]) @@ -738,16 +738,16 @@ def test_compute_advection_in_predictor_vertical_momentum( "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:20.000", "2021-06-20T12:00:20.000", ), - (definitions.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000"), + (test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000"), ], ) @pytest.mark.parametrize("istep_init, istep_exit", [(2, 2)]) @@ -883,11 +883,11 @@ def test_compute_advection_in_corrector_vertical_momentum( "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), - (definitions.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000"), + (test_defs.Experiments.EXCLAIM_APE, "2000-01-01T00:00:02.000", "2000-01-01T00:00:02.000"), ], ) @pytest.mark.parametrize("istep_init, istep_exit", [(1, 1), (2, 2)]) diff --git a/model/atmosphere/dycore/tests/dycore/mpi_tests/test_parallel_solve_nonhydro.py b/model/atmosphere/dycore/tests/dycore/mpi_tests/test_parallel_solve_nonhydro.py index 6636ee4a24..c6d1df8c13 100644 --- a/model/atmosphere/dycore/tests/dycore/mpi_tests/test_parallel_solve_nonhydro.py +++ b/model/atmosphere/dycore/tests/dycore/mpi_tests/test_parallel_solve_nonhydro.py @@ -17,6 +17,7 @@ from icon4py.model.common import dimension as dims, type_alias as ta from icon4py.model.common.decomposition import definitions, mpi_decomposition from icon4py.model.common.grid import icon, states as grid_states, vertical as v_grid +from icon4py.model.common.metrics import metrics_factory from icon4py.model.common.utils import data_allocation as data_alloc from icon4py.model.testing import definitions as test_defs, parallel_helpers, serialbox, test_utils @@ -50,7 +51,7 @@ def test_run_solve_nonhydro_single_step( step_date_init: str, step_date_exit: str, substep_init: int, - experiment: test_defs.Experiment, + experiment: test_defs.ExperimentDescription, ndyn_substeps: int, icon_grid: icon.IconGrid, savepoint_nonhydro_init: serialbox.IconNonHydroInitSavepoint, @@ -140,6 +141,9 @@ def test_run_solve_nonhydro_single_step( owner_mask=grid_savepoint.c_owner_mask(), backend=backend, exchange=exchange, + metrics_config=metrics_factory.MetricsConfig( + exner_expol=0.333, vwind_offctr=0.2, thslp_zdiffu=0.02, thhgtd_zdiffu=125.0 + ), ) _log.info( diff --git a/model/atmosphere/subgrid_scale_physics/microphysics/tests/microphysics/integration_tests/test_saturation_adjustment.py b/model/atmosphere/subgrid_scale_physics/microphysics/tests/microphysics/integration_tests/test_saturation_adjustment.py index 12af8065ae..4d936e752f 100644 --- a/model/atmosphere/subgrid_scale_physics/microphysics/tests/microphysics/integration_tests/test_saturation_adjustment.py +++ b/model/atmosphere/subgrid_scale_physics/microphysics/tests/microphysics/integration_tests/test_saturation_adjustment.py @@ -17,7 +17,7 @@ from icon4py.model.common import dimension as dims from icon4py.model.common.grid import vertical as v_grid from icon4py.model.common.utils import data_allocation as data_alloc -from icon4py.model.testing import definitions, test_utils +from icon4py.model.testing import definitions as test_defs, test_utils from ..fixtures import * # noqa: F403 @@ -34,7 +34,7 @@ @pytest.mark.datatest @pytest.mark.parametrize( "experiment, model_top_height", - [(definitions.Experiments.WEISMAN_KLEMP_TORUS, 30000.0)], + [(test_defs.Experiments.WEISMAN_KLEMP_TORUS, 30000.0)], ) @pytest.mark.parametrize( "date", ["2008-09-01T01:59:48.000", "2008-09-01T01:59:52.000", "2008-09-01T01:59:56.000"] diff --git a/model/atmosphere/subgrid_scale_physics/microphysics/tests/microphysics/integration_tests/test_single_moment_six_class_gscp_graupel.py b/model/atmosphere/subgrid_scale_physics/microphysics/tests/microphysics/integration_tests/test_single_moment_six_class_gscp_graupel.py index 20757bd7a1..d98390c2b8 100644 --- a/model/atmosphere/subgrid_scale_physics/microphysics/tests/microphysics/integration_tests/test_single_moment_six_class_gscp_graupel.py +++ b/model/atmosphere/subgrid_scale_physics/microphysics/tests/microphysics/integration_tests/test_single_moment_six_class_gscp_graupel.py @@ -23,7 +23,7 @@ tracer_state as tracers, ) from icon4py.model.common.utils import data_allocation as data_alloc -from icon4py.model.testing import definitions, test_utils +from icon4py.model.testing import definitions as test_defs, test_utils from ..fixtures import * # noqa: F403 @@ -40,14 +40,14 @@ @pytest.mark.parametrize( "experiment, model_top_height", [ - (definitions.Experiments.WEISMAN_KLEMP_TORUS, 30000.0), + (test_defs.Experiments.WEISMAN_KLEMP_TORUS, 30000.0), ], ) @pytest.mark.parametrize( "date", ["2008-09-01T01:59:48.000", "2008-09-01T01:59:52.000", "2008-09-01T01:59:56.000"] ) def test_graupel( - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, model_top_height: ta.wpfloat, date: str, *, diff --git a/model/common/src/icon4py/model/common/metrics/metrics_factory.py b/model/common/src/icon4py/model/common/metrics/metrics_factory.py index 0f9100ae76..7307d47180 100644 --- a/model/common/src/icon4py/model/common/metrics/metrics_factory.py +++ b/model/common/src/icon4py/model/common/metrics/metrics_factory.py @@ -5,7 +5,7 @@ # # Please, refer to the LICENSE file in the root directory. # SPDX-License-Identifier: BSD-3-Clause -import functools +import dataclasses import logging import math @@ -54,6 +54,74 @@ log = logging.getLogger(__name__) +@dataclasses.dataclass +class MetricsConfig: + + exner_expol: float = 1.0 / 3.0 + """ + Temporal extrapolation (fraction of dt) of Exner function for computation + of horizontal pressure gradient. This damps horizontally propagating sound + waves. + """ + + vwind_offctr: float = 0.15 + """ + Off-centering in vertical wind solver. Higher values may be needed for R2B5 + or coarser grids when the model top is above 50 km. Negative values are not + allowed. + """ + + thslp_zdiffu: float = 0.025 + """ + Slope threshold above which truly horizontal temperature diffusion is + activated. + """ + + thhgtd_zdiffu: float = 200.0 + """ + Threshold of height difference between neighboring grid points above which + truly horizontal temperature diffusion is activated (alternative criterion + to thslp_zdiffu). + """ + + rayleigh_type: constants.RayleighType = constants.RayleighType.KLEMP + """ + Type of Rayleigh damping to be applied in the upper part of the model + domain. Only KLEMP type is supported. + """ + + rayleigh_coeff: float = 0.05 + """ + Rayleigh damping coefficient 1/tau_0 (Klemp, Dudhia, Hassiotis: MWR136, + pp.3987-4004) + """ + + divdamp_trans_start: float = 12500.0 + """ + Lower bound of transition zone between 2D and 3D divergence damping. + """ + + divdamp_trans_end: float = 17500.0 + """ + Upper bound of transition zone between 2D and 3D divergence damping. + """ + + divdamp_type: int = 3 + """Type of divergence damping.""" + + igradp_method: int = 3 + """Method for computing the horizontal pressure gradient.""" + + igradp_constant: int = 3 + """Constant for pressure gradient computation.""" + + def __post_init__(self): + if self.rayleigh_type != constants.RayleighType.KLEMP: + raise NotImplementedError( + f"Only rayleigh_type = KLEMP is implemented, got {self.rayleigh_type}." + ) + + class MetricsFieldsFactory(factory.FieldSource, factory.GridProvider): def __init__( self, @@ -65,12 +133,7 @@ def __init__( interpolation_source: interpolation_factory.InterpolationFieldsFactory, backend: gtx_typing.Backend | None, metadata: dict[str, model.FieldMetaData], - rayleigh_type: int, - rayleigh_coeff: float, - exner_expol: float, - vwind_offctr: float, - thslp_zdiffu: float, - thhgtd_zdiffu: float, + metrics_config: MetricsConfig, exchange: decomposition.ExchangeRuntime = decomposition.single_node_default, global_reductions: decomposition.Reductions = decomposition.single_node_reductions, ): @@ -90,22 +153,9 @@ def __init__( f"initialized metrics factory for backend = '{self._backend_name()}' and grid = '{self._grid}'" ) log.debug(f"using array_ns {self._xp} ") - vct_a_1 = self._vertical_grid.interface_physical_height.ndarray[0].item() - self._config = { - "divdamp_trans_start": 12500.0, - "divdamp_trans_end": 17500.0, - "divdamp_type": 3, - "damping_height": vertical_grid.config.rayleigh_damping_height, - "rayleigh_type": rayleigh_type, - "rayleigh_coeff": rayleigh_coeff, - "exner_expol": exner_expol, - "vwind_offctr": vwind_offctr, - "igradp_method": 3, - "igradp_constant": 3, - "thslp_zdiffu": thslp_zdiffu, - "thhgtd_zdiffu": thhgtd_zdiffu, - "vct_a_1": vct_a_1, - } + self._metrics_config = metrics_config + self._vct_a_1 = self._vertical_grid.interface_physical_height.ndarray[0].item() + self._damping_height = vertical_grid.config.rayleigh_damping_height k_index = data_alloc.index_field( self._grid, dims.KDim, extend={dims.KDim: 1}, allocator=self._allocator @@ -272,9 +322,9 @@ def _register_computed_fields(self) -> None: # noqa: PLR0915 [too-many-statemen fields={"scaling_factor_for_3d_divdamp": attrs.SCALING_FACTOR_FOR_3D_DIVDAMP}, deps={"vct_a": "vct_a"}, params={ - "divdamp_trans_start": self._config["divdamp_trans_start"], - "divdamp_trans_end": self._config["divdamp_trans_end"], - "divdamp_type": self._config["divdamp_type"], + "divdamp_trans_start": self._metrics_config.divdamp_trans_start, + "divdamp_trans_end": self._metrics_config.divdamp_trans_end, + "divdamp_type": self._metrics_config.divdamp_type, }, do_exchange=False, ) @@ -291,10 +341,10 @@ def _register_computed_fields(self) -> None: # noqa: PLR0915 [too-many-statemen }, fields={"rayleigh_w": attrs.RAYLEIGH_W}, params={ - "damping_height": self._config["damping_height"], - "rayleigh_type": self._config["rayleigh_type"], - "rayleigh_coeff": self._config["rayleigh_coeff"], - "vct_a_1": self._config["vct_a_1"], + "damping_height": self._damping_height, + "rayleigh_type": self._metrics_config.rayleigh_type, + "rayleigh_coeff": self._metrics_config.rayleigh_coeff, + "vct_a_1": self._vct_a_1, "pi_const": math.pi, }, do_exchange=False, @@ -555,7 +605,7 @@ def _register_computed_fields(self) -> None: # noqa: PLR0915 [too-many-statemen "dual_edge_length": geometry_attrs.DUAL_EDGE_LENGTH, }, params={ - "vwind_offctr": self._config["vwind_offctr"], + "vwind_offctr": self._metrics_config.vwind_offctr, "nlev": self._grid.num_levels, "horizontal_start_cell": self._grid.start_index( cell_domain(h_grid.Zone.LATERAL_BOUNDARY_LEVEL_2) @@ -598,7 +648,7 @@ def _register_computed_fields(self) -> None: # noqa: PLR0915 [too-many-statemen }, fields={attrs.EXNER_EXFAC: attrs.EXNER_EXFAC}, params={ - "exner_expol": self._config["exner_expol"], + "exner_expol": self._metrics_config.exner_expol, "lateral_boundary_level_2": self._grid.start_index( cell_domain(h_grid.Zone.LATERAL_BOUNDARY_LEVEL_2) ), @@ -936,8 +986,8 @@ def _register_computed_fields(self) -> None: # noqa: PLR0915 [too-many-statemen domain=(dims.CellDim, dims.KDim), fields=(attrs.ZD_DIFFCOEF,), params={ - "thslp_zdiffu": self._config["thslp_zdiffu"], - "thhgtd_zdiffu": self._config["thhgtd_zdiffu"], + "thslp_zdiffu": self._metrics_config.thslp_zdiffu, + "thhgtd_zdiffu": self._metrics_config.thhgtd_zdiffu, "cell_nudging": self._grid.start_index( h_grid.domain(dims.CellDim)(h_grid.Zone.NUDGING) ), @@ -966,8 +1016,8 @@ def _register_computed_fields(self) -> None: # noqa: PLR0915 [too-many-statemen attrs.ZD_VERTOFFSET, ), params={ - "thslp_zdiffu": self._config["thslp_zdiffu"], - "thhgtd_zdiffu": self._config["thhgtd_zdiffu"], + "thslp_zdiffu": self._metrics_config.thslp_zdiffu, + "thhgtd_zdiffu": self._metrics_config.thhgtd_zdiffu, "cell_nudging": self._grid.start_index( h_grid.domain(dims.CellDim)(h_grid.Zone.NUDGING) ), diff --git a/model/common/tests/common/decomposition/mpi_tests/test_mpi_decomposition.py b/model/common/tests/common/decomposition/mpi_tests/test_mpi_decomposition.py index a4324fefc5..20726f9f0b 100644 --- a/model/common/tests/common/decomposition/mpi_tests/test_mpi_decomposition.py +++ b/model/common/tests/common/decomposition/mpi_tests/test_mpi_decomposition.py @@ -83,7 +83,7 @@ def test_decomposition_info_masked( download_ser_data: Any, decomposition_info: definitions.DecompositionInfo, processor_props: definitions.ProcessProperties, - experiment: test_defs.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: parallel_helpers.check_comm_size(processor_props, sizes=(2,)) my_rank = processor_props.rank @@ -138,7 +138,7 @@ def test_decomposition_info_local_index( caplog: Any, decomposition_info: definitions.DecompositionInfo, processor_props: definitions.ProcessProperties, - experiment: test_defs.Experiment, + experiment: test_defs.ExperimentDescription, ): caplog.set_level(logging.INFO) parallel_helpers.check_comm_size(processor_props, sizes=(2,)) @@ -328,7 +328,7 @@ def test_exchange_on_dummy_data( @pytest.mark.parametrize("processor_props", [False], indirect=True) def test_halo_exchange_for_sparse_field( interpolation_savepoint: serialbox.InterpolationSavepoint, - experiment: test_defs.Experiment, + experiment: test_defs.ExperimentDescription, processor_props: definitions.ProcessProperties, grid_savepoint: serialbox.IconGridSavepoint, icon_grid: icon.IconGrid, diff --git a/model/common/tests/common/diagnostic_calculations/unit_tests/test_diagnostic_calculations.py b/model/common/tests/common/diagnostic_calculations/unit_tests/test_diagnostic_calculations.py index b3e6dbb257..a3ae55519f 100644 --- a/model/common/tests/common/diagnostic_calculations/unit_tests/test_diagnostic_calculations.py +++ b/model/common/tests/common/diagnostic_calculations/unit_tests/test_diagnostic_calculations.py @@ -24,7 +24,7 @@ from icon4py.model.common.interpolation.stencils import edge_2_cell_vector_rbf_interpolation as rbf from icon4py.model.common.states import diagnostic_state as diagnostics, tracer_state as tracers from icon4py.model.common.utils import data_allocation as data_alloc -from icon4py.model.testing import definitions, test_utils +from icon4py.model.testing import definitions as test_defs, test_utils from icon4py.model.testing.fixtures.datatest import ( backend, data_provider, @@ -45,7 +45,7 @@ @pytest.mark.datatest -@pytest.mark.parametrize("experiment", [definitions.Experiments.JW]) +@pytest.mark.parametrize("experiment", [test_defs.Experiments.JW]) def test_diagnose_temperature( data_provider: sb.IconSerialDataProvider, icon_grid: base_grid.Grid, backend: gtx_typing.Backend ) -> None: @@ -100,7 +100,7 @@ def test_diagnose_temperature( @pytest.mark.datatest -@pytest.mark.parametrize("experiment", [definitions.Experiments.JW]) +@pytest.mark.parametrize("experiment", [test_defs.Experiments.JW]) def test_diagnose_meridional_and_zonal_winds( data_provider: sb.IconSerialDataProvider, interpolation_savepoint: sb.InterpolationSavepoint, @@ -153,7 +153,7 @@ def test_diagnose_meridional_and_zonal_winds( @pytest.mark.datatest -@pytest.mark.parametrize("experiment", [definitions.Experiments.JW]) +@pytest.mark.parametrize("experiment", [test_defs.Experiments.JW]) def test_diagnose_surface_pressure( data_provider: sb.IconSerialDataProvider, icon_grid: base_grid.Grid, @@ -192,7 +192,7 @@ def test_diagnose_surface_pressure( @pytest.mark.datatest -@pytest.mark.parametrize("experiment", [definitions.Experiments.JW]) +@pytest.mark.parametrize("experiment", [test_defs.Experiments.JW]) def test_diagnose_pressure( data_provider: sb.IconSerialDataProvider, icon_grid: base_grid.Grid, @@ -242,7 +242,7 @@ def test_diagnose_pressure( @pytest.mark.parametrize( "experiment, model_top_height, damping_height, stretch_factor", - [(definitions.Experiments.WEISMAN_KLEMP_TORUS, 30000.0, 8000.0, 0.85)], + [(test_defs.Experiments.WEISMAN_KLEMP_TORUS, 30000.0, 8000.0, 0.85)], ) @pytest.mark.parametrize( "date", ["2008-09-01T01:59:48.000", "2008-09-01T01:59:52.000", "2008-09-01T01:59:56.000"] diff --git a/model/common/tests/common/fixtures.py b/model/common/tests/common/fixtures.py index 01b113e551..92eab99722 100644 --- a/model/common/tests/common/fixtures.py +++ b/model/common/tests/common/fixtures.py @@ -12,21 +12,20 @@ import gt4py.next.typing as gtx_typing import pytest +from icon4py.model.common.decomposition import definitions as decomposition from icon4py.model.common.grid import geometry, geometry_attributes, gridfile, vertical from icon4py.model.common.interpolation import interpolation_attributes, interpolation_factory from icon4py.model.common.metrics import metrics_attributes, metrics_factory -from icon4py.model.testing import serialbox -from icon4py.model.testing.definitions import construct_metrics_config +from icon4py.model.testing import definitions as test_defs, serialbox from icon4py.model.testing.fixtures.datatest import ( backend, backend_like, damping_height, data_provider, - decomposition, decomposition_info, - definitions, download_ser_data, experiment, + experiment_config, flat_height, grid_savepoint, htop_moist_proc, @@ -128,7 +127,8 @@ def metrics_factory_from_savepoint( backend: gtx_typing.Backend, grid_savepoint: serialbox.IconGridSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, decomposition_info: decomposition.DecompositionInfo, processor_props: decomposition.ProcessProperties, geometry_from_savepoint: geometry.GridGeometry, @@ -139,25 +139,7 @@ def metrics_factory_from_savepoint( geometry_source = geometry_from_savepoint interpolation_field_source = interpolation_factory_from_savepoint topography = topography_savepoint.topo_c() - ( - lowest_layer_thickness, - model_top_height, - stretch_factor, - damping_height, - rayleigh_coeff, - exner_expol, - vwind_offctr, - rayleigh_type, - thslp_zdiffu, - thhgtd_zdiffu, - ) = construct_metrics_config(experiment) - vertical_config = vertical.VerticalGridConfig( - geometry_source.grid.num_levels, - lowest_layer_thickness=lowest_layer_thickness, - model_top_height=model_top_height, - stretch_factor=stretch_factor, - rayleigh_damping_height=damping_height, - ) + vertical_config = experiment_config.vertical_grid vertical_grid = vertical.VerticalGrid( vertical_config, grid_savepoint.vct_a(), grid_savepoint.vct_b() ) @@ -170,12 +152,7 @@ def metrics_factory_from_savepoint( interpolation_source=interpolation_field_source, backend=backend, metadata=metrics_attributes.attrs, - rayleigh_type=rayleigh_type, - rayleigh_coeff=rayleigh_coeff, - exner_expol=exner_expol, - vwind_offctr=vwind_offctr, - thslp_zdiffu=thslp_zdiffu, - thhgtd_zdiffu=thhgtd_zdiffu, + metrics_config=experiment_config.metrics, exchange=exchange, global_reductions=global_reductions, ) diff --git a/model/common/tests/common/grid/integration_tests/test_horizontal.py b/model/common/tests/common/grid/integration_tests/test_horizontal.py index b37d42eedd..e4b847c99d 100644 --- a/model/common/tests/common/grid/integration_tests/test_horizontal.py +++ b/model/common/tests/common/grid/integration_tests/test_horizontal.py @@ -13,7 +13,7 @@ from gt4py import next as gtx from icon4py.model.common.grid import horizontal as h_grid -from icon4py.model.testing import definitions +from icon4py.model.testing import definitions as test_defs from icon4py.model.testing.fixtures import experiment from ...fixtures import * # noqa: F403 @@ -29,7 +29,7 @@ @pytest.mark.datatest @pytest.mark.parametrize("dim", utils.main_horizontal_dims()) def test_map_icon_start_end_index( - experiment: definitions.Experiment, dim: gtx.Dimension, grid_savepoint: sb.IconGridSavepoint + experiment: test_defs.ExperimentDescription, dim: gtx.Dimension, grid_savepoint: sb.IconGridSavepoint ) -> None: end_indices = grid_savepoint.end_index() start_indices = grid_savepoint.start_index() diff --git a/model/common/tests/common/grid/mpi_tests/test_parallel_grid_manager.py b/model/common/tests/common/grid/mpi_tests/test_parallel_grid_manager.py index da17c4d217..f96e5707e4 100644 --- a/model/common/tests/common/grid/mpi_tests/test_parallel_grid_manager.py +++ b/model/common/tests/common/grid/mpi_tests/test_parallel_grid_manager.py @@ -33,10 +33,17 @@ from icon4py.model.common.metrics import metrics_attributes, metrics_factory from icon4py.model.common.states import utils as state_utils from icon4py.model.common.utils import data_allocation as data_alloc -from icon4py.model.testing import definitions as test_defs, grid_utils, test_utils +from icon4py.model.testing import ( + datatest_utils as dt_utils, + definitions as test_defs, + grid_utils, + test_utils, +) from icon4py.model.testing.fixtures.datatest import ( backend, + download_ser_data, experiment, + experiment_config, grid_description, processor_props, topography_savepoint, @@ -501,6 +508,7 @@ def test_metrics_fields_compare_single_multi_rank( processor_props: decomp_defs.ProcessProperties, backend: gtx_typing.Backend | None, experiment: test_defs.Experiment, + experiment_config: test_defs.ExperimentConfig, attrs_name: str, ) -> None: if experiment == test_defs.Experiments.MCH_CH_R04B09: @@ -511,25 +519,7 @@ def test_metrics_fields_compare_single_multi_rank( file = grid_utils.resolve_full_grid_file_name(experiment.grid) - ( - lowest_layer_thickness, - model_top_height, - stretch_factor, - damping_height, - rayleigh_coeff, - exner_expol, - vwind_offctr, - rayleigh_type, - thslp_zdiffu, - thhgtd_zdiffu, - ) = test_defs.construct_metrics_config(experiment) - vertical_config = v_grid.VerticalGridConfig( - experiment.num_levels, - lowest_layer_thickness=lowest_layer_thickness, - model_top_height=model_top_height, - stretch_factor=stretch_factor, - rayleigh_damping_height=damping_height, - ) + vertical_config = experiment_config.vertical_grid xp = data_alloc.import_array_ns(backend) allocator = model_backends.get_allocator(backend) vertical_grid = v_grid.VerticalGrid( @@ -579,12 +569,7 @@ def test_metrics_fields_compare_single_multi_rank( interpolation_source=single_rank_interpolation, backend=backend, metadata=metrics_attributes.attrs, - rayleigh_type=rayleigh_type, - rayleigh_coeff=rayleigh_coeff, - exner_expol=exner_expol, - vwind_offctr=vwind_offctr, - thslp_zdiffu=thslp_zdiffu, - thhgtd_zdiffu=thhgtd_zdiffu, + metrics_config=experiment_config.metrics, exchange=decomp_defs.SingleNodeExchange(), ) _log.info( @@ -642,12 +627,7 @@ def test_metrics_fields_compare_single_multi_rank( interpolation_source=multi_rank_interpolation, backend=backend, metadata=metrics_attributes.attrs, - rayleigh_type=rayleigh_type, - rayleigh_coeff=rayleigh_coeff, - exner_expol=exner_expol, - vwind_offctr=vwind_offctr, - thslp_zdiffu=thslp_zdiffu, - thhgtd_zdiffu=thhgtd_zdiffu, + metrics_config=experiment_config.metrics, exchange=mpi_decomposition.GHexMultiNodeExchange( processor_props, multi_rank_grid_manager.decomposition_info ), @@ -681,31 +661,14 @@ def test_metrics_mask_prog_halo_c( processor_props: decomp_defs.ProcessProperties, backend: gtx_typing.Backend | None, experiment: test_defs.Experiment, + experiment_config: test_defs.ExperimentConfig, ) -> None: if experiment == test_defs.Experiments.MCH_CH_R04B09: pytest.xfail("Limited-area grids not yet supported") file = grid_utils.resolve_full_grid_file_name(experiment.grid) - ( - lowest_layer_thickness, - model_top_height, - stretch_factor, - damping_height, - rayleigh_coeff, - exner_expol, - vwind_offctr, - rayleigh_type, - thslp_zdiffu, - thhgtd_zdiffu, - ) = test_defs.construct_metrics_config(experiment) - vertical_config = v_grid.VerticalGridConfig( - experiment.num_levels, - lowest_layer_thickness=lowest_layer_thickness, - model_top_height=model_top_height, - stretch_factor=stretch_factor, - rayleigh_damping_height=damping_height, - ) + vertical_config = experiment_config.vertical_grid xp = data_alloc.import_array_ns(backend) allocator = model_backends.get_allocator(backend) vertical_grid = v_grid.VerticalGrid( @@ -775,12 +738,7 @@ def test_metrics_mask_prog_halo_c( interpolation_source=multi_rank_interpolation, backend=backend, metadata=metrics_attributes.attrs, - rayleigh_type=rayleigh_type, - rayleigh_coeff=rayleigh_coeff, - exner_expol=exner_expol, - vwind_offctr=vwind_offctr, - thslp_zdiffu=thslp_zdiffu, - thhgtd_zdiffu=thhgtd_zdiffu, + metrics_config=experiment_config.metrics, exchange=mpi_decomposition.GHexMultiNodeExchange( processor_props, multi_rank_grid_manager.decomposition_info ), diff --git a/model/common/tests/common/grid/mpi_tests/test_parallel_icon.py b/model/common/tests/common/grid/mpi_tests/test_parallel_icon.py index d8bf542c55..f64f22c104 100644 --- a/model/common/tests/common/grid/mpi_tests/test_parallel_icon.py +++ b/model/common/tests/common/grid/mpi_tests/test_parallel_icon.py @@ -90,7 +90,7 @@ def test_start_index_end_index_local_zone_on_distributed_lam_grid( processor_props: decomposition.ProcessProperties, dim: gtx.Dimension, icon_grid: base_grid.Grid, - experiment: test_defs.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: parallel_helpers.check_comm_size(processor_props) domain = h_grid.domain(dim)(h_grid.Zone.LOCAL) @@ -162,7 +162,7 @@ def test_start_index_end_index_halo_zones_on_distributed_lam_grid( dim: gtx.Dimension, zone: h_grid.Zone, icon_grid: base_grid.Grid, - experiment: test_defs.Experiment, + experiment: test_defs.ExperimentDescription, level: int, ) -> None: parallel_helpers.check_comm_size(processor_props) diff --git a/model/common/tests/common/grid/unit_tests/test_geometry.py b/model/common/tests/common/grid/unit_tests/test_geometry.py index f918de9210..f7765c1e5f 100644 --- a/model/common/tests/common/grid/unit_tests/test_geometry.py +++ b/model/common/tests/common/grid/unit_tests/test_geometry.py @@ -24,7 +24,7 @@ from icon4py.model.common.grid.geometry import as_sparse_field from icon4py.model.common.math import helpers as math_helpers from icon4py.model.common.utils import data_allocation as data_alloc -from icon4py.model.testing import definitions, grid_utils, test_utils +from icon4py.model.testing import definitions as test_defs, grid_utils, test_utils from icon4py.model.testing.fixtures import ( backend, data_provider, @@ -45,7 +45,7 @@ @pytest.mark.datatest def test_geometry_raises_for_unknown_field( - backend: gtx_typing.Backend, experiment: definitions.Experiment + backend: gtx_typing.Backend, experiment: test_defs.ExperimentDescription ) -> None: geometry = grid_utils.get_grid_geometry(backend, experiment) with pytest.raises(ValueError) as e: @@ -57,16 +57,16 @@ def test_geometry_raises_for_unknown_field( @pytest.mark.parametrize( "experiment, rtol", [ - (definitions.Experiments.MCH_CH_R04B09, 1e-7), - (definitions.Experiments.EXCLAIM_APE, 3e-12), - (definitions.Experiments.GAUSS3D, 1e-13), + (test_defs.Experiments.MCH_CH_R04B09, 1e-7), + (test_defs.Experiments.EXCLAIM_APE, 3e-12), + (test_defs.Experiments.GAUSS3D, 1e-13), ], ) @pytest.mark.datatest def test_edge_control_area( backend: gtx_typing.Backend, grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, rtol: float, ) -> None: expected = grid_savepoint.edge_areas() @@ -79,7 +79,7 @@ def test_edge_control_area( def test_coriolis_parameter( backend: gtx_typing.Backend, grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: geometry_source = grid_utils.get_grid_geometry(backend, experiment) expected = grid_savepoint.f_e() @@ -92,7 +92,7 @@ def test_coriolis_parameter( def test_compute_edge_length( backend: gtx_typing.Backend, grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: geometry_source = grid_utils.get_grid_geometry(backend, experiment) expected = grid_savepoint.primal_edge_length() @@ -104,7 +104,7 @@ def test_compute_edge_length( def test_compute_inverse_edge_length( backend: gtx_typing.Backend, grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: expected = grid_savepoint.inverse_primal_edge_lengths() geometry_source = grid_utils.get_grid_geometry(backend, experiment) @@ -117,7 +117,7 @@ def test_compute_inverse_edge_length( def test_compute_dual_edge_length( backend: gtx_typing.Backend, grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: grid_geometry = grid_utils.get_grid_geometry(backend, experiment) @@ -130,7 +130,7 @@ def test_compute_dual_edge_length( def test_compute_inverse_dual_edge_length( backend: gtx_typing.Backend, grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: grid_geometry = grid_utils.get_grid_geometry(backend, experiment) expected = grid_savepoint.inv_dual_edge_length() @@ -145,16 +145,16 @@ def test_compute_inverse_dual_edge_length( @pytest.mark.parametrize( "experiment, rtol", [ - (definitions.Experiments.MCH_CH_R04B09, 5e-10), - (definitions.Experiments.EXCLAIM_APE, 1e-12), - (definitions.Experiments.GAUSS3D, 1e-14), + (test_defs.Experiments.MCH_CH_R04B09, 5e-10), + (test_defs.Experiments.EXCLAIM_APE, 1e-12), + (test_defs.Experiments.GAUSS3D, 1e-14), ], ) @pytest.mark.datatest def test_compute_inverse_vertex_vertex_length( backend: gtx_typing.Backend, grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, rtol: float, ) -> None: grid_geometry = grid_utils.get_grid_geometry(backend, experiment) @@ -175,7 +175,7 @@ def test_compute_inverse_vertex_vertex_length( def test_compute_coordinates_of_edge_tangent_and_normal( backend: gtx_typing.Backend, grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: grid_geometry = grid_utils.get_grid_geometry(backend, experiment) x_normal = grid_geometry.get(attrs.EDGE_NORMAL_X) @@ -203,7 +203,7 @@ def test_compute_coordinates_of_edge_tangent_and_normal( def test_compute_primal_normals( backend: gtx_typing.Backend, grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: grid_geometry = grid_utils.get_grid_geometry(backend, experiment) primal_normal_u = grid_geometry.get(attrs.EDGE_NORMAL_U) @@ -224,7 +224,7 @@ def test_compute_primal_normals( def test_tangent_orientation( backend: gtx_typing.Backend, grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: grid_geometry = grid_utils.get_grid_geometry(backend, experiment) result = grid_geometry.get(attrs.TANGENT_ORIENTATION) @@ -237,7 +237,7 @@ def test_tangent_orientation( def test_cell_area( backend: gtx_typing.Backend, grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: grid_geometry = grid_utils.get_grid_geometry(backend, experiment) result = grid_geometry.get(attrs.CELL_AREA) @@ -250,7 +250,7 @@ def test_cell_area( def test_primal_normal_cell( backend: gtx_typing.Backend, grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: grid_geometry = grid_utils.get_grid_geometry(backend, experiment) primal_normal_cell_u_ref = grid_savepoint.primal_normal_cell_x().asnumpy() @@ -270,7 +270,7 @@ def test_primal_normal_cell( def test_dual_normal_cell( backend: gtx_typing.Backend, grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: grid_geometry = grid_utils.get_grid_geometry(backend, experiment) dual_normal_cell_u_ref = grid_savepoint.dual_normal_cell_x().asnumpy() @@ -286,7 +286,7 @@ def test_dual_normal_cell( def test_primal_normal_vert( backend: gtx_typing.Backend, grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: grid_geometry = grid_utils.get_grid_geometry(backend, experiment) primal_normal_vert_u_ref = grid_savepoint.primal_normal_vert_x().asnumpy() @@ -306,7 +306,7 @@ def test_primal_normal_vert( def test_dual_normal_vert( backend: gtx_typing.Backend, grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: grid_geometry = grid_utils.get_grid_geometry(backend, experiment) dual_normal_vert_u_ref = grid_savepoint.dual_normal_vert_x().asnumpy() @@ -322,7 +322,7 @@ def test_dual_normal_vert( def test_cartesian_centers_edge( backend: gtx_typing.Backend, grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: grid_geometry = grid_utils.get_grid_geometry(backend, experiment) grid = grid_geometry.grid @@ -361,7 +361,7 @@ def test_cartesian_centers_edge( def test_cartesian_centers_cell( backend: gtx_typing.Backend, grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: grid_geometry = grid_utils.get_grid_geometry(backend, experiment) grid = grid_geometry.grid @@ -400,7 +400,7 @@ def test_cartesian_centers_cell( def test_vertex( backend: gtx_typing.Backend, grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: grid_geometry = grid_utils.get_grid_geometry(backend, experiment) grid = grid_geometry.grid @@ -452,7 +452,7 @@ def test_sparse_fields_creator() -> None: @pytest.mark.datatest def test_create_auxiliary_orientation_coordinates( - backend: gtx_typing.Backend, experiment: definitions.Experiment + backend: gtx_typing.Backend, experiment: test_defs.ExperimentDescription ) -> None: gm = grid_utils.get_grid_manager_from_identifier( experiment.grid, @@ -517,7 +517,7 @@ def test_create_auxiliary_orientation_coordinates( def test_geometry_mean_fields( backend: gtx_typing.Backend, grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, attr_name: str, ) -> None: assert hasattr(experiment, "name") diff --git a/model/common/tests/common/grid/unit_tests/test_grid_manager.py b/model/common/tests/common/grid/unit_tests/test_grid_manager.py index c809414e77..b5ba4d8449 100644 --- a/model/common/tests/common/grid/unit_tests/test_grid_manager.py +++ b/model/common/tests/common/grid/unit_tests/test_grid_manager.py @@ -29,7 +29,7 @@ vertical as v_grid, ) from icon4py.model.common.utils import data_allocation as data_alloc -from icon4py.model.testing import definitions, definitions as test_defs, grid_utils, test_utils +from icon4py.model.testing import definitions as test_defs, grid_utils, test_utils if typing.TYPE_CHECKING: @@ -70,7 +70,7 @@ @pytest.mark.with_netcdf def test_grid_manager_eval_v2e( grid_savepoint: serialbox.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend, ) -> None: grid = utils.run_grid_manager(experiment.grid, keep_skip_values=True, backend=backend).grid @@ -97,7 +97,7 @@ def test_grid_manager_eval_v2e( @pytest.mark.parametrize("dim", [dims.CellDim, dims.EdgeDim, dims.VertexDim]) def test_grid_manager_refin_ctrl( grid_savepoint: serialbox.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, dim: gtx.Dimension, backend: gtx_typing.Backend, ) -> None: @@ -116,7 +116,7 @@ def test_grid_manager_refin_ctrl( @pytest.mark.with_netcdf def test_grid_manager_eval_v2c( grid_savepoint: serialbox.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend, ) -> None: grid = utils.run_grid_manager(experiment.grid, keep_skip_values=True, backend=backend).grid @@ -171,7 +171,7 @@ def _reset_invalid_index(index_array: np.ndarray) -> None: @pytest.mark.with_netcdf def test_grid_manager_eval_e2v( grid_savepoint: serialbox.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend, ) -> None: grid = utils.run_grid_manager(experiment.grid, keep_skip_values=True, backend=backend).grid @@ -194,7 +194,7 @@ def has_invalid_index(ar: np.ndarray) -> np.bool_: @pytest.mark.with_netcdf def test_grid_manager_eval_e2c( grid_savepoint: serialbox.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend, ) -> None: grid = utils.run_grid_manager(experiment.grid, keep_skip_values=True, backend=backend).grid @@ -211,7 +211,7 @@ def test_grid_manager_eval_e2c( @pytest.mark.with_netcdf def test_grid_manager_eval_c2e( grid_savepoint: serialbox.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend, ) -> None: grid = utils.run_grid_manager(experiment.grid, keep_skip_values=True, backend=backend).grid @@ -231,7 +231,7 @@ def test_grid_manager_eval_c2e( @pytest.mark.with_netcdf def test_grid_manager_eval_c2e2c( grid_savepoint: serialbox.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend, ) -> None: grid = utils.run_grid_manager(experiment.grid, keep_skip_values=True, backend=backend).grid @@ -245,7 +245,7 @@ def test_grid_manager_eval_c2e2c( @pytest.mark.with_netcdf def test_grid_manager_eval_c2e2cO( grid_savepoint: serialbox.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend, ) -> None: grid = utils.run_grid_manager(experiment.grid, keep_skip_values=True, backend=backend).grid @@ -261,7 +261,7 @@ def test_grid_manager_eval_c2e2cO( @pytest.mark.with_netcdf def test_grid_manager_eval_e2c2e( grid_savepoint: serialbox.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend, ) -> None: grid = utils.run_grid_manager(experiment.grid, keep_skip_values=True, backend=backend).grid @@ -286,7 +286,7 @@ def test_grid_manager_eval_e2c2e( @pytest.mark.with_netcdf def test_grid_manager_eval_e2c2v( grid_savepoint: serialbox.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend, ) -> None: grid = utils.run_grid_manager(experiment.grid, keep_skip_values=True, backend=backend).grid @@ -306,7 +306,7 @@ def test_grid_manager_eval_e2c2v( @pytest.mark.with_netcdf def test_grid_manager_eval_c2v( grid_savepoint: serialbox.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend, ) -> None: grid = utils.run_grid_manager(experiment.grid, keep_skip_values=True, backend=backend).grid @@ -315,11 +315,11 @@ def test_grid_manager_eval_c2v( @pytest.mark.parametrize( - "grid_descriptor", [definitions.Grids.R02B04_GLOBAL, definitions.Grids.MCH_CH_R04B09_DSL] + "grid_descriptor", [test_defs.Grids.R02B04_GLOBAL, test_defs.Grids.MCH_CH_R04B09_DSL] ) @pytest.mark.with_netcdf def test_grid_manager_grid_size( - backend: gtx_typing.Backend, grid_descriptor: definitions.GridDescription + backend: gtx_typing.Backend, grid_descriptor: test_defs.GridDescription ) -> None: grid = utils.run_grid_manager(grid_descriptor, keep_skip_values=True, backend=backend).grid assert grid_descriptor.params.num_cells == grid.size[dims.CellDim] @@ -370,12 +370,12 @@ def test_gt4py_transform_offset_by_1_where_valid(size: int) -> None: @pytest.mark.parametrize( "grid_descriptor, global_num_cells", [ - (definitions.Grids.R02B04_GLOBAL, definitions.Grids.R02B04_GLOBAL.params.num_cells), - (definitions.Grids.MCH_CH_R04B09_DSL, MCH_CH_RO4B09_GLOBAL_NUM_CELLS), + (test_defs.Grids.R02B04_GLOBAL, test_defs.Grids.R02B04_GLOBAL.params.num_cells), + (test_defs.Grids.MCH_CH_R04B09_DSL, MCH_CH_RO4B09_GLOBAL_NUM_CELLS), ], ) def test_grid_manager_grid_level_and_root( - grid_descriptor: definitions.GridDescription, global_num_cells: int, backend: gtx_typing.Backend + grid_descriptor: test_defs.GridDescription, global_num_cells: int, backend: gtx_typing.Backend ) -> None: assert ( global_num_cells @@ -389,11 +389,11 @@ def test_grid_manager_grid_level_and_root( @pytest.mark.with_netcdf @pytest.mark.parametrize( "experiment", - [definitions.Experiments.JW], + [test_defs.Experiments.JW], ) def test_grid_manager_eval_c2e2c2e( grid_savepoint: serialbox.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend, ) -> None: grid = utils.run_grid_manager(experiment.grid, keep_skip_values=True, backend=backend).grid @@ -411,7 +411,7 @@ def test_grid_manager_eval_c2e2c2e( @pytest.mark.parametrize("dim", utils.main_horizontal_dims()) def test_grid_manager_start_end_index_compare_with_serialized_data( grid_savepoint: serialbox.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, dim: gtx.Dimension, backend: gtx_typing.Backend, ) -> None: @@ -419,7 +419,7 @@ def test_grid_manager_start_end_index_compare_with_serialized_data( grid = utils.run_grid_manager(experiment.grid, keep_skip_values=True, backend=backend).grid for domain in h_grid.get_domains_for_dim(dim): - if not (experiment == definitions.Experiments.EXCLAIM_APE and domain.dim == dims.EdgeDim): + if not (experiment == test_defs.Experiments.EXCLAIM_APE and domain.dim == dims.EdgeDim): # serialized start indices for EdgeDim are all zero assert grid.start_index(domain) == serialized_grid.start_index( domain @@ -435,7 +435,7 @@ def test_grid_manager_start_end_index_compare_with_serialized_data( @pytest.mark.datatest def test_read_geometry_fields( grid_savepoint: serialbox.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend, ) -> None: manager = utils.run_grid_manager(experiment.grid, keep_skip_values=True, backend=backend) @@ -452,7 +452,7 @@ def test_read_geometry_fields( @pytest.mark.parametrize("dim", (dims.CellDim, dims.EdgeDim, dims.VertexDim)) def test_coordinates( grid_savepoint: serialbox.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, dim: gtx.Dimension, backend: gtx_typing.Backend, ) -> None: @@ -466,7 +466,7 @@ def test_coordinates( @pytest.mark.datatest def test_tangent_orientation( grid_savepoint: serialbox.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend, ) -> None: expected = grid_savepoint.tangent_orientation() @@ -480,7 +480,7 @@ def test_tangent_orientation( @pytest.mark.datatest def test_edge_orientation_on_vertex( grid_savepoint: serialbox.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend, ) -> None: expected = grid_savepoint.vertex_edge_orientation() @@ -494,7 +494,7 @@ def test_edge_orientation_on_vertex( @pytest.mark.datatest def test_dual_area( grid_savepoint: serialbox.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend, ) -> None: expected = grid_savepoint.vertex_dual_area() @@ -507,7 +507,7 @@ def test_dual_area( @pytest.mark.datatest def test_edge_cell_distance( grid_savepoint: serialbox.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend, ) -> None: expected = grid_savepoint.edge_cell_length() @@ -523,7 +523,7 @@ def test_edge_cell_distance( @pytest.mark.datatest def test_cell_normal_orientation( grid_savepoint: serialbox.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend, ) -> None: expected = grid_savepoint.edge_orientation() @@ -537,7 +537,7 @@ def test_cell_normal_orientation( @pytest.mark.datatest def test_edge_vertex_distance( grid_savepoint: serialbox.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend, ) -> None: expected = grid_savepoint.edge_vert_length() @@ -553,11 +553,11 @@ def test_edge_vertex_distance( @pytest.mark.parametrize( "grid_descriptor, expected", [ - (definitions.Grids.MCH_CH_R04B09_DSL, True), - (definitions.Grids.R02B04_GLOBAL, False), + (test_defs.Grids.MCH_CH_R04B09_DSL, True), + (test_defs.Grids.R02B04_GLOBAL, False), ], ) -def test_limited_area_on_grid(grid_descriptor: definitions.GridDescription, expected: bool) -> None: +def test_limited_area_on_grid(grid_descriptor: test_defs.GridDescription, expected: bool) -> None: grid = utils.run_grid_manager(grid_descriptor, keep_skip_values=True, backend=None).grid assert expected == grid.limited_area @@ -566,7 +566,7 @@ def test_limited_area_on_grid(grid_descriptor: definitions.GridDescription, expe @pytest.mark.parametrize("dim", utils.horizontal_dims()) def test_decomposition_info_single_rank( dim: gtx.Dimension, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, grid_savepoint: serialbox.IconGridSavepoint, backend: gtx_typing.Backend, ) -> None: diff --git a/model/common/tests/common/grid/unit_tests/test_gridfile.py b/model/common/tests/common/grid/unit_tests/test_gridfile.py index b003925830..11ddb5c03d 100644 --- a/model/common/tests/common/grid/unit_tests/test_gridfile.py +++ b/model/common/tests/common/grid/unit_tests/test_gridfile.py @@ -15,7 +15,7 @@ from icon4py.model.common import dimension as dims from icon4py.model.common.grid import gridfile -from icon4py.model.testing import definitions, grid_utils as gridtest_utils +from icon4py.model.testing import definitions as test_defs, grid_utils as gridtest_utils from icon4py.model.testing.fixtures import ( backend, data_provider, @@ -32,7 +32,7 @@ @pytest.mark.with_netcdf def test_grid_file_dimension() -> None: - grid_descriptor = definitions.Grids.R02B04_GLOBAL + grid_descriptor = test_defs.Grids.R02B04_GLOBAL global_grid_file = str(gridtest_utils.resolve_full_grid_file_name(grid_descriptor)) parser = gridfile.GridFile(global_grid_file, offset_transformation=gridfile.NoTransformation()) try: @@ -58,7 +58,7 @@ def test_grid_file_dimension() -> None: @pytest.mark.datatest @pytest.mark.with_netcdf def test_grid_file_vertex_cell_edge_dimensions( - experiment: definitions.Experiment, grid_savepoint: serialbox.IconGridSavepoint + experiment: test_defs.ExperimentDescription, grid_savepoint: serialbox.IconGridSavepoint ) -> None: file = gridtest_utils.resolve_full_grid_file_name(experiment.grid) parser = gridfile.GridFile(str(file), gridfile.ToZeroBasedIndexTransformation()) diff --git a/model/common/tests/common/grid/unit_tests/test_icon.py b/model/common/tests/common/grid/unit_tests/test_icon.py index 546b6bfebc..77a7470214 100644 --- a/model/common/tests/common/grid/unit_tests/test_icon.py +++ b/model/common/tests/common/grid/unit_tests/test_icon.py @@ -19,7 +19,7 @@ from icon4py.model.common import constants, dimension as dims, model_backends from icon4py.model.common.grid import base, gridfile, horizontal as h_grid, icon from icon4py.model.common.utils import data_allocation as data_alloc -from icon4py.model.testing import definitions, grid_utils as gridtest_utils +from icon4py.model.testing import definitions as test_defs, grid_utils as gridtest_utils from icon4py.model.testing.fixtures import ( backend, cpu_allocator, @@ -42,15 +42,15 @@ @pytest.fixture(scope="module") -def experiment() -> definitions.Experiment: +def experiment() -> test_defs.ExperimentDescription: """The module uses hard-coded references for the MCH_CH_R04B09 experiment.""" - return definitions.Experiments.MCH_CH_R04B09 + return test_defs.Experiments.MCH_CH_R04B09 @functools.cache def grid_from_limited_area_grid_file() -> icon.IconGrid: return gridtest_utils.get_grid_manager_from_experiment( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, keep_skip_values=True, allocator=model_backends.get_allocator(None), ).grid @@ -180,11 +180,11 @@ def test_grid_size(icon_grid: base_grid.Grid) -> None: @pytest.mark.parametrize( "grid_descriptor", - (definitions.Grids.MCH_CH_R04B09_DSL, definitions.Grids.R02B04_GLOBAL), + (test_defs.Grids.MCH_CH_R04B09_DSL, test_defs.Grids.R02B04_GLOBAL), ) @pytest.mark.parametrize("offset", (utils.horizontal_offsets()), ids=lambda x: x.value) def test_when_keep_skip_value_then_neighbor_table_matches_config( - grid_descriptor: definitions.GridDescription, + grid_descriptor: test_defs.GridDescription, offset: gtx.FieldOffset, backend: gtx_typing.Backend, ) -> None: @@ -204,11 +204,11 @@ def test_when_keep_skip_value_then_neighbor_table_matches_config( @pytest.mark.parametrize( "grid_descriptor", - (definitions.Grids.MCH_CH_R04B09_DSL, definitions.Grids.R02B04_GLOBAL), + (test_defs.Grids.MCH_CH_R04B09_DSL, test_defs.Grids.R02B04_GLOBAL), ) @pytest.mark.parametrize("dim", (utils.local_dims())) def test_when_replace_skip_values_then_only_pentagon_points_remain( - grid_descriptor: definitions.GridDescription, + grid_descriptor: test_defs.GridDescription, dim: gtx.Dimension, backend: gtx_typing.Backend, ) -> None: @@ -351,7 +351,7 @@ def test_grid_shape_fail(geometry_type: base.GeometryType, grid_root: int, grid_ "grid_descriptor, geometry_type, subdivision, radius, domain_length, domain_height, global_num_cells, num_cells, characteristic_length", [ ( - definitions.Grids.R02B04_GLOBAL, + test_defs.Grids.R02B04_GLOBAL, base.GeometryType.ICOSAHEDRON, icon.GridSubdivision(root=2, level=4), constants.EARTH_RADIUS, @@ -362,7 +362,7 @@ def test_grid_shape_fail(geometry_type: base.GeometryType, grid_root: int, grid_ 157817.27689721118, ), ( - definitions.Grids.R02B07_GLOBAL, + test_defs.Grids.R02B07_GLOBAL, base.GeometryType.ICOSAHEDRON, icon.GridSubdivision(root=2, level=7), constants.EARTH_RADIUS, @@ -373,7 +373,7 @@ def test_grid_shape_fail(geometry_type: base.GeometryType, grid_root: int, grid_ 19727.55141796687, ), ( - definitions.Grids.R19_B07_MCH_LOCAL, + test_defs.Grids.R19_B07_MCH_LOCAL, base.GeometryType.ICOSAHEDRON, icon.GridSubdivision(root=19, level=7), constants.EARTH_RADIUS, @@ -384,7 +384,7 @@ def test_grid_shape_fail(geometry_type: base.GeometryType, grid_root: int, grid_ 2029.555708750239, ), ( - definitions.Grids.MCH_OPR_R04B07_DOMAIN01, + test_defs.Grids.MCH_OPR_R04B07_DOMAIN01, base.GeometryType.ICOSAHEDRON, icon.GridSubdivision(root=4, level=7), constants.EARTH_RADIUS, @@ -395,7 +395,7 @@ def test_grid_shape_fail(geometry_type: base.GeometryType, grid_root: int, grid_ 9379.079256436624, ), ( - definitions.Grids.MCH_OPR_R19B08_DOMAIN01, + test_defs.Grids.MCH_OPR_R19B08_DOMAIN01, base.GeometryType.ICOSAHEDRON, icon.GridSubdivision(root=19, level=8), constants.EARTH_RADIUS, @@ -406,7 +406,7 @@ def test_grid_shape_fail(geometry_type: base.GeometryType, grid_root: int, grid_ 1014.8736406119558, ), ( - definitions.Grids.MCH_CH_R04B09_DSL, + test_defs.Grids.MCH_CH_R04B09_DSL, base.GeometryType.ICOSAHEDRON, icon.GridSubdivision(root=4, level=9), constants.EARTH_RADIUS, @@ -417,7 +417,7 @@ def test_grid_shape_fail(geometry_type: base.GeometryType, grid_root: int, grid_ 2501.209495453326, ), ( - definitions.Grids.TORUS_100X116_1000M, + test_defs.Grids.TORUS_100X116_1000M, base.GeometryType.TORUS, None, None, @@ -428,7 +428,7 @@ def test_grid_shape_fail(geometry_type: base.GeometryType, grid_root: int, grid_ 658.0370064762462, ), ( - definitions.Grids.TORUS_50000x5000, + test_defs.Grids.TORUS_50000x5000, base.GeometryType.TORUS, None, None, @@ -441,7 +441,7 @@ def test_grid_shape_fail(geometry_type: base.GeometryType, grid_root: int, grid_ ], ) def test_global_grid_params_from_grid_manager( - grid_descriptor: definitions.GridDescription, + grid_descriptor: test_defs.GridDescription, backend: gtx_typing.Backend, geometry_type: base.GeometryType, subdivision: icon.GridSubdivision, diff --git a/model/common/tests/common/grid/unit_tests/test_topography.py b/model/common/tests/common/grid/unit_tests/test_topography.py index 0ed305d658..96f2ef72f0 100644 --- a/model/common/tests/common/grid/unit_tests/test_topography.py +++ b/model/common/tests/common/grid/unit_tests/test_topography.py @@ -13,7 +13,7 @@ from icon4py.model.common.grid import topography as topo from icon4py.model.common.utils import data_allocation as data_alloc -from icon4py.model.testing import definitions, test_utils +from icon4py.model.testing import test_utils from icon4py.model.testing.fixtures import * # noqa: F403 from ... import utils diff --git a/model/common/tests/common/grid/unit_tests/test_vertical.py b/model/common/tests/common/grid/unit_tests/test_vertical.py index 78bbeef5b5..bc08837f13 100644 --- a/model/common/tests/common/grid/unit_tests/test_vertical.py +++ b/model/common/tests/common/grid/unit_tests/test_vertical.py @@ -17,7 +17,7 @@ from icon4py.model.common import dimension as dims, type_alias as ta from icon4py.model.common.grid import vertical as v_grid from icon4py.model.common.utils import data_allocation as data_alloc, device_utils -from icon4py.model.testing import definitions, test_utils +from icon4py.model.testing import definitions as test_defs, test_utils from icon4py.model.testing.fixtures import ( backend, damping_height, @@ -103,7 +103,7 @@ def test_damping_layer_calculation_from_icon_input( @pytest.mark.datatest def test_grid_size( - experiment: definitions.Experiment, grid_savepoint: sb.IconGridSavepoint + experiment: test_defs.ExperimentDescription, grid_savepoint: sb.IconGridSavepoint ) -> None: config = v_grid.VerticalGridConfig(num_levels=grid_savepoint.num(dims.KDim)) vertical_grid = v_grid.VerticalGrid( @@ -154,7 +154,7 @@ def configure_vertical_grid( @pytest.mark.datatest @pytest.mark.parametrize( "experiment, expected_moist_level", - [(definitions.Experiments.MCH_CH_R04B09, 0), (definitions.Experiments.EXCLAIM_APE, 25)], + [(test_defs.Experiments.MCH_CH_R04B09, 0), (test_defs.Experiments.EXCLAIM_APE, 25)], ) def test_moist_level_calculation( grid_savepoint: sb.IconGridSavepoint, expected_moist_level: int @@ -210,7 +210,7 @@ def test_grid_index_top( @pytest.mark.datatest -@pytest.mark.parametrize("experiment", [definitions.Experiments.EXCLAIM_APE]) +@pytest.mark.parametrize("experiment", [test_defs.Experiments.EXCLAIM_APE]) @pytest.mark.parametrize("dim", [dims.KDim, dims.KHalfDim]) @pytest.mark.parametrize("offset", offsets()) def test_grid_index_damping( @@ -227,7 +227,7 @@ def test_grid_index_damping( @pytest.mark.datatest -@pytest.mark.parametrize("experiment", [definitions.Experiments.EXCLAIM_APE]) +@pytest.mark.parametrize("experiment", [test_defs.Experiments.EXCLAIM_APE]) @pytest.mark.parametrize("dim", [dims.KDim, dims.KHalfDim]) @pytest.mark.parametrize("offset", offsets()) def test_grid_index_moist( @@ -244,7 +244,7 @@ def test_grid_index_moist( @pytest.mark.datatest -@pytest.mark.parametrize("experiment", [definitions.Experiments.EXCLAIM_APE]) +@pytest.mark.parametrize("experiment", [test_defs.Experiments.EXCLAIM_APE]) @pytest.mark.parametrize("dim", [dims.KDim, dims.KHalfDim]) @pytest.mark.parametrize("offset", offsets()) def test_grid_index_flat( @@ -263,13 +263,13 @@ def test_grid_index_flat( @pytest.mark.datatest @pytest.mark.parametrize( "experiment", - [definitions.Experiments.MCH_CH_R04B09, definitions.Experiments.EXCLAIM_APE], + [test_defs.Experiments.MCH_CH_R04B09, test_defs.Experiments.EXCLAIM_APE], ) @pytest.mark.parametrize("dim", [dims.KDim, dims.KHalfDim]) @pytest.mark.parametrize("offset", offsets()) def test_grid_index_bottom( grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, dim: gtx.Dimension, offset: int, ) -> None: @@ -281,13 +281,13 @@ def test_grid_index_bottom( @pytest.mark.datatest -@pytest.mark.parametrize("experiment", [definitions.Experiments.EXCLAIM_APE]) +@pytest.mark.parametrize("experiment", [test_defs.Experiments.EXCLAIM_APE]) @pytest.mark.parametrize("zone", vertical_zones()) @pytest.mark.parametrize("dim", [dims.KDim, dims.KHalfDim]) @pytest.mark.parametrize("offset", offsets()) def test_grid_index_raises_if_index_above_num_levels( grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, zone: v_grid.Zone, dim: gtx.Dimension, offset: int, @@ -301,13 +301,13 @@ def test_grid_index_raises_if_index_above_num_levels( @pytest.mark.datatest -@pytest.mark.parametrize("experiment", [definitions.Experiments.EXCLAIM_APE]) +@pytest.mark.parametrize("experiment", [test_defs.Experiments.EXCLAIM_APE]) @pytest.mark.parametrize("zone", vertical_zones()) @pytest.mark.parametrize("dim", [dims.KDim, dims.KHalfDim]) @pytest.mark.parametrize("offset", offsets()) def test_grid_index_raises_if_index_below_zero( grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, zone: v_grid.Zone, dim: gtx.Dimension, offset: int, @@ -355,9 +355,9 @@ def test_vct_a_vct_b_calculation_from_icon_input( @pytest.mark.parametrize( "experiment", [ - definitions.Experiments.MCH_CH_R04B09, - definitions.Experiments.GAUSS3D, - definitions.Experiments.EXCLAIM_APE, + test_defs.Experiments.MCH_CH_R04B09, + test_defs.Experiments.GAUSS3D, + test_defs.Experiments.EXCLAIM_APE, ], ) def test_compute_vertical_coordinate( @@ -366,7 +366,7 @@ def test_compute_vertical_coordinate( topography_savepoint: sb.TopographySavepoint, interpolation_savepoint: sb.InterpolationSavepoint, icon_grid: base_grid.Grid, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, model_top_height: float, backend: gtx_typing.Backend, ) -> None: @@ -377,7 +377,7 @@ def test_compute_vertical_coordinate( specific_values = ( {"rayleigh_damping_height": 12500.0, "stretch_factor": 0.65, "lowest_layer_thickness": 20.0} - if experiment == definitions.Experiments.MCH_CH_R04B09 + if experiment == test_defs.Experiments.MCH_CH_R04B09 else { "rayleigh_damping_height": 45000.0, "stretch_factor": 1.0, @@ -401,9 +401,9 @@ def test_compute_vertical_coordinate( assert vertical_geometry.nflatlev == grid_savepoint.nflatlev() topography = None - if experiment in (definitions.Experiments.MCH_CH_R04B09, definitions.Experiments.GAUSS3D): + if experiment in (test_defs.Experiments.MCH_CH_R04B09, test_defs.Experiments.GAUSS3D): topography = topography_savepoint.topo_c() - elif experiment == definitions.Experiments.EXCLAIM_APE: + elif experiment == test_defs.Experiments.EXCLAIM_APE: topography = data_alloc.zero_field( icon_grid, dims.CellDim, allocator=backend, dtype=ta.wpfloat ) diff --git a/model/common/tests/common/grid/utils.py b/model/common/tests/common/grid/utils.py index a36bcfa610..f584b454c4 100644 --- a/model/common/tests/common/grid/utils.py +++ b/model/common/tests/common/grid/utils.py @@ -16,7 +16,7 @@ from icon4py.model.common import dimension as dims, model_backends from icon4py.model.common.grid import grid_manager as gm, horizontal as h_grid from icon4py.model.common.utils import data_allocation as data_alloc -from icon4py.model.testing import definitions, grid_utils as gridtest_utils +from icon4py.model.testing import definitions as test_defs, grid_utils as gridtest_utils managers: dict[str, gm.GridManager] = {} @@ -74,7 +74,7 @@ def _domain(dim: gtx.Dimension, zones: Iterator[h_grid.Zone]) -> Iterator[h_grid def run_grid_manager( - grid: definitions.GridDescription, + grid: test_defs.GridDescription, keep_skip_values: bool, backend: gtx_typing.Backend | None, ) -> gm.GridManager: @@ -95,19 +95,19 @@ def run_grid_manager( GRID_REFERENCE_VALUES = { - definitions.Experiments.EXCLAIM_APE.name: { + test_defs.Experiments.EXCLAIM_APE.name: { "mean_edge_length": 240221.1036647776, "mean_dual_edge_length": 138710.63736114913, "mean_cell_area": 24906292887.251026, "mean_dual_area": 49802858653.68937, }, - definitions.Experiments.MCH_CH_R04B09.name: { + test_defs.Experiments.MCH_CH_R04B09.name: { "mean_edge_length": 3803.019140934253, "mean_dual_edge_length": 2180.911493355989, "mean_cell_area": 6256048.940145881, "mean_dual_area": 12259814.063180268, }, - definitions.Experiments.GAUSS3D.name: { + test_defs.Experiments.GAUSS3D.name: { "mean_edge_length": 757.5757575757576, "mean_dual_edge_length": 437.3865675678984, "mean_cell_area": 248515.09520903317, diff --git a/model/common/tests/common/interpolation/mpi_tests/test_parallel_interpolation.py b/model/common/tests/common/interpolation/mpi_tests/test_parallel_interpolation.py index 57f0d4a040..7bb1b8ef18 100644 --- a/model/common/tests/common/interpolation/mpi_tests/test_parallel_interpolation.py +++ b/model/common/tests/common/interpolation/mpi_tests/test_parallel_interpolation.py @@ -68,7 +68,7 @@ def test_distributed_interpolation_with_custom_tolerance( backend: gtx_typing.Backend, interpolation_savepoint: sb.InterpolationSavepoint, grid_savepoint: sb.IconGridSavepoint, - experiment: test_defs.Experiment, + experiment: test_defs.ExperimentDescription, processor_props: decomposition.ProcessProperties, decomposition_info: decomposition.DecompositionInfo, interpolation_factory_from_savepoint: interpolation_factory.InterpolationFieldsFactory, @@ -107,7 +107,7 @@ def test_distributed_interpolation_fields( backend: gtx_typing.Backend, interpolation_savepoint: sb.InterpolationSavepoint, grid_savepoint: sb.IconGridSavepoint, - experiment: test_defs.Experiment, + experiment: test_defs.ExperimentDescription, processor_props: decomposition.ProcessProperties, decomposition_info: decomposition.DecompositionInfo, interpolation_factory_from_savepoint: interpolation_factory.InterpolationFieldsFactory, @@ -130,7 +130,7 @@ def test_distributed_interpolation_grg( backend: gtx_typing.Backend, interpolation_savepoint: sb.InterpolationSavepoint, grid_savepoint: sb.IconGridSavepoint, - experiment: test_defs.Experiment, + experiment: test_defs.ExperimentDescription, processor_props: decomposition.ProcessProperties, decomposition_info: decomposition.DecompositionInfo, interpolation_factory_from_savepoint: interpolation_factory.InterpolationFieldsFactory, @@ -164,7 +164,7 @@ def test_distributed_interpolation_geofac_rot( backend: gtx_typing.Backend, interpolation_savepoint: sb.InterpolationSavepoint, grid_savepoint: sb.IconGridSavepoint, - experiment: test_defs.Experiment, + experiment: test_defs.ExperimentDescription, processor_props: decomposition.ProcessProperties, decomposition_info: decomposition.DecompositionInfo, interpolation_factory_from_savepoint: interpolation_factory.InterpolationFieldsFactory, @@ -200,7 +200,7 @@ def test_distributed_interpolation_rbf( backend: gtx_typing.Backend, interpolation_savepoint: sb.InterpolationSavepoint, grid_savepoint: sb.IconGridSavepoint, - experiment: test_defs.Experiment, + experiment: test_defs.ExperimentDescription, processor_props: decomposition.ProcessProperties, decomposition_info: decomposition.DecompositionInfo, interpolation_factory_from_savepoint: interpolation_factory.InterpolationFieldsFactory, @@ -226,7 +226,7 @@ def test_distributed_interpolation_lsq_pseudoinv( backend: gtx_typing.Backend, interpolation_savepoint: sb.InterpolationSavepoint, grid_savepoint: sb.IconGridSavepoint, - experiment: test_defs.Experiment, + experiment: test_defs.ExperimentDescription, processor_props: decomposition.ProcessProperties, decomposition_info: decomposition.DecompositionInfo, interpolation_factory_from_savepoint: interpolation_factory.InterpolationFieldsFactory, diff --git a/model/common/tests/common/interpolation/unit_tests/test_interpolation_factory.py b/model/common/tests/common/interpolation/unit_tests/test_interpolation_factory.py index 020a1bddce..3a1f325527 100644 --- a/model/common/tests/common/interpolation/unit_tests/test_interpolation_factory.py +++ b/model/common/tests/common/interpolation/unit_tests/test_interpolation_factory.py @@ -28,7 +28,7 @@ from icon4py.model.common.utils import data_allocation as data_alloc from icon4py.model.testing import ( datatest_utils as dt_utils, - definitions, + definitions as test_defs, grid_utils as gridtest_utils, test_utils as test_helpers, ) @@ -64,7 +64,7 @@ def _get_interpolation_factory( backend: gtx_typing.Backend | None, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, ) -> interpolation_factory.InterpolationFieldsFactory: registry_key = "_".join((experiment.name, data_alloc.backend_name(backend))) factory = interpolation_factories.get(registry_key) @@ -84,7 +84,7 @@ def _get_interpolation_factory( @pytest.mark.datatest def test_factory_raises_error_on_unknown_field( - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend | None, decomposition_info: decomposition.DecompositionInfo, ) -> None: @@ -105,7 +105,7 @@ def test_factory_raises_error_on_unknown_field( @pytest.mark.datatest def test_get_c_lin_e( interpolation_savepoint: serialbox.InterpolationSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend | None, ) -> None: field_ref = interpolation_savepoint.c_lin_e() @@ -120,7 +120,7 @@ def test_get_c_lin_e( @pytest.mark.datatest def test_get_geofac_div( interpolation_savepoint: serialbox.InterpolationSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend | None, ) -> None: field_ref = interpolation_savepoint.geofac_div() @@ -134,7 +134,7 @@ def test_get_geofac_div( @pytest.mark.datatest def test_get_geofac_grdiv( interpolation_savepoint: serialbox.InterpolationSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend | None, ) -> None: field_ref = interpolation_savepoint.geofac_grdiv() @@ -148,7 +148,7 @@ def test_get_geofac_grdiv( @pytest.mark.datatest def test_get_geofac_rot( interpolation_savepoint: serialbox.InterpolationSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend | None, ) -> None: field_ref = interpolation_savepoint.geofac_rot() @@ -166,7 +166,7 @@ def test_get_geofac_rot( @pytest.mark.datatest def test_get_geofac_n2s( interpolation_savepoint: serialbox.InterpolationSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend | None, ) -> None: field_ref = interpolation_savepoint.geofac_n2s() @@ -181,7 +181,7 @@ def test_get_geofac_n2s( @pytest.mark.datatest def test_get_geofac_grg( interpolation_savepoint: serialbox.InterpolationSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend | None, ) -> None: field_ref = interpolation_savepoint.geofac_grg() @@ -200,7 +200,7 @@ def test_get_geofac_grg( @pytest.mark.datatest def test_get_mass_conserving_cell_average_weight( interpolation_savepoint: serialbox.InterpolationSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend | None, ) -> None: field_ref = interpolation_savepoint.c_bln_avg() @@ -216,7 +216,7 @@ def test_get_mass_conserving_cell_average_weight( @pytest.mark.datatest def test_e_flx_avg( interpolation_savepoint: serialbox.InterpolationSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend | None, ) -> None: field_ref = interpolation_savepoint.e_flx_avg() @@ -231,15 +231,15 @@ def test_e_flx_avg( @pytest.mark.parametrize( "experiment, rtol", [ - (definitions.Experiments.MCH_CH_R04B09, 1e-10), - (definitions.Experiments.EXCLAIM_APE, 1e-11), - (definitions.Experiments.GAUSS3D, 0), + (test_defs.Experiments.MCH_CH_R04B09, 1e-10), + (test_defs.Experiments.EXCLAIM_APE, 1e-11), + (test_defs.Experiments.GAUSS3D, 0), ], ) @pytest.mark.datatest def test_e_bln_c_s( interpolation_savepoint: serialbox.InterpolationSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend | None, rtol: float, ) -> None: @@ -255,7 +255,7 @@ def test_e_bln_c_s( @pytest.mark.datatest def test_pos_on_tplane_e_x_y( interpolation_savepoint: serialbox.InterpolationSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend | None, ) -> None: field_ref_1 = interpolation_savepoint.pos_on_tplane_e_x() @@ -271,7 +271,7 @@ def test_pos_on_tplane_e_x_y( @pytest.mark.datatest def test_cells_aw_verts( interpolation_savepoint: serialbox.InterpolationSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend | None, ) -> None: field_ref = interpolation_savepoint.c_intp() @@ -287,7 +287,7 @@ def test_cells_aw_verts( @pytest.mark.datatest def test_nudgecoeffs( interpolation_savepoint: serialbox.InterpolationSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend | None, ) -> None: field_ref = interpolation_savepoint.nudgecoeff_e() @@ -301,7 +301,7 @@ def test_nudgecoeffs( @pytest.mark.datatest def test_rbf_interpolation_coeffs_cell( interpolation_savepoint: serialbox.InterpolationSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend | None, ) -> None: field_ref_c1 = interpolation_savepoint.rbf_vec_coeff_c1() @@ -330,7 +330,7 @@ def test_rbf_interpolation_coeffs_cell( @pytest.mark.datatest def test_rbf_interpolation_coeffs_edge( interpolation_savepoint: serialbox.InterpolationSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend | None, ) -> None: field_ref_e = interpolation_savepoint.rbf_vec_coeff_e() @@ -351,7 +351,7 @@ def test_rbf_interpolation_coeffs_edge( @pytest.mark.datatest def test_rbf_interpolation_coeffs_vertex( interpolation_savepoint: serialbox.InterpolationSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend | None, ) -> None: field_ref_v1 = interpolation_savepoint.rbf_vec_coeff_v1() diff --git a/model/common/tests/common/interpolation/unit_tests/test_interpolation_fields.py b/model/common/tests/common/interpolation/unit_tests/test_interpolation_fields.py index e33277a4bb..6cb2d13d41 100644 --- a/model/common/tests/common/interpolation/unit_tests/test_interpolation_fields.py +++ b/model/common/tests/common/interpolation/unit_tests/test_interpolation_fields.py @@ -32,7 +32,7 @@ compute_pos_on_tplane_e_x_y_torus, ) from icon4py.model.common.utils import data_allocation as data_alloc -from icon4py.model.testing import definitions, serialbox as sb +from icon4py.model.testing import definitions as test_defs, serialbox as sb from icon4py.model.testing.fixtures.datatest import ( backend, data_provider, @@ -92,7 +92,7 @@ def test_compute_c_lin_e( @pytest.mark.embedded_only @pytest.mark.datatest def test_compute_geofac_div( - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, grid_savepoint: sb.IconGridSavepoint, interpolation_savepoint: sb.InterpolationSavepoint, icon_grid: base_grid.Grid, @@ -117,7 +117,7 @@ def test_compute_geofac_div( @pytest.mark.embedded_only @pytest.mark.datatest def test_compute_geofac_rot( - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, grid_savepoint: sb.IconGridSavepoint, interpolation_savepoint: sb.InterpolationSavepoint, icon_grid: base_grid.Grid, diff --git a/model/common/tests/common/interpolation/unit_tests/test_rbf_interpolation.py b/model/common/tests/common/interpolation/unit_tests/test_rbf_interpolation.py index c6bfb0000b..d1e63572b7 100644 --- a/model/common/tests/common/interpolation/unit_tests/test_rbf_interpolation.py +++ b/model/common/tests/common/interpolation/unit_tests/test_rbf_interpolation.py @@ -19,7 +19,7 @@ from icon4py.model.common.interpolation import rbf_interpolation as rbf from icon4py.model.common.utils import data_allocation as data_alloc from icon4py.model.testing import ( - definitions, + definitions as test_defs, grid_utils as gridtest_utils, test_utils as test_helpers, ) @@ -44,19 +44,19 @@ RBF_TOLERANCES = { dims.CellDim: { - definitions.Experiments.EXCLAIM_APE.name: 3.1e-9, - definitions.Experiments.MCH_CH_R04B09.name: 4e-2, - definitions.Experiments.GAUSS3D.name: 1e-14, + test_defs.Experiments.EXCLAIM_APE.name: 3.1e-9, + test_defs.Experiments.MCH_CH_R04B09.name: 4e-2, + test_defs.Experiments.GAUSS3D.name: 1e-14, }, dims.EdgeDim: { - definitions.Experiments.EXCLAIM_APE.name: 8e-14, - definitions.Experiments.MCH_CH_R04B09.name: 2e-9, - definitions.Experiments.GAUSS3D.name: 0, + test_defs.Experiments.EXCLAIM_APE.name: 8e-14, + test_defs.Experiments.MCH_CH_R04B09.name: 2e-9, + test_defs.Experiments.GAUSS3D.name: 0, }, dims.VertexDim: { - definitions.Experiments.EXCLAIM_APE.name: 3e-10, - definitions.Experiments.MCH_CH_R04B09.name: 3e-3, - definitions.Experiments.GAUSS3D.name: 1e-15, + test_defs.Experiments.EXCLAIM_APE.name: 3e-10, + test_defs.Experiments.MCH_CH_R04B09.name: 3e-3, + test_defs.Experiments.GAUSS3D.name: 1e-15, }, } @@ -64,7 +64,7 @@ @pytest.mark.level("unit") @pytest.mark.datatest def test_construct_rbf_matrix_offsets_tables_for_cells( - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, grid_savepoint: serialbox.IconGridSavepoint, backend: gtx_typing.Backend | None, ) -> None: @@ -96,7 +96,7 @@ def test_construct_rbf_matrix_offsets_tables_for_cells( @pytest.mark.level("unit") @pytest.mark.datatest def test_construct_rbf_matrix_offsets_tables_for_edges( - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, grid_savepoint: serialbox.IconGridSavepoint, backend: gtx_typing.Backend | None, ) -> None: @@ -126,7 +126,7 @@ def test_construct_rbf_matrix_offsets_tables_for_edges( @pytest.mark.level("unit") @pytest.mark.datatest def test_construct_rbf_matrix_offsets_tables_for_vertices( - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, grid_savepoint: serialbox.IconGridSavepoint, backend: gtx_typing.Backend | None, ) -> None: @@ -163,7 +163,7 @@ def test_rbf_interpolation_coeffs_cell( grid_savepoint: serialbox.IconGridSavepoint, interpolation_savepoint: serialbox.IconGridSavepoint, backend: gtx_typing.Backend | None, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: geometry = gridtest_utils.get_grid_geometry(backend, experiment) grid = geometry.grid @@ -240,7 +240,7 @@ def test_rbf_interpolation_coeffs_vertex( grid_savepoint: serialbox.IconGridSavepoint, interpolation_savepoint: serialbox.IconGridSavepoint, backend: gtx_typing.Backend | None, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: geometry = gridtest_utils.get_grid_geometry(backend, experiment) grid = geometry.grid @@ -317,7 +317,7 @@ def test_rbf_interpolation_coeffs_edge( grid_savepoint: serialbox.IconGridSavepoint, interpolation_savepoint: serialbox.IconGridSavepoint, backend: gtx_typing.Backend | None, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: geometry = gridtest_utils.get_grid_geometry(backend, experiment) grid = geometry.grid diff --git a/model/common/tests/common/io/unit_tests/test_io.py b/model/common/tests/common/io/unit_tests/test_io.py index d228ba336c..a31d389b31 100644 --- a/model/common/tests/common/io/unit_tests/test_io.py +++ b/model/common/tests/common/io/unit_tests/test_io.py @@ -30,7 +30,7 @@ to_delta, ) from icon4py.model.common.states import data -from icon4py.model.testing import datatest_utils, definitions, grid_utils +from icon4py.model.testing import datatest_utils, definitions as test_defs, grid_utils from ...fixtures import test_path from .. import utils as test_io_utils @@ -146,7 +146,7 @@ def test_io_monitor_write_ugrid_file(test_path): def test_io_monitor_write_and_read_ugrid_dataset(test_path, variables): path_name = test_path.absolute().as_posix() + "/output" grid = grid_utils.get_grid_manager_from_experiment( - definitions.Experiments.EXCLAIM_APE, keep_skip_values=True, allocator=backend + test_defs.Experiments.EXCLAIM_APE, keep_skip_values=True, allocator=backend ).grid vertical_config = v_grid.VerticalGridConfig(num_levels=grid.num_levels) vertical_params = v_grid.VerticalGrid( @@ -198,7 +198,7 @@ def test_io_monitor_write_and_read_ugrid_dataset(test_path, variables): def test_fieldgroup_monitor_write_dataset_file_roll(test_path): grid = grid_utils.get_grid_manager_from_experiment( - definitions.Experiments.EXCLAIM_APE, True, backend + test_defs.Experiments.EXCLAIM_APE, True, backend ).grid vertical_config = v_grid.VerticalGridConfig(num_levels=grid.num_levels) vertical_params = v_grid.VerticalGrid( diff --git a/model/common/tests/common/io/unit_tests/test_ugrid.py b/model/common/tests/common/io/unit_tests/test_ugrid.py index d6e100ac24..6aef644247 100644 --- a/model/common/tests/common/io/unit_tests/test_ugrid.py +++ b/model/common/tests/common/io/unit_tests/test_ugrid.py @@ -17,19 +17,19 @@ extract_horizontal_coordinates, load_data_file, ) -from icon4py.model.testing import datatest_utils, definitions, grid_utils +from icon4py.model.testing import datatest_utils, definitions as test_defs, grid_utils from ...fixtures import test_path def grid_files(): grids = [ - definitions.Grids.R02B04_GLOBAL, - definitions.Grids.MCH_CH_R04B09_DSL, + test_defs.Grids.R02B04_GLOBAL, + test_defs.Grids.MCH_CH_R04B09_DSL, ] for grid in grids: - yield definitions.grids_path().joinpath(grid.name).joinpath(grid.file_name) + yield test_defs.grids_path().joinpath(grid.name).joinpath(grid.file_name) @pytest.mark.parametrize("file", grid_files()) diff --git a/model/common/tests/common/io/utils.py b/model/common/tests/common/io/utils.py index 00fcfb3b55..e7f8a3fcf3 100644 --- a/model/common/tests/common/io/utils.py +++ b/model/common/tests/common/io/utils.py @@ -14,7 +14,7 @@ from icon4py.model.common.io import utils from icon4py.model.common.states import data from icon4py.model.common.utils import data_allocation as data_alloc -from icon4py.model.testing import definitions, grid_utils +from icon4py.model.testing import definitions as test_defs, grid_utils # setting backend to fieldview embedded here. @@ -22,11 +22,11 @@ UNLIMITED = None simple_grid = simple.simple_grid() -grid_file = definitions.grids_path().joinpath( - definitions.Grids.R02B04_GLOBAL.name, definitions.Grids.R02B04_GLOBAL.file_name +grid_file = test_defs.grids_path().joinpath( + test_defs.Grids.R02B04_GLOBAL.name, test_defs.Grids.R02B04_GLOBAL.file_name ) global_grid = grid_utils.get_grid_manager_from_experiment( - definitions.Experiments.EXCLAIM_APE, keep_skip_values=True, allocator=backend + test_defs.Experiments.EXCLAIM_APE, keep_skip_values=True, allocator=backend ).grid diff --git a/model/common/tests/common/metrics/mpi_tests/test_parallel_metrics.py b/model/common/tests/common/metrics/mpi_tests/test_parallel_metrics.py index b5f6f5ddf5..3dba6848be 100644 --- a/model/common/tests/common/metrics/mpi_tests/test_parallel_metrics.py +++ b/model/common/tests/common/metrics/mpi_tests/test_parallel_metrics.py @@ -69,7 +69,7 @@ def test_distributed_metrics_attrs( metrics_factory_from_savepoint: metrics_factory.MetricsFieldsFactory, attrs_name: str, metrics_name: str, - experiment: test_defs.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: if test_utils.is_embedded(backend) and metrics_name == "ddqz_z_half": pytest.xfail("Embedded backend does not support concat_where") @@ -121,7 +121,7 @@ def test_distributed_metrics_attrs_no_halo( metrics_factory_from_savepoint: metrics_factory.MetricsFieldsFactory, attrs_name: str, metrics_name: str, - experiment: test_defs.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: parallel_helpers.check_comm_size(processor_props) parallel_helpers.log_process_properties(processor_props) @@ -153,7 +153,7 @@ def test_distributed_metrics_attrs_no_halo_regional( metrics_factory_from_savepoint: metrics_factory.MetricsFieldsFactory, attrs_name: str, metrics_name: str, - experiment: test_defs.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: if test_utils.is_embedded(backend): # https://github.com/GridTools/gt4py/issues/1583 @@ -180,7 +180,7 @@ def test_distributed_metrics_wgtfacq_e( processor_props: decomposition.ProcessProperties, decomposition_info: decomposition.DecompositionInfo, metrics_factory_from_savepoint: metrics_factory.MetricsFieldsFactory, - experiment: test_defs.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: parallel_helpers.check_comm_size(processor_props) parallel_helpers.log_process_properties(processor_props) @@ -201,7 +201,7 @@ def test_distributed_metrics_nflat_gradp( processor_props: decomposition.ProcessProperties, decomposition_info: decomposition.DecompositionInfo, metrics_factory_from_savepoint: metrics_factory.MetricsFieldsFactory, - experiment: test_defs.Experiment, + experiment: test_defs.ExperimentDescription, ) -> None: parallel_helpers.check_comm_size(processor_props) parallel_helpers.log_process_properties(processor_props) diff --git a/model/common/tests/common/metrics/unit_tests/test_compute_diffusion_metrics.py b/model/common/tests/common/metrics/unit_tests/test_compute_diffusion_metrics.py index c176edc7d6..6c3ebc13a0 100644 --- a/model/common/tests/common/metrics/unit_tests/test_compute_diffusion_metrics.py +++ b/model/common/tests/common/metrics/unit_tests/test_compute_diffusion_metrics.py @@ -24,12 +24,13 @@ compute_weighted_cell_neighbor_sum, ) from icon4py.model.common.utils import data_allocation as data_alloc -from icon4py.model.testing import definitions, test_utils +from icon4py.model.testing import definitions as test_defs, test_utils from icon4py.model.testing.fixtures.datatest import ( backend, data_provider, download_ser_data, experiment, + experiment_config, grid_savepoint, icon_grid, interpolation_savepoint, @@ -50,7 +51,8 @@ @pytest.mark.datatest def test_compute_diffusion_mask_and_coeff( metrics_savepoint: sb.MetricSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, interpolation_savepoint: sb.InterpolationSavepoint, icon_grid: base_grid.Grid, grid_savepoint: sb.IconGridSavepoint, @@ -65,9 +67,8 @@ def test_compute_diffusion_mask_and_coeff( c2e2c = icon_grid.get_connectivity(dims.C2E2C).asnumpy() c_bln_avg = interpolation_savepoint.c_bln_avg() z_mc = metrics_savepoint.z_mc() - (_, _, _, _, _, _, _, _, thslp_zdiffu, thhgtd_zdiffu) = definitions.construct_metrics_config( - experiment - ) + thslp_zdiffu = experiment_config.metrics.thslp_zdiffu + thhgtd_zdiffu = experiment_config.metrics.thhgtd_zdiffu cell_nudging = icon_grid.start_index(h_grid.domain(dims.CellDim)(h_grid.Zone.NUDGING)) cell_lateral = icon_grid.start_index( @@ -133,7 +134,8 @@ def test_compute_diffusion_mask_and_coeff( @pytest.mark.datatest def test_compute_diffusion_intcoef_and_vertoffset( metrics_savepoint: sb.MetricSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, interpolation_savepoint: sb.InterpolationSavepoint, icon_grid: base_grid.Grid, grid_savepoint: sb.IconGridSavepoint, @@ -148,9 +150,8 @@ def test_compute_diffusion_intcoef_and_vertoffset( c2e2c = icon_grid.get_connectivity(dims.C2E2C).asnumpy() c_bln_avg = interpolation_savepoint.c_bln_avg() z_mc = metrics_savepoint.z_mc() - (_, _, _, _, _, _, _, _, thslp_zdiffu, thhgtd_zdiffu) = definitions.construct_metrics_config( - experiment - ) + thslp_zdiffu = experiment_config.metrics.thslp_zdiffu + thhgtd_zdiffu = experiment_config.metrics.thhgtd_zdiffu cell_nudging = icon_grid.start_index(h_grid.domain(dims.CellDim)(h_grid.Zone.NUDGING)) cell_lateral = icon_grid.start_index( diff --git a/model/common/tests/common/metrics/unit_tests/test_compute_zdiff_gradp_dsl.py b/model/common/tests/common/metrics/unit_tests/test_compute_zdiff_gradp_dsl.py index 1c19a7ae09..c462d40c40 100644 --- a/model/common/tests/common/metrics/unit_tests/test_compute_zdiff_gradp_dsl.py +++ b/model/common/tests/common/metrics/unit_tests/test_compute_zdiff_gradp_dsl.py @@ -17,7 +17,7 @@ from icon4py.model.common.metrics.compute_zdiff_gradp_dsl import compute_zdiff_gradp_dsl from icon4py.model.common.metrics.metric_fields import compute_flat_max_idx from icon4py.model.common.utils import data_allocation as data_alloc -from icon4py.model.testing import definitions, test_utils +from icon4py.model.testing import test_utils from icon4py.model.testing.fixtures.datatest import ( backend, data_provider, diff --git a/model/common/tests/common/metrics/unit_tests/test_metric_fields.py b/model/common/tests/common/metrics/unit_tests/test_metric_fields.py index 9caf3fa81c..bf178ea85e 100644 --- a/model/common/tests/common/metrics/unit_tests/test_metric_fields.py +++ b/model/common/tests/common/metrics/unit_tests/test_metric_fields.py @@ -17,13 +17,13 @@ from icon4py.model.common.grid import grid_refinement as refinement, horizontal from icon4py.model.common.metrics import metric_fields as mf from icon4py.model.common.utils import data_allocation as data_alloc -from icon4py.model.testing import definitions, test_utils as testing_helpers -from icon4py.model.testing.definitions import construct_metrics_config +from icon4py.model.testing import definitions as test_defs, test_utils as testing_helpers from icon4py.model.testing.fixtures.datatest import ( backend, data_provider, download_ser_data, experiment, + experiment_config, grid_savepoint, icon_grid, interpolation_savepoint, @@ -137,7 +137,8 @@ def test_compute_scaling_factor_for_3d_divdamp( @pytest.mark.datatest def test_compute_rayleigh_w( icon_grid: base_grid.Grid, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, metrics_savepoint: sb.MetricSavepoint, grid_savepoint: sb.IconGridSavepoint, backend: gtx_typing.Backend, @@ -147,18 +148,9 @@ def test_compute_rayleigh_w( rayleigh_w_full = data_alloc.zero_field( icon_grid, dims.KDim, extend={dims.KDim: 1}, allocator=backend ) - ( - _, - _, - _, - damping_height, - rayleigh_coeff, - _, - _, - rayleigh_type, - _, - _, - ) = construct_metrics_config(experiment) + damping_height = experiment_config.vertical_grid.rayleigh_damping_height + rayleigh_coeff = experiment_config.metrics.rayleigh_coeff + rayleigh_type = experiment_config.metrics.rayleigh_type mf.compute_rayleigh_w.with_backend(backend=backend)( rayleigh_w=rayleigh_w_full, vct_a=grid_savepoint.vct_a(), @@ -238,14 +230,14 @@ def test_compute_exner_exfac( grid_savepoint: sb.IconGridSavepoint, icon_grid: base_grid.Grid, metrics_savepoint: sb.MetricSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend, ) -> None: horizontal_start = icon_grid.start_index(cell_domain(horizontal.Zone.LATERAL_BOUNDARY_LEVEL_2)) match experiment: - case definitions.Experiments.MCH_CH_R04B09: + case test_defs.Experiments.MCH_CH_R04B09: exner_expol = 0.333 - case definitions.Experiments.WEISMAN_KLEMP_TORUS: + case test_defs.Experiments.WEISMAN_KLEMP_TORUS: exner_expol = 0.333 case _: exner_expol = 1.0 / 3.0 @@ -288,7 +280,7 @@ def test_compute_exner_w_implicit_weight_parameter( grid_savepoint: sb.IconGridSavepoint, metrics_savepoint: sb.MetricSavepoint, interpolation_savepoint: sb.InterpolationSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend, ) -> None: z_ifc = metrics_savepoint.z_ifc() @@ -346,9 +338,9 @@ def test_compute_exner_w_implicit_weight_parameter( vwind_impl_wgt_ref = metrics_savepoint.vwind_impl_wgt() dual_edge_length = grid_savepoint.dual_edge_length() match experiment: - case definitions.Experiments.MCH_CH_R04B09: + case test_defs.Experiments.MCH_CH_R04B09: vwind_offctr = 0.2 - case definitions.Experiments.WEISMAN_KLEMP_TORUS: + case test_defs.Experiments.WEISMAN_KLEMP_TORUS: vwind_offctr = 0.2 case _: vwind_offctr = 0.15 diff --git a/model/common/tests/common/metrics/unit_tests/test_metrics_factory.py b/model/common/tests/common/metrics/unit_tests/test_metrics_factory.py index 516f7d2d5a..2cfac9ebf9 100644 --- a/model/common/tests/common/metrics/unit_tests/test_metrics_factory.py +++ b/model/common/tests/common/metrics/unit_tests/test_metrics_factory.py @@ -20,17 +20,17 @@ from icon4py.model.common.metrics import metrics_attributes as attrs, metrics_factory from icon4py.model.common.utils import data_allocation as data_alloc from icon4py.model.testing import ( - definitions, + definitions as test_defs, grid_utils as gridtest_utils, serialbox, test_utils as test_helpers, ) -from icon4py.model.testing.definitions import construct_metrics_config from icon4py.model.testing.fixtures.datatest import ( backend, data_provider, download_ser_data, experiment, + experiment_config, grid_savepoint, icon_grid, metrics_savepoint, @@ -44,7 +44,8 @@ def _get_metrics_factory( backend: gtx_typing.Backend | None, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, grid_savepoint: serialbox.IconGridSavepoint, topography_savepoint: serialbox.TopographySavepoint, exchange: decomposition.ExchangeRuntime = decomposition.single_node_default, @@ -56,26 +57,7 @@ def _get_metrics_factory( if not factory: geometry = gridtest_utils.get_grid_geometry(backend, experiment) - ( - lowest_layer_thickness, - model_top_height, - stretch_factor, - damping_height, - rayleigh_coeff, - exner_expol, - vwind_offctr, - rayleigh_type, - thslp_zdiffu, - thhgtd_zdiffu, - ) = construct_metrics_config(experiment) - - vertical_config = v_grid.VerticalGridConfig( - geometry.grid.num_levels, - lowest_layer_thickness=lowest_layer_thickness, - model_top_height=model_top_height, - stretch_factor=stretch_factor, - rayleigh_damping_height=damping_height, - ) + vertical_config = experiment_config.vertical_grid vertical_grid = v_grid.VerticalGrid( vertical_config, grid_savepoint.vct_a(), grid_savepoint.vct_b() ) @@ -96,12 +78,7 @@ def _get_metrics_factory( interpolation_source=interpolation_field_source, backend=backend, metadata=attrs.attrs, - rayleigh_type=rayleigh_type, - rayleigh_coeff=rayleigh_coeff, - exner_expol=exner_expol, - vwind_offctr=vwind_offctr, - thslp_zdiffu=thslp_zdiffu, - thhgtd_zdiffu=thhgtd_zdiffu, + metrics_config=experiment_config.metrics, exchange=exchange, ) metrics_factories[registry_name] = factory @@ -113,13 +90,15 @@ def _get_metrics_factory( def test_factory_nflat_gradp( grid_savepoint: serialbox.IconGridSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: value_ref = grid_savepoint.nflat_gradp() factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -133,13 +112,15 @@ def test_factory_z_mc( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: field_ref = metrics_savepoint.z_mc() factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -153,7 +134,8 @@ def test_factory_ddqz_z_and_inverse( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: inverse_field_ref = metrics_savepoint.inv_ddqz_z_full() @@ -161,6 +143,7 @@ def test_factory_ddqz_z_and_inverse( factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -175,13 +158,15 @@ def test_factory_ddqz_full_e( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: field_ref = metrics_savepoint.ddqz_z_full_e().asnumpy() factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -196,13 +181,15 @@ def test_factory_ddqz_z_half( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: field_ref = metrics_savepoint.ddqz_z_half() factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -216,13 +203,15 @@ def test_factory_scaling_factor_for_3d_divdamp( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: field_ref = metrics_savepoint.scalfac_dd3d() factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -236,13 +225,15 @@ def test_factory_rayleigh_w( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: field_ref = metrics_savepoint.rayleigh_w() factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -256,7 +247,8 @@ def test_factory_coeffs_dwdz( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: field_ref_1 = metrics_savepoint.coeff1_dwdz() @@ -264,6 +256,7 @@ def test_factory_coeffs_dwdz( factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -279,7 +272,8 @@ def test_factory_ref_mc( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: field_ref_1 = metrics_savepoint.theta_ref_mc() @@ -287,6 +281,7 @@ def test_factory_ref_mc( factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -302,7 +297,8 @@ def test_factory_d2dexdz2_facs_mc( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: field_ref_1 = metrics_savepoint.d2dexdz2_fac1_mc() @@ -310,6 +306,7 @@ def test_factory_d2dexdz2_facs_mc( factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -324,13 +321,15 @@ def test_factory_ddxn_z_full( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: field_ref = metrics_savepoint.ddxn_z_full() factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -344,13 +343,15 @@ def test_factory_ddxt_z_full( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: field_ref = metrics_savepoint.ddxt_z_full().asnumpy() factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -365,13 +366,15 @@ def test_factory_exner_w_implicit_weight_parameter( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: field_ref = metrics_savepoint.vwind_impl_wgt() factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -385,13 +388,15 @@ def test_factory_exner_w_explicit_weight_parameter( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: field_ref = metrics_savepoint.vwind_expl_wgt() factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -406,13 +411,15 @@ def test_factory_exner_exfac( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: field_ref = metrics_savepoint.exner_exfac() factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -427,13 +434,15 @@ def test_factory_pressure_gradient_fields( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: field_1_ref = metrics_savepoint.pg_exdist_dsl() factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -446,13 +455,15 @@ def test_factory_mask_prog_halo_c( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: field_ref = metrics_savepoint.mask_prog_halo_c() factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -466,13 +477,15 @@ def test_factory_horizontal_mask_for_3d_divdamp( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: field_ref = metrics_savepoint.hmask_dd3d() factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -488,7 +501,8 @@ def test_factory_zdiff_gradp( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: zdiff_gradp_ref = metrics_savepoint.zdiff_gradp() @@ -496,6 +510,7 @@ def test_factory_zdiff_gradp( factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -515,13 +530,15 @@ def test_factory_coeff_gradekin( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: field_ref = metrics_savepoint.coeff_gradekin() factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -535,12 +552,14 @@ def test_factory_wgtfacq_e( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -558,12 +577,14 @@ def test_vertical_coordinates_on_half_levels( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -579,12 +600,14 @@ def test_compute_wgtfac_c( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -600,13 +623,15 @@ def test_factory_compute_diffusion_mask_and_coef( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: field_ref = metrics_savepoint.zd_diffcoef() factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) @@ -622,7 +647,8 @@ def test_factory_compute_diffusion_intcoeff_and_vertoffset( grid_savepoint: serialbox.IconGridSavepoint, metrics_savepoint: serialbox.MetricSavepoint, topography_savepoint: serialbox.TopographySavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, + experiment_config: test_defs.ExperimentConfig, backend: gtx_typing.Backend | None, ) -> None: field_ref_1 = metrics_savepoint.zd_intcoef() @@ -630,6 +656,7 @@ def test_factory_compute_diffusion_intcoeff_and_vertoffset( factory = _get_metrics_factory( backend=backend, experiment=experiment, + experiment_config=experiment_config, grid_savepoint=grid_savepoint, topography_savepoint=topography_savepoint, ) diff --git a/model/common/tests/common/states/unit_tests/test_factory.py b/model/common/tests/common/states/unit_tests/test_factory.py index 12067e9818..aa41dd2503 100644 --- a/model/common/tests/common/states/unit_tests/test_factory.py +++ b/model/common/tests/common/states/unit_tests/test_factory.py @@ -21,7 +21,7 @@ from icon4py.model.common.math import helpers as math_helpers from icon4py.model.common.states import factory, model, utils as state_utils from icon4py.model.common.utils import data_allocation as data_alloc -from icon4py.model.testing import definitions, serialbox +from icon4py.model.testing import definitions as test_defs, serialbox from icon4py.model.testing.fixtures.datatest import ( backend, data_provider, @@ -132,7 +132,7 @@ def cell_coordinate_source( def height_coordinate_source( metrics_savepoint: sb.MetricSavepoint, grid_savepoint: sb.IconGridSavepoint, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend, ) -> Generator[SimpleFieldSource, None, None]: grid = grid_savepoint.construct_icon_grid(backend=backend) diff --git a/model/common/tests/common/topography/test_jablonowski_williamson_topography.py b/model/common/tests/common/topography/test_jablonowski_williamson_topography.py index 86bc5c3282..bf4b778d26 100644 --- a/model/common/tests/common/topography/test_jablonowski_williamson_topography.py +++ b/model/common/tests/common/topography/test_jablonowski_williamson_topography.py @@ -15,7 +15,7 @@ from icon4py.model.common import dimension as dims from icon4py.model.common.initialization import topography from icon4py.model.common.utils import data_allocation as data_alloc -from icon4py.model.testing import definitions, test_utils +from icon4py.model.testing import definitions as test_defs, test_utils from ..fixtures import * # noqa: F403 @@ -28,9 +28,9 @@ @pytest.mark.datatest @pytest.mark.embedded_remap_error -@pytest.mark.parametrize("experiment", [definitions.Experiments.JW]) +@pytest.mark.parametrize("experiment", [test_defs.Experiments.JW]) def test_jablonowski_williamson_topography( - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, backend: gtx_typing.Backend | None, grid_savepoint: sb.IconGridSavepoint, topography_savepoint: sb.TopographySavepoint, diff --git a/model/driver/src/icon4py/model/driver/icon4py_configuration.py b/model/driver/src/icon4py/model/driver/icon4py_configuration.py index cec879df8b..a11a321e68 100644 --- a/model/driver/src/icon4py/model/driver/icon4py_configuration.py +++ b/model/driver/src/icon4py/model/driver/icon4py_configuration.py @@ -16,6 +16,7 @@ from icon4py.model.atmosphere.dycore import dycore_states, solve_nonhydro as solve_nh from icon4py.model.common import model_backends from icon4py.model.common.grid import vertical as v_grid +from icon4py.model.common.metrics import metrics_factory from icon4py.model.driver import initialization_utils as driver_init @@ -55,6 +56,11 @@ class Icon4pyConfig: vertical_grid_config: v_grid.VerticalGridConfig diffusion_config: diffusion.DiffusionConfig solve_nonhydro_config: solve_nh.NonHydrostaticConfig + metrics_config: metrics_factory.MetricsConfig = dataclasses.field( + default_factory=lambda: metrics_factory.MetricsConfig( + exner_expol=0.333, vwind_offctr=0.2, thslp_zdiffu=0.02, thhgtd_zdiffu=125.0 + ) + ) def read_config( @@ -122,7 +128,6 @@ def _jabw_nonhydro_config(): # original igradp_method is 2 # original divdamp_order is 4 fourth_order_divdamp_factor=0.0025, - rayleigh_coeff=0.1, ) def _mch_ch_r04b09_config(): diff --git a/model/driver/src/icon4py/model/driver/icon4py_driver.py b/model/driver/src/icon4py/model/driver/icon4py_driver.py index 2d7d8a69bd..cd6ec003a5 100644 --- a/model/driver/src/icon4py/model/driver/icon4py_driver.py +++ b/model/driver/src/icon4py/model/driver/icon4py_driver.py @@ -448,6 +448,7 @@ def initialize( edge_geometry=edge_geometry, cell_geometry=cell_geometry, owner_mask=c_owner_mask, + metrics_config=config.metrics_config, ) ( diff --git a/model/driver/tests/driver/integration_tests/test_gauss3d.py b/model/driver/tests/driver/integration_tests/test_gauss3d.py index 443edb8c86..29f758f780 100644 --- a/model/driver/tests/driver/integration_tests/test_gauss3d.py +++ b/model/driver/tests/driver/integration_tests/test_gauss3d.py @@ -13,7 +13,7 @@ from icon4py.model.common.decomposition import definitions as decomposition from icon4py.model.driver.testcases import gauss3d -from icon4py.model.testing import datatest_utils as dt_utils, definitions, test_utils +from icon4py.model.testing import datatest_utils as dt_utils, definitions as test_defs, test_utils from icon4py.model.testing.fixtures.datatest import backend from ..fixtures import * # noqa: F403 @@ -32,11 +32,11 @@ @pytest.mark.parametrize( "experiment, rank", [ - (definitions.Experiments.GAUSS3D, 0), + (test_defs.Experiments.GAUSS3D, 0), ], ) def test_gauss3d_initial_condition( - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, processor_props: decomposition.ProcessProperties, backend: gtx_typing.Backend, rank: int, diff --git a/model/driver/tests/driver/integration_tests/test_icon4py.py b/model/driver/tests/driver/integration_tests/test_icon4py.py index d5c6572884..80f5188e57 100644 --- a/model/driver/tests/driver/integration_tests/test_icon4py.py +++ b/model/driver/tests/driver/integration_tests/test_icon4py.py @@ -17,6 +17,7 @@ from icon4py.model.atmosphere.dycore import dycore_states, solve_nonhydro as solve_nh from icon4py.model.common import dimension as dims, model_backends from icon4py.model.common.grid import vertical as v_grid +from icon4py.model.common.metrics import metrics_factory from icon4py.model.common.states import prognostic_state as prognostics from icon4py.model.common.utils import data_allocation as data_alloc from icon4py.model.driver import ( @@ -24,7 +25,12 @@ icon4py_driver, initialization_utils as driver_init, ) -from icon4py.model.testing import datatest_utils as dt_utils, definitions, grid_utils, test_utils +from icon4py.model.testing import ( + datatest_utils as dt_utils, + definitions as test_defs, + grid_utils, + test_utils, +) from icon4py.model.testing.fixtures.datatest import backend, backend_like from ..fixtures import * # noqa: F403 @@ -44,7 +50,7 @@ "experiment, istep_init, istep_exit, substep_init, substep_exit, timeloop_date_init, timeloop_date_exit, step_date_init, step_date_exit, timeloop_diffusion_linit_init, timeloop_diffusion_linit_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, 1, 2, 1, @@ -57,7 +63,7 @@ False, ), ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, 1, 2, 1, @@ -70,7 +76,7 @@ False, ), ( - definitions.Experiments.GAUSS3D, + test_defs.Experiments.GAUSS3D, 1, 2, 1, @@ -98,7 +104,7 @@ ], ) def test_run_timeloop_single_step( - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, timeloop_date_init: str, timeloop_date_exit: str, timeloop_diffusion_linit_init: bool, @@ -119,10 +125,10 @@ def test_run_timeloop_single_step( savepoint_nonhydro_exit: sb.IconNonHydroExitSavepoint, backend: gtx_typing.Backend, ): - if experiment in (definitions.Experiments.GAUSS3D, definitions.Experiments.JW): + if experiment in (test_defs.Experiments.GAUSS3D, test_defs.Experiments.JW): experiment_type = ( driver_init.ExperimentType.GAUSS3D - if experiment == definitions.Experiments.GAUSS3D + if experiment == test_defs.Experiments.GAUSS3D else driver_init.ExperimentType.JABW ) config = icon4py_configuration.read_config( @@ -134,10 +140,10 @@ def test_run_timeloop_single_step( icon4pyrun_config = config.run_config else: - diffusion_config = definitions.construct_diffusion_config( + diffusion_config = test_defs.construct_diffusion_config( experiment, ndyn_substeps=ndyn_substeps ) - nonhydro_config = definitions.construct_nonhydrostatic_config(experiment) + nonhydro_config = test_defs.construct_nonhydrostatic_config(experiment) icon4pyrun_config = construct_icon4pyrun_config( experiment, timeloop_date_init, @@ -267,6 +273,9 @@ def test_run_timeloop_single_step( cell_geometry=cell_geometry, owner_mask=grid_savepoint.c_owner_mask(), backend=backend, + metrics_config=metrics_factory.MetricsConfig( + exner_expol=0.333, vwind_offctr=0.2, thslp_zdiffu=0.02, thhgtd_zdiffu=125.0 + ), ) diffusion_diagnostic_state = diffusion_states.DiffusionDiagnosticState( @@ -395,7 +404,7 @@ def test_run_timeloop_single_step( "experiment, experiment_type", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, driver_init.ExperimentType.ANY.value, ), ], diff --git a/model/driver/tests/driver/integration_tests/test_jablonowski_williamson.py b/model/driver/tests/driver/integration_tests/test_jablonowski_williamson.py index 1a9b11519e..66c3b363d5 100644 --- a/model/driver/tests/driver/integration_tests/test_jablonowski_williamson.py +++ b/model/driver/tests/driver/integration_tests/test_jablonowski_williamson.py @@ -15,7 +15,7 @@ from icon4py.model.common.decomposition import definitions as decomposition from icon4py.model.common.utils import data_allocation as data_alloc from icon4py.model.driver.testcases import jablonowski_williamson as jabw -from icon4py.model.testing import datatest_utils as dt_utils, definitions, test_utils +from icon4py.model.testing import datatest_utils as dt_utils, definitions as test_defs, test_utils from icon4py.model.testing.fixtures.datatest import backend from ..fixtures import * # noqa: F403 @@ -31,9 +31,9 @@ @pytest.mark.datatest -@pytest.mark.parametrize("experiment, rank", [(definitions.Experiments.JW, 0)]) +@pytest.mark.parametrize("experiment, rank", [(test_defs.Experiments.JW, 0)]) def test_jabw_initial_condition( - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, processor_props: decomposition.ProcessProperties, backend: gtx_typing.Backend, rank: int, diff --git a/model/driver/tests/driver/utils.py b/model/driver/tests/driver/utils.py index ffd0b9dbad..9317c40fb0 100644 --- a/model/driver/tests/driver/utils.py +++ b/model/driver/tests/driver/utils.py @@ -11,7 +11,7 @@ import gt4py.next.typing as gtx_typing from icon4py.model.driver import icon4py_configuration as driver_config -from icon4py.model.testing import definitions +from icon4py.model.testing import definitions as test_defs def mch_ch_r04b09_dsl_icon4pyrun_config( @@ -63,18 +63,18 @@ def exclaim_ape_icon4pyrun_config( def construct_icon4pyrun_config( - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, date_init: str, date_exit: str, diffusion_linit_init: bool, backend: gtx_typing.Backend, ndyn_substeps: int = 5, ): - if experiment == definitions.Experiments.MCH_CH_R04B09: + if experiment == test_defs.Experiments.MCH_CH_R04B09: return mch_ch_r04b09_dsl_icon4pyrun_config( date_init, date_exit, diffusion_linit_init, backend, ndyn_substeps ) - elif experiment == definitions.Experiments.EXCLAIM_APE: + elif experiment == test_defs.Experiments.EXCLAIM_APE: return exclaim_ape_icon4pyrun_config( date_init, date_exit, diffusion_linit_init, backend, ndyn_substeps ) diff --git a/model/standalone_driver/src/icon4py/model/standalone_driver/driver_utils.py b/model/standalone_driver/src/icon4py/model/standalone_driver/driver_utils.py index edcdd6b032..21a9b562c3 100644 --- a/model/standalone_driver/src/icon4py/model/standalone_driver/driver_utils.py +++ b/model/standalone_driver/src/icon4py/model/standalone_driver/driver_utils.py @@ -118,6 +118,7 @@ def create_static_field_factories( vertical_grid: v_grid.VerticalGrid, cell_topography: fa.CellField[ta.wpfloat], backend: gtx_typing.Backend | None, + metrics_config: metrics_factory.MetricsConfig | None = None, ) -> driver_states.StaticFieldFactories: geometry_field_source = grid_geometry.GridGeometry( grid=grid_manager.grid, @@ -145,12 +146,7 @@ def create_static_field_factories( interpolation_source=interpolation_field_source, backend=backend, metadata=metrics_attributes.attrs, - rayleigh_type=constants.RayleighType.KLEMP, - rayleigh_coeff=0.1, - exner_expol=1.0 / 3.0, - vwind_offctr=0.15, - thslp_zdiffu=0.025, - thhgtd_zdiffu=200.0, + metrics_config=metrics_config, ) return driver_states.StaticFieldFactories( @@ -161,6 +157,7 @@ def create_static_field_factories( def initialize_granules( grid: icon_grid.IconGrid, vertical_grid: v_grid.VerticalGrid, + metrics_config: metrics_factory.MetricsConfig, diffusion_config: diffusion.DiffusionConfig, solve_nh_config: solve_nh.NonHydrostaticConfig, advection_config: advection.AdvectionConfig, @@ -344,6 +341,7 @@ def initialize_granules( edge_geometry=edge_geometry, cell_geometry=cell_geometry, owner_mask=owner_mask, + metrics_config=metrics_config, ) advection_granule = advection.convert_config_to_advection( diff --git a/model/standalone_driver/src/icon4py/model/standalone_driver/standalone_driver.py b/model/standalone_driver/src/icon4py/model/standalone_driver/standalone_driver.py index 276be59f83..e7718fadbe 100644 --- a/model/standalone_driver/src/icon4py/model/standalone_driver/standalone_driver.py +++ b/model/standalone_driver/src/icon4py/model/standalone_driver/standalone_driver.py @@ -26,7 +26,7 @@ from icon4py.model.common.grid import geometry_attributes as geom_attr, vertical as v_grid from icon4py.model.common.grid.icon import IconGrid from icon4py.model.common.initialization import topography -from icon4py.model.common.metrics import metrics_attributes as metrics_attr +from icon4py.model.common.metrics import metrics_attributes as metrics_attr, metrics_factory from icon4py.model.common.states import prognostic_state as prognostics from icon4py.model.common.utils import data_allocation as data_alloc, device_utils from icon4py.model.standalone_driver import ( @@ -492,6 +492,7 @@ def _read_config( diffusion.DiffusionConfig, advection.AdvectionConfig, solve_nh.NonHydrostaticConfig, + metrics_factory.MetricsConfig, ]: vertical_grid_config = v_grid.VerticalGridConfig( num_levels=35, @@ -523,7 +524,15 @@ def _read_config( ) nonhydro_config = solve_nh.NonHydrostaticConfig( - fourth_order_divdamp_factor=0.0025, rayleigh_coeff=0.1 + fourth_order_divdamp_factor=0.0025, + ) + + metrics_config = metrics_factory.MetricsConfig( + exner_expol=1.0 / 3.0, + vwind_offctr=0.15, + thslp_zdiffu=0.025, + thhgtd_zdiffu=200.0, + rayleigh_coeff=0.1, ) profiling_stats = driver_config.ProfilingStats() if enable_profiling else None @@ -546,6 +555,7 @@ def _read_config( diffusion_config, advection_config, nonhydro_config, + metrics_config, ) @@ -599,11 +609,16 @@ def initialize_driver( allocator = model_backends.get_allocator(backend) log.info("Initializing the driver") - driver_config, vertical_grid_config, diffusion_config, advection_config, solve_nh_config = ( - _read_config( - output_path=output_path, - enable_profiling=False, - ) + ( + driver_config, + vertical_grid_config, + diffusion_config, + advection_config, + solve_nh_config, + metrics_config, + ) = _read_config( + output_path=output_path, + enable_profiling=False, ) log.info(f"initializing the grid manager from '{grid_file_path}'") @@ -642,6 +657,7 @@ def initialize_driver( vertical_grid=vertical_grid, cell_topography=gtx.as_field((dims.CellDim,), data=cell_topography, allocator=allocator), # type: ignore[arg-type] # due to array_ns opacity backend=backend, + metrics_config=metrics_config, ) log.info("initializing granules") @@ -663,6 +679,7 @@ def initialize_driver( allocator=allocator, ), backend=backend, + metrics_config=metrics_config, ) icon4py_driver = Icon4pyDriver( config=driver_config, diff --git a/model/standalone_driver/tests/standalone_driver/integration_tests/test_standalone_driver.py b/model/standalone_driver/tests/standalone_driver/integration_tests/test_standalone_driver.py index e3617291a2..db97251a86 100644 --- a/model/standalone_driver/tests/standalone_driver/integration_tests/test_standalone_driver.py +++ b/model/standalone_driver/tests/standalone_driver/integration_tests/test_standalone_driver.py @@ -9,11 +9,10 @@ import pytest -from icon4py.model.common import model_backends, model_options -from icon4py.model.common.utils import data_allocation as data_alloc -from icon4py.model.standalone_driver import driver_utils, main -from icon4py.model.testing import definitions, grid_utils, serialbox as sb, test_utils -from icon4py.model.testing.fixtures.datatest import backend, backend_like +from icon4py.model.common import model_backends +from icon4py.model.standalone_driver import main +from icon4py.model.testing import definitions as test_defs, grid_utils, serialbox as sb, test_utils +from icon4py.model.testing.fixtures.datatest import backend_like from ..fixtures import * # noqa: F403 @@ -24,7 +23,7 @@ "experiment, istep_exit, substep_exit, timeloop_date_init, timeloop_date_exit, step_date_exit, timeloop_diffusion_linit_init, timeloop_diffusion_linit_exit", [ ( - definitions.Experiments.JW, + test_defs.Experiments.JW, 2, 5, "2008-09-01T00:00:00.000", @@ -36,7 +35,7 @@ ], ) def test_standalone_driver( - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, timeloop_date_init: str, timeloop_date_exit: str, timeloop_diffusion_linit_init: bool, diff --git a/model/testing/src/icon4py/model/testing/datatest_utils.py b/model/testing/src/icon4py/model/testing/datatest_utils.py index b8741cbaa1..bd2d52498b 100644 --- a/model/testing/src/icon4py/model/testing/datatest_utils.py +++ b/model/testing/src/icon4py/model/testing/datatest_utils.py @@ -8,13 +8,15 @@ from __future__ import annotations +import functools +import json import pathlib import urllib.parse import gt4py.next.typing as gtx_typing from icon4py.model.common.decomposition import definitions as decomposition -from icon4py.model.testing import definitions, serialbox +from icon4py.model.testing import definitions as test_defs, serialbox def get_processor_properties_for_run( @@ -23,19 +25,19 @@ def get_processor_properties_for_run( return decomposition.get_processor_properties(run_instance) -def get_experiment_name_with_version(experiment: definitions.Experiment) -> str: +def get_experiment_name_with_version(experiment: test_defs.ExperimentDescription) -> str: """Generate experiment name with version suffix.""" return f"{experiment.name}_v{experiment.version:02d}" def get_ranked_experiment_name_with_version( - experiment: definitions.Experiment, comm_size: int + experiment: test_defs.ExperimentDescription, comm_size: int ) -> str: """Generate ranked experiment name with version suffix.""" return f"mpitask{comm_size}_{get_experiment_name_with_version(experiment)}" -def get_experiment_archive_filename(experiment: definitions.Experiment, comm_size: int) -> str: +def get_experiment_archive_filename(experiment: test_defs.ExperimentDescription, comm_size: int) -> str: """Generate ranked archive filename for an experiment.""" return f"{get_ranked_experiment_name_with_version(experiment, comm_size)}.tar.gz" @@ -46,7 +48,7 @@ def get_serialized_data_url(root_url: str, filepath: str) -> str: def get_datapath_for_experiment( - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, processor_props: decomposition.ProcessProperties, ) -> pathlib.Path: """Get the path to serialized data for an experiment.""" @@ -55,8 +57,8 @@ def get_datapath_for_experiment( experiment, processor_props.comm_size, ) - return definitions.serialized_data_path().joinpath( - experiment_dir, definitions.SERIALIZED_DATA_SUBDIR + return test_defs.serialized_data_path().joinpath( + experiment_dir, test_defs.SERIALIZED_DATA_SUBDIR ) @@ -72,3 +74,259 @@ def create_icon_serial_data_provider( mpi_rank=rank, do_print=True, ) + + +@functools.cache +def _read_namelist_json(json_file_path: pathlib.Path) -> dict: + """ + Read and cache the namelist JSON file. + + Args: + json_file_path: Path to the NAMELIST_ICON_output_atm.json file + + Returns: + Dictionary containing the parsed JSON data + """ + with json_file_path.open() as f: + return json.load(f) + + +def create_experiment_configuration( + experiment: test_defs.ExperimentDescription, + processor_props: decomposition.ProcessProperties, +) -> test_defs.ExperimentConfig: + """ + Create configuration objects from the experiment's namelist JSON file. + + This function reads the NAMELIST_ICON_output_atm.json file that comes with + the serialized experiment data and constructs configuration objects for: + - DriverConfig + - VerticalGridConfig + - NonHydrostaticConfig + - DiffusionConfig + + The JSON file is cached so it's only read once per unique path. + + Args: + experiment: The experiment definition + processor_props: Processor properties containing comm_size + + Returns: + Tuple of (DriverConfig, VerticalGridConfig, NonHydrostaticConfig, DiffusionConfig) + """ + from icon4py.model.atmosphere.diffusion import diffusion + from icon4py.model.atmosphere.dycore import dycore_states, solve_nonhydro as solve_nh + from icon4py.model.common.constants import RayleighType + from icon4py.model.common.grid import vertical as v_grid + from icon4py.model.common.metrics import metrics_factory + from icon4py.model.standalone_driver import config as driver_config + + experiment_dir = get_ranked_experiment_name_with_version( + experiment, + processor_props.comm_size, + ) + json_file_path = ( + test_defs.serialized_data_path() + / experiment_dir + / f"{test_defs.NAMELIST_ICON_FNAME}.json" + ) + + nml_data = _read_namelist_json(json_file_path) + + sleve_nml = nml_data["sleve_nml"] + nonhydrostatic_nml = nml_data["nonhydrostatic_nml"] + diffusion_nml = nml_data["diffusion_nml"] + run_nml = nml_data["run_nml"] + + # Create VerticalGridConfig + vertical_grid_config = v_grid.VerticalGridConfig( + num_levels=experiment.num_levels, + lowest_layer_thickness=sleve_nml["min_lay_thckn"], + model_top_height=sleve_nml["top_height"], + maximal_layer_thickness=sleve_nml["max_lay_thckn"], + top_height_limit_for_maximal_layer_thickness=sleve_nml["htop_thcknlimit"], + flat_height=sleve_nml["flat_height"], + stretch_factor=sleve_nml["stretch_fac"], + rayleigh_damping_height=( + nonhydrostatic_nml["damp_height"][0] + if isinstance(nonhydrostatic_nml["damp_height"], list) + else nonhydrostatic_nml["damp_height"] + ), + ) + + # Create NonHydrostaticConfig + # Map divdamp_order from JSON to enum + divdamp_order_value = nonhydrostatic_nml["divdamp_order"] + divdamp_order_map = { + 4: dycore_states.DivergenceDampingOrder.FOURTH_ORDER, + 24: dycore_states.DivergenceDampingOrder.COMBINED, + } + divdamp_order = divdamp_order_map[divdamp_order_value] + + # Map divdamp_type from JSON to enum + divdamp_type_value = nonhydrostatic_nml["divdamp_type"] + divdamp_type_map = { + 3: dycore_states.DivergenceDampingType.THREE_DIMENSIONAL, + 32: dycore_states.DivergenceDampingType.COMBINED, + } + divdamp_type = divdamp_type_map[divdamp_type_value] + + # Map itime_scheme from JSON to enum + itime_scheme_value = nonhydrostatic_nml["itime_scheme"] + itime_scheme_map = { + 4: dycore_states.TimeSteppingScheme.MOST_EFFICIENT, + 5: dycore_states.TimeSteppingScheme.STABLE, + 6: dycore_states.TimeSteppingScheme.EXPENSIVE, + } + itime_scheme = itime_scheme_map[itime_scheme_value] + + # Map iadv_rhotheta from JSON to enum + iadv_rhotheta_value = nonhydrostatic_nml["iadv_rhotheta"] + iadv_rhotheta_map = { + 2: dycore_states.RhoThetaAdvectionType.MIURA, + } + iadv_rhotheta = iadv_rhotheta_map[iadv_rhotheta_value] + + # Map igradp_method from JSON to enum + igradp_method_value = nonhydrostatic_nml["igradp_method"] + igradp_method_map = { + 1: dycore_states.HorizontalPressureDiscretizationType.CONVENTIONAL, + 2: dycore_states.HorizontalPressureDiscretizationType.TAYLOR, + 3: dycore_states.HorizontalPressureDiscretizationType.TAYLOR_HYDRO, + 4: dycore_states.HorizontalPressureDiscretizationType.POLYNOMIAL, + 5: dycore_states.HorizontalPressureDiscretizationType.POLYNOMIAL_HYDRO, + } + igradp_method = igradp_method_map[igradp_method_value] + + # Map rayleigh_type from JSON to enum + rayleigh_type_value = nonhydrostatic_nml["rayleigh_type"] + rayleigh_type_map = { + 2: RayleighType.KLEMP, + } + rayleigh_type = rayleigh_type_map[rayleigh_type_value] + + rayleigh_coeff = nonhydrostatic_nml["rayleigh_coeff"] + if isinstance(rayleigh_coeff, list): + rayleigh_coeff = rayleigh_coeff[0] + + nonhydro_config = solve_nh.NonHydrostaticConfig( + itime_scheme=itime_scheme, # type: ignore[arg-type] + iadv_rhotheta=iadv_rhotheta, # type: ignore[arg-type] + igradp_method=igradp_method, # type: ignore[arg-type] + divdamp_order=divdamp_order, # type: ignore[arg-type] + divdamp_type=divdamp_type, + rhotheta_offctr=nonhydrostatic_nml["rhotheta_offctr"], + veladv_offctr=nonhydrostatic_nml["veladv_offctr"], + fourth_order_divdamp_factor=nonhydrostatic_nml["divdamp_fac"], + fourth_order_divdamp_factor2=nonhydrostatic_nml["divdamp_fac2"], + fourth_order_divdamp_factor3=nonhydrostatic_nml["divdamp_fac3"], + fourth_order_divdamp_factor4=nonhydrostatic_nml["divdamp_fac4"], + fourth_order_divdamp_z=nonhydrostatic_nml["divdamp_z"], + fourth_order_divdamp_z2=nonhydrostatic_nml["divdamp_z2"], + fourth_order_divdamp_z3=nonhydrostatic_nml["divdamp_z3"], + fourth_order_divdamp_z4=nonhydrostatic_nml["divdamp_z4"], + ) + + # Create DiffusionConfig + # Map diffusion_type from hdiff_order + hdiff_order_value = diffusion_nml["hdiff_order"] + diffusion_type_map = { + -1: diffusion.DiffusionType.NO_DIFFUSION, + 2: diffusion.DiffusionType.LINEAR_2ND_ORDER, + 3: diffusion.DiffusionType.SMAGORINSKY_NO_BACKGROUND, + 4: diffusion.DiffusionType.LINEAR_4TH_ORDER, + 5: diffusion.DiffusionType.SMAGORINSKY_4TH_ORDER, + } + diffusion_type = diffusion_type_map[hdiff_order_value] + + # Map type_vn_diffu from itype_vn_diffu + type_vn_diffu_value = diffusion_nml["itype_vn_diffu"] + type_vn_diffu_map = { + 1: diffusion.SmagorinskyStencilType.DIAMOND_VERTICES, + 2: diffusion.SmagorinskyStencilType.CELLS_AND_VERTICES, + } + type_vn_diffu = type_vn_diffu_map[type_vn_diffu_value] + + # Map type_t_diffu from itype_t_diffu + type_t_diffu_value = diffusion_nml["itype_t_diffu"] + type_t_diffu_map = { + 1: diffusion.TemperatureDiscretizationType.HOMOGENEOUS, + 2: diffusion.TemperatureDiscretizationType.HETEROGENEOUS, + } + type_t_diffu = type_t_diffu_map[type_t_diffu_value] + + # Extract hdiff_smag_w (can be a list or single value) + lhdiff_smag_w = diffusion_nml["lhdiff_smag_w"] + hdiff_smag_w = lhdiff_smag_w[0] if isinstance(lhdiff_smag_w, list) else lhdiff_smag_w + + # Extract lsmag_3d (can be a list or single value) + lsmag_3d = diffusion_nml["lsmag_3d"] + smag_3d = lsmag_3d[0] if isinstance(lsmag_3d, list) else lsmag_3d + + # Get ndyn_substeps from either nonhydrostatic_nml or run_nml + ndyn_substeps = nonhydrostatic_nml["ndyn_substeps"] + + diffusion_config = diffusion.DiffusionConfig( + diffusion_type=diffusion_type, # type: ignore[arg-type] + hdiff_w=diffusion_nml["lhdiff_w"], + hdiff_vn=diffusion_nml["lhdiff_vn"], + hdiff_temp=diffusion_nml["lhdiff_temp"], + hdiff_smag_w=hdiff_smag_w, + type_vn_diffu=type_vn_diffu, # type: ignore[arg-type] + smag_3d=smag_3d, + type_t_diffu=type_t_diffu, # type: ignore[arg-type] + hdiff_efdt_ratio=diffusion_nml["hdiff_efdt_ratio"], + hdiff_w_efdt_ratio=diffusion_nml["hdiff_w_efdt_ratio"], + smagorinski_scaling_factor=diffusion_nml["hdiff_smag_fac"], + n_substeps=ndyn_substeps, + zdiffu_t=nonhydrostatic_nml["l_zdiffu_t"], + ) + + # Create DriverConfig (using defaults for now, as these are not in the JSON) + # TODO(jcanton): Extract these from the JSON when available + import datetime + + driver_cfg = driver_config.DriverConfig( + experiment_name=experiment.name, + output_path=pathlib.Path(), # Placeholder + profiling_stats=None, + dtime=datetime.timedelta(seconds=run_nml["dtime"]), + start_date=datetime.datetime(1, 1, 1, 0, 0, 0), # Placeholder + end_date=datetime.datetime(1, 1, 1, 1, 0, 0), # Placeholder + apply_extra_second_order_divdamp=nonhydrostatic_nml["lextra_diffu"], + vertical_cfl_threshold=nonhydrostatic_nml["vcfl_threshold"], + ndyn_substeps=ndyn_substeps, + enable_statistics_output=False, + ) + + # Extract metrics-related parameters not in any config class + exner_expol = nonhydrostatic_nml["exner_expol"] + if isinstance(exner_expol, list): + exner_expol = exner_expol[0] + + vwind_offctr = nonhydrostatic_nml["vwind_offctr"] + if isinstance(vwind_offctr, list): + vwind_offctr = vwind_offctr[0] + + thslp_zdiffu = nonhydrostatic_nml["thslp_zdiffu"] + if isinstance(thslp_zdiffu, list): + thslp_zdiffu = thslp_zdiffu[0] + + thhgtd_zdiffu = nonhydrostatic_nml["thhgtd_zdiffu"] + if isinstance(thhgtd_zdiffu, list): + thhgtd_zdiffu = thhgtd_zdiffu[0] + + return test_defs.ExperimentConfig( + driver=driver_cfg, + vertical_grid=vertical_grid_config, + nonhydrostatic=nonhydro_config, + diffusion=diffusion_config, + metrics=metrics_factory.MetricsConfig( + exner_expol=exner_expol, + vwind_offctr=vwind_offctr, + thslp_zdiffu=thslp_zdiffu, + thhgtd_zdiffu=thhgtd_zdiffu, + rayleigh_type=rayleigh_type, + rayleigh_coeff=rayleigh_coeff, + ), + ) diff --git a/model/testing/src/icon4py/model/testing/definitions.py b/model/testing/src/icon4py/model/testing/definitions.py index 3e63e40fa9..2df7f42975 100644 --- a/model/testing/src/icon4py/model/testing/definitions.py +++ b/model/testing/src/icon4py/model/testing/definitions.py @@ -19,11 +19,15 @@ if TYPE_CHECKING: from icon4py.model.atmosphere.diffusion import diffusion from icon4py.model.atmosphere.dycore import solve_nonhydro as solve_nh + from icon4py.model.common.grid import vertical as v_grid + from icon4py.model.common.metrics import metrics_factory + from icon4py.model.standalone_driver import config as driver_config SERIALIZED_DATA_DIR: Final = "ser_icondata" SERIALIZED_DATA_SUBDIR: Final = "ser_data" GRID_DATA_DIR: Final = "grids" +NAMELIST_ICON_FNAME: Final = "NAMELIST_ICON_output_atm" def serialized_data_path() -> pathlib.Path: @@ -221,7 +225,7 @@ class Grids: @dataclasses.dataclass -class Experiment: +class ExperimentDescription: name: str description: str grid: GridDescription @@ -230,31 +234,31 @@ class Experiment: class Experiments: - EXCLAIM_APE: Final = Experiment( + EXCLAIM_APE: Final = ExperimentDescription( name="exclaim_ape_R02B04", description="EXCLAIM Aquaplanet experiment", grid=Grids.R02B04_GLOBAL, num_levels=60, ) - MCH_CH_R04B09: Final = Experiment( + MCH_CH_R04B09: Final = ExperimentDescription( name="exclaim_ch_r04b09_dsl", description="Regional setup used by EXCLAIM to validate the icon-exclaim.", grid=Grids.MCH_CH_R04B09_DSL, num_levels=65, ) - JW: Final = Experiment( + JW: Final = ExperimentDescription( name="exclaim_nh35_tri_jws", description="Jablonowski Williamson atmospheric test case", grid=Grids.R02B04_GLOBAL, num_levels=35, ) - GAUSS3D: Final = Experiment( + GAUSS3D: Final = ExperimentDescription( name="exclaim_gauss3d", description="Gauss 3d test case", grid=Grids.TORUS_50000x5000, num_levels=35, ) - WEISMAN_KLEMP_TORUS: Final = Experiment( + WEISMAN_KLEMP_TORUS: Final = ExperimentDescription( name="exclaim_nh_weisman_klemp", description="Weisman-Klemp experiment on Torus Grid", grid=Grids.TORUS_50000x5000, @@ -262,9 +266,20 @@ class Experiments: ) +@dataclasses.dataclass +class ExperimentConfig: + """Configuration objects derived from the experiment's namelist JSON file.""" + + driver: driver_config.DriverConfig + vertical_grid: v_grid.VerticalGridConfig + nonhydrostatic: solve_nh.NonHydrostaticConfig + diffusion: diffusion.DiffusionConfig + metrics: metrics_factory.MetricsConfig + + # TODO(havogt): the following configs should be part of the serialized experiment def construct_diffusion_config( - experiment: Experiment, ndyn_substeps: int = 5 + experiment: ExperimentDescription, ndyn_substeps: int = 5 ) -> diffusion.DiffusionConfig: from icon4py.model.atmosphere.diffusion import diffusion @@ -307,7 +322,7 @@ def construct_diffusion_config( ) -def construct_nonhydrostatic_config(experiment: Experiment) -> solve_nh.NonHydrostaticConfig: +def construct_nonhydrostatic_config(experiment: ExperimentDescription) -> solve_nh.NonHydrostaticConfig: from icon4py.model.atmosphere.dycore import dycore_states, solve_nonhydro as solve_nh if experiment == Experiments.MCH_CH_R04B09: @@ -319,7 +334,6 @@ def construct_nonhydrostatic_config(experiment: Experiment) -> solve_nh.NonHydro ) elif experiment == Experiments.EXCLAIM_APE: return solve_nh.NonHydrostaticConfig( - rayleigh_coeff=0.1, divdamp_order=dycore_states.DivergenceDampingOrder.COMBINED, # type: ignore[arg-type] # TODO(havogt): typing in `NonHydrostaticConfig` needs to be fixed ) elif experiment == Experiments.GAUSS3D: @@ -330,68 +344,3 @@ def construct_nonhydrostatic_config(experiment: Experiment) -> solve_nh.NonHydro raise NotImplementedError( f"NonHydrostaticConfig for experiment {experiment.name} not implemented." ) - - -def construct_metrics_config(experiment: Experiment) -> tuple: - match experiment: - case Experiments.MCH_CH_R04B09: - lowest_layer_thickness = 20.0 - model_top_height = 23000.0 - stretch_factor = 0.65 - damping_height = 12500.0 - rayleigh_coeff = 5.0 - exner_expol = 0.333 - vwind_offctr = 0.2 - rayleigh_type = 2 - thslp_zdiffu = 0.02 - thhgtd_zdiffu = 125.0 - case Experiments.EXCLAIM_APE: - lowest_layer_thickness = 50.0 - model_top_height = 75000.0 - stretch_factor = 0.9 - damping_height = 50000.0 - rayleigh_coeff = 0.1 - exner_expol = 0.3333333333333 - vwind_offctr = 0.15 - rayleigh_type = 2 - thslp_zdiffu = 0.02 - thhgtd_zdiffu = 125.0 - case Experiments.GAUSS3D: - lowest_layer_thickness = 50.0 - model_top_height = 23500.0 - stretch_factor = 1.0 - damping_height = 45000.0 - rayleigh_coeff = 0.1 - exner_expol = 1.0 / 3.0 - vwind_offctr = 0.15 - rayleigh_type = 2 - thslp_zdiffu = 0.025 - thhgtd_zdiffu = 200.0 - case Experiments.WEISMAN_KLEMP_TORUS: - lowest_layer_thickness = 50.0 - model_top_height = 23500.0 - stretch_factor = 1.0 - damping_height = 8000.0 - rayleigh_coeff = 0.75 - exner_expol = 0.333 - vwind_offctr = 0.15 - rayleigh_type = 2 - thslp_zdiffu = 0.025 - thhgtd_zdiffu = 125.0 - case _: - raise NotImplementedError( - f"Metrics config for experiment {experiment.name} not implemented." - ) - - return ( - lowest_layer_thickness, - model_top_height, - stretch_factor, - damping_height, - rayleigh_coeff, - exner_expol, - vwind_offctr, - rayleigh_type, - thslp_zdiffu, - thhgtd_zdiffu, - ) diff --git a/model/testing/src/icon4py/model/testing/fixtures/benchmark.py b/model/testing/src/icon4py/model/testing/fixtures/benchmark.py index 86b20463d2..128b2415ce 100644 --- a/model/testing/src/icon4py/model/testing/fixtures/benchmark.py +++ b/model/testing/src/icon4py/model/testing/fixtures/benchmark.py @@ -120,11 +120,13 @@ def metrics_field_source( interpolation_source=interpolation_field_source, backend=generic_concrete_backend, metadata=metrics_attributes.attrs, - rayleigh_type=RayleighType.KLEMP, - rayleigh_coeff=5.0, - exner_expol=0.333, - vwind_offctr=0.2, - thslp_zdiffu=0.02, - thhgtd_zdiffu=125.0, + metrics_config=metrics_factory.MetricsConfig( + exner_expol=0.333, + vwind_offctr=0.2, + thslp_zdiffu=0.02, + thhgtd_zdiffu=125.0, + rayleigh_type=RayleighType.KLEMP, + rayleigh_coeff=5.0, + ), ) yield metrics_field_source diff --git a/model/testing/src/icon4py/model/testing/fixtures/datatest.py b/model/testing/src/icon4py/model/testing/fixtures/datatest.py index 7730656d5a..a77e9b11b8 100644 --- a/model/testing/src/icon4py/model/testing/fixtures/datatest.py +++ b/model/testing/src/icon4py/model/testing/fixtures/datatest.py @@ -17,7 +17,11 @@ from icon4py.model.common import model_backends, model_options from icon4py.model.common.constants import RayleighType from icon4py.model.common.grid import base as base_grid -from icon4py.model.testing import data_handling, datatest_utils as dt_utils, definitions +from icon4py.model.testing import ( + data_handling, + datatest_utils as dt_utils, + definitions as test_defs, +) if TYPE_CHECKING: @@ -81,27 +85,27 @@ def cpu_allocator() -> gtx_typing.Allocator: @pytest.fixture( params=[ - definitions.Grids.R01B01_GLOBAL, - definitions.Grids.R02B04_GLOBAL, - definitions.Grids.MCH_CH_R04B09_DSL, - definitions.Grids.TORUS_50000x5000, + test_defs.Grids.R01B01_GLOBAL, + test_defs.Grids.R02B04_GLOBAL, + test_defs.Grids.MCH_CH_R04B09_DSL, + test_defs.Grids.TORUS_50000x5000, ], ids=lambda r: r.name, ) -def grid_description(request: pytest.FixtureRequest) -> definitions.GridDescription: +def grid_description(request: pytest.FixtureRequest) -> test_defs.GridDescription: """Default parametrization for grid.""" return request.param @pytest.fixture( params=[ - definitions.Experiments.MCH_CH_R04B09, - definitions.Experiments.EXCLAIM_APE, - definitions.Experiments.GAUSS3D, + test_defs.Experiments.MCH_CH_R04B09, + test_defs.Experiments.EXCLAIM_APE, + test_defs.Experiments.GAUSS3D, ], ids=lambda r: r.name, ) -def experiment(request: pytest.FixtureRequest) -> definitions.Experiment: +def experiment(request: pytest.FixtureRequest) -> test_defs.ExperimentDescription: """Default parametrization for experiments. The default parametrization is often overwritten for specific tests.""" @@ -116,15 +120,15 @@ def processor_props(request: pytest.FixtureRequest) -> decomposition.ProcessProp def _download_ser_data( - _experiment: definitions.Experiment, + _experiment: test_defs.ExperimentDescription, processor_props: decomposition.ProcessProperties, ) -> None: # not a fixture to be able to use this function outside of pytest comm_size = processor_props.comm_size try: - root_url = definitions.SERIALIZED_DATA_ROOT_URLS[comm_size] + root_url = test_defs.SERIALIZED_DATA_ROOT_URLS[comm_size] archive_filename = dt_utils.get_experiment_archive_filename(_experiment, comm_size) - archive_path = definitions.SERIALIZED_DATA_DIR + "/" + archive_filename + archive_path = test_defs.SERIALIZED_DATA_DIR + "/" + archive_filename uri = dt_utils.get_serialized_data_url(root_url, archive_path) destination_path = dt_utils.get_datapath_for_experiment(_experiment, processor_props) data_handling.download_test_data(destination_path.parent, uri) @@ -138,7 +142,7 @@ def _download_ser_data( def download_ser_data( request: pytest.FixtureRequest, processor_props: decomposition.ProcessProperties, - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, pytestconfig: pytest.Config, ) -> None: """ @@ -153,10 +157,20 @@ def download_ser_data( _download_ser_data(experiment, processor_props) +@pytest.fixture +def experiment_config( + download_ser_data: None, + experiment: test_defs.ExperimentDescription, + processor_props: decomposition.ProcessProperties, +) -> test_defs.ExperimentConfig: + """Create experiment configuration from the namelist JSON file.""" + return dt_utils.create_experiment_configuration(experiment, processor_props) + + @pytest.fixture def data_provider( download_ser_data: None, # downloads data as side-effect - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, processor_props: decomposition.ProcessProperties, backend: gtx_typing.Backend, ) -> serialbox.IconSerialDataProvider: @@ -166,7 +180,7 @@ def data_provider( @pytest.fixture def grid_savepoint( - data_provider: serialbox.IconSerialDataProvider, experiment: definitions.Experiment + data_provider: serialbox.IconSerialDataProvider, experiment: test_defs.ExperimentDescription ) -> serialbox.IconGridSavepoint: return data_provider.from_savepoint_grid(experiment.name, experiment.grid.params) @@ -185,7 +199,7 @@ def icon_grid( @pytest.fixture def decomposition_info( - data_provider: serialbox.IconSerialDataProvider, experiment: definitions.Experiment + data_provider: serialbox.IconSerialDataProvider, experiment: test_defs.ExperimentDescription ) -> decomposition.DecompositionInfo: return data_provider.from_savepoint_grid( grid_id=experiment.name, global_grid_params=experiment.grid.params @@ -193,14 +207,14 @@ def decomposition_info( @pytest.fixture -def ndyn_substeps(experiment: definitions.Experiment) -> int: +def ndyn_substeps(experiment: test_defs.ExperimentDescription) -> int: """ Return number of dynamical substeps. Serialized data of global and regional experiments uses a reduced number (2 instead of the default 5) in order to reduce the amount of data generated. """ - if experiment == definitions.Experiments.GAUSS3D: + if experiment == test_defs.Experiments.GAUSS3D: return 5 else: return 2 @@ -514,18 +528,18 @@ def istep_exit() -> int: @pytest.fixture -def lowest_layer_thickness(experiment: definitions.Experiment) -> float: - if experiment == definitions.Experiments.MCH_CH_R04B09: +def lowest_layer_thickness(experiment: test_defs.ExperimentDescription) -> float: + if experiment == test_defs.Experiments.MCH_CH_R04B09: return 20.0 else: return 50.0 @pytest.fixture -def model_top_height(experiment: definitions.Experiment) -> float: - if experiment == definitions.Experiments.MCH_CH_R04B09: +def model_top_height(experiment: test_defs.ExperimentDescription) -> float: + if experiment == test_defs.Experiments.MCH_CH_R04B09: return 23000.0 - elif experiment == definitions.Experiments.EXCLAIM_APE: + elif experiment == test_defs.Experiments.EXCLAIM_APE: return 75000.0 else: return 23500.0 @@ -537,20 +551,20 @@ def flat_height() -> float: @pytest.fixture -def stretch_factor(experiment: definitions.Experiment) -> float: - if experiment == definitions.Experiments.MCH_CH_R04B09: +def stretch_factor(experiment: test_defs.ExperimentDescription) -> float: + if experiment == test_defs.Experiments.MCH_CH_R04B09: return 0.65 - elif experiment == definitions.Experiments.EXCLAIM_APE: + elif experiment == test_defs.Experiments.EXCLAIM_APE: return 0.9 else: return 1.0 @pytest.fixture -def damping_height(experiment: definitions.Experiment) -> float: - if experiment == definitions.Experiments.MCH_CH_R04B09: +def damping_height(experiment: test_defs.ExperimentDescription) -> float: + if experiment == test_defs.Experiments.MCH_CH_R04B09: return 12500.0 - elif experiment == definitions.Experiments.EXCLAIM_APE: + elif experiment == test_defs.Experiments.EXCLAIM_APE: return 50000.0 else: return 45000.0 @@ -567,24 +581,24 @@ def maximal_layer_thickness() -> float: @pytest.fixture -def rayleigh_coeff(experiment: definitions.Experiment) -> float: - if experiment == definitions.Experiments.EXCLAIM_APE: +def rayleigh_coeff(experiment: test_defs.ExperimentDescription) -> float: + if experiment == test_defs.Experiments.EXCLAIM_APE: return 0.1 else: return 5.0 @pytest.fixture -def exner_expol(experiment: definitions.Experiment) -> float: - if experiment == definitions.Experiments.EXCLAIM_APE: +def exner_expol(experiment: test_defs.ExperimentDescription) -> float: + if experiment == test_defs.Experiments.EXCLAIM_APE: return 0.3333333333333 else: return 0.333 @pytest.fixture -def vwind_offctr(experiment: definitions.Experiment) -> float: - if experiment == definitions.Experiments.EXCLAIM_APE: +def vwind_offctr(experiment: test_defs.ExperimentDescription) -> float: + if experiment == test_defs.Experiments.EXCLAIM_APE: return 0.15 else: return 0.2 diff --git a/model/testing/src/icon4py/model/testing/fixtures/stencil_tests.py b/model/testing/src/icon4py/model/testing/fixtures/stencil_tests.py index 319f7ec7b2..3124acd3f8 100644 --- a/model/testing/src/icon4py/model/testing/fixtures/stencil_tests.py +++ b/model/testing/src/icon4py/model/testing/fixtures/stencil_tests.py @@ -14,7 +14,7 @@ from icon4py.model.common import model_backends from icon4py.model.common.grid import base as base_grid, grid_manager as gm, simple as simple_grid -from icon4py.model.testing import definitions, grid_utils +from icon4py.model.testing import definitions as test_defs, grid_utils BENCHMARK_DEFAULT_LEVELS: Final[int] = 80 @@ -41,28 +41,28 @@ def _get_grid_manager_from_preset( match grid_preset: case "icon_regional": return grid_utils.get_grid_manager_from_identifier( - definitions.Grids.MCH_CH_R04B09_DSL, + test_defs.Grids.MCH_CH_R04B09_DSL, num_levels=num_levels, keep_skip_values=False, allocator=allocator, ) case "icon_global": return grid_utils.get_grid_manager_from_identifier( - definitions.Grids.R02B04_GLOBAL, + test_defs.Grids.R02B04_GLOBAL, num_levels=num_levels, keep_skip_values=False, allocator=allocator, ) case "icon_benchmark_regional": return grid_utils.get_grid_manager_from_identifier( - definitions.Grids.MCH_OPR_R19B08_DOMAIN01, + test_defs.Grids.MCH_OPR_R19B08_DOMAIN01, num_levels=BENCHMARK_DEFAULT_LEVELS, keep_skip_values=False, allocator=allocator, ) case "icon_benchmark_global": return grid_utils.get_grid_manager_from_identifier( - definitions.Grids.R02B06_GLOBAL, + test_defs.Grids.R02B06_GLOBAL, num_levels=BENCHMARK_DEFAULT_LEVELS, keep_skip_values=False, allocator=allocator, diff --git a/model/testing/src/icon4py/model/testing/grid_utils.py b/model/testing/src/icon4py/model/testing/grid_utils.py index 369dea78a5..a30888c470 100644 --- a/model/testing/src/icon4py/model/testing/grid_utils.py +++ b/model/testing/src/icon4py/model/testing/grid_utils.py @@ -18,14 +18,14 @@ vertical as v_grid, ) from icon4py.model.common.utils import data_allocation as data_alloc -from icon4py.model.testing import config, data_handling, definitions +from icon4py.model.testing import config, data_handling, definitions as test_defs grid_geometries: dict[str, geometry.GridGeometry] = {} def get_grid_manager_from_experiment( - experiment: definitions.Experiment, + experiment: test_defs.ExperimentDescription, keep_skip_values: bool, allocator: gtx_typing.Allocator, ) -> gm.GridManager: @@ -38,7 +38,7 @@ def get_grid_manager_from_experiment( def get_grid_manager_from_identifier( - grid: definitions.GridDescription, + grid: test_defs.GridDescription, num_levels: int, keep_skip_values: bool, allocator: gtx_typing.Allocator, @@ -73,11 +73,11 @@ def get_grid_manager( return manager -def resolve_full_grid_file_name(grid: definitions.GridDescription) -> pathlib.Path: - return definitions.grids_path().joinpath(grid.name, grid.file_name) +def resolve_full_grid_file_name(grid: test_defs.GridDescription) -> pathlib.Path: + return test_defs.grids_path().joinpath(grid.name, grid.file_name) -def _download_grid_file(grid: definitions.GridDescription) -> pathlib.Path: +def _download_grid_file(grid: test_defs.GridDescription) -> pathlib.Path: full_name = resolve_full_grid_file_name(grid) grid_directory = full_name.parent grid_directory.mkdir(parents=True, exist_ok=True) @@ -98,7 +98,7 @@ def _download_grid_file(grid: definitions.GridDescription) -> pathlib.Path: def get_grid_geometry( - backend: gtx_typing.Backend | None, experiment: definitions.Experiment + backend: gtx_typing.Backend | None, experiment: test_defs.ExperimentDescription ) -> geometry.GridGeometry: register_name = "_".join((experiment.name, data_alloc.backend_name(backend))) diff --git a/scripts/run_serialization.py b/scripts/run_serialization.py index d776723b51..f471c31758 100644 --- a/scripts/run_serialization.py +++ b/scripts/run_serialization.py @@ -14,6 +14,7 @@ import re import shutil import subprocess +import sys import tarfile import time from concurrent.futures import ThreadPoolExecutor @@ -22,7 +23,7 @@ import typer -from icon4py.model.testing import datatest_utils as dt_utils, definitions +from icon4py.model.testing import datatest_utils as dt_utils, definitions as test_defs cli = typer.Typer(no_args_is_help=True, help=__doc__) @@ -34,11 +35,11 @@ COMM_SIZES: list[int] = [1, 2, 4] EXPERIMENTS = [ - definitions.Experiments.MCH_CH_R04B09, - definitions.Experiments.JW, - definitions.Experiments.EXCLAIM_APE, - definitions.Experiments.GAUSS3D, - definitions.Experiments.WEISMAN_KLEMP_TORUS, + test_defs.Experiments.MCH_CH_R04B09, + test_defs.Experiments.JW, + test_defs.Experiments.EXCLAIM_APE, + test_defs.Experiments.GAUSS3D, + test_defs.Experiments.WEISMAN_KLEMP_TORUS, ] # Slurm settings @@ -60,7 +61,7 @@ EXPERIMENTS_DIR = BUILD_DIR / "experiments" # Output location for copied ser_data and tarballs -OUTPUT_ROOT = EXPERIMENTS_DIR / definitions.SERIALIZED_DATA_DIR +OUTPUT_ROOT = EXPERIMENTS_DIR / test_defs.SERIALIZED_DATA_DIR # Maximum concurrent threads for running experiments MAX_THREADS: int = 5 @@ -70,33 +71,33 @@ # ====================================== -def get_f90exp_name(experiment: definitions.Experiment) -> str: +def get_f90exp_name(experiment: test_defs.ExperimentDescription) -> str: return f"{experiment.name}_sb" -def get_f90exp_dir(experiment: definitions.Experiment) -> Path: +def get_f90exp_dir(experiment: test_defs.ExperimentDescription) -> Path: return EXPERIMENTS_DIR / get_f90exp_name(experiment) -def get_nmlfile_name(experiment: definitions.Experiment) -> str: +def get_nmlfile_name(experiment: test_defs.ExperimentDescription) -> str: return f"exp.{get_f90exp_name(experiment)}" -def get_slurmscript_name(experiment: definitions.Experiment) -> str: +def get_slurmscript_name(experiment: test_defs.ExperimentDescription) -> str: return f"{get_nmlfile_name(experiment)}.run" -def get_serdata_dst_dir(experiment: definitions.Experiment, comm_size: int) -> Path: +def get_serdata_dst_dir(experiment: test_defs.ExperimentDescription, comm_size: int) -> Path: """Get the destination directory for serialized data.""" return OUTPUT_ROOT / dt_utils.get_ranked_experiment_name_with_version(experiment, comm_size) -def get_tar_path(experiment: definitions.Experiment, comm_size: int) -> Path: +def get_tar_path(experiment: test_defs.ExperimentDescription, comm_size: int) -> Path: """Get the path to the tar archive for the experiment.""" return OUTPUT_ROOT / dt_utils.get_experiment_archive_filename(experiment, comm_size) -def cleanup_exp_output(experiment: definitions.Experiment, comm_size: int) -> None: +def cleanup_exp_output(experiment: test_defs.ExperimentDescription, comm_size: int) -> None: """Clean up experiment output directories and archives. Deletes: @@ -351,7 +352,7 @@ def copy_ser_data(experiment, comm_size: int, job_id: str | None = None) -> Path dest_dir.mkdir(parents=True, exist_ok=True) # Copy ser_data folder - shutil.copytree(src_dir, dest_dir / definitions.SERIALIZED_DATA_SUBDIR) + shutil.copytree(src_dir, dest_dir / test_defs.SERIALIZED_DATA_SUBDIR) # Copy NAMELIST files namelist_files = sorted(exp_dir.glob("NAMELIST_*")) @@ -359,6 +360,14 @@ def copy_ser_data(experiment, comm_size: int, job_id: str | None = None) -> Path if src_file.is_file(): shutil.copy2(src_file, dest_dir / src_file.name) + # Translate to json and copy NAMELIST_ICON_output_atm + cmd = [ + "f90nml", + str(exp_dir / test_defs.NAMELIST_ICON_FNAME), + str(dest_dir / (test_defs.NAMELIST_ICON_FNAME + ".json")), + ] + _ = run_command(cmd) + # Copy LOG file if available if job_id is not None: log_file = RUNSCRIPTS_DIR / f"LOG.{get_slurmscript_name(experiment)}.{job_id}.o" @@ -368,7 +377,7 @@ def copy_ser_data(experiment, comm_size: int, job_id: str | None = None) -> Path return dest_dir -def tar_folder(folder: Path, experiment: definitions.Experiment, comm_size: int) -> Path: +def tar_folder(folder: Path, experiment: test_defs.ExperimentDescription, comm_size: int) -> Path: tar_path = get_tar_path(experiment, comm_size) with tarfile.open(tar_path, "w:gz") as tar: @@ -379,7 +388,7 @@ def tar_folder(folder: Path, experiment: definitions.Experiment, comm_size: int) return tar_path -def generate_update_script(experiment: definitions.Experiment) -> None: +def generate_update_script(experiment: test_defs.ExperimentDescription) -> None: # copy namelist file from repo to build_dir shutil.copy2( ICONF90_DIR / "run" / get_nmlfile_name(experiment), @@ -391,7 +400,7 @@ def generate_update_script(experiment: definitions.Experiment) -> None: _ = run_command(cmd, cwd=BUILD_DIR) -def run_experiment(experiment: definitions.Experiment, comm_size: int) -> None: +def run_experiment(experiment: test_defs.ExperimentDescription, comm_size: int) -> None: """Execute a single experiment with the given communicator size.""" try: # Clean up previous experiment output @@ -431,9 +440,18 @@ def run_experiment(experiment: definitions.Experiment, comm_size: int) -> None: raise +def require_cli(command_name): + if shutil.which(command_name) is None: + print(f"Error: '{command_name}' is not installed or not on PATH.") + sys.exit(1) + + @cli.command() def run_experiment_series() -> None: """Run the serialization experiment series.""" + + require_cli("f90nml") + OUTPUT_ROOT.mkdir(parents=True, exist_ok=True) total_tasks = len(EXPERIMENTS) * len(COMM_SIZES) diff --git a/tools/src/icon4py/tools/py2fgen/wrappers/dycore_wrapper.py b/tools/src/icon4py/tools/py2fgen/wrappers/dycore_wrapper.py index 35cfdb4843..1cf8030212 100644 --- a/tools/src/icon4py/tools/py2fgen/wrappers/dycore_wrapper.py +++ b/tools/src/icon4py/tools/py2fgen/wrappers/dycore_wrapper.py @@ -28,6 +28,7 @@ from icon4py.model.atmosphere.dycore import dycore_states, solve_nonhydro from icon4py.model.common import dimension as dims, model_backends, utils as common_utils +from icon4py.model.common.metrics import metrics_factory from icon4py.model.common.states.prognostic_state import PrognosticState from icon4py.model.common.utils import data_allocation as data_alloc from icon4py.tools import py2fgen @@ -157,14 +158,10 @@ def solve_nh_init( itime_scheme=itime_scheme, iadv_rhotheta=iadv_rhotheta, igradp_method=igradp_method, - rayleigh_type=rayleigh_type, - rayleigh_coeff=rayleigh_coeff, divdamp_order=divdamp_order, is_iau_active=is_iau_active, iau_wgt_dyn=iau_wgt_dyn, divdamp_type=divdamp_type, - divdamp_trans_start=divdamp_trans_start, - divdamp_trans_end=divdamp_trans_end, l_vert_nested=l_vert_nested, deepatmos_mode=ldeepatmo, rhotheta_offctr=rhotheta_offctr, @@ -271,6 +268,14 @@ def solve_nh_init( owner_mask=c_owner_mask, backend=actual_backend, exchange=grid_wrapper.grid_state.exchange_runtime, + metrics_config=metrics_factory.MetricsConfig( + exner_expol=0.333, + vwind_offctr=0.2, + thslp_zdiffu=0.02, + thhgtd_zdiffu=125.0, + rayleigh_type=rayleigh_type, + rayleigh_coeff=rayleigh_coeff, + ), ), dummy_field_factory=wrapper_common.cached_dummy_field_factory(allocator), ) diff --git a/tools/tests/tools/py2fgen/wrappers/test_diffusion_wrapper.py b/tools/tests/tools/py2fgen/wrappers/test_diffusion_wrapper.py index f85ec964b7..e111576c1e 100644 --- a/tools/tests/tools/py2fgen/wrappers/test_diffusion_wrapper.py +++ b/tools/tests/tools/py2fgen/wrappers/test_diffusion_wrapper.py @@ -15,7 +15,7 @@ from icon4py.model.atmosphere.diffusion import diffusion, diffusion_states from icon4py.model.common import dimension as dims from icon4py.model.common.grid import states as grid_states, vertical as v_grid -from icon4py.model.testing import definitions, test_utils as testing_test_utils +from icon4py.model.testing import definitions as test_defs, test_utils as testing_test_utils from icon4py.tools import py2fgen from icon4py.tools.py2fgen import test_utils from icon4py.tools.py2fgen.wrappers import common as wrapper_common, diffusion_wrapper @@ -29,7 +29,7 @@ "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), @@ -140,7 +140,7 @@ def test_diffusion_wrapper_granule_inputs( dwdy=savepoint_diffusion_init.dwdy(), ) expected_prognostic_state = savepoint_diffusion_init.construct_prognostics() - expected_config = definitions.construct_diffusion_config(experiment, ndyn_substeps) + expected_config = test_defs.construct_diffusion_config(experiment, ndyn_substeps) expected_additional_parameters = diffusion.DiffusionParams(expected_config) # --- Mock and Test Diffusion.init --- @@ -257,7 +257,7 @@ def test_diffusion_wrapper_granule_inputs( "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), diff --git a/tools/tests/tools/py2fgen/wrappers/test_dycore_wrapper.py b/tools/tests/tools/py2fgen/wrappers/test_dycore_wrapper.py index 726a86e7bd..d57d0c0830 100644 --- a/tools/tests/tools/py2fgen/wrappers/test_dycore_wrapper.py +++ b/tools/tests/tools/py2fgen/wrappers/test_dycore_wrapper.py @@ -20,7 +20,7 @@ from icon4py.model.common.grid.vertical import VerticalGridConfig from icon4py.model.common.states import prognostic_state as prognostics from icon4py.model.common.utils import data_allocation as data_alloc -from icon4py.model.testing import definitions, test_utils as testing_test_utils +from icon4py.model.testing import definitions as test_defs, test_utils as testing_test_utils from icon4py.tools import py2fgen from icon4py.tools.py2fgen import test_utils from icon4py.tools.py2fgen.wrappers import common as wrapper_common, dycore_wrapper @@ -239,7 +239,7 @@ def solve_nh_init( "experiment, step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), @@ -501,7 +501,7 @@ def test_dycore_wrapper_granule_inputs( coeff2_dwdz=metrics_savepoint.coeff2_dwdz(), coeff_gradekin=metrics_savepoint.coeff_gradekin(), ) - expected_config = definitions.construct_nonhydrostatic_config(experiment) + expected_config = test_defs.construct_nonhydrostatic_config(experiment) expected_additional_parameters = solve_nh.NonHydrostaticParams(expected_config) # --- Expected objects that form inputs into run function --- @@ -802,7 +802,7 @@ def test_dycore_wrapper_granule_inputs( "experiment,step_date_init, step_date_exit", [ ( - definitions.Experiments.MCH_CH_R04B09, + test_defs.Experiments.MCH_CH_R04B09, "2021-06-20T12:00:10.000", "2021-06-20T12:00:10.000", ), @@ -981,7 +981,7 @@ def test_granule_solve_nonhydro_single_step_regional( @pytest.mark.datatest -@pytest.mark.parametrize("experiment", [definitions.Experiments.MCH_CH_R04B09]) +@pytest.mark.parametrize("experiment", [test_defs.Experiments.MCH_CH_R04B09]) @pytest.mark.parametrize( "istep_init, substep_init, step_date_init, istep_exit, substep_exit, step_date_exit, vn_only, at_initial_timestep", [