53 #ifndef AMESOS2_TPETRA_MULTIVEC_ADAPTER_DEF_HPP 54 #define AMESOS2_TPETRA_MULTIVEC_ADAPTER_DEF_HPP 61 using Tpetra::MultiVector;
63 template <
typename Scalar,
typename LocalOrdinal,
typename GlobalOrdinal,
class Node >
68 Node> >::MultiVecAdapter(
const Teuchos::RCP<multivec_t>& m )
73 template <
typename Scalar,
typename LocalOrdinal,
typename GlobalOrdinal,
class Node >
79 Node> >::get1dCopy(
const Teuchos::ArrayView<scalar_t>& av,
82 const Tpetra::Map<LocalOrdinal,
84 Node> > distribution_map )
const 88 typedef Tpetra::Map<LocalOrdinal, GlobalOrdinal, Node> map_type;
89 const size_t num_vecs = getGlobalNumVectors ();
91 TEUCHOS_TEST_FOR_EXCEPTION(
92 distribution_map.getRawPtr () == NULL, std::invalid_argument,
93 "Amesos2::MultiVecAdapter::get1dCopy: distribution_map argument is null.");
94 TEUCHOS_TEST_FOR_EXCEPTION(
95 mv_.is_null (), std::logic_error,
96 "Amesos2::MultiVecAdapter::get1dCopy: mv_ is null.");
98 TEUCHOS_TEST_FOR_EXCEPTION(
99 this->getMap ().is_null (), std::logic_error,
100 "Amesos2::MultiVecAdapter::get1dCopy: this->getMap() returns null.");
102 #ifdef HAVE_AMESOS2_DEBUG 103 const size_t requested_vector_length = distribution_map->getNodeNumElements ();
104 TEUCHOS_TEST_FOR_EXCEPTION(
105 lda < requested_vector_length, std::invalid_argument,
106 "Amesos2::MultiVecAdapter::get1dCopy: On process " <<
107 distribution_map->getComm ()->getRank () <<
" of the distribution Map's " 108 "communicator, the given stride lda = " << lda <<
" is not large enough " 109 "for the local vector length " << requested_vector_length <<
".");
110 TEUCHOS_TEST_FOR_EXCEPTION(
111 as<size_t> (av.size ()) < as<size_t> ((num_vecs - 1) * lda + requested_vector_length),
112 std::invalid_argument,
"Amesos2::MultiVector::get1dCopy: MultiVector " 113 "storage not large enough given leading dimension and number of vectors." );
114 #endif // HAVE_AMESOS2_DEBUG 119 RCP<const map_type> distMap;
120 if (exporter_.is_null () ||
121 ! exporter_->getSourceMap ()->isSameAs (* (this->getMap ())) ||
122 ! exporter_->getTargetMap ()->isSameAs (* distribution_map)) {
132 distMap = distribution_map->template clone<Node> (distribution_map->getNode ());
135 exporter_ = rcp (
new export_type (this->getMap (), distMap));
138 distMap = exporter_->getTargetMap ();
141 multivec_t redist_mv (distMap, num_vecs);
144 redist_mv.doExport (*mv_, *exporter_, Tpetra::REPLACE);
147 redist_mv.get1dCopy (av, lda);
150 template <
typename Scalar,
typename LocalOrdinal,
typename GlobalOrdinal,
class Node >
151 Teuchos::ArrayRCP<Scalar>
156 Node> >::get1dViewNonConst (
bool local)
162 TEUCHOS_TEST_FOR_EXCEPTION(
163 true, std::logic_error,
"Amesos2::MultiVecAdapter::get1dViewNonConst: " 217 template <
typename Scalar,
typename LocalOrdinal,
typename GlobalOrdinal,
class Node>
223 Node> >::put1dData(
const Teuchos::ArrayView<const scalar_t>& new_data,
226 const Tpetra::Map<LocalOrdinal,
231 typedef Tpetra::Map<LocalOrdinal, GlobalOrdinal, Node> map_type;
233 TEUCHOS_TEST_FOR_EXCEPTION(
234 source_map.getRawPtr () == NULL, std::invalid_argument,
235 "Amesos2::MultiVecAdapter::put1dData: source_map argument is null.");
236 TEUCHOS_TEST_FOR_EXCEPTION(
237 mv_.is_null (), std::logic_error,
238 "Amesos2::MultiVecAdapter::put1dData: the internal MultiVector mv_ is null.");
240 TEUCHOS_TEST_FOR_EXCEPTION(
241 this->getMap ().is_null (), std::logic_error,
242 "Amesos2::MultiVecAdapter::put1dData: this->getMap() returns null.");
244 const size_t num_vecs = getGlobalNumVectors ();
249 RCP<const map_type> srcMap;
250 if (importer_.is_null () ||
251 ! importer_->getSourceMap ()->isSameAs (* source_map) ||
252 ! importer_->getTargetMap ()->isSameAs (* (this->getMap ()))) {
261 srcMap = source_map->template clone<Node> (source_map->getNode ());
262 importer_ = rcp (
new import_type (srcMap, this->getMap ()));
265 srcMap = importer_->getSourceMap ();
268 const multivec_t source_mv (srcMap, new_data, lda, num_vecs);
271 mv_->doImport (source_mv, *importer_, Tpetra::REPLACE);
275 template <
typename Scalar,
typename LocalOrdinal,
typename GlobalOrdinal,
class Node >
281 Node> >::description()
const 283 std::ostringstream oss;
284 oss <<
"Amesos2 adapter wrapping: ";
285 oss << mv_->description();
290 template <
typename Scalar,
typename LocalOrdinal,
typename GlobalOrdinal,
class Node >
296 Node> >::describe (Teuchos::FancyOStream& os,
297 const Teuchos::EVerbosityLevel verbLevel)
const 299 mv_->describe (os, verbLevel);
303 template <
typename Scalar,
typename LocalOrdinal,
typename GlobalOrdinal,
class Node >
304 const char* MultiVecAdapter<
308 Node> >::name =
"Amesos2 adapter for Tpetra::MultiVector";
312 #endif // AMESOS2_TPETRA_MULTIVEC_ADAPTER_DEF_HPP Definition: Amesos2_AbstractConcreteMatrixAdapter.hpp:48
Amesos2::MultiVecAdapter specialization for the Tpetra::MultiVector class.