50#ifndef _ZOLTAN2_ALGMETIS_HPP_
51#define _ZOLTAN2_ALGMETIS_HPP_
57#ifdef HAVE_ZOLTAN2_METIS
63template <
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.");
99 typedef typename Adapter::gno_t
gno_t;
100 typedef typename Adapter::lno_t
lno_t;
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);
Defines the GraphModel interface.
Defines the OrderingSolution class.
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.
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__)
int localOrder(const RCP< LocalOrderingSolution< typename Adapter::lno_t > > &solution)
Ordering method.
Algorithm defines the base class for all algorithms.
Adapter::scalar_t scalar_t
GraphModel defines the interface required for graph models.
Created by mbenlioglu on Aug 31, 2020.
std::bitset< NUM_MODEL_FLAGS > modelFlag_t
static void ASSIGN(first_t &a, second_t b)