Virtual Testbed
Ship dynamics simulator for extreme conditions
guile/testbed.cc
1 #include <vtestbed/config/real_type.hh>
2 #include <vtestbed/core/ship.hh>
3 #include <vtestbed/core/testbed.hh>
4 #include <vtestbed/guile/grid.hh>
5 #include <vtestbed/guile/macros.hh>
6 #include <vtestbed/guile/traits.hh>
7 
12 using wave_generator_type =
14 
15 namespace {
16  SCM type;
17  SCM kw_policy, kw_ship, kw_wave_generator;
18  SCM sym_opencl, sym_openmp;
19 }
20 
21 namespace vtb {
22 
23  namespace guile {
24 
25  template <> SCM traits_type::type() { return ::type; }
26 
33  SCM make_testbed(SCM rest) {
34  auto* wrapper = make_wrapper<object_type>();
35  SCM policy = sym_opencl, ship = SCM_UNDEFINED, wave_generator = SCM_UNDEFINED;
36  scm_c_bind_keyword_arguments("make-testbed", rest,
37  scm_t_keyword_arguments_flags{},
38  kw_policy, &policy, kw_ship, &ship,
39  kw_wave_generator, &wave_generator,
40  SCM_UNDEFINED);
41  if (symbol_equal(policy, sym_opencl)) { wrapper->get()->opencl_solvers(); }
42  else if (symbol_equal(policy, sym_openmp)) { wrapper->get()->openmp_solvers(); }
43  else { throw_error("bad policy"); return SCM_UNSPECIFIED; }
44  if (is_bound(ship)) {
45  auto* w = get_wrapper<ship_type>(ship);
46  wrapper->get()->ship(*w->get());
47  }
48  if (is_bound(wave_generator)) {
49  auto* w = get_wrapper<wave_generator_type>(wave_generator);
50  wrapper->get()->wavy_surface_generator(std::move(w->get()));
51  }
52  return make_object<object_type>(traits_type::type(), wrapper);
53  }
54 
61  SCM testbed_policy(SCM object, SCM policy) {
62  auto* self = get_object<object_type>(object);
63  if (symbol_equal(policy, sym_opencl)) { self->opencl_solvers(); }
64  else if (symbol_equal(policy, sym_openmp)) { self->openmp_solvers(); }
65  else { throw_error("bad policy"); return SCM_UNSPECIFIED; }
66  return SCM_UNSPECIFIED;
67  }
68 
75  SCM testbed_step(SCM object, SCM dt) {
76  get_object<object_type>(object)->step(scm_to_double(dt));
77  return SCM_UNSPECIFIED;
78  }
79 
86  SCM testbed_reset(SCM object) {
87  get_object<object_type>(object)->reset();
88  return SCM_UNSPECIFIED;
89  }
90 
97  SCM testbed_time_instant(SCM object) {
98  return to_scm(get_object<object_type>(object)->time_instant());
99  }
100 
107  SCM testbed_grid(SCM object) {
108  return grid_make(get_object<object_type>(object)->grid());
109  }
110 
111  template <> void
112  traits_type::define() {
113  kw_policy = scm_from_utf8_keyword("policy");
114  kw_ship = scm_from_utf8_keyword("ship");
115  kw_wave_generator = scm_from_utf8_keyword("wave-generator");
116  sym_opencl = scm_from_utf8_symbol("opencl");
117  sym_openmp = scm_from_utf8_symbol("openmp");
118  ::type = define_type<object_type>("<virtual-testbed>");
119  define_procedure("make-testbed", 0, 0, 1,
120  VTB_GUILE_1(make_testbed));
121  define_procedure("testbed-policy", 2, 0, 0, VTB_GUILE_2(testbed_policy));
122  define_procedure("testbed-step", 2, 0, 0, VTB_GUILE_2(testbed_step));
123  define_procedure("testbed-time-instant", 1, 0, 0,
124  VTB_GUILE_1(testbed_time_instant));
125  define_procedure("testbed-reset!", 1, 0, 0, VTB_GUILE_1(testbed_reset));
126  define_procedure("testbed-grid", 1, 0, 0, VTB_GUILE_1(testbed_grid));
127  }
128 
129  }
130 
131 }
Rigid ship with a mass and translational and angular velocity.
Definition: core/ship.hh:186
SCM make_testbed(SCM rest)
Construct virtual testbed.
SCM testbed_time_instant(SCM object)
Get current simulation time instant.
SCM testbed_reset(SCM object)
Reset virtual testbed state.
SCM testbed_step(SCM object, SCM dt)
Simulate one time step dt.
OBJ importer/exporter.
Definition: object.hh:28
Main namespace.
Definition: convert.hh:9
Main class for interacting with virtual testbed.
Definition: testbed.hh:33
SCM testbed_policy(SCM object, SCM policy)
Get policy.
SCM testbed_grid(SCM object)
Get simulation grid.