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) {
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);
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);
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;
212 auto gmls = *(
_gmls);
217 const int num_targets = nla.getNumberOfTargets();
220 compadre_assert_debug((std::is_same<typename view_type_data_out::memory_space, typename view_type_data_in::memory_space>::value) &&
221 "output_data_single_column view and input_data_single_column view have difference memory spaces.");
223 bool weight_with_pre_T = (pre_transform_local_index>=0 && pre_transform_global_index>=0) ?
true :
false;
227 Kokkos::parallel_for(
team_policy(num_targets, Kokkos::AUTO),
230 const int target_index = teamMember.league_rank();
231 teamMember.team_barrier();
234 const double previous_value = output_data_single_column(target_index);
237 auto alpha_index = gmls.getAlphaIndexDevice(target_index, alpha_input_output_component_index);
238 double gmls_value = 0;
239 Kokkos::parallel_reduce(Kokkos::TeamThreadRange(teamMember, nla.getNumberOfNeighborsDevice(target_index)), [=](
const int i,
double& t_value) {
240 const double neighbor_varying_pre_T = (weight_with_pre_T && vary_on_neighbor) ?
241 prestencil_weights(0, target_index, i, pre_transform_local_index, pre_transform_global_index)
244 t_value += neighbor_varying_pre_T * sampling_data_single_column(nla.getNeighborDevice(target_index, i))
245 *alphas(alpha_index + i);
251 if (weight_with_pre_T) {
252 if (!vary_on_neighbor && vary_on_target) {
253 pre_T = prestencil_weights(0, target_index, 0, pre_transform_local_index,
254 pre_transform_global_index);
255 }
else if (!vary_on_target) {
256 pre_T = prestencil_weights(0, 0, 0, pre_transform_local_index,
257 pre_transform_global_index);
261 double staggered_value_from_targets = 0;
262 double pre_T_staggered = 1.0;
263 auto alpha_index2 = gmls.getAlphaIndexDevice(target_index, alpha_input_output_component_index2);
265 if (target_plus_neighbor_staggered_schema) {
266 Kokkos::parallel_reduce(Kokkos::TeamThreadRange(teamMember, nla.getNumberOfNeighborsDevice(target_index)), [=](
const int i,
double& t_value) {
267 const double neighbor_varying_pre_T_staggered = (weight_with_pre_T && vary_on_neighbor) ?
268 prestencil_weights(1, target_index, i, pre_transform_local_index, pre_transform_global_index)
271 t_value += neighbor_varying_pre_T_staggered * sampling_data_single_column(nla.getNeighborDevice(target_index, 0))
272 *alphas(alpha_index2 + i);
274 }, staggered_value_from_targets );
277 if (weight_with_pre_T) {
278 if (!vary_on_neighbor && vary_on_target) {
279 pre_T_staggered = prestencil_weights(1, target_index, 0, pre_transform_local_index,
280 pre_transform_global_index);
281 }
else if (!vary_on_target) {
282 pre_T_staggered = prestencil_weights(1, 0, 0, pre_transform_local_index,
283 pre_transform_global_index);
288 double added_value = pre_T*gmls_value + pre_T_staggered*staggered_value_from_targets;
289 Kokkos::single(Kokkos::PerTeam(teamMember), [=] () {
290 output_data_single_column(target_index) = previous_value + added_value;
307 template <
typename view_type_data_out,
typename view_type_data_in>
315 const int num_targets = nla.getNumberOfTargets();
320 compadre_assert_debug((std::is_same<typename view_type_data_out::memory_space, typename view_type_data_in::memory_space>::value) &&
321 "output_data_single_column view and input_data_single_column view have difference memory spaces.");
324 Kokkos::parallel_for(
team_policy(num_targets, Kokkos::AUTO),
327 const int target_index = teamMember.league_rank();
331 global_dimensions, global_dimensions);
332 teamMember.team_barrier();
335 const double previous_value = output_data_single_column(target_index);
337 double added_value = T(local_dim_index, global_dim_index)*sampling_data_single_column(target_index);
338 Kokkos::single(Kokkos::PerTeam(teamMember), [=] () {
339 output_data_single_column(target_index) = previous_value + added_value;
359 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>
360 Kokkos::View<output_data_type, output_array_layout, output_memory_space>
368 typedef Kokkos::View<output_data_type, output_array_layout, output_memory_space> output_view_type;
386 output_view_type target_output = createView<output_view_type>(
"output of target operation",
387 nla.getNumberOfTargets(), output_dimensions);
390 compadre_assert_debug(((output_dimensions==1 && output_view_type::rank==1) || output_view_type::rank!=1) &&
391 "Output view is requested as rank 1, but the target requires a rank larger than 1. Try double** as template argument.");
402 bool vary_on_target =
false, vary_on_neighbor =
false;
403 auto sro_style = sro.transform_type;
404 bool loop_global_dimensions = sro.input_rank>0 && sro_style!=
Identity;
407 &&
"SamplingFunctional requested for Evaluator does not match GMLS data sampling functional or is not of type 'Identity'.");
410 vary_on_target =
false;
411 vary_on_neighbor =
false;
413 vary_on_target =
true;
414 vary_on_neighbor =
false;
416 vary_on_target =
true;
417 vary_on_neighbor =
true;
423 for (
int axes1=0; axes1<output_dimension1_of_operator; ++axes1) {
424 const int output_component_axis_1 = axes1;
425 for (
int axes2=0; axes2<output_dimension2_of_operator; ++axes2) {
426 const int output_component_axis_2 = axes2;
428 for (
int j=0; j<input_dimension_of_operator; ++j) {
429 const int input_component_axis_1 = j;
430 const int input_component_axis_2 = 0;
432 if (loop_global_dimensions) {
433 for (
int k=0; k<global_dimensions; ++k) {
435 output_subview_maker.get1DView(axes1*output_dimension2_of_operator+axes2),
436 sampling_subview_maker.get1DView(k), lro, sro,
437 evaluation_site_local_index, output_component_axis_1, output_component_axis_2, input_component_axis_1,
438 input_component_axis_2, j, k, -1, -1,
439 vary_on_target, vary_on_neighbor);
443 output_subview_maker.get1DView(axes1*output_dimension2_of_operator+axes2),
444 sampling_subview_maker.get1DView(j), lro, sro,
445 evaluation_site_local_index, output_component_axis_1, output_component_axis_2, input_component_axis_1,
446 input_component_axis_2, 0, 0, -1, -1,
447 vary_on_target, vary_on_neighbor);
450 output_subview_maker.get1DView(axes1*output_dimension2_of_operator+axes2),
451 sampling_subview_maker.get1DView(j), lro, sro,
452 evaluation_site_local_index, output_component_axis_1, output_component_axis_2, input_component_axis_1,
453 input_component_axis_2);
460 if (transform_gmls_output_to_ambient) {
464 output_view_type ambient_target_output = createView<output_view_type>(
465 "output of transform to ambient space", nla.getNumberOfTargets(),
469 for (
int i=0; i<global_dimensions; ++i) {
470 for (
int j=0; j<output_dimensions; ++j) {
472 transformed_output_subview_maker.get1DView(i), output_subview_maker.get1DView(j), j, i);
476 Kokkos::deep_copy(ambient_target_output, transformed_output_subview_maker.copyToAndReturnOriginalView());
477 return ambient_target_output;
481 Kokkos::deep_copy(target_output, output_subview_maker.copyToAndReturnOriginalView());
482 return target_output;
509 template <
typename view_type_data_out,
typename view_type_data_in>
510 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 {
516 auto coefficient_memory_layout_dims_device =
517 Kokkos::create_mirror_view_and_copy(
device_memory_space(), coefficient_memory_layout_dims);
526 const int num_targets = nla.getNumberOfTargets();
529 compadre_assert_debug((std::is_same<typename view_type_data_out::memory_space, typename view_type_data_in::memory_space>::value) &&
530 "output_data_block_column view and input_data_single_column view have difference memory spaces.");
532 bool weight_with_pre_T = (pre_transform_local_index>=0 && pre_transform_global_index>=0) ?
true :
false;
536 for (
int j=0; j<coefficient_matrix_dims(0); ++j) {
537 Kokkos::parallel_for(
team_policy(num_targets, Kokkos::AUTO),
540 const int target_index = teamMember.league_rank();
544 global_dimensions, global_dimensions);
549 *
TO_GLOBAL(coefficient_memory_layout_dims_device(1)),
550 coefficient_memory_layout_dims_device(0), coefficient_memory_layout_dims_device(1));
552 teamMember.team_barrier();
555 const double previous_value = output_data_block_column(target_index, j);
558 double gmls_value = 0;
559 Kokkos::parallel_reduce(Kokkos::TeamThreadRange(teamMember, nla.getNumberOfNeighborsDevice(target_index)), [=](
const int i,
double& t_value) {
560 const double neighbor_varying_pre_T = (weight_with_pre_T && vary_on_neighbor) ?
561 prestencil_weights(0, target_index, i, pre_transform_local_index, pre_transform_global_index)
564 t_value += neighbor_varying_pre_T * sampling_data_single_column(nla.getNeighborDevice(target_index, i))
565 *Coeffs(j, i+input_component_axis_1*nla.getNumberOfNeighborsDevice(target_index));
571 if (weight_with_pre_T) {
572 if (!vary_on_neighbor && vary_on_target) {
573 pre_T = prestencil_weights(0, target_index, 0, pre_transform_local_index,
574 pre_transform_global_index);
575 }
else if (!vary_on_target) {
576 pre_T = prestencil_weights(0, 0, 0, pre_transform_local_index,
577 pre_transform_global_index);
581 double staggered_value_from_targets = 0;
582 double pre_T_staggered = 1.0;
584 if (target_plus_neighbor_staggered_schema) {
585 Kokkos::parallel_reduce(Kokkos::TeamThreadRange(teamMember, nla.getNumberOfNeighborsDevice(target_index)), [=](
const int i,
double& t_value) {
586 const double neighbor_varying_pre_T_staggered = (weight_with_pre_T && vary_on_neighbor) ?
587 prestencil_weights(1, target_index, i, pre_transform_local_index, pre_transform_global_index)
590 t_value += neighbor_varying_pre_T_staggered * sampling_data_single_column(nla.getNeighborDevice(target_index, 0))
591 *Coeffs(j, i+input_component_axis_1*nla.getNumberOfNeighborsDevice(target_index));
593 }, staggered_value_from_targets );
596 if (weight_with_pre_T) {
597 if (!vary_on_neighbor && vary_on_target) {
598 pre_T_staggered = prestencil_weights(1, target_index, 0, pre_transform_local_index,
599 pre_transform_global_index);
600 }
else if (!vary_on_target) {
601 pre_T_staggered = prestencil_weights(1, 0, 0, pre_transform_local_index,
602 pre_transform_global_index);
607 double added_value = (pre_T*gmls_value + pre_T_staggered*staggered_value_from_targets);
608 Kokkos::single(Kokkos::PerTeam(teamMember), [=] () {
609 output_data_block_column(target_index, j) = previous_value + added_value;
628 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>
629 Kokkos::View<output_data_type, output_array_layout, output_memory_space>
636 typedef Kokkos::View<output_data_type, output_array_layout, output_memory_space> output_view_type;
647 int output_dimensions = output_dimension_of_reconstruction_space;
652 output_view_type coefficient_output(
"output coefficients", nla.getNumberOfTargets(),
656 compadre_assert_debug(((output_dimension_of_reconstruction_space==1 && output_view_type::rank==1) || output_view_type::rank!=1) &&
657 "Output view is requested as rank 1, but the target requires a rank larger than 1. Try double** as template argument.");
668 bool vary_on_target =
false, vary_on_neighbor =
false;
674 vary_on_target =
false;
675 vary_on_neighbor =
false;
677 vary_on_target =
true;
678 vary_on_neighbor =
false;
680 vary_on_target =
true;
681 vary_on_neighbor =
true;
686 for (
int i=0; i<output_dimension_of_reconstruction_space; ++i) {
687 const int output_component_axis_1 = i;
688 const int output_component_axis_2 = 0;
690 for (
int j=0; j<input_dimension_of_reconstruction_space; ++j) {
691 const int input_component_axis_1 = j;
692 const int input_component_axis_2 = 0;
694 if (loop_global_dimensions) {
695 for (
int k=0; k<global_dimensions; ++k) {
698 sampling_subview_maker.get1DView(k), sro,
699 output_component_axis_1, output_component_axis_2, input_component_axis_1,
700 input_component_axis_2, j, k, -1, -1,
701 vary_on_target, vary_on_neighbor);
706 sampling_subview_maker.get1DView(j), sro,
707 output_component_axis_1, output_component_axis_2, input_component_axis_1,
708 input_component_axis_2, 0, 0, -1, -1,
709 vary_on_target, vary_on_neighbor);
713 sampling_subview_maker.get1DView(j), sro,
714 output_component_axis_1, output_component_axis_2, input_component_axis_1,
715 input_component_axis_2);
721 Kokkos::deep_copy(coefficient_output, output_subview_maker.copyToAndReturnOriginalView());
722 return coefficient_output;
SamplingFunctional getDataSamplingFunctional() const
Get the data sampling functional specified at instantiation (often the same as the polynomial samplin...
int calculateBasisMultiplier(const ReconstructionSpace rs) const
Calculate basis_multiplier.
T2 copyToAndReturnOriginalView()
ReconstructionSpace getReconstructionSpace() const
Get the reconstruction space specified at instantiation.
ProblemType getProblemType()
Get problem type.
Lightweight Evaluator Helper This class is a lightweight wrapper for extracting and applying all rele...
constexpr SamplingFunctional ManifoldVectorPointSample
Point evaluations of the entire vector source function (but on a manifold, so it includes a transform...
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...
team_policy::member_type member_type
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...
Each target applies a different data transform, but the same to each neighbor.
Each target applies a different transform for each neighbor.
int getInputDimensionOfOperation(TargetOperation lro) const
Dimensions ^ input rank for target operation (always in local chart if on a manifold, never ambient space)
bool _scalar_as_vector_if_needed
bool use_target_site_weights
Whether or not the SamplingTensor acts on the target site as well as the neighbors.
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. ...
global_index_type getAlphaIndexHost(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...
Solve GMLS problem on a manifold (will use QR or SVD to solve the resultant GMLS problem dependent on...
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 additional_evaluation_local_index=0) const
Retrieves the offset for an operator based on input and output component, generic to row (but still m...
decltype(_T) getTangentDirections() const
Get a view (device) of all tangent direction bundles.
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...
constexpr int TargetOutputTensorRank[]
Rank of target functional output for each TargetOperation Rank of target functional input for each Ta...
Kokkos::TeamPolicy< device_execution_space > team_policy
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.
#define TO_GLOBAL(variable)
device_execution_space::memory_space device_memory_space
int input_rank
Rank of sampling functional input for each SamplingFunctional.
int getPolynomialCoefficientsSize() const
Returns size of the basis used in instance's polynomial reconstruction.
typename std::enable_if< B, T >::type enable_if_t
auto get1DView(const int column_num) -> decltype(Kokkos::subview(_data_in, Kokkos::ALL, column_num))
Kokkos::View< double **, layout_right, Kokkos::MemoryTraits< Kokkos::Unmanaged > > scratch_matrix_right_type
Each neighbor for each target all apply the same transform.
SubviewND(T data_in, T2 data_original_view, bool scalar_as_vector_if_needed)
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...
decltype(_alphas) getAlphas() const
Get a view (device) of all alphas.
decltype(_RHS) getFullPolynomialCoefficientsBasis() const
Get a view (device) of all polynomial coefficients basis.
int getGlobalDimensions() const
Dimension of the GMLS problem's point data (spatial description of points in ambient space)...
Generalized Moving Least Squares (GMLS)
No action performed on data before GMLS target operation.
int transform_type
Describes the SamplingFunction relationship to targets, neighbors.
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.
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)))
constexpr SamplingFunctional PointSample
Available sampling functionals.
int calculateSamplingMultiplier(const ReconstructionSpace rs, const SamplingFunctional sro) const
Calculate sampling_multiplier.
host_managed_local_index_type getPolynomialCoefficientsDomainRangeSize() const
Returns (size of the basis used in instance's polynomial reconstruction) x (data input dimension) ...
decltype(_neighbor_lists)* getNeighborLists()
Get neighbor list accessor.
struct SubviewND< T, T2, enable_if_t<(T::rank< 2)> >{T _data_in;T2 _data_original_view;bool _scalar_as_vector_if_needed;SubviewND(T data_in, T2 data_original_view, bool scalar_as_vector_if_needed){_data_in=data_in;_data_original_view=data_original_view;_scalar_as_vector_if_needed=scalar_as_vector_if_needed;}auto get1DView(const int column_num) -> decltype(Kokkos::subview(_data_in, Kokkos::ALL))
Creates 1D subviews of data from a 1D view, generally constructed with CreateNDSliceOnDeviceView.
#define compadre_assert_debug(condition)
compadre_assert_debug is used for assertions that are checked in loops, as these significantly impact...
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...
SamplingFunctional getPolynomialSamplingFunctional() const
Get the polynomial sampling functional specified at instantiation.
int getOutputDimensionOfOperation(TargetOperation lro, bool ambient=false) const
Dimensions ^ output rank for target operation.
#define compadre_assert_release(condition)
compadre_assert_release is used for assertions that should always be checked, but generally are not e...
Creates 1D subviews of data from a 2D view, generally constructed with CreateNDSliceOnDeviceView.
host_managed_local_index_type getPolynomialCoefficientsMemorySize() const
Returns 2D array size in memory on which coefficients are stored.
constexpr SamplingFunctional VectorPointSample
Point evaluations of the entire vector source function.
TargetOperation
Available target functionals.