Virtual Testbed
Ship dynamics simulator for extreme conditions
linear_wave.hh
1 #ifndef VTESTBED_CORE_LINEAR_WAVE_HH
2 #define VTESTBED_CORE_LINEAR_WAVE_HH
3 
4 #include <vtestbed/base/constants.hh>
5 #include <vtestbed/core/wave.hh>
6 
7 namespace vtb {
8 
9  namespace core {
10 
11  template <class T, int N>
12  inline Frequency<T>
13  linear_wave_angular_frequency(const blitz::TinyVector<T,N>& k) {
14  using std::sqrt;
15  using base::constants;
16  constexpr auto g = constants<T>::g();
17  return Frequency<T>{sqrt(g*length(k))};
18  }
19 
20  template <class T, int N>
21  inline Frequency<T>
22  linear_wave_angular_frequency(Length<T> length, Direction<T> angle) {
23  return linear_wave_angular_frequency<T,N>(wave_number<T, N>(length, angle));
24  }
25 
26  template <class T, int N>
27  class Linear_wave: public Wave_base<T,N> {
28 
29  public:
30  using typename Wave_base<T,N>::vec;
31 
32  Linear_wave() = default;
33  ~Linear_wave() = default;
34  Linear_wave(const Linear_wave&) = default;
35  Linear_wave& operator=(const Linear_wave&) = default;
36 
37  inline
40  amplitude,
42  linear_wave_angular_frequency(wave_number)
43  ) {}
44 
45  inline
47  Linear_wave(amplitude, wave_number<T, N-1>(length, direction))
48  {}
49 
51  inline T
52  operator()(const vec& x, T t) const noexcept {
53  using blitz::dot;
54  using std::cos;
55  return this->amplitude() *
56  cos(dot(this->wave_number(), x) - this->angular_frequency()*t);
57  }
58 
59  };
60 
61  }
62 
63 }
64 
65 #endif // vim:filetype=cpp
T angular_frequency() const noexcept
Get wave angular frequency.
Definition: core/wave.hh:102
const vec & wave_number() const noexcept
Get wave numbers for each dimension.
Definition: core/wave.hh:96
vec length() const noexcept
Get wave length.
Definition: core/wave.hh:108
T direction() const noexcept
Get wave direction in radians.
Definition: core/wave.hh:120
T length(const blitz::TinyVector< T, N > &x)
Computes vector length without overflow.
Definition: blitz.hh:471
T amplitude() const noexcept
Get wave amplitude.
Definition: core/wave.hh:90
Main namespace.
Definition: convert.hh:9
T sqrt(T... args)
T operator()(const vec &x, T t) const noexcept
Returns wavy surface elevation at point x.
Definition: linear_wave.hh:52
Base class for water waves.
Definition: core/types.hh:49