FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
EnvironmentFacade.h
1#pragma once
3
4#include <marenv/Environment.h>
5#include <marenv/WaterVelocity.h>
6#include <marenv/current/CurrentField.h>
7#include <marenv/seafloor/BathymetryField.h>
8#include <marenv/seafloor/FlatSeafloor.h>
9#include <marenv/wake/JetField.h>
10#include <marenv/wake/WakeField.h>
11#include <marenv/wake/WakeRegistry.h>
12#include <marenv/wave/NullWaveField.h>
13#include <marenv/wave/WaveEnergySpectrum.h>
14#include <marenv/wave/WaveFactory.h>
15#include <marenv/wave/WaveField.h>
16
17#include <array>
18#include <cstddef>
19#include <cstdint>
20#include <memory>
21#include <span>
22#include <string>
23#include <unordered_map>
24#include <utility>
25#include <vector>
26
27namespace marenv
28{
33{
34 double ambient[3];
35 double waked[3];
36 double deficit;
38 int numJets = 0;
39};
40
48{
49public:
57 : m_waves(std::make_shared<wave::NullWaveField>())
58 , m_depths(std::make_shared<seafloor::FlatSeafloor>())
59 {
60 }
61 ~EnvironmentFacade() override = default;
62
63 // Environment's setter and getter functions
71 void SetWaves(std::shared_ptr<wave::WaveField> wave);
72
82 wave::WaveTheory waveTheory,
83 int numWaves,
84 uint32_t seed);
90 void SetBathymetry(std::shared_ptr<seafloor::BathymetryField> bathymetry);
95 std::shared_ptr<wave::WaveField> GetWaves();
96
110 double MaxWaveElevation() const;
115 std::shared_ptr<seafloor::BathymetryField> GetBathymetry();
116
130 void AddCurrentField(const std::string& id, std::shared_ptr<current::CurrentField> field);
131
141 void RemoveCurrentField(const std::string& id);
142
148 bool HasCurrentField(const std::string& id) const;
149
158 std::shared_ptr<current::CurrentField> GetCurrentField(const std::string& id) const;
159
168 void AddWakeField(const std::string& id, std::shared_ptr<wake::WakeField> field);
169
177 void RemoveWakeField(const std::string& id);
178
184 bool HasWakeField(const std::string& id) const;
185
194 std::shared_ptr<wake::WakeField> GetWakeField(const std::string& id) const;
195
207 void AddJetField(const std::string& id, std::shared_ptr<wake::JetField> field);
208
217 std::shared_ptr<wake::JetField> GetJetField(const std::string& id) const;
218
223 std::vector<std::string> GetWakeFieldIds() const;
224
229 std::vector<std::string> GetJetFieldIds() const;
230
235 std::vector<std::string> GetCurrentFieldIds() const;
236
237 // Accessor functions
239
240 Status GetSubmergence(double time, const double pos[3], double& submergence) override;
242
243 Status GetSurfaceElevation(double time, const double pos[2], double& elevationOut) override;
245
246 Status GetSurfaceUnitNormal(double time, const double pos[2], double* unitNormalOut) override;
255 Status GetParticleVelocity(double time, const double pos[3], double* velOut) override;
257
258 Status GetParticleAcceleration(double time, const double pos[3], double* accOut) override;
260
261 Status GetDynamicPressure(double time, const double pos[3], double& pressureOut) override;
263
264 Status GetTotalPressure(double time, const double pos[3], double& pressureOut) override;
266
267 Status GetSeaDepth(const double pos[2], double& depthOut) override;
269
270 Status ComputeRayIntersection(const double origin[3], const double direction[3], double& distanceOut, double maxSearchDistance = 100, double startSearchDistance = -1, double stepSize = 1.0, double convergenceTolerance = 0.01) override;
285 Status GetCurrentVelocity(double time, const double pos[3], double* velOut) override;
287
288 Status GetDensity(double time, const double pos[3], double& density) override;
304 Status PointEnvironmentQuery(double time, const double pos[3], EnvironmentQuery& queryResult) override;
305
322 Status GetWaterVelocity(double time, const double pos[3], WaterVelocityTerms terms, double velOut[3]) const;
323
339 Status GetWaterVelocity(double time, const double pos[3], const WaterVelocityParts& parts, double velOut[3]) const;
340
354 Status GetWaterVelocity(double time, const double pos[3], const WaterVelocityParts& parts, const wake::HeldWakes& held, std::size_t point, double velOut[3]) const;
355
368 void GetWaterVelocities(double time, std::span<const std::array<double, 3>> positions, const WaterVelocityParts& parts, std::span<std::array<double, 3>> velocities, std::span<Status> statuses) const;
369
391 Status GetWaterVelocity(double time, const double pos[3], const WaterVelocityParts& parts, const wake::WakeQuery& query, const wake::HeldWakes* held, std::size_t point, double velOut[3], WakedFlow* detail = nullptr) const;
392
416 Status GetWakedFlow(double time, const double pos[3], WakedFlow& out) const;
417
434 Status GetWakedFlow(double time, const double pos[3], const wake::WakeQuery& query, WakedFlow& out) const;
435
443
454 wake::HeldWakes HoldWakes(std::span<const std::array<double, 3>> positions, double T, const wake::WakeQuery& query = {}, double cutoff = 0.0, const wake::OwnTagsAt& ownTags = {}) const;
455
457 std::uint64_t GetWakeRevision() const;
458
460 bool WakesStaticFrom(double t) const;
461
462protected:
464
465 std::shared_ptr<wave::WaveField> m_waves;
469
470 std::unordered_map<std::string, std::shared_ptr<current::CurrentField>> m_currentFields;
472
473 std::shared_ptr<seafloor::BathymetryField> m_depths;
475
480 Status ComputeTotalCurrent(double time, const double pos[3], double vel[3]) const;
481
482private:
491 Status SumAtPoint(double time, const double pos[3], const WaterVelocityParts& parts, const wake::WakeComposition* wake, double velOut[3], WakedFlow* detail) const;
492
494 Status SumLiveAtPoint(double time, const double pos[3], const WaterVelocityParts& parts, const wake::WakeQuery& query, double velOut[3], WakedFlow* detail) const;
495};
496
497// Inline: the adapters and a receiver's per-evaluation call reach the live or held path without a call of their own (bench section held).
498inline Status EnvironmentFacade::GetWaterVelocity(const double time, const double pos[3], const WaterVelocityParts& parts, const wake::WakeQuery& query, const wake::HeldWakes* held, const std::size_t point, double velOut[3], WakedFlow* detail) const
499{
500 const bool withWake = parts.wakes || parts.jets;
501 if (withWake && held)
502 return SumAtPoint(time, pos, parts, &held->At(point, time), velOut, detail); // a reference: no copy per evaluation (fhsim_environment ENV-0100)
503 if (!withWake)
504 return SumAtPoint(time, pos, parts, nullptr, velOut, detail);
505 return SumLiveAtPoint(time, pos, parts, query, velOut, detail);
506}
507
508} // namespace marenv
Definition EnvironmentFacade.h:48
wake::HeldWakes HoldWakes(std::span< const std::array< double, 3 > > positions, double T, const wake::WakeQuery &query={}, double cutoff=0.0, const wake::OwnTagsAt &ownTags={}) const
Status GetWaterVelocity(double time, const double pos[3], const WaterVelocityParts &parts, double velOut[3]) const
std::shared_ptr< current::CurrentField > GetCurrentField(const std::string &id) const
std::shared_ptr< wake::JetField > GetJetField(const std::string &id) const
Status GetSurfaceElevation(double time, const double pos[2], double &elevationOut) override
EnvironmentFacade()
Definition EnvironmentFacade.h:56
std::shared_ptr< wake::WakeField > GetWakeField(const std::string &id) const
std::vector< std::string > GetWakeFieldIds() const
Status GetDensity(double time, const double pos[3], double &density) override
Status ComputeTotalCurrent(double time, const double pos[3], double vel[3]) const
bool HasCurrentField(const std::string &id) const
std::shared_ptr< wave::WaveField > m_waves
Wave field model providing wave-induced quantities.
Definition EnvironmentFacade.h:465
Status GetParticleAcceleration(double time, const double pos[3], double *accOut) override
Status GetWaterVelocity(double time, const double pos[3], const WaterVelocityParts &parts, const wake::HeldWakes &held, std::size_t point, double velOut[3]) const
Status ComputeRayIntersection(const double origin[3], const double direction[3], double &distanceOut, double maxSearchDistance=100, double startSearchDistance=-1, double stepSize=1.0, double convergenceTolerance=0.01) override
wave::WaveField & Waves() const
The wave field of the queries: m_waves, or the calm sea (NullWaveField) when it is null (MENV-0095).
Status GetParticleVelocity(double time, const double pos[3], double *velOut) override
Status GetSurfaceUnitNormal(double time, const double pos[2], double *unitNormalOut) override
std::shared_ptr< seafloor::BathymetryField > GetBathymetry()
Status PointEnvironmentQuery(double time, const double pos[3], EnvironmentQuery &queryResult) override
std::vector< std::string > GetJetFieldIds() const
Status GetCurrentVelocity(double time, const double pos[3], double *velOut) override
Status GetDynamicPressure(double time, const double pos[3], double &pressureOut) override
void SetWaves(std::shared_ptr< wave::WaveField > wave)
bool WakesStaticFrom(double t) const
Whether the wake and jet fields stay the same from t on until GetWakeRevision() changes: wake::WakeRe...
void AddJetField(const std::string &id, std::shared_ptr< wake::JetField > field)
double MaxWaveElevation() const
std::unordered_map< std::string, std::shared_ptr< current::CurrentField > > m_currentFields
Registry of current fields indexed by unique identifier; velocities are summed for the total current.
Definition EnvironmentFacade.h:470
void AddCurrentField(const std::string &id, std::shared_ptr< current::CurrentField > field)
std::shared_ptr< wave::WaveField > GetWaves()
Status GetSubmergence(double time, const double pos[3], double &submergence) override
std::shared_ptr< seafloor::BathymetryField > m_depths
Bathymetry field model providing seafloor geometry and properties.
Definition EnvironmentFacade.h:473
void SetBathymetry(std::shared_ptr< seafloor::BathymetryField > bathymetry)
Status GetWakedFlow(double time, const double pos[3], const wake::WakeQuery &query, WakedFlow &out) const
wake::WakeRegistry m_wakes
The registered wake fields in registration order (MENV-0035: the composition order is the same on eve...
Definition EnvironmentFacade.h:476
Status GetTotalPressure(double time, const double pos[3], double &pressureOut) override
std::vector< std::string > GetCurrentFieldIds() const
bool HasWakeField(const std::string &id) const
Status GetWakedFlow(double time, const double pos[3], WakedFlow &out) const
void RemoveCurrentField(const std::string &id)
void RemoveWakeField(const std::string &id)
void SetWaves(const wave::WaveEnergySpectrum::SpectrumParameters &params, wave::WaveTheory waveTheory, int numWaves, uint32_t seed)
void AddWakeField(const std::string &id, std::shared_ptr< wake::WakeField > field)
wake::WakeSelection SelectWakes(const wake::WakeQueryRegion &region, const wake::WakeQuery &query={}) const
void GetWaterVelocities(double time, std::span< const std::array< double, 3 > > positions, const WaterVelocityParts &parts, std::span< std::array< double, 3 > > velocities, std::span< Status > statuses) const
std::uint64_t GetWakeRevision() const
A number that grows whenever a wake or jet field is registered, removed or published again: wake::Wak...
Status GetSeaDepth(const double pos[2], double &depthOut) override
Status GetWaterVelocity(double time, const double pos[3], WaterVelocityTerms terms, double velOut[3]) const
Definition Environment.h:20
Definition WakeSelection.h:62
const WakeComposition & At(std::size_t point, double t) const
Definition WakeRegistry.h:47
Definition WakeSelection.h:119
Definition WaveField.h:41
WaterVelocityTerms
Definition WaterVelocity.h:18
Status
Definition marenv.h:44
WaveTheory
Definition WaveFactory.h:18
The marenv root namespace.
Definition CastPath.h:36
Struct for containing the data for a environment query.
Definition Environment.h:25
Definition EnvironmentFacade.h:33
int numJets
Number of the composed jet fields that contributed a non-zero excess velocity (ADR 0003).
Definition EnvironmentFacade.h:38
int numSources
Number of the composed wake fields that contributed a non-zero deficit.
Definition EnvironmentFacade.h:37
double waked[3]
Ambient current with the wake composition applied (the deficits, then the jets), plus the wave partic...
Definition EnvironmentFacade.h:35
double ambient[3]
Ambient current without any wake, m/s, NED.
Definition EnvironmentFacade.h:34
double deficit
Combined deficit d_tot in [0, 1] of the wake fields the query composes (by default all registered fie...
Definition EnvironmentFacade.h:36
Definition WaterVelocity.h:33
bool jets
The jets' excess velocity sum Δu_j.
Definition WaterVelocity.h:36
bool wakes
The change of the wake fields, d_tot (u_s - u_amb).
Definition WaterVelocity.h:35
Definition WakeTypes.h:138
Definition WakeField.h:23
Definition WakeSelection.h:33
The parameters defining a certain wave field.
Definition WaveEnergySpectrum.h:43