48 #ifndef _ZOLTAN2_SPHYNXALGORITHM_HPP_
49 #define _ZOLTAN2_SPHYNXALGORITHM_HPP_
74 #include "Zoltan2Sphynx_config.h"
82 #include "AnasaziLOBPCGSolMgr.hpp"
83 #include "AnasaziBasicEigenproblem.hpp"
84 #include "AnasaziTpetraAdapter.hpp"
86 #include "BelosLinearProblem.hpp"
87 #include "BelosTpetraOperator.hpp"
89 #include "Ifpack2_Factory.hpp"
91 #include "Teuchos_TimeMonitor.hpp"
93 #ifdef HAVE_ZOLTAN2SPHYNX_MUELU
94 #include "MueLu_CreateTpetraPreconditioner.hpp"
99 template <
typename Adapter>
113 using graph_t = Tpetra::CrsGraph<lno_t, gno_t, node_t>;
114 using matrix_t = Tpetra::CrsMatrix<scalar_t, lno_t, gno_t, node_t>;
115 using mvector_t = Tpetra::MultiVector<scalar_t, lno_t, gno_t, node_t>;
116 using op_t = Tpetra::Operator<scalar_t, lno_t, gno_t, node_t>;
125 Sphynx(
const RCP<const Environment> &env,
126 const RCP<Teuchos::ParameterList> ¶ms,
127 const RCP<
const Comm<int> > &comm,
129 env_(env), params_(params), comm_(comm), adapter_(adapter)
133 const Teuchos::ParameterEntry *pe = params_->getEntryPtr(
"num_global_parts");
134 numGlobalParts_ = pe->getValue<
int>(&numGlobalParts_);
135 if(numGlobalParts_ > 1){
137 Teuchos::TimeMonitor t(*Teuchos::TimeMonitor::getNewTimer(
"Sphynx::Laplacian"));
140 pe = params_->getEntryPtr(
"sphynx_verbosity");
142 verbosity_ = pe->getValue<
int>(&verbosity_);
145 pe = params_->getEntryPtr(
"sphynx_skip_preprocessing");
147 skipPrep_ = pe->getValue<
bool>(&skipPrep_);
152 graph_ = adapter_->getUserGraph();
154 throw std::runtime_error(
"\nSphynx Error: Preprocessing has not been implemented yet.\n");
181 template<
typename problem_t>
184 template<
typename problem_t>
187 template<
typename problem_t>
190 template<
typename problem_t>
200 std::vector<int> strides);
204 std::vector<const weight_t *>
weights,
205 std::vector<int> strides,
221 auto rowOffsets = graph_->getLocalGraphDevice().row_map;
222 auto rowOffsets_h = Kokkos::create_mirror_view(rowOffsets);
223 Kokkos::deep_copy(rowOffsets_h, rowOffsets);
226 const size_t numGlobalEntries = graph_->getGlobalNumEntries();
227 const size_t numLocalRows = graph_->getNodeNumRows();
228 const size_t numGlobalRows = graph_->getGlobalNumRows();
232 for(
size_t i = 0; i < numLocalRows; i++){
233 if(rowOffsets_h(i+1) - rowOffsets_h(i) - 1 > localMax)
234 localMax = rowOffsets_h(i+1) - rowOffsets_h(i) - 1;
238 size_t globalMax = 0;
239 Teuchos::reduceAll<int, size_t> (*comm_, Teuchos::REDUCE_MAX, 1, &localMax, &globalMax);
241 double avg =
static_cast<double>(numGlobalEntries-numGlobalRows)/numGlobalRows;
242 double maxOverAvg =
static_cast<double>(globalMax)/avg;
246 if(maxOverAvg > 10) {
252 if(comm_->getRank() == 0) {
253 std::cout <<
"Determining Regularity -- max degree: " << globalMax
254 <<
", avg degree: " << avg <<
", max/avg: " << globalMax/avg << std::endl
255 <<
"Determined Regularity -- regular: " << !irregular_ << std::endl;
276 precType_ =
"jacobi";
277 #ifdef HAVE_ZOLTAN2SPHYNX_MUELU
282 const Teuchos::ParameterEntry *pe = params_->getEntryPtr(
"sphynx_preconditioner_type");
284 precType_ = pe->getValue<std::string>(&precType_);
285 if(precType_ !=
"muelu" && precType_ !=
"jacobi" && precType_ !=
"polynomial")
286 throw std::runtime_error(
"\nSphynx Error: " + precType_ +
" is not recognized as a preconditioner.\n"
287 +
" Possible values: muelu (if enabled), jacobi, and polynomial\n");
293 if(precType_ ==
"polynomial")
300 pe = params_->getEntryPtr(
"sphynx_problem_type");
302 std::string probType =
"";
303 probType = pe->getValue<std::string>(&probType);
305 if(probType ==
"combinatorial")
307 else if(probType ==
"generalized")
309 else if(probType ==
"normalized")
312 throw std::runtime_error(
"\nSphynx Error: " + probType +
" is not recognized as a problem type.\n"
313 +
" Possible values: combinatorial, generalized, and normalized.\n");
319 if(!irregular_ && (precType_ ==
"jacobi" || precType_ ==
"polynomial"))
324 pe = params_->getEntryPtr(
"sphynx_tolerance");
326 tolerance_ = pe->getValue<
scalar_t>(&tolerance_);
335 pe = params_->getEntryPtr(
"sphynx_initial_guess");
337 std::string initialGuess =
"";
338 initialGuess = pe->getValue<std::string>(&initialGuess);
340 if(initialGuess ==
"random")
342 else if(initialGuess ==
"constants")
345 throw std::runtime_error(
"\nSphynx Error: " + initialGuess +
" is not recognized as an option for initial guess.\n"
346 +
" Possible values: random and constants.\n");
371 auto rowOffsets = graph_->getLocalGraphHost().row_map;
374 Teuchos::RCP<matrix_t> degMat(
new matrix_t (graph_->getRowMap(),
376 1, Tpetra::StaticProfile));
380 lno_t numRows =
static_cast<lno_t>(graph_->getNodeNumRows());
383 for (
lno_t i = 0; i < numRows; ++i) {
384 val[0] = rowOffsets(i+1) - rowOffsets(i) - 1;
386 degMat->insertLocalValues(i, 1, val, ind);
391 degMat->fillComplete(graph_->getDomainMap(), graph_->getRangeMap());
403 using range_policy = Kokkos::RangePolicy<
404 typename node_t::device_type::execution_space, Kokkos::IndexType<lno_t>>;
405 using values_view_t = Kokkos::View<scalar_t*, typename node_t::device_type>;
406 using offset_view_t = Kokkos::View<size_t*, typename node_t::device_type>;
408 const size_t numEnt = graph_->getNodeNumEntries();
409 const size_t numRows = graph_->getNodeNumRows();
412 values_view_t newVal (Kokkos::view_alloc(
"CombLapl::val", Kokkos::WithoutInitializing), numEnt);
413 Kokkos::deep_copy(newVal, -1);
416 offset_view_t diagOffsets(Kokkos::view_alloc(
"Diag Offsets", Kokkos::WithoutInitializing), numRows);
417 graph_->getLocalDiagOffsets(diagOffsets);
420 auto rowOffsets = graph_->getLocalGraphDevice().row_map;
423 Kokkos::parallel_for(
"Combinatorial Laplacian", range_policy(0, numRows),
424 KOKKOS_LAMBDA(
const lno_t i){
425 newVal(rowOffsets(i) + diagOffsets(i)) = rowOffsets(i+1) - rowOffsets(i) - 1;
431 Teuchos::RCP<matrix_t> laplacian (
new matrix_t(graph_, newVal));
432 laplacian->fillComplete (graph_->getDomainMap(), graph_->getRangeMap());
446 using range_policy = Kokkos::RangePolicy<
447 typename node_t::device_type::execution_space, Kokkos::IndexType<lno_t>>;
448 using values_view_t = Kokkos::View<scalar_t*, typename node_t::device_type>;
449 using offset_view_t = Kokkos::View<size_t*, typename node_t::device_type>;
450 using vector_t = Tpetra::Vector<scalar_t, lno_t, gno_t, node_t>;
451 using dual_view_t =
typename vector_t::dual_view_type;
452 using KAT = Kokkos::Details::ArithTraits<scalar_t>;
454 const size_t numEnt = graph_->getNodeNumEntries();
455 const size_t numRows = graph_->getNodeNumRows();
458 values_view_t newVal (Kokkos::view_alloc(
"NormLapl::val", Kokkos::WithoutInitializing), numEnt);
459 Kokkos::deep_copy(newVal, -1);
462 dual_view_t dv (
"MV::DualView", numRows, 1);
463 auto deginvsqrt = dv.d_view;
466 offset_view_t diagOffsets(Kokkos::view_alloc(
"Diag Offsets", Kokkos::WithoutInitializing), numRows);
467 graph_->getLocalDiagOffsets(diagOffsets);
470 auto rowOffsets = graph_->getLocalGraphDevice().row_map;
473 Kokkos::parallel_for(
"Combinatorial Laplacian", range_policy(0, numRows),
474 KOKKOS_LAMBDA(
const lno_t i){
475 newVal(rowOffsets(i) + diagOffsets(i)) = rowOffsets(i+1) - rowOffsets(i) - 1;
476 deginvsqrt(i,0) = 1.0/KAT::sqrt(rowOffsets(i+1) - rowOffsets(i) - 1);
482 Teuchos::RCP<matrix_t> laplacian (
new matrix_t(graph_, newVal));
483 laplacian->fillComplete (graph_->getDomainMap(), graph_->getRangeMap());
486 vector_t degInvSqrt(graph_->getRowMap(), dv);
489 laplacian->leftScale(degInvSqrt);
490 laplacian->rightScale(degInvSqrt);
502 const Teuchos::RCP<const Environment> env_;
503 Teuchos::RCP<Teuchos::ParameterList> params_;
504 const Teuchos::RCP<const Teuchos::Comm<int> > comm_;
505 const Teuchos::RCP<const Adapter> adapter_;
509 Teuchos::RCP<const graph_t> graph_;
510 Teuchos::RCP<matrix_t> laplacian_;
511 Teuchos::RCP<const matrix_t> degMatrix_;
512 Teuchos::RCP<mvector_t> eigenVectors_;
515 std::string precType_;
535 template <
typename Adapter>
539 if(numGlobalParts_ == 1) {
541 size_t numRows =adapter_->getUserGraph()->getNodeNumRows();
542 Teuchos::ArrayRCP<part_t> parts(numRows,0);
543 solution->setParts(parts);
550 int numEigenVectors = (int) log2(numGlobalParts_)+1;
555 if(computedNumEv <= 1) {
557 std::runtime_error(
"\nAnasazi Error: LOBPCGSolMgr::solve() returned unconverged.\n"
558 "Sphynx Error: LOBPCG could not compute any eigenvectors.\n"
559 " Increase either max iters or tolerance.\n");
568 std::vector<const weight_t *>
weights;
569 std::vector<int> wstrides;
581 template <
typename Adapter>
585 Teuchos::TimeMonitor t(*Teuchos::TimeMonitor::getNewTimer(
"Sphynx::LOBPCG"));
588 std::string which =
"SR";
589 std::string ortho =
"SVQB";
590 bool relConvTol =
false;
591 int maxIterations = 1000;
592 bool isHermitian =
true;
593 bool relLockTol =
false;
595 bool useFullOrtho =
true;
600 double solvetime = 0;
603 const Teuchos::ParameterEntry *pe;
605 pe = params_->getEntryPtr(
"sphynx_maxiterations");
607 maxIterations = pe->getValue<
int>(&maxIterations);
609 pe = params_->getEntryPtr(
"sphynx_use_full_ortho");
611 useFullOrtho = pe->getValue<
bool>(&useFullOrtho);
615 int anasaziVerbosity = Anasazi::Errors + Anasazi::Warnings;
617 anasaziVerbosity += Anasazi::FinalSummary + Anasazi::TimingDetails;
619 anasaziVerbosity += Anasazi::IterationDetails;
621 anasaziVerbosity += Anasazi::StatusTestDetails
622 + Anasazi::OrthoDetails
627 Teuchos::ParameterList anasaziParams;
628 anasaziParams.set(
"Verbosity", anasaziVerbosity);
629 anasaziParams.set(
"Which", which);
630 anasaziParams.set(
"Convergence Tolerance", tolerance_);
631 anasaziParams.set(
"Maximum Iterations", maxIterations);
632 anasaziParams.set(
"Block Size", numEigenVectors);
633 anasaziParams.set(
"Relative Convergence Tolerance", relConvTol);
634 anasaziParams.set(
"Orthogonalization", ortho);
635 anasaziParams.set(
"Use Locking", lock);
636 anasaziParams.set(
"Relative Locking Tolerance", relLockTol);
637 anasaziParams.set(
"Full Ortho", useFullOrtho);
640 RCP<mvector_t> ivec(
new mvector_t(laplacian_->getRangeMap(), numEigenVectors));
645 Anasazi::MultiVecTraits<scalar_t, mvector_t>::MvRandom(*ivec);
646 ivec->getVectorNonConst(0)->putScalar(1.);
654 ivec->getVectorNonConst(0)->putScalar(1.);
655 for (
int j = 1; j < numEigenVectors; j++)
656 ivec->getVectorNonConst(j)->putScalar(0.);
658 auto map = laplacian_->getRangeMap();
659 gno_t blockSize = map->getGlobalNumElements() / numEigenVectors;
660 TEUCHOS_TEST_FOR_EXCEPTION(blockSize <= 0, std::runtime_error,
"Blocksize too small for \"constants\" initial guess. Try \"random\".");
662 for (
size_t lid = 0; lid < ivec->getLocalLength(); lid++) {
663 gno_t gid = map->getGlobalElement(lid);
664 for (
int j = 1; j < numEigenVectors; j++){
665 if (((j-1)*blockSize <= gid) && (j*blockSize > gid))
666 ivec->replaceLocalValue(lid,j,1.);
672 using problem_t = Anasazi::BasicEigenproblem<scalar_t, mvector_t, op_t>;
673 Teuchos::RCP<problem_t> problem (
new problem_t(laplacian_, ivec));
674 problem->setHermitian(isHermitian);
675 problem->setNEV(numEigenVectors);
682 problem->setM(degMatrix_);
685 bool boolret = problem->setProblem();
686 if (boolret !=
true) {
687 throw std::runtime_error(
"\nAnasazi::BasicEigenproblem::setProblem() returned with error.\n");
691 using solver_t = Anasazi::LOBPCGSolMgr<scalar_t, mvector_t, op_t>;
692 solver_t solver(problem, anasaziParams);
694 if (verbosity_ > 0 && comm_->getRank() == 0)
695 anasaziParams.print(std::cout);
698 if (verbosity_ > 0 && comm_->getRank() == 0)
699 std::cout <<
"Beginning the LOBPCG solve..." << std::endl;
700 Anasazi::ReturnType returnCode = solver.solve();
703 if (returnCode != Anasazi::Converged) {
706 iter = solver.getNumIters();
707 solvetime = (solver.getTimers()[0])->totalElapsedTime();
711 using solution_t = Anasazi::Eigensolution<scalar_t, mvector_t>;
712 solution_t sol = problem->getSolution();
713 eigenVectors_ = sol.Evecs;
714 int numev = sol.numVecs;
717 if (verbosity_ > 0 && comm_->getRank() == 0) {
718 std::cout << std::endl;
719 std::cout <<
"LOBPCG SUMMARY" << std::endl;
720 std::cout <<
"Failed to converge: " << numfailed << std::endl;
721 std::cout <<
"No of iterations : " << iter << std::endl;
722 std::cout <<
"Solve time: " << solvetime << std::endl;
723 std::cout <<
"No of comp. vecs. : " << numev << std::endl;
733 template <
typename Adapter>
734 template <
typename problem_t>
739 if(precType_ ==
"muelu") {
742 else if(precType_ ==
"polynomial") {
745 else if(precType_ ==
"jacobi") {
752 template <
typename Adapter>
753 template <
typename problem_t>
757 #ifdef HAVE_ZOLTAN2SPHYNX_MUELU
758 Teuchos::ParameterList paramList;
760 paramList.set(
"verbosity",
"none");
761 else if(verbosity_ == 1)
762 paramList.set(
"verbosity",
"low");
763 else if(verbosity_ == 2)
764 paramList.set(
"verbosity",
"medium");
765 else if(verbosity_ == 3)
766 paramList.set(
"verbosity",
"high");
767 else if(verbosity_ >= 4)
768 paramList.set(
"verbosity",
"extreme");
770 paramList.set(
"smoother: type",
"CHEBYSHEV");
771 Teuchos::ParameterList smootherParamList;
772 smootherParamList.set(
"chebyshev: degree", 3);
773 smootherParamList.set(
"chebyshev: ratio eigenvalue", 7.0);
774 smootherParamList.set(
"chebyshev: eigenvalue max iterations", irregular_ ? 100 : 10);
775 paramList.set(
"smoother: params", smootherParamList);
776 paramList.set(
"use kokkos refactor",
true);
777 paramList.set(
"transpose: use implicit",
true);
781 paramList.set(
"multigrid algorithm",
"unsmoothed");
783 paramList.set(
"coarse: type",
"CHEBYSHEV");
784 Teuchos::ParameterList coarseParamList;
785 coarseParamList.set(
"chebyshev: degree", 3);
786 coarseParamList.set(
"chebyshev: ratio eigenvalue", 7.0);
787 paramList.set(
"coarse: params", coarseParamList);
789 paramList.set(
"max levels", 5);
790 paramList.set(
"aggregation: drop tol", 0.40);
794 using prec_t = MueLu::TpetraOperator<scalar_t, lno_t, gno_t, node_t>;
795 Teuchos::RCP<prec_t> prec = MueLu::CreateTpetraPreconditioner<
798 problem->setPrec(prec);
801 throw std::runtime_error(
"\nSphynx Error: MueLu requested but not compiled into Trilinos.\n");
807 template <
typename Adapter>
808 template <
typename problem_t>
811 int verbosity2 = Belos::Errors;
813 verbosity2 += Belos::Warnings;
814 else if(verbosity_ == 2)
815 verbosity2 += Belos::Warnings + Belos::FinalSummary;
816 else if(verbosity_ == 3)
817 verbosity2 += Belos::Warnings + Belos::FinalSummary + Belos::TimingDetails;
818 else if(verbosity_ >= 4)
819 verbosity2 += Belos::Warnings + Belos::FinalSummary + Belos::TimingDetails
820 + Belos::StatusTestDetails;
822 Teuchos::ParameterList paramList;
823 paramList.set(
"Polynomial Type",
"Roots");
824 paramList.set(
"Orthogonalization",
"ICGS");
825 paramList.set(
"Maximum Degree", laplacian_->getGlobalNumRows() > 100 ? 25 : 5);
826 paramList.set(
"Polynomial Tolerance", 1.0e-6 );
827 paramList.set(
"Verbosity", verbosity2 );
828 paramList.set(
"Random RHS",
false );
829 paramList.set(
"Outer Solver",
"");
830 paramList.set(
"Timer Label",
"Belos Polynomial Solve" );
833 using lproblem_t = Belos::LinearProblem<scalar_t, mvector_t, op_t>;
834 Teuchos::RCP<lproblem_t> innerPolyProblem(
new lproblem_t());
835 innerPolyProblem->setOperator(laplacian_);
837 using btop_t = Belos::TpetraOperator<scalar_t>;
838 Teuchos::RCP<btop_t> polySolver(
new btop_t(innerPolyProblem,
839 Teuchos::rcpFromRef(paramList),
841 problem->setPrec(polySolver);
845 template <
typename Adapter>
846 template <
typename problem_t>
850 Teuchos::RCP<Ifpack2::Preconditioner<scalar_t, lno_t, gno_t, node_t>> prec;
851 std::string precType =
"RELAXATION";
853 prec = Ifpack2::Factory::create<matrix_t> (precType, laplacian_);
855 Teuchos::ParameterList precParams;
856 precParams.set(
"relaxation: type",
"Jacobi");
857 precParams.set(
"relaxation: fix tiny diagonal entries",
true);
858 precParams.set(
"relaxation: min diagonal value", 1.0e-8);
860 prec->setParameters(precParams);
864 problem->setPrec(prec);
870 template <
typename Adapter>
876 Teuchos::Array<size_t> columns (computedNumEv-1);
877 for (
int j = 0; j < computedNumEv-1; ++j) {
890 template <
typename Adapter>
892 std::vector<int> strides)
895 int numWeights = adapter_->getNumWeightsPerVertex();
896 int numConstraints = numWeights > 0 ? numWeights : 1;
898 size_t myNumVertices = adapter_->getLocalNumVertices();
900 for(
int j = 0; j < numConstraints; j++)
905 const gno_t *columnId;
908 if(numWeights == 0) {
911 adapter_->getEdgesView(offset, columnId);
912 for (
size_t i = 0; i < myNumVertices; i++)
913 weights[0][i] = offset[i+1] - offset[i] - 1;
915 vecweights.push_back(
weights[0]);
916 strides.push_back(1);
921 for(
int j = 0; j < numConstraints; j++) {
923 if(adapter_->useDegreeAsVertexWeight(j)) {
925 adapter_->getEdgesView(offset, columnId);
926 for (
size_t i = 0; i < myNumVertices; i++)
927 weights[j][i] = offset[i+1] - offset[i];
932 adapter_->getVertexWeightsView(wgt, stride, j);
934 for (
size_t i = 0; i < myNumVertices; i++)
938 vecweights.push_back(
weights[j]);
939 strides.push_back(1);
949 template <
typename Adapter>
951 std::vector<const weight_t *>
weights,
952 std::vector<int> strides,
956 Teuchos::TimeMonitor t(*Teuchos::TimeMonitor::getNewTimer(
"Sphynx::MJ"));
965 size_t myNumVertices =
coordinates->getLocalLength();
968 Teuchos::RCP<mvector_adapter_t> adapcoordinates(
new mvector_adapter_t(
coordinates,
971 Teuchos::RCP<const base_adapter_t> baseAdapter =
972 Teuchos::rcp(
dynamic_cast<const base_adapter_t *
>(adapcoordinates.get()),
false);
976 Teuchos::RCP<const cmodel_t> coordModel (
new cmodel_t(baseAdapter, env_, comm_, flags));
979 Teuchos::RCP<const Comm<int>> comm2 = comm_;
980 Teuchos::RCP<mj_t> mj(
new mj_t(env_, comm2, coordModel));
983 Teuchos::RCP<solution_t> vectorsolution(
new solution_t(env_, comm2, 1, mj));
984 mj->partition(vectorsolution);
987 Teuchos::ArrayRCP<part_t> parts(myNumVertices);
988 for(
size_t i = 0; i < myNumVertices; i++) {
989 parts[i] = vectorsolution->getPartListView()[i];
991 solution->setParts(parts);
Contains the Multi-jagged algorthm.
Defines the CoordinateModel classes.
Defines XpetraCrsGraphAdapter class.
Defines the XpetraMultiVectorAdapter.
Algorithm defines the base class for all algorithms.
Adapter::scalar_t scalar_t
This class provides geometric coordinates with optional weights to the Zoltan2 algorithm.
A PartitioningSolution is a solution to a partitioning problem.
void setMueLuPreconditioner(Teuchos::RCP< problem_t > &problem)
void computeDegreeMatrix()
typename Adapter::offset_t offset_t
int LOBPCGwrapper(const int numEigenVectors)
Tpetra::CrsGraph< lno_t, gno_t, node_t > graph_t
void partition(const RCP< PartitioningSolution< Adapter > > &solution)
Partitioning method.
Teuchos::RCP< matrix_t > computeNormalizedLaplacian()
void eigenvecsToCoords(Teuchos::RCP< mvector_t > &eigenVectors, int computedNumEv, Teuchos::RCP< mvector_t > &coordinates)
Tpetra::MultiVector< scalar_t, lno_t, gno_t, node_t > mvector_t
typename Adapter::node_t node_t
void MJwrapper(const Teuchos::RCP< const mvector_t > &coordinates, std::vector< const weight_t * > weights, std::vector< int > strides, const Teuchos::RCP< PartitioningSolution< Adapter >> &solution)
Tpetra::Operator< scalar_t, lno_t, gno_t, node_t > op_t
Teuchos::RCP< matrix_t > computeCombinatorialLaplacian()
typename Adapter::scalar_t weight_t
void determineRegularity()
void setPreconditioner(Teuchos::RCP< problem_t > &problem)
void setPolynomialPreconditioner(Teuchos::RCP< problem_t > &problem)
void setJacobiPreconditioner(Teuchos::RCP< problem_t > &problem)
Tpetra::CrsMatrix< scalar_t, lno_t, gno_t, node_t > matrix_t
Sphynx(const RCP< const Environment > &env, const RCP< Teuchos::ParameterList > ¶ms, const RCP< const Comm< int > > &comm, const RCP< const XpetraCrsGraphAdapter< graph_t > > &adapter)
void computeWeights(std::vector< const weight_t * > vecweights, std::vector< int > strides)
Provides access for Zoltan2 to Xpetra::CrsGraph data.
An adapter for Xpetra::MultiVector.
Multi Jagged coordinate partitioning algorithm.
map_t::local_ordinal_type lno_t
map_t::global_ordinal_type gno_t
Zoltan2::BaseAdapter< userTypes_t > base_adapter_t
Created by mbenlioglu on Aug 31, 2020.
std::bitset< NUM_MODEL_FLAGS > modelFlag_t
SparseMatrixAdapter_t::part_t part_t