1#ifndef MULTIVECTOR_DEF_hpp
2#define MULTIVECTOR_DEF_hpp
3#include "MultiVector_decl.hpp"
4#include "BlockMultiVector_decl.hpp"
17template <
class SC,
class LO,
class GO,
class NO>
18MultiVector<SC,LO,GO,NO>::MultiVector():
28template <
class SC,
class LO,
class GO,
class NO>
29MultiVector<SC,LO,GO,NO>::MultiVector( MapConstPtr_Type map, UN nmbVectors ):
35 multiVector_ = Teuchos::RCP(
new TpetraMultiVector_Type( map->getTpetraMap(), nmbVectors ));
38template <
class SC,
class LO,
class GO,
class NO>
39MultiVector<SC,LO,GO,NO>::MultiVector( TpetraMultiVectorPtr_Type& tpetraMVPtrIn ):
40multiVector_( tpetraMVPtrIn ),
45 map_.reset(
new Map_Type( tpetraMVPtrIn->getMap() ) );
48template <
class SC,
class LO,
class GO,
class NO>
49MultiVector<SC,LO,GO,NO>::MultiVector( MultiVectorConstPtr_Type mvIn ):
55 multiVector_ =Teuchos::RCP(
new TpetraMultiVector_Type( mvIn->getMap()->getTpetraMap(), mvIn->getNumVectors() ));
56 map_.reset(
new Map_Type( *mvIn->getMap() ) );
58 Teuchos::ArrayRCP< const SC > valuesIn = mvIn->getData(j);
60 for (UN i=0; i<valuesThis.size(); i++)
61 valuesThis[i] = valuesIn[i];
65template <
class SC,
class LO,
class GO,
class NO>
70template <
class SC,
class LO,
class GO,
class NO>
75template <
class SC,
class LO,
class GO,
class NO>
77 return Teuchos::rcp_const_cast<Map_Type>( map_ );
80template <
class SC,
class LO,
class GO,
class NO>
82 TEUCHOS_TEST_FOR_EXCEPTION(multiVector_.is_null(),std::runtime_error,
"RCP<MultiVector> is null.")
84 return multiVector_->getMap();
88template <
class SC,
class LO,
class GO,
class NO>
90 return multiVector_.is_null();
93template <
class SC,
class LO,
class GO,
class NO>
95 multiVector_->replaceGlobalValue( globalRow, vectorIndex, value );
98template <
class SC,
class LO,
class GO,
class NO>
100 multiVector_->replaceLocalValue( localRow, vectorIndex, value );
103template <
class SC,
class LO,
class GO,
class NO>
105 multiVector_->sumIntoGlobalValue( globalRow, vectorIndex, value );
108template <
class SC,
class LO,
class GO,
class NO>
109LO MultiVector<SC,LO,GO,NO>::getLocalLength()
const{
110 return multiVector_->getLocalLength();
113template <
class SC,
class LO,
class GO,
class NO>
115 return multiVector_->getData(i);
118template <
class SC,
class LO,
class GO,
class NO>
120 return multiVector_->getDataNonConst(i);
124template <
class SC,
class LO,
class GO,
class NO>
126 return multiVector_->getNumVectors();
129template <
class SC,
class LO,
class GO,
class NO>
130typename MultiVector<SC,LO,GO,NO>::TpetraMultiVectorConstPtr_Type MultiVector<SC,LO,GO,NO>::getTpetraMultiVector()
const{
134template <
class SC,
class LO,
class GO,
class NO>
135typename MultiVector<SC,LO,GO,NO>::TpetraMultiVectorPtr_Type MultiVector<SC,LO,GO,NO>::getTpetraMultiVectorNonConst() {
139template <
class SC,
class LO,
class GO,
class NO>
142 Teuchos::RCP<Teuchos::FancyOStream> out = Teuchos::VerboseObjectBase::getDefaultOStream();
143 multiVector_->describe(*out,verbLevel);
146template <
typename SC,
typename LO,
typename GO,
typename NO>
147Teuchos::RCP<Thyra::MultiVectorBase<SC> > MultiVector<SC,LO,GO,NO>::getThyraMultiVector( )
requires std::same_as<SC,
double> {
149 auto thyTpMap = Thyra::tpetraVectorSpace<SC,LO,GO,NO>(multiVector_->getMap());
150 Teuchos::RCP<Tpetra::MultiVector<SC,LO,GO,NO>> tpMV = multiVector_;
151 auto thyDomMap =Thyra::tpetraVectorSpace<SC,LO,GO,NO>(Tpetra::createLocalMapWithNode<LO,GO,NO>(multiVector_->getNumVectors(), multiVector_->getMap()->getComm()));
152 auto thyMV = rcp(
new Thyra::TpetraMultiVector<SC,LO,GO,NO>());
153 thyMV->initialize(thyTpMap, thyDomMap, tpMV);
157template <
typename SC,
typename LO,
typename GO,
typename NO>
158Teuchos::RCP<const Thyra::MultiVectorBase<SC> > MultiVector<SC,LO,GO,NO>::getThyraMultiVectorConst( ) const requires std::same_as<SC,
double>{
160 auto thyTpMap = Thyra::tpetraVectorSpace<SC,LO,GO,NO>(multiVector_->getMap());
161 Teuchos::RCP<Tpetra::MultiVector<SC,LO,GO,NO>> tpMV = multiVector_;
162 auto thyDomMap =Thyra::tpetraVectorSpace<SC,LO,GO,NO>(Tpetra::createLocalMapWithNode<LO,GO,NO>(multiVector_->getNumVectors(), multiVector_->getMap()->getComm()));
163 auto thyMV = rcp(
new Thyra::TpetraMultiVector<SC,LO,GO,NO>());
164 thyMV->initialize(thyTpMap, thyDomMap, tpMV);
169template <
class SC,
class LO,
class GO,
class NO>
170void MultiVector<SC,LO,GO,NO>::fromThyraMultiVector( Teuchos::RCP< Thyra::MultiVectorBase<SC> > thyraMV){
172 typedef Thyra::TpetraOperatorVectorExtraction<SC,LO,GO,NO> TOVE_Type;
174 Teuchos::RCP<TpetraMultiVector_Type> tMV = TOVE_Type::getTpetraMultiVector( thyraMV );
178template <
class SC,
class LO,
class GO,
class NO>
179void MultiVector<SC,LO,GO,NO>::norm2(
const Teuchos::ArrayView<
typename Teuchos::ScalarTraits<SC>::magnitudeType> &norms)
const {
180 TEUCHOS_TEST_FOR_EXCEPTION( multiVector_.is_null(), std::runtime_error,
"MultiVector in norm2 is null.")
181 multiVector_->norm2(norms);
185template <class SC, class LO, class GO, class NO>
186void MultiVector<SC,LO,GO,NO>::normInf(const Teuchos::ArrayView< typename Teuchos::ScalarTraits<SC>::magnitudeType> &normsInf)
const {
187 TEUCHOS_TEST_FOR_EXCEPTION( multiVector_.is_null(), std::runtime_error,
"MultiVector in normInf is null.")
188 multiVector_->normInf(normsInf);
192template <class SC, class LO, class GO, class NO>
193void MultiVector<SC,LO,GO,NO>::abs(MultiVectorConstPtr_Type a) {
194 TEUCHOS_TEST_FOR_EXCEPTION( multiVector_.is_null(), std::runtime_error,
"MultiVector in abs is null.")
195 multiVector_->abs( *a->getTpetraMultiVector());
198template <class SC, class LO, class GO, class NO>
199void MultiVector<SC,LO,GO,NO>::dot(MultiVectorConstPtr_Type a, const Teuchos::ArrayView< typename Teuchos::ScalarTraits<SC>::magnitudeType> &dots)
const {
200 TEUCHOS_TEST_FOR_EXCEPTION( multiVector_.is_null(), std::runtime_error,
"MultiVector in dot is null.")
201 multiVector_->dot( *a->getTpetraMultiVector(), dots );
204template <class SC, class LO, class GO, class NO>
205void MultiVector<SC,LO,GO,NO>::update( const SC& alpha, const MultiVector_Type& A, const SC& beta) {
206 TEUCHOS_TEST_FOR_EXCEPTION( getNumVectors() != A.getNumVectors(), std::logic_error,
"MultiVectors for update have different number of vectors.")
207 multiVector_->update( alpha, *A.getTpetraMultiVector(), beta );
210template <class SC, class LO, class GO, class NO>
211void MultiVector<SC,LO,GO,NO>::update( const SC& alpha, const MultiVector_Type& A, const SC& beta , const MultiVector_Type& B, const SC& gamma) {
212 TEUCHOS_TEST_FOR_EXCEPTION( getNumVectors() != A.getNumVectors(), std::logic_error,
"MultiVectors for update have different number of vectors.")
214 multiVector_->update( alpha, *A.getTpetraMultiVector(), beta, *B.getTpetraMultiVector(), gamma );
218template <class SC, class LO, class GO, class NO>
219void MultiVector<SC,LO,GO,NO>::putScalar( const SC& alpha ){
220 multiVector_->putScalar( alpha );
223template <
class SC,
class LO,
class GO,
class NO>
224void MultiVector<SC,LO,GO,NO>::scale(
const SC& alpha ){
225 multiVector_->scale( alpha );
228template <
class SC,
class LO,
class GO,
class NO>
229void MultiVector<SC,LO,GO,NO>::multiply(Teuchos::ETransp transA, Teuchos::ETransp transB,
const SC &alpha, MultiVectorConstPtr_Type &A, MultiVectorConstPtr_Type &B,
const SC &beta){
230 multiVector_->multiply( transA, transB, alpha, *A->getTpetraMultiVector(), *B->getTpetraMultiVector(), beta );
233template <
class SC,
class LO,
class GO,
class NO>
234void MultiVector<SC,LO,GO,NO>::multiply(Teuchos::ETransp transA, Teuchos::ETransp transB,
const SC &alpha, BlockMultiVectorConstPtr_Type &A, BlockMultiVectorConstPtr_Type &B,
const SC &beta)
requires std::same_as<SC,double>{
238 for (
int i=0; i<A->size(); i++){
239 MultiVectorConstPtr_Type a = A->getBlock(i);
240 MultiVectorConstPtr_Type b = B->getBlock(i);
242 this->multiply( transA, transB, alpha, a, b, beta );
244 this->multiply( transA, transB, alpha, a, b, Teuchos::ScalarTraits<SC>::one() );
249template <
class SC,
class LO,
class GO,
class NO>
250void MultiVector<SC,LO,GO,NO>::importFromVector( MultiVectorConstPtr_Type mvIn,
bool reuseImport, std::string combineMode, std::string type) {
252 TEUCHOS_TEST_FOR_EXCEPTION( getNumVectors() != mvIn->getNumVectors(), std::logic_error,
"MultiVectors for fillFromVector have different number of vectors.")
254 if ( importer_.is_null() || !reuseImport) {
256 importer_ = Teuchos::RCP(
new Tpetra::Import<LO, GO, NO>(mvIn->getMapTpetra(), this->getMapTpetra() ));
257 else if(type==
"Reverse")
258 importer_ = Teuchos::RCP(
new Tpetra::Import<LO, GO, NO>(this->getMapTpetra(), mvIn->getMapTpetra() ));
260 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Unknown type for import. Choose Forward or Reverse")
263 TEUCHOS_TEST_FOR_EXCEPTION( !importer_->getSourceMap()->isSameAs( *mvIn->getMap()->getTpetraMap() ), std::logic_error,
"Source maps of Importer and Multivector are not the same.")
264 TEUCHOS_TEST_FOR_EXCEPTION( !importer_->getTargetMap()->isSameAs( *this->getMap()->getTpetraMap() ), std::logic_error,
"Target maps of Importer and Multivector are not the same.")
268 if (type==
"Forward") {
269 if ( !combineMode.compare(
"Insert") )
270 multiVector_->doImport ( *mvIn->getTpetraMultiVector(), *importer_, Tpetra::INSERT);
271 else if ( !combineMode.compare(
"Add") )
272 multiVector_->doImport ( *mvIn->getTpetraMultiVector(), *importer_, Tpetra::ADD);
274 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Unknown combine mode.")
276 else if(type==
"Reverse"){
277 if ( !combineMode.compare(
"Insert") )
278 multiVector_->doExport ( *mvIn->getTpetraMultiVector(), *importer_, Tpetra::INSERT);
279 else if ( !combineMode.compare(
"Add") )
280 multiVector_->doExport ( *mvIn->getTpetraMultiVector(), *importer_, Tpetra::ADD);
282 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Unknown combine mode.")
285 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Unknown type for import. Choose Forward or Reverse")
288template <
class SC,
class LO,
class GO,
class NO>
289void MultiVector<SC,LO,GO,NO>::exportFromVector( MultiVectorConstPtr_Type mvIn,
bool reuseExport, std::string combineMode, std::string type) {
290 TEUCHOS_TEST_FOR_EXCEPTION( getNumVectors() != mvIn->getNumVectors(), std::logic_error,
"MultiVectors for exportToVector have different number of vectors.")
292 if ( exporter_.is_null() || !reuseExport) {
294 exporter_ = Teuchos::RCP(
new Tpetra::Export<LO, GO, NO>(mvIn->getMapTpetra(), this->getMapTpetra() ));
295 else if(type==
"Reverse")
296 exporter_ = Teuchos::RCP(
new Tpetra::Export<LO, GO, NO>(this->getMapTpetra(), mvIn->getMapTpetra() ));
298 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Unknown type for export. Choose Forward or Reverse")
301 TEUCHOS_TEST_FOR_EXCEPTION( !exporter_->getSourceMap()->isSameAs( *this->getMap()->getTpetraMap() ), std::logic_error,
"Source maps of Exporter and Multivector are not the same.")
302 TEUCHOS_TEST_FOR_EXCEPTION( !exporter_->getTargetMap()->isSameAs( *mvIn->getMap()->getTpetraMap() ), std::logic_error,
"Target maps of Exporter and Multivector are not the same.")
304 if (type==
"Forward") {
305 if ( !combineMode.compare(
"Insert") )
306 multiVector_->doExport ( *mvIn->getTpetraMultiVector(), *exporter_, Tpetra::INSERT);
307 else if ( !combineMode.compare(
"Add") )
308 multiVector_->doExport ( *mvIn->getTpetraMultiVector(), *exporter_, Tpetra::ADD);
310 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Unknown combine mode.")
312 else if (type==
"Reverse") {
313 if ( !combineMode.compare(
"Insert") )
314 multiVector_->doImport ( *mvIn->getTpetraMultiVector(), *exporter_, Tpetra::INSERT);
315 else if ( !combineMode.compare(
"Add") )
316 multiVector_->doImport ( *mvIn->getTpetraMultiVector(), *exporter_, Tpetra::ADD);
318 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Unknown combine mode.")
321 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Unknown type for export. Choose Forward or Reverse")
324template <
class SC,
class LO,
class GO,
class NO>
325void MultiVector<SC,LO,GO,NO>::writeMM(std::string fileName)
const{
326 TEUCHOS_TEST_FOR_EXCEPTION( multiVector_.is_null(), std::runtime_error,
"MultiVector in writeMM is null.")
328 typedef Tpetra::CrsMatrix<SC,LO,GO,NO> TpetraCrsMatrix;
330 Tpetra::MatrixMarket::Writer< TpetraCrsMatrix > tpetraWriter;
332 tpetraWriter.writeDenseFile(fileName, multiVector_,
"multivector",
"");
336template <class SC, class LO, class GO, class NO>
337void MultiVector<SC,LO,GO,NO>::readMM(std::
string fileName)
const{
338 TEUCHOS_TEST_FOR_EXCEPTION( multiVector_.is_null(), std::runtime_error,
"MultiVector in writeMM is null.")
340 typedef Tpetra::CrsMatrix<SC,LO,GO,NO> TpetraCrsMatrix;
341 typedef Teuchos::RCP<TpetraCrsMatrix> TpetraCrsMatrixPtr;
343 typedef Tpetra::
MultiVector<SC,LO,GO,NO> TpetraMultiVector;
344 typedef Teuchos::RCP<TpetraMultiVector> TpetraMultiVectorPtr;
346 typedef Tpetra::
Map<LO,GO,NO> TpetraMap;
347 typedef Teuchos::RCP<TpetraMap> TpetraMapPtr;
349 Teuchos::RCP<Teuchos::FancyOStream> out = Teuchos::VerboseObjectBase::getDefaultOStream();
351 TpetraMultiVectorPtr tpetraMultiVector = multiVector_;
353 Teuchos::RCP<const Tpetra::
Map<LO,GO,NO> > tpetraMap = tpetraMultiVector->getMap();
355 Tpetra::MatrixMarket::Reader< TpetraCrsMatrix > tpetraReader;
357 tpetraMultiVector = tpetraReader.readDenseFile(fileName, multiVector_->getMap()->getComm() ,tpetraMap);
359 for (UN j=0; j<this->getNumVectors(); j++) {
360 Teuchos::ArrayRCP< const SC > valuesIn = tpetraMultiVector->getData(j);
361 Teuchos::ArrayRCP< SC > valuesThis = this->getDataNonConst(j);
362 for (UN i=0; i<valuesThis.size(); i++)
363 valuesThis[i] = valuesIn[i];
370template <
class SC,
class LO,
class GO,
class NO>
371typename MultiVector<SC,LO,GO,NO>::MultiVectorConstPtr_Type MultiVector<SC,LO,GO,NO>::getVector(
int i )
const{
373 TpetraMultiVectorConstPtr_Type tpetraMV = multiVector_->getVector( i );
374 TpetraMultiVectorPtr_Type tpetraMVNonConst = Teuchos::rcp_const_cast<TpetraMultiVector_Type>( tpetraMV );
375 MultiVectorConstPtr_Type singleMV = Teuchos::rcp(
new const MultiVector_Type ( tpetraMVNonConst ) );
380template <
class SC,
class LO,
class GO,
class NO>
381typename MultiVector<SC,LO,GO,NO>::MultiVectorPtr_Type MultiVector<SC,LO,GO,NO>::sumColumns()
const{
383 MultiVectorPtr_Type sumMV = Teuchos::rcp(
new MultiVector_Type ( map_, 1 ) );
384 sumMV->putScalar(0.);
385 for (
int i=0; i<this->getNumVectors(); i++)
386 sumMV->getTpetraMultiVectorNonConst()->getVectorNonConst(0)->update( 1., *multiVector_->getVector(i), 1. );
391template <
class SC,
class LO,
class GO,
class NO>
392SC MultiVector<SC,LO,GO,NO>::getMax()
const{
393 TEUCHOS_TEST_FOR_EXCEPTION( this->getNumVectors() > 1, std::runtime_error,
"numMultiVector>1: max function not implemented!")
394 return multiVector_->getVector(0)->normInf();
Definition Map_decl.hpp:30
Definition MultiVector_decl.hpp:45
void replaceLocalValue(LO localRow, UN vectorIndex, const SC &value)
Definition MultiVector_def.hpp:99
Teuchos::ArrayRCP< const SC > getData(UN i) const
Get data of multivector.
Definition MultiVector_def.hpp:114
Teuchos::ArrayRCP< SC > getDataNonConst(UN i) const
Get data of multivector.
Definition MultiVector_def.hpp:119
bool is_null() const
checking whether the multiVector exists
Definition MultiVector_def.hpp:89
MapPtr_Type getMapNonConst()
Return non constant version of underlying map.
Definition MultiVector_def.hpp:76
MapConstPtr_Type getMap() const
Return underlying map.
Definition MultiVector_def.hpp:71
TpetraMapConstPtr_Type getMapTpetra() const
Return direct tpetra map of underlying map.
Definition MultiVector_def.hpp:81
void replaceGlobalValue(GO globalRow, UN vectorIndex, const SC &value)
Replace global value in mv.
Definition MultiVector_def.hpp:94
void sumIntoGlobalValue(GO globalRow, UN vectorIndex, const SC &value)
Update (+=) a value in host memory, using global row index.
Definition MultiVector_def.hpp:104
~MultiVector()
Destructor.
Definition MultiVector_def.hpp:66
UN getNumVectors() const
Get number of multivector (columns).
Definition MultiVector_def.hpp:125
void print(Teuchos::EVerbosityLevel verbLevel=Teuchos::VERB_EXTREME) const
Printing mv. Depending on verbosity level, output increases.
Definition MultiVector_def.hpp:140
Adaptive Mesh Refinement.
Definition AdaptiveMeshRefinement_decl.hpp:36