Agent skill

hecras_compute_plans

Executes HEC-RAS plans using RasCmdr.compute_plan(), handles parallel execution across multiple plans, manages destination folders, and monitors real-time progress with callbacks. Use when running HEC-RAS simulations, computing plans, executing models, parallel workflows, setting up distributed computation, batch processing, scenario analysis, or monitoring execution progress in real-time. Triggers: execute, run, compute, HEC-RAS, plan, simulation, parallel, callback, batch, scenario, destination folder, worker, monitoring, progress, real-time.

Stars 163
Forks 31

Install this agent skill to your Project

npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/data/hecras-compute-plans-gpt-cmdr-ras-commander

SKILL.md

Executing HEC-RAS Plans

This skill helps you execute HEC-RAS plans using ras-commander. It serves as a navigator to primary sources containing comprehensive documentation and working examples.

Primary Sources

1. Execution Patterns (CLAUDE.md)

Location: C:\GH\ras-commander\ras_commander\CLAUDE.md

See sections:

  • "Plan Execution" - Core execution methods and parameters
  • "Execution Modes" - Four modes: single, parallel, sequential, remote
  • "Plan Execution Parameters" - Complete parameter reference
  • "Common Workflow Pattern" - Initialize → Execute → Extract

Key execution modes:

python
# Single plan
RasCmdr.compute_plan("01", dest_folder="run1", num_cores=4)

# Parallel local
RasCmdr.compute_parallel(["01", "02", "03"], max_workers=3)

# Sequential test
RasCmdr.compute_test_mode(["01", "02"])

2. Working Examples (Jupyter Notebooks)

Core execution notebooks:

  • examples/110_single_plan_execution.ipynb - Complete single plan workflow
  • examples/111_executing_plan_sets.ipynb - Plan sets and batch processing
  • examples/112_sequential_plan_execution.ipynb - Test mode execution
  • examples/113_parallel_execution.ipynb - Parallel execution with performance analysis

Advanced workflows:

  • examples/500_remote_execution_psexec.ipynb - Distributed execution
  • Real-time monitoring examples (search for stream_callback usage)

3. Code Documentation (Docstrings)

Location: C:\GH\ras-commander\ras_commander\RasCmdr.py

Read docstrings for:

  • RasCmdr.compute_plan() - Lines 139-250+ (comprehensive parameter docs)
  • RasCmdr.compute_parallel() - Parallel execution details
  • RasCmdr.compute_test_mode() - Sequential debugging mode

Callback protocol: C:\GH\ras-commander\ras_commander\callbacks.py

  • ExecutionCallback - Protocol definition
  • ConsoleCallback, FileLoggerCallback, ProgressBarCallback - Implementations

Quick Reference

Single Plan Execution

Basic pattern:

python
from ras_commander import init_ras_project, RasCmdr

# Initialize
init_ras_project(r"C:\Models\MyProject", "6.6")

# Execute
RasCmdr.compute_plan("01")

With destination folder (preserves original):

python
RasCmdr.compute_plan("01", dest_folder="computation_folder")

With monitoring:

python
from ras_commander.callbacks import ConsoleCallback

RasCmdr.compute_plan(
    "01",
    stream_callback=ConsoleCallback(verbose=True)
)

Key parameters:

  • plan_number - "01", "02", etc. (use strings)
  • dest_folder - None = in-place, path = separate folder
  • num_cores - CPU cores to use (None = plan default)
  • clear_geompre - True after geometry changes
  • verify - True to check completion
  • skip_existing - True to resume interrupted runs
  • stream_callback - Real-time monitoring object

Parallel Execution

Execute multiple plans:

python
# All plans with 3 workers
RasCmdr.compute_parallel(max_workers=3, num_cores=2)

# Specific plans
RasCmdr.compute_parallel(
    plans_to_run=["01", "02", "03"],
    max_workers=3,
    num_cores=2
)

Worker allocation:

  • max_workers - Parallel plan executions
  • num_cores - Cores per plan
  • Total cores used = max_workers × num_cores
  • Optimal: 2-4 cores per worker, workers ≤ physical cores / num_cores

Sequential Test Mode

For debugging:

python
# Run plans one at a time in test folder
RasCmdr.compute_test_mode(["01", "02", "03"])

Difference from parallel:

  • ONE plan at a time (not simultaneous)
  • Single test folder (not multiple workers)
  • Easier to debug issues

Mode Selection Guide

Use this decision matrix to select the appropriate execution mode:

Scenario Recommended Mode Rationale
Single plan, need full control compute_plan() Direct control, callback monitoring, parameter tuning
Single plan, quick run compute_plan() Simplest API, minimal overhead
Multiple plans, debugging issues compute_test_mode() Sequential execution, single folder, easier diagnosis
Multiple plans, production runs compute_parallel() Fastest throughput, worker isolation, parallel HDF writes
Distributed across machines compute_parallel_remote() Scale-out to multiple computers
HEC-RAS 3.x-5.x legacy RasControl COM-based automation (see rascontrol documentation)
Resume interrupted batch compute_parallel(..., skip_existing=True) Skips completed plans
Scenario comparison study compute_parallel() with dest_folder Each scenario in separate folder

Quick Decision Tree:

  1. How many plans? Single → compute_plan(), Multiple → continue
  2. Debugging? Yes → compute_test_mode(), No → continue
  3. Multiple machines? Yes → compute_parallel_remote(), No → compute_parallel()

See: .claude/rules/hec-ras/execution.md for complete mode documentation.

Orchestrator Integration

Workflow: Inspector → Execute → Analyze

For complex projects, chain execution with inspection and analysis:

1. Project Inspector → Understand project structure
2. Mode Selection   → Choose execution approach
3. Execute          → Run plans
4. Results Analyst  → Interpret outputs

Integration with Project Inspector

Before executing unfamiliar projects, gather intelligence:

python
# Step 1: Inspect project (via hecras-project-inspector agent or manual)
# - Get plan count and types
# - Identify dependencies between plans
# - Check geometry complexity (1D vs 2D vs mixed)
# - Review execution recommendations

# Step 2: Based on inspection, select mode
# Example: Inspector finds 5 independent 2D plans
plans = ["01", "02", "03", "04", "05"]
mode = "compute_parallel"  # Independent plans → parallel

# Step 3: Execute with appropriate parameters
RasCmdr.compute_parallel(
    plans_to_run=plans,
    max_workers=3,      # Based on system resources
    num_cores=4,        # 2D models benefit from multiple cores
    verify=True
)

# Step 4: Dispatch to results analysis
# - Extract WSE, velocity, depth from HDF files
# - Generate comparison plots
# - Create summary report

Chaining with Other Skills

Execution typically follows these upstream skills:

  • hecras_parse_geometry → After geometry modifications
  • dss_read_boundary-data → After validating boundary conditions
  • usgs_integrate_gauges → After setting up gauge-based boundaries

Execution typically precedes these downstream skills:

  • hecras_extract_results → Parse HDF outputs
  • Results visualization → Generate plots and maps
  • Validation workflows → Compare to observed data

Multi-Project Orchestration

For workflows spanning multiple HEC-RAS projects:

python
from ras_commander import RasPrj, init_ras_project, RasCmdr

# Create separate project contexts
projects = {}
for project_name in ["upstream", "downstream", "tributary"]:
    projects[project_name] = RasPrj()
    init_ras_project(
        f"C:/Models/{project_name}",
        "6.6",
        ras_object=projects[project_name]
    )

# Execute in dependency order
RasCmdr.compute_plan("01", ras_object=projects["upstream"])
RasCmdr.compute_plan("01", ras_object=projects["tributary"])
RasCmdr.compute_plan("01", ras_object=projects["downstream"])

Critical: Pass ras_object when working with multiple projects. See .claude/rules/python/ras-commander-patterns.md for context object discipline.

Common Patterns

Pattern: Preserve Original Project

python
# Run in separate folder, leave original untouched
RasCmdr.compute_plan(
    "01",
    dest_folder="results/run_2024_12_11",
    overwrite_dest=True,
    verify=True
)

Pattern: Geometry Modification Workflow

python
from ras_commander.RasGeo import RasGeo

# Modify geometry
RasGeo.update_mannings_n(geom_file="g01", landcover_map={...})

# Run with forced reprocessing
RasCmdr.compute_plan("01", clear_geompre=True)  # CRITICAL

Pattern: Batch Scenario Processing

python
scenarios = {
    "baseline": {"plan": "01", "dest": "output/baseline"},
    "mitigation": {"plan": "02", "dest": "output/mitigation"},
}

for name, config in scenarios.items():
    RasCmdr.compute_plan(
        config["plan"],
        dest_folder=config["dest"],
        verify=True
    )

Pattern: Skip Already Completed

python
# Resume interrupted batch run
for plan in ["01", "02", "03"]:
    RasCmdr.compute_plan(
        plan,
        skip_existing=True,  # Skip if already complete
        verify=True
    )

Real-Time Monitoring

Console Output

python
from ras_commander.callbacks import ConsoleCallback

callback = ConsoleCallback(verbose=True)
RasCmdr.compute_plan("01", stream_callback=callback)

Output example:

[Plan 01] Starting execution...
[Plan 01] Geometry Preprocessor Version 6.6
[Plan 01] Computing Plan: 01
[Plan 01] SUCCESS in 45.2s

File Logging

python
from ras_commander.callbacks import FileLoggerCallback
from pathlib import Path

callback = FileLoggerCallback(output_dir=Path("logs"))
RasCmdr.compute_plan("01", stream_callback=callback)
# Creates: logs/plan_01_execution.log

Progress Bar

python
from ras_commander.callbacks import ProgressBarCallback

# Requires: pip install tqdm
callback = ProgressBarCallback()
RasCmdr.compute_plan("01", stream_callback=callback)

Custom Callback

python
from ras_commander.callbacks import ExecutionCallback

class AlertCallback(ExecutionCallback):
    def on_exec_complete(self, plan_number: str, success: bool, duration: float):
        send_email(subject=f"Plan {plan_number} {'SUCCESS' if success else 'FAILED'}")

RasCmdr.compute_plan("01", stream_callback=AlertCallback())

Available callback methods (all optional):

  • on_prep_start() - Before geometry preprocessing
  • on_prep_complete() - After preprocessing
  • on_exec_start() - HEC-RAS subprocess starts
  • on_exec_message() - Each .bco file message (real-time)
  • on_exec_complete() - Execution finishes
  • on_verify_result() - After verification (if verify=True)

Thread safety: Use SynchronizedCallback wrapper for parallel execution

Verification

Return Value Check

python
success = RasCmdr.compute_plan("01", verify=True)
if not success:
    print("Execution failed or incomplete")

Parse Compute Messages

python
from ras_commander.hdf import HdfResultsPlan

messages = HdfResultsPlan.get_compute_messages("01")
if "Complete Process" in messages:
    print("Success!")

Validate Results

python
wse = HdfResultsPlan.get_wse("01", time_index=-1)
if wse is not None:
    print(f"WSE range: {wse.min():.2f} to {wse.max():.2f} ft")

Performance Optimization

Setting Recommendation When
clear_geompre=False 2x-10x faster Geometry unchanged
clear_geompre=True Required After ANY geometry edit
num_cores=2-4 Best balance Most models
num_cores=1-2 Highest efficiency Resource-limited

See: .claude/rules/hec-ras/execution.md for detailed performance guidance.

Troubleshooting

Plan doesn't execute - Check: init_ras_project() called? Plan in ras.plan_df? HEC-RAS installed? Write permissions?

HDF not created - Enable ConsoleCallback(verbose=True), check compute messages, try HEC-RAS GUI manually.

Debug command:

python
from ras_commander import ras
print(f"Project: {ras.project_folder}")
print(f"RAS: {ras.ras_exe_path}")
print(ras.plan_df)

Remember: This skill is a navigator. For detailed documentation, comprehensive examples, and complete API reference, always consult the Primary Sources section above.

Didn't find tool you were looking for?

Be as detailed as possible for better results