1 #include <vtestbed/config/real_type.hh> 2 #include <vtestbed/core/cosine_wave.hh> 4 template <
class T,
int N>
14 const T k_length = length(this->wave_number());
15 const T& angfreq = this->angular_frequency();
16 return this->amplitude() * angfreq
17 * cos(dot(this->wave_number(), x)) * sin(angfreq*t)
18 * sinh(k_length * z) / k_length;
21 template <
class T,
int N>
25 const T& a = this->amplitude();
26 const auto& k = this->wave_number();
27 const T k_length = length(k);
28 const T phi = abs(a * this->angular_frequency()
29 * sinh(k_length * a) / k_length);
30 return {k(0)*phi, k(1)*phi};
33 template <
class T,
int N>
36 static_assert(N == 3,
"bad N");
41 auto length = this->length();
42 const auto& period = this->period();
43 const auto& mask = isfinite(length);
44 T length_max = max(where(mask, length, T{0}));
45 length = T{0.75}*where(mask, length, length_max);
46 blitz::TinyVector<T,2> npoints =
ceil(length) + 1;
50 {2,int(npoints(0)),int(npoints(1))}
52 T dt = T{0.25} / courant_number_sum(*
this, grid);
53 grid.end(0) = int(
ceil(period / dt)) + 1;
55 std::clog <<
"dx=" << grid.delta(1) << std::endl;
56 std::clog <<
"dy=" << grid.delta(2) << std::endl;
57 std::clog <<
"grid=" << grid << std::endl;
58 T courant = courant_number(*
this, grid);
59 std::clog <<
"courant=" << courant << std::endl;
64 #if defined(VTB_REAL_TYPE_FLOAT)
T length(const blitz::TinyVector< T, N > &x)
Computes vector length without overflow.
Standing plain wave which has cosine shape.
T velocity_potential(const vec &x, T t, T z)
Return velocity potential at point x.