Xpetra Version of the Day
Loading...
Searching...
No Matches
Xpetra_StridedMapFactory_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
47// WARNING: This code is experimental. Backwards compatibility should not be expected.
48
49#ifndef XPETRA_STRIDEDMAPFACTORY_DEF_HPP
50#define XPETRA_STRIDEDMAPFACTORY_DEF_HPP
51
53
54#include "Xpetra_Exceptions.hpp"
55
56namespace Xpetra {
57
58template<class LocalOrdinal, class GlobalOrdinal, class Node>
59RCP<Xpetra::StridedMap<LocalOrdinal, GlobalOrdinal, Node>>
62 global_size_t numGlobalElements,
63 GlobalOrdinal indexBase,
64 std::vector<size_t>& stridingInfo,
65 const Teuchos::RCP<const Teuchos::Comm<int>>& comm,
66 LocalOrdinal stridedBlockId,
67 GlobalOrdinal offset,
68 LocalGlobal lg)
69{
70 return rcp(new Xpetra::StridedMap<LocalOrdinal, GlobalOrdinal, Node>(lib, numGlobalElements, indexBase, stridingInfo, comm, stridedBlockId, offset, lg));
71}
72
73
74template<class LocalOrdinal, class GlobalOrdinal, class Node>
78 global_size_t numGlobalElements,
79 size_t numLocalElements,
80 GlobalOrdinal indexBase,
81 std::vector<size_t>& stridingInfo,
82 const Teuchos::RCP<const Teuchos::Comm<int>>& comm,
83 LocalOrdinal stridedBlockId,
84 GlobalOrdinal offset)
85{
86 return rcp(new StridedMap(lib, numGlobalElements, numLocalElements, indexBase, stridingInfo, comm, stridedBlockId, offset));
87}
88
89
90template<class LocalOrdinal, class GlobalOrdinal, class Node>
93Build(const RCP<const Map>& map,
94 std::vector<size_t>& stridingInfo,
95 LocalOrdinal stridedBlockId,
96 GlobalOrdinal offset)
97{
98 return rcp(new StridedMap(map, stridingInfo, map->getIndexBase(), stridedBlockId, offset));
99}
100
101
102template<class LocalOrdinal, class GlobalOrdinal, class Node>
105Build(const RCP<const StridedMap>& map, LocalOrdinal stridedBlockId)
106{
108 "Xpetra::StridedMapFactory::Build: constructor expects stridedBlockId > -1.");
109
110 TEUCHOS_TEST_FOR_EXCEPTION(map->getStridedBlockId() != -1, Exceptions::RuntimeError,
111 "Xpetra::StridedMapFactory::Build: constructor expects a full map (stridedBlockId == -1).");
112
113 std::vector<size_t> stridingInfo = map->getStridingData();
114
115 Teuchos::ArrayView<const GlobalOrdinal> dofGids = map->getLocalElementList();
116
117 // determine nStridedOffset
118 size_t nStridedOffset = 0;
119 for (int j = 0; j < map->getStridedBlockId(); j++)
120 {
121 nStridedOffset += stridingInfo[ j ];
122 }
123
124 const size_t numMyBlockDofs = (stridingInfo[stridedBlockId] * map->getLocalNumElements()) / map->getFixedBlockSize();
125
126 std::vector<GlobalOrdinal> subBlockDofGids(numMyBlockDofs);
127
128 // TODO fill vector with dofs
129 LocalOrdinal ind = 0;
130 for(typename Teuchos::ArrayView<const GlobalOrdinal>::iterator it = dofGids.begin(); it != dofGids.end(); ++it)
131 {
132 if(map->GID2StridingBlockId(*it) == Teuchos::as<size_t>(stridedBlockId))
133 {
134 subBlockDofGids[ ind++ ] = *it;
135 }
136 }
137
138 const Teuchos::ArrayView<const GlobalOrdinal> subBlockDofGids_view(&subBlockDofGids[ 0 ], subBlockDofGids.size());
139
140 return rcp(new StridedMap(map->lib(),
142 subBlockDofGids_view,
143 map->getIndexBase(),
144 stridingInfo,
145 map->getComm(),
146 stridedBlockId));
147}
148
149
150template<class LocalOrdinal, class GlobalOrdinal, class Node>
153Build(const StridedMap& map)
154{
155 XPETRA_MONITOR("MapFactory::Build");
156
157 LocalOrdinal N = map.getLocalNumElements();
160
161 for(LocalOrdinal i = 0; i < N; i++)
162 newElements[ i ] = oldElements[ i ];
163
164 std::vector<size_t> strData = map.getStridingData();
165 return rcp(new StridedMap(map.lib(), map.getGlobalNumElements(), newElements, map.getIndexBase(), strData, map.getComm(), map.getStridedBlockId()));
166}
167
168
169template<class LocalOrdinal, class GlobalOrdinal, class Node>
173 global_size_t numGlobalElements,
175 GlobalOrdinal indexBase,
176 std::vector<size_t>& stridingInfo,
177 const Teuchos::RCP<const Teuchos::Comm<int>>& comm,
178 LocalOrdinal stridedBlockId, // FIXME (mfh 03 Sep 2014) This breaks if LocalOrdinal is unsigned
179 GlobalOrdinal /* offset */)
180{
181 return rcp(new StridedMap(lib, numGlobalElements, elementList, indexBase, stridingInfo, comm, stridedBlockId));
182}
183
184} // namespace Xpetra
185
186#endif // XPETRA_STRIDEDMAPFACTORY_DEF_HPP
187
188// TODO: removed unused methods
#define XPETRA_MONITOR(funcName)
iterator end() const
iterator begin() const
Exception throws to report errors in the internal logical of the program.
static RCP< Xpetra::StridedMap< LocalOrdinal, GlobalOrdinal, Node > > Build(UnderlyingLib lib, global_size_t numGlobalElements, GlobalOrdinal indexBase, std::vector< size_t > &stridingInfo, const Teuchos::RCP< const Teuchos::Comm< int > > &comm, LocalOrdinal stridedBlockId=-1, GlobalOrdinal offset=0, LocalGlobal lg=Xpetra::GloballyDistributed)
Map constructor with Xpetra-defined contiguous uniform distribution.
Class that stores a strided map.
UnderlyingLib lib() const
Get the library used by this object (Tpetra or Epetra?)
global_size_t getGlobalNumElements() const
Returns the number of elements in this Map.
LocalOrdinal getStridedBlockId() const
size_t getLocalNumElements() const
Returns the number of elements belonging to the calling node.
std::vector< size_t > getStridingData() const
Teuchos::RCP< const Teuchos::Comm< int > > getComm() const
Get the Comm object for this Map.
Teuchos::ArrayView< const GlobalOrdinal > getLocalElementList() const
Return a list of the global indices owned by this node.
GlobalOrdinal getIndexBase() const
Returns the index base for this Map.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Xpetra namespace
size_t global_size_t
Global size_t object.