@@ -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+
57105double 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+
125178double 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+
326384double 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