FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
SensorCtd.h
1#pragma once
2
196#include "SampledSensor.h"
197
198#include <fhsim/simobject/SimObject.h>
199#include <fhsim_environment/ScalarField.h>
200#include <string>
201
202namespace environment
203{
204class EnvironmentProvider;
205}
206
207class SensorCtd : public SimObject
208{
209public:
211 struct Channel
212 {
213 double timeConstant = 0.0;
214 double bias = 0.0;
215 double noiseStd = 0.0;
216 double resolution = 0.0;
217 };
218
220 struct Settings
221 {
222 Channel temperature = {0.07, 0.002, 0.0005, 0.0};
223 Channel salinity = {0.06, 0.005, 0.002, 0.0};
224 Channel depth = {0.02, 0.05, 0.02, 0.0};
225 double samplePeriod = 0.0625;
226 unsigned int noiseSeed = 0;
227 };
228
230 struct Reading
231 {
232 double temperature = 0.0;
233 double salinity = 0.0;
234 double depth = 0.0;
235 double pressure = 0.0;
236 double position[3] = {0.0, 0.0, 0.0};
237 };
238
244 SensorCtd(std::string simObjectName, ISimObjectCreator* creator);
245
257 SensorCtd(std::string simObjectName, const Settings& settings);
258
266 static double LagDerivative(double fieldValue, double lagState, double timeConstant);
267
275 static double MeasuredValueOf(double lagState, double fieldValue, double timeConstant);
276
283 static double Quantize(double value, double resolution);
284
290 static double PressureOf(double depth);
291
299 static double Perturb(double trueValue, const Channel& channel, SensorNoise& noise);
300
302 void OdeFcn(const double dT, const double* const adX, double* const adXDot) const override;
303
309 void AcceptedStep(const double dT, const double* const adX) override;
310
318 void InitialConditionSetup(const double dT, const double* const adCurrentIC,
319 double* const adUpdatedIC, ISimObjectCreator* const creator) override;
320
327 void FinalSetup(const double dT, const double* const adX, ISimObjectCreator* const creator) override;
328
338 bool SampleIfDue(double t, double temperature, double salinity, double depth, const double position[3]);
339
347 void Update(double temperature, double salinity, double depth, const double position[3]);
348
350 const Reading& HeldReading() const { return m_reading; }
351
353 const Settings& GetSettings() const { return m_settings; }
354
356 double NextSampleTime() const { return m_sampler.NextSampleTime(); }
357
358protected:
360 const double* OutTemperature(const double dT, const double* const adX);
361
363 const double* OutSalinity(const double dT, const double* const adX);
364
366 const double* OutDepth(const double dT, const double* const adX);
367
369 const double* OutPressure(const double dT, const double* const adX);
370
372 const double* OutMeasurement(const double dT, const double* const adX);
373
375 const double* OutPosition(const double dT, const double* const adX);
376
377private:
379 struct FieldValues
380 {
381 double temperature = 0.0;
382 double salinity = 0.0;
383 bool temperatureUsable = false;
384 bool salinityUsable = false;
385 };
386
394 int FieldHandle(const std::string& name, environment::field::Quantity quantity) const;
395
403 void ReportMissingField(ISimObjectCreator* creator, const std::string& name, const std::string& quantity, const std::string& parameter) const;
404
410 void HoldUnusableChannels(const FieldValues& field, const Reading& held);
411
416 void ResolveEnvironment(ISimObjectCreator* const creator);
417
424 FieldValues FieldValuesAt(double dT, const double position[3]) const;
425
433 void StoreReading(double temperature, double salinity, double depth, const double position[3]);
434
440 void SeedHeldReading(double dT, const double* const adX);
441
449 static void SetInitialConditionIfUnset(const double* const adCurrentIC, double* const adUpdatedIC,
450 int stateIndex, double value);
451
452 SampledSensor m_sampler;
453 Settings m_settings;
454
455 std::string m_temperatureFieldName;
456 std::string m_salinityFieldName;
457
458 int m_temperatureHandle = -1;
459 int m_salinityHandle = -1;
460
461 int m_IStateLagT = 0;
462 int m_IStateLagS = 0;
463 int m_IStateLagD = 0;
464
465 Reading m_reading;
466 double m_measurement[3] = {0.0, 0.0, 0.0};
467};
Definition SampledSensor.h:49
double NextSampleTime() const
The time of the next sample, s.
Definition SampledSensor.h:129
Definition SensorCtd.h:208
const Settings & GetSettings() const
The settings the instrument was built with.
Definition SensorCtd.h:353
const double * OutDepth(const double dT, const double *const adX)
The measured depth of the sensor head, m.
static double Quantize(double value, double resolution)
const double * OutPressure(const double dT, const double *const adX)
The measured pressure, dbar.
void FinalSetup(const double dT, const double *const adX, ISimObjectCreator *const creator) override
double NextSampleTime() const
The time at which the next sample is due, s.
Definition SensorCtd.h:356
bool SampleIfDue(double t, double temperature, double salinity, double depth, const double position[3])
static double LagDerivative(double fieldValue, double lagState, double timeConstant)
const double * OutSalinity(const double dT, const double *const adX)
The measured salinity, PSU.
void InitialConditionSetup(const double dT, const double *const adCurrentIC, double *const adUpdatedIC, ISimObjectCreator *const creator) override
const double * OutTemperature(const double dT, const double *const adX)
The measured water temperature, degC.
const double * OutMeasurement(const double dT, const double *const adX)
The three measurements as [Salinity, Temperature, Depth].
void Update(double temperature, double salinity, double depth, const double position[3])
SensorCtd(std::string simObjectName, const Settings &settings)
static double Perturb(double trueValue, const Channel &channel, SensorNoise &noise)
const double * OutPosition(const double dT, const double *const adX)
The NED position the held sample was taken at, m.
static double MeasuredValueOf(double lagState, double fieldValue, double timeConstant)
static double PressureOf(double depth)
const Reading & HeldReading() const
The reading currently held on the output ports.
Definition SensorCtd.h:350
void AcceptedStep(const double dT, const double *const adX) override
void OdeFcn(const double dT, const double *const adX, double *const adXDot) const override
Writes the three lag derivatives and nothing else.
SensorCtd(std::string simObjectName, ISimObjectCreator *creator)
Definition SensorNoise.h:43
The instrument imperfections of one measured channel.
Definition SensorCtd.h:212
double noiseStd
The standard deviation of the Gaussian noise, in the channel's unit.
Definition SensorCtd.h:215
double resolution
The quantisation step, in the channel's unit. Zero means none.
Definition SensorCtd.h:216
double timeConstant
The first-order lag time constant, s. Zero means no lag.
Definition SensorCtd.h:213
double bias
The constant offset added at every sample, in the channel's unit.
Definition SensorCtd.h:214
One held instrument reading.
Definition SensorCtd.h:231
double pressure
The reported pressure, dbar.
Definition SensorCtd.h:235
double position[3]
The NED position the sample was taken at, m.
Definition SensorCtd.h:236
double salinity
The reported salinity, PSU.
Definition SensorCtd.h:233
double depth
The reported depth, m.
Definition SensorCtd.h:234
double temperature
The reported temperature, degC.
Definition SensorCtd.h:232
Everything that makes one instrument out of the shared sensor machinery.
Definition SensorCtd.h:221
Channel salinity
The salinity channel, PSU.
Definition SensorCtd.h:223
Channel depth
The depth channel, m.
Definition SensorCtd.h:224
unsigned int noiseSeed
The random seed; zero is deterministic and noise free.
Definition SensorCtd.h:226
double samplePeriod
The time between samples, s.
Definition SensorCtd.h:225
Channel temperature
The temperature channel, degC.
Definition SensorCtd.h:222