11#ifndef AMESOS2_MULTIVECADAPTER_DEF_HPP
12#define AMESOS2_MULTIVECADAPTER_DEF_HPP
27 template <
typename MV,
typename V>
28 typename vector_pointer_helper<MV, V>::ptr_return_type *
29 vector_pointer_helper<MV, V>::get_pointer_to_vector (
const Teuchos::Ptr< MV > &mv ) {
30 return mv->getMVPointer_impl();
33 template <
typename MV,
typename V>
34 typename vector_pointer_helper<MV, V>::ptr_return_type *
35 vector_pointer_helper<MV, V>::get_pointer_to_vector ( Teuchos::Ptr< MV > &mv ) {
36 return mv->getMVPointer_impl();
39 template <
typename MV,
typename V>
40 typename vector_pointer_helper<MV, V>::ptr_return_type *
41 vector_pointer_helper<MV, V>::get_pointer_to_vector (
const Teuchos::Ptr< const MV > &mv ) {
42 return mv->getMVPointer_impl();
45 template <
typename MV,
typename V>
46 typename vector_pointer_helper<MV, V>::ptr_return_type *
47 vector_pointer_helper<MV, V>::get_pointer_to_vector ( Teuchos::Ptr< const MV > &mv ) {
48 return mv->getMVPointer_impl();
60 template <
typename MV>
61 void same_type_get_copy<MV>::apply(
const Teuchos::Ptr<const MV> mv,
62 const Teuchos::ArrayView<typename MV::scalar_t>& v,
64 Teuchos::Ptr<
const Tpetra::Map<typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t> > distribution_map,
65 EDistribution distribution )
67 mv->get1dCopy (v, ldx, distribution_map, distribution);
76 template <
typename MV,
typename S>
77 void diff_type_get_copy<MV,S>::
78 apply (
const Teuchos::Ptr<const MV> mv,
79 const Teuchos::ArrayView<S>& v,
81 Teuchos::Ptr<
const Tpetra::Map<typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t> > distribution_map,
82 EDistribution distribution )
84 typedef typename MV::scalar_t mv_scalar_t;
85 typedef typename Teuchos::Array<mv_scalar_t>::size_type size_type;
87 TEUCHOS_TEST_FOR_EXCEPTION(
88 mv.getRawPtr () == NULL, std::invalid_argument,
89 "Amesos2::diff_type_get_copy::apply: mv is null.");
90 TEUCHOS_TEST_FOR_EXCEPTION(
91 distribution_map.getRawPtr () == NULL, std::invalid_argument,
92 "Amesos2::diff_type_get_copy::apply: distribution_map is null.");
94 const size_type vals_length = v.size ();
95 Teuchos::Array<mv_scalar_t> vals_tmp (vals_length);
97 mv->get1dCopy (vals_tmp (), ldx, distribution_map, distribution);
98 for (size_type i = 0; i < vals_length; ++i) {
99 v[i] = Teuchos::as<S> (vals_tmp[i]);
109 template <
class MV,
typename S>
111 do_get (
const Teuchos::Ptr<const MV>& mv,
112 const Teuchos::ArrayView<S>& vals,
114 Teuchos::Ptr<
const Tpetra::Map<typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t> > distribution_map,
118 std::conditional_t<std::is_same_v<typename MV::scalar_t,S>,
119 same_type_get_copy<MV>,
120 diff_type_get_copy<MV,S> >::apply (mv, vals, ldx, distribution_map, distribution);
123 template <
class MV,
typename S>
125 do_get (
const Teuchos::Ptr<const MV>& mv,
126 const Teuchos::ArrayView<S>& vals,
129 typename MV::global_ordinal_t indexBase)
131 typedef typename MV::local_ordinal_t lo_t;
132 typedef typename MV::global_ordinal_t go_t;
133 typedef typename MV::global_size_t gs_t;
134 typedef typename MV::node_t node_t;
136 TEUCHOS_TEST_FOR_EXCEPTION(
137 mv.getRawPtr () == NULL, std::invalid_argument,
138 "Amesos2::get_1d_copy_helper::do_get(5 args): mv is null.");
140 Teuchos::RCP<const Tpetra::Map<lo_t,go_t,node_t> > map
141 = Amesos2::Util::getDistributionMap<lo_t,go_t,gs_t,node_t> (distribution,
142 mv->getGlobalLength (),
147 do_get (mv, vals, ldx, Teuchos::ptrInArg (*map), distribution);
150 template <
class MV,
typename S>
152 const Teuchos::ArrayView<S>& vals,
155 typedef Tpetra::Map<
typename MV::local_ordinal_t,
156 typename MV::global_ordinal_t,
157 typename MV::node_t> map_type;
158 TEUCHOS_TEST_FOR_EXCEPTION(
159 mv.getRawPtr () == NULL, std::invalid_argument,
160 "Amesos2::get_1d_copy_helper::do_get(3 args): mv is null.");
162 Teuchos::RCP<const map_type> map = mv->getMap ();
163 TEUCHOS_TEST_FOR_EXCEPTION(
164 map.is_null (), std::invalid_argument,
165 "Amesos2::get_1d_copy_helper::do_get(3 args): mv->getMap() is null.");
168 do_get (mv, vals, ldx, Teuchos::ptrInArg (*map), ROOTED);
171 template <
class MV,
typename KV>
172 bool get_1d_copy_helper_kokkos_view<MV,KV>::
173 do_get (
bool bInitialize,
174 const Teuchos::Ptr<const MV>& mv,
177 Teuchos::Ptr<
const Tpetra::Map<typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t> > distribution_map,
178 EDistribution distribution)
180 return mv->get1dCopy_kokkos_view(bInitialize, kokkos_vals, ldx, distribution_map, distribution);
183 template <
class MV,
typename KV>
184 bool get_1d_copy_helper_kokkos_view<MV,KV>::
185 do_get (
bool bInitialize,
186 const Teuchos::Ptr<const MV>& mv,
189 EDistribution distribution,
190 typename MV::global_ordinal_t indexBase)
192 typedef typename MV::local_ordinal_t lo_t;
193 typedef typename MV::global_ordinal_t go_t;
194 typedef typename MV::global_size_t gs_t;
195 typedef typename MV::node_t node_t;
197 TEUCHOS_TEST_FOR_EXCEPTION(
198 mv.getRawPtr () == NULL, std::invalid_argument,
199 "Amesos2::get_1d_copy_helper_kokkos_view::do_get(5 args): mv is null.");
201 Teuchos::RCP<const Tpetra::Map<lo_t,go_t,node_t> > map
202 = Amesos2::Util::getDistributionMap<lo_t,go_t,gs_t,node_t> (distribution,
203 mv->getGlobalLength (),
208 return do_get (bInitialize, mv, kokkos_vals, ldx, Teuchos::ptrInArg (*map), distribution);
211 template <
class MV,
typename KV>
212 bool get_1d_copy_helper_kokkos_view<MV,KV>::
213 do_get (
bool bInitialize,
214 const Teuchos::Ptr<const MV>& mv,
218 typedef Tpetra::Map<
typename MV::local_ordinal_t,
219 typename MV::global_ordinal_t,
220 typename MV::node_t> map_type;
221 TEUCHOS_TEST_FOR_EXCEPTION(
222 mv.getRawPtr () == NULL, std::invalid_argument,
223 "Amesos2::get_1d_copy_helper::do_get(3 args): mv is null.");
225 Teuchos::RCP<const map_type> map = mv->getMap ();
226 TEUCHOS_TEST_FOR_EXCEPTION(
227 map.is_null (), std::invalid_argument,
228 "Amesos2::get_1d_copy_helper_kokkos_view::do_get(3 args): mv->getMap() is null.");
230 return do_get (bInitialize, mv, kokkos_vals, ldx, Teuchos::ptrInArg (*map), ROOTED);
238 template <
typename MV>
239 void same_type_data_put<MV>::apply(
const Teuchos::Ptr<MV>& mv,
240 const Teuchos::ArrayView<typename MV::scalar_t>& data,
242 Teuchos::Ptr<
const Tpetra::Map<typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t> > distribution_map,
243 EDistribution distribution )
245 mv->put1dData (data, ldx, distribution_map, distribution);
254 template <
typename MV,
typename S>
255 void diff_type_data_put<MV,S>::apply(
const Teuchos::Ptr<MV>& mv,
256 const Teuchos::ArrayView<S>& data,
258 Teuchos::Ptr<
const Tpetra::Map<typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t> > distribution_map,
259 EDistribution distribution )
261 typedef typename MV::scalar_t mv_scalar_t;
262 typedef typename Teuchos::Array<mv_scalar_t>::size_type size_type;
264 TEUCHOS_TEST_FOR_EXCEPTION(
265 mv.getRawPtr () == NULL, std::invalid_argument,
266 "Amesos2::diff_type_data_put(4 args): mv is null.");
268 const size_type vals_length = data.size ();
269 Teuchos::Array<mv_scalar_t> data_tmp (vals_length);
271 for (size_type i = 0; i < vals_length; ++i) {
272 data_tmp[i] = Teuchos::as<mv_scalar_t> (data[i]);
275 mv->put1dData (data_tmp (), ldx, distribution_map, distribution);
285 template <
class MV,
typename S>
287 const Teuchos::ArrayView<S>& data,
289 Teuchos::Ptr<
const Tpetra::Map<typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t> > distribution_map,
293 std::conditional_t<std::is_same_v<typename MV::scalar_t,S>,
294 same_type_data_put<MV>,
295 diff_type_data_put<MV,S> >::apply(mv, data, ldx, distribution_map, distribution);
298 template <
class MV,
typename S>
300 const Teuchos::ArrayView<S>& data,
302 EDistribution distribution,
typename MV::global_ordinal_t indexBase)
304 typedef typename MV::local_ordinal_t lo_t;
305 typedef typename MV::global_ordinal_t go_t;
306 typedef typename MV::global_size_t gs_t;
307 typedef typename MV::node_t node_t;
309 const Teuchos::RCP<const Tpetra::Map<lo_t,go_t,node_t> > map
310 = Amesos2::Util::getDistributionMap<lo_t,go_t,gs_t,node_t>(distribution,
311 mv->getGlobalLength(),
316 do_put(mv, data, ldx, Teuchos::ptrInArg(*map), distribution);
319 template <
class MV,
typename S>
321 const Teuchos::ArrayView<S>& data,
324 const Teuchos::RCP<
const Tpetra::Map<
typename MV::local_ordinal_t,
325 typename MV::global_ordinal_t,
326 typename MV::node_t> > map
328 do_put (mv, data, ldx, Teuchos::ptrInArg (*map), ROOTED);
331 template <
class MV,
typename KV>
332 void put_1d_data_helper_kokkos_view<MV,KV>::do_put(
const Teuchos::Ptr<MV>& mv,
335 Teuchos::Ptr<
const Tpetra::Map<typename MV::local_ordinal_t, typename MV::global_ordinal_t, typename MV::node_t> > distribution_map,
336 EDistribution distribution )
338 mv->put1dData_kokkos_view(kokkos_data, ldx, distribution_map, distribution);
341 template <
class MV,
typename KV>
342 void put_1d_data_helper_kokkos_view<MV,KV>::do_put(
const Teuchos::Ptr<MV>& mv,
345 EDistribution distribution,
typename MV::global_ordinal_t indexBase)
347 typedef typename MV::local_ordinal_t lo_t;
348 typedef typename MV::global_ordinal_t go_t;
349 typedef typename MV::global_size_t gs_t;
350 typedef typename MV::node_t node_t;
352 const Teuchos::RCP<const Tpetra::Map<lo_t,go_t,node_t> > map
353 = Amesos2::Util::getDistributionMap<lo_t,go_t,gs_t,node_t>(distribution,
354 mv->getGlobalLength(),
359 do_put(mv, kokkos_data, ldx, Teuchos::ptrInArg(*map), distribution);
362 template <
class MV,
typename KV>
363 void put_1d_data_helper_kokkos_view<MV,KV>::do_put (
const Teuchos::Ptr<MV>& mv,
367 const Teuchos::RCP<
const Tpetra::Map<
typename MV::local_ordinal_t,
368 typename MV::global_ordinal_t,
369 typename MV::node_t> > map
371 do_put (mv, kokkos_data, ldx, Teuchos::ptrInArg (*map), ROOTED);
Amesos2::MultiVecAdapter specialization for the Kokkos::View class.
Amesos2::MultiVecAdapter specialization for the Tpetra::MultiVector class.
EDistribution
Definition Amesos2_TypeDecl.hpp:89
Utility functions for Amesos2.
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:111
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:286