Skip to content

Commit 473936d

Browse files
committed
Add water velocity calculations and getters
1 parent e45a442 commit 473936d

2 files changed

Lines changed: 67 additions & 0 deletions

File tree

include/hydroc/wave_types.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ class WaveBase {
6767
virtual WaveMode GetWaveMode() = 0;
6868

6969
virtual double GetElevation(const Eigen::Vector3d& position, double time) = 0;
70+
71+
virtual Eigen::Vector3d GetVelocity(const Eigen::Vector3d& position, double time) = 0;
7072
};
7173

7274
/**
@@ -90,6 +92,9 @@ class NoWave : public WaveBase {
9092
Eigen::VectorXd GetForceAtTime(double t) override;
9193
WaveMode GetWaveMode() override { return mode_; }
9294
double GetElevation(const Eigen::Vector3d& position, double time) override { return 0.0; };
95+
Eigen::Vector3d GetVelocity(const Eigen::Vector3d& position, double time) override {
96+
return Eigen::Vector3d(0.0, 0.0, 0.0);
97+
}
9398

9499
private:
95100
unsigned int num_bodies_;
@@ -161,6 +166,8 @@ class RegularWave : public WaveBase {
161166

162167
double GetElevation(const Eigen::Vector3d& position, double time) override;
163168

169+
Eigen::Vector3d GetVelocity(const Eigen::Vector3d& position, double time) override;
170+
164171
private:
165172
unsigned int num_bodies_;
166173
const WaveMode mode_ = WaveMode::regular;
@@ -348,6 +355,8 @@ class IrregularWaves : public WaveBase {
348355

349356
double GetElevation(const Eigen::Vector3d& position, double time) override;
350357

358+
Eigen::Vector3d GetVelocity(const Eigen::Vector3d& position, double time) override;
359+
351360
private:
352361
IrregularWaveParams params_;
353362
std::vector<double> spectrum_;

src/wave_types.cpp

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,54 @@ std::vector<double> GetEtaIrregularTimeSeries(const Eigen::Vector3d& position,
5454
return eta;
5555
}
5656

57+
Eigen::Vector3d GetWaterVelocity(const Eigen::Vector3d& position,
58+
double time,
59+
double omega,
60+
double amplitude,
61+
double phase,
62+
double wavenumber,
63+
double water_depth) {
64+
// assuming wave along global X axis position
65+
auto x_pos = position.x();
66+
// assume water level at z = 0.0
67+
auto z_pos = position.z();
68+
69+
// get water velocity
70+
auto water_velocity = Eigen::Vector3d(0.0, 0.0, 0.0);
71+
if (2 * M_PI / wavenumber > water_depth) {
72+
// deep water
73+
water_velocity[0] =
74+
omega * amplitude * std::exp(wavenumber * z_pos) * cos(wavenumber * x_pos - omega * time + phase);
75+
water_velocity[2] =
76+
omega * amplitude * std::exp(wavenumber * z_pos) * sin(wavenumber * x_pos - omega * time + phase);
77+
} else {
78+
// shallow water
79+
water_velocity[0] = omega * amplitude * std::cosh(wavenumber * (z_pos + water_depth)) /
80+
std::sinh(wavenumber * water_depth) * cos(wavenumber * x_pos - omega * time + phase);
81+
water_velocity[2] = omega * amplitude * std::sinh(wavenumber * (z_pos + water_depth)) /
82+
std::sinh(wavenumber * water_depth) * sin(wavenumber * x_pos - omega * time + phase);
83+
}
84+
return water_velocity;
85+
}
86+
87+
Eigen::Vector3d GetWaterVelocityIrregular(const Eigen::Vector3d& position,
88+
double time,
89+
const Eigen::VectorXd& freqs_hz,
90+
const Eigen::VectorXd& spectral_densities,
91+
const Eigen::VectorXd& spectral_widths,
92+
const Eigen::VectorXd& wave_phases,
93+
const Eigen::VectorXd& wavenumbers,
94+
double water_depth) {
95+
auto water_velocity = Eigen::Vector3d(0.0, 0.0, 0.0);
96+
for (size_t i = 0; i < freqs_hz.size(); ++i) {
97+
auto amplitude = std::sqrt(2 * spectral_densities[i] * spectral_widths[i]);
98+
auto omega = 2 * M_PI * freqs_hz[i];
99+
water_velocity +=
100+
GetWaterVelocity(position, time, omega, amplitude, wave_phases[i], wavenumbers[i], water_depth);
101+
}
102+
return water_velocity;
103+
}
104+
57105
double ComputeWaveNumber(double omega,
58106
double water_depth,
59107
double g,
@@ -122,6 +170,11 @@ void RegularWave::AddH5Data(std::vector<HydroData::RegularWaveInfo>& reg_h5_data
122170
sim_data_ = sim_data;
123171
}
124172

173+
Eigen::Vector3d RegularWave::GetVelocity(const Eigen::Vector3d& position, double time) {
174+
return GetWaterVelocity(position, time, regular_wave_omega_, regular_wave_amplitude_, regular_wave_phase_,
175+
wavenumber_, sim_data_.water_depth);
176+
};
177+
125178
double RegularWave::GetElevation(const Eigen::Vector3d& position, double time) {
126179
return GetEta(position, time, regular_wave_omega_, regular_wave_amplitude_, regular_wave_phase_, wavenumber_);
127180
};
@@ -323,6 +376,11 @@ void IrregularWaves::AddH5Data(std::vector<HydroData::IrregularWaveInfo>& irreg_
323376
InitializeIRFVectors();
324377
}
325378

379+
Eigen::Vector3d IrregularWaves::GetVelocity(const Eigen::Vector3d& position, double time) {
380+
return GetWaterVelocityIrregular(position, time, spectrum_frequencies_, spectral_densities_, spectral_widths_,
381+
wave_phases_, wavenumbers_, sim_data_.water_depth);
382+
};
383+
326384
double IrregularWaves::GetElevation(const Eigen::Vector3d& position, double time) {
327385
return GetEtaIrregular(position, time, spectrum_frequencies_, spectral_densities_, spectral_widths_, wave_phases_,
328386
wavenumbers_);

0 commit comments

Comments
 (0)