9#ifndef _COMPADRE_EVALUATOR_HPP_
10#define _COMPADRE_EVALUATOR_HPP_
19template<
typename T,
typename T2,
typename T3=
void>
26 SubviewND(T data_in, T2 data_original_view,
bool scalar_as_vector_if_needed) {
32 auto get1DView(
const int column_num) ->
decltype(Kokkos::subview(
_data_in, Kokkos::ALL, column_num)) {
35 &&
"Subview asked for column > second dimension of input data.");
37 if ((
size_t)column_num<
_data_in.extent(1))
38 return Kokkos::subview(
_data_in, Kokkos::ALL, column_num);
40 return Kokkos::subview(
_data_in, Kokkos::ALL, 0);
43 auto get2DView(
const int column_num,
const int block_size) ->
decltype(Kokkos::subview(
_data_in, Kokkos::ALL,
44 Kokkos::make_pair(column_num*block_size, (column_num+1)*block_size))) {
47 &&
"Subview asked for column > second dimension of input data.");
49 if ((
size_t)((column_num+1)*block_size-1)<
_data_in.extent(1)) {
50 return Kokkos::subview(
_data_in, Kokkos::ALL, Kokkos::make_pair(column_num*block_size, (column_num+1)*block_size));
53 return Kokkos::subview(
_data_in, Kokkos::ALL, Kokkos::make_pair(0,block_size));
66template<
typename T,
typename T2>
74 SubviewND(T data_in, T2 data_original_view,
bool scalar_as_vector_if_needed) {
85 compadre_assert_debug((column_num==0) &&
"Subview asked for column column_num!=0, but _data_in is rank 1.");
87 return Kokkos::subview(
_data_in, Kokkos::ALL);
90 auto get2DView(
const int column_num,
const int block_size) ->
decltype(Kokkos::subview(
_data_in, Kokkos::ALL)) {
92 return Kokkos::subview(
_data_in, Kokkos::ALL);
110 auto sampling_input_data_device = Kokkos::create_mirror_view(
112 Kokkos::deep_copy(sampling_input_data_device, sampling_input_data_host_or_device);
116 sampling_input_data_host_or_device, scalar_as_vector_if_needed);
155 template <
typename view_type_data>
156 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 {
160 const int alpha_input_output_component_index =
_gmls->_h_ss.getAlphaColumnOffset(lro, output_component_axis_1,
161 output_component_axis_2, input_component_axis_1, input_component_axis_2, evaluation_site_local_index);
167 auto nla = *(
_gmls->getNeighborLists());
168 auto alphas =
_gmls->getSolutionSetDevice()->getAlphas();
169 auto sampling_data_device = sampling_subview_maker.get1DView(column_of_input);
171 auto alpha_index =
_gmls->_h_ss.getAlphaIndex(target_index, alpha_input_output_component_index);
174 Kokkos::parallel_reduce(
"applyAlphasToData::Device",
175 Kokkos::RangePolicy<device_execution_space>(0,nla.getNumberOfNeighborsHost(target_index)),
176 KOKKOS_LAMBDA(
const int i,
double& t_value) {
178 t_value += sampling_data_device(nla.getNeighborDevice(target_index, i))
179 *alphas(alpha_index + i);
212 template <
typename view_type_data_out,
typename view_type_data_in>
213 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 {
215 const int alpha_input_output_component_index =
_gmls->_h_ss.getAlphaColumnOffset(lro, output_component_axis_1,
216 output_component_axis_2, input_component_axis_1, input_component_axis_2, evaluation_site_local_index);
217 const int alpha_input_output_component_index2 = alpha_input_output_component_index;
220 auto nla = *(
_gmls->getNeighborLists());
221 auto solution_set = *(
_gmls->getSolutionSetDevice());
223 "application of alphas called before generateAlphas() was called.");
224 auto prestencil_weights =
_gmls->getPrestencilWeights();
226 const int num_targets = nla.getNumberOfTargets();
229 compadre_assert_debug((std::is_same<typename view_type_data_out::memory_space, typename view_type_data_in::memory_space>::value) &&
230 "output_data_single_column view and input_data_single_column view have difference memory spaces.");
232 bool weight_with_pre_T = (pre_transform_local_index>=0 && pre_transform_global_index>=0) ?
true :
false;
236 Kokkos::parallel_for(
team_policy(num_targets, Kokkos::AUTO),
239 const int target_index = teamMember.league_rank();
240 teamMember.team_barrier();
243 const double previous_value = output_data_single_column(target_index);
246 auto alpha_index = solution_set.getAlphaIndex(target_index, alpha_input_output_component_index);
247 double gmls_value = 0;
248 Kokkos::parallel_reduce(Kokkos::TeamThreadRange(teamMember, nla.getNumberOfNeighborsDevice(target_index)), [&](
const int i,
double& t_value) {
249 const double neighbor_varying_pre_T = (weight_with_pre_T && vary_on_neighbor) ?
250 prestencil_weights(0, target_index, i, pre_transform_local_index, pre_transform_global_index)
253 t_value += neighbor_varying_pre_T * sampling_data_single_column(nla.getNeighborDevice(target_index, i))
254 *solution_set._alphas(alpha_index + i);
260 if (weight_with_pre_T) {
261 if (!vary_on_neighbor && vary_on_target) {
262 pre_T = prestencil_weights(0, target_index, 0, pre_transform_local_index,
263 pre_transform_global_index);
264 }
else if (!vary_on_target) {
265 pre_T = prestencil_weights(0, 0, 0, pre_transform_local_index,
266 pre_transform_global_index);
270 double staggered_value_from_targets = 0;
271 double pre_T_staggered = 1.0;
272 auto alpha_index2 = solution_set.getAlphaIndex(target_index, alpha_input_output_component_index2);
274 if (target_plus_neighbor_staggered_schema) {
275 Kokkos::parallel_reduce(Kokkos::TeamThreadRange(teamMember, nla.getNumberOfNeighborsDevice(target_index)), [&](
const int i,
double& t_value) {
276 const double neighbor_varying_pre_T_staggered = (weight_with_pre_T && vary_on_neighbor) ?
277 prestencil_weights(1, target_index, i, pre_transform_local_index, pre_transform_global_index)
280 t_value += neighbor_varying_pre_T_staggered * sampling_data_single_column(nla.getNeighborDevice(target_index, 0))
281 *solution_set._alphas(alpha_index2 + i);
283 }, staggered_value_from_targets );
286 if (weight_with_pre_T) {
287 if (!vary_on_neighbor && vary_on_target) {
288 pre_T_staggered = prestencil_weights(1, target_index, 0, pre_transform_local_index,
289 pre_transform_global_index);
290 }
else if (!vary_on_target) {
291 pre_T_staggered = prestencil_weights(1, 0, 0, pre_transform_local_index,
292 pre_transform_global_index);
297 double added_value = pre_T*gmls_value + pre_T_staggered*staggered_value_from_targets;
298 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
299 output_data_single_column(target_index) = previous_value + added_value;
316 template <
typename view_type_data_out,
typename view_type_data_in>
320 auto global_dimensions =
_gmls->getGlobalDimensions();
323 auto nla = *(
_gmls->getNeighborLists());
324 const int num_targets = nla.getNumberOfTargets();
326 auto tangent_directions = *(
_gmls->getTangentDirections());
329 compadre_assert_debug((std::is_same<typename view_type_data_out::memory_space, typename view_type_data_in::memory_space>::value) &&
330 "output_data_single_column view and input_data_single_column view have difference memory spaces.");
333 Kokkos::parallel_for(
team_policy(num_targets, Kokkos::AUTO),
336 const int target_index = teamMember.league_rank();
340 global_dimensions, global_dimensions);
341 teamMember.team_barrier();
344 const double previous_value = output_data_single_column(target_index);
346 double added_value = T(local_dim_index, global_dim_index)*sampling_data_single_column(target_index);
347 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
348 output_data_single_column(target_index) = previous_value + added_value;
368 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>
369 Kokkos::View<output_data_type, output_array_layout, output_memory_space>
372 auto nla = *(
_gmls->getNeighborLists());
375 auto local_dimensions =
_gmls->getLocalDimensions();
376 auto global_dimensions =
_gmls->getGlobalDimensions();
378 auto problem_type =
_gmls->getProblemType();
380 typedef Kokkos::View<output_data_type, output_array_layout, output_memory_space> output_view_type;
383 nla.getNumberOfTargets(), output_dimensions);
385 output_view_type ambient_target_output;
387 if (transform_gmls_output_to_ambient) {
389 nla.getNumberOfTargets(), global_dimensions);
394 if (transform_gmls_output_to_ambient) {
395 return ambient_target_output;
397 return target_output;
416 template <
typename view_type_output_data,
typename view_type_input_data,
typename output_array_layout =
typename view_type_input_data::array_layout>
425 auto problem_type =
_gmls->getProblemType();
426 auto global_dimensions =
_gmls->getGlobalDimensions();
427 auto local_dimensions =
_gmls->getLocalDimensions();
432 auto nla = *(
_gmls->getNeighborLists());
442 &&
"First dimension of target_output is incorrect size.\n");
444 &&
"Second dimension of target_output is incorrect size.\n");
447 compadre_assert_debug(((output_dimensions==1 && view_type_output_data::rank==1) || view_type_output_data::rank!=1) &&
448 "Output view is requested as rank 1, but the target requires a rank larger than 1. Try double** as template argument.");
455 auto prestencil_weights =
_gmls->getPrestencilWeights();
459 bool vary_on_target =
false, vary_on_neighbor =
false;
460 auto sro_style = sro.transform_type;
461 bool loop_global_dimensions = sro.input_rank>0 && sro_style!=
Identity;
464 &&
"SamplingFunctional requested for Evaluator does not match GMLS data sampling functional or is not of type 'Identity'.");
467 vary_on_target =
false;
468 vary_on_neighbor =
false;
470 vary_on_target =
true;
471 vary_on_neighbor =
false;
473 vary_on_target =
true;
474 vary_on_neighbor =
true;
480 for (
int axes1=0; axes1<output_dimension1_of_operator; ++axes1) {
481 const int output_component_axis_1 = axes1;
482 for (
int axes2=0; axes2<output_dimension2_of_operator; ++axes2) {
483 const int output_component_axis_2 = axes2;
485 for (
int j=0; j<input_dimension_of_operator; ++j) {
486 const int input_component_axis_1 = j;
487 const int input_component_axis_2 = 0;
489 if (loop_global_dimensions) {
490 for (
int k=0; k<global_dimensions; ++k) {
492 output_subview_maker.get1DView(axes1*output_dimension2_of_operator+axes2),
493 sampling_subview_maker.get1DView(k), lro, sro,
494 evaluation_site_local_index, output_component_axis_1, output_component_axis_2, input_component_axis_1,
495 input_component_axis_2, j, k, -1, -1,
496 vary_on_target, vary_on_neighbor);
500 output_subview_maker.get1DView(axes1*output_dimension2_of_operator+axes2),
501 sampling_subview_maker.get1DView(j), lro, sro,
502 evaluation_site_local_index, output_component_axis_1, output_component_axis_2, input_component_axis_1,
503 input_component_axis_2, 0, 0, -1, -1,
504 vary_on_target, vary_on_neighbor);
507 output_subview_maker.get1DView(axes1*output_dimension2_of_operator+axes2),
508 sampling_subview_maker.get1DView(j), lro, sro,
509 evaluation_site_local_index, output_component_axis_1, output_component_axis_2, input_component_axis_1,
510 input_component_axis_2);
517 if (transform_gmls_output_to_ambient) {
521 &&
"First dimension of target_output is incorrect size.\n");
523 &&
"Second dimension of target_output is incorrect size.\n");
526 for (
int i=0; i<global_dimensions; ++i) {
527 for (
int j=0; j<output_dimensions; ++j) {
529 transformed_output_subview_maker.get1DView(i), output_subview_maker.get1DView(j), j, i);
533 Kokkos::deep_copy(ambient_target_output, transformed_output_subview_maker.copyToAndReturnOriginalView());
537 Kokkos::deep_copy(target_output, output_subview_maker.copyToAndReturnOriginalView());
564 template <
typename view_type_data_out,
typename view_type_data_in>
565 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 {
567 auto nla = *(
_gmls->getNeighborLists());
569 auto coefficient_matrix_dims =
_gmls->getPolynomialCoefficientsDomainRangeSize();
570 auto coefficient_memory_layout_dims =
_gmls->getPolynomialCoefficientsMemorySize();
571 auto coefficient_memory_layout_dims_device =
572 Kokkos::create_mirror_view_and_copy(
device_memory_space(), coefficient_memory_layout_dims);
574 auto global_dimensions =
_gmls->getGlobalDimensions();
577 auto coeffs =
_gmls->getFullPolynomialCoefficientsBasis();
578 auto tangent_directions = *(
_gmls->getTangentDirections());
579 auto prestencil_weights =
_gmls->getPrestencilWeights();
581 const int num_targets = nla.getNumberOfTargets();
584 compadre_assert_debug((std::is_same<typename view_type_data_out::memory_space, typename view_type_data_in::memory_space>::value) &&
585 "output_data_block_column view and input_data_single_column view have difference memory spaces.");
587 bool weight_with_pre_T = (pre_transform_local_index>=0 && pre_transform_global_index>=0) ?
true :
false;
591 for (
int j=0; j<coefficient_matrix_dims(0); ++j) {
592 Kokkos::parallel_for(
team_policy(num_targets, Kokkos::AUTO),
595 const int target_index = teamMember.league_rank();
599 global_dimensions, global_dimensions);
604 *
TO_GLOBAL(coefficient_memory_layout_dims_device(1)),
605 coefficient_memory_layout_dims_device(0), coefficient_memory_layout_dims_device(1));
607 teamMember.team_barrier();
610 const double previous_value = output_data_block_column(target_index, j);
613 double gmls_value = 0;
614 Kokkos::parallel_reduce(Kokkos::TeamThreadRange(teamMember, nla.getNumberOfNeighborsDevice(target_index)), [&](
const int i,
double& t_value) {
615 const double neighbor_varying_pre_T = (weight_with_pre_T && vary_on_neighbor) ?
616 prestencil_weights(0, target_index, i, pre_transform_local_index, pre_transform_global_index)
619 t_value += neighbor_varying_pre_T * sampling_data_single_column(nla.getNeighborDevice(target_index, i))
620 *Coeffs(j, i+input_component_axis_1*nla.getNumberOfNeighborsDevice(target_index));
626 if (weight_with_pre_T) {
627 if (!vary_on_neighbor && vary_on_target) {
628 pre_T = prestencil_weights(0, target_index, 0, pre_transform_local_index,
629 pre_transform_global_index);
630 }
else if (!vary_on_target) {
631 pre_T = prestencil_weights(0, 0, 0, pre_transform_local_index,
632 pre_transform_global_index);
636 double staggered_value_from_targets = 0;
637 double pre_T_staggered = 1.0;
639 if (target_plus_neighbor_staggered_schema) {
640 Kokkos::parallel_reduce(Kokkos::TeamThreadRange(teamMember, nla.getNumberOfNeighborsDevice(target_index)), [&](
const int i,
double& t_value) {
641 const double neighbor_varying_pre_T_staggered = (weight_with_pre_T && vary_on_neighbor) ?
642 prestencil_weights(1, target_index, i, pre_transform_local_index, pre_transform_global_index)
645 t_value += neighbor_varying_pre_T_staggered * sampling_data_single_column(nla.getNeighborDevice(target_index, 0))
646 *Coeffs(j, i+input_component_axis_1*nla.getNumberOfNeighborsDevice(target_index));
648 }, staggered_value_from_targets );
651 if (weight_with_pre_T) {
652 if (!vary_on_neighbor && vary_on_target) {
653 pre_T_staggered = prestencil_weights(1, target_index, 0, pre_transform_local_index,
654 pre_transform_global_index);
655 }
else if (!vary_on_target) {
656 pre_T_staggered = prestencil_weights(1, 0, 0, pre_transform_local_index,
657 pre_transform_global_index);
662 double added_value = (pre_T*gmls_value + pre_T_staggered*staggered_value_from_targets);
663 Kokkos::single(Kokkos::PerTeam(teamMember), [&] () {
664 output_data_block_column(target_index, j) = previous_value + added_value;
683 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>
684 Kokkos::View<output_data_type, output_array_layout, output_memory_space>
687 auto local_dimensions =
_gmls->getLocalDimensions();
689 auto coefficient_matrix_dims =
_gmls->getPolynomialCoefficientsDomainRangeSize();
692 auto nla = *(
_gmls->getNeighborLists());
695 int output_dimensions = output_dimension_of_reconstruction_space;
697 typedef Kokkos::View<output_data_type, output_array_layout, output_memory_space> output_view_type;
699 output_view_type coefficient_output(
"output coefficients", nla.getNumberOfTargets(),
700 output_dimensions*
_gmls->getPolynomialCoefficientsSize() );
704 return coefficient_output;
721 template <
typename view_type_coefficient_output,
typename view_type_input_data>
723 view_type_input_data sampling_data,
bool scalar_as_vector_if_needed =
true)
const {
729 auto global_dimensions =
_gmls->getGlobalDimensions();
730 auto local_dimensions =
_gmls->getLocalDimensions();
733 auto coefficient_matrix_dims =
_gmls->getPolynomialCoefficientsDomainRangeSize();
736 auto nla = *(
_gmls->getNeighborLists());
741 &&
"First dimension of coefficient_output is incorrect size.\n");
744 coefficient_output.extent(1)==(
size_t)output_dimension_of_reconstruction_space*
_gmls->getPolynomialCoefficientsSize()
745 &&
"Second dimension of coefficient_output is incorrect size.\n");
748 compadre_assert_debug(((output_dimension_of_reconstruction_space==1 && view_type_coefficient_output::rank==1) || view_type_coefficient_output::rank!=1) &&
749 "Output view is requested as rank 1, but the target requires a rank larger than 1. Try double** as template argument.");
756 auto prestencil_weights =
_gmls->getPrestencilWeights();
760 bool vary_on_target =
false, vary_on_neighbor =
false;
766 vary_on_target =
false;
767 vary_on_neighbor =
false;
769 vary_on_target =
true;
770 vary_on_neighbor =
false;
772 vary_on_target =
true;
773 vary_on_neighbor =
true;
778 for (
int i=0; i<output_dimension_of_reconstruction_space; ++i) {
779 const int output_component_axis_1 = i;
780 const int output_component_axis_2 = 0;
782 for (
int j=0; j<input_dimension_of_reconstruction_space; ++j) {
783 const int input_component_axis_1 = j;
784 const int input_component_axis_2 = 0;
786 if (loop_global_dimensions) {
787 for (
int k=0; k<global_dimensions; ++k) {
789 output_subview_maker.get2DView(i,
_gmls->getPolynomialCoefficientsSize()),
790 sampling_subview_maker.get1DView(k), sro,
791 output_component_axis_1, output_component_axis_2, input_component_axis_1,
792 input_component_axis_2, j, k, -1, -1,
793 vary_on_target, vary_on_neighbor);
797 output_subview_maker.get2DView(i,
_gmls->getPolynomialCoefficientsSize()),
798 sampling_subview_maker.get1DView(j), sro,
799 output_component_axis_1, output_component_axis_2, input_component_axis_1,
800 input_component_axis_2, 0, 0, -1, -1,
801 vary_on_target, vary_on_neighbor);
804 output_subview_maker.get2DView(i,
_gmls->getPolynomialCoefficientsSize()),
805 sampling_subview_maker.get1DView(j), sro,
806 output_component_axis_1, output_component_axis_2, input_component_axis_1,
807 input_component_axis_2);
813 Kokkos::deep_copy(coefficient_output, output_subview_maker.copyToAndReturnOriginalView());
#define compadre_assert_debug(condition)
#define TO_GLOBAL(variable)
#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).
std::enable_if< 1==T::rank, T >::type createView(std::string str, int dim_0, int dim_1)
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.
team_policy::member_type member_type
KOKKOS_INLINE_FUNCTION int calculateBasisMultiplier(const ReconstructionSpace rs, const int local_dimensions)
Calculate basis_multiplier.
KOKKOS_INLINE_FUNCTION int calculateSamplingMultiplier(const ReconstructionSpace rs, const SamplingFunctional sro, const int local_dimensions)
Calculate sampling_multiplier.
Kokkos::TeamPolicy< device_execution_space > team_policy
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,...
@ 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.
TargetOperation
Available target functionals.
Kokkos::View< double **, layout_right, device_execution_space, Kokkos::MemoryTraits< Kokkos::Unmanaged > > device_unmanaged_matrix_right_type
device_execution_space::memory_space device_memory_space
typename std::enable_if< B, T >::type enable_if_t
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()