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.