Agent SkillsAgent Skills
vamseeachanta

bemrosetta

@vamseeachanta/bemrosetta
vamseeachanta
9
0 forks
Updated 3/31/2026
View on GitHub

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

Installation

$npx agent-skills-cli install @vamseeachanta/bemrosetta
Claude Code
Cursor
Copilot
Codex
Antigravity

Details

Path.claude/skills/bemrosetta/SKILL.md
Branchmain
Scoped Name@vamseeachanta/bemrosetta

Usage

After installing, this skill will be available to your AI coding assistant.

Verify installation:

npx agent-skills-cli list

Skill Instructions


name: bemrosetta description: BEMRosetta hydrodynamic coefficient converter - AQWA to OrcaFlex workflow with QTF and mesh support version: 1.0.0 updated: 2026-01-27 category: offshore-engineering triggers:

  • bemrosetta
  • hydrodynamic conversion
  • AQWA to OrcaFlex
  • coefficient converter
  • QTF conversion
  • mesh format conversion
  • GDF to STL
  • panel mesh
  • Kramers-Kronig
  • causality check

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.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.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.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.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
AQWAParserParse AQWA .LIS files
QTFParserParse QTF second-order force files
OrcaFlexConverterConvert to OrcaFlex format
GDFHandlerWAMIT GDF mesh format
DATHandlerAQWA/NEMOH DAT mesh format
STLHandlerSTL mesh format
CoefficientValidatorValidate coefficient matrices
CausalityCheckerKramers-Kronig validation

Data Models

ModelDescription
BEMSolverMetadataSolver name, version, water depth, vessel info
QTFDataQTF coefficients with frequency pairs
PanelMeshVertices, panels, normals, areas
MeshQualityReportPanel statistics and quality score
ConversionResultConversion 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.diffraction import OrcaFlexExporter
from digitalmodel.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.hydrodynamics import CoefficientDatabase

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

Error Handling

from digitalmodel.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