45 #ifndef AMESOS2_MULTIVECADAPTER_DEF_HPP 46 #define AMESOS2_MULTIVECADAPTER_DEF_HPP 65 template <
typename MV>
66 void same_type_get_copy<MV>::apply(
const Teuchos::Ptr<const MV>& mv,
67 const Teuchos::ArrayView<typename MV::scalar_t>& v,
69 Teuchos::Ptr<
const Tpetra::Map<typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t> > distribution_map )
71 mv->get1dCopy (v, ldx, distribution_map);
80 template <
typename MV,
typename S>
81 void diff_type_get_copy<MV,S>::
82 apply (
const Teuchos::Ptr<const MV>& mv,
83 const Teuchos::ArrayView<S>& v,
85 Teuchos::Ptr<
const Tpetra::Map<typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t> > distribution_map)
87 typedef typename MV::scalar_t mv_scalar_t;
88 typedef typename Teuchos::Array<mv_scalar_t>::size_type size_type;
90 TEUCHOS_TEST_FOR_EXCEPTION(
91 mv.getRawPtr () == NULL, std::invalid_argument,
92 "Amesos2::diff_type_get_copy::apply: mv is null.");
93 TEUCHOS_TEST_FOR_EXCEPTION(
94 distribution_map.getRawPtr () == NULL, std::invalid_argument,
95 "Amesos2::diff_type_get_copy::apply: distribution_map is null.");
97 const size_type vals_length = v.size ();
98 Teuchos::Array<mv_scalar_t> vals_tmp (vals_length);
100 mv->get1dCopy (vals_tmp (), ldx, distribution_map);
101 for (size_type i = 0; i < vals_length; ++i) {
102 v[i] = Teuchos::as<S> (vals_tmp[i]);
112 template <
class MV,
typename S>
114 do_get (
const Teuchos::Ptr<const MV>& mv,
115 const Teuchos::ArrayView<S>& vals,
117 Teuchos::Ptr<
const Tpetra::Map<typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t> > distribution_map)
120 if_then_else<is_same<typename MV::scalar_t,S>::value,
121 same_type_get_copy<MV>,
122 diff_type_get_copy<MV,S> >::type::apply (mv, vals, ldx, distribution_map);
125 template <
class MV,
typename S>
127 do_get (
const Teuchos::Ptr<const MV>& mv,
128 const Teuchos::ArrayView<S>& vals,
131 typename MV::global_ordinal_t indexBase)
133 typedef typename MV::local_ordinal_t lo_t;
134 typedef typename MV::global_ordinal_t go_t;
135 typedef typename MV::global_size_t gs_t;
136 typedef typename MV::node_t node_t;
138 TEUCHOS_TEST_FOR_EXCEPTION(
139 mv.getRawPtr () == NULL, std::invalid_argument,
140 "Amesos2::get_1d_copy_helper::do_get(5 args): mv is null.");
142 Teuchos::RCP<const Tpetra::Map<lo_t,go_t,node_t> > map
143 = Amesos2::Util::getDistributionMap<lo_t,go_t,gs_t,node_t> (distribution,
144 mv->getGlobalLength (),
145 mv->getComm (), indexBase);
146 do_get (mv, vals, ldx, Teuchos::ptrInArg (*map));
149 template <
class MV,
typename S>
151 const Teuchos::ArrayView<S>& vals,
154 typedef Tpetra::Map<
typename MV::local_ordinal_t,
155 typename MV::global_ordinal_t,
156 typename MV::node_t> map_type;
157 TEUCHOS_TEST_FOR_EXCEPTION(
158 mv.getRawPtr () == NULL, std::invalid_argument,
159 "Amesos2::get_1d_copy_helper::do_get(3 args): mv is null.");
161 Teuchos::RCP<const map_type> map = mv->getMap ();
162 TEUCHOS_TEST_FOR_EXCEPTION(
163 map.is_null (), std::invalid_argument,
164 "Amesos2::get_1d_copy_helper::do_get(3 args): mv->getMap() is null.");
166 do_get (mv, vals, ldx, Teuchos::ptrInArg (*map));
174 template <
typename MV>
175 void same_type_data_put<MV>::apply(
const Teuchos::Ptr<MV>& mv,
176 const Teuchos::ArrayView<typename MV::scalar_t>& data,
178 Teuchos::Ptr<
const Tpetra::Map<typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t> > distribution_map )
180 mv->put1dData (data, ldx, distribution_map);
189 template <
typename MV,
typename S>
190 void diff_type_data_put<MV,S>::apply(
const Teuchos::Ptr<MV>& mv,
191 const Teuchos::ArrayView<S>& data,
193 Teuchos::Ptr<
const Tpetra::Map<typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t> > distribution_map )
195 typedef typename MV::scalar_t mv_scalar_t;
196 typedef typename Teuchos::Array<mv_scalar_t>::size_type size_type;
198 TEUCHOS_TEST_FOR_EXCEPTION(
199 mv.getRawPtr () == NULL, std::invalid_argument,
200 "Amesos2::diff_type_data_put(4 args): mv is null.");
202 const size_type vals_length = data.size ();
203 Teuchos::Array<mv_scalar_t> data_tmp (vals_length);
205 for (size_type i = 0; i < vals_length; ++i) {
206 data_tmp[i] = Teuchos::as<mv_scalar_t> (data[i]);
209 mv->put1dData (data_tmp (), ldx, distribution_map);
219 template <
class MV,
typename S>
221 const Teuchos::ArrayView<S>& data,
223 Teuchos::Ptr<
const Tpetra::Map<typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t> > distribution_map )
226 if_then_else<is_same<typename MV::scalar_t,S>::value,
227 same_type_data_put<MV>,
228 diff_type_data_put<MV,S> >::type::apply(mv, data, ldx, distribution_map);
231 template <
class MV,
typename S>
233 const Teuchos::ArrayView<S>& data,
235 EDistribution distribution,
typename MV::global_ordinal_t indexBase)
237 typedef typename MV::local_ordinal_t lo_t;
238 typedef typename MV::global_ordinal_t go_t;
239 typedef typename MV::global_size_t gs_t;
240 typedef typename MV::node_t node_t;
242 const Teuchos::RCP<const Tpetra::Map<lo_t,go_t,node_t> > map
243 = Amesos2::Util::getDistributionMap<lo_t,go_t,gs_t,node_t>(distribution,
244 mv->getGlobalLength(),
245 mv->getComm(), indexBase);
246 do_put(mv, data, ldx, Teuchos::ptrInArg(*map));
249 template <
class MV,
typename S>
251 const Teuchos::ArrayView<S>& data,
254 const Teuchos::RCP<
const Tpetra::Map<
typename MV::local_ordinal_t,
255 typename MV::global_ordinal_t,
256 typename MV::node_t> > map
258 do_put (mv, data, ldx, Teuchos::ptrInArg (*map));
265 #endif // AMESOS2_EPETRAMULTIVECADAPTER_DEF static void do_get(const Teuchos::Ptr< const MV > &mv, const Teuchos::ArrayView< S > &vals, const size_t ldx, Teuchos::Ptr< const Tpetra::Map< typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t > > distribution_map)
Helper class for getting 1-D copies of multivectors.
Definition: Amesos2_MultiVecAdapter_def.hpp:114
Utility functions for Amesos2.
Definition: Amesos2_AbstractConcreteMatrixAdapter.hpp:48
static void do_put(const Teuchos::Ptr< MV > &mv, const Teuchos::ArrayView< S > &data, const size_t ldx, Teuchos::Ptr< const Tpetra::Map< typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t > > distribution_map)
Helper class for putting 1-D data arrays into multivectors.
Definition: Amesos2_MultiVecAdapter_def.hpp:220
Amesos2::MultiVecAdapter specialization for the Tpetra::MultiVector class.
EDistribution
Definition: Amesos2_TypeDecl.hpp:123