8#include <Kokkos_Core.hpp>
12#include "interpolator.hxx"
23void TEMPLATED_CLASSNAME::FindRadius(
void) {
24 assert(this->mNodesPerCluster > 0);
25 const std::string _region_name =
"RbfPumInterpolator::find_radius";
26 Kokkos::Profiling::ScopedRegion region(_region_name);
27 const ExecSpace execspace{};
29 VectorView<Point> samples(Kokkos::view_alloc(execspace,
30 Kokkos::WithoutInitializing,
31 _region_name +
"::samples"),
33 auto samples_host = Kokkos::create_mirror_view(Kokkos::WithoutInitializing,
34 Kokkos::HostSpace{}, samples);
36 const Point lower = this->mSourceBvh.bounds().minCorner();
37 const Point upper = this->mSourceBvh.bounds().maxCorner();
39 for (
int_t axis = 0; axis < Dim; ++axis) {
40 center[axis] = (lower[axis] + upper[axis]) / 2.;
43 samples_host(0) = Point{center};
44 for (
int_t axis = 0; axis < Dim; ++axis) {
45 Point sample = Point{center};
46 coordinates_t current_axis_length = std::abs(upper[axis] - lower[axis]);
47 sample[axis] -= current_axis_length * 0.25;
48 samples_host(axis + 1) = Point{sample};
49 sample[axis] += current_axis_length * 0.5;
50 samples_host(Dim + axis + 1) = Point{sample};
53 Kokkos::deep_copy(samples, samples_host);
55 Projection project_samples_to_input_predicate{samples};
56 ProjectionCallback project_samples_to_input_callback{};
62 using ProjectionRet = Kokkos::pair<Point, Point>;
63 VectorView<ProjectionRet> projected_samples_values(
64 Kokkos::view_alloc(execspace, Kokkos::WithoutInitializing,
65 _region_name +
"::projected_samples_values"),
67 VectorView<offset_t> projected_samples_offsets(
68 Kokkos::view_alloc(execspace, Kokkos::WithoutInitializing,
69 _region_name +
"::projected_samples_offsets"),
72 this->mSourceBvh.query(execspace, project_samples_to_input_predicate,
73 project_samples_to_input_callback,
74 projected_samples_values, projected_samples_offsets);
78 _region_name +
"::p_for project samples on the source "
80 Kokkos::RangePolicy(execspace, 0, 2 * Dim + 1),
83 projected_samples_values(projected_samples_offsets(i)).second;
87 DistanceToKNearest vertices_per_sample_predicate{this->mNodesPerCluster,
89 DistanceToKNearestCallback vertices_per_sample_callback{};
91 VectorView<fp_t> squared_distances_values(
92 Kokkos::view_alloc(execspace, Kokkos::WithoutInitializing,
93 _region_name +
"::squared_distances_values"),
95 VectorView<offset_t> squared_distances_offsets(
96 Kokkos::view_alloc(execspace, Kokkos::WithoutInitializing,
97 _region_name +
"::squared_distances_offsets"),
99 this->mSourceBvh.query(execspace, vertices_per_sample_predicate,
100 vertices_per_sample_callback, squared_distances_values,
101 squared_distances_offsets);
103 VectorView<fp_t> max_radii(Kokkos::view_alloc(execspace,
104 Kokkos::WithoutInitializing,
105 _region_name +
"::max_radii"),
107 Kokkos::parallel_for(
108 _region_name +
"::p_for sum max radius",
109 Kokkos::RangePolicy(execspace, 0, 2 * Dim + 1),
110 KOKKOS_LAMBDA(
const int_t &i) {
112 for (
offset_t ii = squared_distances_offsets(i);
113 ii < squared_distances_offsets(i + 1); ++ii) {
114 n_max = (n_max > squared_distances_values(ii))
116 : squared_distances_values(ii);
118 max_radii(i) = n_max;
121 Kokkos::sort(max_radii);
123 Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace{}, max_radii);
124 this->mRadius = std::sqrt(max_radii_h(Dim));
KOKKOS_INLINE_FUNCTION consteval fp_t zero(void)