Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions configs/TCO319_AMIP.yaml
Original file line number Diff line number Diff line change
@@ -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
37 changes: 37 additions & 0 deletions configs/TCO95_AMIP.yaml
Original file line number Diff line number Diff line change
@@ -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
37 changes: 37 additions & 0 deletions configs/TL255_AMIP.yaml
Original file line number Diff line number Diff line change
@@ -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
4 changes: 2 additions & 2 deletions ocp_tool/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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),
),
Expand Down
8 changes: 7 additions & 1 deletion ocp_tool/create_outputdirs.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
5 changes: 3 additions & 2 deletions ocp_tool/oasis_writer.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
19 changes: 11 additions & 8 deletions run_ocp_tool.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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...")
Expand Down
Loading