1 #ifndef _COMPADRE_EVALUATOR_HPP_
2 #define _COMPADRE_EVALUATOR_HPP_
11 template<
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));
58 template<
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 {
153 output_component_axis_2, input_component_axis_1, input_component_axis_2, evaluation_site_local_index);
161 auto sampling_data_device = sampling_subview_maker.get1DView(column_of_input);
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 {
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;
215 "application of alphas called before generateAlphas() was called.");
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>
316 const int num_targets = nla.getNumberOfTargets();
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>
372 typedef Kokkos::View<output_data_type, output_array_layout, output_memory_space> output_view_type;
374 output_view_type target_output = createView<output_view_type>(
"output of target operation",
375 nla.getNumberOfTargets(), output_dimensions);
377 output_view_type ambient_target_output;
379 if (transform_gmls_output_to_ambient) {
380 ambient_target_output = createView<output_view_type>(
"output of transform to ambient space",
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>
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.");
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 {
563 auto coefficient_memory_layout_dims_device =
564 Kokkos::create_mirror_view_and_copy(
device_memory_space(), coefficient_memory_layout_dims);
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>
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(),
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 {
733 &&
"First dimension of coefficient_output is incorrect size.\n");
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.");
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) {
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);
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);
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());
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)
compadre_assert_debug is used for assertions that are checked in loops, as these significantly impact...
#define TO_GLOBAL(variable)
Kokkos::View< double **, layout_right, Kokkos::MemoryTraits< Kokkos::Unmanaged > > scratch_matrix_right_type
#define compadre_assert_release(condition)
compadre_assert_release is used for assertions that should always be checked, but generally are not e...
Lightweight Evaluator Helper This class is a lightweight wrapper for extracting and applying all rele...
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
Dot product of data with full polynomial coefficient basis where sampling data is in a 1D/2D Kokkos V...
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
Transformation of data under GMLS (allocates memory for output)
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
Postprocessing for manifolds.
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
Dot product of alphas with sampling data, FOR A SINGLE target_index, where sampling data is in a 1D/2...
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
Dot product of alphas with sampling data where sampling data is in a 1D/2D Kokkos View and output vie...
void applyFullPolynomialCoefficientsBasisToDataAllComponents(view_type_coefficient_output coefficient_output, view_type_input_data sampling_data, bool scalar_as_vector_if_needed=true) const
Generation of polynomial reconstruction coefficients by applying to data in GMLS (does not allocate m...
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
Generation of polynomial reconstruction coefficients by applying to data in GMLS (allocates memory fo...
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
Transformation of data under GMLS (does not allocate memory for output)
Generalized Moving Least Squares (GMLS)
neighbor_lists_type * getNeighborLists() const
Get neighbor list accessor.
host_managed_local_index_type getPolynomialCoefficientsMemorySize() const
Returns 2D array size in memory on which coefficients are stored.
decltype(_RHS) getFullPolynomialCoefficientsBasis() const
Get a view (device) of all polynomial coefficients basis.
int getLocalDimensions() const
Local dimension of the GMLS problem (less than global dimension if on a manifold),...
ReconstructionSpace getReconstructionSpace() const
Get the reconstruction space specified at instantiation.
int getPolynomialCoefficientsSize() const
Returns size of the basis used in instance's polynomial reconstruction.
int getGlobalDimensions() const
Dimension of the GMLS problem's point data (spatial description of points in ambient space),...
decltype(_d_ss) * getSolutionSetDevice(bool alpha_validity_check=true)
Get solution set on device.
SamplingFunctional _data_sampling_functional
generally the same as _polynomial_sampling_functional, but can differ if specified at
SolutionSet< host_memory_space > _h_ss
Solution Set (contains all alpha values from solution and alpha layout methods)
SamplingFunctional getDataSamplingFunctional() const
Get the data sampling functional specified at instantiation (often the same as the polynomial samplin...
decltype(_T) * getTangentDirections()
Get a view (device) of all tangent direction bundles.
SamplingFunctional getPolynomialSamplingFunctional() const
Get the polynomial sampling functional specified at instantiation.
ProblemType getProblemType() const
Get problem type.
host_managed_local_index_type getPolynomialCoefficientsDomainRangeSize() const
Returns (size of the basis used in instance's polynomial reconstruction) x (data input dimension)
decltype(_prestencil_weights) getPrestencilWeights() const
Get a view (device) of all rank 2 preprocessing tensors This is a rank 5 tensor that is able to provi...
@ MANIFOLD
Solve GMLS problem on a manifold (will use QR or SVD to solve the resultant GMLS problem dependent on...
KOKKOS_INLINE_FUNCTION int getTargetOutputTensorRank(const int &index)
Rank of target functional output for each TargetOperation Rank of target functional input for each Ta...
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 >
Copies data_in to the device, and then allows for access to 1D columns of data on device.
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
Point evaluations of the entire vector source function (but on a manifold, so it includes a transform...
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
Whether or not the SamplingTensor acts on the target site as well as the neighbors.
int input_rank
Rank of sampling functional input for each SamplingFunctional.
KOKKOS_INLINE_FUNCTION global_index_type getAlphaIndex(const int target_index, const int alpha_column_offset) const
Gives index into alphas given two axes, which when incremented by the neighbor number transforms acce...
KOKKOS_INLINE_FUNCTION int getAlphaColumnOffset(TargetOperation lro, 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 evaluation_site_local_index=0) const
Retrieves the offset for an operator based on input and output component, generic to row (but still m...
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()