5#include <marenv/marenv.h>
6#include <marenv/wake/FieldSketch.h>
7#include <marenv/wake/JetField.h>
8#include <marenv/wake/WakeBlend.h>
9#include <marenv/wake/WakeField.h>
25 static constexpr double kZero[3] = {0.0, 0.0, 0.0};
26 if constexpr (
requires { snapshot.sourceVelocity; })
27 return snapshot.sourceVelocity;
56 for (
int i = 0; i < 3; ++i)
102template<
class Snapshot,
class Traits = WakeFieldTraits>
106 using Value =
typename Traits::Value;
110 Status Sample(
double t,
const double pos[3], Value& out)
const override {
return SampleWith(t, pos, SnapshotSampler {}, out); }
115 typename Traits::Parts
SampleParts(
double t,
const double pos[3])
const override {
return PartsWith(t, pos, SnapshotSampler {}); }
133 void SampleMany(
double t, std::span<
const std::array<double, 3>> positions, std::span<Value> out, std::span<Status> status)
const override
136 for (std::size_t i = 0; i < positions.size(); ++i)
137 status[i] = SampleState(state.get(), t, positions[i].data(), SnapshotSampler {}, out[i]);
144 state->current->Sketch(t, out);
152 template<
class Sampler>
156 return SampleState(state.get(), t, pos, sampler, out);
160 template<
class Sampler>
161 typename Traits::Parts
PartsWith(
double t,
const double pos[3],
const Sampler& sampler)
const
164 typename Traits::Parts parts;
166 parts.status = SampleState(state.get(), t, pos, sampler, parts.sample);
169 parts.blending =
true;
171 Traits::FillParts(parts, *state->current);
179 struct SnapshotSampler
181 bool operator()(
const Snapshot& snapshot,
double t,
const double* pos, Value& out)
const {
return snapshot.Sample(t, pos, out); }
185 template<
class Sampler>
186 static Status SampleState(
const typename Blend::State* state,
double t,
const double pos[3],
const Sampler& sampler, Value& out)
192 return Traits::ToSample(
Blend::Evaluate(*state, t, pos, sampler), *state->current, out);
Definition BlendedField.h:104
void Sketch(double t, FieldSketch &out) const override
Appends the sketch of the snapshot blended to at t (see WakeField::Sketch()); nothing before the firs...
Definition BlendedField.h:141
bool MayReach(const WakeQueryRegion ®ion) const override
Definition BlendedField.h:120
Status SampleWith(double t, const double pos[3], const Sampler &sampler, Value &out) const
Definition BlendedField.h:153
Blend m_blend
The published snapshots and the blend between them (single writer).
Definition BlendedField.h:175
void SampleMany(double t, std::span< const std::array< double, 3 > > positions, std::span< Value > out, std::span< Status > status) const override
Sample() at every point, the published state loaded once (see WakeField::SampleMany()).
Definition BlendedField.h:133
std::uint64_t Revision() const override
The number of publishes (see WakeField::Revision()).
Definition BlendedField.h:127
bool StaticFrom(double t) const override
No blend at t or later and the published snapshot at rest (see WakeField::StaticFrom()).
Definition BlendedField.h:130
Traits::Parts PartsWith(double t, const double pos[3], const Sampler &sampler) const
SampleParts() with each snapshot sampled by sampler, as SampleWith().
Definition BlendedField.h:161
Status Sample(double t, const double pos[3], Value &out) const override
Definition BlendedField.h:110
Traits::Parts SampleParts(double t, const double pos[3]) const override
Definition BlendedField.h:115
Definition JetField.h:134
Definition WakeBlend.h:68
std::uint64_t Revision() const
The number of publishes so far (WakeField::Revision()).
Definition WakeBlend.h:136
std::shared_ptr< const State > Load() const
The published state, one atomic load; null before the first Publish(). A query loads it once and uses...
Definition WakeBlend.h:86
static bool Blends(const State &state, double t)
Whether the state blends at t or later: the weight of t is below 1, so it still changes (owner ruling...
Definition WakeBlend.h:133
static typename Traits::Samples Samples(const State &state, double t, const double pos[3])
Definition WakeBlend.h:155
static bool MayReach(const State &state, const WakeQueryRegion ®ion)
Definition WakeBlend.h:180
static Sum Evaluate(const State &state, double t, const double pos[3])
The sums of the snapshots of state at pos and t, weighted by the blend.
Definition WakeBlend.h:105
bool StaticFrom(double t) const
Definition WakeBlend.h:142
Definition WakeField.h:56
Status
Definition marenv.h:40
@ ERROR_NOT_SET
No valid data (outside a field's horizontal extent, a NaN position, no field); the value is not set (...
const double * ZeroDeficitVelocity(const S &snapshot)
The source velocity a wake field reports where d = 0: the snapshot's sourceVelocity if it has one (Gr...
Definition BlendedField.h:23
Definition FieldSketch.h:16
Status ToSample(JetSample &out) const
Definition JetField.h:53
Definition BlendedField.h:65
static void FillParts(Parts &, const S &)
A jet has no zero-deficit velocity: nothing to set.
Definition BlendedField.h:81
static Status ToSample(const Sum &sum, const S &, Value &out)
The field's sample from the sum of the blend.
Definition BlendedField.h:74
Definition WakeSampleParts.h:79
Definition WakeSampleParts.h:29
Status ToSample(const double zeroDeficitVelocity[3], WakeSample &out) const
Definition WakeSampleParts.h:58
Definition BlendedField.h:37
static Status ToSample(const Sum &sum, const S ¤t, Value &out)
The field's sample from the sums of the blend; where d = 0 the source velocity of the snapshot blende...
Definition BlendedField.h:46
static void FillParts(Parts &parts, const S ¤t)
Sets the source velocity the parts report where d = 0 (as ToSample()).
Definition BlendedField.h:53
Definition WakeField.h:23
Definition WakeSampleParts.h:111
double zeroDeficitVelocity[3]
Blending: the source velocity the field reports where d = 0, m/s, NED.
Definition WakeSampleParts.h:116
Definition WakeTypes.h:21