Agent skill
orcawave-damping-sweep
Viscous damping analysis specialist for OrcaWave. Handles parametric damping studies, roll damping optimization, critical damping calculations, and comparison with model test data for vessel motion tuning.
Stars
163
Forks
31
Install this agent skill to your Project
npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/data/orcawave-damping-sweep
SKILL.md
OrcaWave Damping Sweep Skill
Specialized expertise for parametric viscous damping studies and roll damping optimization in OrcaWave diffraction analysis.
Version Metadata
yaml
version: 1.0.0
python_min_version: '3.10'
dependencies:
numpy: '>=1.24.0'
scipy: '>=1.11.0'
plotly: '>=5.15.0'
orcawave_version: '>=11.0'
compatibility:
tested_python:
- '3.10'
- '3.11'
- '3.12'
- '3.13'
os:
- Windows
When to Use
- Parametric studies of viscous damping effects
- Roll damping coefficient optimization
- Comparing radiation damping with viscous damping
- Tuning damping to match model test data
- Estimating bilge keel damping contribution
- Critical damping ratio calculations
- Sensitivity analysis for motion predictions
- Roll resonance mitigation studies
Damping Components
Total Damping Composition
Total Damping = Radiation Damping + Viscous Damping + Appendage Damping
(from OrcaWave) (user input) (bilge keels, etc.)
Damping Sources
| Source | Type | Typical Contribution |
|---|---|---|
| Radiation | Linear | 10-30% of total roll damping |
| Skin friction | Nonlinear | 5-15% |
| Eddy making | Nonlinear | 20-40% |
| Bilge keels | Nonlinear | 40-60% |
| Appendages | Mixed | 5-10% |
Python API
Basic Damping Sweep
python
from digitalmodel.modules.orcawave.damping import DampingSweep
# Initialize sweep
sweep = DampingSweep()
# Load base model
sweep.load_model("models/fpso.owr")
# Define damping values to sweep
roll_damping_values = [0.02, 0.04, 0.06, 0.08, 0.10, 0.12, 0.15] # Fraction of critical
# Run sweep
results = sweep.run(
parameter="roll_damping",
values=roll_damping_values,
output_directory="results/damping_sweep/"
)
# Analyze results
analysis = sweep.analyze_sensitivity(results)
print(f"Roll RAO sensitivity to damping: {analysis['roll_rao_sensitivity']:.2f}")
# Plot results
sweep.plot_sweep_results(
results,
dof="roll",
output_file="plots/roll_damping_sweep.html"
)
Multi-Parameter Sweep
python
from digitalmodel.modules.orcawave.damping import MultiParameterDampingSweep
# Initialize multi-parameter sweep
sweep = MultiParameterDampingSweep()
# Load model
sweep.load_model("models/fpso.owr")
# Define parameter space
sweep.configure(
parameters={
"roll_damping": [0.03, 0.05, 0.07, 0.10],
"pitch_damping": [0.02, 0.03, 0.04, 0.05],
"heave_damping": [0.01, 0.02, 0.03]
}
)
# Run full factorial sweep
results = sweep.run_factorial(
output_directory="results/multi_param_sweep/"
)
# Find optimal combination
optimal = sweep.find_optimal(
results,
objective="minimize_peak_roll",
constraints={
"pitch_rao_limit": 2.0, # deg/m
"heave_rao_limit": 1.0 # m/m
}
)
print(f"Optimal roll damping: {optimal['roll_damping']:.2%}")
print(f"Optimal pitch damping: {optimal['pitch_damping']:.2%}")
Critical Damping Calculation
python
from digitalmodel.modules.orcawave.damping import CriticalDampingCalculator
# Initialize calculator
calc = CriticalDampingCalculator()
# Load model with mass and stiffness
calc.load_model("models/fpso.owr")
# Calculate critical damping for each DOF
critical = calc.compute_critical_damping()
for dof, value in critical.items():
print(f"{dof} critical damping: {value:.2e} N.s/m or N.m.s/rad")
# Get damping as percentage of critical
percent_critical = calc.damping_percent_critical(
actual_damping={
"roll": 5.0e8, # N.m.s/rad
"pitch": 8.0e9,
"heave": 2.0e7
}
)
for dof, pct in percent_critical.items():
print(f"{dof}: {pct:.1%} of critical")
Model Test Comparison
python
from digitalmodel.modules.orcawave.damping import ModelTestComparison
# Initialize comparison
comparison = ModelTestComparison()
# Load OrcaWave results
comparison.load_orcawave_results("results/fpso.owr")
# Load model test data
comparison.load_model_test_data(
"data/model_tests/roll_decay.csv",
format="decay_curve"
)
# Extract damping from decay tests
test_damping = comparison.extract_decay_damping(
method="logarithmic_decrement"
)
print(f"Model test roll damping: {test_damping['roll']:.1%} critical")
# Find matching OrcaWave damping
optimal_damping = comparison.match_damping(
dof="roll",
target_rao=test_damping['roll_rao'],
frequency=test_damping['roll_natural_freq']
)
print(f"Required viscous damping: {optimal_damping:.1%} critical")
# Generate comparison plot
comparison.plot_comparison(
output_file="plots/model_test_comparison.html"
)
Bilge Keel Estimation
python
from digitalmodel.modules.orcawave.damping import BilgeKeelDamping
# Initialize bilge keel damping estimator
bk = BilgeKeelDamping()
# Configure vessel parameters
bk.configure_vessel(
beam=50.0, # m
draft=22.0, # m
bilge_radius=3.0, # m
lpp=280.0 # m
)
# Configure bilge keels
bk.add_bilge_keel(
length=100.0, # m
height=1.5, # m
position_from_ap=90.0 # m from aft perpendicular
)
# Estimate damping contribution
bk_damping = bk.estimate_damping(
roll_amplitude=5.0, # degrees (nonlinear)
roll_period=12.0 # seconds
)
print(f"Bilge keel damping: {bk_damping['percent_critical']:.1%} critical")
print(f"Equivalent linear: {bk_damping['equivalent_linear']:.2e} N.m.s/rad")
# Sensitivity to roll amplitude
amplitude_study = bk.amplitude_sensitivity(
amplitudes=[2, 5, 10, 15, 20], # degrees
roll_period=12.0
)
Damping-Period Relationship
python
from digitalmodel.modules.orcawave.damping import DampingPeriodAnalyzer
# Analyze damping vs period relationship
analyzer = DampingPeriodAnalyzer()
# Load OrcaWave radiation damping results
analyzer.load_results("models/fpso.owr")
# Extract frequency-dependent radiation damping
rad_damping = analyzer.get_radiation_damping()
# Plot damping vs frequency
analyzer.plot_damping_spectrum(
rad_damping,
dofs=["roll", "pitch", "heave"],
output_file="plots/radiation_damping_spectrum.html"
)
# Identify peak damping frequencies
peaks = analyzer.find_damping_peaks()
for dof, freq in peaks.items():
print(f"{dof} peak radiation damping at {freq:.3f} rad/s")
# Compute integrated damping metrics
metrics = analyzer.compute_metrics(
frequency_range=(0.1, 0.8),
dofs=["roll"]
)
print(f"Roll average radiation damping: {metrics['roll']['average']:.2e}")
Configuration Examples
Damping Sweep Configuration
yaml
# configs/damping_sweep.yml
damping_sweep:
model: "models/fpso.owr"
parameters:
roll_damping:
type: "percent_critical"
values: [0.02, 0.04, 0.06, 0.08, 0.10, 0.12, 0.15]
pitch_damping:
type: "percent_critical"
values: [0.02, 0.03, 0.04, 0.05]
sweep_type: "factorial" # or "one_at_a_time"
analysis:
frequencies: "from_model" # Use frequencies from OrcaWave model
headings: [0, 45, 90, 135, 180]
metrics:
- "peak_rao"
- "rao_at_resonance"
- "significant_response"
output:
directory: "results/damping_sweep/"
plots: true
format: "html"
Model Test Comparison Configuration
yaml
# configs/model_test_comparison.yml
model_test_comparison:
orcawave_results: "results/fpso.owr"
model_test_data:
roll_decay: "data/roll_decay.csv"
pitch_decay: "data/pitch_decay.csv"
regular_wave_tests: "data/regular_waves.csv"
analysis:
decay_method: "logarithmic_decrement"
rao_comparison: true
damping_optimization:
dofs: ["roll", "pitch"]
objective: "minimize_rao_error"
bounds:
roll: [0.02, 0.20]
pitch: [0.01, 0.10]
output:
report: "reports/damping_calibration.html"
optimal_damping: "configs/calibrated_damping.yml"
CLI Usage
bash
# Run damping sweep
python -m digitalmodel.modules.orcawave.damping sweep \
--model models/fpso.owr \
--parameter roll_damping \
--values 0.02,0.04,0.06,0.08,0.10 \
--output results/roll_sweep/
# Multi-parameter sweep
python -m digitalmodel.modules.orcawave.damping multi-sweep \
--config configs/damping_sweep.yml \
--output results/multi_sweep/
# Calculate critical damping
python -m digitalmodel.modules.orcawave.damping critical \
--model models/fpso.owr \
--output critical_damping.csv
# Compare with model tests
python -m digitalmodel.modules.orcawave.damping compare \
--orcawave results/fpso.owr \
--model-test data/roll_decay.csv \
--output reports/comparison.html
# Estimate bilge keel damping
python -m digitalmodel.modules.orcawave.damping bilge-keel \
--beam 50.0 --draft 22.0 \
--bk-length 100.0 --bk-height 1.5 \
--roll-amplitude 5.0 --roll-period 12.0
# Extract radiation damping spectrum
python -m digitalmodel.modules.orcawave.damping spectrum \
--model models/fpso.owr \
--dofs roll,pitch,heave \
--output plots/damping_spectrum.html
Damping Recommendations
Typical Values by Vessel Type
| Vessel Type | Roll Damping (% critical) | Notes |
|---|---|---|
| FPSO | 5-10% | With bilge keels |
| Tanker | 3-8% | Varies with loading |
| Semi-submersible | 8-15% | Large radiation damping |
| Spar | 3-6% | Strake-dependent |
| Barge | 2-5% | Low damping |
By Loading Condition
| Condition | Typical Adjustment |
|---|---|
| Full load | Base value |
| Ballast | -20% to -30% |
| Partial load | -10% to -20% |
| Transit | +10% to +20% (hull exposure) |
OrcaWave API Properties
Damping-Related Properties
python
# Access damping data from OrcaWave model
import OrcFxAPI
model = OrcFxAPI.DiffractionModel("fpso.owr")
# Radiation damping (frequency-dependent)
rad_damping = model.damping # 6x6xNfreq array
# Extra roll damping (user-specified viscous)
extra_roll = model.extraRollDamping
# Roll damping as percent critical
roll_pct = model.rollDampingPercentCritical
# Hydrostatic stiffness (for critical damping calc)
stiffness = model.hydrostaticResults
Best Practices
- Start with Radiation: Analyze radiation damping before adding viscous
- Calibrate to Tests: Match damping to model test data when available
- Amplitude Effects: Remember bilge keel damping is amplitude-dependent
- Sensitivity Study: Always perform sensitivity analysis
- Document Assumptions: Record damping values and justification
- Conservative Design: Use lower damping for conservative motion estimates
- Frequency Range: Check damping at resonance frequencies
Error Handling
python
# Handle damping analysis errors
try:
sweep = DampingSweep()
sweep.load_model("models/fpso.owr")
results = sweep.run(parameter="roll_damping", values=[0.05, 0.10])
except DampingOutOfRangeError as e:
print(f"Damping value unrealistic: {e}")
# Typical range 1-20% critical
except NegativeDampingError as e:
print(f"Negative damping detected: {e}")
# Check model setup
except ConvergenceError as e:
print(f"Analysis did not converge: {e}")
# Reduce damping or check mesh
Related Skills
- orcawave-analysis - OrcaWave diffraction analysis
- orcawave-to-orcaflex - Export with damping
- hydrodynamics - Coefficient management
- viv-analysis - Vibration damping
References
- Himeno, Y.: Prediction of Ship Roll Damping - State of the Art
- Ikeda, Y.: Prediction Methods of Roll Damping of Ships
- OrcaWave Roll Damping Documentation
- Script:
scripts/python/digitalmodel/modules/run_orcawave_damping_sweep.py
Version History
- 1.0.0 (2026-01-17): Initial release with damping sweep, model test comparison, and bilge keel estimation
Didn't find tool you were looking for?