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(
863 Kokkos::RangePolicy<ExecutionSpace>( 0, num_point ),
864 KOKKOS_LAMBDA(
const int p ) {
866 MeshScalar px[NumSpaceDim];
867 for ( std::size_t d = 0; d < NumSpaceDim; ++d )
869 px[d] = points( p, d );
879 functor( sd, p, array_view );
912template <
class PointEvalFunctor,
class PointCoordinates,
class ArrayScalar,
913 class MeshScalar,
class EntityType,
int SplineOrder,
914 std::size_t NumSpaceDim,
class MemorySpace,
class... ArrayParams>
917 ArrayParams...>& array,
920 const PointEvalFunctor& functor )
922 using exec_space =
typename Array<ArrayScalar, EntityType,
924 ArrayParams...>::execution_space;
938template <
class ViewType>
954 static_assert( 1 == ViewType::rank,
"View must be of scalars" );
958 template <
class SplineDataType,
class Gr
idViewType>
959 KOKKOS_INLINE_FUNCTION
void operator()(
const SplineDataType& sd,
961 const GridViewType& view )
const
971template <
class ViewType>
972ScalarValueG2P<ViewType>
974 const typename ViewType::value_type& multiplier )
988template <
class ViewType>
1004 static_assert( 2 == ViewType::rank,
"View must be of vectors" );
1008 template <
class SplineDataType,
class Gr
idViewType>
1009 KOKKOS_INLINE_FUNCTION
void operator()(
const SplineDataType& sd,
1011 const GridViewType& view )
const
1013 value_type result[SplineDataType::num_space_dim];
1015 for ( std::size_t d = 0; d < SplineDataType::num_space_dim; ++d )
1022template <
class ViewType>
1023VectorValueG2P<ViewType>
1025 const typename ViewType::value_type& multiplier )
1039template <
class ViewType>
1055 static_assert( 2 == ViewType::rank,
"View must be of vectors" );
1059 template <
class SplineDataType,
class Gr
idViewType>
1060 KOKKOS_INLINE_FUNCTION
void operator()(
const SplineDataType& sd,
1062 const GridViewType& view )
const
1064 value_type result[SplineDataType::num_space_dim];
1066 for ( std::size_t d = 0; d < SplineDataType::num_space_dim; ++d )
1073template <
class ViewType>
1074ScalarGradientG2P<ViewType>
1076 const typename ViewType::value_type& multiplier )
1090template <
class ViewType>
1106 static_assert( 3 == ViewType::rank,
"View must be of tensors" );
1110 template <
class SplineDataType,
class Gr
idViewType>
1111 KOKKOS_INLINE_FUNCTION
void operator()(
const SplineDataType& sd,
1113 const GridViewType& view )
const
1115 value_type result[SplineDataType::num_space_dim]
1116 [SplineDataType::num_space_dim];
1118 for ( std::size_t d0 = 0; d0 < SplineDataType::num_space_dim; ++d0 )
1119 for ( std::size_t d1 = 0; d1 < SplineDataType::num_space_dim; ++d1 )
1126template <
class ViewType>
1127VectorGradientG2P<ViewType>
1129 const typename ViewType::value_type& multiplier )
1143template <
class ViewType>
1159 static_assert( 1 == ViewType::rank,
"View must be of scalars" );
1163 template <
class SplineDataType,
class Gr
idViewType>
1164 KOKKOS_INLINE_FUNCTION
void operator()(
const SplineDataType& sd,
1166 const GridViewType& view )
const
1176template <
class ViewType>
1177VectorDivergenceG2P<ViewType>
1179 const typename ViewType::value_type& multiplier )
1217template <
class ExecutionSpace,
class PointEvalFunctor,
class PointCoordinates,
1218 class ArrayScalar,
class MeshScalar, std::size_t NumSpaceDim,
1219 class EntityType,
int SplineOrder,
class MemorySpace,
1220 class... ArrayParams>
1221void p2g( ExecutionSpace,
const PointEvalFunctor& functor,
1222 const PointCoordinates& points,
const std::size_t num_point,
1225 ArrayParams...>& array )
1231 std::is_same<MemorySpace, typename array_type::memory_space>::value,
1232 "Mismatching points/array memory space." );
1239 auto array_view = array.view();
1240 auto array_sv = Kokkos::Experimental::create_scatter_view( array_view );
1243 Kokkos::parallel_for(
1244 "Cabana::Grid::p2g",
1245 Kokkos::RangePolicy<ExecutionSpace>( 0, num_point ),
1246 KOKKOS_LAMBDA(
const int p ) {
1248 MeshScalar px[NumSpaceDim];
1249 for ( std::size_t d = 0; d < NumSpaceDim; ++d )
1251 px[d] = points( p, d );
1261 functor( sd, p, array_sv );
1263 Kokkos::Experimental::contribute( array_view, array_sv );
1299template <
class PointEvalFunctor,
class PointCoordinates,
class ArrayScalar,
1300 class MeshScalar, std::size_t NumSpaceDim,
class EntityType,
1301 int SplineOrder,
class MemorySpace,
class... ArrayParams>
1302void p2g(
const PointEvalFunctor& functor,
const PointCoordinates& points,
1306 ArrayParams...>& array )
1308 using exec_space =
typename Array<ArrayScalar, EntityType,
1310 ArrayParams...>::execution_space;
1324template <
class ViewType>
1340 static_assert( 1 == ViewType::rank,
"View must be of scalars" );
1344 template <
class SplineDataType,
class Gr
idViewType>
1345 KOKKOS_INLINE_FUNCTION
void operator()(
const SplineDataType& sd,
1347 const GridViewType& view )
const
1356template <
class ViewType>
1357ScalarValueP2G<ViewType>
1359 const typename ViewType::value_type& multiplier )
1373template <
class ViewType>
1389 static_assert( 2 == ViewType::rank,
"View must be of vectors" );
1393 template <
class SplineDataType,
class Gr
idViewType>
1394 KOKKOS_INLINE_FUNCTION
void operator()(
const SplineDataType& sd,
1396 const GridViewType& view )
const
1398 value_type point_data[SplineDataType::num_space_dim];
1399 for ( std::size_t d = 0; d < SplineDataType::num_space_dim; ++d )
1407template <
class ViewType>
1408VectorValueP2G<ViewType>
1410 const typename ViewType::value_type& multiplier )
1424template <
class ViewType>
1440 static_assert( 1 == ViewType::rank,
"View must be of scalars" );
1444 template <
class SplineDataType,
class Gr
idViewType>
1445 KOKKOS_INLINE_FUNCTION
void operator()(
const SplineDataType& sd,
1447 const GridViewType& view )
const
1456template <
class ViewType>
1457ScalarGradientP2G<ViewType>
1459 const typename ViewType::value_type& multiplier )
1473template <
class ViewType>
1489 static_assert( 2 == ViewType::rank,
"View must be of vectors" );
1493 template <
class SplineDataType,
class Gr
idViewType>
1494 KOKKOS_INLINE_FUNCTION
void operator()(
const SplineDataType& sd,
1496 const GridViewType& view )
const
1498 value_type point_data[SplineDataType::num_space_dim];
1499 for ( std::size_t d = 0; d < SplineDataType::num_space_dim; ++d )
1507template <
class ViewType>
1508VectorDivergenceP2G<ViewType>
1510 const typename ViewType::value_type& multiplier )
1524template <
class ViewType>
1540 static_assert( 3 == ViewType::rank,
"View must be of tensors" );
1544 template <
class SplineDataType,
class Gr
idViewType>
1545 KOKKOS_INLINE_FUNCTION
void operator()(
const SplineDataType& sd,
1547 const GridViewType& view )
const
1549 value_type point_data[SplineDataType::num_space_dim]
1550 [SplineDataType::num_space_dim];
1551 for ( std::size_t d0 = 0; d0 < SplineDataType::num_space_dim; ++d0 )
1552 for ( std::size_t d1 = 0; d1 < SplineDataType::num_space_dim; ++d1 )
1560template <
class ViewType>
1561TensorDivergenceP2G<ViewType>
1563 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:1178
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:1509
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:1562
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:1075
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:1128
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:1358
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:1409
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:1024
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:1458
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:1221
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:973
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:1041
ViewType _x
Spline evaluation locations.
Definition Cabana_Grid_Interpolation.hpp:1046
typename ViewType::value_type value_type
Scalar value type.
Definition Cabana_Grid_Interpolation.hpp:1043
value_type _multiplier
Scalar multiplier.
Definition Cabana_Grid_Interpolation.hpp:1048
KOKKOS_INLINE_FUNCTION void operator()(const SplineDataType &sd, const int p, const GridViewType &view) const
Apply spline interplation.
Definition Cabana_Grid_Interpolation.hpp:1060
ScalarGradientG2P(const ViewType &x, const value_type multiplier)
Constructor.
Definition Cabana_Grid_Interpolation.hpp:1051
Point-to-grid scalar gradient functor.
Definition Cabana_Grid_Interpolation.hpp:1426
value_type _multiplier
Scalar multiplier.
Definition Cabana_Grid_Interpolation.hpp:1433
typename ViewType::value_type value_type
Scalar value type.
Definition Cabana_Grid_Interpolation.hpp:1428
ViewType _x
Spline evaluation locations.
Definition Cabana_Grid_Interpolation.hpp:1431
ScalarGradientP2G(const ViewType &x, const value_type multiplier)
Constructor.
Definition Cabana_Grid_Interpolation.hpp:1436
KOKKOS_INLINE_FUNCTION void operator()(const SplineDataType &sd, const int p, const GridViewType &view) const
Apply spline interplation.
Definition Cabana_Grid_Interpolation.hpp:1445
Grid-to-point scalar value functor.
Definition Cabana_Grid_Interpolation.hpp:940
ScalarValueG2P(const ViewType &x, const value_type multiplier)
Constructor.
Definition Cabana_Grid_Interpolation.hpp:950
typename ViewType::value_type value_type
Scalar value type.
Definition Cabana_Grid_Interpolation.hpp:942
ViewType _x
Spline evaluation locations.
Definition Cabana_Grid_Interpolation.hpp:945
KOKKOS_INLINE_FUNCTION void operator()(const SplineDataType &sd, const int p, const GridViewType &view) const
Apply spline interplation.
Definition Cabana_Grid_Interpolation.hpp:959
value_type _multiplier
Scalar multiplier.
Definition Cabana_Grid_Interpolation.hpp:947
Point-to-grid scalar value functor.
Definition Cabana_Grid_Interpolation.hpp:1326
ViewType _x
Spline evaluation locations.
Definition Cabana_Grid_Interpolation.hpp:1331
ScalarValueP2G(const ViewType &x, const value_type multiplier)
Constructor.
Definition Cabana_Grid_Interpolation.hpp:1336
KOKKOS_INLINE_FUNCTION void operator()(const SplineDataType &sd, const int p, const GridViewType &view) const
Apply spline interplation.
Definition Cabana_Grid_Interpolation.hpp:1345
value_type _multiplier
Scalar multiplier.
Definition Cabana_Grid_Interpolation.hpp:1333
typename ViewType::value_type value_type
Scalar value type.
Definition Cabana_Grid_Interpolation.hpp:1328
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:1526
TensorDivergenceP2G(const ViewType &x, const value_type multiplier)
Constructor.
Definition Cabana_Grid_Interpolation.hpp:1536
ViewType _x
Spline evaluation locations.
Definition Cabana_Grid_Interpolation.hpp:1531
KOKKOS_INLINE_FUNCTION void operator()(const SplineDataType &sd, const int p, const GridViewType &view) const
Apply spline interplation.
Definition Cabana_Grid_Interpolation.hpp:1545
typename ViewType::value_type value_type
Scalar value type.
Definition Cabana_Grid_Interpolation.hpp:1528
value_type _multiplier
Scalar multiplier.
Definition Cabana_Grid_Interpolation.hpp:1533
Grid-to-point vector value functor.
Definition Cabana_Grid_Interpolation.hpp:1145
ViewType _x
Spline evaluation locations.
Definition Cabana_Grid_Interpolation.hpp:1150
value_type _multiplier
Scalar multiplier.
Definition Cabana_Grid_Interpolation.hpp:1152
VectorDivergenceG2P(const ViewType &x, const value_type multiplier)
Constructor.
Definition Cabana_Grid_Interpolation.hpp:1155
typename ViewType::value_type value_type
Scalar value type.
Definition Cabana_Grid_Interpolation.hpp:1147
KOKKOS_INLINE_FUNCTION void operator()(const SplineDataType &sd, const int p, const GridViewType &view) const
Apply spline interplation.
Definition Cabana_Grid_Interpolation.hpp:1164
Point-to-grid vector divergence functor.
Definition Cabana_Grid_Interpolation.hpp:1475
VectorDivergenceP2G(const ViewType &x, const value_type multiplier)
Constructor.
Definition Cabana_Grid_Interpolation.hpp:1485
ViewType _x
Spline evaluation locations.
Definition Cabana_Grid_Interpolation.hpp:1480
typename ViewType::value_type value_type
Scalar value type.
Definition Cabana_Grid_Interpolation.hpp:1477
KOKKOS_INLINE_FUNCTION void operator()(const SplineDataType &sd, const int p, const GridViewType &view) const
Apply spline interplation.
Definition Cabana_Grid_Interpolation.hpp:1494
value_type _multiplier
Scalar multiplier.
Definition Cabana_Grid_Interpolation.hpp:1482
Grid-to-point vector gradient functor.
Definition Cabana_Grid_Interpolation.hpp:1092
VectorGradientG2P(const ViewType &x, const value_type multiplier)
Constructor.
Definition Cabana_Grid_Interpolation.hpp:1102
KOKKOS_INLINE_FUNCTION void operator()(const SplineDataType &sd, const int p, const GridViewType &view) const
Apply spline interplation.
Definition Cabana_Grid_Interpolation.hpp:1111
value_type _multiplier
Scalar multiplier.
Definition Cabana_Grid_Interpolation.hpp:1099
ViewType _x
Spline evaluation locations.
Definition Cabana_Grid_Interpolation.hpp:1097
typename ViewType::value_type value_type
Scalar value type.
Definition Cabana_Grid_Interpolation.hpp:1094
Grid-to-point vector value functor.
Definition Cabana_Grid_Interpolation.hpp:990
ViewType _x
Spline evaluation locations.
Definition Cabana_Grid_Interpolation.hpp:995
value_type _multiplier
Scalar multiplier.
Definition Cabana_Grid_Interpolation.hpp:997
KOKKOS_INLINE_FUNCTION void operator()(const SplineDataType &sd, const int p, const GridViewType &view) const
Apply spline interplation.
Definition Cabana_Grid_Interpolation.hpp:1009
typename ViewType::value_type value_type
Scalar value type.
Definition Cabana_Grid_Interpolation.hpp:992
VectorValueG2P(const ViewType &x, const value_type multiplier)
Constructor.
Definition Cabana_Grid_Interpolation.hpp:1000
Point-to-grid vector value functor.
Definition Cabana_Grid_Interpolation.hpp:1375
value_type _multiplier
Scalar multiplier.
Definition Cabana_Grid_Interpolation.hpp:1382
ViewType _x
Spline evaluation locations.
Definition Cabana_Grid_Interpolation.hpp:1380
VectorValueP2G(const ViewType &x, const value_type multiplier)
Constructor.
Definition Cabana_Grid_Interpolation.hpp:1385
typename ViewType::value_type value_type
Scalar value type.
Definition Cabana_Grid_Interpolation.hpp:1377
KOKKOS_INLINE_FUNCTION void operator()(const SplineDataType &sd, const int p, const GridViewType &view) const
Apply spline interplation.
Definition Cabana_Grid_Interpolation.hpp:1394