Claude-skill-registry bemrosetta

BEMRosetta hydrodynamic coefficient converter - AQWA to OrcaFlex workflow with QTF and mesh support

install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/bemrosetta" ~/.claude/skills/majiayu000-claude-skill-registry-bemrosetta && rm -rf "$T"
manifest: skills/data/bemrosetta/SKILL.md
source content

BEMRosetta Integration Skill

Version

  • Skill Version: 1.0.0
  • Module Version: 1.0.0
  • Python: 3.11+
  • Dependencies: numpy, scipy, click, pydantic, loguru

Changelog

1.0.0 (2026-01-27)

  • Initial release
  • AQWA parser for .LIS files
  • QTF parser for second-order forces
  • OrcaFlex converter (YAML, CSV)
  • Mesh handlers (GDF, DAT, STL)
  • Coefficient and causality validators
  • Click-based CLI

When to Use

Use this skill when you need to:

  1. Convert AQWA outputs to OrcaFlex format

    • Parse AQWA .LIS diffraction analysis files
    • Export to OrcaFlex-compatible YAML and CSV
  2. Handle QTF (second-order forces) data

    • Parse QTF files for sum/difference frequency forces
    • Export QTF to OrcaFlex format
  3. Convert mesh formats

    • Convert between GDF (WAMIT), DAT (AQWA/NEMOH), STL formats
    • Validate mesh quality
  4. Validate hydrodynamic coefficients

    • Check matrix symmetry and positive definiteness
    • Verify Kramers-Kronig causality relations

Agent Capabilities

The BEMRosetta skill enables agents to:

Parsing

  • Parse AQWA .LIS files extracting RAOs, added mass, damping
  • Parse QTF files for second-order wave forces
  • Extract solver metadata (version, water depth, frequencies, headings)

Conversion

  • Convert to OrcaFlex vessel type YAML
  • Export coefficient CSV files
  • Export QTF data in OrcaFlex format

Mesh Processing

  • Read/write WAMIT GDF format
  • Read/write AQWA/NEMOH DAT format
  • Read/write STL format (ASCII and binary)
  • Calculate mesh quality metrics

Validation

  • Coefficient symmetry checks
  • Positive definiteness verification
  • Physical limits validation
  • Kramers-Kronig causality checking

Prerequisites

# Module is included in digitalmodel package
uv pip install -e .

# Verify installation
bemrosetta status

CLI Commands

# Convert AQWA to OrcaFlex
bemrosetta convert analysis.LIS -o ./output

# Convert with QTF data
bemrosetta convert analysis.LIS --qtf analysis.QTF -o ./output

# Display file information
bemrosetta info analysis.LIS

# Validate coefficients
bemrosetta validate analysis.LIS --strict --causality

# Convert mesh formats
bemrosetta convert-mesh input.gdf -o output.stl
bemrosetta convert-mesh input.dat -o output.gdf

# Validate mesh quality
bemrosetta validate-mesh hull.gdf --check-normals

# Show module status
bemrosetta status

Python API

Basic Workflow

from digitalmodel.modules.bemrosetta import (
    AQWAParser,
    OrcaFlexConverter,
    validate_coefficients,
)

# Parse AQWA results
parser = AQWAParser()
results = parser.parse("analysis.LIS")

# Access metadata
print(f"Vessel: {parser.metadata.vessel_name}")
print(f"Water depth: {parser.metadata.water_depth}")
print(f"Frequencies: {parser.metadata.frequency_count}")

# Validate coefficients
report = validate_coefficients(results, strict=True)
if not report.is_valid:
    print(f"Errors: {report.errors}")

# Convert to OrcaFlex format
converter = OrcaFlexConverter(output_dir="./output")
converter.convert(results)

QTF Handling

from digitalmodel.modules.bemrosetta import QTFParser, OrcaFlexConverter

# Parse QTF file
qtf_parser = QTFParser()
qtf_data = qtf_parser.parse("analysis.QTF")

print(f"QTF type: {qtf_data.qtf_type}")
print(f"Frequencies: {qtf_data.n_frequencies_1} x {qtf_data.n_frequencies_2}")

# Include QTF in conversion
converter = OrcaFlexConverter(output_dir="./output")
converter.set_qtf_data(qtf_data)
converter.convert(results)

Mesh Conversion

from digitalmodel.modules.bemrosetta import (
    GDFHandler, DATHandler, STLHandler, convert_mesh
)

# Read GDF mesh
handler = GDFHandler()
mesh = handler.read("hull.gdf")

# Check quality
report = handler.validate_mesh(mesh)
print(f"Panels: {report.n_panels}")
print(f"Quality score: {report.quality_score}/100")

# Convert to STL
convert_mesh("hull.gdf", "hull.stl")

Causality Validation

from digitalmodel.modules.bemrosetta import (
    CoefficientValidator,
    CausalityChecker,
)

# Coefficient validation
validator = CoefficientValidator(
    check_symmetry=True,
    check_positive_definite=True,
    tolerance=0.01,
)
report = validator.validate(results)

# Kramers-Kronig causality check
checker = CausalityChecker(tolerance=0.1)
kk_report = checker.validate(results)
for key, error in kk_report.info.items():
    if error and error > 0.1:
        print(f"Warning: {key} KK error = {error:.2%}")

Key Classes

ClassPurpose
AQWAParser
Parse AQWA .LIS files
QTFParser
Parse QTF second-order force files
OrcaFlexConverter
Convert to OrcaFlex format
GDFHandler
WAMIT GDF mesh format
DATHandler
AQWA/NEMOH DAT mesh format
STLHandler
STL mesh format
CoefficientValidator
Validate coefficient matrices
CausalityChecker
Kramers-Kronig validation

Data Models

ModelDescription
BEMSolverMetadata
Solver name, version, water depth, vessel info
QTFData
QTF coefficients with frequency pairs
PanelMesh
Vertices, panels, normals, areas
MeshQualityReport
Panel statistics and quality score
ConversionResult
Conversion operation result

Best Practices

  1. Always validate before conversion

    report = validate_coefficients(results, strict=True)
    if not report.is_valid:
        raise ValueError(f"Invalid coefficients: {report.errors}")
    
  2. Check mesh quality before use

    report = handler.validate_mesh(mesh)
    if report.quality_score < 70:
        print("Warning: Low mesh quality")
    
  3. Use native parsers for reliability

    • Native Python parsers don't require BEMRosetta executable
    • BEMRosetta executable provides extended features when available
  4. Handle missing data gracefully

    warnings = converter.validate_input(results)
    for w in warnings:
        logger.warning(w)
    

Integration with Other Modules

With diffraction module

from digitalmodel.modules.diffraction import OrcaFlexExporter
from digitalmodel.modules.bemrosetta import AQWAParser

# BEMRosetta uses diffraction module schemas
parser = AQWAParser()
results = parser.parse("analysis.LIS")  # Returns DiffractionResults

# Can use existing OrcaFlexExporter
exporter = OrcaFlexExporter(results, output_dir)
exporter.export_all()

With hydrodynamics module

from digitalmodel.modules.hydrodynamics import CoefficientDatabase

# Store parsed coefficients in database
db = CoefficientDatabase()
db.store(results.added_mass, results.damping)

Error Handling

from digitalmodel.modules.bemrosetta import (
    BEMRosettaError,
    ParserError,
    ConverterError,
    MeshError,
)

try:
    results = parser.parse("analysis.LIS")
except ParserError as e:
    print(f"Parse error: {e}")
    print(f"File: {e.context.get('file_path')}")
except BEMRosettaError as e:
    print(f"BEMRosetta error: {e}")

Related Skills

  • aqwa-analysis - AQWA .LIS processing and RAO extraction
  • orcawave-analysis - OrcaWave diffraction/radiation analysis
  • orcawave-to-orcaflex - OrcaWave to OrcaFlex conversion
  • orcaflex-rao-import - Multi-format RAO import
  • hydrodynamics - 6x6 matrices and wave spectra
  • diffraction-analysis - Master skill for diffraction workflows

References