From a3975cc74c56e81a2c62c12f9ed3c9403072c1e4 Mon Sep 17 00:00:00 2001 From: Tristan de Lataillade Date: Fri, 21 Nov 2025 15:09:06 +0100 Subject: [PATCH 1/3] Change deep water check --- src/wave_types.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/wave_types.cpp b/src/wave_types.cpp index df0fc92..18fc98b 100644 --- a/src/wave_types.cpp +++ b/src/wave_types.cpp @@ -11,6 +11,14 @@ #include +bool is_in_deep_water(double wavenumber, double water_depth) { + if (wavenumber * water_depth > 89.4) { + return true; + } else { + return false; + } +} + double GetEta(const Eigen::Vector3d& position, double time, double omega, @@ -73,7 +81,7 @@ Eigen::Vector3d GetWaterVelocity(const Eigen::Vector3d& position, // get water velocity auto water_velocity = Eigen::Vector3d(0.0, 0.0, 0.0); - if (2 * M_PI / wavenumber > water_depth || wavenumber * water_depth > 500.0) { + if (is_in_deep_water(wavenumber, water_depth)) { // deep water water_velocity[0] = omega * amplitude * std::exp(wavenumber * z_pos) * cos(wavenumber * x_pos - omega * time + phase); @@ -105,7 +113,7 @@ Eigen::Vector3d GetWaterAcceleration(const Eigen::Vector3d& position, // get water velocity auto water_acceleration = Eigen::Vector3d(0.0, 0.0, 0.0); - if (2 * M_PI / wavenumber > water_depth || wavenumber * water_depth > 500.0) { + if (is_in_deep_water(wavenumber, water_depth)) { // deep water water_acceleration[0] = omega * omega * amplitude * std::exp(wavenumber * z_pos) * sin(wavenumber * x_pos - omega * time + phase); From df449d74a45711ed3430adc4748fe951e4927c80 Mon Sep 17 00:00:00 2001 From: Tristan de Lataillade Date: Fri, 21 Nov 2025 15:52:51 +0100 Subject: [PATCH 2/3] Add stretching to reg wave + for mwl=/=0 --- include/hydroc/wave_types.h | 1 + src/wave_types.cpp | 30 ++++++++++++++++++++++++++---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/include/hydroc/wave_types.h b/include/hydroc/wave_types.h index bd37cea..236bca0 100644 --- a/include/hydroc/wave_types.h +++ b/include/hydroc/wave_types.h @@ -165,6 +165,7 @@ class RegularWave : public WaveBase { double regular_wave_amplitude_; double regular_wave_omega_; double regular_wave_phase_ = 0.0; + bool wave_stretching_ = true; /** * @brief Initializes other member variables for timestep calculations later. diff --git a/src/wave_types.cpp b/src/wave_types.cpp index 18fc98b..908f61b 100644 --- a/src/wave_types.cpp +++ b/src/wave_types.cpp @@ -307,12 +307,32 @@ void RegularWave::AddH5Data(std::vector& reg_h5_data } Eigen::Vector3d RegularWave::GetVelocity(const Eigen::Vector3d& position, double time) { - return GetWaterVelocity(position, time, regular_wave_omega_, regular_wave_amplitude_, regular_wave_phase_, + // apply wave stretching (if enabled) + auto position_stretched = position; + if (wave_stretching_) { + auto eta = GetElevation(position, time); + // position relative to mean water level + auto z_pos = position.z() - mwl_; + // Wheeler stretching + auto z_stretched = water_depth_ * (z_pos - eta) / (water_depth_ + eta); + position_stretched[2] = z_stretched + mwl_; + } + return GetWaterVelocity(position_stretched, time, regular_wave_omega_, regular_wave_amplitude_, regular_wave_phase_, wavenumber_, water_depth_, mwl_); }; Eigen::Vector3d RegularWave::GetAcceleration(const Eigen::Vector3d& position, double time) { - return GetWaterAcceleration(position, time, regular_wave_omega_, regular_wave_amplitude_, regular_wave_phase_, + // apply wave stretching (if enabled) + auto position_stretched = position; + if (wave_stretching_) { + auto eta = GetElevation(position, time); + // position relative to mean water level + auto z_pos = position.z() - mwl_; + // Wheeler stretching + auto z_stretched = water_depth_ * (z_pos - eta) / (water_depth_ + eta); + position_stretched[2] = z_stretched + mwl_; + } + return GetWaterAcceleration(position_stretched, time, regular_wave_omega_, regular_wave_amplitude_, regular_wave_phase_, wavenumber_, water_depth_, mwl_); }; @@ -529,7 +549,8 @@ Eigen::Vector3d IrregularWaves::GetVelocity(const Eigen::Vector3d& position, dou // position relative to mean water level auto z_pos = position.z() - mwl_; // Wheeler stretching - position_stretched[2] = water_depth_ * (z_pos - eta) / (water_depth_ + eta); + auto z_stretched = water_depth_ * (z_pos - eta) / (water_depth_ + eta); + position_stretched[2] = z_stretched + mwl_; } return GetWaterVelocityIrregular(position_stretched, time, spectrum_frequencies_, spectral_densities_, @@ -545,7 +566,8 @@ Eigen::Vector3d IrregularWaves::GetAcceleration(const Eigen::Vector3d& position, // position relative to mean water level auto z_pos = position.z() - mwl_; // Wheeler stretching - position_stretched[2] = water_depth_ * (z_pos - eta) / (water_depth_ + eta); + auto z_stretched = water_depth_ * (z_pos - eta) / (water_depth_ + eta); + position_stretched[2] = z_stretched + mwl_; } return GetWaterAccelerationIrregular(position_stretched, time, spectrum_frequencies_, spectral_densities_, From f46fab2bf89d53dbd4a859575b60daed73ad7143 Mon Sep 17 00:00:00 2001 From: Tristan de Lataillade Date: Fri, 21 Nov 2025 18:10:55 +0100 Subject: [PATCH 3/3] Use common function for wave stretching --- src/wave_types.cpp | 38 ++++++++++++-------------------------- 1 file changed, 12 insertions(+), 26 deletions(-) diff --git a/src/wave_types.cpp b/src/wave_types.cpp index 908f61b..d50ef9f 100644 --- a/src/wave_types.cpp +++ b/src/wave_types.cpp @@ -19,6 +19,14 @@ bool is_in_deep_water(double wavenumber, double water_depth) { } } +Eigen::Vector3d GetWheelerStretchedPosition(const Eigen::Vector3d& position, double eta, double water_depth, double mwl) { + // position relative to mean water level + auto z_pos = position.z() - mwl; + // Wheeler stretching + auto z_stretched = water_depth * (z_pos - eta) / (water_depth + eta); + return Eigen::Vector3d(position.x(), position.y(), z_stretched + mwl); +} + double GetEta(const Eigen::Vector3d& position, double time, double omega, @@ -310,12 +318,7 @@ Eigen::Vector3d RegularWave::GetVelocity(const Eigen::Vector3d& position, double // apply wave stretching (if enabled) auto position_stretched = position; if (wave_stretching_) { - auto eta = GetElevation(position, time); - // position relative to mean water level - auto z_pos = position.z() - mwl_; - // Wheeler stretching - auto z_stretched = water_depth_ * (z_pos - eta) / (water_depth_ + eta); - position_stretched[2] = z_stretched + mwl_; + position_stretched = GetWheelerStretchedPosition(position, GetElevation(position, time), water_depth_, mwl_); } return GetWaterVelocity(position_stretched, time, regular_wave_omega_, regular_wave_amplitude_, regular_wave_phase_, wavenumber_, water_depth_, mwl_); @@ -325,12 +328,7 @@ Eigen::Vector3d RegularWave::GetAcceleration(const Eigen::Vector3d& position, do // apply wave stretching (if enabled) auto position_stretched = position; if (wave_stretching_) { - auto eta = GetElevation(position, time); - // position relative to mean water level - auto z_pos = position.z() - mwl_; - // Wheeler stretching - auto z_stretched = water_depth_ * (z_pos - eta) / (water_depth_ + eta); - position_stretched[2] = z_stretched + mwl_; + position_stretched = GetWheelerStretchedPosition(position, GetElevation(position, time), water_depth_, mwl_); } return GetWaterAcceleration(position_stretched, time, regular_wave_omega_, regular_wave_amplitude_, regular_wave_phase_, wavenumber_, water_depth_, mwl_); @@ -544,13 +542,7 @@ Eigen::Vector3d IrregularWaves::GetVelocity(const Eigen::Vector3d& position, dou // apply wave stretching (if enabled) auto position_stretched = position; if (params_.wave_stretching_) { - auto eta = GetEtaIrregular(position, time, spectrum_frequencies_, spectral_densities_, spectral_widths_, - wave_phases_, wavenumbers_); - // position relative to mean water level - auto z_pos = position.z() - mwl_; - // Wheeler stretching - auto z_stretched = water_depth_ * (z_pos - eta) / (water_depth_ + eta); - position_stretched[2] = z_stretched + mwl_; + position_stretched = GetWheelerStretchedPosition(position, GetElevation(position, time), water_depth_, mwl_); } return GetWaterVelocityIrregular(position_stretched, time, spectrum_frequencies_, spectral_densities_, @@ -561,13 +553,7 @@ Eigen::Vector3d IrregularWaves::GetAcceleration(const Eigen::Vector3d& position, // apply wave stretching (if enabled) auto position_stretched = position; if (params_.wave_stretching_) { - auto eta = GetEtaIrregular(position, time, spectrum_frequencies_, spectral_densities_, spectral_widths_, - wave_phases_, wavenumbers_); - // position relative to mean water level - auto z_pos = position.z() - mwl_; - // Wheeler stretching - auto z_stretched = water_depth_ * (z_pos - eta) / (water_depth_ + eta); - position_stretched[2] = z_stretched + mwl_; + position_stretched = GetWheelerStretchedPosition(position, GetElevation(position, time), water_depth_, mwl_); } return GetWaterAccelerationIrregular(position_stretched, time, spectrum_frequencies_, spectral_densities_,