Xpetra Version of the Day
Loading...
Searching...
No Matches
Xpetra_MapFactory_def.hpp
Go to the documentation of this file.
1// @HEADER
2// *****************************************************************************
3// Xpetra: A linear algebra interface package
4//
5// Copyright 2012 NTESS and the Xpetra contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef XPETRA_MAPFACTORY_DEF_HPP
11#define XPETRA_MAPFACTORY_DEF_HPP
12
13#include "Teuchos_CompilerCodeTweakMacros.hpp"
14#include "Teuchos_ENull.hpp"
16
17#include "Xpetra_TpetraMap.hpp"
18
19#include "Xpetra_BlockedMap.hpp"
20
21namespace Xpetra {
22
23template <class LocalOrdinal, class GlobalOrdinal, class Node>
27 global_size_t numGlobalElements,
28 GlobalOrdinal indexBase,
29 const Teuchos::RCP<const Teuchos::Comm<int>>& comm,
30 LocalGlobal lg) {
31 XPETRA_MONITOR("MapFactory::Build");
32
33 if (lib == UseTpetra)
34 return Teuchos::rcp(new TpetraMap<LocalOrdinal, GlobalOrdinal, Node>(numGlobalElements, indexBase, comm, lg));
35
37}
38
39template <class LocalOrdinal, class GlobalOrdinal, class Node>
43 global_size_t numGlobalElements,
44 size_t numLocalElements,
45 GlobalOrdinal indexBase,
46 const Teuchos::RCP<const Teuchos::Comm<int>>& comm) {
47 XPETRA_MONITOR("MapFactory::Build");
48
49 if (lib == UseTpetra)
50 return rcp(new TpetraMap<LocalOrdinal, GlobalOrdinal, Node>(numGlobalElements, numLocalElements, indexBase, comm));
51
53}
54
55template <class LocalOrdinal, class GlobalOrdinal, class Node>
59 global_size_t numGlobalElements,
61 GlobalOrdinal indexBase,
62 const Teuchos::RCP<const Teuchos::Comm<int>>& comm) {
63 XPETRA_MONITOR("MapFactory::Build");
64
65 if (lib == UseTpetra)
66 return rcp(new TpetraMap<LocalOrdinal, GlobalOrdinal, Node>(numGlobalElements, elementList, indexBase, comm));
67
69}
70
71template <class LocalOrdinal, class GlobalOrdinal, class Node>
75 const LocalOrdinal numDofPerNode, const GlobalOrdinal gidOffset) {
76 XPETRA_MONITOR("MapFactory::Build");
77
79 Teuchos::rcp_dynamic_cast<const BlockedMap<LocalOrdinal, GlobalOrdinal, Node>>(nodeMap);
80
81 if (!bmap.is_null()) {
83 "Xpetra::MapFactory::Build: When provided a BlockedMap numDofPerNode must set to be one. It is set to "
84 << numDofPerNode << ".");
86 }
87
88 LocalOrdinal numLocalElements = nodeMap->getLocalNumElements();
89 Teuchos::ArrayView<const GlobalOrdinal> oldElements = nodeMap->getLocalElementList();
90 Teuchos::Array<GlobalOrdinal> newElements(nodeMap->getLocalNumElements() * numDofPerNode);
91 for (LocalOrdinal i = 0; i < numLocalElements; i++) {
92 for (LocalOrdinal j = 0; j < numDofPerNode; j++) {
93 newElements[i * numDofPerNode + j] = oldElements[i] * numDofPerNode + j + gidOffset;
94 }
95 }
96 if (nodeMap->lib() == UseTpetra) {
97 return rcp(new TpetraMap<LocalOrdinal, GlobalOrdinal, Node>(nodeMap->getGlobalNumElements() * numDofPerNode, newElements, nodeMap->getIndexBase(), nodeMap->getComm()));
98 }
99
101 TEUCHOS_UNREACHABLE_RETURN(Teuchos::null);
102}
103
104template <class LocalOrdinal, class GlobalOrdinal, class Node>
108 global_size_t numGlobalElements,
109 const Kokkos::View<const GlobalOrdinal*, typename Node::device_type>& indexList,
110 GlobalOrdinal indexBase,
111 const Teuchos::RCP<const Teuchos::Comm<int>>& comm) {
112 XPETRA_MONITOR("MapFactory::Build");
113 if (lib == UseTpetra)
114 return rcp(new TpetraMap<LocalOrdinal, GlobalOrdinal, Node>(numGlobalElements, indexList, indexBase, comm));
116}
117
118template <class LocalOrdinal, class GlobalOrdinal, class Node>
122 size_t numElements,
123 const Teuchos::RCP<const Teuchos::Comm<int>>& comm) {
124 XPETRA_MONITOR("MapFactory::Build");
125
126 if (lib == UseTpetra) {
127 // Pre-ETI code called Tpetra::createLocalMap() but this can result in compile erros
128 // when Trilinos is built with multiple node-types, specifically the GCC 4.8.4 PR
129 // build generates an error because it would try to match Tpetra::Map objects where
130 // Node is Serial in one and OpenMP in the other. See Issue #5672 / PR #5723 for more
131 // information.
132 // return rcp(new Xpetra::TpetraMap<LocalOrdinal,GlobalOrdinal,Node>(Tpetra::createLocalMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(numElements, comm))); // (old version)
133 return rcp(new TpetraMap<LocalOrdinal, GlobalOrdinal, Node>(Tpetra::createLocalMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(numElements, comm)));
134 }
135
137}
138
139template <class LocalOrdinal, class GlobalOrdinal, class Node>
143 size_t numElements,
144 const Teuchos::RCP<const Teuchos::Comm<int>>& comm) {
145 XPETRA_MONITOR("MapFactory::Build");
146
147 if (lib == UseTpetra) {
148 return rcp(new TpetraMap<LocalOrdinal, GlobalOrdinal, Node>(Tpetra::createLocalMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(numElements, comm)));
149 }
150
152}
153
154template <class LocalOrdinal, class GlobalOrdinal, class Node>
158 global_size_t numElements,
159 const Teuchos::RCP<const Teuchos::Comm<int>>& comm) {
160 XPETRA_MONITOR("MapFactory::Build");
161
162 if (lib == UseTpetra)
164 Tpetra::createUniformContigMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(numElements, comm)));
165
167}
168
169template <class LocalOrdinal, class GlobalOrdinal, class Node>
173 global_size_t numElements,
174 const Teuchos::RCP<const Teuchos::Comm<int>>& comm) {
175 XPETRA_MONITOR("MapFactory::Build");
176
177 if (lib == UseTpetra)
179 Tpetra::createUniformContigMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(numElements, comm)));
180
182}
183
184template <class LocalOrdinal, class GlobalOrdinal, class Node>
188 global_size_t numElements,
189 size_t localNumElements,
190 const Teuchos::RCP<const Teuchos::Comm<int>>& comm) {
191 XPETRA_MONITOR("MapFactory::Build");
192
193 if (lib == UseTpetra)
195 Tpetra::createContigMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(numElements, localNumElements, comm)));
196
198}
199
200template <class LocalOrdinal, class GlobalOrdinal, class Node>
204 global_size_t numElements,
205 size_t localNumElements,
206 const Teuchos::RCP<const Teuchos::Comm<int>>& comm) {
207 XPETRA_MONITOR("MapFactory::Build");
208
209 if (lib == UseTpetra) {
211 Tpetra::createContigMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(numElements, localNumElements, comm)));
212 }
213
215}
216
217template <class LocalOrdinal, class GlobalOrdinal, class Node>
221 const Teuchos::RCP<const Teuchos::Comm<int>>& newComm) {
222 XPETRA_MONITOR("MapFactory::Build");
225
226 size_t Nlocal = oldmap->getLocalNumElements();
227 global_size_t Nglobal = oldmap->getGlobalNumElements();
228
229 // Sanity check -- if there's no comm, we can't keep elements on the map (vice versa is OK)
230 TEUCHOS_TEST_FOR_EXCEPTION(Nlocal && newComm.is_null(),
231 std::logic_error, "MapFactory::copyMapWithNewComm needs the comm to match the map.");
232
233 // We'll return null if we don't have a Comm on this rank
235 if (!newComm.is_null()) {
236 if (oldmap->isContiguous()) {
237 newMap = XMF::Build(oldmap->lib(), INVALID, Nlocal, oldmap->getIndexBase(), newComm);
238 } else {
239 newMap = XMF::Build(oldmap->lib(), Nglobal, oldmap->getLocalElementList(), oldmap->getIndexBase(), newComm);
240 }
241 }
242
243 return newMap;
245}
246
247} // namespace Xpetra
248
249#endif // XPETRA_MAPFACTORY_DEF_HPP
250
251// TODO: remove unused methods
#define XPETRA_MONITOR(funcName)
#define XPETRA_FACTORY_END
bool is_null() const
Exception throws to report errors in the internal logical of the program.
Create an Xpetra::Map instance.
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.
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 > > 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.
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.
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 > > 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< 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 > > createUniformContigMap(UnderlyingLib lib, global_size_t numElements, const Teuchos::RCP< const Teuchos::Comm< int > > &comm)
Create a uniform, contiguous Map with the default node.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
#define TEUCHOS_UNREACHABLE_RETURN(dummyReturnVal)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
size_t global_size_t
Global size_t object.