Xpetra Version of the Day
Loading...
Searching...
No Matches
Xpetra_MapFactory_def.hpp
Go to the documentation of this file.
1// @HEADER
2//
3// ***********************************************************************
4//
5// Xpetra: A linear algebra interface package
6// Copyright 2012 Sandia Corporation
7//
8// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9// the U.S. Government retains certain rights in this software.
10//
11// Redistribution and use in source and binary forms, with or without
12// modification, are permitted provided that the following conditions are
13// met:
14//
15// 1. Redistributions of source code must retain the above copyright
16// notice, this list of conditions and the following disclaimer.
17//
18// 2. Redistributions in binary form must reproduce the above copyright
19// notice, this list of conditions and the following disclaimer in the
20// documentation and/or other materials provided with the distribution.
21//
22// 3. Neither the name of the Corporation nor the names of the
23// contributors may be used to endorse or promote products derived from
24// this software without specific prior written permission.
25//
26// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Questions? Contact
39// Jonathan Hu (jhu@sandia.gov)
40// Andrey Prokopenko (aprokop@sandia.gov)
41// Ray Tuminaro (rstumin@sandia.gov)
42//
43// ***********************************************************************
44//
45// @HEADER
46#ifndef XPETRA_MAPFACTORY_DEF_HPP
47#define XPETRA_MAPFACTORY_DEF_HPP
48
50
51#ifdef HAVE_XPETRA_TPETRA
52# include "Xpetra_TpetraMap.hpp"
53#endif
54#ifdef HAVE_XPETRA_EPETRA
55# include "Xpetra_EpetraMap.hpp"
56#endif
57
58#include "Xpetra_BlockedMap.hpp"
59
60namespace Xpetra {
61
62
63
64template<class LocalOrdinal, class GlobalOrdinal, class Node>
68 global_size_t numGlobalElements,
69 GlobalOrdinal indexBase,
70 const Teuchos::RCP<const Teuchos::Comm<int>>& comm,
71 LocalGlobal lg)
72{
73 XPETRA_MONITOR("MapFactory::Build");
74
75#ifdef HAVE_XPETRA_TPETRA
76 if(lib == UseTpetra)
77 return Teuchos::rcp(new TpetraMap<LocalOrdinal, GlobalOrdinal, Node>(numGlobalElements, indexBase, comm, lg));
78#endif
79
82}
83
84
85
86
87
88
89template<class LocalOrdinal, class GlobalOrdinal, class Node>
93 global_size_t numGlobalElements,
94 size_t numLocalElements,
95 GlobalOrdinal indexBase,
96 const Teuchos::RCP<const Teuchos::Comm<int>>& comm)
97{
98 XPETRA_MONITOR("MapFactory::Build");
99
100#ifdef HAVE_XPETRA_TPETRA
101 if(lib == UseTpetra)
102 return rcp(new TpetraMap<LocalOrdinal, GlobalOrdinal, Node>(numGlobalElements, numLocalElements, indexBase, comm));
103#endif
104
107}
108
109
110
111
112
113
114template<class LocalOrdinal, class GlobalOrdinal, class Node>
118 global_size_t numGlobalElements,
120 GlobalOrdinal indexBase,
121 const Teuchos::RCP<const Teuchos::Comm<int>>& comm)
122{
123 XPETRA_MONITOR("MapFactory::Build");
124
125#ifdef HAVE_XPETRA_TPETRA
126 if(lib == UseTpetra)
127 return rcp(new TpetraMap<LocalOrdinal, GlobalOrdinal, Node>(numGlobalElements, elementList, indexBase, comm));
128#endif
129
132}
133
134
135
136template<class LocalOrdinal, class GlobalOrdinal, class Node>
140 const LocalOrdinal numDofPerNode, const GlobalOrdinal gidOffset)
141{
142 XPETRA_MONITOR("MapFactory::Build");
143
145 Teuchos::rcp_dynamic_cast<const BlockedMap<LocalOrdinal,GlobalOrdinal,Node>>(nodeMap);
146
147 if(!bmap.is_null())
148 {
150 "Xpetra::MapFactory::Build: When provided a BlockedMap numDofPerNode must set to be one. It is set to "
151 << numDofPerNode << ".");
153 }
154
155#ifdef HAVE_XPETRA_TPETRA
156 LocalOrdinal numLocalElements = nodeMap->getLocalNumElements();
157 Teuchos::ArrayView<const GlobalOrdinal> oldElements = nodeMap->getLocalElementList();
158 Teuchos::Array<GlobalOrdinal> newElements(nodeMap->getLocalNumElements() * numDofPerNode);
159 for (LocalOrdinal i = 0; i < numLocalElements; i++)
160 {
161 for (LocalOrdinal j = 0; j < numDofPerNode; j++)
162 {
163 newElements[i * numDofPerNode + j] = oldElements[i] * numDofPerNode + j + gidOffset;
164 }
165 }
166 if (nodeMap->lib() == UseTpetra)
167 {
169 (nodeMap->getGlobalNumElements() * numDofPerNode, newElements, nodeMap->getIndexBase(), nodeMap->getComm()));
170 }
171#endif
172
173 XPETRA_FACTORY_ERROR_IF_EPETRA(nodeMap->lib());
175}
176
177
178
179#ifdef HAVE_XPETRA_TPETRA
180template<class LocalOrdinal, class GlobalOrdinal, class Node>
184 global_size_t numGlobalElements,
185 const Kokkos::View<const GlobalOrdinal*, typename Node::device_type>& indexList,
186 GlobalOrdinal indexBase,
187 const Teuchos::RCP<const Teuchos::Comm<int>>& comm)
188{
189 XPETRA_MONITOR("MapFactory::Build");
190 if(lib == UseTpetra)
191 return rcp(new TpetraMap<LocalOrdinal, GlobalOrdinal, Node>(numGlobalElements, indexList, indexBase, comm));
194}
195#endif // HAVE_XPETRA_TPETRA
196
197
198
199template<class LocalOrdinal, class GlobalOrdinal, class Node>
203 size_t numElements,
204 const Teuchos::RCP<const Teuchos::Comm<int>>& comm)
205{
206 XPETRA_MONITOR("MapFactory::Build");
207
208#ifdef HAVE_XPETRA_TPETRA
209 if(lib == UseTpetra)
210 {
211 // Pre-ETI code called Tpetra::createLocalMap() but this can result in compile erros
212 // when Trilinos is built with multiple node-types, specifically the GCC 4.8.4 PR
213 // build generates an error because it would try to match Tpetra::Map objects where
214 // Node is Serial in one and OpenMP in the other. See Issue #5672 / PR #5723 for more
215 // information.
216 //return rcp(new Xpetra::TpetraMap<LocalOrdinal,GlobalOrdinal,Node>(Tpetra::createLocalMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(numElements, comm))); // (old version)
217 return rcp(new TpetraMap<LocalOrdinal,GlobalOrdinal,Node>(Tpetra::createLocalMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(numElements, comm)));
218 }
219#endif // HAVE_XPETRA_TPETRA
220
223}
224
225
226
227
228
229template<class LocalOrdinal, class GlobalOrdinal, class Node>
233 size_t numElements,
234 const Teuchos::RCP<const Teuchos::Comm<int>>& comm)
235{
236 XPETRA_MONITOR("MapFactory::Build");
237
238#ifdef HAVE_XPETRA_TPETRA
239 if(lib == UseTpetra)
240 {
241 return rcp(new TpetraMap<LocalOrdinal,GlobalOrdinal,Node>(Tpetra::createLocalMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(numElements, comm)));
242 }
243#endif // HAVE_XPETRA_TPETRA
244
247}
248
249
250
251
252
253
254template<class LocalOrdinal, class GlobalOrdinal, class Node>
258 global_size_t numElements,
259 const Teuchos::RCP<const Teuchos::Comm<int>>& comm)
260{
261 XPETRA_MONITOR("MapFactory::Build");
262
263#ifdef HAVE_XPETRA_TPETRA
264 if(lib == UseTpetra)
265 return rcp(new TpetraMap<LocalOrdinal, GlobalOrdinal, Node>(
266 Tpetra::createUniformContigMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(numElements, comm)));
267#endif // HAVE_XPETRA_TPETRA
268
271}
272
273
274
275template<class LocalOrdinal, class GlobalOrdinal, class Node>
279 global_size_t numElements,
280 const Teuchos::RCP<const Teuchos::Comm<int>>& comm)
281{
282 XPETRA_MONITOR("MapFactory::Build");
283
284#ifdef HAVE_XPETRA_TPETRA
285 if(lib == UseTpetra)
287 Tpetra::createUniformContigMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(numElements, comm)));
288#endif // HAVE_XPETRA_TPETRA
289
292}
293
294
295template<class LocalOrdinal, class GlobalOrdinal, class Node>
299 global_size_t numElements,
300 size_t localNumElements,
301 const Teuchos::RCP<const Teuchos::Comm<int>>& comm)
302{
303 XPETRA_MONITOR("MapFactory::Build");
304
305#ifdef HAVE_XPETRA_TPETRA
306 if(lib == UseTpetra)
308 Tpetra::createContigMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(numElements, localNumElements, comm)));
309#endif // HAVE_XPETRA_TPETRA
310
313}
314
315
316
317
318
319
320template<class LocalOrdinal, class GlobalOrdinal, class Node>
324 global_size_t numElements,
325 size_t localNumElements,
326 const Teuchos::RCP<const Teuchos::Comm<int>>& comm)
327{
328 XPETRA_MONITOR("MapFactory::Build");
329
330#ifdef HAVE_XPETRA_TPETRA
331 if(lib == UseTpetra)
332 {
333 return rcp(new TpetraMap<LocalOrdinal, GlobalOrdinal, Node>(
334 Tpetra::createContigMapWithNode<LocalOrdinal, GlobalOrdinal, Node>(numElements, localNumElements, comm)));
335 }
336#endif // HAVE_XPETRA_TPETRA
337
340}
341
342
343
344template<class LocalOrdinal, class GlobalOrdinal, class Node>
347copyMapWithNewComm(const Teuchos::RCP<const Map<LocalOrdinal, GlobalOrdinal, Node>> & oldmap,
348 const Teuchos::RCP<const Teuchos::Comm<int>>& newComm) {
349 XPETRA_MONITOR("MapFactory::Build");
352
353 size_t Nlocal = oldmap->getLocalNumElements();
354 global_size_t Nglobal = oldmap->getGlobalNumElements();
355
356 // Sanity check -- if there's no comm, we can't keep elements on the map (vice versa is OK)
357 TEUCHOS_TEST_FOR_EXCEPTION( Nlocal && newComm.is_null(),
358 std::logic_error, "MapFactory::copyMapWithNewComm needs the comm to match the map.");
359
360 // We'll return null if we don't have a Comm on this rank
361 RCP<const Map<LocalOrdinal, GlobalOrdinal, Node> > newMap;
362 if(!newComm.is_null()) {
363 if(oldmap->isContiguous()) {
364 newMap = XMF::Build(oldmap->lib(),INVALID,Nlocal,oldmap->getIndexBase(),newComm);
365 }
366 else {
367 newMap = XMF::Build(oldmap->lib(),Nglobal,oldmap->getLocalElementList(),oldmap->getIndexBase(),newComm);
368 }
369 }
370
371 return newMap;
373}
374
375
376} // namespace Xpetra
377
378
379
380
381#endif // XPETRA_MAPFACTORY_DEF_HPP
382
383
384//TODO: remove unused methods
385
386
#define XPETRA_MONITOR(funcName)
#define XPETRA_FACTORY_ERROR_IF_EPETRA(lib)
#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)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Xpetra namespace
size_t global_size_t
Global size_t object.