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.