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,
64 XPETRA_MONITOR("MapFactory::Build");
65
66 if (lib == UseTpetra)
67 return rcp(new TpetraMap<LocalOrdinal, GlobalOrdinal, Node>(numGlobalElements, elementList, indexBase, comm, params));
68
70}
71
72template <class LocalOrdinal, class GlobalOrdinal, class Node>
76 const LocalOrdinal numDofPerNode, const GlobalOrdinal gidOffset) {
77 XPETRA_MONITOR("MapFactory::Build");
78
80 Teuchos::rcp_dynamic_cast<const BlockedMap<LocalOrdinal, GlobalOrdinal, Node>>(nodeMap);
81
82 if (!bmap.is_null()) {
84 "Xpetra::MapFactory::Build: When provided a BlockedMap numDofPerNode must set to be one. It is set to "
85 << numDofPerNode << ".");
87 }
88
89 LocalOrdinal numLocalElements = nodeMap->getLocalNumElements();
90 Teuchos::ArrayView<const GlobalOrdinal> oldElements = nodeMap->getLocalElementList();
91 Teuchos::Array<GlobalOrdinal> newElements(nodeMap->getLocalNumElements() * numDofPerNode);
92 for (LocalOrdinal i = 0; i < numLocalElements; i++) {
93 for (LocalOrdinal j = 0; j < numDofPerNode; j++) {
94 newElements[i * numDofPerNode + j] = oldElements[i] * numDofPerNode + j + gidOffset;
95 }
96 }
97 if (nodeMap->lib() == UseTpetra) {
98 return rcp(new TpetraMap<LocalOrdinal, GlobalOrdinal, Node>(nodeMap->getGlobalNumElements() * numDofPerNode, newElements, nodeMap->getIndexBase(), nodeMap->getComm()));
99 }
100
102 TEUCHOS_UNREACHABLE_RETURN(Teuchos::null);
103}
104
105template <class LocalOrdinal, class GlobalOrdinal, class Node>
109 global_size_t numGlobalElements,
110 const Kokkos::View<const GlobalOrdinal*, typename Node::device_type>& indexList,
111 GlobalOrdinal indexBase,
112 const Teuchos::RCP<const Teuchos::Comm<int>>& comm,
114 XPETRA_MONITOR("MapFactory::Build");
115 if (lib == UseTpetra)
116 return rcp(new TpetraMap<LocalOrdinal, GlobalOrdinal, Node>(numGlobalElements, indexList, indexBase, comm, params));
118}
119
120template <class LocalOrdinal, class GlobalOrdinal, class Node>
124 size_t numElements,
125 const Teuchos::RCP<const Teuchos::Comm<int>>& comm) {
126 XPETRA_MONITOR("MapFactory::Build");
127
128 if (lib == UseTpetra) {
129 // Pre-ETI code called Tpetra::createLocalMap() but this can result in compile erros
130 // when Trilinos is built with multiple node-types, specifically the GCC 4.8.4 PR
131 // build generates an error because it would try to match Tpetra::Map objects where
132 // Node is Serial in one and OpenMP in the other. See Issue #5672 / PR #5723 for more
133 // information.
134 // return rcp(new Xpetra::TpetraMap<LocalOrdinal,GlobalOrdinal,Node>(Tpetra::createLocalMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(numElements, comm))); // (old version)
135 return rcp(new TpetraMap<LocalOrdinal, GlobalOrdinal, Node>(Tpetra::createLocalMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(numElements, comm)));
136 }
137
139}
140
141template <class LocalOrdinal, class GlobalOrdinal, class Node>
145 size_t numElements,
146 const Teuchos::RCP<const Teuchos::Comm<int>>& comm) {
147 XPETRA_MONITOR("MapFactory::Build");
148
149 if (lib == UseTpetra) {
150 return rcp(new TpetraMap<LocalOrdinal, GlobalOrdinal, Node>(Tpetra::createLocalMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(numElements, comm)));
151 }
152
154}
155
156template <class LocalOrdinal, class GlobalOrdinal, class Node>
160 global_size_t numElements,
161 const Teuchos::RCP<const Teuchos::Comm<int>>& comm) {
162 XPETRA_MONITOR("MapFactory::Build");
163
164 if (lib == UseTpetra)
166 Tpetra::createUniformContigMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(numElements, comm)));
167
169}
170
171template <class LocalOrdinal, class GlobalOrdinal, class Node>
175 global_size_t numElements,
176 const Teuchos::RCP<const Teuchos::Comm<int>>& comm) {
177 XPETRA_MONITOR("MapFactory::Build");
178
179 if (lib == UseTpetra)
181 Tpetra::createUniformContigMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(numElements, comm)));
182
184}
185
186template <class LocalOrdinal, class GlobalOrdinal, class Node>
190 global_size_t numElements,
191 size_t localNumElements,
192 const Teuchos::RCP<const Teuchos::Comm<int>>& comm) {
193 XPETRA_MONITOR("MapFactory::Build");
194
195 if (lib == UseTpetra)
197 Tpetra::createContigMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(numElements, localNumElements, comm)));
198
200}
201
202template <class LocalOrdinal, class GlobalOrdinal, class Node>
206 global_size_t numElements,
207 size_t localNumElements,
208 const Teuchos::RCP<const Teuchos::Comm<int>>& comm) {
209 XPETRA_MONITOR("MapFactory::Build");
210
211 if (lib == UseTpetra) {
213 Tpetra::createContigMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(numElements, localNumElements, comm)));
214 }
215
217}
218
219template <class LocalOrdinal, class GlobalOrdinal, class Node>
223 const Teuchos::RCP<const Teuchos::Comm<int>>& newComm) {
224 XPETRA_MONITOR("MapFactory::Build");
227
228 size_t Nlocal = oldmap->getLocalNumElements();
229 global_size_t Nglobal = oldmap->getGlobalNumElements();
230
231 // Sanity check -- if there's no comm, we can't keep elements on the map (vice versa is OK)
232 TEUCHOS_TEST_FOR_EXCEPTION(Nlocal && newComm.is_null(),
233 std::logic_error, "MapFactory::copyMapWithNewComm needs the comm to match the map.");
234
235 // We'll return null if we don't have a Comm on this rank
237 if (!newComm.is_null()) {
238 if (oldmap->isContiguous()) {
239 newMap = XMF::Build(oldmap->lib(), INVALID, Nlocal, oldmap->getIndexBase(), newComm);
240 } else {
241 newMap = XMF::Build(oldmap->lib(), Nglobal, oldmap->getLocalElementList(), oldmap->getIndexBase(), newComm);
242 }
243 }
244
245 return newMap;
247}
248
249} // namespace Xpetra
250
251#endif // XPETRA_MAPFACTORY_DEF_HPP
252
253// 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.