50 #ifndef _ZOLTAN2_ALGMETIS_HPP_
51 #define _ZOLTAN2_ALGMETIS_HPP_
57 #ifdef HAVE_ZOLTAN2_METIS
63 template <
typename Adapter>
68 const RCP<const typename Adapter::base_adapter_t> adapter;
69 const RCP<Teuchos::ParameterList> pl;
70 const RCP<const Teuchos::Comm<int> > comm;
71 RCP<const Environment> env;
77 const RCP<const typename Adapter::base_adapter_t> &adapter__,
78 const RCP<Teuchos::ParameterList> &pl__,
79 const RCP<
const Teuchos::Comm<int> > &comm__,
80 RCP<const Environment> &env__,
82 ) : adapter(adapter__), pl(pl__), comm(comm__), env(env__), graphFlags(graphFlags__)
87 throw std::logic_error(
"AlgMetis does not yet support global ordering.");
93 #ifndef HAVE_ZOLTAN2_METIS
95 throw std::runtime_error(
96 "BUILD ERROR: Metis requested but not compiled into Zoltan2.\n"
97 "Please set CMake flag Zoltan2_ENABLE_METIS:BOOL=ON.");
101 typedef typename Adapter::offset_t offset_t;
102 typedef typename Adapter::scalar_t
scalar_t;
108 const size_t nVtx = model->getLocalNumVertices();
109 const size_t nNnz = model->getLocalNumEdges();
110 lno_t *perm = (lno_t *) (solution->getPermutationRCP().getRawPtr());
112 if (nVtx > 0 && nNnz > 0) {
113 ArrayView<const gno_t> edgeIds;
114 ArrayView<const offset_t> offsets;
115 ArrayView<StridedData<lno_t, scalar_t> > wgts;
116 model->getEdgeList(edgeIds, offsets, wgts);
119 using Zoltan2OffsetView =
typename Kokkos::View<offset_t*, Kokkos::HostSpace>;
120 using Zoltan2EdgeView =
typename Kokkos::View<gno_t*, Kokkos::HostSpace>;
121 Zoltan2OffsetView zoltan2_rowptr (const_cast<offset_t*>(offsets.data()), nVtx+1);
122 Zoltan2EdgeView zoltan2_colidx (const_cast<gno_t*>(edgeIds.data()), nNnz);
124 using MetisIdxView =
typename Kokkos::View<idx_t*, Kokkos::HostSpace>;
125 MetisIdxView metis_rowptr;
126 MetisIdxView metis_colidx;
129 KokkosKernels::Impl::symmetrize_graph_symbolic_hashmap<
130 Zoltan2OffsetView, Zoltan2EdgeView, MetisIdxView, MetisIdxView, Kokkos::HostSpace::execution_space>
131 (nVtx, zoltan2_rowptr, zoltan2_colidx, metis_rowptr, metis_colidx);
137 idx_t nnz = metis_rowptr(0);
139 for (idx_t i = 0; i < metis_nVtx; i++) {
140 for (idx_t k = old_nnz; k < metis_rowptr(i+1); k++) {
141 if (metis_colidx(k) != i) {
142 metis_colidx(nnz) = metis_colidx(k);
146 old_nnz = metis_rowptr(i+1);
147 metis_rowptr(i+1) = nnz;
151 idx_t *metis_perm =
new idx_t[nVtx];
152 idx_t *metis_iperm =
new idx_t[nVtx];
155 int info = METIS_NodeND(&metis_nVtx, metis_rowptr.data(), metis_colidx.data(),
156 NULL, NULL, metis_perm, metis_iperm);
157 if (METIS_OK != info) {
158 throw std::runtime_error(std::string(
"METIS_NodeND returned info = " + info));
162 for (
size_t i = 0; i < nVtx; i++)
165 delete [] metis_iperm;
166 delete [] metis_perm;
168 for (
size_t i = 0; i < nVtx; i++)
172 solution->setHavePerm(
true);
std::bitset< NUM_MODEL_FLAGS > modelFlag_t
map_t::global_ordinal_type gno_t
Defines the OrderingSolution class.
AlgMetis(const RCP< const typename Adapter::base_adapter_t > &adapter__, const RCP< Teuchos::ParameterList > &pl__, const RCP< const Teuchos::Comm< int > > &comm__, RCP< const Environment > &env__, const modelFlag_t &graphFlags__)
Adapter::scalar_t scalar_t
Algorithm defines the base class for all algorithms.
map_t::local_ordinal_type lno_t
static void ASSIGN(first_t &a, second_t b)
Traits class to handle conversions between gno_t/lno_t and TPL data types (e.g., ParMETIS's idx_t...
int globalOrder(const RCP< GlobalOrderingSolution< typename Adapter::gno_t > > &)
Ordering method.
GraphModel defines the interface required for graph models.
int localOrder(const RCP< LocalOrderingSolution< typename Adapter::lno_t > > &solution)
Ordering method.
Defines the GraphModel interface.