Virtual Testbed
Ship dynamics simulator for extreme conditions
wave_generator.cc
1 #include <vtestbed/config/real_type.hh>
2 #include <vtestbed/core/calm_sea_generator.hh>
3 #include <vtestbed/core/cosine_wave.hh>
4 #include <vtestbed/core/plain_wave_generator.hh>
5 #include <vtestbed/core/stokes_wave.hh>
6 #include <vtestbed/guile/macros.hh>
7 #include <vtestbed/guile/traits.hh>
8 
14 
15 namespace {
16  SCM type;
17  SCM kw_policy, kw_wave;
18  SCM sym_opencl, sym_openmp;
19 }
20 
21 
22 namespace vtb {
23 
24  namespace guile {
25 
26  template <> SCM traits_type::type() { return ::type; }
27 
35  inline SCM make_calm_sea_generator() {
36  using vtb::core::make_calm_sea_generator;
37  using T = VTB_REAL_TYPE;
38  return traits_type::make(make_calm_sea_generator<T,3>());
39  }
40 
48  inline SCM make_plain_wave_generator(SCM rest) {
49  using namespace vtb::core;
50  using vtb::core::make_plain_wave_generator;
51  using T = VTB_REAL_TYPE;
52  SCM s_policy = sym_opencl, wave = SCM_UNDEFINED;
53  scm_c_bind_keyword_arguments("make-plain-wave-generator", rest,
54  scm_t_keyword_arguments_flags{},
55  kw_policy, &s_policy, kw_wave, &wave,
56  SCM_UNDEFINED);
57  Policy policy = Policy::OpenCL;
58  if (symbol_equal(s_policy, sym_opencl)) { policy = Policy::OpenCL; }
59  else if (symbol_equal(s_policy, sym_openmp)) { policy = Policy::OpenMP; }
60  else { throw_error("bad policy"); return SCM_UNSPECIFIED; }
61  SCM wave_class = scm_class_of(wave);
62  if (wave_class == Traits<propagating_cosine>::type()) {
63  auto* wrapper = get_wrapper<propagating_cosine>(wave);
64  auto generator = make_plain_wave_generator<T,3>(*wrapper->get(), policy);
65  return traits_type::make(std::move(generator));
66  }
67  if (wave_class == Traits<standing_cosine>::type()) {
68  auto* wrapper = get_wrapper<standing_cosine>(wave);
69  auto generator = make_plain_wave_generator<T,3>(*wrapper->get(), policy);
70  return traits_type::make(std::move(generator));
71  }
72  if (wave_class == Traits<propagating_stokes>::type()) {
73  auto* wrapper = get_wrapper<propagating_stokes>(wave);
74  auto generator = make_plain_wave_generator<T,3>(*wrapper->get(), policy);
75  return traits_type::make(std::move(generator));
76  }
77  throw_error("bad wave");
78  return SCM_UNSPECIFIED;
79  }
80 
81  template <> void
82  traits_type::define() {
83  ::type = define_type<object_type>("<wave-generator>");
84  kw_policy = scm_from_utf8_keyword("policy");
85  kw_wave = scm_from_utf8_keyword("wave");
86  sym_opencl = scm_from_utf8_symbol("opencl");
87  sym_openmp = scm_from_utf8_symbol("openmp");
88  define_procedure("make-calm-sea-generator", 0, 0, 0,
89  VTB_GUILE_0(make_calm_sea_generator));
90  define_procedure("make-plain-wave-generator", 0, 0, 1,
91  VTB_GUILE_1(make_plain_wave_generator));
92  }
93 
94  }
95 
96 }
Propagating plain wave which has cosine shape.
Definition: cosine_wave.hh:17
Propagating third-order Stokes wave.
Definition: stokes_wave.hh:33
Core components.
Definition: bstream.hh:181
OBJ importer/exporter.
Definition: object.hh:28
Main namespace.
Definition: convert.hh:9
SCM make_plain_wave_generator(SCM rest)
Construct plain wave wavy surface generator.
Standing plain wave which has cosine shape.
Definition: cosine_wave.hh:56
SCM make_calm_sea_generator()
Construct calm sea wavy surface generator.