Marine systems simulation
Loading...
Searching...
No Matches
WaveField.h
1#pragma once
3
4#include <marenv/marenv.h>
5
6#include <memory>
7#include <string>
8#include <vector>
10
11#if defined(_MSC_VER)
12# define RESTRICT __restrict
13#else
14# define RESTRICT __restrict__
15#endif
17
18namespace marenv::wave
19{
21
23{
24 std::vector<double> zetaA;
25 std::vector<double> epsilon;
26 std::vector<double> omega;
27 std::vector<double> waveNumber;
28 std::vector<double> theta;
29};
31
33
35{
36public:
38
40 {
41 const double* RESTRICT zetaA;
42 const double* RESTRICT epsilon;
43 const double* RESTRICT omega;
44 const double* RESTRICT waveNumber;
45 const double* RESTRICT theta;
46 const double* RESTRICT cosTheta;
47 const double* RESTRICT sinTheta;
48 const double* RESTRICT remainingAccumulatedAmplitude;
50 };
52
53 virtual ~WaveField() = default;
58 [[nodiscard]] virtual std::string SpectrumName() const = 0;
63 [[nodiscard]] virtual std::string WaveTheoryName() const = 0;
72 virtual marenv::Status ComputeSurfaceElevation(double time, const double pos[2], double& elevationOut) = 0;
81 virtual marenv::Status ComputeDynamicPressure(double time, const double pos[3], double& pressureOut) = 0;
90 virtual marenv::Status ComputeTotalPressure(double time, const double pos[3], double& pressureOut) = 0;
99 virtual marenv::Status ComputeSurfaceUnitNormal(double time, const double pos[2], double unitNormalOut[3]) = 0;
110 virtual marenv::Status ComputeParticleVelocity(double time, const double pos[3], double velOut[3]) = 0;
121 virtual marenv::Status ComputeParticleAcceleration(double time, const double pos[3], double accOut[3]) = 0;
122
135 virtual marenv::Status ComputePointQuery(double time, const double pos[3], double& surface_elevation, // clang-format off
136 double surface_unit_normal[3], double particle_velocity[3],
137 double particle_acceleration[3], double& pressure) = 0; // clang-format on
152
166 virtual marenv::wave::WaveComponentData GetWaveComponentsCopy(double time, size_t maxComponents = 0) const;
167
174 virtual void BlendInPlace(WaveComponentData& other, double alpha) = 0;
175
176protected:
178
179 WaveField() = default;
180};
181} // namespace marenv::wave
The interface for an representing waves.
Definition WaveField.h:35
virtual marenv::Status ComputeParticleAcceleration(double time, const double pos[3], double accOut[3])=0
virtual void BlendInPlace(WaveComponentData &other, double alpha)=0
virtual marenv::Status ComputeTotalPressure(double time, const double pos[3], double &pressureOut)=0
virtual marenv::Status ComputeSurfaceUnitNormal(double time, const double pos[2], double unitNormalOut[3])=0
virtual marenv::Status ComputeSurfaceElevation(double time, const double pos[2], double &elevationOut)=0
virtual ~WaveField()=default
Virtual destructor.
virtual std::string SpectrumName() const =0
virtual marenv::wave::WaveComponentData GetWaveComponentsCopy() const =0
virtual marenv::wave::WaveComponentData GetWaveComponentsCopy(double time, size_t maxComponents=0) const
WaveField()=default
Constructor.
virtual std::string WaveTheoryName() const =0
virtual marenv::Status ComputeDynamicPressure(double time, const double pos[3], double &pressureOut)=0
virtual marenv::Status ComputePointQuery(double time, const double pos[3], double &surface_elevation, double surface_unit_normal[3], double particle_velocity[3], double particle_acceleration[3], double &pressure)=0
virtual InsecureDatapointers GetWaveComponents() const =0
virtual marenv::Status ComputeParticleVelocity(double time, const double pos[3], double velOut[3])=0
Status
Definition marenv.h:40
Policy mixin: this type is neither copyable nor movable.
Definition marenv.h:84
Details of a wave component.
Definition WaveField.h:23
std::vector< double > zetaA
Spectral amplitude.
Definition WaveField.h:24
std::vector< double > epsilon
Random phase angle.
Definition WaveField.h:25
std::vector< double > waveNumber
Wave number.
Definition WaveField.h:27
std::vector< double > theta
Wave propagation direction.
Definition WaveField.h:28
std::vector< double > omega
Wave frequency.
Definition WaveField.h:26
Pointers to wave component details.
Definition WaveField.h:40
int numWaves
The number of wave components.
Definition WaveField.h:49
const double *RESTRICT epsilon
Pointer to random phase angle array.
Definition WaveField.h:42
const double *RESTRICT omega
Pointer to wave frequency array.
Definition WaveField.h:43
const double *RESTRICT theta
Pointer to wave propagation direction array.
Definition WaveField.h:45
const double *RESTRICT sinTheta
Pointer to array of precalculated sin(theta).
Definition WaveField.h:47
const double *RESTRICT cosTheta
Pointer to array of precalculated cos(theta).
Definition WaveField.h:46
const double *RESTRICT waveNumber
Pointer to wave number array.
Definition WaveField.h:44
const double *RESTRICT zetaA
Pointer to spectral amplitude array.
Definition WaveField.h:41
const double *RESTRICT remainingAccumulatedAmplitude
Each element is the sum of the amplitudes of the remaining wave components.
Definition WaveField.h:48