SEAHOWL is a time-domain multi-physics simulation framework written in C++ and primarily developed for wind turbine analysis.
Main features of SEAHOWL:
- Monolithic coupling of structural dynamics through Project Chrono for multibody and finite element problems
- Partitioned coupling for multi-physics interaction for easy switching between individual physics solver
- Modular by design, easily adaptable for innovative or non-conventional aeroelastic applications
- Extensive Python bindings for controlling the simulation workflow and interact with subcomponents at runtime
- For precompiled binaries (including Python bindings), check the Releases section of this project on GitHub to see if a zipped version is available for your OS.
- For the full installation and compilation process, refer to INSTALL.md.
seahowl/
├── src/ # Source files (.cpp)
│ ├── core/ # Turbine components, simulation orchestration
│ ├── elasto/ # Elastodynamics (multibody, finite elements, etc)
│ ├── fluid/
│ │ ├── aero/ # Aerodynamics (BEMT, actuator disk, etc)
│ │ └── hydro/ # Hydrodynamics (Morison, potential flow, etc)
│ ├── env/ # Environmental models (wind, waves, soil, etc)
│ ├── servo/ # Servodynamics (control systems, DISCON)
│ ├── io/ # I/O, configuration, output management
│ ├── commons/ # Shared utilities and base classes
│ └── bindings/python/ # pybind11 Python bindings
│
├── include/seahowl/ # Header files (.h) - mirrors src/ structure
│
├── data/ # Reference turbine configurations
│ └── IEA15MW/ # IEA 15MW reference turbine
│ ├── onshore/
│ ├── monopile/
│ └── floating/
│
├── tests/
│ ├── unit_tests/ # C++ unit tests
│ └── non_regression/ # Python regression tests
│
├── examples/
│ ├── cpp/ # C++ examples
│ └── python/ # Python examples
│
└── external/ # External dependencies
For example, if you are in the root directory of this repository and compiled the SEAHOWL driver in a build folder, you can run:
./build/seahowl_driver ./data/IEA15MW/main_onshore.jsonAn output folder containing all the outputs will be automatically created.
Note
Copy the libdiscon.so (or dll) library for ROSCO >2.8.x into location define in block controller of turbine.json file. Usually into subdirectory controller of the test case.
If you compiled the Python bindings and added them to your PYTHONPATH, you can use SEAHOWL as follows:
import seahowl
# make simulation object
simulation = seahowl.core.Simulation()
simulation.populate_from_file("data/IEA15MW/main_onshore.json")
simulation.initialize_from_config()
# simulation loop
while simulation.system_core.get_time() < simulation.duration:
simulation.step()scripts/sensors.py provides sensor classes to measure physical quantities at any spanwise location along an FEA component (fraction=0 at root/bottom, fraction=1 at tip/top). Sensors are callable and return a numpy array. They integrate naturally with the CSV output system:
import seahowl
import sys
sys.path.append("scripts")
import sensors
simulation = seahowl.core.Simulation()
simulation.populate_from_file("data/IEA15MW/onshore/main.json")
simulation.initialize_from_config()
turbine = simulation.system_core.turbines[0]
# create sensors on turbine components
tower_mid_pos = sensors.PositionGaugeFEA(turbine.elasto.tower, fraction=0.5)
blade_root_mom = sensors.MomentGaugeFEA(turbine.elasto.rna.rotor.blades[0], fraction=0.0)
tower_top_accel = sensors.AccelerometerFEA(turbine.elasto.tower, fraction=1.0)
# log to CSV — sensors are directly callable
mycsv = simulation.outputs.create_new_csv("sensors_output.csv")
mycsv.add_function("time [s]", lambda: simulation.system_core.get_time())
mycsv.add_function("tower mid position [m]", tower_mid_pos)
mycsv.add_function("blade root moment [Nm]", blade_root_mom)
mycsv.add_function("tower top accel [m/s2]", tower_top_accel)
# simulation loop
while simulation.system_core.get_time() < simulation.duration:
simulation.step()Other examples of Python bindings usage are available in examples/python/ from the root of SEAHOWL's repository.
Reference paper on SEAHOWL available in open access here: de Lataillade et al 2024 J. Phys.: Conf. Ser. 2767 052051.