Skip to content

Commit

Permalink
Merge pull request #13783 from cgcgcg/mueluMaterialCutDrop
Browse files Browse the repository at this point in the history
MueLu CoalesceDropFactory_kokkos: Add cut-drop using material-aware coarsening
  • Loading branch information
cgcgcg authored Feb 5, 2025
2 parents 363438e + abe404a commit ef936a4
Showing 1 changed file with 114 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -634,6 +634,44 @@ std::tuple<GlobalOrdinal, typename MueLu::LWGraph_kokkos<LocalOrdinal, GlobalOrd
MueLu_runDroppingFunctors(drop_boundaries,
preserve_diagonals,
cut_drop);
} else if (distanceLaplacianMetric == "material") {
auto material = Get<RCP<MultiVector>>(currentLevel, "Material");
if (material->getNumVectors() == 1) {
GetOStream(Runtime0) << "material scalar mean = " << material->getVector(0)->meanValue() << std::endl;

auto dist2 = DistanceLaplacian::ScalarMaterialDistanceFunctor(*A, coords, material);
auto comparison = CutDrop::UnscaledDistanceLaplacianComparison(*A, dist2, results);
auto cut_drop = CutDrop::CutDropFunctor(comparison, threshold);

MueLu_runDroppingFunctors(drop_boundaries,
preserve_diagonals,
cut_drop);
} else {
TEUCHOS_TEST_FOR_EXCEPTION(coords->getNumVectors() * coords->getNumVectors() != material->getNumVectors(), Exceptions::RuntimeError, "Need \"Material\" to have spatialDim^2 vectors.");

{
std::stringstream ss;
ss << "material tensor mean =" << std::endl;
size_t k = 0;
for (size_t i = 0; i < coords->getNumVectors(); ++i) {
ss << " ";
for (size_t j = 0; j < coords->getNumVectors(); ++j) {
ss << material->getVector(k)->meanValue() << " ";
++k;
}
ss << std::endl;
}
GetOStream(Runtime0) << ss.str();
}

auto dist2 = DistanceLaplacian::TensorMaterialDistanceFunctor(*A, coords, material);
auto comparison = CutDrop::UnscaledDistanceLaplacianComparison(*A, dist2, results);
auto cut_drop = CutDrop::CutDropFunctor(comparison, threshold);

MueLu_runDroppingFunctors(drop_boundaries,
preserve_diagonals,
cut_drop);
}
}
} else if (distanceLaplacianAlgoStr == "scaled cut") {
if (distanceLaplacianMetric == "unweighted") {
Expand All @@ -644,6 +682,44 @@ std::tuple<GlobalOrdinal, typename MueLu::LWGraph_kokkos<LocalOrdinal, GlobalOrd
MueLu_runDroppingFunctors(drop_boundaries,
preserve_diagonals,
cut_drop);
} else if (distanceLaplacianMetric == "material") {
auto material = Get<RCP<MultiVector>>(currentLevel, "Material");
if (material->getNumVectors() == 1) {
GetOStream(Runtime0) << "material scalar mean = " << material->getVector(0)->meanValue() << std::endl;

auto dist2 = DistanceLaplacian::ScalarMaterialDistanceFunctor(*A, coords, material);
auto comparison = CutDrop::ScaledDistanceLaplacianComparison(*A, dist2, results);
auto cut_drop = CutDrop::CutDropFunctor(comparison, threshold);

MueLu_runDroppingFunctors(drop_boundaries,
preserve_diagonals,
cut_drop);
} else {
TEUCHOS_TEST_FOR_EXCEPTION(coords->getNumVectors() * coords->getNumVectors() != material->getNumVectors(), Exceptions::RuntimeError, "Need \"Material\" to have spatialDim^2 vectors.");

{
std::stringstream ss;
ss << "material tensor mean =" << std::endl;
size_t k = 0;
for (size_t i = 0; i < coords->getNumVectors(); ++i) {
ss << " ";
for (size_t j = 0; j < coords->getNumVectors(); ++j) {
ss << material->getVector(k)->meanValue() << " ";
++k;
}
ss << std::endl;
}
GetOStream(Runtime0) << ss.str();
}

auto dist2 = DistanceLaplacian::TensorMaterialDistanceFunctor(*A, coords, material);
auto comparison = CutDrop::ScaledDistanceLaplacianComparison(*A, dist2, results);
auto cut_drop = CutDrop::CutDropFunctor(comparison, threshold);

MueLu_runDroppingFunctors(drop_boundaries,
preserve_diagonals,
cut_drop);
}
}
} else if (distanceLaplacianAlgoStr == "scaled cut symmetric") {
if (distanceLaplacianMetric == "unweighted") {
Expand All @@ -654,6 +730,44 @@ std::tuple<GlobalOrdinal, typename MueLu::LWGraph_kokkos<LocalOrdinal, GlobalOrd
MueLu_runDroppingFunctors(drop_boundaries,
preserve_diagonals,
cut_drop);
} else if (distanceLaplacianMetric == "material") {
auto material = Get<RCP<MultiVector>>(currentLevel, "Material");
if (material->getNumVectors() == 1) {
GetOStream(Runtime0) << "material scalar mean = " << material->getVector(0)->meanValue() << std::endl;

auto dist2 = DistanceLaplacian::ScalarMaterialDistanceFunctor(*A, coords, material);
auto comparison = CutDrop::ScaledDistanceLaplacianComparison(*A, dist2, results);
auto cut_drop = CutDrop::CutDropFunctor(comparison, threshold);

MueLu_runDroppingFunctors(drop_boundaries,
preserve_diagonals,
cut_drop);
} else {
TEUCHOS_TEST_FOR_EXCEPTION(coords->getNumVectors() * coords->getNumVectors() != material->getNumVectors(), Exceptions::RuntimeError, "Need \"Material\" to have spatialDim^2 vectors.");

{
std::stringstream ss;
ss << "material tensor mean =" << std::endl;
size_t k = 0;
for (size_t i = 0; i < coords->getNumVectors(); ++i) {
ss << " ";
for (size_t j = 0; j < coords->getNumVectors(); ++j) {
ss << material->getVector(k)->meanValue() << " ";
++k;
}
ss << std::endl;
}
GetOStream(Runtime0) << ss.str();
}

auto dist2 = DistanceLaplacian::TensorMaterialDistanceFunctor(*A, coords, material);
auto comparison = CutDrop::ScaledDistanceLaplacianComparison(*A, dist2, results);
auto cut_drop = CutDrop::CutDropFunctor(comparison, threshold);

MueLu_runDroppingFunctors(drop_boundaries,
preserve_diagonals,
cut_drop);
}
}

auto symmetrize = Misc::SymmetrizeFunctor(lclA, results);
Expand Down

0 comments on commit ef936a4

Please sign in to comment.