113 const ReductTarget &in_reduct_obj,
const Ptr<ReductTarget> &inout_reduct_obj
117 using Teuchos::dyn_cast;
118 typedef DefaultReductTarget<SubVectorView<Scalar> > DRTSVV;
120 DRTSVV &drtsvv_inout_reduct_obj = dyn_cast<DRTSVV>(*inout_reduct_obj);
122 const ConstSubVectorView<Scalar> sub_vec_in =
123 dyn_cast<const DRTSVV>(in_reduct_obj).get();
124 SubVectorView<Scalar> sub_vec_inout = drtsvv_inout_reduct_obj.get();
127 TEUCHOS_TEST_FOR_EXCEPT(
128 sub_vec_in.subDim()!=sub_vec_inout.subDim()
129 || sub_vec_in.globalOffset()!=sub_vec_inout.globalOffset()
130 || is_null(sub_vec_in.values())
131 || is_null(sub_vec_inout.values())
132 || sub_vec_in.stride()!=1
133 || sub_vec_inout.stride()!=1
137 typedef typename ArrayRCP<const Scalar>::const_iterator const_iter_t;
138 typedef typename ArrayRCP<Scalar>::iterator iter_t;
140 const_iter_t in_iter = sub_vec_in.values().begin();
141 iter_t inout_iter = sub_vec_inout.values().begin();
143 for(
int k = 0; k < sub_vec_in.subDim(); ++k ) {
144 *inout_iter++ += *in_iter++;
147 drtsvv_inout_reduct_obj.set(sub_vec_inout);
154 const Ptr<ReductTarget> &reduct_obj )
const
156 using Teuchos::dyn_cast;
157 typedef DefaultReductTarget<SubVectorView<Scalar> > DRTSVV;
158 DRTSVV &drtsvv_inout_reduct_obj = dyn_cast<DRTSVV>(*reduct_obj);
159 SubVectorView<Scalar> sub_vec = drtsvv_inout_reduct_obj.get();
160 std::fill( sub_vec.values().begin(), sub_vec.values().end(),
161 ScalarTraits<Scalar>::zero() );
168 const ArrayView<primitive_value_type> &value_data,
169 const ArrayView<index_type> &,
170 const ArrayView<char_type> &
174 using Teuchos::dyn_cast;
175 typedef PrimitiveTypeTraits<Scalar,Scalar> PTT;
176 const int num_prim_objs_per_scalar = PTT::numPrimitiveObjs();
177 const ConstSubVectorView<Scalar> sub_vec =
178 dyn_cast<const DefaultReductTarget<SubVectorView<Scalar> > >(reduct_obj).get();
179 int value_data_off = 0;
182 k < sub_vec.subDim();
183 ++k, value_data_off += num_prim_objs_per_scalar
186 PTT::extractPrimitiveObjs( sub_vec[k],
187 value_data(value_data_off, num_prim_objs_per_scalar),
195 const ArrayView<const primitive_value_type> &value_data,
196 const ArrayView<const index_type> &,
197 const ArrayView<const char_type> &,
198 const Ptr<ReductTarget> &reduct_obj
202 using Teuchos::outArg;
203 using Teuchos::dyn_cast;
204 using Teuchos::arcp_const_cast;
205 typedef PrimitiveTypeTraits<Scalar,Scalar> PTT;
206 typedef DefaultReductTarget<SubVectorView<Scalar> > DRTSVV;
207 const int num_prim_objs_per_scalar = PTT::numPrimitiveObjs();
208 DRTSVV &drtsvv_reduct_obj = dyn_cast<DRTSVV>(*reduct_obj);
209 const ConstSubVectorView<Scalar> const_sub_vec = drtsvv_reduct_obj.get();
210 const ArrayRCP<Scalar> sv_values =
211 arcp_const_cast<Scalar>(const_sub_vec.values());
212 int value_data_off = 0;
215 k < const_sub_vec.subDim();
216 ++k, value_data_off += num_prim_objs_per_scalar
219 PTT::loadPrimitiveObjs(
220 value_data(value_data_off, num_prim_objs_per_scalar), null, null,
221 outArg(sv_values[k]) );
235 const ArrayView<
const ConstSubVectorView<Scalar> > &sub_vecs,
236 const ArrayView<
const SubVectorView<Scalar> > &targ_sub_vecs,
237 const Ptr<ReductTarget> &reduct_obj
241 using Teuchos::dyn_cast;
242 typedef DefaultReductTarget<SubVectorView<Scalar> > DRTSVV;
245 sub_vecs, targ_sub_vecs, reduct_obj.getConst() );
247 typedef typename Teuchos::ArrayRCP<const Scalar>::iterator const_iter_t;
248 const index_type subDim = sub_vecs[0].subDim();
249 const index_type globalOffset = sub_vecs[0].globalOffset();
250 TEUCHOS_TEST_FOR_EXCEPT(globalOffset<0);
251 const_iter_t v0_val = sub_vecs[0].values().begin();
252 const ptrdiff_t v0_s = sub_vecs[0].stride();
254 if( u_ < globalOffset || globalOffset + subDim - 1 < l_ ) {
261 i_l = ( l_ <= globalOffset ? 0 : l_ - globalOffset ),
262 i_u = ( u_ >= globalOffset+subDim-1 ? subDim-1 : u_ - globalOffset );
264 DRTSVV &drtsvv_reduct_obj = dyn_cast<DRTSVV>(*reduct_obj);
265 SubVectorView<Scalar> sub_vec_targ = drtsvv_reduct_obj.get();
267 const ArrayRCP<Scalar> svt_values = sub_vec_targ.values();
270 svt_values[i+(globalOffset-l_)] = v0_val[i*v0_s];
273 drtsvv_reduct_obj.set(sub_vec_targ);
void validate_apply_op(const RTOpT< Scalar > &op, const int allowed_num_sub_vecs, const int allowed_num_targ_sub_vecs, const bool expect_reduct_obj, const ArrayView< const ConstSubVectorView< Scalar > > &sub_vecs, const ArrayView< const SubVectorView< Scalar > > &targ_sub_vecs, const Ptr< const ReductTarget > &reduct_obj)
Validate the input to an apply_op(...) function.