Virtual Testbed
Ship dynamics simulator for extreme conditions
statistics.hh
1 #ifndef VTESTBED_CORE_STATISTICS_HH
2 #define VTESTBED_CORE_STATISTICS_HH
3 
4 #include <iosfwd>
5 #include <utility>
6 
7 #include <vtestbed/base/blitz.hh>
8 #include <vtestbed/core/circular_buffer.hh>
9 #include <vtestbed/core/grid.hh>
10 #include <vtestbed/core/wave_numbers.hh>
11 
12 namespace vtb {
13 
14  namespace core {
15 
17 
18  public:
19  using size_type = std::size_t;
20  enum class Record {
21  Time = 0,
22  Position = 1,
23  Euler_angles = 4,
24  Velocity = 7,
25  Angular_velocity = 10,
26  Acceleration = 13,
27  Angular_acceleration = 16,
28  Underwater_volume = 19,
29  Wave_length = 20,
30  Wave_number = 23,
31  Wave_height = 26,
32  Wavy_surface = 29,
33  Angular_momentum = 30,
34  Number_of_records = 33,
35  // aliases for vector components
36  Surge = 1, Sway = 2, Heave = 3,
37  Roll = 4, Pitch = 5, Yaw = 6,
38  Velocity_x = 7, Velocity_y = 8, Velocity_z = 9,
39  Angular_velocity_x = 10, Angular_velocity_y = 11, Angular_velocity_z = 12,
40  Acceleration_x = 13, Acceleration_y = 14, Acceleration_z = 15,
41  Angular_acceleration_x = 16,
42  Angular_acceleration_y = 17,
43  Angular_acceleration_z = 18,
44  Wave_length_t = 20, Wave_length_x = 21, Wave_length_y = 22,
45  Wave_number_t = 23, Wave_number_x = 24, Wave_number_y = 25,
46  Wave_height_t = 26, Wave_height_x = 27, Wave_height_y = 28,
47  Angular_momentum_x = 30, Angular_momentum_y = 31, Angular_momentum_z = 32,
48  };
49 
50 
51  public:
52 
53  static constexpr inline size_type
54  size() noexcept {
55  return static_cast<size_type>(Record::Number_of_records);
56  }
57 
58  static void write_header(std::ostream& out);
59 
60  };
61 
62  template <class T>
63  class Statistics: public Statistics_base {
64 
65  public:
67  using size_type = typename time_series::size_type;
68  using pointer = time_series*;
69  using const_pointer = const time_series*;
70  using reference = time_series&;
71  using const_reference = const time_series&;
72  using array1 = blitz::Array<T,1>;
73  using array2 = blitz::Array<T,2>;
74  using grid1 = Grid<T,1>;
75  using shape2 = blitz::TinyVector<int,2>;
76  using wave_statistics_vector = Wave_statistics_vector<T,3>;
77 
78  private:
79  time_series _series[size()];
80  wave_statistics_vector _waves;
81 
82  public:
83 
84  inline explicit
86  for (auto& s : this->_series) { s.resize(n); }
87  }
88 
89  Statistics(Statistics&&) = default;
90 
91  Statistics&
92  operator=(const Statistics& rhs) = default;
93 
94  inline void
95  record(Record rec, T value) {
96  auto& stats = *this;
97  stats[rec].record(value);
98  }
99 
100  inline void
101  record(Record rec, const blitz::TinyVector<T,3>& value) {
102  auto& series = this->_series;
103  auto i = static_cast<size_type>(rec);
104  series[i].record(value(0));
105  series[i+1].record(value(1));
106  series[i+2].record(value(2));
107  }
108 
109  inline const_reference
110  operator[](Record rec) const {
111  return this->_series[static_cast<size_type>(rec)];
112  }
113 
114  inline reference
115  operator[](Record rec) {
116  return this->_series[static_cast<size_type>(rec)];
117  }
118 
119  inline pointer begin() { return this->_series; }
120  inline const_pointer begin() const { return this->_series; }
121  inline pointer end() { return this->begin() + this->size(); }
122  inline const_pointer end() const { return this->begin() + this->size(); }
123  inline size_type series_size() const { return this->_series[0].size(); }
124  void clear();
125 
127  void write_back(std::ostream& out) const;
128 
129  inline const_reference
130  time_instant_series() const {
131  return this->operator[](Record::Time);
132  }
133 
134  inline const_reference
135  wavy_surface_series() const {
136  return this->operator[](Record::Wavy_surface);
137  }
138 
139 
140  inline wave_statistics_vector& waves() { return this->_waves; }
141  inline const wave_statistics_vector& waves() const { return this->_waves; }
142 
143  void record_waves();
144 
145  private:
146 
147  auto uniform_wavy_surface() const -> std::pair<array1,grid1>;
148 
149  };
150 
151  }
152 
153 }
154 
155 #endif // vim:filetype=cpp
A region defined by start and end index and lower and upper bound for each dimension.
Definition: core/grid.hh:25
Main namespace.
Definition: convert.hh:9
void write_back(std::ostream &out) const
Write the last sample.
Definition: statistics.cc:42
Fixed-size circular buffer. Used as time series storage.