45 #ifndef AMESOS2_MULTIVECADAPTER_DEF_HPP
46 #define AMESOS2_MULTIVECADAPTER_DEF_HPP
62 template <
typename MV,
typename V>
63 typename vector_pointer_helper<MV, V>::ptr_return_type *
64 vector_pointer_helper<MV, V>::get_pointer_to_vector (
const Teuchos::Ptr< MV > &mv ) {
65 return mv->getMVPointer_impl();
68 template <
typename MV,
typename V>
69 typename vector_pointer_helper<MV, V>::ptr_return_type *
70 vector_pointer_helper<MV, V>::get_pointer_to_vector ( Teuchos::Ptr< MV > &mv ) {
71 return mv->getMVPointer_impl();
74 template <
typename MV,
typename V>
75 typename vector_pointer_helper<MV, V>::ptr_return_type *
76 vector_pointer_helper<MV, V>::get_pointer_to_vector (
const Teuchos::Ptr< const MV > &mv ) {
77 return mv->getMVPointer_impl();
80 template <
typename MV,
typename V>
81 typename vector_pointer_helper<MV, V>::ptr_return_type *
82 vector_pointer_helper<MV, V>::get_pointer_to_vector ( Teuchos::Ptr< const MV > &mv ) {
83 return mv->getMVPointer_impl();
95 template <
typename MV>
96 void same_type_get_copy<MV>::apply(
const Teuchos::Ptr<const MV> mv,
97 const Teuchos::ArrayView<typename MV::scalar_t>& v,
99 Teuchos::Ptr<
const Tpetra::Map<typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t> > distribution_map,
102 mv->get1dCopy (v, ldx, distribution_map, distribution);
111 template <
typename MV,
typename S>
112 void diff_type_get_copy<MV,S>::
113 apply (
const Teuchos::Ptr<const MV> mv,
114 const Teuchos::ArrayView<S>& v,
116 Teuchos::Ptr<
const Tpetra::Map<typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t> > distribution_map,
119 typedef typename MV::scalar_t mv_scalar_t;
120 typedef typename Teuchos::Array<mv_scalar_t>::size_type size_type;
122 TEUCHOS_TEST_FOR_EXCEPTION(
123 mv.getRawPtr () == NULL, std::invalid_argument,
124 "Amesos2::diff_type_get_copy::apply: mv is null.");
125 TEUCHOS_TEST_FOR_EXCEPTION(
126 distribution_map.getRawPtr () == NULL, std::invalid_argument,
127 "Amesos2::diff_type_get_copy::apply: distribution_map is null.");
129 const size_type vals_length = v.size ();
130 Teuchos::Array<mv_scalar_t> vals_tmp (vals_length);
132 mv->get1dCopy (vals_tmp (), ldx, distribution_map, distribution);
133 for (size_type i = 0; i < vals_length; ++i) {
134 v[i] = Teuchos::as<S> (vals_tmp[i]);
144 template <
class MV,
typename S>
146 do_get (
const Teuchos::Ptr<const MV>& mv,
147 const Teuchos::ArrayView<S>& vals,
149 Teuchos::Ptr<
const Tpetra::Map<typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t> > distribution_map,
153 std::conditional_t<std::is_same_v<typename MV::scalar_t,S>,
154 same_type_get_copy<MV>,
155 diff_type_get_copy<MV,S> >::apply (mv, vals, ldx, distribution_map, distribution);
158 template <
class MV,
typename S>
160 do_get (
const Teuchos::Ptr<const MV>& mv,
161 const Teuchos::ArrayView<S>& vals,
164 typename MV::global_ordinal_t indexBase)
166 typedef typename MV::local_ordinal_t lo_t;
167 typedef typename MV::global_ordinal_t go_t;
168 typedef typename MV::global_size_t gs_t;
169 typedef typename MV::node_t node_t;
171 TEUCHOS_TEST_FOR_EXCEPTION(
172 mv.getRawPtr () == NULL, std::invalid_argument,
173 "Amesos2::get_1d_copy_helper::do_get(5 args): mv is null.");
175 Teuchos::RCP<const Tpetra::Map<lo_t,go_t,node_t> > map
176 = Amesos2::Util::getDistributionMap<lo_t,go_t,gs_t,node_t> (distribution,
177 mv->getGlobalLength (),
182 do_get (mv, vals, ldx, Teuchos::ptrInArg (*map), distribution);
185 template <
class MV,
typename S>
187 const Teuchos::ArrayView<S>& vals,
190 typedef Tpetra::Map<
typename MV::local_ordinal_t,
191 typename MV::global_ordinal_t,
192 typename MV::node_t> map_type;
193 TEUCHOS_TEST_FOR_EXCEPTION(
194 mv.getRawPtr () == NULL, std::invalid_argument,
195 "Amesos2::get_1d_copy_helper::do_get(3 args): mv is null.");
197 Teuchos::RCP<const map_type> map = mv->getMap ();
198 TEUCHOS_TEST_FOR_EXCEPTION(
199 map.is_null (), std::invalid_argument,
200 "Amesos2::get_1d_copy_helper::do_get(3 args): mv->getMap() is null.");
203 do_get (mv, vals, ldx, Teuchos::ptrInArg (*map), ROOTED);
206 template <
class MV,
typename KV>
207 bool get_1d_copy_helper_kokkos_view<MV,KV>::
208 do_get (
bool bInitialize,
209 const Teuchos::Ptr<const MV>& mv,
212 Teuchos::Ptr<
const Tpetra::Map<typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t> > distribution_map,
215 return mv->get1dCopy_kokkos_view(bInitialize, kokkos_vals, ldx, distribution_map, distribution);
218 template <
class MV,
typename KV>
219 bool get_1d_copy_helper_kokkos_view<MV,KV>::
220 do_get (
bool bInitialize,
221 const Teuchos::Ptr<const MV>& mv,
225 typename MV::global_ordinal_t indexBase)
227 typedef typename MV::local_ordinal_t lo_t;
228 typedef typename MV::global_ordinal_t go_t;
229 typedef typename MV::global_size_t gs_t;
230 typedef typename MV::node_t node_t;
232 TEUCHOS_TEST_FOR_EXCEPTION(
233 mv.getRawPtr () == NULL, std::invalid_argument,
234 "Amesos2::get_1d_copy_helper_kokkos_view::do_get(5 args): mv is null.");
236 Teuchos::RCP<const Tpetra::Map<lo_t,go_t,node_t> > map
237 = Amesos2::Util::getDistributionMap<lo_t,go_t,gs_t,node_t> (distribution,
238 mv->getGlobalLength (),
243 return do_get (bInitialize, mv, kokkos_vals, ldx, Teuchos::ptrInArg (*map), distribution);
246 template <
class MV,
typename KV>
247 bool get_1d_copy_helper_kokkos_view<MV,KV>::
248 do_get (
bool bInitialize,
249 const Teuchos::Ptr<const MV>& mv,
253 typedef Tpetra::Map<
typename MV::local_ordinal_t,
254 typename MV::global_ordinal_t,
255 typename MV::node_t> map_type;
256 TEUCHOS_TEST_FOR_EXCEPTION(
257 mv.getRawPtr () == NULL, std::invalid_argument,
258 "Amesos2::get_1d_copy_helper::do_get(3 args): mv is null.");
260 Teuchos::RCP<const map_type> map = mv->getMap ();
261 TEUCHOS_TEST_FOR_EXCEPTION(
262 map.is_null (), std::invalid_argument,
263 "Amesos2::get_1d_copy_helper_kokkos_view::do_get(3 args): mv->getMap() is null.");
265 return do_get (bInitialize, mv, kokkos_vals, ldx, Teuchos::ptrInArg (*map), ROOTED);
273 template <
typename MV>
274 void same_type_data_put<MV>::apply(
const Teuchos::Ptr<MV>& mv,
275 const Teuchos::ArrayView<typename MV::scalar_t>& data,
277 Teuchos::Ptr<
const Tpetra::Map<typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t> > distribution_map,
280 mv->put1dData (data, ldx, distribution_map, distribution);
289 template <
typename MV,
typename S>
290 void diff_type_data_put<MV,S>::apply(
const Teuchos::Ptr<MV>& mv,
291 const Teuchos::ArrayView<S>& data,
293 Teuchos::Ptr<
const Tpetra::Map<typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t> > distribution_map,
296 typedef typename MV::scalar_t mv_scalar_t;
297 typedef typename Teuchos::Array<mv_scalar_t>::size_type size_type;
299 TEUCHOS_TEST_FOR_EXCEPTION(
300 mv.getRawPtr () == NULL, std::invalid_argument,
301 "Amesos2::diff_type_data_put(4 args): mv is null.");
303 const size_type vals_length = data.size ();
304 Teuchos::Array<mv_scalar_t> data_tmp (vals_length);
306 for (size_type i = 0; i < vals_length; ++i) {
307 data_tmp[i] = Teuchos::as<mv_scalar_t> (data[i]);
310 mv->put1dData (data_tmp (), ldx, distribution_map, distribution);
320 template <
class MV,
typename S>
322 const Teuchos::ArrayView<S>& data,
324 Teuchos::Ptr<
const Tpetra::Map<typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t> > distribution_map,
328 std::conditional_t<std::is_same_v<typename MV::scalar_t,S>,
329 same_type_data_put<MV>,
330 diff_type_data_put<MV,S> >::apply(mv, data, ldx, distribution_map, distribution);
333 template <
class MV,
typename S>
335 const Teuchos::ArrayView<S>& data,
337 EDistribution distribution,
typename MV::global_ordinal_t indexBase)
339 typedef typename MV::local_ordinal_t lo_t;
340 typedef typename MV::global_ordinal_t go_t;
341 typedef typename MV::global_size_t gs_t;
342 typedef typename MV::node_t node_t;
344 const Teuchos::RCP<const Tpetra::Map<lo_t,go_t,node_t> > map
345 = Amesos2::Util::getDistributionMap<lo_t,go_t,gs_t,node_t>(distribution,
346 mv->getGlobalLength(),
351 do_put(mv, data, ldx, Teuchos::ptrInArg(*map), distribution);
354 template <
class MV,
typename S>
356 const Teuchos::ArrayView<S>& data,
359 const Teuchos::RCP<
const Tpetra::Map<
typename MV::local_ordinal_t,
360 typename MV::global_ordinal_t,
361 typename MV::node_t> > map
363 do_put (mv, data, ldx, Teuchos::ptrInArg (*map), ROOTED);
366 template <
class MV,
typename KV>
367 void put_1d_data_helper_kokkos_view<MV,KV>::do_put(
const Teuchos::Ptr<MV>& mv,
370 Teuchos::Ptr<
const Tpetra::Map<typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t> > distribution_map,
373 mv->put1dData_kokkos_view(kokkos_data, ldx, distribution_map, distribution);
376 template <
class MV,
typename KV>
377 void put_1d_data_helper_kokkos_view<MV,KV>::do_put(
const Teuchos::Ptr<MV>& mv,
380 EDistribution distribution,
typename MV::global_ordinal_t indexBase)
382 typedef typename MV::local_ordinal_t lo_t;
383 typedef typename MV::global_ordinal_t go_t;
384 typedef typename MV::global_size_t gs_t;
385 typedef typename MV::node_t node_t;
387 const Teuchos::RCP<const Tpetra::Map<lo_t,go_t,node_t> > map
388 = Amesos2::Util::getDistributionMap<lo_t,go_t,gs_t,node_t>(distribution,
389 mv->getGlobalLength(),
394 do_put(mv, kokkos_data, ldx, Teuchos::ptrInArg(*map), distribution);
397 template <
class MV,
typename KV>
398 void put_1d_data_helper_kokkos_view<MV,KV>::do_put (
const Teuchos::Ptr<MV>& mv,
402 const Teuchos::RCP<
const Tpetra::Map<
typename MV::local_ordinal_t,
403 typename MV::global_ordinal_t,
404 typename MV::node_t> > map
406 do_put (mv, kokkos_data, ldx, Teuchos::ptrInArg (*map), ROOTED);
413 #endif // AMESOS2_EPETRAMULTIVECADAPTER_DEF
Utility functions for Amesos2.
Amesos2::MultiVecAdapter specialization for the Kokkos::View class.
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, EDistribution distribution=ROOTED)
Helper class for getting 1-D copies of multivectors.
Definition: Amesos2_MultiVecAdapter_def.hpp:146
Amesos2::MultiVecAdapter specialization for the Tpetra::MultiVector class.
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, EDistribution distribution=ROOTED)
Helper class for putting 1-D data arrays into multivectors.
Definition: Amesos2_MultiVecAdapter_def.hpp:321
EDistribution
Definition: Amesos2_TypeDecl.hpp:123