46 #ifndef XPETRA_MAPEXTRACTOR_HPP_ 47 #define XPETRA_MAPEXTRACTOR_HPP_ 53 #include <Teuchos_RCP.hpp> 54 #include <Teuchos_Describable.hpp> 69 #ifndef DOXYGEN_SHOULD_SKIP_THIS 71 template<
class S,
class LO,
class GO,
class N>
class BlockedMultiVector;
74 template <
class Scalar,
86 #undef XPETRA_MAPEXTRACTOR_SHORT 103 MapExtractor(
const RCP<const Map>& fullmap,
const std::vector<RCP<const Map> >& maps,
bool bThyraMode =
false) {
108 MapExtractor(
const std::vector<RCP<const Map> >& maps,
const std::vector<RCP<const Map> >& thyramaps) {
129 map_ = Teuchos::null;
135 XPETRA_TEST_FOR_EXCEPTION(block >=
map_->getNumMaps(), std::out_of_range,
"ExtractVector: Error, block = " << block <<
" is too big. The MapExtractor only contains " <<
map_->getNumMaps() <<
" partial blocks.");
137 "ExtractVector: map_->getMap(" << block <<
",false) is null");
142 XPETRA_TEST_FOR_EXCEPTION(block >=
map_->getNumMaps(), std::out_of_range,
"ExtractVector: Error, block = " << block <<
" is too big. The MapExtractor only contains " <<
map_->getNumMaps() <<
" partial blocks.");
144 "ExtractVector: map_->getMap(" << block <<
",false) is null");
153 RCP< Vector>
ExtractVector(RCP<const Vector>& full,
size_t block,
bool bThyraMode =
false)
const {
154 XPETRA_TEST_FOR_EXCEPTION(block >=
map_->getNumMaps(), std::out_of_range,
"ExtractVector: Error, block = " << block <<
" is too big. The MapExtractor only contains " <<
map_->getNumMaps() <<
" partial blocks.");
156 "ExtractVector: map_->getMap(" << block <<
",false) is null");
160 if(bThyraMode ==
false)
return vv;
162 "MapExtractor::ExtractVector: ExtractVector in Thyra-style numbering only possible if MapExtractor has been created using Thyra-style numbered submaps.");
163 vv->replaceMap(
getMap(block,
true));
166 RCP< Vector>
ExtractVector(RCP< Vector>& full,
size_t block,
bool bThyraMode =
false)
const {
167 XPETRA_TEST_FOR_EXCEPTION(block >=
map_->getNumMaps(), std::out_of_range,
"ExtractVector: Error, block = " << block <<
" is too big. The MapExtractor only contains " <<
map_->getNumMaps() <<
" partial blocks.");
169 "ExtractVector: map_->getmap(" << block <<
",false) is null");
173 if(bThyraMode ==
false)
return vv;
175 "MapExtractor::ExtractVector: ExtractVector in Thyra-style numbering only possible if MapExtractor has been created using Thyra-style numbered submaps.");
176 vv->replaceMap(
getMap(block,
true));
179 RCP<MultiVector>
ExtractVector(RCP<const MultiVector>& full,
size_t block,
bool bThyraMode =
false)
const {
180 XPETRA_TEST_FOR_EXCEPTION(block >=
map_->getNumMaps(), std::out_of_range,
"ExtractVector: Error, block = " << block <<
" is too big. The MapExtractor only contains " <<
map_->getNumMaps() <<
" partial blocks.");
182 "ExtractVector: map_->getmap(" << block <<
",false) is null");
183 RCP<const BlockedMultiVector> bfull = Teuchos::rcp_dynamic_cast<
const BlockedMultiVector>(full);
184 if(bfull.is_null() ==
true) {
192 RCP<const Map> oldThyMapFull = full->getMap();
193 RCP<MultiVector> rcpNonConstFull = Teuchos::rcp_const_cast<
MultiVector>(full);
194 rcpNonConstFull->
replaceMap(
map_->getImporter(block)->getSourceMap());
197 "MapExtractor::ExtractVector: ExtractVector in Thyra-style numbering only possible if MapExtractor has been created using Thyra-style numbered submaps.");
198 if(bThyraMode ==
true)
199 vv->replaceMap(
getMap(block,
true));
200 rcpNonConstFull->replaceMap(oldThyMapFull);
206 "ExtractVector: Number of blocks in map extractor is " <<
map_->getNumMaps() <<
" but should be " << bfull->getBlockedMap()->getNumMaps() <<
" (number of blocks in BlockedMultiVector)");
207 return bfull->getMultiVector(block,bThyraMode);
210 RCP<MultiVector>
ExtractVector(RCP< MultiVector>& full,
size_t block,
bool bThyraMode =
false)
const {
211 XPETRA_TEST_FOR_EXCEPTION(block >=
map_->getNumMaps(), std::out_of_range,
"ExtractVector: Error, block = " << block <<
" is too big. The MapExtractor only contains " <<
map_->getNumMaps() <<
" partial blocks.");
213 "ExtractVector: map_->getmap(" << block <<
",false) is null");
215 if(bfull.is_null() ==
true) {
223 RCP<const Map> oldThyMapFull = full->getMap();
224 full->replaceMap(
map_->getImporter(block)->getSourceMap());
227 "MapExtractor::ExtractVector: ExtractVector in Thyra-style numbering only possible if MapExtractor has been created using Thyra-style numbered submaps.");
228 if(bThyraMode ==
true)
229 vv->replaceMap(
getMap(block,
true));
230 full->replaceMap(oldThyMapFull);
236 "ExtractVector: Number of blocks in map extractor is " <<
map_->getNumMaps() <<
" but should be " << bfull->getBlockedMap()->getNumMaps() <<
" (number of blocks in BlockedMultiVector)");
237 return bfull->getMultiVector(block,bThyraMode);
240 RCP<MultiVector>
ExtractVector(RCP<const BlockedMultiVector>& full,
size_t block,
bool bThyraMode =
false)
const {
241 XPETRA_TEST_FOR_EXCEPTION(block >=
map_->getNumMaps(), std::out_of_range,
"ExtractVector: Error, block = " << block <<
" is too big. The MapExtractor only contains " <<
map_->getNumMaps() <<
" partial blocks.");
243 "ExtractVector: map_->getmap(" << block <<
",false) is null");
245 "ExtractVector: Number of blocks in map extractor is " <<
map_->getNumMaps() <<
" but should be " << full->getBlockedMap()->getNumMaps() <<
" (number of blocks in BlockedMultiVector)");
246 Teuchos::RCP<MultiVector> vv = full->getMultiVector(block,bThyraMode);
250 XPETRA_TEST_FOR_EXCEPTION(block >=
map_->getNumMaps(), std::out_of_range,
"ExtractVector: Error, block = " << block <<
" is too big. The MapExtractor only contains " <<
map_->getNumMaps() <<
" partial blocks.");
252 "ExtractVector: map_->getmap(" << block <<
",false) is null");
254 "ExtractVector: Number of blocks in map extractor is " <<
map_->getNumMaps() <<
" but should be " << full->getBlockedMap()->getNumMaps() <<
" (number of blocks in BlockedMultiVector)");
255 Teuchos::RCP<MultiVector> vv = full->getMultiVector(block,bThyraMode);
263 XPETRA_TEST_FOR_EXCEPTION(block >=
map_->getNumMaps(), std::out_of_range,
"ExtractVector: Error, block = " << block <<
" is too big. The MapExtractor only contains " <<
map_->getNumMaps() <<
" partial blocks.");
265 "ExtractVector: map_->getmap(" << block <<
",false) is null");
267 "MapExtractor::InsertVector: InsertVector in Thyra-style numbering only possible if MapExtractor has been created using Thyra-style numbered submaps.");
276 RCP<const MultiVector> rcpPartial = Teuchos::rcpFromRef(partial);
277 RCP<MultiVector> rcpNonConstPartial = Teuchos::rcp_const_cast<
MultiVector>(rcpPartial);
278 RCP<const Map> oldThyMapPartial = rcpNonConstPartial->
getMap();
279 RCP<const Map> oldThyMapFull = full.
getMap();
283 "MapExtractor::InsertVector: InsertVector in Thyra-style mode: Xpetra GIDs of partial vector are not identical to target Map of Importer. This should not be.");
288 rcpNonConstPartial->replaceMap(
getMap(block,
false));
296 rcpNonConstPartial->replaceMap(oldThyMapPartial);
303 XPETRA_TEST_FOR_EXCEPTION(block >=
map_->getNumMaps(), std::out_of_range,
"ExtractVector: Error, block = " << block <<
" is too big. The MapExtractor only contains " <<
map_->getNumMaps() <<
" partial blocks.");
305 "ExtractVector: map_->getmap(" << block <<
",false) is null");
307 "MapExtractor::InsertVector: InsertVector in Thyra-style numbering only possible if MapExtractor has been created using Thyra-style numbered submaps.");
316 RCP<const MultiVector> rcpPartial = Teuchos::rcpFromRef(partial);
317 RCP<MultiVector> rcpNonConstPartial = Teuchos::rcp_const_cast<
MultiVector>(rcpPartial);
318 RCP<const Map> oldThyMapPartial = rcpNonConstPartial->
getMap();
319 RCP<const Map> oldThyMapFull = full.
getMap();
323 "MapExtractor::InsertVector: InsertVector in Thyra-style mode: Xpetra GIDs of partial vector are not identical to target Map of Importer. This should not be.");
328 rcpNonConstPartial->replaceMap(
getMap(block,
false));
336 rcpNonConstPartial->replaceMap(oldThyMapPartial);
343 void InsertVector(RCP<const Vector> partial,
size_t block, RCP< Vector> full,
bool bThyraMode =
false)
const {
InsertVector(*partial, block, *full, bThyraMode); }
344 void InsertVector(RCP< Vector> partial,
size_t block, RCP< Vector> full,
bool bThyraMode =
false)
const {
InsertVector(*partial, block, *full, bThyraMode); }
345 void InsertVector(RCP<const MultiVector> partial,
size_t block, RCP<MultiVector> full,
bool bThyraMode =
false)
const {
347 if(bfull.is_null() ==
true)
351 "InsertVector: map_->getmap(" << block <<
",false) is null");
352 full->setMultiVector(block, partial, bThyraMode);
355 void InsertVector(RCP< MultiVector> partial,
size_t block, RCP<MultiVector> full,
bool bThyraMode =
false)
const {
357 if(bfull.is_null() ==
true)
361 "InsertVector: map_->getmap(" << block <<
",false) is null");
362 bfull->setMultiVector(block, partial, bThyraMode);
367 "InsertVector: map_->getmap(" << block <<
",false) is null");
368 full->setMultiVector(block, partial, bThyraMode);
372 "InsertVector: map_->getmap(" << block <<
",false) is null");
373 full->setMultiVector(block, partial, bThyraMode);
378 RCP< Vector>
getVector(
size_t i,
bool bThyraMode =
false,
bool bZero =
true)
const {
380 "MapExtractor::getVector: getVector in Thyra-style numbering only possible if MapExtractor has been created using Thyra-style numbered submaps.");
384 RCP<MultiVector>
getVector(
size_t i,
size_t numvec,
bool bThyraMode =
false,
bool bZero =
true)
const {
386 "MapExtractor::getVector: getVector in Thyra-style numbering only possible if MapExtractor has been created using Thyra-style numbered submaps.");
404 const RCP<const Map>
getMap(
size_t i,
bool bThyraMode =
false)
const {
405 return map_->getMap(i,bThyraMode);
419 return map_->getMapIndexForGID(gid);
425 Teuchos::RCP<const BlockedMap>
map_;
429 #define XPETRA_MAPEXTRACTOR_SHORT
virtual void doExport(const DistObject< Packet, LocalOrdinal, GlobalOrdinal, Node > &source, const Export< LocalOrdinal, GlobalOrdinal, Node > &exporter, CombineMode CM)=0
Export data into this object using an Export object ("forward mode").
Exception throws to report errors in the internal logical of the program.
virtual void replaceMap(const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &map)=0
virtual void doImport(const DistObject< Packet, LocalOrdinal, GlobalOrdinal, Node > &source, const Import< LocalOrdinal, GlobalOrdinal, Node > &importer, CombineMode CM)=0
Import data into this object using an Import object ("forward mode").
virtual Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getMap() const =0
The Map describing the parallel distribution of this object.
static RCP< Vector > Build(const Teuchos::RCP< const Map > &map, bool zeroOut=true)
Constructor specifying the number of non-zeros for all rows.
#define XPETRA_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
static Teuchos::RCP< MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Build(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &map, size_t NumVectors, bool zeroOut=true)
Constructor specifying the number of non-zeros for all rows.