Tpetra parallel linear algebra  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
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 
123  template<class LocalOrdinal,
124  class GlobalOrdinal,
125  class Node>
126  class Directory : public Teuchos::Describable {
127  public:
130 
132 
133 
138  Directory ();
139 
141  ~Directory ();
142 
144  void initialize (const map_type& map);
145 
147  void
148  initialize (const map_type& map,
150 
152  bool initialized () const;
153 
172 #ifdef TPETRA_ENABLE_DEPRECATED_CODE
173  template <class Node2>
174  Teuchos::RCP<Directory<LocalOrdinal,GlobalOrdinal,Node2> > TPETRA_DEPRECATED
175  clone (const Map<LocalOrdinal,GlobalOrdinal,Node2>& clone_map) const
176  {
177  using Teuchos::RCP;
178  typedef LocalOrdinal LO;
179  typedef GlobalOrdinal GO;
180 
181  RCP<Directory<LO, GO, Node2> > dir (new Directory<LO, GO, Node2> ());
182  if (clone_map.isDistributed ()) {
183  if (clone_map.isUniform ()) {
184  typedef ::Tpetra::Details::ContiguousUniformDirectory<LO, GO, Node> impl_type;
185  const impl_type* theImpl = dynamic_cast<const impl_type*> (impl_);
186  TEUCHOS_TEST_FOR_EXCEPTION(
187  theImpl == NULL, std::logic_error, "Tpetra::Directory::clone: "
188  "The input Map claims to be distributed, contiguous, and uniform, "
189  "but its Directory's implementation type does not match that assumption. "
190  "Please report this bug to the Tpetra developers.");
191  dir->impl_ = theImpl->template clone<Node2> (clone_map);
192  }
193  else if (clone_map.isContiguous ()) {
194  typedef ::Tpetra::Details::DistributedContiguousDirectory<LO, GO, Node> impl_type;
195  const impl_type* theImpl = dynamic_cast<const impl_type*> (impl_);
196  TEUCHOS_TEST_FOR_EXCEPTION(
197  theImpl == NULL, std::logic_error, "Tpetra::Directory::clone: "
198  "The input Map claims to be distributed and contiguous, but its "
199  "Directory's implementation type does not match that assumption. "
200  "Please report this bug to the Tpetra developers.");
201  dir->impl_ = theImpl->template clone<Node2> (clone_map);
202  }
203  else { // not contiguous
204  typedef ::Tpetra::Details::DistributedNoncontiguousDirectory<LO, GO, Node> impl_type;
205  const impl_type* theImpl = dynamic_cast<const impl_type*> (impl_);
206  TEUCHOS_TEST_FOR_EXCEPTION(
207  theImpl == NULL, std::logic_error, "Tpetra::Directory::clone: "
208  "The input Map claims to be noncontiguous, but its "
209  "Directory's implementation type does not match that assumption. "
210  "Please report this bug to the Tpetra developers.");
211  dir->impl_ = theImpl->template clone<Node2> (clone_map);
212  }
213  }
214  else { // locally replicated (not distributed)
215  typedef ::Tpetra::Details::ReplicatedDirectory<LO, GO, Node> impl_type;
216  const impl_type* theImpl = dynamic_cast<const impl_type*> (impl_);
217  TEUCHOS_TEST_FOR_EXCEPTION(
218  theImpl == NULL, std::logic_error, "Tpetra::Directory::clone: "
219  "The input Map claims to be locally replicated, but its "
220  "Directory's implementation type does not match that assumption. "
221  "Please report this bug to the Tpetra developers.");
222  dir->impl_ = theImpl->template clone<Node2> (clone_map);
223  }
224  return dir;
225  }
226 #endif
227 
229 
231 
233  std::string description () const;
234 
236 
238 
265  getDirectoryEntries (const map_type& map,
266  const Teuchos::ArrayView<const GlobalOrdinal>& globalIDs,
267  const Teuchos::ArrayView<int>& nodeIDs) const;
268 
305  getDirectoryEntries (const map_type& map,
306  const Teuchos::ArrayView<const GlobalOrdinal>& globalIDs,
307  const Teuchos::ArrayView<int>& nodeIDs,
308  const Teuchos::ArrayView<LocalOrdinal>& localIDs) const;
309 
316  bool isOneToOne (const map_type& map) const;
317 
319  private:
326  typedef ::Tpetra::Details::Directory<LocalOrdinal, GlobalOrdinal, Node> base_type;
327 
332  const base_type* impl_;
333 
335  Directory (const Directory<LocalOrdinal, GlobalOrdinal, Node>& directory);
336 
337  template <class LO, class GO, class N> friend class Directory;
338 
340  Directory<LocalOrdinal, GlobalOrdinal, Node>&
341  operator= (const Directory<LocalOrdinal, GlobalOrdinal, Node>& source);
342  }; // class Directory
343 
344 } // namespace Tpetra
345 
346 #endif // TPETRA_DIRECTORY_DECL_HPP
347 
Interface for breaking ties in ownership.
Interface for breaking ties in ownership.
bool isContiguous() const
True if this Map is distributed contiguously, else false.
Map< LocalOrdinal, GlobalOrdinal, Node > map_type
Type of the Map specialization to give to the constructor.
LookupStatus
Return status of Map remote index lookup (getRemoteIndexList()).
bool isUniform() const
Whether the range of global indices is uniform.
bool isDistributed() const
Whether this Map is globally distributed or locally replicated.
Declaration of the Tpetra::Map class and related nonmember constructors.
bool isOneToOne(const map_type &map) const
Whether the Directory&#39;s input Map is (globally) one to one.
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.
A parallel distribution of indices over processes.
Implement mapping from global ID to process ID and local ID.
bool initialized() const
Whether the Directory is initialized.
void initialize(const map_type &map)
Initialize the Directory with its Map.
Directory()
Default constructor: the only one you should use.
Declaration of implementation details of Tpetra::Directory.
std::string description() const
A one-line human-readable description of this object.