Tpetra parallel linear algebra
Version of the Day
Toggle main menu visibility
Loading...
Searching...
No Matches
core
inout
Tpetra_Distribution.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
// Build maps for 1D or 2D matrix distribution
43
// Assumes square matrix
44
// Karen Devine, SNL
45
//
46
47
#ifndef __TPETRA_DISTRIBUTION_HPP
48
#define __TPETRA_DISTRIBUTION_HPP
49
50
#include <cstdio>
51
#include <cstdlib>
52
#include <iostream>
53
#include <fstream>
54
#include <set>
55
#ifndef __cplusplus
56
#define __cplusplus
57
#endif
58
59
#include "Teuchos_Comm.hpp"
60
61
namespace
Tpetra
62
{
63
64
enum
DistributionType {
65
TwoDRandom,
// 2D randomly permuted distribution
66
TwoDLinear,
// 2D linear distribution
67
TwoDVec,
// 2D distribution based on vector assignment in file
68
OneDRandom,
// 1D randomly permuted distribution
69
OneDLinear,
// 1D linear distribution
70
OneDVec,
// 1D distribution based on vector assignment in file
71
LowerTriangularBlock,
// Seher Acer's lower-triangular block distrib
72
// for triangle counting
73
MMFile
// Use values in matrix-market file as part assignment
74
};
75
77
template
<
typename
gno_t,
typename
scalar_t>
78
class
Distribution {
79
public
:
80
81
Distribution(
size_t
nrows_,
82
const
Teuchos::RCP<
const
Teuchos::Comm<int> > &comm_,
83
const
Teuchos::ParameterList ¶ms) :
84
comm(comm_), me(comm_->getRank()), np(comm_->getSize()),
85
nrows(nrows_) { }
86
87
virtual
~Distribution() {};
88
89
// Return the DistributionType for this distribution.
90
virtual
enum
DistributionType DistType() = 0;
91
92
// Return whether this rank owns nonzero (i,j)
93
virtual
bool
Mine(gno_t i, gno_t j) = 0;
94
virtual
bool
Mine(gno_t i, gno_t j,
int
p) = 0;
95
96
// Return whether this rank owns vector entry i
97
virtual
bool
VecMine(gno_t i) = 0;
98
99
// Map of nonzeros needed for redistribution, handy for other things
100
using
NZindex_t = std::pair<gno_t, gno_t>;
101
struct
compareNzIndex {
// sort nonzeros by row, then column
102
bool
operator() (
const
NZindex_t &lhs,
const
NZindex_t &rhs)
const
103
{
if
(lhs.first < rhs.first)
return
true
;
104
if
((lhs.first == rhs.first) && (lhs.second < rhs.second))
return
true
;
105
return
false
;
106
}
107
};
108
109
using
LocalNZmap_t = std::map<NZindex_t, scalar_t, compareNzIndex>;
110
111
// Redistribute nonzeros according to the needs of the Distribution
112
// Needed only when the final distribution cannot be determined until
113
// all nonzeros are known (e.g., final distribution depends on the number
114
// of nonzeros in a row).
115
// If the final distribution can be determined before all nonzeros (e.g.,
116
// Trilinos' traditional row map), the redistribution routine is a no-op.
117
// Thus, the default implementation is a no-op.
118
virtual
void
Redistribute(LocalNZmap_t &localNZ) { };
119
120
121
protected
:
122
const
Teuchos::RCP<const Teuchos::Comm<int> > comm;
123
int
me;
// my rank
124
int
np;
// number of ranks
125
size_t
nrows;
// global number of rows in the input matrix
126
127
int
HashToProc(gno_t i) {
128
// TODO PUT A GOOD HASH FUNCTION HERE!!!
129
// TODO FOR INITIAL TESTING, USE A CYCLIC HASH. LAME!
130
return
(i % np);
131
}
132
};
133
134
}
135
136
#include "Tpetra_Distribution2D.hpp"
137
#include "Tpetra_Distribution1D.hpp"
138
#include "Tpetra_DistributionMM.hpp"
139
#include "Tpetra_DistributionLowerTriangularBlock.hpp"
140
141
#endif
Tpetra
Namespace Tpetra contains the class and methods constituting the Tpetra library.
Generated by
1.17.0