1 #include <vtestbed/config/openmp.hh> 2 #include <vtestbed/config/opencl.hh> 3 #include <vtestbed/config/real_type.hh> 4 #include <vtestbed/core/anlt_wind_solver.hh> 5 #include <vtestbed/linalg/linear_algebra.hh> 6 #include <vtestbed/core/ship_hull_panel.hh> 7 #include <vtestbed/core/policy.hh> 8 #include <vtestbed/opencl/opencl.hh> 9 #include <vtestbed/opencl/vector.hh> 24 using typename base_type::array_type;
25 using typename base_type::wind_field_type;
31 using vec3 = blitz::TinyVector<T,3>;
34 clx::kernel _kernel_near_the_boundary, _kernel_on_the_boundary;
39 using Context_base::context;
41 void context(
Context* rhs)
override {
42 Context_base::context(rhs);
43 auto prog = context()->compiler().compile(
"anlt_wind.cl");
44 this->_kernel_near_the_boundary = prog.kernel(
"wind_near_the_boundary");
45 this->_kernel_on_the_boundary = prog.kernel(
"wind_on_the_boundary");
56 const grid_type& grid,
59 const int npanels = panels.size();
60 auto& wind_field = this->_wind_field;
62 if (this->near_the_boundary()) {
63 wind_field.resize(grid.shape());
68 auto& ppl = this->context()->pipeline();
71 ppl.copy(panels, d_panels);
72 if (this->near_the_boundary()) {
73 auto& d_wind_field = this->_d_wind_field;
74 wind_field.resize(grid.shape());
75 ppl.allocate(wind_field, d_wind_field);
76 auto& kernel = this->_kernel_near_the_boundary;
77 kernel.argument(0, npanels);
78 kernel.argument(1, d_panels);
79 kernel.argument(2, d_wind_field);
80 kernel.argument(3, make_vector(grid.lbound()));
81 kernel.argument(4, make_vector(grid.ubound()));
82 kernel.argument(5, make_vector(grid.shape()));
83 kernel.argument(6, make_vector(u));
85 ppl.kernel(kernel, clx::range(wind_field.size()));
87 ppl.copy(d_wind_field, wind_field);
89 if (this->on_the_boundary()) {
90 auto& kernel = this->_kernel_on_the_boundary;
91 kernel.argument(0, npanels);
92 kernel.argument(1, d_panels);
93 kernel.argument(2, make_vector(u));
95 ppl.kernel(kernel, clx::range(npanels));
97 ppl.copy(d_panels, panels);
99 if (this->on_the_boundary() || this->near_the_boundary()) {
106 vtb::core::make_anlt_wind_solver<VTB_REAL_TYPE,vtb::core::Policy::OpenCL>() ->
107 std::unique_ptr<ANLT_wind_solver<VTB_REAL_TYPE>> {
109 new ANLT_wind_solver_opencl<VTB_REAL_TYPE>
Triangular ship hull panel (face).