1 #include <vtestbed/config/real_type.hh> 2 #include <vtestbed/core/cosine_wave.hh> 3 #include <vtestbed/core/stokes_wave.hh> 4 #include <vtestbed/core/plain_wave_generator.hh> 5 #include <vtestbed/opencl/opencl.hh> 6 #include <vtestbed/opencl/vector.hh> 12 template <
class T>
struct Function_name;
14 template <
class T,
int N>
15 struct Function_name<
vtb::core::Propagating_cosine_wave<T,N>> {
16 static constexpr
const char* value =
"propagating_cosine_wave";
19 template <
class T,
int N>
20 struct Function_name<
vtb::core::Standing_cosine_wave<T,N>> {
21 static constexpr
const char* value =
"standing_cosine_wave";
24 template <
class T,
int N>
25 struct Function_name<
vtb::core::Propagating_stokes_wave<T,N>> {
26 static constexpr
const char* value =
"propagating_stokes_wave";
35 template <
class T,
int N,
class Wave>
43 using typename base_type::array_type;
47 clx::buffer _d_surface;
52 void generate(
const grid_type& grid, array_type& result)
override {
53 using vtb::opencl::resize;
54 auto context = this->context();
55 auto& ppl = context->pipeline();
56 auto& kernel = this->_kernel;
57 resize<T>(context->context(), this->_d_surface, result.size());
58 kernel.argument(0, this->wave());
59 kernel.argument(1, make_vector(grid.
lbound()));
60 kernel.argument(2, make_vector(grid.
delta()));
61 kernel.argument(3, make_vector(grid.
shape()));
62 kernel.argument(4, this->_d_surface);
63 ppl.kernel(kernel, grid.
shape());
65 ppl.copy(this->_d_surface.slice(0,result.size()*
sizeof(T)), result.data());
69 using Context_base::context;
71 void context(
Context* rhs)
override {
72 Context_base::context(rhs);
73 auto cc = context()->compiler_copy();
75 auto options = cc.options();
77 auto pos = options.find(old_flags);
78 if (pos != std::string::npos) {
79 options.erase(pos, old_flags.size());
80 options += real_type_flags<T>();
84 auto prog = cc.compile(
"plain_wave_generator.cl");
85 this->_kernel = prog.kernel(Function_name<Wave>::value);
90 template <
class T,
int N>
92 make_plain_wave_generator_opencl(std::any wave);
98 #define VTB_MAKE_PLAIN_WAVE_SURFACE_GENERATOR(T,N,Wave) \ 101 vtb::core::make_plain_wave_generator(const Wave<T,N>& wave) \ 102 -> std::unique_ptr<Plain_wave_generator<T,N,Wave<T,N>,Policy::OpenCL>> { \ 103 return std::unique_ptr<Plain_wave_generator<T,N,Wave<T,N>,Policy::OpenCL>>( \ 104 new Plain_wave_generator_opencl<T,N,Wave<T,N>>(wave) \ 109 vtb::core::make_plain_wave_generator() \ 110 -> std::unique_ptr<Plain_wave_generator<T,N,Wave<T,N>,Policy::OpenCL>> { \ 111 return std::unique_ptr<Plain_wave_generator<T,N,Wave<T,N>,Policy::OpenCL>>( \ 112 new Plain_wave_generator_opencl<T,N,Wave<T,N>>() \ 116 VTB_MAKE_PLAIN_WAVE_SURFACE_GENERATOR(VTB_REAL_TYPE,3,Propagating_cosine_wave);
117 VTB_MAKE_PLAIN_WAVE_SURFACE_GENERATOR(VTB_REAL_TYPE,3,Standing_cosine_wave);
118 VTB_MAKE_PLAIN_WAVE_SURFACE_GENERATOR(VTB_REAL_TYPE,3,Propagating_stokes_wave);
119 #if defined(VTB_REAL_TYPE_FLOAT) 120 VTB_MAKE_PLAIN_WAVE_SURFACE_GENERATOR(
double,3,Propagating_cosine_wave);
121 VTB_MAKE_PLAIN_WAVE_SURFACE_GENERATOR(
double,3,Standing_cosine_wave);
122 VTB_MAKE_PLAIN_WAVE_SURFACE_GENERATOR(
double,3,Propagating_stokes_wave);
125 template <
class T,
int N>
127 vtb::core::make_plain_wave_generator_opencl(std::any wave) {
133 return pointer(
new Plain_wave_generator_opencl<T,N,propagating_cosine>(
134 std::any_cast<propagating_cosine>(wave)));
137 return pointer(
new Plain_wave_generator_opencl<T,N,standing_cosine>(
138 std::any_cast<standing_cosine>(wave)));
141 return pointer(
new Plain_wave_generator_opencl<T,N,propagating_stokes>(
142 std::any_cast<propagating_stokes>(wave)));
148 vtb::core::make_plain_wave_generator_opencl<VTB_REAL_TYPE,3>(std::any wave);
149 #if defined(VTB_REAL_TYPE_FLOAT) 151 vtb::core::make_plain_wave_generator_opencl<double,3>(std::any wave);
Propagating plain wave which has cosine shape.
Propagating third-order Stokes wave.
const vec & lbound() const noexcept
Lower bound of the region.
const int_n shape() const noexcept
The number of points for all dimensions.
const T delta(int i) const
The size of the patch (interval) for dimension i.
A region defined by start and end index and lower and upper bound for each dimension.
Wavy surface generator that produces elevation grid for individual wave.
Standing plain wave which has cosine shape.
Base class for wavy surface generators.