46 #ifndef XPETRA_MAPEXTRACTOR_DEF_HPP_
47 #define XPETRA_MAPEXTRACTOR_DEF_HPP_
49 #include <Xpetra_MultiVectorFactory.hpp>
57 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
64 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
71 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
78 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
86 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
94 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
100 "ExtractVector: Error, block = " << block <<
" is too big. The MapExtractor only contains " << map_->getNumMaps() <<
" partial blocks.");
102 "ExtractVector: map_->getMap(" << block <<
",false) is null");
108 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
115 "ExtractVector: Error, block = " << block <<
" is too big. The MapExtractor only contains " << map_->getNumMaps()
116 <<
" partial blocks.");
124 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
129 ExtractVector(*full, block, *partial);
133 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
142 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
147 ExtractVector(*full, block, *partial);
151 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
156 ExtractVector(*full, block, *partial);
160 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
167 "ExtractVector: Error, block = " << block <<
" is too big. The MapExtractor only contains " << map_->getNumMaps()
168 <<
" partial blocks.");
173 ExtractVector(*full, block, *vv);
174 if(bThyraMode ==
false)
177 Xpetra::Exceptions::RuntimeError,
178 "MapExtractor::ExtractVector: ExtractVector in Thyra-style numbering only possible if MapExtractor has been "
179 "created using Thyra-style numbered submaps.");
180 vv->replaceMap(getMap(block,
true));
185 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
195 "ExtractVector: Error, block = " << block <<
" is too big. The MapExtractor only contains " << map_->getNumMaps()
196 <<
" partial blocks.");
201 ExtractVector(*full, block, *vv);
202 if(bThyraMode ==
false)
205 Xpetra::Exceptions::RuntimeError,
206 "MapExtractor::ExtractVector: ExtractVector in Thyra-style numbering only possible if MapExtractor has been "
207 "created using Thyra-style numbered submaps.");
208 vv->replaceMap(getMap(block,
true));
213 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
223 "ExtractVector: Error, block = " << block <<
" is too big. The MapExtractor only contains " << map_->getNumMaps()
224 <<
" partial blocks.");
228 if(bfull.is_null() ==
true)
239 rcpNonConstFull->
replaceMap(map_->getImporter(block)->getSourceMap());
240 ExtractVector(*rcpNonConstFull, block, *vv);
242 Xpetra::Exceptions::RuntimeError,
243 "MapExtractor::ExtractVector: ExtractVector in Thyra-style numbering only possible if MapExtractor has been "
244 "created using Thyra-style numbered submaps.");
245 if(bThyraMode ==
true)
255 Xpetra::Exceptions::RuntimeError,
256 "ExtractVector: Number of blocks in map extractor is " << map_->getNumMaps() <<
" but should be "
257 << bfull->getBlockedMap()->getNumMaps()
258 <<
" (number of blocks in BlockedMultiVector)");
259 return bfull->getMultiVector(block, bThyraMode);
264 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
275 "ExtractVector: Error, block = " << block <<
" is too big. The MapExtractor only contains " << map_->getNumMaps()
276 <<
" partial blocks.");
280 if(bfull.is_null() ==
true)
290 full->replaceMap(map_->getImporter(block)->getSourceMap());
291 ExtractVector(*full, block, *vv);
293 Xpetra::Exceptions::RuntimeError,
294 "MapExtractor::ExtractVector: ExtractVector in Thyra-style numbering only possible if MapExtractor has been "
295 "created using Thyra-style numbered submaps.");
296 if(bThyraMode ==
true)
298 full->replaceMap(oldThyMapFull);
306 Xpetra::Exceptions::RuntimeError,
307 "ExtractVector: Number of blocks in map extractor is " << map_->getNumMaps() <<
" but should be "
308 << bfull->getBlockedMap()->getNumMaps()
309 <<
" (number of blocks in BlockedMultiVector)");
310 return bfull->getMultiVector(block, bThyraMode);
315 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
324 "ExtractVector: Error, block = " << block <<
" is too big. The MapExtractor only contains " << map_->getNumMaps()
325 <<
" partial blocks.");
329 Xpetra::Exceptions::RuntimeError,
330 "ExtractVector: Number of blocks in map extractor is " << map_->getNumMaps() <<
" but should be "
331 << full->getBlockedMap()->getNumMaps()
332 <<
" (number of blocks in BlockedMultiVector)");
338 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
347 "ExtractVector: Error, block = " << block <<
" is too big. The MapExtractor only contains " << map_->getNumMaps()
348 <<
" partial blocks.");
352 Xpetra::Exceptions::RuntimeError,
353 "ExtractVector: Number of blocks in map extractor is " << map_->getNumMaps() <<
" but should be "
354 << full->getBlockedMap()->getNumMaps()
355 <<
" (number of blocks in BlockedMultiVector)");
361 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
371 "ExtractVector: Error, block = " << block <<
" is too big. The MapExtractor only contains " << map_->getNumMaps()
372 <<
" partial blocks.");
374 map_->getMap(block,
false) == null, Xpetra::Exceptions::RuntimeError,
"ExtractVector: map_->getmap(" << block <<
",false) is null");
376 Xpetra::Exceptions::RuntimeError,
377 "MapExtractor::InsertVector: InsertVector in Thyra-style numbering only possible if MapExtractor has been created "
378 "using Thyra-style numbered submaps.");
395 Xpetra::Exceptions::RuntimeError,
396 "MapExtractor::InsertVector: InsertVector in Thyra-style mode: Xpetra GIDs of partial vector are not identical "
397 "to target Map of Importer. This should not be.");
404 rcpNonConstPartial->
replaceMap(getMap(block,
false));
405 full.
replaceMap(map_->getImporter(block)->getSourceMap());
412 rcpNonConstPartial->
replaceMap(oldThyMapPartial);
422 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
432 "ExtractVector: Error, block = " << block <<
" is too big. The MapExtractor only contains " << map_->getNumMaps()
433 <<
" partial blocks.");
435 map_->getMap(block,
false) == null, Xpetra::Exceptions::RuntimeError,
"ExtractVector: map_->getmap(" << block <<
",false) is null");
437 Xpetra::Exceptions::RuntimeError,
438 "MapExtractor::InsertVector: InsertVector in Thyra-style numbering only possible if MapExtractor has been created "
439 "using Thyra-style numbered submaps.");
456 Xpetra::Exceptions::RuntimeError,
457 "MapExtractor::InsertVector: InsertVector in Thyra-style mode: Xpetra GIDs of partial vector are not identical "
458 "to target Map of Importer. This should not be.");
465 rcpNonConstPartial->
replaceMap(getMap(block,
false));
466 full.
replaceMap(map_->getImporter(block)->getSourceMap());
473 rcpNonConstPartial->
replaceMap(oldThyMapPartial);
484 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
489 InsertVector(*partial, block, *full, bThyraMode);
493 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
498 InsertVector(*partial, block, *full, bThyraMode);
502 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
508 bool bThyraMode)
const
512 RCP<BlockedMultiVector> bfull = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(full);
513 if(bfull.is_null() ==
true)
514 InsertVector(*partial, block, *full, bThyraMode);
518 map_->getMap(block,
false) == null, Xpetra::Exceptions::RuntimeError,
"InsertVector: map_->getmap(" << block <<
",false) is null");
523 full->setMultiVector(block, partial, bThyraMode);
525 throw std::runtime_error(
"Xpetra::MultiVector::setMultiVector() doesn't exist.");
531 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
537 bool bThyraMode)
const
541 RCP<BlockedMultiVector> bfull = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(full);
542 if(bfull.is_null() ==
true)
543 InsertVector(*partial, block, *full, bThyraMode);
547 map_->getMap(block,
false) == null, Xpetra::Exceptions::RuntimeError,
"InsertVector: map_->getmap(" << block <<
",false) is null");
549 bfull->setMultiVector(block, partial, bThyraMode);
554 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
560 bool bThyraMode)
const
563 map_->getMap(block,
false) == null, Xpetra::Exceptions::RuntimeError,
"InsertVector: map_->getmap(" << block <<
",false) is null");
565 full->setMultiVector(block, partial, bThyraMode);
569 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
575 bool bThyraMode )
const
578 map_->getMap(block,
false) == null, Xpetra::Exceptions::RuntimeError,
"InsertVector: map_->getmap(" << block <<
",false) is null");
579 full->setMultiVector(block, partial, bThyraMode);
583 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
584 RCP<Xpetra::Vector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
590 Xpetra::Exceptions::RuntimeError,
591 "MapExtractor::getVector: getVector in Thyra-style numbering only possible if MapExtractor has been created using "
592 "Thyra-style numbered submaps.");
598 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
601 getVector(
size_t i,
size_t numvec,
bool bThyraMode,
bool bZero)
const
606 Xpetra::Exceptions::RuntimeError,
607 "MapExtractor::getVector: getVector in Thyra-style numbering only possible if MapExtractor has been created using "
608 "Thyra-style numbered submaps.");
614 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
619 return map_->getThyraMode();
623 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
628 return map_->getNumMaps();
632 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
637 return map_->getMap(i, bThyraMode);
641 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
650 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
659 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
664 return map_->getFullMap();
668 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
673 return map_->getMapIndexForGID(gid);
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").
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.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
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").
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
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)