@@ -45,10 +45,9 @@ std::shared_ptr<gko::LinOp> wrap_schwarz(
4545
4646template <typename PrecondFactory>
4747std::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