Orcaflex Post Processing

by vamseeachanta

skill

Post-process OrcaFlex simulation results using OPP (OrcaFlex Post-Process).

Skill Details

Repository Files

1 file in this skill directory


name: orcaflex-post-processing description: Post-process OrcaFlex simulation results using OPP (OrcaFlex Post-Process). Use for extracting summary statistics, linked statistics, range graphs, time series, histograms, and generating interactive HTML reports from .sim files. updated: '2026-01-07'

OrcaFlex Post-Processing Skill

Extract and analyze results from OrcaFlex simulation files (.sim) using the OPP (OrcaFlex Post-Process) module.

Version Metadata

version: 1.0.0
python_min_version: '3.10'
dependencies:
  orcaflex-modeling: '>=2.0.0,<3.0.0'
  signal-analysis: '>=1.0.0,<2.0.0'
orcaflex_version: '>=11.0'
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

  • Extracting summary statistics from simulation results
  • Creating range graphs for motion/load envelopes
  • Generating time series plots for specific variables
  • Computing linked statistics (correlations between variables)
  • Creating histogram distributions of results
  • Building interactive HTML dashboards from simulation data
  • Batch processing multiple .sim files in parallel

Prerequisites

  • OrcaFlex license (for reading .sim files)
  • Completed simulations in .sim/ directory
  • Python environment with digitalmodel package installed

Post-Processing Types

1. Summary Statistics

Extract min, max, mean, std dev for all monitored variables.

orcaflex:
  postprocess:
    summary:
      flag: true
      variables:
        - object: "Line1"
          variable_name: "Effective Tension"
        - object: "Vessel1"
          variable_name: "X"
      output_format: csv  # csv, json, or xlsx
      output_path: "results/summary/"

2. Linked Statistics

Compute correlations and linked values between variables.

orcaflex:
  postprocess:
    linked_statistics:
      flag: true
      primary_variable:
        object: "Line1"
        variable_name: "Effective Tension"
      linked_variables:
        - object: "Vessel1"
          variable_name: "Heave"
        - object: "Vessel1"
          variable_name: "Pitch"
      statistics: ["max_with_linked", "min_with_linked"]
      output_path: "results/linked_stats/"

3. Range Graphs

Generate envelope plots showing variable ranges.

orcaflex:
  postprocess:
    RangeGraph:
      flag: true
      objects:
        - name: "Line1"
          variables:
            - "Effective Tension"
            - "Bend Moment"
            - "Curvature"
      arc_length_range: [0, 500]  # meters
      output_format: html  # Interactive Plotly
      output_path: "results/range_graphs/"

4. Time Series

Extract and plot time-domain data.

orcaflex:
  postprocess:
    time_series:
      flag: true
      variables:
        - object: "Vessel1"
          variable_name: "X"
        - object: "Vessel1"
          variable_name: "Heave"
        - object: "Line1"
          variable_name: "End A X"
      time_range: [0, 3600]  # Start and end time (seconds)
      output_format: html
      output_path: "results/time_series/"

5. Histograms

Generate probability distributions.

orcaflex:
  postprocess:
    visualization:
      flag: true
      histogram:
        enabled: true
        variables:
          - object: "Line1"
            variable_name: "Effective Tension"
        bins: 50
        normalize: true  # Show as probability density
      output_path: "results/histograms/"

Python API

Basic Post-Processing

from digitalmodel.modules.orcaflex.opp import OrcaFlexPostProcess

# Initialize post-processor
opp = OrcaFlexPostProcess()

# Load configuration
cfg = {
    "orcaflex": {
        "postprocess": {
            "summary": {
                "flag": True,
                "variables": [
                    {"object": "Line1", "variable_name": "Effective Tension"}
                ]
            }
        }
    }
}

# Run post-processing
results = opp.post_process_router(cfg)

Batch Processing with Parallel Execution

from digitalmodel.modules.orcaflex.opp import OrcaFlexPostProcess
from concurrent.futures import ProcessPoolExecutor
from pathlib import Path

opp = OrcaFlexPostProcess()

# Get all .sim files
sim_files = list(Path("results/.sim/").glob("*.sim"))

# Process in parallel
with ProcessPoolExecutor(max_workers=4) as executor:
    futures = []
    for sim_file in sim_files:
        future = executor.submit(opp.process_single_file, sim_file)
        futures.append(future)

    # Collect results
    for future in futures:
        result = future.result()
        print(f"Processed: {result['file_name']}")

Extract Specific Results

from digitalmodel.modules.orcaflex.orcaflex_utilities import OrcaflexUtilities

utils = OrcaflexUtilities()

# Load simulation
model, metadata = utils.get_model_and_metadata("simulation.sim")

# Get time history
line = model["Line1"]
tension = line.TimeHistory("Effective Tension", period=None)

# Get range graph data
range_data = line.RangeGraph("Effective Tension")

# Get statistics
stats = line.StaticResult("Effective Tension")

Configuration Examples

Complete Post-Processing Configuration

basename: mooring_analysis

orcaflex:
  postprocess:
    # Summary statistics for all key variables
    summary:
      flag: true
      variables:
        - object: "Line1"
          variable_name: "Effective Tension"
        - object: "Line1"
          variable_name: "Bend Moment"
        - object: "Vessel1"
          variable_name: "X"
        - object: "Vessel1"
          variable_name: "Y"
        - object: "Vessel1"
          variable_name: "Z"
        - object: "Vessel1"
          variable_name: "Rotation 1"
        - object: "Vessel1"
          variable_name: "Rotation 2"
        - object: "Vessel1"
          variable_name: "Rotation 3"
      output_format: csv

    # Linked statistics for tension correlation
    linked_statistics:
      flag: true
      primary_variable:
        object: "Line1"
        variable_name: "Effective Tension"
      linked_variables:
        - object: "Vessel1"
          variable_name: "Heave"
        - object: "Vessel1"
          variable_name: "Surge"
      statistics: ["max_with_linked", "min_with_linked", "correlation"]

    # Range graphs for line profiles
    RangeGraph:
      flag: true
      objects:
        - name: "Line1"
          variables:
            - "Effective Tension"
            - "Curvature"
        - name: "Line2"
          variables:
            - "Effective Tension"
      arc_length_range: null  # Full length
      percentiles: [1, 5, 50, 95, 99]

    # Time series for key motions
    time_series:
      flag: true
      variables:
        - object: "Vessel1"
          variable_name: "X"
        - object: "Vessel1"
          variable_name: "Heave"
      time_range: null  # Full simulation
      sample_rate: 0.1  # Every 0.1 seconds

    # Visualization options
    visualization:
      flag: true
      histogram:
        enabled: true
        bins: 100
      interactive: true
      theme: "plotly_white"

Minimal Quick Summary

orcaflex:
  postprocess:
    summary:
      flag: true
      output_format: csv
      output_path: "results/quick_summary.csv"

Output Formats

CSV Output

Object,Variable,Min,Max,Mean,StdDev,Units
Line1,Effective Tension,450.2,1823.5,892.3,234.1,kN
Line1,Bend Moment,0.0,125.4,45.2,28.9,kN.m
Vessel1,X,-15.2,12.8,-1.2,5.4,m

JSON Output

{
  "simulation": "mooring_case_001.sim",
  "results": [
    {
      "object": "Line1",
      "variable": "Effective Tension",
      "statistics": {
        "min": 450.2,
        "max": 1823.5,
        "mean": 892.3,
        "std": 234.1
      },
      "units": "kN"
    }
  ]
}

Interactive HTML

OPP generates interactive Plotly HTML reports with:

  • Zoomable time series
  • Hover tooltips with exact values
  • Legend toggling
  • Export to PNG/SVG
  • Responsive design

Parallel Processing Details

The OPP module uses ProcessPoolExecutor for efficient batch processing:

# From opp.py - parallel processing pattern
from concurrent.futures import ProcessPoolExecutor, as_completed

def process_sim_files_parallel(sim_files, cfg, max_workers=4):
    """Process multiple .sim files in parallel."""
    results = {}

    with ProcessPoolExecutor(max_workers=max_workers) as executor:
        future_to_file = {
            executor.submit(process_single_sim, f, cfg): f
            for f in sim_files
        }

        for future in as_completed(future_to_file):
            file_name = future_to_file[future]
            try:
                result = future.result()
                results[file_name] = result
            except Exception as e:
                results[file_name] = {"error": str(e)}

    return results

Variable Reference

Common Vessel Variables

Variable Description Units
X, Y, Z Position m
Rotation 1/2/3 Roll/Pitch/Yaw deg
Velocity Resultant velocity m/s
Acceleration Resultant acceleration m/s²

Common Line Variables

Variable Description Units
Effective Tension Tension including pressure effects kN
Wall Tension Tension at pipe wall kN
Bend Moment Bending moment kN.m
Curvature Line curvature 1/m
Torsion Moment Torsional moment kN.m
X, Y, Z Node position m

Common Buoy Variables

Variable Description Units
X, Y, Z Position m
Connection X Force Force in X kN
Connection Z Force Force in Z kN

Best Practices

Efficient Processing

  1. Use parallel processing for multiple .sim files
  2. Limit variables to only those needed
  3. Specify time ranges to reduce data volume
  4. Use CSV for data analysis, HTML for reporting

Data Organization

  1. Store summaries in results/summary/
  2. Store time series in results/time_series/
  3. Store range graphs in results/range_graphs/
  4. Use consistent naming: {case_name}_{variable_type}.{format}

Interactive Reports

  1. Always use Plotly for interactive HTML (mandatory per workspace standards)
  2. Include hover tooltips with values
  3. Add legend for multi-line plots
  4. Use consistent color schemes

Error Handling

Common Issues

  1. Missing .sim file

    if not Path(sim_file).exists():
        logger.error(f"Simulation file not found: {sim_file}")
    
  2. Invalid variable name

    try:
        data = line.TimeHistory(variable_name)
    except OrcFxAPI.OrcaFlexError as e:
        logger.warning(f"Variable not found: {variable_name}")
    
  3. Memory issues with large simulations

    • Process in chunks
    • Downsample time series
    • Release model after processing

Related Skills

References

  • OrcaFlex Results Documentation
  • OrcFxAPI Python Guide
  • Workspace HTML Reporting Standards: docs/modules/standards/HTML_REPORTING_STANDARDS.md

Related Skills

Attack Tree Construction

Build comprehensive attack trees to visualize threat paths. Use when mapping attack scenarios, identifying defense gaps, or communicating security risks to stakeholders.

skill

Grafana Dashboards

Create and manage production Grafana dashboards for real-time visualization of system and application metrics. Use when building monitoring dashboards, visualizing metrics, or creating operational observability interfaces.

skill

Matplotlib

Foundational plotting library. Create line plots, scatter, bar, histograms, heatmaps, 3D, subplots, export PNG/PDF/SVG, for scientific visualization and publication figures.

skill

Scientific Visualization

Create publication figures with matplotlib/seaborn/plotly. Multi-panel layouts, error bars, significance markers, colorblind-safe, export PDF/EPS/TIFF, for journal-ready scientific plots.

skill

Seaborn

Statistical visualization. Scatter, box, violin, heatmaps, pair plots, regression, correlation matrices, KDE, faceted plots, for exploratory analysis and publication figures.

skill

Shap

Model interpretability and explainability using SHAP (SHapley Additive exPlanations). Use this skill when explaining machine learning model predictions, computing feature importance, generating SHAP plots (waterfall, beeswarm, bar, scatter, force, heatmap), debugging models, analyzing model bias or fairness, comparing models, or implementing explainable AI. Works with tree-based models (XGBoost, LightGBM, Random Forest), deep learning (TensorFlow, PyTorch), linear models, and any black-box model

skill

Pydeseq2

Differential gene expression analysis (Python DESeq2). Identify DE genes from bulk RNA-seq counts, Wald tests, FDR correction, volcano/MA plots, for RNA-seq analysis.

skill

Query Writing

For writing and executing SQL queries - from simple single-table queries to complex multi-table JOINs and aggregations

skill

Pydeseq2

Differential gene expression analysis (Python DESeq2). Identify DE genes from bulk RNA-seq counts, Wald tests, FDR correction, volcano/MA plots, for RNA-seq analysis.

skill

Scientific Visualization

Meta-skill for publication-ready figures. Use when creating journal submission figures requiring multi-panel layouts, significance annotations, error bars, colorblind-safe palettes, and specific journal formatting (Nature, Science, Cell). Orchestrates matplotlib/seaborn/plotly with publication styles. For quick exploration use seaborn or plotly directly.

skill

Skill Information

Category:Skill
Last Updated:1/7/2026