@@ -122,37 +122,22 @@ std::vector<double> FreeSurfaceElevation(const Eigen::VectorXd& freqs_hz,
122122 const Eigen::VectorXd& spectral_densities,
123123 const Eigen::VectorXd& wave_phases,
124124 const Eigen::VectorXd& time_index,
125+ double position,
125126 double water_depth) {
126- double delta_f = freqs_hz (Eigen::last) / freqs_hz.size ();
127- std::vector<double > omegas (freqs_hz.size ());
128-
127+ int nf = freqs_hz.size ();
128+ std::vector<double > omegas (nf);
129129 for (size_t i = 0 ; i < freqs_hz.size (); ++i) {
130130 omegas[i] = 2 * M_PI * freqs_hz[i];
131131 }
132+ double delta_f = freqs_hz (Eigen::last) / nf;
132133
133134 std::vector<double > wave_numbers = ComputeWaveNumbers (omegas, water_depth);
134135
135- std::vector<double > A (spectral_densities.size ());
136- for (size_t i = 0 ; i < spectral_densities.size (); ++i) {
137- A[i] = 2 * spectral_densities[i] * delta_f;
138- }
139-
140- std::vector<double > sqrt_A (A.size ());
141- for (size_t i = 0 ; i < A.size (); ++i) {
142- sqrt_A[i] = std::sqrt (A[i]);
143- }
144-
145- std::vector<std::vector<double >> omegas_t (time_index.size (), std::vector<double >(omegas.size ()));
146- for (size_t i = 0 ; i < time_index.size (); ++i) {
147- for (size_t j = 0 ; j < omegas.size (); ++j) {
148- omegas_t [i][j] = time_index[i] * omegas[j];
149- }
150- }
151-
152136 std::vector<double > eta (time_index.size (), 0.0 );
153- for (size_t i = 0 ; i < spectral_densities. size () ; ++i) {
137+ for (size_t i = 0 ; i < nf ; ++i) {
154138 for (size_t j = 0 ; j < time_index.size (); ++j) {
155- eta[j] += sqrt_A[i] * std::cos (omegas_t [j][i] + wave_phases[i]);
139+ eta[j] += std::sqrt (2 * spectral_densities[i] * delta_f) *
140+ std::cos (wave_numbers[i] * position - omegas[i] * time_index[j] + wave_phases[i]);
156141 }
157142 }
158143
@@ -509,8 +494,9 @@ void IrregularWaves::CreateFreeSurfaceElevation() {
509494 << std::endl;
510495
511496 // Calculate the free surface elevation
497+ double position = 0.0 ;
512498 free_surface_elevation_sampled_ = FreeSurfaceElevation (spectrum_frequencies_, spectral_densities_, wave_phases_,
513- time_array, sim_data_.water_depth );
499+ time_array, position, sim_data_.water_depth );
514500
515501 // Apply ramp if ramp_duration is greater than 0
516502 if (params_.ramp_duration_ > 0.0 ) {
0 commit comments