1 #include <vtestbed/config/real_type.hh> 2 #include <vtestbed/core/gerstner.hh> 3 #include <vtestbed/guile/macros.hh> 4 #include <vtestbed/guile/traits.hh> 12 SCM kw_policy, kw_diffraction, kw_radiation, kw_waterline_only, kw_waves;
13 SCM sym_opencl, sym_openmp;
21 template <> SCM traits_type::type() { return ::type; }
32 using vtb::core::make_gerstner_solver;
33 using T = VTB_REAL_TYPE;
34 SCM s_policy = sym_opencl, diffraction = SCM_UNDEFINED, radiation = SCM_UNDEFINED,
35 waterline_only = SCM_UNDEFINED, waves = SCM_UNDEFINED;
36 scm_c_bind_keyword_arguments(
"make-gerstner-solver", rest,
37 scm_t_keyword_arguments_flags{},
39 kw_diffraction, &diffraction,
40 kw_radiation, &radiation,
41 kw_waterline_only, &waterline_only,
44 Policy policy = Policy::OpenCL;
45 if (symbol_equal(s_policy, sym_opencl)) { policy = Policy::OpenCL; }
46 else if (symbol_equal(s_policy, sym_openmp)) { policy = Policy::OpenMP; }
47 else { throw_error(
"bad policy");
return SCM_UNSPECIFIED; }
48 auto&& solver = make_gerstner_solver<T,3>(policy);
49 if (is_bound(diffraction)) { solver->diffraction(from_scm<bool>(diffraction)); }
50 if (is_bound(radiation)) { solver->radiation(from_scm<bool>(radiation)); }
51 if (is_bound(waterline_only)) {
52 solver->waterline_only(from_scm<bool>(waterline_only));
54 if (is_bound(waves)) {
55 if (!is_list(waves)) {
56 throw_error(
"bad waves type");
57 return SCM_UNSPECIFIED;
60 using wave_type =
typename wave_array::value_type;
62 while (waves != SCM_EOL) {
63 auto* wrapper = get_wrapper<wave_type>(scm_car(waves));
64 new_waves.emplace_back(*wrapper->get());
65 waves = scm_cdr(waves);
67 solver->waves(std::move(new_waves));
69 return traits_type::make(std::move(solver));
73 traits_type::define() {
74 ::type = define_type<object_type>(
"<gerstner-solver>");
75 kw_policy = scm_from_utf8_keyword(
"policy");
76 kw_diffraction = scm_from_utf8_keyword(
"diffraction");
77 kw_radiation = scm_from_utf8_keyword(
"radiation");
78 kw_waterline_only = scm_from_utf8_keyword(
"waterline-only");
79 kw_waves = scm_from_utf8_keyword(
"waves");
80 sym_opencl = scm_from_utf8_symbol(
"opencl");
81 sym_openmp = scm_from_utf8_symbol(
"openmp");
82 define_procedure(
"make-gerstner-solver", 0, 0, 1,
Trochoidal irrotational waves solves named after Gerstner.
SCM make_gerstner_solver(SCM rest)
Construct Gerstner solver.