Xpetra_StridedMapFactory.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_HPP
50 #define XPETRA_STRIDEDMAPFACTORY_HPP
51 
52 #include <Kokkos_DefaultNode.hpp>
53 
54 #include "Xpetra_ConfigDefs.hpp"
55 #include "Xpetra_Exceptions.hpp"
56 
57 #include "Xpetra_StridedMap.hpp"
58 
59 // This factory creates Xpetra::Map. User have to specify the exact class of object that he want to create (ie: a Xpetra::TpetraMap or a Xpetra::EpetraMap).
60 
61 namespace Xpetra {
62 
63  template <class LocalOrdinal = StridedMap<>::local_ordinal_type,
64  class GlobalOrdinal =
66  class Node =
68  class StridedMapFactory {
69 #undef XPETRA_STRIDEDMAPFACTORY_SHORT
71 
72  private:
75 
76  public:
77 
79  // Workaround function for a deferred visual studio bug
80  // http://connect.microsoft.com/VisualStudio/feedback/details/719847/erroneous-error-c2783-could-not-deduce-template-argument
81  // Use this function for default arguments rather than calling
82  // what is the return value below. Also helps in reducing
83  // duplication in various constructors.
84  return KokkosClassic::Details::getNode<Node>();
85  }
86 
88  static RCP<StridedMap> Build(UnderlyingLib lib, global_size_t numGlobalElements, GlobalOrdinal indexBase,
89  std::vector<size_t>& stridingInfo, const Teuchos::RCP<const Teuchos::Comm<int> > &comm,
90  LocalOrdinal stridedBlockId = -1, GlobalOrdinal offset = 0, LocalGlobal lg = Xpetra::GloballyDistributed,
91  const Teuchos::RCP<Node> &node = defaultArgNode()) {
92 
93  return rcp(new StridedMap(lib, numGlobalElements, indexBase, stridingInfo, comm, stridedBlockId, offset, lg, node));
94  }
95 
97  static RCP<StridedMap> Build(UnderlyingLib lib, global_size_t numGlobalElements, size_t numLocalElements, GlobalOrdinal indexBase,
98  std::vector<size_t>& stridingInfo, const Teuchos::RCP<const Teuchos::Comm<int> > &comm,
99  LocalOrdinal stridedBlockId = -1, GlobalOrdinal offset = 0,
100  const Teuchos::RCP<Node> &node = defaultArgNode()) {
101 
102  return rcp(new StridedMap(lib, numGlobalElements, numLocalElements, indexBase, stridingInfo, comm, stridedBlockId, offset, node));
103  }
104 
105  static RCP<StridedMap> Build(const RCP<const Map>& map, std::vector<size_t>& stridingInfo, LocalOrdinal stridedBlockId = -1, GlobalOrdinal offset = 0) {
106  return rcp(new StridedMap(map, stridingInfo, map->getIndexBase(), stridedBlockId, offset));
107  }
108 
109  // special constructor for generating a given subblock of a strided map
110  static RCP<StridedMap> Build(const RCP<const StridedMap>& map, LocalOrdinal stridedBlockId) {
112  "Xpetra::StridedMapFactory::Build: constructor expects stridedBlockId > -1.");
113  TEUCHOS_TEST_FOR_EXCEPTION(map->getStridedBlockId() != -1, Exceptions::RuntimeError,
114  "Xpetra::StridedMapFactory::Build: constructor expects a full map (stridedBlockId == -1).");
115 
116  std::vector<size_t> stridingInfo = map->getStridingData();
117 
118  Teuchos::ArrayView<const GlobalOrdinal> dofGids = map->getNodeElementList();
119  // std::sort(dofGids.begin(),dofGids.end()); // TODO: do we need this?
120 
121  // determine nStridedOffset
122  size_t nStridedOffset = 0;
123  for (int j = 0; j < map->getStridedBlockId(); j++)
124  nStridedOffset += stridingInfo[j];
125 
126  size_t numMyBlockDofs = (stridingInfo[stridedBlockId] * map->getNodeNumElements()) / map->getFixedBlockSize();
127  std::vector<GlobalOrdinal> subBlockDofGids(numMyBlockDofs);
128 
129  // TODO fill vector with dofs
130  LocalOrdinal ind = 0;
131  for (typename Teuchos::ArrayView< const GlobalOrdinal >::iterator it = dofGids.begin(); it!=dofGids.end(); ++it)
132  if (map->GID2StridingBlockId(*it) == Teuchos::as<size_t>(stridedBlockId))
133  subBlockDofGids[ind++] = *it;
134 
135  const Teuchos::ArrayView<const GlobalOrdinal> subBlockDofGids_view(&subBlockDofGids[0],subBlockDofGids.size());
136 
137  return rcp(new StridedMap(map->lib(), Teuchos::OrdinalTraits<global_size_t>::invalid(), subBlockDofGids_view, map->getIndexBase(), stridingInfo, map->getComm(), stridedBlockId, map->getNode()));
138  }
139 
141  static RCP<StridedMap> Build(const StridedMap& map) {
142  XPETRA_MONITOR("MapFactory::Build");
143 
144  LocalOrdinal N = map.getNodeNumElements();
147  for (LocalOrdinal i = 0; i < N; i++)
148  newElements[i] = oldElements[i];
149 
150  std::vector<size_t> strData = map.getStridingData();
151  return rcp(new StridedMap(map.lib(), map.getGlobalNumElements(), newElements, map.getIndexBase(), strData, map.getComm(), map.getStridedBlockId(), map.getNode()));
152 
153  //XPETRA_FACTORY_END;
154  }
155 
157  static RCP<StridedMap>
159  global_size_t numGlobalElements,
160  const Teuchos::ArrayView<const GlobalOrdinal> &elementList,
161  GlobalOrdinal indexBase,
162  std::vector<size_t>& stridingInfo,
163  const Teuchos::RCP<const Teuchos::Comm<int> > &comm,
164  LocalOrdinal stridedBlockId = -1, // FIXME (mfh 03 Sep 2014) This breaks if LocalOrdinal is unsigned
165  GlobalOrdinal offset = 0,
166  const Teuchos::RCP<Node> &node = defaultArgNode())
167  {
168  return rcp (new StridedMap (lib, numGlobalElements, elementList,
169  indexBase, stridingInfo, comm,
170  stridedBlockId, node));
171  }
172  };
173 }
174 
175 #define XPETRA_STRIDEDMAPFACTORY_SHORT
176 #endif
177 //TODO: removed unused methods
LocalOrdinal getStridedBlockId() const
GlobalOrdinal global_ordinal_type
iterator begin() const
static RCP< StridedMap > Build(const RCP< const Map > &map, std::vector< size_t > &stridingInfo, LocalOrdinal stridedBlockId=-1, GlobalOrdinal offset=0)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Teuchos::ArrayView< const GlobalOrdinal > getNodeElementList() const
Return a list of the global indices owned by this node.
Xpetra namespace
static RCP< StridedMap > Build(UnderlyingLib lib, global_size_t numGlobalElements, size_t numLocalElements, GlobalOrdinal indexBase, std::vector< size_t > &stridingInfo, const Teuchos::RCP< const Teuchos::Comm< int > > &comm, LocalOrdinal stridedBlockId=-1, GlobalOrdinal offset=0, const Teuchos::RCP< Node > &node=defaultArgNode())
Map constructor with a user-defined contiguous distribution.
Exception throws to report errors in the internal logical of the program.
Teuchos::RCP< const Teuchos::Comm< int > > getComm() const
Get the Comm object for this Map.
Teuchos::RCP< Node > getNode() const
Get the Node object for this Map.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
static RCP< StridedMap > Build(UnderlyingLib lib, global_size_t numGlobalElements, const Teuchos::ArrayView< const GlobalOrdinal > &elementList, GlobalOrdinal indexBase, std::vector< size_t > &stridingInfo, const Teuchos::RCP< const Teuchos::Comm< int > > &comm, LocalOrdinal stridedBlockId=-1, GlobalOrdinal offset=0, const Teuchos::RCP< Node > &node=defaultArgNode())
Map constructor with a user-defined contiguous distribution. (for experts only. There is no special c...
static RCP< StridedMap > Build(const StridedMap &map)
Create copy of existing map (this just creates a copy of your map, it&#39;s not a clone in the sense of T...
static RCP< StridedMap > 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, const Teuchos::RCP< Node > &node=defaultArgNode())
Map constructor with Xpetra-defined contiguous uniform distribution.
std::vector< size_t > getStridingData() const
size_t getNodeNumElements() const
Returns the number of elements belonging to the calling node.
size_t global_size_t
Global size_t object.
GlobalOrdinal getIndexBase() const
Returns the index base for this Map.
global_size_t getGlobalNumElements() const
Returns the number of elements in this Map.
UnderlyingLib lib() const
Get the library used by this object (Tpetra or Epetra?)
iterator end() const
StridedMapFactory()
Private constructor. This is a static class.
#define XPETRA_MONITOR(funcName)
static Teuchos::RCP< Node > defaultArgNode()
static RCP< StridedMap > Build(const RCP< const StridedMap > &map, LocalOrdinal stridedBlockId)
Class that stores a strided map.