Skip to content

Commit ea487a0

Browse files
committed
Add functions for fluid acceleration from waves
1 parent f5e31c7 commit ea487a0

2 files changed

Lines changed: 80 additions & 0 deletions

File tree

include/hydroc/wave_types.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ class WaveBase {
7070

7171
virtual Eigen::Vector3d GetVelocity(const Eigen::Vector3d& position, double time) = 0;
7272

73+
virtual Eigen::Vector3d GetAcceleration(const Eigen::Vector3d& position, double time) = 0;
74+
7375
/// @brief Mean water level
7476
double mwl_ = 0.0;
7577
/// @brief Gravitational acceleration
@@ -102,6 +104,9 @@ class NoWave : public WaveBase {
102104
Eigen::Vector3d GetVelocity(const Eigen::Vector3d& position, double time) override {
103105
return Eigen::Vector3d(0.0, 0.0, 0.0);
104106
}
107+
Eigen::Vector3d GetAcceleration(const Eigen::Vector3d& position, double time) override {
108+
return Eigen::Vector3d(0.0, 0.0, 0.0);
109+
}
105110

106111
private:
107112
unsigned int num_bodies_;
@@ -175,6 +180,8 @@ class RegularWave : public WaveBase {
175180

176181
Eigen::Vector3d GetVelocity(const Eigen::Vector3d& position, double time) override;
177182

183+
Eigen::Vector3d GetAcceleration(const Eigen::Vector3d& position, double time) override;
184+
178185
private:
179186
unsigned int num_bodies_;
180187
const WaveMode mode_ = WaveMode::regular;
@@ -365,6 +372,8 @@ class IrregularWaves : public WaveBase {
365372

366373
Eigen::Vector3d GetVelocity(const Eigen::Vector3d& position, double time) override;
367374

375+
Eigen::Vector3d GetAcceleration(const Eigen::Vector3d& position, double time) override;
376+
368377
private:
369378
IrregularWaveParams params_;
370379
std::vector<double> spectrum_;

src/wave_types.cpp

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,37 @@ Eigen::Vector3d GetWaterVelocity(const Eigen::Vector3d& position,
8585
return water_velocity;
8686
}
8787

88+
Eigen::Vector3d GetWaterAcceleration(const Eigen::Vector3d& position,
89+
double time,
90+
double omega,
91+
double amplitude,
92+
double phase,
93+
double wavenumber,
94+
double water_depth,
95+
double mwl) {
96+
// assuming wave along global X axis position
97+
auto x_pos = position.x();
98+
// position relative to mean water level
99+
auto z_pos = position.z() - mwl;
100+
101+
// get water velocity
102+
auto water_acceleration = Eigen::Vector3d(0.0, 0.0, 0.0);
103+
if (2 * M_PI / wavenumber > water_depth || wavenumber * water_depth > 500.0) {
104+
// deep water
105+
water_acceleration[0] =
106+
omega * omega * amplitude * std::exp(wavenumber * z_pos) * sin(wavenumber * x_pos - omega * time + phase);
107+
water_acceleration[2] =
108+
-omega * omega * amplitude * std::exp(wavenumber * z_pos) * cos(wavenumber * x_pos - omega * time + phase);
109+
} else {
110+
// shallow water
111+
water_acceleration[0] = omega * omega * amplitude * std::cosh(wavenumber * (z_pos + water_depth)) /
112+
std::sinh(wavenumber * water_depth) * sin(wavenumber * x_pos - omega * time + phase);
113+
water_acceleration[2] = -omega * omega * amplitude * std::sinh(wavenumber * (z_pos + water_depth)) /
114+
std::sinh(wavenumber * water_depth) * cos(wavenumber * x_pos - omega * time + phase);
115+
}
116+
return water_acceleration;
117+
}
118+
88119
Eigen::Vector3d GetWaterVelocityIrregular(const Eigen::Vector3d& position,
89120
double time,
90121
const Eigen::VectorXd& freqs_hz,
@@ -104,6 +135,25 @@ Eigen::Vector3d GetWaterVelocityIrregular(const Eigen::Vector3d& position,
104135
return water_velocity;
105136
}
106137

138+
Eigen::Vector3d GetWaterAccelerationIrregular(const Eigen::Vector3d& position,
139+
double time,
140+
const Eigen::VectorXd& freqs_hz,
141+
const Eigen::VectorXd& spectral_densities,
142+
const Eigen::VectorXd& spectral_widths,
143+
const Eigen::VectorXd& wave_phases,
144+
const Eigen::VectorXd& wavenumbers,
145+
double water_depth,
146+
double mwl) {
147+
auto water_acceleration = Eigen::Vector3d(0.0, 0.0, 0.0);
148+
for (size_t i = 0; i < freqs_hz.size(); ++i) {
149+
auto amplitude = std::sqrt(2 * spectral_densities[i] * spectral_widths[i]);
150+
auto omega = 2 * M_PI * freqs_hz[i];
151+
water_acceleration +=
152+
GetWaterAcceleration(position, time, omega, amplitude, wave_phases[i], wavenumbers[i], water_depth, mwl);
153+
}
154+
return water_acceleration;
155+
}
156+
107157
double ComputeWaveNumber(double omega,
108158
double water_depth,
109159
double g,
@@ -182,6 +232,11 @@ Eigen::Vector3d RegularWave::GetVelocity(const Eigen::Vector3d& position, double
182232
wavenumber_, water_depth_, mwl_);
183233
};
184234

235+
Eigen::Vector3d RegularWave::GetAcceleration(const Eigen::Vector3d& position, double time) {
236+
return GetWaterAcceleration(position, time, regular_wave_omega_, regular_wave_amplitude_, regular_wave_phase_,
237+
wavenumber_, water_depth_, mwl_);
238+
};
239+
185240
double RegularWave::GetElevation(const Eigen::Vector3d& position, double time) {
186241
return GetEta(position, time, regular_wave_omega_, regular_wave_amplitude_, regular_wave_phase_, wavenumber_);
187242
};
@@ -400,6 +455,22 @@ Eigen::Vector3d IrregularWaves::GetVelocity(const Eigen::Vector3d& position, dou
400455
spectral_widths_, wave_phases_, wavenumbers_, water_depth_, mwl_);
401456
};
402457

458+
Eigen::Vector3d IrregularWaves::GetAcceleration(const Eigen::Vector3d& position, double time) {
459+
// apply wave stretching (if enabled)
460+
auto position_stretched = position;
461+
if (params_.wave_stretching_) {
462+
auto eta = GetEtaIrregular(position, time, spectrum_frequencies_, spectral_densities_, spectral_widths_,
463+
wave_phases_, wavenumbers_);
464+
// position relative to mean water level
465+
auto z_pos = position.z() - mwl_;
466+
// Wheeler stretching
467+
position_stretched[2] = water_depth_ * (z_pos - eta) / (water_depth_ + eta);
468+
}
469+
470+
return GetWaterAccelerationIrregular(position_stretched, time, spectrum_frequencies_, spectral_densities_,
471+
spectral_widths_, wave_phases_, wavenumbers_, water_depth_, mwl_);
472+
};
473+
403474
double IrregularWaves::GetElevation(const Eigen::Vector3d& position, double time) {
404475
return GetEtaIrregular(position, time, spectrum_frequencies_, spectral_densities_, spectral_widths_, wave_phases_,
405476
wavenumbers_);

0 commit comments

Comments
 (0)