53 bool extrapol =
false) {
54 Kokkos::Profiling::pushRegion(
"FiniteElements::ComputeProjectionOn3DSkin");
55 using MemorySpace =
typename ExecSpace::memory_space;
56 using Triangle = ArborX::Triangle<3, coordinates_t>;
57 using Point = ArborX::Point<3, coordinates_t>;
59 ExecSpace execSpace{};
61 auto sourcePointsPtr = transfer.sourcePoints;
62 auto sourceValuesPtr = transfer.sourceValues;
63 auto connValPtr = transfer.connValues;
64 auto connOffPtr = transfer.connOffsets;
65 auto CellTypesPtr = transfer.cellTypes;
67 auto targetPointsPtr = transfer.targetPoints;
68 auto targetValuesPtr = transfer.targetValues;
69 auto targetStatusPtr = transfer.targetStatus;
70 auto nbtargetPoints = targetPointsPtr.extent_int(0);
72 auto skinFacesPtr = transfer.skinFaces;
73 auto skinParentsPtr = transfer.skinParents;
75 auto nbTri = transfer.skinFaces.extent_int(0);
76 Kokkos::View<Triangle *, MemorySpace> skinFacesView(
77 Kokkos::view_alloc(execSpace, Kokkos::WithoutInitializing,
78 "Skin ArborX Triangles"),
81 "Fill ArborX triangles",
82 Kokkos::RangePolicy<ExecSpace>(execSpace, 0, nbTri),
83 KOKKOS_LAMBDA(
const int_t &i) {
84 for (
int_t d = 0; d < 3; d++) {
85 skinFacesView(i).a[d] = sourcePointsPtr(skinFacesPtr(i, 0))[d];
86 skinFacesView(i).b[d] = sourcePointsPtr(skinFacesPtr(i, 1))[d];
87 skinFacesView(i).c[d] = sourcePointsPtr(skinFacesPtr(i, 2))[d];
90 ArborX::BoundingVolumeHierarchy skinBVH(
91 execSpace, ArborX::Experimental::attach_indices(skinFacesView));
92 Kokkos::Profiling::popRegion();
94 Kokkos::Profiling::pushRegion(
"Compute query of nearest skin");
96 Kokkos::View<int_t *, MemorySpace> values(
"values", 0);
97 Kokkos::View<offset_t *, MemorySpace> offsets(
"offsets", 0);
99 auto targetElement = Kokkos::View<int_t *, MemorySpace>(
100 Kokkos::view_alloc(execSpace, Kokkos::WithoutInitializing,
104 Kokkos::Profiling::pushRegion(
"Point projection on triangle");
107 skinBVH.query(execSpace, pcn,
109 targetElement, targetStatusPtr, skinParentsPtr},
115 targetStatusPtr, skinParentsPtr},
118 Kokkos::Profiling::popRegion();
123 Kokkos::Profiling::pushRegion(
124 "Compute projection and interpolation coefficient");
125 Kokkos::parallel_for(
126 "Compute projection values ",
127 Kokkos::RangePolicy<ExecSpace>(execSpace, 0, values.extent_int(0)),
128 KOKKOS_LAMBDA(
const int_t &i) {
129 auto predicate_index = values(i);
130 Kokkos::Array<fp_t, MaxNodesPerElt> warr;
131 Kokkos::Array<coordinates_t, MaxNodesPerElt * 3> Xarr;
132 Kokkos::Array<coordinates_t, 3> tpa;
133 Kokkos::View<coordinates_t *, ExecSpace> tp(tpa.data(), 3);
134 for (
int_t j = 0; j < 3; j++) {
135 tp(j) = targetPointsPtr(predicate_index, j);
139 const int_t curElem = targetElement(predicate_index);
140 const auto cellType = CellTypesPtr(curElem);
141 auto localConn = Kokkos::subview(
143 Kokkos::make_pair(connOffPtr(curElem), connOffPtr(curElem + 1)));
144 int nbConnNodes = connOffPtr(curElem + 1) - connOffPtr(curElem);
145 Kokkos::View<fp_t *, ExecSpace> weights(warr.data(), nbConnNodes);
146 Kokkos::View<coordinates_t **, ExecSpace> Xcoor(Xarr.data(),
148 for (
int_t j = 0; j < nbConnNodes; ++j) {
149 auto nodeId = localConn(j);
150 for (
int_t k = 0; k < 3; ++k) {
151 Xcoor(j, k) = sourcePointsPtr(nodeId)[k];
156 for (
int_t j = 0; j < nbConnNodes; ++j) {
157 auto nodeId = localConn(j);
159 component < sourceValuesPtr.extent(1); ++component) {
160 targetValuesPtr(predicate_index, component) +=
161 weights[j] * sourceValuesPtr(nodeId, component);
164 targetStatusPtr(predicate_index) = statusOutside;
166 Kokkos::Profiling::popRegion();
183 bool extrapol =
false) {
184 Kokkos::Profiling::pushRegion(
"FiniteElements::ComputeProjectionOn2DSkin");
185 using MemorySpace =
typename ExecSpace::memory_space;
186 using Point = ArborX::Point<2, coordinates_t>;
188 ExecSpace execSpace{};
190 auto sourcePointsPtr = transfer.sourcePoints;
191 auto sourceValuesPtr = transfer.sourceValues;
192 auto connValPtr = transfer.connValues;
193 auto connOffPtr = transfer.connOffsets;
194 auto CellTypesPtr = transfer.cellTypes;
196 auto targetPointsPtr = transfer.targetPoints;
197 auto targetValuesPtr = transfer.targetValues;
198 auto targetStatusPtr = transfer.targetStatus;
199 auto nbtargetPoints = targetPointsPtr.extent_int(0);
201 auto skinFacesPtr = transfer.skinFaces;
202 auto skinParentsPtr = transfer.skinParents;
207 auto targetElement = Kokkos::View<int_t *, MemorySpace>(
208 Kokkos::view_alloc(execSpace, Kokkos::WithoutInitializing,
212 Kokkos::Profiling::pushRegion(
213 "Compute projection and interpolation coefficient");
214 Kokkos::parallel_for(
215 "Retrieve closest bar",
216 Kokkos::RangePolicy<ExecSpace>(execSpace, 0,
217 targetPointsPtr.extent_int(0)),
218 KOKKOS_LAMBDA(
const int_t &i) {
220 Kokkos::Array<fp_t, MaxNodesPerElt> warr;
221 Kokkos::Array<coordinates_t, MaxNodesPerElt * 2> Xarr;
222 Kokkos::Array<coordinates_t, 2> tpa;
223 Kokkos::View<coordinates_t *, ExecSpace> tp(tpa.data(), 2);
224 const Point target = {targetPointsPtr(i, 0), targetPointsPtr(i, 1)};
226 int_t closestId = -1;
228 for (
int_t s = 0; s < skinFacesPtr.extent_int(0); s++) {
229 auto p1 = sourcePointsPtr(skinFacesPtr(s, 0));
230 auto p2 = sourcePointsPtr(skinFacesPtr(s, 1));
235 if (curdistsqr < mindistsqr) {
237 mindistsqr = curdistsqr;
242 targetPointsPtr(i, 0) = closest[0];
243 targetPointsPtr(i, 1) = closest[1];
245 for (
int_t j = 0; j < 2; j++) {
246 tp(j) = targetPointsPtr(i, j);
248 targetElement(i) = skinParentsPtr(closestId);
249 const int_t curElem = targetElement(i);
250 const auto cellType = CellTypesPtr(curElem);
251 auto localConn = Kokkos::subview(
253 Kokkos::make_pair(connOffPtr(curElem), connOffPtr(curElem + 1)));
254 const int_t nbConnNodes =
255 connOffPtr(curElem + 1) - connOffPtr(curElem);
256 Kokkos::View<fp_t *, ExecSpace> weights(warr.data(), nbConnNodes);
257 Kokkos::View<coordinates_t **, ExecSpace> Xcoor(Xarr.data(),
259 for (
int_t j = 0; j < nbConnNodes; ++j) {
260 const auto nodeId = localConn(j);
261 for (
int_t k = 0; k < 2; ++k) {
262 Xcoor(j, k) = sourcePointsPtr(nodeId)[k];
266 cellType, Xcoor, tp, weights,
true);
267 for (
int_t j = 0; j < nbConnNodes; ++j) {
268 const auto nodeId = localConn(j);
270 component < sourceValuesPtr.extent(1); ++component) {
271 targetValuesPtr(i, component) +=
272 weights[j] * sourceValuesPtr(nodeId, component);
275 targetStatusPtr(i) = statusOutside;
278 Kokkos::Profiling::popRegion();
295 bool extrapol =
false) {
296 Kokkos::Profiling::pushRegion(
"FiniteElement::ComputeProjectionOn1DSkin");
297 using MemorySpace =
typename ExecSpace::memory_space;
298 using Point = ArborX::Point<1, coordinates_t>;
300 ExecSpace execSpace{};
302 auto sourcePointsPtr = transfer.sourcePoints;
303 auto sourceValuesPtr = transfer.sourceValues;
304 auto connValPtr = transfer.connValues;
305 auto connOffPtr = transfer.connOffsets;
306 auto CellTypesPtr = transfer.cellTypes;
308 auto targetPointsPtr = transfer.targetPoints;
309 auto targetValuesPtr = transfer.targetValues;
310 auto targetStatusPtr = transfer.targetStatus;
311 auto nbtargetPoints = targetPointsPtr.extent_int(0);
313 auto skinFacesPtr = transfer.skinFaces;
314 auto skinParentsPtr = transfer.skinParents;
319 auto targetElement = Kokkos::View<int_t *, MemorySpace>(
320 Kokkos::view_alloc(execSpace, Kokkos::WithoutInitializing,
324 Kokkos::Profiling::pushRegion(
325 "Compute projection and interpolation coefficient");
326 Kokkos::parallel_for(
327 "Retrieve closest point",
328 Kokkos::RangePolicy<ExecSpace>(execSpace, 0,
329 targetPointsPtr.extent_int(0)),
330 KOKKOS_LAMBDA(
const int &i) {
332 Kokkos::Array<fp_t, MaxNodesPerElt> warr;
333 Kokkos::Array<coordinates_t, MaxNodesPerElt> Xarr;
334 Kokkos::Array<coordinates_t, 1> tpa;
335 Kokkos::View<coordinates_t *, ExecSpace> tp(tpa.data(), 1);
336 const Point target = {targetPointsPtr(i, 0)};
338 int_t closestId = -1;
340 for (
int_t s = 0; s < skinFacesPtr.extent_int(0); s++) {
341 auto p = sourcePointsPtr(skinFacesPtr(s, 0));
342 const auto curdist = Kokkos::abs(p[0] - target[0]);
343 if (curdist < mindist) {
350 targetPointsPtr(i, 0) = closest[0];
352 for (
int_t j = 0; j < 1; j++) {
353 tp(j) = targetPointsPtr(i, j);
355 targetElement(i) = skinParentsPtr(closestId);
356 const int_t curElem = targetElement(i);
357 const auto cellType = CellTypesPtr(curElem);
358 auto localConn = Kokkos::subview(
360 Kokkos::make_pair(connOffPtr(curElem), connOffPtr(curElem + 1)));
361 int nbConnNodes = connOffPtr(curElem + 1) - connOffPtr(curElem);
362 Kokkos::View<fp_t *, ExecSpace> weights(warr.data(), nbConnNodes);
363 Kokkos::View<coordinates_t **, ExecSpace> Xcoor(Xarr.data(),
365 for (
int_t j = 0; j < nbConnNodes; ++j) {
366 const auto nodeId = localConn(j);
367 for (
int_t k = 0; k < 1; ++k) {
368 Xcoor(j, k) = sourcePointsPtr(nodeId)[k];
373 for (
int_t j = 0; j < nbConnNodes; ++j) {
374 const auto nodeId = localConn(j);
376 component < sourceValuesPtr.extent(1); ++component) {
377 targetValuesPtr(i, component) +=
378 weights[j] * sourceValuesPtr(nodeId, component);
381 targetStatusPtr(i) = statusOutside;
384 Kokkos::Profiling::popRegion();