53 #ifndef AMESOS2_EPETRA_MULTIVEC_ADAPTER_DEF_HPP 54 #define AMESOS2_EPETRA_MULTIVEC_ADAPTER_DEF_HPP 56 #include <Teuchos_as.hpp> 58 #include <Epetra_SerialComm.h> 60 #include <Epetra_MpiComm.h> 62 #include <Epetra_LocalMap.h> 63 #include <Epetra_Import.h> 64 #include <Epetra_Export.h> 73 , mv_map_(adapter.mv_map_)
79 mv_map_ = Teuchos::rcpFromRef(mv_->Map());
85 return !mv_->DistributedGlobal();
90 return mv_->DistributedGlobal();
94 const Teuchos::RCP<const Teuchos::Comm<int> >
97 return Util::to_teuchos_comm(Teuchos::rcpFromRef(mv_->Comm()));
103 return Teuchos::as<size_t>(mv_->MyLength());
109 return Teuchos::as<size_t>(mv_->NumVectors());
116 return Teuchos::as<global_size_t>(mv_->GlobalLength());
122 return Teuchos::as<size_t>(mv_->NumVectors());
128 return Teuchos::as<size_t>(mv_->Stride());
134 return mv_->ConstantStride();
138 Teuchos::RCP<const Tpetra::Vector<MultiVecAdapter<Epetra_MultiVector>::scalar_t,
146 using Teuchos::ArrayRCP;
147 using Tpetra::MultiVector;
150 typedef local_ordinal_t lot;
151 typedef global_ordinal_t got;
154 RCP<MultiVector<st,lot,got,nt> > vector = rcp(
new MultiVector<st,lot,got,nt>(this->getMap(),1));
157 ArrayRCP<st> it = vector->getDataNonConst(0);
158 double* vector_data = mv_->operator[](Teuchos::as<int>(j));
159 Tpetra::global_size_t size = vector->getGlobalLength();
161 for( Tpetra::global_size_t i = 0; i < size; ++i ){
162 *it = vector_data[i];
165 return vector->getVector(j);
170 Teuchos::RCP<Tpetra::Vector<MultiVecAdapter<Epetra_MultiVector>::scalar_t,
171 MultiVecAdapter<Epetra_MultiVector>::local_ordinal_t,
172 MultiVecAdapter<Epetra_MultiVector>::global_ordinal_t,
178 using Teuchos::ArrayRCP;
179 using Tpetra::MultiVector;
182 typedef local_ordinal_t lot;
183 typedef global_ordinal_t got;
186 RCP<MultiVector<st,lot,got,nt> > vector = rcp(
new MultiVector<st,lot,got,nt>(this->getMap(),1));
189 ArrayRCP<st> it = vector->getDataNonConst(0);
190 double* vector_data = mv_->operator[](Teuchos::as<int>(j));
191 Tpetra::global_size_t size = vector->getGlobalLength();
193 for( Tpetra::global_size_t i = 0; i < size; ++i ){
194 *it = vector_data[i];
197 return vector->getVectorNonConst(j);
205 const Tpetra::Map<MultiVecAdapter<Epetra_MultiVector>::local_ordinal_t,
206 MultiVecAdapter<Epetra_MultiVector>::global_ordinal_t,
209 using Teuchos::rcpFromPtr;
212 const size_t num_vecs = getGlobalNumVectors();
214 #ifdef HAVE_AMESOS2_DEBUG 215 const size_t requested_vector_length = distribution_map->getNodeNumElements();
216 TEUCHOS_TEST_FOR_EXCEPTION( lda < requested_vector_length,
217 std::invalid_argument,
218 "Given stride is not large enough for local vector length" );
219 TEUCHOS_TEST_FOR_EXCEPTION( as<size_t>(av.size()) < (num_vecs-1) * lda + requested_vector_length,
220 std::invalid_argument,
221 "MultiVector storage not large enough given leading dimension " 222 "and number of vectors" );
225 Epetra_Map e_dist_map
226 = *Util::tpetra_map_to_epetra_map<local_ordinal_t,
229 node_t>(*distribution_map);
231 multivec_t redist_mv(e_dist_map, as<int>(num_vecs));
232 const Epetra_Import importer(e_dist_map, *mv_map_);
233 redist_mv.Import(*mv_, importer, Insert);
236 redist_mv.ExtractCopy(av.getRawPtr(), lda);
240 Teuchos::ArrayRCP<MultiVecAdapter<Epetra_MultiVector>::scalar_t>
292 return Teuchos::null;
301 const Tpetra::Map<MultiVecAdapter<Epetra_MultiVector>::local_ordinal_t,
302 MultiVecAdapter<Epetra_MultiVector>::global_ordinal_t,
305 using Teuchos::rcpFromPtr;
308 const size_t num_vecs = getGlobalNumVectors();
310 double* data_ptr =
const_cast<double*
>(new_data.getRawPtr());
311 const Epetra_BlockMap e_source_map
312 = *Util::tpetra_map_to_epetra_map<local_ordinal_t,global_ordinal_t,global_size_t,node_t>(*source_map);
313 const multivec_t source_mv(Copy, e_source_map, data_ptr, as<int>(lda), as<int>(num_vecs));
314 const Epetra_Import importer(*mv_map_, e_source_map);
316 mv_->Import(source_mv, importer, Insert);
322 std::ostringstream oss;
323 oss <<
"Amesos2 adapter wrapping: Epetra_MultiVector";
329 Teuchos::FancyOStream& os,
330 const Teuchos::EVerbosityLevel verbLevel)
const 333 if(verbLevel != Teuchos::VERB_NONE)
335 os <<
"TODO: implement! ";
340 Teuchos::RCP<const Tpetra::Map<MultiVecAdapter<Epetra_MultiVector>::local_ordinal_t,
341 MultiVecAdapter<Epetra_MultiVector>::global_ordinal_t,
345 return Util::epetra_map_to_tpetra_map<local_ordinal_t,global_ordinal_t,global_size_t,node_t>(*mv_map_);
350 =
"Amesos2 adapter for Epetra_MultiVector";
355 #endif // AMESOS2_EPETRA_MULTIVEC_ADAPTER_DEF_HPP Utility functions for Amesos2.
Definition: Amesos2_AbstractConcreteMatrixAdapter.hpp:48
Amesos2::MultiVecAdapter specialization for the Epetra_MultiVector class.
A templated MultiVector class adapter for Amesos2.
Definition: Amesos2_MultiVecAdapter_decl.hpp:175