From 8c9b502eb56ba2b77a13cec963eaecdcc24b25d7 Mon Sep 17 00:00:00 2001 From: Jan Streffing Date: Mon, 2 Feb 2026 12:42:39 +0100 Subject: [PATCH] adding amip configs and minor fixes for amip --- configs/TCO319_AMIP.yaml | 37 +++++++++++++++++++++++++++++++++++ configs/TCO95_AMIP.yaml | 37 +++++++++++++++++++++++++++++++++++ configs/TL255_AMIP.yaml | 37 +++++++++++++++++++++++++++++++++++ ocp_tool/config.py | 4 ++-- ocp_tool/create_outputdirs.py | 8 +++++++- ocp_tool/oasis_writer.py | 5 +++-- run_ocp_tool.py | 19 ++++++++++-------- 7 files changed, 134 insertions(+), 13 deletions(-) create mode 100644 configs/TCO319_AMIP.yaml create mode 100644 configs/TCO95_AMIP.yaml create mode 100644 configs/TL255_AMIP.yaml diff --git a/configs/TCO319_AMIP.yaml b/configs/TCO319_AMIP.yaml new file mode 100644 index 0000000..07402de --- /dev/null +++ b/configs/TCO319_AMIP.yaml @@ -0,0 +1,37 @@ +# OCP-Tool Configuration +# OpenIFS Coupling Preparation Tool +# Configuration: TCO319 + AMIP (atmosphere-only, no ocean coupling) + +# Atmosphere grid settings +atmosphere: + resolution_list: [319] # TCO319 + truncation_type: "cubic-octahedral" + experiment_name: "abns" # IMPORTANT: abns for TCO319, ab45 for TCO95 + +# Ocean grid settings +ocean: + grid_name: "AMIP" + has_ice_cavities: false # AMIP has no ocean + mesh_file: null + +# Basin modifications for runoff +runoff: + manual_basin_removal: [] + +# Paths (relative to auto-detected root_dir, or absolute) +# Output dirs auto-computed as: output/{TCO|TL}{resolution}_{ocean_grid}/ +paths: + input: + fesom_mesh: "input/fesom_mesh/" + gaussian_grids_full: "input/gaussian_grids_full/" + gaussian_grids_octahedral_reduced: "input/gaussian_grids_octahedral_reduced/" + gaussian_grids_linear_reduced: "input/gaussian_grids_linear_reduced/" + openifs_default: "input/openifs_input_default/" + runoff_default: "input/runoff_map_default/" + lpj_guess: "input/lpj-guess/" + +# Processing options +options: + verbose: true + parallel_workers: 4 + use_dask: true diff --git a/configs/TCO95_AMIP.yaml b/configs/TCO95_AMIP.yaml new file mode 100644 index 0000000..fc61f33 --- /dev/null +++ b/configs/TCO95_AMIP.yaml @@ -0,0 +1,37 @@ +# OCP-Tool Configuration +# OpenIFS Coupling Preparation Tool +# Configuration: TCO95 + AMIP (atmosphere-only, no ocean coupling) + +# Atmosphere grid settings +atmosphere: + resolution_list: [95] # TCO95 + truncation_type: "cubic-octahedral" + experiment_name: "ab45" # IMPORTANT: abns for TCO319, ab45 for TCO95 + +# Ocean grid settings +ocean: + grid_name: "AMIP" + has_ice_cavities: false # AMIP has no ocean + mesh_file: null + +# Basin modifications for runoff +runoff: + manual_basin_removal: [] + +# Paths (relative to auto-detected root_dir, or absolute) +# Output dirs auto-computed as: output/{TCO|TL}{resolution}_{ocean_grid}/ +paths: + input: + fesom_mesh: "input/fesom_mesh/" + gaussian_grids_full: "input/gaussian_grids_full/" + gaussian_grids_octahedral_reduced: "input/gaussian_grids_octahedral_reduced/" + gaussian_grids_linear_reduced: "input/gaussian_grids_linear_reduced/" + openifs_default: "input/openifs_input_default/" + runoff_default: "input/runoff_map_default/" + lpj_guess: "input/lpj-guess/" + +# Processing options +options: + verbose: true + parallel_workers: 4 + use_dask: true diff --git a/configs/TL255_AMIP.yaml b/configs/TL255_AMIP.yaml new file mode 100644 index 0000000..0a297a8 --- /dev/null +++ b/configs/TL255_AMIP.yaml @@ -0,0 +1,37 @@ +# OCP-Tool Configuration +# OpenIFS Coupling Preparation Tool +# Configuration: TL255 + AMIP (atmosphere-only, no ocean coupling) + +# Atmosphere grid settings +atmosphere: + resolution_list: [255] # TL255 + truncation_type: "linear" + experiment_name: "h9wn" # N=128 for TL255 + +# Ocean grid settings +ocean: + grid_name: "AMIP" + has_ice_cavities: false # AMIP has no ocean + mesh_file: null + +# Basin modifications for runoff +runoff: + manual_basin_removal: [] + +# Paths (relative to auto-detected root_dir, or absolute) +# Output dirs auto-computed as: output/{TCO|TL}{resolution}_{ocean_grid}/ +paths: + input: + fesom_mesh: "input/fesom_mesh/" + gaussian_grids_full: "input/gaussian_grids_full/" + gaussian_grids_octahedral_reduced: "input/gaussian_grids_octahedral_reduced/" + gaussian_grids_linear_reduced: "input/gaussian_grids_linear_reduced/" + openifs_default: "input/openifs_input_default/" + runoff_default: "input/runoff_map_default/" + lpj_guess: "input/lpj-guess/" + +# Processing options +options: + verbose: true + parallel_workers: 4 + use_dask: true diff --git a/ocp_tool/config.py b/ocp_tool/config.py index 08446a1..958ad22 100644 --- a/ocp_tool/config.py +++ b/ocp_tool/config.py @@ -22,7 +22,7 @@ class OceanConfig: """Ocean grid configuration.""" grid_name: str has_ice_cavities: bool - mesh_file: Path + mesh_file: Optional[Path] intermediate_resolution: str = "r360x181" force_overwrite_griddes: bool = False @@ -171,7 +171,7 @@ def resolve_path(path_str: str) -> Path: ocean=OceanConfig( grid_name=raw['ocean']['grid_name'], has_ice_cavities=raw['ocean']['has_ice_cavities'], - mesh_file=Path(raw['ocean']['mesh_file']), + mesh_file=Path(raw['ocean']['mesh_file']) if raw['ocean']['mesh_file'] is not None else None, intermediate_resolution=raw['ocean'].get('intermediate_resolution', 'r360x181'), force_overwrite_griddes=raw['ocean'].get('force_overwrite_griddes', False), ), diff --git a/ocp_tool/create_outputdirs.py b/ocp_tool/create_outputdirs.py index 0427a40..5ea751d 100644 --- a/ocp_tool/create_outputdirs.py +++ b/ocp_tool/create_outputdirs.py @@ -5,7 +5,13 @@ def create_outputdirs(config, resolution): """Create necessary output directories based on configuration and resolution.""" - output_dir = f"./output/TCO{resolution}_{config.ocean.grid_name}/" + # Determine prefix based on truncation type + if config.atmosphere.truncation_type == "cubic-octahedral": + prefix = "TCO" + else: + prefix = "TL" + + output_dir = f"./output/{prefix}{resolution}_{config.ocean.grid_name}/" makedirs(f"{output_dir}lpj-guess", exist_ok=True) makedirs(f"{output_dir}oasis_mct3_input", exist_ok=True) makedirs(f"{output_dir}openifs_input_modified", exist_ok=True) diff --git a/ocp_tool/oasis_writer.py b/ocp_tool/oasis_writer.py index 53410de..9b00194 100644 --- a/ocp_tool/oasis_writer.py +++ b/ocp_tool/oasis_writer.py @@ -69,8 +69,9 @@ def write_oasis_grid_files( config, grid, lsm_data, resolution, nn, grid_names, file_type ) - # Copy runoff files into OASIS files - _append_runoff_to_oasis_files(config, file_types) + # Copy runoff files into OASIS files (skip for AMIP mode - no ocean coupling) + if config.ocean.grid_name != 'AMIP': + _append_runoff_to_oasis_files(config, file_types) def _write_single_oasis_file( diff --git a/run_ocp_tool.py b/run_ocp_tool.py index 17ba5b1..e7b4420 100644 --- a/run_ocp_tool.py +++ b/run_ocp_tool.py @@ -74,7 +74,7 @@ def run_ocp_tool(config: OCPConfig) -> None: print("\nStep 4: Writing OASIS grid/mask/area files...") write_oasis_grid_files( config, grid, lsm_data, resolution, - parallel=config.options.parallel_workers > 1 + parallel=False # Disabled: NetCDF4/HDF5 race conditions with parallel writes ) # Step 5: Interpolate vegetation and CO2 data @@ -117,13 +117,16 @@ def run_ocp_tool(config: OCPConfig) -> None: verbose=config.options.verbose ) - # Step 10: Modify runoff maps - print("\nStep 10: Modifying runoff maps...") - lons, lats = modify_runoff_map(config, resolution) - - # Step 11: Modify runoff LSM - print("\nStep 11: Modifying runoff land-sea mask...") - modify_runoff_lsm(config, lons, lats) + # Step 10: Modify runoff maps (skip for AMIP - no ocean coupling) + if config.ocean.grid_name != 'AMIP': + print("\nStep 10: Modifying runoff maps...") + lons, lats = modify_runoff_map(config, resolution) + + # Step 11: Modify runoff LSM + print("\nStep 11: Modifying runoff land-sea mask...") + modify_runoff_lsm(config, lons, lats) + else: + print("\nStep 10-11: Skipped runoff processing (AMIP mode - no ocean coupling)") # Step 12: Create SLT output for LPJ-GUESS print("\nStep 12: Creating SLT output for LPJ-GUESS...")