Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Input Data Generation Overview

The input_data module provides classes and utilities for generating input data files for ocean models. It uses a registry-based framework similar to the source_data module, allowing extensible input generation through decorator-based registration.

Module Purpose

The input data generation process transforms prepared source datasets into model-ready input files:

Core Components

Base Class: InputData

Abstract base class defining the interface for input data generation:

class InputData:
    model_name: str
    grid_name: str
    start_date: Any
    end_date: Any
    input_data_dir: Path  # Output directory for input files
    
    def generate_all(self):
        """Generate all input files. Must be implemented by subclasses."""
        raise NotImplementedError

Key Features:

Registry System

Input generation steps are registered using the @register_input decorator:

@register_input(name="grid", order=10, label="Writing ROMS grid")
def _generate_grid(self, key: str = "grid", **kwargs):
    """Generate grid input file."""
    # Implementation...

Registry Components:

Execution Order: Steps are executed in order (lowest order value first):

ROMS-MARBL Implementation: RomsMarblInputData

The RomsMarblInputData class provides ROMS-MARBL specific input generation:

Key Attributes:

Workflow:

  1. Initialization: Builds input_list from model_spec.inputs, validates against registry

  2. Generation: generate_all() executes registered handlers in order

  3. Blueprint Updates: Each handler appends Resource objects to blueprint_elements

  4. Settings Updates: Handlers populate compile-time and run-time settings dictionaries

  5. Partitioning: Optional step to partition files across tiles

Input Generation Process

Step 1: Build Input List

The input_list is derived from model_spec.inputs:

Step 2: Execute Handlers

For each item in input_list:

  1. Look up handler in INPUT_REGISTRY

  2. Build input arguments from defaults + kwargs

  3. Resolve source paths via SourceData

  4. Call handler function

  5. Update blueprint and settings

Step 3: Source Resolution

Source blocks (e.g., {"name": "GLORYS"}) are resolved:

Step 4: Settings Population

Handlers populate settings dictionaries:

These settings are used later to render configuration templates.

Input Types

Grid (grid)

Initial Conditions (initial_conditions)

Surface Forcing (forcing.surface)

Boundary Forcing (forcing.boundary)

Tidal Forcing (forcing.tidal)

River Forcing (forcing.river)

CDR Forcing (cdr_forcing)

Blueprint Integration

Each input handler updates blueprint_elements, a subset of the blueprint containing:

Resource Objects: Each generated file is represented as a Resource object with:

Settings Integration

Handlers populate two settings dictionaries:

Compile-Time Settings (_settings_compile_time)

Run-Time Settings (_settings_run_time)

These settings are later merged with template defaults and used to render configuration files.

File Outputs

All input files are written to:

{input_data_dir}/{model_name}_{input_name}.nc

For example:

Usage Pattern

from cson_forge.input_data import RomsMarblInputData

# Create input data generator
input_gen = RomsMarblInputData(
    model_name="cson_roms-marbl_v0.1",
    grid_name="test-tiny",
    start_date=datetime(2012, 1, 1),
    end_date=datetime(2012, 1, 2),
    model_spec=model_spec,
    grid=grid,
    boundaries=boundaries,
    source_data=source_data,
    blueprint_dir=blueprint_dir,
    partitioning=partitioning,
)

# Generate all inputs
blueprint_elements, compile_time_settings, run_time_settings = input_gen.generate_all(
    clobber=False,
    partition_files=False,
    test=False
)

Integration with CstarSpecBuilder

The RomsMarblInputData class is used internally by CstarSpecBuilder.generate_inputs():

  1. Creates RomsMarblInputData instance

  2. Calls generate_all() to create input files

  3. Updates blueprint with blueprint_elements

  4. Merges settings dictionaries with template defaults

  5. Persists blueprint and settings to disk

This completes the POSTCONFIG stage of the workflow.