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> 17 SCM kw_policy, kw_ship, kw_wave_generator;
18 SCM sym_opencl, sym_openmp;
25 template <> SCM traits_type::type() { return ::type; }
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,
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; }
45 auto* w = get_wrapper<ship_type>(ship);
46 wrapper->get()->ship(*w->get());
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()));
52 return make_object<object_type>(traits_type::type(), wrapper);
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;
76 get_object<object_type>(
object)->step(scm_to_double(dt));
77 return SCM_UNSPECIFIED;
87 get_object<object_type>(
object)->reset();
88 return SCM_UNSPECIFIED;
98 return to_scm(get_object<object_type>(
object)->time_instant());
108 return grid_make(get_object<object_type>(
object)->grid());
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,
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,
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));
Rigid ship with a mass and translational and angular velocity.
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.
Main class for interacting with virtual testbed.
SCM testbed_policy(SCM object, SCM policy)
Get policy.
SCM testbed_grid(SCM object)
Get simulation grid.