Skip to content

Commit 8a731d8

Browse files
committed
extract num rows in ml schwarz
+ format
1 parent 260de19 commit 8a731d8

File tree

7 files changed

+41
-52
lines changed

7 files changed

+41
-52
lines changed

CMakeLists.txt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ to turn off this check")
7575
endif()
7676

7777
set(GINKGO_CHECKOUT_VERSION
78-
"ogl_0600_gko190"
78+
"ogl_0600_gko190"
7979
CACHE STRING "Use specific version of ginkgo")
8080

8181
if(OGL_DEVEL_TOOLS)
@@ -216,14 +216,14 @@ target_sources(
216216
src/MatrixWrapper/SparsityPattern.cpp
217217
src/MatrixWrapper/Distributed.cpp
218218
src/MatrixWrapper/Combination.cpp
219-
src/Preconditioner/CoarseSolver.cpp
219+
src/Preconditioner/CoarseSolver.cpp
220220
src/Repartitioner.cpp
221221
src/Solver/CG.cpp
222-
src/Solver/PipeCG.cpp
223-
src/Solver/BiCGStab.cpp
224-
src/Solver/GMRES.cpp
225-
src/Solver/Multigrid.cpp
226-
# src/Solver/IR.cpp
222+
src/Solver/PipeCG.cpp
223+
src/Solver/BiCGStab.cpp
224+
src/Solver/GMRES.cpp
225+
src/Solver/Multigrid.cpp
226+
# src/Solver/IR.cpp
227227
)
228228

229229
enable_sanitizers(

include/OGL/Preconditioner/Cholesky.hpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,8 @@ class Cholesky // : public PreconditionerWrapper
9696

9797
auto wrapper = [this](auto f) {
9898
if (multi_level_schwarz_) {
99-
auto distmtx =
100-
gko::as<RepartDistMatrix>(mtx_)->get_dist_matrix();
101-
auto local = gko::as<RepartDistMatrix>(mtx_)->get_local();
102-
auto local_rows = local->get_size()[0];
103-
return wrap_multi_level_schwarz(distmtx, exec_, f, d_,
104-
local_rows, verbose_);
99+
return wrap_multi_level_schwarz(
100+
mtx_, exec_, f, d_.subDict("multiLevelConfig"), verbose_);
105101
} else {
106102
return wrap_schwarz(mtx_, exec_, std::move(f),
107103
generate_factorization());

include/OGL/Preconditioner/ISAI.hpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,8 @@ class ISAI // : public PreconditionerWrapper
6464
{
6565
auto wrapper = [this](auto f) {
6666
if (multi_level_schwarz_) {
67-
// auto distmtx =
68-
// gko::as<RepartDistMatrix>(mtx_)->get_dist_matrix();
69-
// auto local = gko::as<RepartDistMatrix>(mtx_)->get_local();
70-
// auto local_rows = local->get_size()[0];
71-
// return wrap_multi_level_schwarz(distmtx, exec_, f, d_,
72-
// local_rows, verbose_);
67+
return wrap_multi_level_schwarz(
68+
mtx_, exec_, f, d_.subDict("multiLevelConfig"), verbose_);
7369
} else {
7470
return wrap_schwarz(mtx_, exec_, std::move(f));
7571
}

include/OGL/Preconditioner/Jacobi.hpp

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -49,25 +49,13 @@ class BlockJacobi // : public PreconditionerWrapper
4949
.on(exec_));
5050
};
5151

52-
auto wrapper = [this](auto f) {
53-
if (multi_level_schwarz_) {
54-
auto distmtx =
55-
gko::as<RepartDistMatrix>(mtx_)->get_dist_matrix();
56-
auto local = gko::as<RepartDistMatrix>(mtx_)->get_local();
57-
auto local_rows = local->get_size()[0];
58-
return wrap_multi_level_schwarz(distmtx, exec_, f,
59-
d_.subDict("multiLevelConfig"),
60-
local_rows, verbose_);
61-
} else {
62-
return wrap_schwarz(mtx_, exec_, std::move(f));
63-
}
64-
};
65-
6652
if (precision_ == "double") {
67-
return wrapper(builder(dbj::build()));
53+
return dispatch_schwarz(mtx_, exec_, builder(dbj::build()),
54+
d_, verbose);
6855
}
6956
if (precision_ == "float") {
70-
return wrapper(builder(fbj::build()));
57+
return dispatch_schwarz(mtx_, exec_, builder(fbj::build()),
58+
d_, verbose);
7159
}
7260

7361
return {};

include/OGL/Preconditioner/LU.hpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,8 @@ class LU // : public PreconditionerWrapper
9696

9797
auto wrapper = [this](auto f) {
9898
if (multi_level_schwarz_) {
99-
auto distmtx =
100-
gko::as<RepartDistMatrix>(mtx_)->get_dist_matrix();
101-
auto local = gko::as<RepartDistMatrix>(mtx_)->get_local();
102-
auto local_rows = local->get_size()[0];
103-
return wrap_multi_level_schwarz(distmtx, exec_, f, d_,
104-
local_rows, verbose_);
99+
return wrap_multi_level_schwarz(
100+
mtx_, exec_, f, d_.subDict("multiLevelConfig"), verbose_);
105101
} else {
106102
return wrap_schwarz(mtx_, exec_, std::move(f),
107103
generate_factorization());

include/OGL/Preconditioner/Multigrid.hpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ class Multigrid {
3737
label minRowsC_;
3838
word smoother_;
3939
word coarsening_;
40-
word coarseSolver_;
4140
label maxIterS_;
4241

4342
public:
@@ -58,7 +57,6 @@ class Multigrid {
5857
minRowsC_(d.lookupOrDefault("minCoarseRows", label(64000))),
5958
smoother_(d.lookupOrDefault("smoother", word("Jacobi"))),
6059
coarsening_(d.lookupOrDefault("coarsening", word("GAMG"))),
61-
coarseSolver_(d.lookupOrDefault("coarseSolver", word("Jacobi"))),
6260
maxIterS_(d.lookupOrDefault("maxIterSmoother", label(1)))
6361
{
6462
word msg = "\nGenerate Multigrid preconditioner:\n\tmaxLevels:" +
@@ -68,7 +66,6 @@ class Multigrid {
6866
"\n\trelaxationFactor: " + std::to_string(relaxFac_) +
6967
"\n\tmaxIterSmoother: " + std::to_string(maxIterS_) +
7068
"\n\tcoarsening: " + coarsening_ +
71-
"\n\tcoarseSolver: " + coarseSolver_ +
7269
"\n\tcycle: " + cycleName_ + "\n\ttype: " + type_;
7370
MLOG_0(verbose_, msg)
7471
// FatalErrorInFunction << "Unknown Multigrid type: " << type

include/OGL/Preconditioner/Schwarz.hpp

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,9 @@ std::shared_ptr<gko::LinOp> wrap_schwarz(
4545

4646
template <typename PrecondFactory>
4747
std::shared_ptr<gko::LinOp> wrap_multi_level_schwarz(
48-
std::shared_ptr<const gko::LinOp> gkomatrix,
48+
std::shared_ptr<const gko::LinOp> mtx,
4949
std::shared_ptr<gko::Executor> device_exec,
50-
std::shared_ptr<PrecondFactory> precond, const dictionary &d,
51-
label local_rows, label verbose)
50+
std::shared_ptr<PrecondFactory> precond, const dictionary &d, label verbose)
5251
{
5352
using pgm = gko::multigrid::Pgm<scalar, label>;
5453
using fc = gko::multigrid::FixedCoarsening<scalar, label>;
@@ -58,6 +57,10 @@ std::shared_ptr<gko::LinOp> wrap_multi_level_schwarz(
5857
gko::experimental::distributed::preconditioner::Schwarz<scalar, label,
5958
label>;
6059

60+
auto distmtx = gko::as<RepartDistMatrix>(mtx)->get_dist_matrix();
61+
auto local_rows =
62+
gko::as<RepartDistMatrix>(mtx)->get_local()->get_size()[0];
63+
6164
auto coarse_solver = generate_coarse_solver(device_exec, d, verbose);
6265
auto coarsening = d.lookupOrDefault<word>("coarsening", word("PGM"));
6366
auto coarseWeight = d.lookupOrDefault("coarseWeight", scalar(0.1));
@@ -80,20 +83,19 @@ std::shared_ptr<gko::LinOp> wrap_multi_level_schwarz(
8083
for (auto i = 0; i < sel_rows.get_size(); i++) {
8184
sel_rows.get_data()[i] = selCoarseRows * i;
8285
}
83-
8486
sel_rows.set_executor(device_exec);
85-
auto pgm_fac = gko::share(
87+
auto coarsening_fac = gko::share(
8688
fc::build().with_skip_sorting(true).with_coarse_rows(sel_rows).on(
8789
device_exec));
8890

8991
return gko::share(ras::build()
9092
.with_local_solver(precond)
91-
.with_coarse_level(pgm_fac)
93+
.with_coarse_level(coarsening_fac)
9294
.with_l1_smoother(false)
9395
.with_coarse_solver(coarse_solver)
9496
.with_coarse_weight(coarseWeight)
9597
.on(device_exec)
96-
->generate(gkomatrix));
98+
->generate(distmtx));
9799
}
98100
if (coarsening == "PGM") {
99101
word msg =
@@ -110,7 +112,21 @@ std::shared_ptr<gko::LinOp> wrap_multi_level_schwarz(
110112
.with_coarse_weight(coarseWeight)
111113
.with_coarse_solver(coarse_solver)
112114
.on(device_exec)
113-
->generate(gkomatrix));
115+
->generate(distmtx));
116+
}
117+
}
118+
119+
120+
template <typename PrecondFactory>
121+
std::shared_ptr<gko::LinOp> dispatch_schwarz(
122+
std::shared_ptr<const gko::LinOp> mtx, std::shared_ptr<gko::Executor> exec,
123+
std::shared_ptr<PrecondFactory> precond, const dictionary &d, label verbose)
124+
{
125+
if (d.lookupOrDefault<Switch>("multiLevelSchwarz", false)) {
126+
return wrap_multi_level_schwarz(mtx, exec, precond,
127+
d.subDict("multiLevelConfig"), verbose);
128+
} else {
129+
return wrap_schwarz(mtx, exec, std::move(precond));
114130
}
115131
}
116132

0 commit comments

Comments
 (0)