1#ifndef _COMPADRE_EVALUATOR_HPP_
2#define _COMPADRE_EVALUATOR_HPP_
11template<
typename T,
typename T2,
typename T3=
void>
18 SubviewND(T data_in, T2 data_original_view,
bool scalar_as_vector_if_needed) {
24 auto get1DView(
const int column_num) ->
decltype(Kokkos::subview(
_data_in, Kokkos::ALL, column_num)) {
27 &&
"Subview asked for column > second dimension of input data.");
29 if ((
size_t)column_num<
_data_in.extent(1))
30 return Kokkos::subview(
_data_in, Kokkos::ALL, column_num);
32 return Kokkos::subview(
_data_in, Kokkos::ALL, 0);
35 auto get2DView(
const int column_num,
const int block_size) ->
decltype(Kokkos::subview(
_data_in, Kokkos::ALL,
36 Kokkos::make_pair(column_num*block_size, (column_num+1)*block_size))) {
39 &&
"Subview asked for column > second dimension of input data.");
41 if ((
size_t)((column_num+1)*block_size-1)<
_data_in.extent(1)) {
42 return Kokkos::subview(
_data_in, Kokkos::ALL, Kokkos::make_pair(column_num*block_size, (column_num+1)*block_size));
45 return Kokkos::subview(
_data_in, Kokkos::ALL, Kokkos::make_pair(0,block_size));
58template<
typename T,
typename T2>
66 SubviewND(T data_in, T2 data_original_view,
bool scalar_as_vector_if_needed) {
77 compadre_assert_debug((column_num==0) &&
"Subview asked for column column_num!=0, but _data_in is rank 1.");
79 return Kokkos::subview(
_data_in, Kokkos::ALL);
82 auto get2DView(
const int column_num,
const int block_size) ->
decltype(Kokkos::subview(
_data_in, Kokkos::ALL)) {
84 return Kokkos::subview(
_data_in, Kokkos::ALL);
102 auto sampling_input_data_device = Kokkos::create_mirror_view(
104 Kokkos::deep_copy(sampling_input_data_device, sampling_input_data_host_or_device);
108 sampling_input_data_host_or_device, scalar_as_vector_if_needed);
147 template <
typename view_type_data>
148 double applyAlphasToDataSingleComponentSingleTargetSite(view_type_data sampling_input_data,
const int column_of_input,
TargetOperation lro,
const int target_index,
const int evaluation_site_local_index,
const int output_component_axis_1,
const int output_component_axis_2,
const int input_component_axis_1,
const int input_component_axis_2,
bool scalar_as_vector_if_needed =
true)
const {
152 const int alpha_input_output_component_index =
_gmls->_h_ss.getAlphaColumnOffset(lro, output_component_axis_1,
153 output_component_axis_2, input_component_axis_1, input_component_axis_2, evaluation_site_local_index);
159 auto nla = *(
_gmls->getNeighborLists());
160 auto alphas =
_gmls->getSolutionSetDevice()->getAlphas();
161 auto sampling_data_device = sampling_subview_maker.get1DView(column_of_input);
163 auto alpha_index =
_gmls->_h_ss.getAlphaIndex(target_index, alpha_input_output_component_index);
166 Kokkos::parallel_reduce(
"applyAlphasToData::Device",
167 Kokkos::RangePolicy<device_execution_space>(0,nla.getNumberOfNeighborsHost(target_index)),
168 KOKKOS_LAMBDA(
const int i,
double& t_value) {
170 t_value += sampling_data_device(nla.getNeighborDevice(target_index, i))
171 *alphas(alpha_index + i);
204 template <
typename view_type_data_out,
typename view_type_data_in>
205 void applyAlphasToDataSingleComponentAllTargetSitesWithPreAndPostTransform(view_type_data_out output_data_single_column, view_type_data_in sampling_data_single_column,
TargetOperation lro,
const SamplingFunctional sro,
const int evaluation_site_local_index,
const int output_component_axis_1,
const int output_component_axis_2,
const int input_component_axis_1,
const int input_component_axis_2,
const int pre_transform_local_index = -1,
const int pre_transform_global_index = -1,
const int post_transform_local_index = -1,
const int post_transform_global_index = -1,
bool vary_on_target =
false,
bool vary_on_neighbor =
false)
const {
207 const int alpha_input_output_component_index =
_gmls->_h_ss.getAlphaColumnOffset(lro, output_component_axis_1,
208 output_component_axis_2, input_component_axis_1, input_component_axis_2, evaluation_site_local_index);
209 const int alpha_input_output_component_index2 = alpha_input_output_component_index;
212 auto nla = *(
_gmls->getNeighborLists());
213 auto solution_set = *(
_gmls->getSolutionSetDevice());
215 "application of alphas called before generateAlphas() was called.");
216 auto prestencil_weights =
_gmls->getPrestencilWeights();
218 const int num_targets = nla.getNumberOfTargets();
221 compadre_assert_debug((std::is_same<typename view_type_data_out::memory_space, typename view_type_data_in::memory_space>::value) &&
222 "output_data_single_column view and input_data_single_column view have difference memory spaces.");
224 bool weight_with_pre_T = (pre_transform_local_index>=0 && pre_transform_global_index>=0) ?
true :
false;
228 Kokkos::parallel_for(
team_policy(num_targets, Kokkos::AUTO),
231 const int target_index = teamMember.league_rank();
232 teamMember.team_barrier();
235 const double previous_value = output_data_single_column(target_index);
238 auto alpha_index = solution_set.getAlphaIndex(target_index, alpha_input_output_component_index);
239 double gmls_value = 0;
240 Kokkos::parallel_reduce(Kokkos::TeamThreadRange(teamMember, nla.getNumberOfNeighborsDevice(target_index)), [&](
const int i,
double& t_value) {
241 const double neighbor_varying_pre_T = (weight_with_pre_T && vary_on_neighbor) ?
242 prestencil_weights(0, target_index, i, pre_transform_local_index, pre_transform_global_index)
245 t_value += neighbor_varying_pre_T * sampling_data_single_column(nla.getNeighborDevice(target_index, i))
246 *solution_set._alphas(alpha_index + i);
252 if (weight_with_pre_T) {
253 if (!vary_on_neighbor && vary_on_target) {
254 pre_T = prestencil_weights(0, target_index, 0, pre_transform_local_index,
255 pre_transform_global_index);
256 }
else if (!vary_on_target) {
257 pre_T = prestencil_weights(0, 0, 0, pre_transform_local_index,
258 pre_transform_global_index);
262 double staggered_value_from_targets = 0;
263 double pre_T_staggered = 1.0;
264 auto alpha_index2 = solution_set.getAlphaIndex(target_index, alpha_input_output_component_index2);
266 if (target_plus_neighbor_staggered_schema) {
267 Kokkos::parallel_reduce(Kokkos::TeamThreadRange(teamMember, nla.getNumberOfNeighborsDevice(target_index)), [&](
const int i,
double& t_value) {
268 const double neighbor_varying_pre_T_staggered = (weight_with_pre_T && vary_on_neighbor) ?
269 prestencil_weights(1, target_index, i, pre_transform_local_index, pre_transform_global_index)
272 t_value += neighbor_varying_pre_T_staggered * sampling_data_single_column(nla.getNeighborDevice(target_index, 0))
273 *solution_set._alphas(alpha_index2 + i);
275 }, staggered_value_from_targets );
278 if (weight_with_pre_T) {
279 if (!vary_on_neighbor && vary_on_target) {
280 pre_T_staggered = prestencil_weights(1, target_index, 0, pre_transform_local_index,
281 pre_transform_global_index);
282 }
else if (!vary_on_target) {
283 pre_T_staggered = prestencil_weights(1, 0, 0, pre_transform_local_index,
284 pre_transform_global_index);
289 double added_value = pre_T*gmls_value + pre_T_staggered*staggered_value_from_targets;
290 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
291 output_data_single_column(target_index) = previous_value + added_value;
308 template <
typename view_type_data_out,
typename view_type_data_in>
312 auto global_dimensions =
_gmls->getGlobalDimensions();
315 auto nla = *(
_gmls->getNeighborLists());
316 const int num_targets = nla.getNumberOfTargets();
318 auto tangent_directions = *(
_gmls->getTangentDirections());
321 compadre_assert_debug((std::is_same<typename view_type_data_out::memory_space, typename view_type_data_in::memory_space>::value) &&
322 "output_data_single_column view and input_data_single_column view have difference memory spaces.");
325 Kokkos::parallel_for(
team_policy(num_targets, Kokkos::AUTO),
328 const int target_index = teamMember.league_rank();
332 global_dimensions, global_dimensions);
333 teamMember.team_barrier();
336 const double previous_value = output_data_single_column(target_index);
338 double added_value = T(local_dim_index, global_dim_index)*sampling_data_single_column(target_index);
339 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
340 output_data_single_column(target_index) = previous_value + added_value;
360 template <
typename output_data_type =
double**,
typename output_memory_space,
typename view_type_input_data,
typename output_array_layout =
typename view_type_input_data::array_layout>
361 Kokkos::View<output_data_type, output_array_layout, output_memory_space>
364 auto nla = *(
_gmls->getNeighborLists());
367 auto local_dimensions =
_gmls->getLocalDimensions();
368 auto global_dimensions =
_gmls->getGlobalDimensions();
370 auto problem_type =
_gmls->getProblemType();
372 typedef Kokkos::View<output_data_type, output_array_layout, output_memory_space> output_view_type;
375 nla.getNumberOfTargets(), output_dimensions);
377 output_view_type ambient_target_output;
379 if (transform_gmls_output_to_ambient) {
381 nla.getNumberOfTargets(), global_dimensions);
386 if (transform_gmls_output_to_ambient) {
387 return ambient_target_output;
389 return target_output;
408 template <
typename view_type_output_data,
typename view_type_input_data,
typename output_array_layout =
typename view_type_input_data::array_layout>
417 auto problem_type =
_gmls->getProblemType();
418 auto global_dimensions =
_gmls->getGlobalDimensions();
419 auto local_dimensions =
_gmls->getLocalDimensions();
424 auto nla = *(
_gmls->getNeighborLists());
434 &&
"First dimension of target_output is incorrect size.\n");
436 &&
"Second dimension of target_output is incorrect size.\n");
439 compadre_assert_debug(((output_dimensions==1 && view_type_output_data::rank==1) || view_type_output_data::rank!=1) &&
440 "Output view is requested as rank 1, but the target requires a rank larger than 1. Try double** as template argument.");
447 auto prestencil_weights =
_gmls->getPrestencilWeights();
451 bool vary_on_target =
false, vary_on_neighbor =
false;
452 auto sro_style = sro.transform_type;
453 bool loop_global_dimensions = sro.input_rank>0 && sro_style!=
Identity;
456 &&
"SamplingFunctional requested for Evaluator does not match GMLS data sampling functional or is not of type 'Identity'.");
459 vary_on_target =
false;
460 vary_on_neighbor =
false;
462 vary_on_target =
true;
463 vary_on_neighbor =
false;
465 vary_on_target =
true;
466 vary_on_neighbor =
true;
472 for (
int axes1=0; axes1<output_dimension1_of_operator; ++axes1) {
473 const int output_component_axis_1 = axes1;
474 for (
int axes2=0; axes2<output_dimension2_of_operator; ++axes2) {
475 const int output_component_axis_2 = axes2;
477 for (
int j=0; j<input_dimension_of_operator; ++j) {
478 const int input_component_axis_1 = j;
479 const int input_component_axis_2 = 0;
481 if (loop_global_dimensions) {
482 for (
int k=0; k<global_dimensions; ++k) {
484 output_subview_maker.get1DView(axes1*output_dimension2_of_operator+axes2),
485 sampling_subview_maker.get1DView(k), lro, sro,
486 evaluation_site_local_index, output_component_axis_1, output_component_axis_2, input_component_axis_1,
487 input_component_axis_2, j, k, -1, -1,
488 vary_on_target, vary_on_neighbor);
492 output_subview_maker.get1DView(axes1*output_dimension2_of_operator+axes2),
493 sampling_subview_maker.get1DView(j), lro, sro,
494 evaluation_site_local_index, output_component_axis_1, output_component_axis_2, input_component_axis_1,
495 input_component_axis_2, 0, 0, -1, -1,
496 vary_on_target, vary_on_neighbor);
499 output_subview_maker.get1DView(axes1*output_dimension2_of_operator+axes2),
500 sampling_subview_maker.get1DView(j), lro, sro,
501 evaluation_site_local_index, output_component_axis_1, output_component_axis_2, input_component_axis_1,
502 input_component_axis_2);
509 if (transform_gmls_output_to_ambient) {
513 &&
"First dimension of target_output is incorrect size.\n");
515 &&
"Second dimension of target_output is incorrect size.\n");
518 for (
int i=0; i<global_dimensions; ++i) {
519 for (
int j=0; j<output_dimensions; ++j) {
521 transformed_output_subview_maker.get1DView(i), output_subview_maker.get1DView(j), j, i);
525 Kokkos::deep_copy(ambient_target_output, transformed_output_subview_maker.copyToAndReturnOriginalView());
529 Kokkos::deep_copy(target_output, output_subview_maker.copyToAndReturnOriginalView());
556 template <
typename view_type_data_out,
typename view_type_data_in>
557 void applyFullPolynomialCoefficientsBasisToDataSingleComponent(view_type_data_out output_data_block_column, view_type_data_in sampling_data_single_column,
const SamplingFunctional sro,
const int output_component_axis_1,
const int output_component_axis_2,
const int input_component_axis_1,
const int input_component_axis_2,
const int pre_transform_local_index = -1,
const int pre_transform_global_index = -1,
const int post_transform_local_index = -1,
const int post_transform_global_index = -1,
bool vary_on_target =
false,
bool vary_on_neighbor =
false)
const {
559 auto nla = *(
_gmls->getNeighborLists());
561 auto coefficient_matrix_dims =
_gmls->getPolynomialCoefficientsDomainRangeSize();
562 auto coefficient_memory_layout_dims =
_gmls->getPolynomialCoefficientsMemorySize();
563 auto coefficient_memory_layout_dims_device =
564 Kokkos::create_mirror_view_and_copy(
device_memory_space(), coefficient_memory_layout_dims);
566 auto global_dimensions =
_gmls->getGlobalDimensions();
569 auto coeffs =
_gmls->getFullPolynomialCoefficientsBasis();
570 auto tangent_directions = *(
_gmls->getTangentDirections());
571 auto prestencil_weights =
_gmls->getPrestencilWeights();
573 const int num_targets = nla.getNumberOfTargets();
576 compadre_assert_debug((std::is_same<typename view_type_data_out::memory_space, typename view_type_data_in::memory_space>::value) &&
577 "output_data_block_column view and input_data_single_column view have difference memory spaces.");
579 bool weight_with_pre_T = (pre_transform_local_index>=0 && pre_transform_global_index>=0) ?
true :
false;
583 for (
int j=0; j<coefficient_matrix_dims(0); ++j) {
584 Kokkos::parallel_for(
team_policy(num_targets, Kokkos::AUTO),
587 const int target_index = teamMember.league_rank();
591 global_dimensions, global_dimensions);
596 *
TO_GLOBAL(coefficient_memory_layout_dims_device(1)),
597 coefficient_memory_layout_dims_device(0), coefficient_memory_layout_dims_device(1));
599 teamMember.team_barrier();
602 const double previous_value = output_data_block_column(target_index, j);
605 double gmls_value = 0;
606 Kokkos::parallel_reduce(Kokkos::TeamThreadRange(teamMember, nla.getNumberOfNeighborsDevice(target_index)), [&](
const int i,
double& t_value) {
607 const double neighbor_varying_pre_T = (weight_with_pre_T && vary_on_neighbor) ?
608 prestencil_weights(0, target_index, i, pre_transform_local_index, pre_transform_global_index)
611 t_value += neighbor_varying_pre_T * sampling_data_single_column(nla.getNeighborDevice(target_index, i))
612 *Coeffs(j, i+input_component_axis_1*nla.getNumberOfNeighborsDevice(target_index));
618 if (weight_with_pre_T) {
619 if (!vary_on_neighbor && vary_on_target) {
620 pre_T = prestencil_weights(0, target_index, 0, pre_transform_local_index,
621 pre_transform_global_index);
622 }
else if (!vary_on_target) {
623 pre_T = prestencil_weights(0, 0, 0, pre_transform_local_index,
624 pre_transform_global_index);
628 double staggered_value_from_targets = 0;
629 double pre_T_staggered = 1.0;
631 if (target_plus_neighbor_staggered_schema) {
632 Kokkos::parallel_reduce(Kokkos::TeamThreadRange(teamMember, nla.getNumberOfNeighborsDevice(target_index)), [&](
const int i,
double& t_value) {
633 const double neighbor_varying_pre_T_staggered = (weight_with_pre_T && vary_on_neighbor) ?
634 prestencil_weights(1, target_index, i, pre_transform_local_index, pre_transform_global_index)
637 t_value += neighbor_varying_pre_T_staggered * sampling_data_single_column(nla.getNeighborDevice(target_index, 0))
638 *Coeffs(j, i+input_component_axis_1*nla.getNumberOfNeighborsDevice(target_index));
640 }, staggered_value_from_targets );
643 if (weight_with_pre_T) {
644 if (!vary_on_neighbor && vary_on_target) {
645 pre_T_staggered = prestencil_weights(1, target_index, 0, pre_transform_local_index,
646 pre_transform_global_index);
647 }
else if (!vary_on_target) {
648 pre_T_staggered = prestencil_weights(1, 0, 0, pre_transform_local_index,
649 pre_transform_global_index);
654 double added_value = (pre_T*gmls_value + pre_T_staggered*staggered_value_from_targets);
655 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
656 output_data_block_column(target_index, j) = previous_value + added_value;
675 template <
typename output_data_type =
double**,
typename output_memory_space,
typename view_type_input_data,
typename output_array_layout =
typename view_type_input_data::array_layout>
676 Kokkos::View<output_data_type, output_array_layout, output_memory_space>
679 auto local_dimensions =
_gmls->getLocalDimensions();
681 auto coefficient_matrix_dims =
_gmls->getPolynomialCoefficientsDomainRangeSize();
684 auto nla = *(
_gmls->getNeighborLists());
687 int output_dimensions = output_dimension_of_reconstruction_space;
689 typedef Kokkos::View<output_data_type, output_array_layout, output_memory_space> output_view_type;
691 output_view_type coefficient_output(
"output coefficients", nla.getNumberOfTargets(),
692 output_dimensions*
_gmls->getPolynomialCoefficientsSize() );
696 return coefficient_output;
713 template <
typename view_type_coefficient_output,
typename view_type_input_data>
715 view_type_input_data sampling_data,
bool scalar_as_vector_if_needed =
true)
const {
721 auto global_dimensions =
_gmls->getGlobalDimensions();
722 auto local_dimensions =
_gmls->getLocalDimensions();
725 auto coefficient_matrix_dims =
_gmls->getPolynomialCoefficientsDomainRangeSize();
728 auto nla = *(
_gmls->getNeighborLists());
733 &&
"First dimension of coefficient_output is incorrect size.\n");
736 coefficient_output.extent(1)==(
size_t)output_dimension_of_reconstruction_space*
_gmls->getPolynomialCoefficientsSize()
737 &&
"Second dimension of coefficient_output is incorrect size.\n");
740 compadre_assert_debug(((output_dimension_of_reconstruction_space==1 && view_type_coefficient_output::rank==1) || view_type_coefficient_output::rank!=1) &&
741 "Output view is requested as rank 1, but the target requires a rank larger than 1. Try double** as template argument.");
748 auto prestencil_weights =
_gmls->getPrestencilWeights();
752 bool vary_on_target =
false, vary_on_neighbor =
false;
758 vary_on_target =
false;
759 vary_on_neighbor =
false;
761 vary_on_target =
true;
762 vary_on_neighbor =
false;
764 vary_on_target =
true;
765 vary_on_neighbor =
true;
770 for (
int i=0; i<output_dimension_of_reconstruction_space; ++i) {
771 const int output_component_axis_1 = i;
772 const int output_component_axis_2 = 0;
774 for (
int j=0; j<input_dimension_of_reconstruction_space; ++j) {
775 const int input_component_axis_1 = j;
776 const int input_component_axis_2 = 0;
778 if (loop_global_dimensions) {
779 for (
int k=0; k<global_dimensions; ++k) {
781 output_subview_maker.get2DView(i,
_gmls->getPolynomialCoefficientsSize()),
782 sampling_subview_maker.get1DView(k), sro,
783 output_component_axis_1, output_component_axis_2, input_component_axis_1,
784 input_component_axis_2, j, k, -1, -1,
785 vary_on_target, vary_on_neighbor);
789 output_subview_maker.get2DView(i,
_gmls->getPolynomialCoefficientsSize()),
790 sampling_subview_maker.get1DView(j), sro,
791 output_component_axis_1, output_component_axis_2, input_component_axis_1,
792 input_component_axis_2, 0, 0, -1, -1,
793 vary_on_target, vary_on_neighbor);
796 output_subview_maker.get2DView(i,
_gmls->getPolynomialCoefficientsSize()),
797 sampling_subview_maker.get1DView(j), sro,
798 output_component_axis_1, output_component_axis_2, input_component_axis_1,
799 input_component_axis_2);
805 Kokkos::deep_copy(coefficient_output, output_subview_maker.copyToAndReturnOriginalView());
std::enable_if< 1==T::rank, T >::type createView(std::string str, int dim_0, int dim_1)
Kokkos::TeamPolicy< device_execution_space > team_policy
typename std::enable_if< B, T >::type enable_if_t
team_policy::member_type member_type
device_execution_space::memory_space device_memory_space
#define compadre_assert_debug(condition)
#define TO_GLOBAL(variable)
Kokkos::View< double **, layout_right, Kokkos::MemoryTraits< Kokkos::Unmanaged > > scratch_matrix_right_type
#define compadre_assert_release(condition)
void applyFullPolynomialCoefficientsBasisToDataSingleComponent(view_type_data_out output_data_block_column, view_type_data_in sampling_data_single_column, const SamplingFunctional sro, const int output_component_axis_1, const int output_component_axis_2, const int input_component_axis_1, const int input_component_axis_2, const int pre_transform_local_index=-1, const int pre_transform_global_index=-1, const int post_transform_local_index=-1, const int post_transform_global_index=-1, bool vary_on_target=false, bool vary_on_neighbor=false) const
Kokkos::View< output_data_type, output_array_layout, output_memory_space > applyAlphasToDataAllComponentsAllTargetSites(view_type_input_data sampling_data, TargetOperation lro, const SamplingFunctional sro_in=PointSample, bool scalar_as_vector_if_needed=true, const int evaluation_site_local_index=0) const
void applyLocalChartToAmbientSpaceTransform(view_type_data_out output_data_single_column, view_type_data_in sampling_data_single_column, const int local_dim_index, const int global_dim_index) const
double applyAlphasToDataSingleComponentSingleTargetSite(view_type_data sampling_input_data, const int column_of_input, TargetOperation lro, const int target_index, const int evaluation_site_local_index, const int output_component_axis_1, const int output_component_axis_2, const int input_component_axis_1, const int input_component_axis_2, bool scalar_as_vector_if_needed=true) const
void applyAlphasToDataSingleComponentAllTargetSitesWithPreAndPostTransform(view_type_data_out output_data_single_column, view_type_data_in sampling_data_single_column, TargetOperation lro, const SamplingFunctional sro, const int evaluation_site_local_index, const int output_component_axis_1, const int output_component_axis_2, const int input_component_axis_1, const int input_component_axis_2, const int pre_transform_local_index=-1, const int pre_transform_global_index=-1, const int post_transform_local_index=-1, const int post_transform_global_index=-1, bool vary_on_target=false, bool vary_on_neighbor=false) const
void applyFullPolynomialCoefficientsBasisToDataAllComponents(view_type_coefficient_output coefficient_output, view_type_input_data sampling_data, bool scalar_as_vector_if_needed=true) const
Kokkos::View< output_data_type, output_array_layout, output_memory_space > applyFullPolynomialCoefficientsBasisToDataAllComponents(view_type_input_data sampling_data, bool scalar_as_vector_if_needed=true) const
void applyAlphasToDataAllComponentsAllTargetSites(view_type_output_data target_output, view_type_output_data ambient_target_output, view_type_input_data sampling_data, TargetOperation lro, const SamplingFunctional sro_in=PointSample, bool scalar_as_vector_if_needed=true, const int evaluation_site_local_index=0) const
Generalized Moving Least Squares (GMLS).
KOKKOS_INLINE_FUNCTION int getTargetOutputTensorRank(const int &index)
auto CreateNDSliceOnDeviceView(T sampling_input_data_host_or_device, bool scalar_as_vector_if_needed) -> SubviewND< decltype(Kokkos::create_mirror_view(device_memory_space(), sampling_input_data_host_or_device)), T >
constexpr SamplingFunctional PointSample
Available sampling functionals.
KOKKOS_INLINE_FUNCTION int calculateBasisMultiplier(const ReconstructionSpace rs, const int local_dimensions)
Calculate basis_multiplier.
TargetOperation
Available target functionals.
KOKKOS_INLINE_FUNCTION int calculateSamplingMultiplier(const ReconstructionSpace rs, const SamplingFunctional sro, const int local_dimensions)
Calculate sampling_multiplier.
@ DifferentEachNeighbor
Each target applies a different transform for each neighbor.
@ DifferentEachTarget
Each target applies a different data transform, but the same to each neighbor.
@ SameForAll
Each neighbor for each target all apply the same transform.
@ Identity
No action performed on data before GMLS target operation.
constexpr SamplingFunctional ManifoldVectorPointSample
KOKKOS_INLINE_FUNCTION int getOutputDimensionOfOperation(TargetOperation lro, const int local_dimensions)
Dimensions ^ output rank for target operation.
constexpr SamplingFunctional VectorPointSample
Point evaluations of the entire vector source function.
KOKKOS_INLINE_FUNCTION int getInputDimensionOfOperation(TargetOperation lro, SamplingFunctional sro, const int local_dimensions)
Dimensions ^ input rank for target operation (always in local chart if on a manifold,...
int transform_type
Describes the SamplingFunction relationship to targets, neighbors.
bool use_target_site_weights
int input_rank
Rank of sampling functional input for each SamplingFunctional.
auto get2DView(const int column_num, const int block_size) -> decltype(Kokkos::subview(_data_in, Kokkos::ALL))
bool _scalar_as_vector_if_needed
T2 copyToAndReturnOriginalView()
auto get1DView(const int column_num) -> decltype(Kokkos::subview(_data_in, Kokkos::ALL))
SubviewND(T data_in, T2 data_original_view, bool scalar_as_vector_if_needed)
Creates 1D subviews of data from a 2D view, generally constructed with CreateNDSliceOnDeviceView.
bool _scalar_as_vector_if_needed
SubviewND(T data_in, T2 data_original_view, bool scalar_as_vector_if_needed)
auto get2DView(const int column_num, const int block_size) -> decltype(Kokkos::subview(_data_in, Kokkos::ALL, Kokkos::make_pair(column_num *block_size,(column_num+1) *block_size)))
auto get1DView(const int column_num) -> decltype(Kokkos::subview(_data_in, Kokkos::ALL, column_num))
T2 copyToAndReturnOriginalView()