diff --git a/configs/TCO95_CORE3.yaml b/configs/TCO95_CORE3.yaml new file mode 100644 index 0000000..e6675e6 --- /dev/null +++ b/configs/TCO95_CORE3.yaml @@ -0,0 +1,38 @@ +# OCP-Tool Configuration +# OpenIFS Coupling Preparation Tool +# Configuration: TCO319 + CORE3 (with ice cavities) + +# Atmosphere grid settings +atmosphere: + resolution_list: [95] # TCO319 + truncation_type: "cubic-octahedral" + experiment_name: "ab45" # IMPORTANT: abns for TCO319, ab45 for TCO95 + +# Ocean grid settings +ocean: + grid_name: "CORE3" + has_ice_cavities: true # CORE3 has ice cavities + mesh_file: "/work/ab0246/a270092/input/fesom2/core3/mesh.nc" + +# Basin modifications for runoff +runoff: + manual_basin_removal: + - "caspian-sea" + +# 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/field_interpolation.py b/ocp_tool/field_interpolation.py index 7ad41c5..f80017e 100644 --- a/ocp_tool/field_interpolation.py +++ b/ocp_tool/field_interpolation.py @@ -112,6 +112,12 @@ def interpolate_co2_emissions(input_grib_file, icmgg_init_file, output_file, var # Second pass: read, interpolate and prepare each variable for writing interpolated_emissions = {} + # Parameter ID mapping for CO2 emissions + # Map input paramIds to desired output paramIds + param_id_mapping = { + 228083: 210068, # fco2nee -> co2nbf + } + with open(input_grib_file, 'rb') as f: while True: gid = eccodes.codes_grib_new_from_file(f) @@ -129,10 +135,14 @@ def interpolate_co2_emissions(input_grib_file, icmgg_init_file, output_file, var # Create source points for interpolation source_points = np.column_stack((lons, lats)) + # Get the original paramId and apply mapping if necessary + original_param_id = eccodes.codes_get(gid, 'paramId') + mapped_param_id = param_id_mapping.get(original_param_id, original_param_id) + # Store the original GRIB message information for template template_info = { 'short_name': short_name, - 'param_id': eccodes.codes_get(gid, 'paramId'), + 'param_id': mapped_param_id, 'level_type': eccodes.codes_get(gid, 'typeOfLevel'), 'level': eccodes.codes_get(gid, 'level'), 'grid_type': eccodes.codes_get(gid, 'gridType') diff --git a/ocp_tool/lsm.py b/ocp_tool/lsm.py index 6856cb0..cca71ef 100644 --- a/ocp_tool/lsm.py +++ b/ocp_tool/lsm.py @@ -342,11 +342,11 @@ def create_slt_output_for_lpjg( input_file = config.get_icmgg_output_file() - # Generate output filename + # Generate output filename with ocean grid name if config.atmosphere.truncation_type == 'cubic-octahedral': - slt_output_name = f'slt_TCO{resolution}.nc' + slt_output_name = f'slt_TCO{resolution}_{config.ocean.grid_name}.nc' elif config.atmosphere.truncation_type == 'linear': - slt_output_name = f'slt_TL{resolution}.nc' + slt_output_name = f'slt_TL{resolution}_{config.ocean.grid_name}.nc' else: raise ValueError(f"Unknown truncation type: {config.atmosphere.truncation_type}")