16#ifndef CABANA_GRID_INTERPOLATION_HPP
17#define CABANA_GRID_INTERPOLATION_HPP
26#include <Kokkos_Core.hpp>
27#include <Kokkos_ScatterView.hpp>
53template <
class ViewType,
class SplineDataType,
class Po
intDataType>
55 std::enable_if_t<3 == SplineDataType::num_space_dim, void>
56 value(
const ViewType& view,
const SplineDataType& sd,
57 PointDataType& result,
58 typename std::enable_if<( std::rank<PointDataType>::value == 0 ),
61 static_assert( SplineDataType::has_weight_values,
62 "G2P::value requires spline weight values" );
66 for (
int i = 0; i < SplineDataType::num_knot; ++i )
67 for (
int j = 0; j < SplineDataType::num_knot; ++j )
68 for (
int k = 0; k < SplineDataType::num_knot; ++k )
69 result += view( sd.s[Dim::I][i], sd.s[Dim::J][j],
70 sd.s[Dim::K][k], 0 ) *
71 sd.w[Dim::I][i] * sd.w[Dim::J][j] * sd.w[Dim::K][k];
81template <
class ViewType,
class SplineDataType,
class Po
intDataType>
83 std::enable_if_t<2 == SplineDataType::num_space_dim, void>
84 value(
const ViewType& view,
const SplineDataType& sd,
85 PointDataType& result,
86 typename std::enable_if<( std::rank<PointDataType>::value == 0 ),
89 static_assert( SplineDataType::has_weight_values,
90 "G2P::value requires spline weight values" );
94 for (
int i = 0; i < SplineDataType::num_knot; ++i )
95 for (
int j = 0; j < SplineDataType::num_knot; ++j )
96 result += view( sd.s[Dim::I][i], sd.s[Dim::J][j], 0 ) *
97 sd.w[Dim::I][i] * sd.w[Dim::J][j];
108template <
class ViewType,
class SplineDataType,
class Po
intDataType>
109KOKKOS_INLINE_FUNCTION
110 std::enable_if_t<3 == SplineDataType::num_space_dim, void>
111 value(
const ViewType& view,
const SplineDataType& sd,
112 PointDataType result[3],
113 typename std::enable_if<( std::rank<PointDataType>::value == 0 ),
116 static_assert( SplineDataType::has_weight_values,
117 "G2P::value requires spline weight values" );
119 for (
int d = 0; d < 3; ++d )
122 for (
int i = 0; i < SplineDataType::num_knot; ++i )
123 for (
int j = 0; j < SplineDataType::num_knot; ++j )
124 for (
int k = 0; k < SplineDataType::num_knot; ++k )
125 for (
int d = 0; d < 3; ++d )
126 result[d] += view( sd.s[Dim::I][i], sd.s[Dim::J][j],
127 sd.s[Dim::K][k], d ) *
128 sd.w[Dim::I][i] * sd.w[Dim::J][j] *
139template <
class ViewType,
class SplineDataType,
class Po
intDataType>
140KOKKOS_INLINE_FUNCTION
141 std::enable_if_t<2 == SplineDataType::num_space_dim, void>
142 value(
const ViewType& view,
const SplineDataType& sd,
143 PointDataType result[2],
144 typename std::enable_if<( std::rank<PointDataType>::value == 0 ),
147 static_assert( SplineDataType::has_weight_values,
148 "G2P::value requires spline weight values" );
150 for (
int d = 0; d < 2; ++d )
153 for (
int i = 0; i < SplineDataType::num_knot; ++i )
154 for (
int j = 0; j < SplineDataType::num_knot; ++j )
155 for (
int d = 0; d < 2; ++d )
156 result[d] += view( sd.s[Dim::I][i], sd.s[Dim::J][j], d ) *
157 sd.w[Dim::I][i] * sd.w[Dim::J][j];
168template <
class ViewType,
class SplineDataType,
class Po
intDataType>
169KOKKOS_INLINE_FUNCTION
170 std::enable_if_t<3 == SplineDataType::num_space_dim, void>
171 gradient(
const ViewType& view,
const SplineDataType& sd,
172 PointDataType result[3],
173 typename std::enable_if<( std::rank<PointDataType>::value == 0 ),
176 static_assert( SplineDataType::has_weight_values,
177 "G2P::gradient requires spline weight values" );
178 static_assert( SplineDataType::has_weight_physical_gradients,
179 "G2P::gradient requires spline weight physical gradients" );
181 for (
int d = 0; d < 3; ++d )
184 for (
int i = 0; i < SplineDataType::num_knot; ++i )
185 for (
int j = 0; j < SplineDataType::num_knot; ++j )
186 for (
int k = 0; k < SplineDataType::num_knot; ++k )
188 result[Dim::I] += view( sd.s[Dim::I][i], sd.s[Dim::J][j],
189 sd.s[Dim::K][k], 0 ) *
190 sd.g[Dim::I][i] * sd.w[Dim::J][j] *
193 result[Dim::J] += view( sd.s[Dim::I][i], sd.s[Dim::J][j],
194 sd.s[Dim::K][k], 0 ) *
195 sd.w[Dim::I][i] * sd.g[Dim::J][j] *
198 result[Dim::K] += view( sd.s[Dim::I][i], sd.s[Dim::J][j],
199 sd.s[Dim::K][k], 0 ) *
200 sd.w[Dim::I][i] * sd.w[Dim::J][j] *
212template <
class ViewType,
class SplineDataType,
class Po
intDataType>
213KOKKOS_INLINE_FUNCTION
214 std::enable_if_t<2 == SplineDataType::num_space_dim, void>
215 gradient(
const ViewType& view,
const SplineDataType& sd,
216 PointDataType result[2],
217 typename std::enable_if<( std::rank<PointDataType>::value == 0 ),
220 static_assert( SplineDataType::has_weight_values,
221 "G2P::gradient requires spline weight values" );
222 static_assert( SplineDataType::has_weight_physical_gradients,
223 "G2P::gradient requires spline weight physical gradients" );
225 for (
int d = 0; d < 2; ++d )
228 for (
int i = 0; i < SplineDataType::num_knot; ++i )
229 for (
int j = 0; j < SplineDataType::num_knot; ++j )
231 result[Dim::I] += view( sd.s[Dim::I][i], sd.s[Dim::J][j], 0 ) *
232 sd.g[Dim::I][i] * sd.w[Dim::J][j];
234 result[Dim::J] += view( sd.s[Dim::I][i], sd.s[Dim::J][j], 0 ) *
235 sd.w[Dim::I][i] * sd.g[Dim::J][j];
247template <
class ViewType,
class SplineDataType,
class Po
intDataType>
248KOKKOS_INLINE_FUNCTION
249 std::enable_if_t<3 == SplineDataType::num_space_dim, void>
250 gradient(
const ViewType& view,
const SplineDataType& sd,
251 PointDataType result[3][3],
252 typename std::enable_if<( std::rank<PointDataType>::value == 0 ),
255 static_assert( SplineDataType::has_weight_values,
256 "G2P::gradient requires spline weight values" );
257 static_assert( SplineDataType::has_weight_physical_gradients,
258 "G2P::gradient requires spline weight physical gradients" );
260 for (
int d0 = 0; d0 < 3; ++d0 )
261 for (
int d1 = 0; d1 < 3; ++d1 )
262 result[d0][d1] = 0.0;
264 for (
int i = 0; i < SplineDataType::num_knot; ++i )
265 for (
int j = 0; j < SplineDataType::num_knot; ++j )
266 for (
int k = 0; k < SplineDataType::num_knot; ++k )
268 typename SplineDataType::scalar_type rg[3] = {
269 sd.g[Dim::I][i] * sd.w[Dim::J][j] * sd.w[Dim::K][k],
270 sd.w[Dim::I][i] * sd.g[Dim::J][j] * sd.w[Dim::K][k],
271 sd.w[Dim::I][i] * sd.w[Dim::J][j] * sd.g[Dim::K][k] };
273 for (
int d0 = 0; d0 < 3; ++d0 )
276 for (
int d1 = 0; d1 < 3; ++d1 )
278 mg * view( sd.s[Dim::I][i], sd.s[Dim::J][j],
279 sd.s[Dim::K][k], d1 );
291template <
class ViewType,
class SplineDataType,
class Po
intDataType>
292KOKKOS_INLINE_FUNCTION
293 std::enable_if_t<2 == SplineDataType::num_space_dim, void>
294 gradient(
const ViewType& view,
const SplineDataType& sd,
295 PointDataType result[2][2],
296 typename std::enable_if<( std::rank<PointDataType>::value == 0 ),
299 static_assert( SplineDataType::has_weight_values,
300 "G2P::gradient requires spline weight values" );
301 static_assert( SplineDataType::has_weight_physical_gradients,
302 "G2P::gradient requires spline weight physical gradients" );
304 for (
int d0 = 0; d0 < 2; ++d0 )
305 for (
int d1 = 0; d1 < 2; ++d1 )
306 result[d0][d1] = 0.0;
308 for (
int i = 0; i < SplineDataType::num_knot; ++i )
309 for (
int j = 0; j < SplineDataType::num_knot; ++j )
311 typename SplineDataType::scalar_type rg[2] = {
312 sd.g[Dim::I][i] * sd.w[Dim::J][j],
313 sd.w[Dim::I][i] * sd.g[Dim::J][j] };
315 for (
int d0 = 0; d0 < 2; ++d0 )
318 for (
int d1 = 0; d1 < 2; ++d1 )
320 mg * view( sd.s[Dim::I][i], sd.s[Dim::J][j], d1 );
333template <
class ViewType,
class SplineDataType,
class Po
intDataType>
334KOKKOS_INLINE_FUNCTION
335 std::enable_if_t<3 == SplineDataType::num_space_dim, void>
337 PointDataType& result,
338 typename std::enable_if<
339 ( std::rank<PointDataType>::value == 0 ),
void*>::type = 0 )
341 static_assert( SplineDataType::has_weight_values,
342 "G2P::divergence requires spline weight values" );
344 SplineDataType::has_weight_physical_gradients,
345 "G2P::divergence requires spline weight physical gradients" );
349 for (
int i = 0; i < SplineDataType::num_knot; ++i )
350 for (
int j = 0; j < SplineDataType::num_knot; ++j )
351 for (
int k = 0; k < SplineDataType::num_knot; ++k )
353 view( sd.s[Dim::I][i], sd.s[Dim::J][j], sd.s[Dim::K][k],
355 sd.g[Dim::I][i] * sd.w[Dim::J][j] * sd.w[Dim::K][k] +
357 view( sd.s[Dim::I][i], sd.s[Dim::J][j], sd.s[Dim::K][k],
359 sd.w[Dim::I][i] * sd.g[Dim::J][j] * sd.w[Dim::K][k] +
361 view( sd.s[Dim::I][i], sd.s[Dim::J][j], sd.s[Dim::K][k],
363 sd.w[Dim::I][i] * sd.w[Dim::J][j] * sd.g[Dim::K][k];
373template <
class ViewType,
class SplineDataType,
class Po
intDataType>
374KOKKOS_INLINE_FUNCTION
375 std::enable_if_t<2 == SplineDataType::num_space_dim, void>
377 PointDataType& result,
378 typename std::enable_if<
379 ( std::rank<PointDataType>::value == 0 ),
void*>::type = 0 )
381 static_assert( SplineDataType::has_weight_values,
382 "G2P::divergence requires spline weight values" );
384 SplineDataType::has_weight_physical_gradients,
385 "G2P::divergence requires spline weight physical gradients" );
389 for (
int i = 0; i < SplineDataType::num_knot; ++i )
390 for (
int j = 0; j < SplineDataType::num_knot; ++j )
391 result += view( sd.s[Dim::I][i], sd.s[Dim::J][j], Dim::I ) *
392 sd.g[Dim::I][i] * sd.w[Dim::J][j] +
394 view( sd.s[Dim::I][i], sd.s[Dim::J][j], Dim::J ) *
395 sd.w[Dim::I][i] * sd.g[Dim::J][j];
410struct is_scatter_view_impl :
public std::false_type
414template <
typename DataType,
typename Layout,
typename ExecSpace,
typename Op,
415 typename duplication,
typename contribution>
416struct is_scatter_view_impl<Kokkos::Experimental::ScatterView<
417 DataType, Layout, ExecSpace, Op, duplication, contribution>>
418 :
public std::true_type
426 :
public is_scatter_view_impl<typename std::remove_cv<T>::type>::type
437template <
class Po
intDataType,
class ScatterViewType,
class SplineDataType>
438KOKKOS_INLINE_FUNCTION
439 std::enable_if_t<3 == SplineDataType::num_space_dim, void>
440 value(
const PointDataType& point_data,
const SplineDataType& sd,
441 const ScatterViewType& view,
442 typename std::enable_if<( std::rank<PointDataType>::value == 0 ),
445 static_assert( SplineDataType::has_weight_values,
446 "P2G::value requires spline weight values" );
449 "P2G requires a Kokkos::ScatterView" );
450 auto view_access = view.access();
452 for (
int i = 0; i < SplineDataType::num_knot; ++i )
453 for (
int j = 0; j < SplineDataType::num_knot; ++j )
454 for (
int k = 0; k < SplineDataType::num_knot; ++k )
455 view_access( sd.s[Dim::I][i], sd.s[Dim::J][j], sd.s[Dim::K][k],
456 0 ) += point_data * sd.w[Dim::I][i] *
457 sd.w[Dim::J][j] * sd.w[Dim::K][k];
466template <
class Po
intDataType,
class ScatterViewType,
class SplineDataType>
467KOKKOS_INLINE_FUNCTION
468 std::enable_if_t<2 == SplineDataType::num_space_dim, void>
469 value(
const PointDataType& point_data,
const SplineDataType& sd,
470 const ScatterViewType& view,
471 typename std::enable_if<( std::rank<PointDataType>::value == 0 ),
474 static_assert( SplineDataType::has_weight_values,
475 "P2G::value requires spline weight values" );
478 "P2G requires a Kokkos::ScatterView" );
479 auto view_access = view.access();
481 for (
int i = 0; i < SplineDataType::num_knot; ++i )
482 for (
int j = 0; j < SplineDataType::num_knot; ++j )
483 view_access( sd.s[Dim::I][i], sd.s[Dim::J][j], 0 ) +=
484 point_data * sd.w[Dim::I][i] * sd.w[Dim::J][j];
495template <
class Po
intDataType,
class ScatterViewType,
class SplineDataType>
496KOKKOS_INLINE_FUNCTION
497 std::enable_if_t<3 == SplineDataType::num_space_dim, void>
498 value(
const PointDataType point_data[3],
const SplineDataType& sd,
499 const ScatterViewType& view,
500 typename std::enable_if<( std::rank<PointDataType>::value == 0 ),
503 static_assert( SplineDataType::has_weight_values,
504 "P2G::value requires spline weight values" );
507 "P2G requires a Kokkos::ScatterView" );
508 auto view_access = view.access();
510 for (
int i = 0; i < SplineDataType::num_knot; ++i )
511 for (
int j = 0; j < SplineDataType::num_knot; ++j )
512 for (
int k = 0; k < SplineDataType::num_knot; ++k )
513 for (
int d = 0; d < 3; ++d )
514 view_access( sd.s[Dim::I][i], sd.s[Dim::J][j],
515 sd.s[Dim::K][k], d ) +=
516 point_data[d] * sd.w[Dim::I][i] * sd.w[Dim::J][j] *
527template <
class Po
intDataType,
class ScatterViewType,
class SplineDataType>
528KOKKOS_INLINE_FUNCTION
529 std::enable_if_t<2 == SplineDataType::num_space_dim, void>
530 value(
const PointDataType point_data[2],
const SplineDataType& sd,
531 const ScatterViewType& view,
532 typename std::enable_if<( std::rank<PointDataType>::value == 0 ),
535 static_assert( SplineDataType::has_weight_values,
536 "P2G::value requires spline weight values" );
539 "P2G requires a Kokkos::ScatterView" );
540 auto view_access = view.access();
542 for (
int i = 0; i < SplineDataType::num_knot; ++i )
543 for (
int j = 0; j < SplineDataType::num_knot; ++j )
544 for (
int d = 0; d < 2; ++d )
545 view_access( sd.s[Dim::I][i], sd.s[Dim::J][j], d ) +=
546 point_data[d] * sd.w[Dim::I][i] * sd.w[Dim::J][j];
557template <
class Po
intDataType,
class ScatterViewType,
class SplineDataType>
558KOKKOS_INLINE_FUNCTION
559 std::enable_if_t<3 == SplineDataType::num_space_dim, void>
560 gradient(
const PointDataType point_data,
const SplineDataType& sd,
561 const ScatterViewType& view )
563 static_assert( SplineDataType::has_weight_values,
564 "P2G::gradient requires spline weight values" );
565 static_assert( SplineDataType::has_weight_physical_gradients,
566 "P2G::gradient requires spline weight physical gradients" );
569 "P2G requires a Kokkos::ScatterView" );
570 auto view_access = view.access();
572 for (
int i = 0; i < SplineDataType::num_knot; ++i )
573 for (
int j = 0; j < SplineDataType::num_knot; ++j )
574 for (
int k = 0; k < SplineDataType::num_knot; ++k )
576 view_access( sd.s[Dim::I][i], sd.s[Dim::J][j], sd.s[Dim::K][k],
577 Dim::I ) += point_data * sd.g[Dim::I][i] *
578 sd.w[Dim::J][j] * sd.w[Dim::K][k];
580 view_access( sd.s[Dim::I][i], sd.s[Dim::J][j], sd.s[Dim::K][k],
581 Dim::J ) += point_data * sd.w[Dim::I][i] *
582 sd.g[Dim::J][j] * sd.w[Dim::K][k];
584 view_access( sd.s[Dim::I][i], sd.s[Dim::J][j], sd.s[Dim::K][k],
585 Dim::K ) += point_data * sd.w[Dim::I][i] *
586 sd.w[Dim::J][j] * sd.g[Dim::K][k];
597template <
class Po
intDataType,
class ScatterViewType,
class SplineDataType>
598KOKKOS_INLINE_FUNCTION
599 std::enable_if_t<2 == SplineDataType::num_space_dim, void>
600 gradient(
const PointDataType point_data,
const SplineDataType& sd,
601 const ScatterViewType& view )
603 static_assert( SplineDataType::has_weight_values,
604 "P2G::gradient requires spline weight values" );
605 static_assert( SplineDataType::has_weight_physical_gradients,
606 "P2G::gradient requires spline weight physical gradients" );
609 "P2G requires a Kokkos::ScatterView" );
610 auto view_access = view.access();
612 for (
int i = 0; i < SplineDataType::num_knot; ++i )
613 for (
int j = 0; j < SplineDataType::num_knot; ++j )
615 view_access( sd.s[Dim::I][i], sd.s[Dim::J][j], Dim::I ) +=
616 point_data * sd.g[Dim::I][i] * sd.w[Dim::J][j];
618 view_access( sd.s[Dim::I][i], sd.s[Dim::J][j], Dim::J ) +=
619 point_data * sd.w[Dim::I][i] * sd.g[Dim::J][j];
631template <
class Po
intDataType,
class ScatterViewType,
class SplineDataType>
632KOKKOS_INLINE_FUNCTION
633 std::enable_if_t<3 == SplineDataType::num_space_dim, void>
634 divergence(
const PointDataType point_data[3],
const SplineDataType& sd,
635 const ScatterViewType& view,
636 typename std::enable_if<
637 ( std::rank<PointDataType>::value == 0 ),
void*>::type = 0 )
639 static_assert( SplineDataType::has_weight_values,
640 "P2G::divergence requires spline weight values" );
642 SplineDataType::has_weight_physical_gradients,
643 "P2G::divergence requires spline weight physical gradients" );
646 "P2G requires a Kokkos::ScatterView" );
647 auto view_access = view.access();
649 for (
int i = 0; i < SplineDataType::num_knot; ++i )
650 for (
int j = 0; j < SplineDataType::num_knot; ++j )
651 for (
int k = 0; k < SplineDataType::num_knot; ++k )
653 PointDataType result = point_data[Dim::I] * sd.g[Dim::I][i] *
654 sd.w[Dim::J][j] * sd.w[Dim::K][k] +
656 point_data[Dim::J] * sd.w[Dim::I][i] *
657 sd.g[Dim::J][j] * sd.w[Dim::K][k] +
659 point_data[Dim::K] * sd.w[Dim::I][i] *
660 sd.w[Dim::J][j] * sd.g[Dim::K][k];
662 view_access( sd.s[Dim::I][i], sd.s[Dim::J][j], sd.s[Dim::K][k],
674template <
class Po
intDataType,
class ScatterViewType,
class SplineDataType>
675KOKKOS_INLINE_FUNCTION
676 std::enable_if_t<2 == SplineDataType::num_space_dim, void>
677 divergence(
const PointDataType point_data[2],
const SplineDataType& sd,
678 const ScatterViewType& view,
679 typename std::enable_if<
680 ( std::rank<PointDataType>::value == 0 ),
void*>::type = 0 )
682 static_assert( SplineDataType::has_weight_values,
683 "P2G::divergence requires spline weight values" );
685 SplineDataType::has_weight_physical_gradients,
686 "P2G::divergence requires spline weight physical gradients" );
689 "P2G requires a Kokkos::ScatterView" );
690 auto view_access = view.access();
692 for (
int i = 0; i < SplineDataType::num_knot; ++i )
693 for (
int j = 0; j < SplineDataType::num_knot; ++j )
695 PointDataType result =
696 point_data[Dim::I] * sd.g[Dim::I][i] * sd.w[Dim::J][j] +
698 point_data[Dim::J] * sd.w[Dim::I][i] * sd.g[Dim::J][j];
700 view_access( sd.s[Dim::I][i], sd.s[Dim::J][j], 0 ) += result;
712template <
class ScatterViewType,
class SplineDataType,
class Po
intDataType>
713KOKKOS_INLINE_FUNCTION
714 std::enable_if_t<3 == SplineDataType::num_space_dim, void>
715 divergence(
const PointDataType point_data[3][3],
const SplineDataType& sd,
716 const ScatterViewType& view,
717 typename std::enable_if<
718 ( std::rank<PointDataType>::value == 0 ),
void*>::type = 0 )
720 static_assert( SplineDataType::has_weight_values,
721 "P2G::divergence requires spline weight values" );
723 SplineDataType::has_weight_physical_gradients,
724 "P2G::divergence requires spline weight physical gradients" );
727 "P2G requires a Kokkos::ScatterView" );
728 auto view_access = view.access();
730 for (
int i = 0; i < SplineDataType::num_knot; ++i )
731 for (
int j = 0; j < SplineDataType::num_knot; ++j )
732 for (
int k = 0; k < SplineDataType::num_knot; ++k )
734 typename SplineDataType::scalar_type rg[3] = {
735 sd.g[Dim::I][i] * sd.w[Dim::J][j] * sd.w[Dim::K][k],
736 sd.w[Dim::I][i] * sd.g[Dim::J][j] * sd.w[Dim::K][k],
737 sd.w[Dim::I][i] * sd.w[Dim::J][j] * sd.g[Dim::K][k] };
739 for (
int d1 = 0; d1 < 3; ++d1 )
741 for (
int d0 = 0; d0 < 3; ++d0 )
742 view_access( sd.s[Dim::I][i], sd.s[Dim::J][j],
743 sd.s[Dim::K][k], d0 ) +=
744 rg[d1] * point_data[d0][d1];
756template <
class ScatterViewType,
class SplineDataType,
class Po
intDataType>
757KOKKOS_INLINE_FUNCTION
758 std::enable_if_t<2 == SplineDataType::num_space_dim, void>
759 divergence(
const PointDataType point_data[2][2],
const SplineDataType& sd,
760 const ScatterViewType& view,
761 typename std::enable_if<
762 ( std::rank<PointDataType>::value == 0 ),
void*>::type = 0 )
764 static_assert( SplineDataType::has_weight_values,
765 "P2G::divergence requires spline weight values" );
767 SplineDataType::has_weight_physical_gradients,
768 "P2G::divergence requires spline weight physical gradients" );
771 "P2G requires a Kokkos::ScatterView" );
772 auto view_access = view.access();
774 for (
int i = 0; i < SplineDataType::num_knot; ++i )
775 for (
int j = 0; j < SplineDataType::num_knot; ++j )
777 typename SplineDataType::scalar_type rg[2] = {
778 sd.g[Dim::I][i] * sd.w[Dim::J][j],
779 sd.w[Dim::I][i] * sd.g[Dim::J][j] };
781 for (
int d1 = 0; d1 < 2; ++d1 )
783 for (
int d0 = 0; d0 < 2; ++d0 )
784 view_access( sd.s[Dim::I][i], sd.s[Dim::J][j], d0 ) +=
785 rg[d1] * point_data[d0][d1];
831template <
class ExecutionSpace,
class PointEvalFunctor,
class PointCoordinates,
832 class ArrayScalar,
class MeshScalar,
class EntityType,
833 int SplineOrder, std::size_t NumSpaceDim,
class MemorySpace,
834 class... ArrayParams>
838 ArrayParams...>& array,
841 const PointEvalFunctor& functor )
847 std::is_same<MemorySpace, typename array_type::memory_space>::value,
848 "Mismatching points/array memory space." );
855 halo.
gather( ExecutionSpace(), array );
858 auto array_view = array.view();
861 Kokkos::parallel_for(
862 "g2p", Kokkos::RangePolicy<ExecutionSpace>( 0, num_point ),
863 KOKKOS_LAMBDA(
const int p ) {
865 MeshScalar px[NumSpaceDim];
866 for ( std::size_t d = 0; d < NumSpaceDim; ++d )
868 px[d] = points( p, d );
878 functor( sd, p, array_view );
911template <
class PointEvalFunctor,
class PointCoordinates,
class ArrayScalar,
912 class MeshScalar,
class EntityType,
int SplineOrder,
913 std::size_t NumSpaceDim,
class MemorySpace,
class... ArrayParams>
916 ArrayParams...>& array,
919 const PointEvalFunctor& functor )
921 using exec_space =
typename Array<ArrayScalar, EntityType,
923 ArrayParams...>::execution_space;
937template <
class ViewType>
953 static_assert( 1 == ViewType::rank,
"View must be of scalars" );
957 template <
class SplineDataType,
class Gr
idViewType>
958 KOKKOS_INLINE_FUNCTION
void operator()(
const SplineDataType& sd,
960 const GridViewType& view )
const
970template <
class ViewType>
971ScalarValueG2P<ViewType>
973 const typename ViewType::value_type& multiplier )
987template <
class ViewType>
1003 static_assert( 2 == ViewType::rank,
"View must be of vectors" );
1007 template <
class SplineDataType,
class Gr
idViewType>
1008 KOKKOS_INLINE_FUNCTION
void operator()(
const SplineDataType& sd,
1010 const GridViewType& view )
const
1012 value_type result[SplineDataType::num_space_dim];
1014 for ( std::size_t d = 0; d < SplineDataType::num_space_dim; ++d )
1021template <
class ViewType>
1022VectorValueG2P<ViewType>
1024 const typename ViewType::value_type& multiplier )
1038template <
class ViewType>
1054 static_assert( 2 == ViewType::rank,
"View must be of vectors" );
1058 template <
class SplineDataType,
class Gr
idViewType>
1059 KOKKOS_INLINE_FUNCTION
void operator()(
const SplineDataType& sd,
1061 const GridViewType& view )
const
1063 value_type result[SplineDataType::num_space_dim];
1065 for ( std::size_t d = 0; d < SplineDataType::num_space_dim; ++d )
1072template <
class ViewType>
1073ScalarGradientG2P<ViewType>
1075 const typename ViewType::value_type& multiplier )
1089template <
class ViewType>
1105 static_assert( 3 == ViewType::rank,
"View must be of tensors" );
1109 template <
class SplineDataType,
class Gr
idViewType>
1110 KOKKOS_INLINE_FUNCTION
void operator()(
const SplineDataType& sd,
1112 const GridViewType& view )
const
1114 value_type result[SplineDataType::num_space_dim]
1115 [SplineDataType::num_space_dim];
1117 for ( std::size_t d0 = 0; d0 < SplineDataType::num_space_dim; ++d0 )
1118 for ( std::size_t d1 = 0; d1 < SplineDataType::num_space_dim; ++d1 )
1125template <
class ViewType>
1126VectorGradientG2P<ViewType>
1128 const typename ViewType::value_type& multiplier )
1142template <
class ViewType>
1158 static_assert( 1 == ViewType::rank,
"View must be of scalars" );
1162 template <
class SplineDataType,
class Gr
idViewType>
1163 KOKKOS_INLINE_FUNCTION
void operator()(
const SplineDataType& sd,
1165 const GridViewType& view )
const
1175template <
class ViewType>
1176VectorDivergenceG2P<ViewType>
1178 const typename ViewType::value_type& multiplier )
1216template <
class ExecutionSpace,
class PointEvalFunctor,
class PointCoordinates,
1217 class ArrayScalar,
class MeshScalar, std::size_t NumSpaceDim,
1218 class EntityType,
int SplineOrder,
class MemorySpace,
1219 class... ArrayParams>
1220void p2g( ExecutionSpace,
const PointEvalFunctor& functor,
1221 const PointCoordinates& points,
const std::size_t num_point,
1224 ArrayParams...>& array )
1230 std::is_same<MemorySpace, typename array_type::memory_space>::value,
1231 "Mismatching points/array memory space." );
1238 auto array_view = array.view();
1239 auto array_sv = Kokkos::Experimental::create_scatter_view( array_view );
1242 Kokkos::parallel_for(
1243 "p2g", Kokkos::RangePolicy<ExecutionSpace>( 0, num_point ),
1244 KOKKOS_LAMBDA(
const int p ) {
1246 MeshScalar px[NumSpaceDim];
1247 for ( std::size_t d = 0; d < NumSpaceDim; ++d )
1249 px[d] = points( p, d );
1259 functor( sd, p, array_sv );
1261 Kokkos::Experimental::contribute( array_view, array_sv );
1297template <
class PointEvalFunctor,
class PointCoordinates,
class ArrayScalar,
1298 class MeshScalar, std::size_t NumSpaceDim,
class EntityType,
1299 int SplineOrder,
class MemorySpace,
class... ArrayParams>
1300void p2g(
const PointEvalFunctor& functor,
const PointCoordinates& points,
1304 ArrayParams...>& array )
1306 using exec_space =
typename Array<ArrayScalar, EntityType,
1308 ArrayParams...>::execution_space;
1322template <
class ViewType>
1338 static_assert( 1 == ViewType::rank,
"View must be of scalars" );
1342 template <
class SplineDataType,
class Gr
idViewType>
1343 KOKKOS_INLINE_FUNCTION
void operator()(
const SplineDataType& sd,
1345 const GridViewType& view )
const
1354template <
class ViewType>
1355ScalarValueP2G<ViewType>
1357 const typename ViewType::value_type& multiplier )
1371template <
class ViewType>
1387 static_assert( 2 == ViewType::rank,
"View must be of vectors" );
1391 template <
class SplineDataType,
class Gr
idViewType>
1392 KOKKOS_INLINE_FUNCTION
void operator()(
const SplineDataType& sd,
1394 const GridViewType& view )
const
1396 value_type point_data[SplineDataType::num_space_dim];
1397 for ( std::size_t d = 0; d < SplineDataType::num_space_dim; ++d )
1405template <
class ViewType>
1406VectorValueP2G<ViewType>
1408 const typename ViewType::value_type& multiplier )
1422template <
class ViewType>
1438 static_assert( 1 == ViewType::rank,
"View must be of scalars" );
1442 template <
class SplineDataType,
class Gr
idViewType>
1443 KOKKOS_INLINE_FUNCTION
void operator()(
const SplineDataType& sd,
1445 const GridViewType& view )
const
1454template <
class ViewType>
1455ScalarGradientP2G<ViewType>
1457 const typename ViewType::value_type& multiplier )
1471template <
class ViewType>
1487 static_assert( 2 == ViewType::rank,
"View must be of vectors" );
1491 template <
class SplineDataType,
class Gr
idViewType>
1492 KOKKOS_INLINE_FUNCTION
void operator()(
const SplineDataType& sd,
1494 const GridViewType& view )
const
1496 value_type point_data[SplineDataType::num_space_dim];
1497 for ( std::size_t d = 0; d < SplineDataType::num_space_dim; ++d )
1505template <
class ViewType>
1506VectorDivergenceP2G<ViewType>
1508 const typename ViewType::value_type& multiplier )
1522template <
class ViewType>
1538 static_assert( 3 == ViewType::rank,
"View must be of tensors" );
1542 template <
class SplineDataType,
class Gr
idViewType>
1543 KOKKOS_INLINE_FUNCTION
void operator()(
const SplineDataType& sd,
1545 const GridViewType& view )
const
1547 value_type point_data[SplineDataType::num_space_dim]
1548 [SplineDataType::num_space_dim];
1549 for ( std::size_t d0 = 0; d0 < SplineDataType::num_space_dim; ++d0 )
1550 for ( std::size_t d1 = 0; d1 < SplineDataType::num_space_dim; ++d1 )
1558template <
class ViewType>
1559TensorDivergenceP2G<ViewType>
1561 const typename ViewType::value_type& multiplier )
Multi-node grid scatter/gather.
VectorDivergenceG2P< ViewType > createVectorDivergenceG2P(const ViewType &x, const typename ViewType::value_type &multiplier)
Creation function for grid-to-point with vector divergence.
Definition Cabana_Grid_Interpolation.hpp:1177
VectorDivergenceP2G< ViewType > createVectorDivergenceP2G(const ViewType &x, const typename ViewType::value_type &multiplier)
Creation function for point-to-grid with vector divergence.
Definition Cabana_Grid_Interpolation.hpp:1507
TensorDivergenceP2G< ViewType > createTensorDivergenceP2G(const ViewType &x, const typename ViewType::value_type &multiplier)
Creation function for point-to-grid with tensor divergence.
Definition Cabana_Grid_Interpolation.hpp:1560
ScalarGradientG2P< ViewType > createScalarGradientG2P(const ViewType &x, const typename ViewType::value_type &multiplier)
Creation function for grid-to-point with scalar gradient.
Definition Cabana_Grid_Interpolation.hpp:1074
KOKKOS_INLINE_FUNCTION std::enable_if_t< 3==SplineDataType::num_space_dim, void > gradient(const ViewType &view, const SplineDataType &sd, PointDataType result[3], typename std::enable_if<(std::rank< PointDataType >::value==0), void * >::type=0)
Interpolate a scalar gradient to a point. 3D specialization.
Definition Cabana_Grid_Interpolation.hpp:171
VectorGradientG2P< ViewType > createVectorGradientG2P(const ViewType &x, const typename ViewType::value_type &multiplier)
Creation function for grid-to-point with vector gradient.
Definition Cabana_Grid_Interpolation.hpp:1127
ScalarValueP2G< ViewType > createScalarValueP2G(const ViewType &x, const typename ViewType::value_type &multiplier)
Creation function for point-to-grid with scalar value.
Definition Cabana_Grid_Interpolation.hpp:1356
KOKKOS_INLINE_FUNCTION std::enable_if_t< 3==SplineDataType::num_space_dim, void > divergence(const PointDataType point_data[3], const SplineDataType &sd, const ScatterViewType &view, typename std::enable_if<(std::rank< PointDataType >::value==0), void * >::type=0)
Interpolate the divergence of a vector to the grid. 3D specialization.
Definition Cabana_Grid_Interpolation.hpp:634
KOKKOS_INLINE_FUNCTION std::enable_if_t< 3==SplineDataType::num_space_dim, void > gradient(const PointDataType point_data, const SplineDataType &sd, const ScatterViewType &view)
Interpolate the gradient of a scalar to the grid. 3D specialization.
Definition Cabana_Grid_Interpolation.hpp:560
VectorValueP2G< ViewType > createVectorValueP2G(const ViewType &x, const typename ViewType::value_type &multiplier)
Creation function for point-to-grid with vector value.
Definition Cabana_Grid_Interpolation.hpp:1407
VectorValueG2P< ViewType > createVectorValueG2P(const ViewType &x, const typename ViewType::value_type &multiplier)
Creation function for grid-to-point with vector value.
Definition Cabana_Grid_Interpolation.hpp:1023
KOKKOS_INLINE_FUNCTION std::enable_if_t< 3==SplineDataType::num_space_dim, void > value(const PointDataType &point_data, const SplineDataType &sd, const ScatterViewType &view, typename std::enable_if<(std::rank< PointDataType >::value==0), void * >::type=0)
Interpolate a scalar value to the grid. 3D specialization.
Definition Cabana_Grid_Interpolation.hpp:440
void g2p(ExecutionSpace, const Array< ArrayScalar, EntityType, UniformMesh< MeshScalar, NumSpaceDim >, ArrayParams... > &array, const Halo< MemorySpace > &halo, const PointCoordinates &points, const std::size_t num_point, Spline< SplineOrder >, const PointEvalFunctor &functor)
Global Grid-to-Point interpolation.
Definition Cabana_Grid_Interpolation.hpp:835
ScalarGradientP2G< ViewType > createScalarGradientP2G(const ViewType &x, const typename ViewType::value_type &multiplier)
Creation function for point-to-grid with scalar gradient.
Definition Cabana_Grid_Interpolation.hpp:1456
KOKKOS_INLINE_FUNCTION std::enable_if_t< 3==SplineDataType::num_space_dim, void > divergence(const ViewType &view, const SplineDataType &sd, PointDataType &result, typename std::enable_if<(std::rank< PointDataType >::value==0), void * >::type=0)
Interpolate a vector divergence to a point. 3D specialization.
Definition Cabana_Grid_Interpolation.hpp:336
KOKKOS_INLINE_FUNCTION std::enable_if_t< 3==SplineDataType::num_space_dim, void > value(const ViewType &view, const SplineDataType &sd, PointDataType &result, typename std::enable_if<(std::rank< PointDataType >::value==0), void * >::type=0)
Interpolate a scalar value to a point. 3D specialization.
Definition Cabana_Grid_Interpolation.hpp:56
void p2g(ExecutionSpace, const PointEvalFunctor &functor, const PointCoordinates &points, const std::size_t num_point, Spline< SplineOrder >, const Halo< MemorySpace > &halo, Array< ArrayScalar, EntityType, UniformMesh< MeshScalar, NumSpaceDim >, ArrayParams... > &array)
Global Point-to-Grid interpolation.
Definition Cabana_Grid_Interpolation.hpp:1220
ScalarValueG2P< ViewType > createScalarValueG2P(const ViewType &x, const typename ViewType::value_type &multiplier)
Creation function for grid-to-point with scalar value.
Definition Cabana_Grid_Interpolation.hpp:972
LocalMesh< MemorySpace, MeshType > createLocalMesh(const LocalGrid< MeshType > &local_grid)
Creation function for local mesh.
Definition Cabana_Grid_LocalMesh.hpp:791
KOKKOS_INLINE_FUNCTION void evaluateSpline(const LocalMesh< MemorySpace, UniformMesh< Scalar, NumSpaceDim > > &local_mesh, const Scalar p[NumSpaceDim], SplineData< Scalar, Order, NumSpaceDim, EntityType, DataTags > &data)
Evaluate spline data at a point in a uniform mesh.
Definition Cabana_Grid_Splines.hpp:1283
Array of field data on the local mesh.
Definition Cabana_Grid_Array.hpp:229
Definition Cabana_Grid_Halo.hpp:201
void scatter(const ExecutionSpace &exec_space, const ReduceOp &reduce_op, const ArrayTypes &... arrays) const
Scatter data from our ghosts to their owners using the given type of reduce operation.
Definition Cabana_Grid_Halo.hpp:376
void gather(const ExecutionSpace &exec_space, const ArrayTypes &... arrays) const
Gather data into our ghosts from their owners.
Definition Cabana_Grid_Halo.hpp:288
Core: particle data structures and algorithms.
Definition Cabana_AoSoA.hpp:36
Scatter-View static type checker.
Definition Cabana_Grid_Interpolation.hpp:427
Grid-to-point scalar gradient functor.
Definition Cabana_Grid_Interpolation.hpp:1040
ViewType _x
Spline evaluation locations.
Definition Cabana_Grid_Interpolation.hpp:1045
typename ViewType::value_type value_type
Scalar value type.
Definition Cabana_Grid_Interpolation.hpp:1042
value_type _multiplier
Scalar multiplier.
Definition Cabana_Grid_Interpolation.hpp:1047
KOKKOS_INLINE_FUNCTION void operator()(const SplineDataType &sd, const int p, const GridViewType &view) const
Apply spline interplation.
Definition Cabana_Grid_Interpolation.hpp:1059
ScalarGradientG2P(const ViewType &x, const value_type multiplier)
Constructor.
Definition Cabana_Grid_Interpolation.hpp:1050
Point-to-grid scalar gradient functor.
Definition Cabana_Grid_Interpolation.hpp:1424
value_type _multiplier
Scalar multiplier.
Definition Cabana_Grid_Interpolation.hpp:1431
typename ViewType::value_type value_type
Scalar value type.
Definition Cabana_Grid_Interpolation.hpp:1426
ViewType _x
Spline evaluation locations.
Definition Cabana_Grid_Interpolation.hpp:1429
ScalarGradientP2G(const ViewType &x, const value_type multiplier)
Constructor.
Definition Cabana_Grid_Interpolation.hpp:1434
KOKKOS_INLINE_FUNCTION void operator()(const SplineDataType &sd, const int p, const GridViewType &view) const
Apply spline interplation.
Definition Cabana_Grid_Interpolation.hpp:1443
Grid-to-point scalar value functor.
Definition Cabana_Grid_Interpolation.hpp:939
ScalarValueG2P(const ViewType &x, const value_type multiplier)
Constructor.
Definition Cabana_Grid_Interpolation.hpp:949
typename ViewType::value_type value_type
Scalar value type.
Definition Cabana_Grid_Interpolation.hpp:941
ViewType _x
Spline evaluation locations.
Definition Cabana_Grid_Interpolation.hpp:944
KOKKOS_INLINE_FUNCTION void operator()(const SplineDataType &sd, const int p, const GridViewType &view) const
Apply spline interplation.
Definition Cabana_Grid_Interpolation.hpp:958
value_type _multiplier
Scalar multiplier.
Definition Cabana_Grid_Interpolation.hpp:946
Point-to-grid scalar value functor.
Definition Cabana_Grid_Interpolation.hpp:1324
ViewType _x
Spline evaluation locations.
Definition Cabana_Grid_Interpolation.hpp:1329
ScalarValueP2G(const ViewType &x, const value_type multiplier)
Constructor.
Definition Cabana_Grid_Interpolation.hpp:1334
KOKKOS_INLINE_FUNCTION void operator()(const SplineDataType &sd, const int p, const GridViewType &view) const
Apply spline interplation.
Definition Cabana_Grid_Interpolation.hpp:1343
value_type _multiplier
Scalar multiplier.
Definition Cabana_Grid_Interpolation.hpp:1331
typename ViewType::value_type value_type
Scalar value type.
Definition Cabana_Grid_Interpolation.hpp:1326
Sum values from neighboring ranks into this rank's data.
Definition Cabana_Grid_Halo.hpp:161
Spline data container.
Definition Cabana_Grid_Splines.hpp:1054
B-Spline interface for uniform grids.
Definition Cabana_Grid_Splines.hpp:33
Point-to-grid tensor divergence functor.
Definition Cabana_Grid_Interpolation.hpp:1524
TensorDivergenceP2G(const ViewType &x, const value_type multiplier)
Constructor.
Definition Cabana_Grid_Interpolation.hpp:1534
ViewType _x
Spline evaluation locations.
Definition Cabana_Grid_Interpolation.hpp:1529
KOKKOS_INLINE_FUNCTION void operator()(const SplineDataType &sd, const int p, const GridViewType &view) const
Apply spline interplation.
Definition Cabana_Grid_Interpolation.hpp:1543
typename ViewType::value_type value_type
Scalar value type.
Definition Cabana_Grid_Interpolation.hpp:1526
value_type _multiplier
Scalar multiplier.
Definition Cabana_Grid_Interpolation.hpp:1531
Grid-to-point vector value functor.
Definition Cabana_Grid_Interpolation.hpp:1144
ViewType _x
Spline evaluation locations.
Definition Cabana_Grid_Interpolation.hpp:1149
value_type _multiplier
Scalar multiplier.
Definition Cabana_Grid_Interpolation.hpp:1151
VectorDivergenceG2P(const ViewType &x, const value_type multiplier)
Constructor.
Definition Cabana_Grid_Interpolation.hpp:1154
typename ViewType::value_type value_type
Scalar value type.
Definition Cabana_Grid_Interpolation.hpp:1146
KOKKOS_INLINE_FUNCTION void operator()(const SplineDataType &sd, const int p, const GridViewType &view) const
Apply spline interplation.
Definition Cabana_Grid_Interpolation.hpp:1163
Point-to-grid vector divergence functor.
Definition Cabana_Grid_Interpolation.hpp:1473
VectorDivergenceP2G(const ViewType &x, const value_type multiplier)
Constructor.
Definition Cabana_Grid_Interpolation.hpp:1483
ViewType _x
Spline evaluation locations.
Definition Cabana_Grid_Interpolation.hpp:1478
typename ViewType::value_type value_type
Scalar value type.
Definition Cabana_Grid_Interpolation.hpp:1475
KOKKOS_INLINE_FUNCTION void operator()(const SplineDataType &sd, const int p, const GridViewType &view) const
Apply spline interplation.
Definition Cabana_Grid_Interpolation.hpp:1492
value_type _multiplier
Scalar multiplier.
Definition Cabana_Grid_Interpolation.hpp:1480
Grid-to-point vector gradient functor.
Definition Cabana_Grid_Interpolation.hpp:1091
VectorGradientG2P(const ViewType &x, const value_type multiplier)
Constructor.
Definition Cabana_Grid_Interpolation.hpp:1101
KOKKOS_INLINE_FUNCTION void operator()(const SplineDataType &sd, const int p, const GridViewType &view) const
Apply spline interplation.
Definition Cabana_Grid_Interpolation.hpp:1110
value_type _multiplier
Scalar multiplier.
Definition Cabana_Grid_Interpolation.hpp:1098
ViewType _x
Spline evaluation locations.
Definition Cabana_Grid_Interpolation.hpp:1096
typename ViewType::value_type value_type
Scalar value type.
Definition Cabana_Grid_Interpolation.hpp:1093
Grid-to-point vector value functor.
Definition Cabana_Grid_Interpolation.hpp:989
ViewType _x
Spline evaluation locations.
Definition Cabana_Grid_Interpolation.hpp:994
value_type _multiplier
Scalar multiplier.
Definition Cabana_Grid_Interpolation.hpp:996
KOKKOS_INLINE_FUNCTION void operator()(const SplineDataType &sd, const int p, const GridViewType &view) const
Apply spline interplation.
Definition Cabana_Grid_Interpolation.hpp:1008
typename ViewType::value_type value_type
Scalar value type.
Definition Cabana_Grid_Interpolation.hpp:991
VectorValueG2P(const ViewType &x, const value_type multiplier)
Constructor.
Definition Cabana_Grid_Interpolation.hpp:999
Point-to-grid vector value functor.
Definition Cabana_Grid_Interpolation.hpp:1373
value_type _multiplier
Scalar multiplier.
Definition Cabana_Grid_Interpolation.hpp:1380
ViewType _x
Spline evaluation locations.
Definition Cabana_Grid_Interpolation.hpp:1378
VectorValueP2G(const ViewType &x, const value_type multiplier)
Constructor.
Definition Cabana_Grid_Interpolation.hpp:1383
typename ViewType::value_type value_type
Scalar value type.
Definition Cabana_Grid_Interpolation.hpp:1375
KOKKOS_INLINE_FUNCTION void operator()(const SplineDataType &sd, const int p, const GridViewType &view) const
Apply spline interplation.
Definition Cabana_Grid_Interpolation.hpp:1392