43 #ifndef RTOPPACK_RTOP_SUB_RANGE_DECORATOR_DEF_HPP
44 #define RTOPPACK_RTOP_SUB_RANGE_DECORATOR_DEF_HPP
56 template<
class Scalar>
58 : first_ele_offset_(0), sub_dim_(-1)
62 template<
class Scalar>
68 : first_ele_offset_(0), sub_dim_(-1)
74 template<
class Scalar>
80 : first_ele_offset_(0), sub_dim_(-1)
86 template<
class Scalar>
95 first_ele_offset_ = first_ele_offset;
100 template<
class Scalar>
104 const Ordinal first_ele_offset,
109 first_ele_offset_ = first_ele_offset;
114 template<
class Scalar>
118 return op_.getNonconstObj();
122 template<
class Scalar>
126 return op_.getConstObj();
133 template<
class Scalar>
140 op_->get_reduct_type_num_entries(num_values, num_indexes, num_chars);
144 template<
class Scalar>
148 return op_->reduct_obj_create();
152 template<
class Scalar>
157 op_->reduce_reduct_objs(in_reduct_obj, inout_reduct_obj);
161 template<
class Scalar>
165 op_->reduct_obj_reinit(reduct_obj);
169 template<
class Scalar>
177 op_->extract_reduct_obj_state(reduct_obj, value_data, index_data, char_data);
181 template<
class Scalar>
189 op_->load_reduct_obj_state(value_data, index_data, char_data, reduct_obj);
193 template<
class Scalar>
196 return (std::string(
"RTOpSubRangeDecorator{")+op_->op_name()+
"}");
200 template<
class Scalar>
203 return op_->coord_invariant();
207 template<
class Scalar>
216 if (first_ele_offset_ == 0 && sub_dim_ < 0) {
218 op_->apply_op(sub_vecs, targ_sub_vecs, reduct_obj);
223 (sub_vecs.size() ? sub_vecs[0].globalOffset(): targ_sub_vecs[0].globalOffset());
225 (sub_vecs.size() ? sub_vecs[0].subDim(): targ_sub_vecs[0].subDim());
228 if (globalOffset >= first_ele_offset_ + sub_dim_) {
232 if (globalOffset + subDim <= first_ele_offset_) {
238 (first_ele_offset_ > globalOffset
239 ? first_ele_offset_ - globalOffset
243 std::min(globalOffset + subDim, first_ele_offset_ + sub_dim_)
244 - (globalOffset + localOffset);
247 for (
int k = 0; k < sub_vecs.size(); ++k) {
248 const Ordinal stride = sub_vecs[k].stride();
249 sub_sub_vecs[k].initialize(
250 globalOffset+ localOffset,
252 sub_vecs[k].values().persistingView(localOffset*stride, localSubDim*stride),
258 for (
int k = 0; k < targ_sub_vecs.size(); ++k) {
259 const Ordinal stride = targ_sub_vecs[k].stride();
260 targ_sub_sub_vecs[k].initialize(
261 globalOffset+ localOffset,
263 targ_sub_vecs[k].values().persistingView(localOffset*stride, localSubDim*stride),
268 op_->apply_op(sub_sub_vecs(), targ_sub_sub_vecs(), reduct_obj);
276 #endif // RTOPPACK_RTOP_SUB_RANGE_DECORATOR_DEF_HPP
void reduct_obj_reinit_impl(const Ptr< ReductTarget > &reduct_obj) const
void get_reduct_type_num_entries_impl(const Ptr< int > &num_values, const Ptr< int > &num_indexes, const Ptr< int > &num_chars) const
void load_reduct_obj_state_impl(const ArrayView< const primitive_value_type > &value_data, const ArrayView< const index_type > &index_data, const ArrayView< const char_type > &char_data, const Ptr< ReductTarget > &reduct_obj) const
Class for a changeable sub-vector.
void nonconstInitialize(const RCP< RTOpT< Scalar > > &op, const Ordinal first_ele_offset=0, const Ordinal sub_dim=-1)
void reduce_reduct_objs_impl(const ReductTarget &in_reduct_obj, const Ptr< ReductTarget > &inout_reduct_obj) const
bool coord_invariant_impl() const
Class for a non-changeable sub-vector.
Templated interface to vector reduction/transformation operators {abstract}.
void apply_op_impl(const ArrayView< const ConstSubVectorView< Scalar > > &sub_vecs, const ArrayView< const SubVectorView< Scalar > > &targ_sub_vecs, const Ptr< ReductTarget > &reduct_obj) const
Abstract base class for all reduction objects.
Teuchos::RCP< ReductTarget > reduct_obj_create_impl() const
void initialize(const RCP< const RTOpT< Scalar > > &op, const Ordinal first_ele_offset=0, const Ordinal sub_dim=-1)
void extract_reduct_obj_state_impl(const ReductTarget &reduct_obj, const ArrayView< primitive_value_type > &value_data, const ArrayView< index_type > &index_data, const ArrayView< char_type > &char_data) const
RCP< const RTOpT< Scalar > > getOp() const
std::string op_name_impl() const
RCP< RTOpT< Scalar > > getNonconstOp()