Marine systems simulation
Loading...
Searching...
No Matches
AiryWavesSimd.h
1#pragma once
3
4#include <marenv/marenv.h>
5#include <marenv/wave/LinearWaveTheory.h>
6#include <marenv/wave/WaveEnergySpectrum.h>
7
8#include <array>
9
10namespace marenv::wave
11{
12
32{
33public:
40 {
41 std::vector<xsimd::batch<double>> omega;
42 std::vector<xsimd::batch<double>> k;
43 std::vector<xsimd::batch<double>> cosT;
44 std::vector<xsimd::batch<double>> sinT;
45 std::vector<xsimd::batch<double>> eps;
46 std::vector<xsimd::batch<double>> zetaA;
47 // Pre-multiplied products (avoid recomputing each Compute* call)
48 std::vector<xsimd::batch<double>> zetaAK;
49 std::vector<xsimd::batch<double>> zetaAKcosT;
50 std::vector<xsimd::batch<double>> zetaAKsinT;
51 std::vector<xsimd::batch<double>> ampVelK;
52 std::vector<xsimd::batch<double>> ampVelKcosT;
53 std::vector<xsimd::batch<double>> ampVelKsinT;
54 std::vector<xsimd::batch<double>> ampAccK;
55 std::vector<xsimd::batch<double>> ampAccKcosT;
56 std::vector<xsimd::batch<double>> ampAccKsinT;
57 std::vector<xsimd::batch<double>> totalAmplitude;
58 };
59
66 struct SimdSnapshot : public WaveSnapshot
67 {
69
76 explicit SimdSnapshot(std::shared_ptr<WaveComponents> wc, WaveStaticSIMD s)
77 : WaveSnapshot(std::move(wc))
78 , simdStatic(std::move(s))
79 { }
80 };
81
88 {
89 std::vector<xsimd::batch<double>> angle;
90 std::vector<xsimd::batch<double>> sin_angle;
91 std::vector<xsimd::batch<double>> cos_angle;
92 };
94
96 {
97 std::vector<xsimd::batch<double>> expk;
98 };
99
107 {
108 static constexpr int kMaxWaves = 52;
109 static constexpr int kBatchSize = static_cast<int>(xsimd::batch<double>::size);
110 static constexpr int kMaxBatches = (kMaxWaves + kBatchSize - 1) / kBatchSize;
111
112 std::array<xsimd::batch<double>, kMaxBatches> angle;
113 std::array<xsimd::batch<double>, kMaxBatches> sin_angle;
114 std::array<xsimd::batch<double>, kMaxBatches> cos_angle;
115 std::array<xsimd::batch<double>, kMaxBatches> expk;
116 int nbatches = 0;
117 };
118
124 explicit AiryWavesSimd(std::shared_ptr<WaveComponents> waveComponents);
132 AiryWavesSimd(WaveEnergySpectrum::SpectrumParameters spectrumParameters, int numWaves, uint32_t randomSeed);
134
135 ~AiryWavesSimd() override = default;
136
144 bool PositionIsInWater(double time, const double pos[3]);
146
147 Status ComputeSurfaceElevation(double time, const double pos[2], double& elevationOut) override;
149
150 Status ComputeSurfaceUnitNormal(double time, const double pos[2], double unitNormalOut[3]) override;
152
153 Status ComputeParticleVelocity(double time, const double pos[3], double velOut[3]) override;
155
156 Status ComputeParticleAcceleration(double time, const double pos[3], double accOut[3]) override;
158
159 Status ComputeDynamicPressure(double time, const double pos[3], double& pressureOut) override;
161
162 Status ComputeTotalPressure(double time, const double pos[3], double& pressureOut) override;
164
166 double time,
167 const double pos[3],
168 double& surface_elevation,
169 double surface_unit_normal[3],
170 double particle_velocity[3],
171 double particle_acceleration[3],
172 double& pressure) override;
173
182 void BlendInPlace(WaveComponentData& other, double alpha) override;
183
190 [[nodiscard]] const WaveStaticSIMD& GetSimdStatic() const
191 {
192 auto snap = LoadSnapshot();
193 return static_cast<SimdSnapshot*>(snap.get())->simdStatic;
194 }
195
196private:
202 void PublishSimdSnapshot(std::shared_ptr<WaveComponents> wc);
203};
204} // namespace marenv::wave
Definition AiryWavesSimd.h:32
const WaveStaticSIMD & GetSimdStatic() const
Definition AiryWavesSimd.h:190
AiryWavesSimd(WaveEnergySpectrum::SpectrumParameters spectrumParameters, int numWaves, uint32_t randomSeed)
~AiryWavesSimd() override=default
Default destructor.
Status ComputeParticleVelocity(double time, const double pos[3], double velOut[3]) override
AiryWavesSimd(std::shared_ptr< WaveComponents > waveComponents)
bool PositionIsInWater(double time, const double pos[3])
Status ComputeParticleAcceleration(double time, const double pos[3], double accOut[3]) override
Status ComputeSurfaceUnitNormal(double time, const double pos[2], double unitNormalOut[3]) override
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) override
Status ComputeDynamicPressure(double time, const double pos[3], double &pressureOut) override
void BlendInPlace(WaveComponentData &other, double alpha) override
Status ComputeSurfaceElevation(double time, const double pos[2], double &elevationOut) override
Status ComputeTotalPressure(double time, const double pos[3], double &pressureOut) override
Parent class for linear wave theories used to simulate gravity waves.
Definition LinearWaveTheory.h:43
std::shared_ptr< WaveSnapshot > LoadSnapshot() const
Definition LinearWaveTheory.h:75
Status
Definition marenv.h:40
Definition AiryWavesSimd.h:67
SimdSnapshot(std::shared_ptr< WaveComponents > wc, WaveStaticSIMD s)
Definition AiryWavesSimd.h:76
WaveStaticSIMD simdStatic
Pre-computed SIMD static data derived from wave components.
Definition AiryWavesSimd.h:68
Extended dynamic SIMD data including depth-dependent terms. See also WaveDynamicSIMD.
Definition AiryWavesSimd.h:96
std::vector< xsimd::batch< double > > expk
Exponential depth decay factor exp(-k*z).
Definition AiryWavesSimd.h:97
std::vector< xsimd::batch< double > > sin_angle
Sine of phase angle.
Definition AiryWavesSimd.h:90
std::vector< xsimd::batch< double > > angle
Phase angle term (omega*t - k*x*cosT - k*y*sinT + eps).
Definition AiryWavesSimd.h:89
std::vector< xsimd::batch< double > > cos_angle
Cosine of phase angle.
Definition AiryWavesSimd.h:91
Definition AiryWavesSimd.h:107
static constexpr int kMaxBatches
Maximum SIMD batches needed for kMaxWaves.
Definition AiryWavesSimd.h:110
int nbatches
Number of active batches (set each fill).
Definition AiryWavesSimd.h:116
std::array< xsimd::batch< double >, kMaxBatches > cos_angle
Cosine of phase angle for each batch.
Definition AiryWavesSimd.h:114
std::array< xsimd::batch< double >, kMaxBatches > expk
Exponential depth decay for each batch.
Definition AiryWavesSimd.h:115
std::array< xsimd::batch< double >, kMaxBatches > angle
Phase angle for each batch.
Definition AiryWavesSimd.h:112
std::array< xsimd::batch< double >, kMaxBatches > sin_angle
Sine of phase angle for each batch.
Definition AiryWavesSimd.h:113
static constexpr int kBatchSize
SIMD batch width (architecture-dependent).
Definition AiryWavesSimd.h:109
static constexpr int kMaxWaves
Maximum supported wave components per computation.
Definition AiryWavesSimd.h:108
Definition AiryWavesSimd.h:40
std::vector< xsimd::batch< double > > ampAccKcosT
ampAccK * cosT.
Definition AiryWavesSimd.h:55
std::vector< xsimd::batch< double > > ampVelKcosT
ampVelK * cosT.
Definition AiryWavesSimd.h:52
std::vector< xsimd::batch< double > > totalAmplitude
zetaA (alias, for clarity in pressure).
Definition AiryWavesSimd.h:57
std::vector< xsimd::batch< double > > ampVelKsinT
ampVelK * sinT.
Definition AiryWavesSimd.h:53
std::vector< xsimd::batch< double > > zetaAK
zetaA * k.
Definition AiryWavesSimd.h:48
std::vector< xsimd::batch< double > > ampAccK
zetaA * g * k (acceleration amplitude * k).
Definition AiryWavesSimd.h:54
std::vector< xsimd::batch< double > > cosT
Cosine of propagation direction.
Definition AiryWavesSimd.h:43
std::vector< xsimd::batch< double > > eps
Phase shift.
Definition AiryWavesSimd.h:45
std::vector< xsimd::batch< double > > zetaAKcosT
zetaA * k * cosT.
Definition AiryWavesSimd.h:49
std::vector< xsimd::batch< double > > sinT
Sine of propagation direction.
Definition AiryWavesSimd.h:44
std::vector< xsimd::batch< double > > zetaAKsinT
zetaA * k * sinT.
Definition AiryWavesSimd.h:50
std::vector< xsimd::batch< double > > omega
Angular frequency [rad/s].
Definition AiryWavesSimd.h:41
std::vector< xsimd::batch< double > > zetaA
Wave amplitude [m].
Definition AiryWavesSimd.h:46
std::vector< xsimd::batch< double > > ampVelK
zetaA * (g/omega) * k (velocity amplitude * k).
Definition AiryWavesSimd.h:51
std::vector< xsimd::batch< double > > ampAccKsinT
ampAccK * sinT.
Definition AiryWavesSimd.h:56
std::vector< xsimd::batch< double > > k
Wave number [1/m].
Definition AiryWavesSimd.h:42
Details of a wave component.
Definition WaveField.h:23
The parameters defining a certain wave field.
Definition WaveEnergySpectrum.h:41
Definition LinearWaveTheory.h:25