FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
GerstnerWaves.h
1#pragma once
3
4#include <marenv/wave/LinearWaveTheory.h>
5#include <marenv/wave/WaveEnergySpectrum.h>
6
7namespace marenv::wave
8{
9
20{
21public:
27 explicit GerstnerWaves(std::shared_ptr<WaveComponents> waveComponents);
35 GerstnerWaves(WaveEnergySpectrum::SpectrumParameters spectrumParameters, int numWaves, uint32_t randomSeed);
37
38 ~GerstnerWaves() override = default;
40
41 Status ComputeSurfaceElevation(double time, const double pos[2], double& elevationOut) override;
50 Status ComputeSurfaceElevationAtLagrange(double time, const double lagrangePos[2], double& elevationOut);
52
53 Status ComputeSurfaceUnitNormal(double time, const double pos[2], double unitNormalOut[3]) override;
62 Status ComputeSurfaceUnitNormalAtLagrange(double time, const double lagrangePos[2], double unitNormalOut[3]);
64
65 Status ComputeParticleVelocity(double time, const double pos[3], double velOut[3]) override;
74 Status ComputeParticleVelocityAtLagrange(double time, const double lagrangePos[3], double velOut[3]);
76
77 Status ComputeParticleAcceleration(double time, const double pos[3], double accOut[3]) override;
86 Status ComputeParticleAccelerationAtLagrange(double time, const double lagrangePos[3], double accOut[3]);
88
89 Status ComputeDynamicPressure(double time, const double pos[3], double& pressureOut) override;
98 Status ComputeDynamicPressureAtLagrange(double time, const double lagrangePos[3], double& pressureOut);
100
101 Status ComputeTotalPressure(double time, const double pos[3], double& pressureOut) override;
110 Status ComputeTotalPressureWithElevation(double eulerZ, double elevation, double& pressureOut);
112
114 double time,
115 const double pos[3],
116 double& surface_elevation,
117 double surface_unit_normal[3],
118 double particle_velocity[3],
119 double particle_acceleration[3],
120 double& pressure) override;
121
122protected:
131 bool FindLagrangePoint3D(double time, const double eulerPosIn[3], double* lagrangePosOut);
140 bool FindLagrangePoint2D(double time, const double eulerPosIn[2], double* lagrangePosOut);
142
143 enum class WaterLocation
144 {
145 InWater,
146 InAir,
148 };
158 WaterLocation LocateInWater(double time, const double pos[3], double surfaceLagrangePos[2], double lagrangePos[3]);
165 [[nodiscard]] double TotalPressureAtLagrange(const double lagrangePos[3]) const;
167
169};
170} // namespace marenv::wave
Definition GerstnerWaves.h:20
void ThrowIfWavesAreTooSteep()
Throws an exception if the waves are too steep.
Status ComputeParticleAcceleration(double time, const double pos[3], double accOut[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 ComputeSurfaceUnitNormal(double time, const double pos[2], double unitNormalOut[3]) override
WaterLocation
Where an Eulerian position lies relative to the water.
Definition GerstnerWaves.h:144
@ InWater
Below the surface; the Lagrangian point is found.
@ NotConverged
A Lagrange solver did not converge within its iteration limit.
@ InAir
Above the surface: there is no motion and no pressure, and no Lagrangian point.
Status ComputeParticleVelocity(double time, const double pos[3], double velOut[3]) override
Status ComputeTotalPressure(double time, const double pos[3], double &pressureOut) override
double TotalPressureAtLagrange(const double lagrangePos[3]) const
GerstnerWaves(WaveEnergySpectrum::SpectrumParameters spectrumParameters, int numWaves, uint32_t randomSeed)
Status ComputeParticleAccelerationAtLagrange(double time, const double lagrangePos[3], double accOut[3])
Status ComputeDynamicPressure(double time, const double pos[3], double &pressureOut) override
bool FindLagrangePoint3D(double time, const double eulerPosIn[3], double *lagrangePosOut)
Status ComputeDynamicPressureAtLagrange(double time, const double lagrangePos[3], double &pressureOut)
Status ComputeParticleVelocityAtLagrange(double time, const double lagrangePos[3], double velOut[3])
Status ComputeSurfaceElevation(double time, const double pos[2], double &elevationOut) override
Status ComputeTotalPressureWithElevation(double eulerZ, double elevation, double &pressureOut)
WaterLocation LocateInWater(double time, const double pos[3], double surfaceLagrangePos[2], double lagrangePos[3])
Status ComputeSurfaceElevationAtLagrange(double time, const double lagrangePos[2], double &elevationOut)
bool FindLagrangePoint2D(double time, const double eulerPosIn[2], double *lagrangePosOut)
GerstnerWaves(std::shared_ptr< WaveComponents > waveComponents)
Status ComputeSurfaceUnitNormalAtLagrange(double time, const double lagrangePos[2], double unitNormalOut[3])
~GerstnerWaves() override=default
Default destructor.
Definition LinearWaveTheory.h:45
Status
Definition marenv.h:44
The parameters defining a certain wave field.
Definition WaveEnergySpectrum.h:43