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.mdsource 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:
-
Convert AQWA outputs to OrcaFlex format
- Parse AQWA .LIS diffraction analysis files
- Export to OrcaFlex-compatible YAML and CSV
-
Handle QTF (second-order forces) data
- Parse QTF files for sum/difference frequency forces
- Export QTF to OrcaFlex format
-
Convert mesh formats
- Convert between GDF (WAMIT), DAT (AQWA/NEMOH), STL formats
- Validate mesh quality
-
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
| Class | Purpose |
|---|---|
| Parse AQWA .LIS files |
| Parse QTF second-order force files |
| Convert to OrcaFlex format |
| WAMIT GDF mesh format |
| AQWA/NEMOH DAT mesh format |
| STL mesh format |
| Validate coefficient matrices |
| Kramers-Kronig validation |
Data Models
| Model | Description |
|---|---|
| Solver name, version, water depth, vessel info |
| QTF coefficients with frequency pairs |
| Vertices, panels, normals, areas |
| Panel statistics and quality score |
| Conversion operation result |
Best Practices
-
Always validate before conversion
report = validate_coefficients(results, strict=True) if not report.is_valid: raise ValueError(f"Invalid coefficients: {report.errors}") -
Check mesh quality before use
report = handler.validate_mesh(mesh) if report.quality_score < 70: print("Warning: Low mesh quality") -
Use native parsers for reliability
- Native Python parsers don't require BEMRosetta executable
- BEMRosetta executable provides extended features when available
-
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