@@ -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+
88119Eigen::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+
107157double 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+
185240double 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+
403474double 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