42 #ifndef TPETRA_FEMULTIVECTOR_DEF_HPP
43 #define TPETRA_FEMULTIVECTOR_DEF_HPP
48 #include "Tpetra_Map.hpp"
49 #include "Tpetra_MultiVector.hpp"
50 #include "Tpetra_Import.hpp"
55 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
57 FEMultiVector(
const Teuchos::RCP<
const Map<LocalOrdinal, GlobalOrdinal, Node> > & map,
58 const Teuchos::RCP<
const Import<LocalOrdinal, GlobalOrdinal, Node> >& importer,
61 base_type(importer.is_null()? map:importer->getTargetMap(),numVecs,zeroOut),
64 activeMultiVector_ = Teuchos::rcp(
new FEWhichActive(FE_ACTIVE_TARGET));
67 if(!importer_.is_null() && !importer_->getSourceMap()->isSameAs(*map)) {
68 throw std::runtime_error(
"FEMultiVector: 'map' must match 'importer->getSourceMap()' if importer is provided");
71 if(!importer_.is_null()) {
73 if(importer_->getNumSameIDs() == importer->getSourceMap()->getNodeNumElements()) {
75 inactiveMultiVector_ = Teuchos::rcp(
new base_type(importer_->getSourceMap(),Kokkos::subview(this->view_,Kokkos::pair<size_t,size_t>(0,map->getNodeNumElements()),Kokkos::ALL)));
79 inactiveMultiVector_ = Teuchos::rcp(
new base_type(importer_->getSourceMap(),numVecs,zeroOut));
87 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
88 void FEMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>::replaceMap (
const Teuchos::RCP<const map_type>& newMap) {
89 throw std::runtime_error(
"Tpetra::FEMultiVector::replaceMap() is not implemented");
92 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
93 void FEMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>::doTargetToSource(
const CombineMode CM) {
94 if(!importer_.is_null() && *activeMultiVector_ == FE_ACTIVE_TARGET) {
95 inactiveMultiVector_->doExport(*
this,*importer_,CM);
100 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
101 void FEMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>::doSourceToTarget(
const CombineMode CM) {
102 if(!importer_.is_null() && *activeMultiVector_ == FE_ACTIVE_SOURCE) {
103 inactiveMultiVector_->doImport(*
this,*importer_,CM);
107 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
108 void FEMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>::switchActiveMultiVector() {
109 if(*activeMultiVector_ == FE_ACTIVE_TARGET)
110 *activeMultiVector_ = FE_ACTIVE_SOURCE;
112 *activeMultiVector_ = FE_ACTIVE_TARGET;
114 if(importer_.is_null())
return;
117 this->swap(*inactiveMultiVector_);
130 #define TPETRA_FEMULTIVECTOR_INSTANT(SCALAR,LO,GO,NODE) \
131 namespace Classes { \
132 template class FEMultiVector< SCALAR , LO , GO , NODE >; \
135 #endif // TPETRA_FEMULTIVECTOR_DEF_HPP