46 #include "Xpetra_MapFactory.hpp"
48 #include "Xpetra_BlockedMap.hpp"
50 #ifdef HAVE_XPETRA_TPETRA
51 #include "Xpetra_TpetraMap.hpp"
56 #if defined(HAVE_XPETRA_EPETRA)
58 #if !defined(XPETRA_EPETRA_NO_32BIT_GLOBAL_INDICES)
64 RCP<Map<int, int, EpetraNode>>
69 const Teuchos::RCP<
const Teuchos::Comm<int>> &comm,
73 #ifdef HAVE_XPETRA_TPETRA
84 RCP<Map<int, int, EpetraNode>>
88 size_t numLocalElements,
90 const Teuchos::RCP<
const Teuchos::Comm<int>> &comm) {
93 #ifdef HAVE_XPETRA_TPETRA
104 RCP<Map<int, int, EpetraNode>>
108 const Teuchos::ArrayView<const int> &elementList,
110 const Teuchos::RCP<
const Teuchos::Comm<int>> &comm) {
112 #ifdef HAVE_XPETRA_TPETRA
115 #endif // HAVE_XPETRA_TPETRA
125 Teuchos::RCP<Map<int, int, EpetraNode>>
128 const int numDofPerNode,
const int gidOffset) {
132 if (!bmap.is_null()) {
134 "Xpetra::MapFactory::Build: When provided a BlockedMap numDofPerNode must set to be one. It is set to " << numDofPerNode <<
".");
138 LocalOrdinal N = Teuchos::as<LocalOrdinal>(map->getLocalNumElements());
139 Teuchos::ArrayView<const GlobalOrdinal> oldElements = map->getLocalElementList();
140 Teuchos::Array<GlobalOrdinal> newElements(map->getLocalNumElements() * numDofPerNode);
141 for (LocalOrdinal i = 0; i < N; i++) {
142 for (LocalOrdinal j = 0; j < numDofPerNode; j++) {
143 newElements[i * numDofPerNode + j] = oldElements[i] * numDofPerNode + j + gidOffset;
147 #ifdef HAVE_XPETRA_TPETRA
149 return rcp(
new TpetraMap<LocalOrdinal, GlobalOrdinal, Node>(map->getGlobalNumElements() * numDofPerNode, newElements, map->getIndexBase(), map->getComm()));
151 #endif // HAVE_XPETRA_TPETRA
154 return rcp(
new EpetraMapT<int, Node>(map->getGlobalNumElements() * numDofPerNode, newElements, map->getIndexBase(), map->getComm()));
160 Teuchos::RCP<const Map<int, int, EpetraNode>>
164 const Teuchos::RCP<
const Teuchos::Comm<int>> &comm) {
167 #ifdef HAVE_XPETRA_TPETRA
169 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \
170 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT))))
174 "Xpetra::MapFactory::createLocalMap: Cannot create Xpetra::TpetraMap, since Tpetra is not instantiated on EpetraNode (Serial or OpenMP, depending on configuration) and/or GO=int");
176 #endif // HAVE_XPETRA_TPETRA
179 Teuchos::RCP<EpetraMapT<int, Node>> map;
183 return map.getConst();
191 #ifdef HAVE_XPETRA_TPETRA
192 Teuchos::RCP<Map<int, int, EpetraNode>>
196 const Kokkos::View<const int *, typename Node::device_type> &indexList,
198 const Teuchos::RCP<
const Teuchos::Comm<int>> &comm) {
203 Teuchos::ArrayView<const int> v(indexList.data(), indexList.size());
208 #endif // HAVE_XPETRA_TPETRA
210 Teuchos::RCP<const Map<int, int, EpetraNode>>
214 const Teuchos::RCP<
const Teuchos::Comm<int>> &comm) {
217 #ifdef HAVE_XPETRA_TPETRA
219 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \
220 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT))))
224 "Xpetra::MapFactory::createLocalMapWithNode: Cannot create Xpetra::TpetraMap, since Tpetra is not instantiated on EpetraNode (Serial or OpenMP, depending on configuration) and/or GO=int");
226 #endif // HAVE_XPETRA_TPETRA
229 Teuchos::RCP<EpetraMapT<int, Node>> map;
233 return map.getConst();
241 Teuchos::RCP<const Map<int, int, EpetraNode>>
245 const Teuchos::RCP<
const Teuchos::Comm<int>> &comm) {
248 #ifdef HAVE_XPETRA_TPETRA
250 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \
251 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT))))
255 "Xpetra::MapFactory::createUniformContigMapWithNode: Cannot create Xpetra::TpetraMap, since Tpetra is not instantiated on EpetraNode (Serial or OpenMP, depending on configuration) and/or GO=int");
257 #endif // HAVE_XPETRA_TPETRA
260 Teuchos::RCP<EpetraMapT<int, Node>> map;
264 return map.getConst();
270 Teuchos::RCP<const Map<int, int, EpetraNode>>
274 const Teuchos::RCP<
const Teuchos::Comm<int>> &comm) {
277 #ifdef HAVE_XPETRA_TPETRA
279 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \
280 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT))))
284 "Xpetra::MapFactory::createUniformContigMapWithNode: Cannot create Xpetra::TpetraMap, since Tpetra is not instantiated on EpetraNode (Serial or OpenMP, depending on configuration) and/or GO=int");
286 #endif // HAVE_XPETRA_TPETRA
289 Teuchos::RCP<EpetraMapT<int, Node>> map;
293 return map.getConst();
298 Teuchos::RCP<const Map<int, int, EpetraNode>>
302 size_t localNumElements,
303 const Teuchos::RCP<
const Teuchos::Comm<int>> &comm) {
306 #ifdef HAVE_XPETRA_TPETRA
308 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \
309 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT))))
313 "Xpetra::MapFactory::createContigMap: Cannot create Xpetra::TpetraMap, since Tpetra is not instantiated on EpetraNode (Serial or OpenMP, depending on configuration) and/or GO=int");
324 Teuchos::RCP<const Map<int, int, EpetraNode>>
328 size_t localNumElements,
329 const Teuchos::RCP<
const Teuchos::Comm<int>> &comm) {
332 #ifdef HAVE_XPETRA_TPETRA
334 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_INT))) || \
335 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_INT))))
339 "Xpetra::MapFactory::createContigMapWithNode: Cannot create Xpetra::TpetraMap, since Tpetra is not instantiated on EpetraNode (Serial or OpenMP, depending on configuration) and/or GO=int");
344 Teuchos::RCP<EpetraMapT<int, Node>> map;
348 return map.getConst();
353 Teuchos::RCP<const Map<int, int, EpetraNode>>
355 const Teuchos::RCP<
const Teuchos::Comm<int>> &newComm) {
358 global_size_t INVALID = Teuchos::OrdinalTraits<global_size_t>::invalid();
360 size_t Nlocal = oldmap->getLocalNumElements();
364 TEUCHOS_TEST_FOR_EXCEPTION(Nlocal && newComm.is_null(),
365 std::logic_error,
"MapFactory::copyMapWithNewComm needs the comm to match the map.");
368 RCP<const Map<int, int, Node>> newMap;
369 if (!newComm.is_null()) {
370 if (oldmap->isContiguous()) {
371 newMap = XMF::Build(oldmap->lib(), INVALID, Nlocal, oldmap->getIndexBase(), newComm);
373 newMap = XMF::Build(oldmap->lib(), Nglobal, oldmap->getLocalElementList(), oldmap->getIndexBase(), newComm);
381 #endif // #if !defined(XPETRA_EPETRA_NO_32BIT_GLOBAL_INDICES)
384 #if !defined(XPETRA_EPETRA_NO_64BIT_GLOBAL_INDICES)
391 RCP<Map<int, long long, EpetraNode>>
396 const Teuchos::RCP<
const Teuchos::Comm<int>> &comm,
400 #ifdef HAVE_XPETRA_TPETRA
411 RCP<Map<int, long long, EpetraNode>>
415 size_t numLocalElements,
417 const Teuchos::RCP<
const Teuchos::Comm<int>> &comm) {
420 #ifdef HAVE_XPETRA_TPETRA
431 RCP<Map<int, long long, EpetraNode>>
435 const Teuchos::ArrayView<const long long> &elementList,
437 const Teuchos::RCP<
const Teuchos::Comm<int>> &comm) {
440 #ifdef HAVE_XPETRA_TPETRA
453 Teuchos::RCP<Map<int, long long, EpetraNode>>
460 if (!bmap.is_null()) {
462 "Xpetra::MapFactory::Build: When provided a BlockedMap numDofPerNode must set to be one. It is set to " << numDofPerNode <<
".");
467 Teuchos::ArrayView<const GlobalOrdinal> oldElements = map->getLocalElementList();
468 Teuchos::Array<GlobalOrdinal> newElements(map->getLocalNumElements() * numDofPerNode);
471 newElements[i * numDofPerNode + j] = oldElements[i] * numDofPerNode + j;
473 #ifdef HAVE_XPETRA_TPETRA
479 return rcp(
new EpetraMapT<long long, Node>(map->getGlobalNumElements() * numDofPerNode, newElements, map->getIndexBase(), map->getComm()));
484 #ifdef HAVE_XPETRA_TPETRA
485 Teuchos::RCP<Map<LocalOrdinal, GlobalOrdinal, Node>>
489 const Kokkos::View<const long long *, typename Node::device_type> &indexList,
491 const Teuchos::RCP<
const Teuchos::Comm<int>> &comm) {
496 Teuchos::ArrayView<const long long> v(indexList.data(), indexList.size());
502 #endif // HAVE_XPETRA_TPETRA
504 Teuchos::RCP<const Map<int, long long, EpetraNode>>
508 const Teuchos::RCP<
const Teuchos::Comm<int>> &comm) {
511 #ifdef HAVE_XPETRA_TPETRA
513 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \
514 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))))
518 "Xpetra::MapFactory::createLocalMap: Cannot create Xpetra::TpetraMap, since Tpetra is not instantiated on EpetraNode (Serial or OpenMP, depending on configuration) and/or GO=long long");
528 Teuchos::RCP<const Map<int, long long, EpetraNode>>
532 const Teuchos::RCP<
const Teuchos::Comm<int>> &comm) {
535 #ifdef HAVE_XPETRA_TPETRA
537 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \
538 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))))
542 "Xpetra::MapFactory::createLocalMapWithNode: Cannot create Xpetra::TpetraMap, since Tpetra is not instantiated on EpetraNode (Serial or OpenMP, depending on configuration) and/or GO=long long");
547 Teuchos::RCP<EpetraMapT<long long, Node>> map;
551 return map.getConst();
556 Teuchos::RCP<const Map<int, long long, EpetraNode>>
560 const Teuchos::RCP<
const Teuchos::Comm<int>> &comm) {
563 #ifdef HAVE_XPETRA_TPETRA
565 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \
566 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))))
570 "Xpetra::MapFactory::createUniformContigMapWithNode: Cannot create Xpetra::TpetraMap, since Tpetra is not instantiated on EpetraNode (Serial or OpenMP, depending on configuration) and/or GO=long long");
575 Teuchos::RCP<EpetraMapT<long long, Node>> map;
579 return map.getConst();
584 Teuchos::RCP<const Map<int, long long, EpetraNode>>
588 const Teuchos::RCP<
const Teuchos::Comm<int>> &comm) {
591 #ifdef HAVE_XPETRA_TPETRA
593 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || \
594 (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))))
598 "Xpetra::MapFactory::createUniformContigMap: Cannot create Xpetra::TpetraMap, since Tpetra is not instantiated on EpetraNode (Serial or OpenMP, depending on configuration) and/or GO=long long");
608 Teuchos::RCP<const Map<int, long long, EpetraNode>>
611 size_t localNumElements,
612 const Teuchos::RCP<
const Teuchos::Comm<int>> &comm) {
615 #ifdef HAVE_XPETRA_TPETRA
617 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))))
619 Tpetra::createContigMapWithNode<int, GlobalOrdinal, Node>(numElements, localNumElements, comm)));
621 TEUCHOS_TEST_FOR_EXCEPTION(
true,
623 "Xpetra::MapFactory::createContigMap: Cannot create Xpetra::TpetraMap, since Tpetra is not instantiated on "
624 "EpetraNode (Serial or OpenMP, depending on configuration) and/or GO=long long");
634 Teuchos::RCP<const Map<int, long long, EpetraNode>>
638 size_t localNumElements,
639 const Teuchos::RCP<
const Teuchos::Comm<int>> &comm) {
642 #ifdef HAVE_XPETRA_TPETRA
644 #if ((defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_OPENMP) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))) || (!defined(EPETRA_HAVE_OMP) && (defined(HAVE_TPETRA_INST_SERIAL) && defined(HAVE_TPETRA_INST_INT_LONG_LONG))))
646 Tpetra::createContigMapWithNode<int, GlobalOrdinal, Node>(numElements, localNumElements, comm)));
648 TEUCHOS_TEST_FOR_EXCEPTION(
true,
650 "Xpetra::MapFactory::createContigMapWithNode: Cannot create Xpetra::TpetraMap, since Tpetra is not "
651 "instantiated on EpetraNode (Serial or OpenMP, depending on configuration) and/or GO=long long");
653 #endif // HAVE_XPETRA_TPETRA
656 Teuchos::RCP<EpetraMapT<long long, Node>> map;
661 return map.getConst();
667 Teuchos::RCP<const Map<int, long long, EpetraNode>>
669 const Teuchos::RCP<
const Teuchos::Comm<int>> &newComm) {
672 global_size_t INVALID = Teuchos::OrdinalTraits<global_size_t>::invalid();
674 size_t Nlocal = oldmap->getLocalNumElements();
678 TEUCHOS_TEST_FOR_EXCEPTION(Nlocal && newComm.is_null(),
679 std::logic_error,
"MapFactory::copyMapWithNewComm needs the comm to match the map.");
682 RCP<const Map<int, long long, Node>> newMap;
683 if (!newComm.is_null()) {
684 if (oldmap->isContiguous()) {
685 newMap = XMF::Build(oldmap->lib(), INVALID, Nlocal, oldmap->getIndexBase(), newComm);
687 newMap = XMF::Build(oldmap->lib(), Nglobal, oldmap->getLocalElementList(), oldmap->getIndexBase(), newComm);
695 #endif // #if !defined(XPETRA_EPETRA_NO_64BIT_GLOBAL_INDICES)
697 #endif // #if defined(HAVE_XPETRA_EPETRA)
static Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > copyMapWithNewComm(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node >> &oldmap, const Teuchos::RCP< const Teuchos::Comm< int >> &newComm)
Create a copy of the map, only using the new Comm object if the Comm would be valid.
static Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > createLocalMap(UnderlyingLib lib, size_t numElements, const Teuchos::RCP< const Teuchos::Comm< int >> &comm)
Create a locally replicated Map with the default node.
static Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > createContigMap(UnderlyingLib lib, global_size_t numElements, size_t localNumElements, const Teuchos::RCP< const Teuchos::Comm< int >> &comm)
Create a (potentially) non-uniform, contiguous Map with the default node.
Exception throws to report errors in the internal logical of the program.
#define XPETRA_FACTORY_ERROR_IF_EPETRA(lib)
MapFactory()
Private constructor. This is a static class.
static Teuchos::RCP< Map< LocalOrdinal, GlobalOrdinal, Node > > Build(UnderlyingLib lib, global_size_t numGlobalElements, GlobalOrdinal indexBase, const Teuchos::RCP< const Teuchos::Comm< int >> &comm, LocalGlobal lg=Xpetra::GloballyDistributed)
Map constructor with Xpetra-defined contiguous uniform distribution.
static Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > createContigMapWithNode(UnderlyingLib lib, global_size_t numElements, size_t localNumElements, const Teuchos::RCP< const Teuchos::Comm< int >> &comm)
Create a (potentially) non-uniform, contiguous Map with a user-specified node.
#define XPETRA_FACTORY_END
size_t global_size_t
Global size_t object.
static Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > createUniformContigMapWithNode(UnderlyingLib lib, global_size_t numElements, const Teuchos::RCP< const Teuchos::Comm< int >> &comm)
Create a uniform, contiguous Map with a user-specified node.
static Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > createLocalMapWithNode(UnderlyingLib lib, size_t numElements, const Teuchos::RCP< const Teuchos::Comm< int >> &comm)
Create a locally replicated Map with a specified node.
Create an Xpetra::Map instance.
#define XPETRA_MONITOR(funcName)
X P E T R A E P E T R A S P E C I A L I Z A T I O N.
static Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > createUniformContigMap(UnderlyingLib lib, global_size_t numElements, const Teuchos::RCP< const Teuchos::Comm< int >> &comm)
Create a uniform, contiguous Map with the default node.