Skip to content
Back to skills

Bemrosetta

ASecurity

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

  • 666 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added February 8, 2026
toolspythongobashgitapidatabasedocumentation

Works with

  • cli
  • api

Security analysis

A96/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro shows the line behind each finding and how to fix it

Scanned February 12, 2026

npx -y skills add majiayu000/claude-skill-registry --skill bemrosetta --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Bemrosetta?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Bemrosetta
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/majiayu000-bemrosetta/badge)](https://www.skillsdirectory.com/skills/majiayu000-bemrosetta)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
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

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

# Verify installation
bemrosetta status
```

## CLI Commands

```bash
# 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

```python
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

```python
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

```python
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

```python
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 |
|-------|---------|
| `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

| Model | Description |
|-------|-------------|
| `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**
   ```python
   report = validate_coefficients(results, strict=True)
   if not report.is_valid:
       raise ValueError(f"Invalid coefficients: {report.errors}")
   ```

2. **Check mesh quality before use**
   ```python
   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**
   ```python
   warnings = converter.validate_input(results)
   for w in warnings:
       logger.warning(w)
   ```

## Integration with Other Modules

### With diffraction module
```python
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
```python
from digitalmodel.modules.hydrodynamics import CoefficientDatabase

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

## Error Handling

```python
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

- [BEMRosetta GitHub](https://github.com/BEMRosetta/BEMRosetta)
- [Module README](../../../src/digitalmodel/modules/bemrosetta/MODULE_README.md)
- [OrcaFlex Documentation](https://www.orcina.com/webhelp/OrcaFlex/)

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.