1 #ifndef VTESTBED_CORE_WAVE_HH 2 #define VTESTBED_CORE_WAVE_HH 6 #include <vtestbed/base/blitz.hh> 7 #include <vtestbed/core/grid.hh> 8 #include <vtestbed/core/units.hh> 16 template <
class T,
int N>
20 struct Wave_number<T,1> {
21 static inline blitz::TinyVector<T,1>
22 wave_number(Length<T> length, Direction<T> angle) {
28 struct Wave_number<T,2> {
29 static inline blitz::TinyVector<T,2>
30 wave_number(Length<T> length, Direction<T> angle) {
31 const T a = 2*T{M_PI}/
length;
32 return {a*std::cos(angle), a*std::sin(angle)};
38 template <
class T,
int N>
39 inline blitz::TinyVector<T,N>
40 wave_number(Length<T> length, Direction<T> angle) {
41 return bits::Wave_number<T,N>::wave_number(length, angle);
53 template <
class T,
int N>
54 class alignas(16) Wave_base {
58 typedef blitz::TinyVector<T,N-1> vec;
67 Wave_base() =
default;
68 Wave_base(
const Wave_base&) =
default;
69 Wave_base& operator=(
const Wave_base&) =
default;
72 Wave_base(Amplitude<T>
amplitude,
const vec& k, Frequency<T> freq):
75 _angfrequency{freq} {}
86 _angfrequency{velocity} {}
91 return this->_amplitude;
103 return this->_angfrequency;
121 return std::atan2(this->_k(1), this->_k(0));
136 inline constexpr
static int 137 dimensions() noexcept {
149 template <
class T,
int N>
150 class No_wave:
public Wave_base<T,N> {
153 using typename Wave_base<T,N>::vec;
158 No_wave(
const No_wave&) =
default;
159 No_wave& operator=(
const No_wave&) =
default;
169 template <
class T,
int N,
class Wave>
171 courant_number_sum(
const Wave& wave,
const Grid<T,N>& grid) {
172 static_assert(N == 3,
"bad N");
173 const auto& dx = grid.select(1,2).delta();
174 return sum(wave.max_velocity() / dx);
177 template <
class T,
int N,
class Wave>
179 courant_number(
const Wave& wave,
const Grid<T,N>& grid) {
180 static_assert(N == 3,
"bad N");
181 const T& dt = grid.delta(0);
182 return dt * courant_number_sum<T,N,Wave>(wave, grid);
189 #endif // vim:filetype=cpp T operator()(const vec &, T) const noexcept
Returns wavy surface elevation at point x.
T angular_frequency() const noexcept
Get wave angular frequency.
const vec & wave_number() const noexcept
Get wave numbers for each dimension.
vec phase_velocity() const noexcept
Get phase velocity.
vec length() const noexcept
Get wave length.
T direction() const noexcept
Get wave direction in radians.
T scalar_length() const noexcept
Get wave length.
T length(const blitz::TinyVector< T, N > &x)
Computes vector length without overflow.
T amplitude() const noexcept
Get wave amplitude.
T period() const noexcept
Get wave period.