43#ifndef RTOPPACK_RTOP_SUB_RANGE_DECORATOR_DEF_HPP
44#define RTOPPACK_RTOP_SUB_RANGE_DECORATOR_DEF_HPP
58 : first_ele_offset_(0), sub_dim_(-1)
68 : first_ele_offset_(0), sub_dim_(-1)
80 : first_ele_offset_(0), sub_dim_(-1)
95 first_ele_offset_ = first_ele_offset;
100template<
class Scalar>
104 const Ordinal first_ele_offset,
109 first_ele_offset_ = first_ele_offset;
114template<
class Scalar>
118 return op_.getNonconstObj();
122template<
class Scalar>
123RCP<const RTOpT<Scalar> >
126 return op_.getConstObj();
133template<
class Scalar>
135 const Ptr<int> &num_values,
136 const Ptr<int> &num_indexes,
137 const Ptr<int> &num_chars
140 op_->get_reduct_type_num_entries(num_values, num_indexes, num_chars);
144template<
class Scalar>
145Teuchos::RCP<ReductTarget>
148 return op_->reduct_obj_create();
152template<
class Scalar>
154 const ReductTarget &in_reduct_obj,
const Ptr<ReductTarget> &inout_reduct_obj
157 op_->reduce_reduct_objs(in_reduct_obj, inout_reduct_obj);
161template<
class Scalar>
163 const Ptr<ReductTarget> &reduct_obj )
const
165 op_->reduct_obj_reinit(reduct_obj);
169template<
class Scalar>
172 const ArrayView<primitive_value_type> &value_data,
173 const ArrayView<index_type> &index_data,
174 const ArrayView<char_type> &char_data
177 op_->extract_reduct_obj_state(reduct_obj, value_data, index_data, char_data);
181template<
class Scalar>
183 const ArrayView<const primitive_value_type> &value_data,
184 const ArrayView<const index_type> &index_data,
185 const ArrayView<const char_type> &char_data,
186 const Ptr<ReductTarget> &reduct_obj
189 op_->load_reduct_obj_state(value_data, index_data, char_data, reduct_obj);
193template<
class Scalar>
196 return (std::string(
"RTOpSubRangeDecorator{")+op_->op_name()+
"}");
200template<
class Scalar>
203 return op_->coord_invariant();
207template<
class Scalar>
211 const Ptr<ReductTarget> &reduct_obj
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);
246 Array<ConstSubVectorView<Scalar> > sub_sub_vecs(sub_vecs.size());
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),
257 Array<SubVectorView<Scalar> > targ_sub_sub_vecs(targ_sub_vecs.size());
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);
Class for a non-changeable sub-vector.
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
void reduce_reduct_objs_impl(const ReductTarget &in_reduct_obj, const Ptr< ReductTarget > &inout_reduct_obj) const
void initialize(const RCP< const RTOpT< Scalar > > &op, const Ordinal first_ele_offset=0, const Ordinal sub_dim=-1)
RCP< RTOpT< Scalar > > getNonconstOp()
RCP< const RTOpT< Scalar > > getOp() const
std::string op_name_impl() const
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
bool coord_invariant_impl() const
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 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
void nonconstInitialize(const RCP< RTOpT< Scalar > > &op, const Ordinal first_ele_offset=0, const Ordinal sub_dim=-1)
Teuchos::RCP< ReductTarget > reduct_obj_create_impl() const
Templated interface to vector reduction/transformation operators {abstract}.
Abstract base class for all reduction objects.
Class for a changeable sub-vector.