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.