Tpetra parallel linear algebra  Version of the Day
Tpetra_Directory_decl.hpp
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Tpetra: Templated Linear Algebra Services Package
5 // Copyright (2008) Sandia Corporation
6 //
7 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
8 // the U.S. Government retains certain rights in this software.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
38 //
39 // ************************************************************************
40 // @HEADER
41 
42 #ifndef TPETRA_DIRECTORY_DECL_HPP
43 #define TPETRA_DIRECTORY_DECL_HPP
44 
45 #include "Tpetra_ConfigDefs.hpp"
46 #include "Tpetra_Map_decl.hpp"
48 #include "Tpetra_TieBreak.hpp"
49 #include <Teuchos_Describable.hpp>
50 
51 namespace Tpetra {
52 
59 namespace Classes {
60 
131  template<class LocalOrdinal = ::Tpetra::Details::DefaultTypes::local_ordinal_type,
132  class GlobalOrdinal = ::Tpetra::Details::DefaultTypes::global_ordinal_type,
134  class Directory : public Teuchos::Describable {
135  public:
138 
140 
141 
146  Directory ();
147 
149  ~Directory ();
150 
152  void initialize (const map_type& map);
153 
155  void
156  initialize (const map_type& map,
158 
160  bool initialized () const;
161 
180  template <class Node2>
181  Teuchos::RCP<Directory<LocalOrdinal,GlobalOrdinal,Node2> >
183  {
184  using Teuchos::RCP;
185  typedef LocalOrdinal LO;
186  typedef GlobalOrdinal GO;
187 
188  RCP<Directory<LO, GO, Node2> > dir (new Directory<LO, GO, Node2> ());
189  if (clone_map.isDistributed ()) {
190  if (clone_map.isUniform ()) {
191  typedef ::Tpetra::Details::ContiguousUniformDirectory<LO, GO, Node> impl_type;
192  const impl_type* theImpl = dynamic_cast<const impl_type*> (impl_);
193  TEUCHOS_TEST_FOR_EXCEPTION(
194  theImpl == NULL, std::logic_error, "Tpetra::Directory::clone: "
195  "The input Map claims to be distributed, contiguous, and uniform, "
196  "but its Directory's implementation type does not match that assumption. "
197  "Please report this bug to the Tpetra developers.");
198  dir->impl_ = theImpl->template clone<Node2> (clone_map);
199  }
200  else if (clone_map.isContiguous ()) {
201  typedef ::Tpetra::Details::DistributedContiguousDirectory<LO, GO, Node> impl_type;
202  const impl_type* theImpl = dynamic_cast<const impl_type*> (impl_);
203  TEUCHOS_TEST_FOR_EXCEPTION(
204  theImpl == NULL, std::logic_error, "Tpetra::Directory::clone: "
205  "The input Map claims to be distributed and contiguous, but its "
206  "Directory's implementation type does not match that assumption. "
207  "Please report this bug to the Tpetra developers.");
208  dir->impl_ = theImpl->template clone<Node2> (clone_map);
209  }
210  else { // not contiguous
211  typedef ::Tpetra::Details::DistributedNoncontiguousDirectory<LO, GO, Node> impl_type;
212  const impl_type* theImpl = dynamic_cast<const impl_type*> (impl_);
213  TEUCHOS_TEST_FOR_EXCEPTION(
214  theImpl == NULL, std::logic_error, "Tpetra::Directory::clone: "
215  "The input Map claims to be noncontiguous, but its "
216  "Directory's implementation type does not match that assumption. "
217  "Please report this bug to the Tpetra developers.");
218  dir->impl_ = theImpl->template clone<Node2> (clone_map);
219  }
220  }
221  else { // locally replicated (not distributed)
222  typedef ::Tpetra::Details::ReplicatedDirectory<LO, GO, Node> impl_type;
223  const impl_type* theImpl = dynamic_cast<const impl_type*> (impl_);
224  TEUCHOS_TEST_FOR_EXCEPTION(
225  theImpl == NULL, std::logic_error, "Tpetra::Directory::clone: "
226  "The input Map claims to be locally replicated, but its "
227  "Directory's implementation type does not match that assumption. "
228  "Please report this bug to the Tpetra developers.");
229  dir->impl_ = theImpl->template clone<Node2> (clone_map);
230  }
231  return dir;
232  }
233 
235 
237 
239  std::string description () const;
240 
242 
244 
271  getDirectoryEntries (const map_type& map,
272  const Teuchos::ArrayView<const GlobalOrdinal>& globalIDs,
273  const Teuchos::ArrayView<int>& nodeIDs) const;
274 
311  getDirectoryEntries (const map_type& map,
312  const Teuchos::ArrayView<const GlobalOrdinal>& globalIDs,
313  const Teuchos::ArrayView<int>& nodeIDs,
314  const Teuchos::ArrayView<LocalOrdinal>& localIDs) const;
315 
322  bool isOneToOne (const map_type& map) const;
323 
325  private:
332  typedef ::Tpetra::Details::Directory<LocalOrdinal, GlobalOrdinal, Node> base_type;
333 
338  const base_type* impl_;
339 
342 
343  template <class LO, class GO, class N> friend class Directory;
344 
347  operator= (const Directory<LocalOrdinal, GlobalOrdinal, Node>& source);
348  }; // class Directory
349 
350 } // namespace Classes
351 
352 } // namespace Tpetra
353 
354 #endif // TPETRA_DIRECTORY_DECL_HPP
355 
Namespace Tpetra contains the class and methods constituting the Tpetra library.
bool initialized() const
Whether the Directory is initialized.
Interface for breaking ties in ownership.
LookupStatus
Return status of Map remote index lookup (getRemoteIndexList()).
int local_ordinal_type
Default value of Scalar template parameter.
void initialize(const map_type &map)
Initialize the Directory with its Map.
bool isOneToOne(const map_type &map) const
Whether the Directory&#39;s input Map is (globally) one to one.
Teuchos::RCP< Directory< LocalOrdinal, GlobalOrdinal, Node2 > > clone(const Map< LocalOrdinal, GlobalOrdinal, Node2 > &clone_map) const
Clone the Directory for a different Node type, using a cloned Map.
Declaration of the Tpetra::Map class and related nonmember constructors.
bool isContiguous() const
True if this Map is distributed contiguously, else false.
Directory()
Default constructor: the only one you should use.
LookupStatus getDirectoryEntries(const map_type &map, const Teuchos::ArrayView< const GlobalOrdinal > &globalIDs, const Teuchos::ArrayView< int > &nodeIDs) const
Given a global ID list, return the list of their owning process IDs.
Implement mapping from global ID to process ID and local ID.
std::string description() const
A one-line human-readable description of this object.
::Kokkos::Compat::KokkosDeviceWrapperNode< execution_space > node_type
Default value of Node template parameter.
bool isDistributed() const
Whether this Map is globally distributed or locally replicated.
Computes the local ID and process ID corresponding to given global IDs.
A parallel distribution of indices over processes.
Map< LocalOrdinal, GlobalOrdinal, Node > map_type
Type of the Map specialization to give to the constructor.
Declaration of implementation details of Tpetra::Directory.
Interface for breaking ties in ownership.
bool isUniform() const
Whether the range of global indices is uniform.