
repairing-geometry-issues
by gpt-cmdr
The RAS-Commander library provides a python API for automating HEC-RAS 6.x and accessing HDF data using Python, built with and driven by large language models.
SKILL.md
name: repairing-geometry-issues description: | Automated geometry repair using RasFixit and quality validation using RasCheck. Handles blocked obstructions, generates before/after visualizations, and creates audit trails. Use when fixing geometry errors, repairing obstructions, validating models, or ensuring FEMA compliance. Triggers: fix, repair, geometry, blocked obstruction, validate, check, RasCheck, RasFixit, FEMA, quality assurance, QA, overlapping, obstruction overlap, elevation envelope, geometry error. version: 2.0.0
Repairing Geometry Issues
Lightweight skill for navigating ras-commander's geometry checking and repair capabilities.
This skill provides quick navigation to primary sources for RasCheck (validation) and RasFixit (repair). Do not duplicate content from primary sources - this file serves as an index only.
Primary Sources (Read These First)
Quality Validation (RasCheck)
C:\GH\ras-commander\ras_commander\check\CLAUDE.md (262 lines)
- 5 comprehensive checks (NT, XS, Structure, Floodway, Profiles)
- FEMA/USACE standards implementation
- Custom thresholds and state-specific surcharge limits
- Report generation (HTML, CSV, JSON)
Automated Repair (RasFixit)
C:\GH\ras-commander\ras_commander\fixit\AGENTS.md (119 lines)
- Blocked obstruction repair algorithm
- 0.02-unit gap insertion requirement
- Elevation envelope details
- Module organization and patterns
Complete Workflows
C:\GH\ras-commander\examples\200_fixit_blocked_obstructions.ipynb
- RasFixit demonstration with visualizations
- Before/after comparison workflow
- Engineering review requirements
C:\GH\ras-commander\examples\300_quality_assurance_rascheck.ipynb
- RasCheck validation workflow
- Multi-check execution and reporting
- Custom threshold configuration
Quick Start Patterns
Check → Fix → Verify Workflow
from ras_commander import RasCheck, RasFixit
# 1. CHECK: Detect issues
results = RasCheck.run_all("01")
print(f"Errors: {results.get_error_count()}")
print(f"Warnings: {results.get_warning_count()}")
# 2. FIX: Repair blocked obstructions (if detected)
fix_results = RasFixit.fix_blocked_obstructions(
"model.g01",
backup=True, # ALWAYS create timestamped backup
visualize=True # ALWAYS generate verification PNGs
)
print(f"Fixed {fix_results.total_xs_fixed} cross sections")
# 3. VERIFY: Confirm repairs
verify_results = RasCheck.run_all("01")
Detection Only (Non-Destructive)
# Detect overlaps without modifying files
detect_results = RasFixit.detect_obstruction_overlaps("model.g01")
print(f"Cross sections with overlaps: {detect_results.total_xs_fixed}")
# Review affected stations
for msg in detect_results.messages:
print(f"RS {msg.station}: {msg.original_count} → {msg.fixed_count}")
Custom Validation Thresholds
from ras_commander.check import create_custom_thresholds
# Override FEMA defaults for stricter standards
custom = create_custom_thresholds({
'mannings_n.overbank_max': 0.150, # Stricter limit
'reach_length.max_length_ft': 2000.0, # More conservative
'floodway.surcharge_ft': 0.5, # USACE standard (vs 1.0 ft FEMA)
})
results = RasCheck.run_all("01", thresholds=custom)
State-Specific Standards
from ras_commander.check import get_state_surcharge_limit
# Use state-specific floodway surcharge limits
il_limit = get_state_surcharge_limit('IL') # Returns 0.1 ft (vs FEMA 1.0 ft)
results = RasCheck.run_all(
"01",
floodway_profile="Floodway",
surcharge=il_limit
)
Report Generation
from ras_commander.check import ReportMetadata
# Generate HTML report with metadata
metadata = ReportMetadata(
project_name=ras.project_name,
plan_number="01",
checked_by="Engineer Name"
)
results.to_html("validation_report.html", metadata=metadata)
# Export to CSV for Excel analysis
df = results.to_dataframe()
df.to_csv("validation_messages.csv", index=False)
Critical Technical Details
Blocked Obstruction Algorithm (Elevation Envelope)
Source: C:\GH\ras-commander\ras_commander\fixit\AGENTS.md (lines 40-60)
CRITICAL WARNING - 0.02-Unit Gap Requirement:
- HEC-RAS REQUIRES minimum 0.02-unit separation between adjacent obstructions
- This is a hard requirement in the HEC-RAS geometry preprocessor
- The gap size is defined in
obstructions.pyasGAP_SIZE = 0.02 - DO NOT modify this constant - changing it will cause preprocessing failures
Algorithm Steps:
- Collect critical stations: All start/end points of obstructions
- Maximum elevation wins: In overlap zones, use highest elevation (hydraulically conservative)
- Merge adjacent segments: Combine segments with same elevation
- Insert 0.02-unit gaps: Minimum separation where elevations differ
Example:
Original (overlapping):
Segment 1: 100.0 - 200.0 ft, elev 35.0
Segment 2: 150.0 - 250.0 ft, elev 36.0
Fixed (elevation envelope with 0.02 gap):
Segment 1: 100.0 - 150.0 ft, elev 35.0
Segment 2: 150.02 - 250.0 ft, elev 36.0 # 0.02 gap inserted
Fixed-Width FORTRAN Parsing
Source: C:\GH\ras-commander\ras_commander\fixit\AGENTS.md (lines 53-56)
- HEC-RAS geometry files use 8-character fixed-width columns
FIELD_WIDTH = 8constant must not be changed- Overflow handled with asterisks (
********) - Section terminators:
Bank Sta=,#XS Ineff=,#Mann=,XS Rating Curve=,XS HTab,Exp/Cntr=
When to Use This Skill
Use for:
- HEC-RAS geometry preprocessing failures
- FEMA/USACE model validation
- Fixing overlapping blocked obstructions
- Preparing models for peer review or submission
- FEMA Base Level Engineering (BLE) compliance
- Detecting Manning's n or cross section issues
- Validating structure (bridge/culvert) geometry
- Checking floodway surcharge limits
- Creating audit trails for engineering review
Don't use for:
- Simple file I/O operations (use basic ras-commander patterns)
- Model execution (use RasCmdr patterns)
- Data extraction (use HDF classes)
RasCheck Validation Categories
Source: C:\GH\ras-commander\ras_commander\check\CLAUDE.md (lines 13-60)
| Check Type | Function | Validates |
|---|---|---|
| NT Check | check_nt() | Manning's n, transition coefficients, land cover standards |
| XS Check | check_xs() | Cross section spacing, station ordering, reach lengths, bank stations |
| Structure Check | check_structures() | Bridges, culverts, inline weirs, low chord elevations, pier spacing |
| Floodway Check | check_floodways() | Surcharge limits, conveyance reduction, encroachment methods |
| Profiles Check | check_profiles() | WSE ordering, discharge consistency, critical depth transitions |
Run all checks:
results = RasCheck.run_all("01") # Executes all 5 checks
Run individual check:
# Get HDF path from plan
plan_row = ras.plan_df[ras.plan_df['plan_number'] == "01"].iloc[0]
geom_hdf = Path(plan_row['Geom Path']).with_suffix('.hdf')
# Run specific check
nt_results = RasCheck.check_nt(geom_hdf)
xs_results = RasCheck.check_xs(geom_hdf)
RasFixit Repair Capabilities
Source: C:\GH\ras-commander\ras_commander\fixit\AGENTS.md (complete file)
Current Fix Types:
fix_blocked_obstructions()- Repair overlapping/adjacent blocked obstructionsdetect_obstruction_overlaps()- Non-destructive detection only
Fix Results:
# FixResults dataclass contains:
# - total_xs_checked: Cross sections scanned
# - total_xs_fixed: Cross sections modified
# - messages: List of FixMessage objects
# - backup_path: Path to timestamped backup
# - visualization_folder: Path to PNG folder
# FixMessage contains:
# - station: River station (e.g., "12345.67")
# - action: FixAction enum (OVERLAP_RESOLVED, GAP_INSERTED, etc.)
# - original_data: List of original (start, end, elev) tuples
# - fixed_data: List of fixed (start, end, elev) tuples
# - original_count: Number of original obstructions
# - fixed_count: Number of fixed obstructions
Export to DataFrame:
df = fix_results.to_dataframe()
df.to_csv("obstruction_fixes.csv", index=False)
Engineering Review Requirements
CRITICAL: All automated fixes MUST be reviewed by a licensed professional engineer before use in production models.
Required Documentation
- Timestamped backups: Always use
backup=True - Before/after visualizations: Always use
visualize=True - Audit trail: Export
FixResults.to_dataframe()to CSV - Algorithm documentation: Include elevation envelope algorithm description
Verification Steps
- Visual inspection: Review all PNG visualizations
- Compare hydraulics: Run model with original and fixed geometry
- Spot check: Manually verify critical cross sections in HEC-RAS GUI
- Professional judgment: Ensure fixes align with engineering intent
Module Organization
RasCheck (check subpackage)
check/
├── __init__.py # Exports RasCheck, CheckMessage, etc.
├── RasCheck.py # Main static class (448 KB)
├── messages.py # CheckMessage templates (106 KB)
├── report.py # Report generation (23 KB)
├── thresholds.py # CheckThresholds configuration (18 KB)
└── CLAUDE.md # Primary source documentation (262 lines)
RasFixit (fixit subpackage)
fixit/
├── __init__.py # Exports RasFixit, FixResults, FixMessage, FixAction
├── RasFixit.py # Main static class with fix methods
├── obstructions.py # BlockedObstruction and elevation envelope algorithm
├── results.py # FixAction enum, FixMessage, FixResults dataclasses
├── visualization.py # Lazy-loaded matplotlib PNG generation
├── log_parser.py # HEC-RAS compute log parsing
└── AGENTS.md # Primary source documentation (119 lines)
Common Issues and Solutions
Issue: Geometry preprocessing fails with obstruction errors
# 1. Detect obstructions
results = RasFixit.detect_obstruction_overlaps("model.g01")
if results.total_xs_fixed > 0:
# 2. Fix obstructions
fix_results = RasFixit.fix_blocked_obstructions(
"model.g01",
backup=True,
visualize=True
)
print(f"Fixed {fix_results.total_xs_fixed} cross sections")
Issue: FEMA validation warnings
# Run validation and generate report
results = RasCheck.run_all("01")
results.to_html("fema_validation.html")
# Address errors (severity=ERROR)
df = results.to_dataframe()
errors = df[df['severity'] == 'ERROR']
print(errors[['station', 'message']])
Issue: Manning's n out of range
# Run NT check
nt_results = RasCheck.check_nt(geom_hdf)
df = nt_results.to_dataframe()
# Filter Manning's n issues
n_issues = df[df['message_id'].str.startswith('NT_RC')]
print(n_issues[['station', 'message']])
Issue: Cross section spacing too large
# Run XS check with custom threshold
custom = create_custom_thresholds({
'reach_length.max_length_ft': 1500.0 # More conservative
})
xs_results = RasCheck.check_xs(geom_hdf, thresholds=custom)
Log Parsing for Automated Workflows
Source: C:\GH\ras-commander\ras_commander\fixit\AGENTS.md (line 18)
from ras_commander.fixit import log_parser
# Parse HEC-RAS compute log
with open("compute.log", 'r') as f:
log_content = f.read()
# Detect obstruction errors
if log_parser.has_obstruction_errors(log_content):
errors = log_parser.detect_obstruction_errors(log_content)
stations = log_parser.extract_cross_section_ids(log_content)
# Generate error report
report = log_parser.generate_error_report(errors)
print(report)
Performance Characteristics
RasCheck:
- Typical 1D model: 5-15 seconds
- Large 2D model: 30-60 seconds
- Low memory footprint (suitable for 10,000+ cross sections)
- Parallel checking supported for multiple plans
RasFixit:
- < 1 second per cross section repair
- Visualization: 2-3 seconds per PNG (optional)
Navigation Map
For validation questions → Read C:\GH\ras-commander\ras_commander\check\CLAUDE.md
For repair questions → Read C:\GH\ras-commander\ras_commander\fixit\AGENTS.md
For workflow examples → See notebooks:
examples\200_fixit_blocked_obstructions.ipynbexamples\300_quality_assurance_rascheck.ipynb
For API details → Read source code docstrings:
ras_commander\check\RasCheck.pyras_commander\fixit\RasFixit.py
Related Skills
- quality-assurance subagent:
.claude\agents\quality-assurance\SUBAGENT.md - Testing approach:
.claude\rules\testing\tdd-approach.md
State-Specific Floodway Surcharge Limits
Source: C:\GH\ras-commander\ras_commander\check\CLAUDE.md (lines 198-220)
States with non-standard surcharge limits (vs FEMA default 1.0 ft):
- IL: 0.1 ft
- WI: 0.0 ft (no surcharge allowed)
- MN: 0.5 ft
- NJ: 0.2 ft
- MI, IN, OH: 0.5 ft
- Default (TX, most states): 1.0 ft
from ras_commander.check import get_state_surcharge_limit
# Get state-specific limit
limit = get_state_surcharge_limit('IL') # Returns 0.1
results = RasCheck.run_all("01", surcharge=limit)
Total Lines: ~390 (target: 300-400)
Primary sources contain: 262 + 119 = 381 lines of authoritative documentation This skill: Lightweight index with critical warnings and navigation guidance
Score
Total Score
Based on repository quality metrics
SKILL.mdファイルが含まれている
ライセンスが設定されている
100文字以上の説明がある
GitHub Stars 100以上
3ヶ月以内に更新がある
10回以上フォークされている
オープンIssueが50未満
プログラミング言語が設定されている
1つ以上のタグが設定されている
Reviews
Reviews coming soon