| name | hydrodynamics |
| description | Manage hydrodynamic coefficients, wave spectra, and environmental loading for vessel response analysis. Use for 6×6 matrix management, wave spectrum modeling, OCIMF loading calculations, and RAO interpolation. |
| updated | 2026-01-07 |
Hydrodynamics Skill
Manage hydrodynamic coefficients, wave spectra, and environmental loading for vessel and floater response analysis.
Version Metadata
version: 1.0.0
python_min_version: '3.10'
compatibility:
tested_python:
- '3.10'
- '3.11'
- '3.12'
- '3.13'
os:
- Windows
- Linux
- macOS
Changelog
[1.0.0] - 2026-01-07
Added:
- Initial version metadata and dependency management
- Semantic versioning support
- Compatibility information for Python 3.10-3.13
Changed:
- Enhanced skill documentation structure
When to Use
- 6×6 added mass and damping matrix management
- Wave spectrum modeling (JONSWAP, Bretschneider, PM)
- OCIMF wind and current loading calculations
- RAO interpolation and frequency-dependent coefficients
- Hydrodynamic coefficient database management
- Kramers-Kronig causality validation
Prerequisites
- Python environment with
digitalmodel package installed
- Hydrodynamic coefficient data (from AQWA, WAMIT, etc.)
- Environmental data for wave/wind/current loading
Analysis Types
1. Coefficient Database Management
Store and retrieve hydrodynamic coefficients.
hydrodynamics:
coefficient_database:
flag: true
vessel_name: "FPSO"
source_file: "data/hydro_coefficients.json"
coefficients:
- added_mass
- damping
- wave_excitation
output:
database_file: "results/coefficient_db.json"
2. Wave Spectra Modeling
Generate and analyze wave spectra.
hydrodynamics:
wave_spectra:
flag: true
spectrum_type: "jonswap"
parameters:
hs: 3.5
tp: 10.0
gamma: 3.3
frequency_range:
min: 0.02
max: 0.5
n_points: 100
output:
spectrum_file: "results/wave_spectrum.csv"
plot_file: "results/spectrum_plot.html"
3. OCIMF Environmental Loading
Calculate wind and current loads per OCIMF guidelines.
hydrodynamics:
ocimf_loading:
flag: true
vessel:
length: 300.0
beam: 50.0
draft: 20.0
displacement: 200000
environment:
wind_speed: 25.0
wind_direction: 45.0
current_speed: 1.5
current_direction: 90.0
output:
loads_file: "results/ocimf_loads.json"
4. RAO Interpolation
Interpolate RAOs across frequencies and directions.
hydrodynamics:
rao_interpolation:
flag: true
input_raos: "data/vessel_raos.csv"
target_frequencies: [0.05, 0.1, 0.15, 0.2, 0.25]
target_directions: [0, 30, 60, 90, 120, 150, 180]
method: "cubic"
output:
interpolated_file: "results/interpolated_raos.csv"
5. Displacement RAO Quality Checks
Validate displacement RAO data for physical correctness and consistency.
hydrodynamics:
rao_quality_check:
flag: true
input_file: "data/vessel_raos.yml"
vessel_type: auto
tolerances:
amplitude: 0.05
phase: 10.0
checks:
- long_period_phase
- peak_detection
- vessel_type_detection
output:
html_report: "reports/rao_qa/quality_report.html"
csv_summary: "reports/rao_qa/quality_summary.csv"
Quality Checks:
- Long Period Phase: Validates phase angles approach expected values as period → infinity (Orcina convention)
- Peak Detection: Identifies resonance peaks and validates against vessel type natural period ranges
- Vessel Type Detection: Auto-detects vessel type from RAO characteristics with confidence score
- Active DOF Validation: Checks appropriate DOFs are active for each wave heading
Python API
Coefficient Database
from digitalmodel.modules.hydrodynamics.coefficient_database import CoefficientDatabase
db = CoefficientDatabase()
db.store(
vessel_name="FPSO",
frequency=0.1,
added_mass=added_mass_matrix,
damping=damping_matrix
)
A, B = db.get_matrices(vessel_name="FPSO", frequency=0.1)
frequencies = db.get_frequencies("FPSO")
Frequency-Dependent Matrices
from digitalmodel.modules.hydrodynamics.freq_dependent import FrequencyDependentMatrix
fdm = FrequencyDependentMatrix()
fdm.load("hydro_data.json")
A_interp = fdm.interpolate_added_mass(frequency=0.15)
B_interp = fdm.interpolate_damping(frequency=0.15)
A_inf = fdm.get_infinite_frequency_added_mass()
Wave Spectra
from digitalmodel.modules.hydrodynamics.wave_spectra import WaveSpectra
spectrum = WaveSpectra()
frequencies, S = spectrum.jonswap(
hs=3.5,
tp=10.0,
gamma=3.3,
freq_min=0.02,
freq_max=0.5,
n_points=100
)
freq, S_pm = spectrum.pierson_moskowitz(hs=3.5, tp=10.0)
freq, S_bs = spectrum.bretschneider(hs=3.5, tp=10.0)
m0 = spectrum.spectral_moment(frequencies, S, n=0)
m2 = spectrum.spectral_moment(frequencies, S, n=2)
Tz = np.sqrt(m0/m2)
OCIMF Loading
from digitalmodel.modules.hydrodynamics.ocimf_loading import OCIMFLoading
ocimf = OCIMFLoading()
vessel = {
"length": 300.0,
"beam": 50.0,
"draft": 20.0,
"displacement": 200000
}
wind_load = ocimf.wind_load(
vessel=vessel,
wind_speed=25.0,
wind_direction=45.0
)
current_load = ocimf.current_load(
vessel=vessel,
current_speed=1.5,
current_direction=90.0
)
Coefficient Interpolation
from digitalmodel.modules.hydrodynamics.interpolator import CoefficientsInterpolator
interp = CoefficientsInterpolator()
interp.load_raos("vessel_raos.csv")
new_freqs = [0.05, 0.1, 0.15, 0.2]
interpolated = interp.interpolate_frequencies(new_freqs, method="cubic")
new_dirs = [0, 45, 90, 135, 180]
interpolated = interp.interpolate_directions(new_dirs)
Causality Validation
from digitalmodel.modules.hydrodynamics.validation import HydroValidator
validator = HydroValidator()
validator.load_coefficients("hydro_data.json")
kk_result = validator.kramers_kronig_check()
if not kk_result["passed"]:
print(f"Causality issues at: {kk_result['violations']}")
sym_check = validator.check_symmetry()
pd_check = validator.check_positive_definite()
Displacement RAO Quality Checks
import yaml
from digitalmodel.modules.marine_analysis import (
RAODataValidators,
VesselType,
DisplacementRAOQualityReport
)
from digitalmodel.modules.marine_analysis.rao_quality_report import RAOQualityReportGenerator
with open("vessel_raos.yml", 'r') as f:
rao_data = yaml.safe_load(f)
validators = RAODataValidators()
report = validators.validate_displacement_rao_quality(
rao_data,
source_file="vessel_raos.yml",
vessel_type=None,
amplitude_tolerance=0.05,
phase_tolerance=10.0
)
print(f"Vessel Type: {report.vessel_type.value}")
print(f"Confidence: {report.vessel_type_confidence:.1%}")
print(f"Overall Status: {report.overall_status}")
print(f"Pass Rate: {report.pass_rate:.1f}%")
print(f"Total/Passed/Warnings/Failed: {report.total_checks}/{report.passed_checks}/{report.warning_checks}/{report.failed_checks}")
for check in report.phase_checks:
check.status == :
()
check report.peak_checks:
()
generator = RAOQualityReportGenerator(output_dir=)
html_path = generator.generate_html_report(report, report_name=)
()
csv_path = generator.export_csv_summary(report, report_name=)
()
active_dofs = RAODataValidators.get_active_dofs_for_heading()
()
Wave Direction Convention:
- 0° = Head seas (waves from bow, approaching vessel)
- 90° = Beam seas from starboard
- 180° = Following seas (waves from stern)
- 270° = Beam seas from port
Expected Long Period Values (Orcina Convention):
| DOF | Head Seas (0°) | Beam Seas (90°) | Following (180°) |
|---|
| Surge | Amp=1.0, Phase=-90° | Inactive | Amp=1.0, Phase=90° |
| Sway | Inactive | Amp=1.0, Phase=-90° | Inactive |
| Heave | Amp=1.0, Phase=0° | Amp=1.0, Phase=0° | Amp=1.0, Phase=0° |
| Roll | Inactive | Amp=1.0, Phase=-90° | Inactive |
| Pitch | Amp=1.0, Phase=90° | Inactive | Amp=1.0, Phase=-90° |
| Yaw | Inactive | Inactive | Inactive |
Phase Convention Support:
PhaseConvention.ORCINA - Phase lag from wave crest (OrcaFlex, OrcaWave)
PhaseConvention.ISO_6954 - Phase lead over wave (AQWA, WAMIT)
- Auto-detection based on file extension (.yml → Orcina, .lis → ISO)
Key Classes
| Class | Purpose |
|---|
CoefficientDatabase | Coefficient storage and retrieval |
FrequencyDependentMatrix | 6×6 matrix interpolation |
WaveSpectra | Spectrum generation (JONSWAP, PM, etc.) |
OCIMFLoading | OCIMF wind/current calculations |
CoefficientsInterpolator | 2D interpolation (freq × direction) |
HydroValidator | Kramers-Kronig and matrix validation |
RAODataValidators | RAO quality checks (phase, peaks, vessel type) |
RAOQualityReportGenerator | HTML/CSV quality report generation |
Wave Spectrum Types
| Spectrum | Application |
|---|
| JONSWAP | Fetch-limited seas (North Sea) |
| Pierson-Moskowitz | Fully developed seas |
| Bretschneider | General two-parameter spectrum |
| ISSC | Modified Pierson-Moskowitz |
| Ochi-Hubble | Bimodal sea states |
Output Formats
Coefficient Database JSON
{
"vessel_name": "FPSO",
"frequencies_rad_s": [0.1, 0.2, 0.3],
"added_mass": {
"0.1": [[1.2e6, 0, 0, 0, 1.5e7, 0], ...],
"0.2": [[1.1e6, 0, 0, 0, 1.4e7, 0], ...]
},
"damping": {
"0.1" ...
...
Wave Spectrum CSV
frequency_rad_s,frequency_hz,period_s,spectral_density
0.314,0.050,20.0,0.123
0.628,0.100,10.0,2.456
0.942,0.150,6.67,1.234
Best Practices
- Frequency range - Cover full wave spectrum of interest (typically 0.02-0.5 rad/s)
- Direction convention - Use consistent direction convention (from/to, bow=0°)
- Unit consistency - Verify units (rad/s vs Hz, degrees vs radians)
- Causality check - Validate coefficients with Kramers-Kronig before use
- Matrix symmetry - Verify added mass symmetry for physical consistency
Related Skills
References
- DNV-RP-C205: Environmental Conditions and Environmental Loads
- OCIMF: Mooring Equipment Guidelines
- Newman, J.N.: Marine Hydrodynamics