All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- MoorDyn v2.6.1 mooring integration — coupled MoorDyn as a Git submodule, enabling catenary and taut mooring analysis. New
MoorDynConfigstruct andHydroSystem::SetMoorDynConfig()API for mooring configuration. - MoorDyn force coupling into HydroSystem — mooring forces from MoorDyn are applied at each timestep alongside hydrostatic, radiation, and excitation forces
- RM3 mooring demonstration — YAML-driven RM3 two-body point absorber with 3-line catenary mooring (6 MoorDyn segments: anchor–clump + clump–fairlead per line), runnable via
run_hydrochrono - Real-time mooring line visualization — VSG GUI renders mooring line node positions queried from MoorDyn at each frame, with dynamic tension color mapping (blue-to-red gradient scaled to current tension range)
- RM3 mooring verification test — automated CTest comparison against WEC-Sim/MoorDyn co-simulation reference data for body heave and fairlead tensions (correlation ≈ 0.998, max tension error ≈ 1.8% of mean)
hydroc/math_constants.h— centralisedM_PIdefinition replacing scattered per-file definitions
- IRF truncation separated from smoothing and tapering —
RadiationKernelProcessingnow treats truncation as a distinct step from the smoothing/tapering pipeline RegularWaveencapsulation — members made private withSetPeriod()/SetOmega()accessors
- Cross-machine build robustness — resolved HDF5 target name conflicts and Eigen3 detection issues affecting some build environments
- Chrono API and test infrastructure compatibility — updated for recent Chrono API changes
- State-space radiation damping — alternative to convolution-based radiation that approximates RIRF kernels as a sum of exponential and oscillatory modes, reducing per-timestep cost from O(N) to O(1). New classes:
RadiationStateSpaceModel,RadiationStateSpaceFitter,RadiationStateSpaceComponent RadiationMethodenum andStateSpaceOptionsconfiguration struct for selecting between convolution and state-space radiation at runtime- YAML configuration keys —
radiation_method,ss_max_order,ss_r2_threshold,output_kernel_fit - Kernel-fit diagnostics — R² values and mode counts per DOF pair, optionally written to HDF5 output via
output_kernel_fit: true - Unit tests for
RadiationStateSpaceModelandRadiationStateSpaceFitter - Regression tests comparing state-space vs convolution for sphere decay, OSWEC decay, sphere irregular waves, and OSWEC irregular waves
- Frequency-domain excitation transfer function for irregular waves — replaces time-domain convolution with a pre-computed transfer function, evaluating in O(N_freq) per DOF per timestep instead of O(N_irf × N_freq)
- Irregular wave model decoupled from simulation parameters — removed
simulation_dt_andsimulation_duration_fromIrregularWaveParams, eliminating the dependency that prevented adaptive time integration.nfrequencies_is now a required parameter. - Removed redundant
num_bodiesfrom wave classes — ownership moved toWaveBase, set automatically inHydroSystem::AddWaves(), simplifying the wave creation API and eliminating a source of configuration errors - Wave class code quality cleanup
- Stale
include/hydroc/hydro_forces.h(replaced byhydro_system.h) - Duplicate demo
demos/sphere/sphere_irreg_waves.cpp
- State-space fitter: order-1 fits were rejected — the fitting loop started at order 2 and
FitFromSVDexplicitly rejected order < 2, so single-exponential kernels (rank-1 Hankel matrix) always returned invalid results
- VSG free-surface visualization — animated water-surface mesh driven by the wave model, with per-vertex normals and configurable grid resolution (
vsg_water_surface) - Radiated wave overlay — visualization of body-generated wave patterns layered on the free surface (
vsg_radiation_surface) - PBR ocean materials, scene lighting, and GUI stats component — new modules
vsg_materials,vsg_lighting,vsg_gui_component,vsg_config - Wave model API extensions —
GetElevationGradientXY()andGetElevationForVisualization()added toWaveBase,RegularWave, andIrregularWave - Added-mass determinism unit test —
test_added_mass_determinismverifies bit-identical added-mass assembly across independent trials and sweeps all Chrono solver types - Regression tests produce HDF5 output validated by external Python comparison scripts; tests now run fully headless (all GUI/visualization code stripped from test builds)
- CPack packaging — project DLLs (
HydroChrono,HydroChronoGUI) now included in the installer ZIP - OpenMP runtime (
vcomp140.dll) explicitly installed for MSVC packages - Chrono DLL collection changed to glob all DLLs from Chrono's bin directory, capturing transitive VSG/yaml-cpp/draco dependencies
- Switched added-mass implementation to Chrono's built-in
ChLoadHydrodynamics— replaces HydroChrono's legacyChLoadAddedMass(ChLoadCustomMultiple-based) as the default. The legacy implementation is retained in the codebase and can be re-activated by uncommenting#define HYDROCHRONO_USE_LEGACY_ADDED_MASSinhydro_system.h. - Default solver changed from GMRES to SPARSE_QR for most regression tests (faster, deterministic)
- Irregular wave surface evaluation performance improved (parallelism and caching)
- Regression test report generator now correctly parses CTest logs for PASS/FAIL status instead of assuming PASS when plots exist
- YAML runner:
LoadSolverDatanever called — YAML structure mismatch prevented solver data from being loaded - YAML runner: mesh file paths broken —
m_script_directorywas empty, breaking relativemodel_file:paths - Regression report image paths — report generator now computes correct relative paths to plot images instead of using hardcoded paths
- OSWEC solver switched from SPARSE_QR to GMRES to prevent divergence (see Known Issues)
- RM3 decay test fixes and cleanup
- Sphere irregular wave test default arguments corrected
- Regular wave excitation phase indexing for multi-body systems —
RegularWave::GetForceAtTime()usedexcitation_force_phase_[rowEx]instead ofexcitation_force_phase_[body_offset + rowEx], causing body 2+ to use body 1's excitation phase. This affected the RM3 plate (and any second+ body) heave response in regular waves. Single-body models (e.g., sphere) were unaffected.
- OSWEC tests use GMRES solver. OSWEC demos and tests use GMRES rather than SPARSE_QR. SPARSE_QR may work for OSWEC but has not yet been validated.
- PSOR solver cannot handle added-mass assembly. The added-mass determinism unit test solver sweep reports that PSOR errors out because it cannot handle stiffness/damping matrices. All other swept solvers (SPARSE_QR, SPARSE_LU, MINRES, GMRES, BICGSTAB, BARZILAIBORWEIN, APGD) pass assembly.
- YAML-driven CLI (
run_hydrochrono) for running simulations from text-based configuration files - Cummins-equation time-domain solver with BEM hydrodynamic coefficients (BEMIO HDF5 format)
- Multibody system support via Project Chrono (bodies, joints, actuators)
- Irrlicht run-time visualization (optional)
- HDF5 output for post-processing and validation
- Regression test suite (IEA sphere, OSWEC, RM3, F3OF / DeepCWind)
- Windows installer (ZIP) via CPack