Virtual Testbed
Ship dynamics simulator for extreme conditions
cosine_wave.cc
1 #include <vtestbed/config/real_type.hh>
2 #include <vtestbed/core/cosine_wave.hh>
3 
4 template <class T,int N>
5 T
7  const vec& x,
8  T t,
9  T z
10 ) {
11  using blitz::dot;
12  using std::sin;
13  using std::sinh;
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;
19 }
20 
21 template <class T,int N>
22 auto
24  using std::abs;
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};
31 }
32 
33 template <class T,int N>
36  static_assert(N == 3, "bad N");
37  using blitz::ceil;
38  using blitz::max;
39  using blitz::where;
40  using std::ceil;
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;
47  Grid<T,N> grid{
48  {0,0,0},
49  {period,length(0),length(1)},
50  {2,int(npoints(0)),int(npoints(1))}
51  };
52  T dt = T{0.25} / courant_number_sum(*this, grid);
53  grid.end(0) = int(ceil(period / dt)) + 1;
54  std::clog << "dt=" << dt << std::endl;
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;
60  return grid;
61 }
62 
64 #if defined(VTB_REAL_TYPE_FLOAT)
66 #endif
T ceil(T... args)
T length(const blitz::TinyVector< T, N > &x)
Computes vector length without overflow.
Definition: blitz.hh:471
Standing plain wave which has cosine shape.
Definition: cosine_wave.hh:56
T velocity_potential(const vec &x, T t, T z)
Return velocity potential at point x.
Definition: cosine_wave.cc:6