Skip to content

Commit fdb433a

Browse files
update solvers
1 parent 76ad62e commit fdb433a

File tree

7 files changed

+30
-19
lines changed

7 files changed

+30
-19
lines changed

.github/workflows/CI.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@ jobs:
133133
fetch-depth: 0 # to get tags
134134
- name: Checkout hpddm
135135
run: |
136-
git clone https://github.com/PierreMarchand20/hpddm.git hpddm
137-
cd hpddm && git checkout 43a77d0afcd169e88a0eb062a517f41ec2b6ede9
136+
git clone https://github.com/hpddm/hpddm.git hpddm
137+
cd hpddm && git checkout 7e8c98deb030ec078bbb36bee36ea2a1910fc8e3
138138
# uses: actions/checkout@v3
139139
# with:
140140
# path: "hpddm"

include/htool/distributed_operator/utility.hpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,21 @@
77
#include "implementations/partition_from_cluster.hpp"
88
namespace htool {
99

10+
template <typename CoefficientPrecision, typename CoordinatePrecision = underlying_type<CoefficientPrecision>>
11+
class CustomApproximationBuilder {
12+
const PartitionFromCluster<CoefficientPrecision, CoordinatePrecision> target_partition, source_partition;
13+
14+
public:
15+
DistributedOperator<CoefficientPrecision> distributed_operator;
16+
17+
explicit CustomApproximationBuilder(const Cluster<CoordinatePrecision> &target_cluster, const Cluster<CoordinatePrecision> &source_cluster, char symmetry, char UPLO, MPI_Comm communicator, const VirtualLocalOperator<CoefficientPrecision> &local_operator) : target_partition(target_cluster), source_partition(source_cluster), distributed_operator(target_partition, source_partition, symmetry, UPLO, communicator) {
18+
distributed_operator.add_local_operator(&local_operator);
19+
}
20+
};
21+
1022
template <typename CoefficientPrecision, typename CoordinatePrecision = underlying_type<CoefficientPrecision>>
1123
class DistributedOperatorFromHMatrix {
1224
private:
13-
const PartitionFromCluster<CoefficientPrecision, CoordinatePrecision> target_partition, source_partition;
1425
std::function<int(MPI_Comm)> get_rankWorld = [](MPI_Comm comm) {
1526
int rankWorld;
1627
MPI_Comm_rank(comm, &rankWorld);
@@ -21,13 +32,13 @@ class DistributedOperatorFromHMatrix {
2132

2233
private:
2334
const LocalHMatrix<CoefficientPrecision, CoordinatePrecision> local_hmatrix;
35+
CustomApproximationBuilder<CoefficientPrecision> distributed_operator_holder;
2436

2537
public:
26-
DistributedOperator<CoefficientPrecision> distributed_operator;
38+
DistributedOperator<CoefficientPrecision> &distributed_operator;
2739
const HMatrix<CoefficientPrecision, CoordinatePrecision> *block_diagonal_hmatrix{nullptr};
2840

29-
DistributedOperatorFromHMatrix(const VirtualGenerator<CoefficientPrecision> &generator, const Cluster<CoordinatePrecision> &target_cluster, const Cluster<CoordinatePrecision> &source_cluster, const HMatrixTreeBuilder<CoefficientPrecision, CoordinatePrecision> &hmatrix_builder, MPI_Comm communicator) : target_partition(target_cluster), source_partition(source_cluster), hmatrix(hmatrix_builder.build(generator)), local_hmatrix(hmatrix, hmatrix_builder.get_target_cluster().get_cluster_on_partition(get_rankWorld(communicator)), hmatrix_builder.get_source_cluster(), hmatrix_builder.get_symmetry(), hmatrix_builder.get_UPLO(), false, false), distributed_operator(target_partition, source_partition, hmatrix_builder.get_symmetry(), hmatrix_builder.get_UPLO(), communicator) {
30-
distributed_operator.add_local_operator(&local_hmatrix);
41+
DistributedOperatorFromHMatrix(const VirtualGenerator<CoefficientPrecision> &generator, const Cluster<CoordinatePrecision> &target_cluster, const Cluster<CoordinatePrecision> &source_cluster, const HMatrixTreeBuilder<CoefficientPrecision, CoordinatePrecision> &hmatrix_builder, MPI_Comm communicator) : hmatrix(hmatrix_builder.build(generator)), local_hmatrix(hmatrix, hmatrix_builder.get_target_cluster().get_cluster_on_partition(get_rankWorld(communicator)), hmatrix_builder.get_source_cluster(), hmatrix_builder.get_symmetry(), hmatrix_builder.get_UPLO(), false, false), distributed_operator_holder(target_cluster, source_cluster, hmatrix_builder.get_symmetry(), hmatrix_builder.get_UPLO(), communicator, local_hmatrix), distributed_operator(distributed_operator_holder.distributed_operator) {
3142
block_diagonal_hmatrix = hmatrix.get_sub_hmatrix(hmatrix_builder.get_target_cluster().get_cluster_on_partition(get_rankWorld(communicator)), hmatrix_builder.get_source_cluster().get_cluster_on_partition(get_rankWorld(communicator)));
3243
}
3344

include/htool/solvers/ddm.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ DDM<CoefficientPrecision, HPDDMCustomLocalSolver> make_DDM_solver_w_custom_local
463463
hpddm_op->initialize(n, sym, nullptr, neighbors, intersections); // we should not give a local dense matrix
464464

465465
auto local_hmatrix_solver = std::make_unique<LocalHMatrixSolver<CoefficientPrecision, CoordinatePrecision>>(local_hmatrix, use_permutation);
466-
hpddm_op->get_local_solver().set_local_solver(std::move(local_hmatrix_solver));
466+
hpddm_op->getSolver().set_local_solver(std::move(local_hmatrix_solver));
467467

468468
mytime = MPI_Wtime() - time;
469469

@@ -494,7 +494,7 @@ DDM<CoefficientPrecision, HPDDMCustomLocalSolver> make_DDM_solver_w_custom_local
494494
hpddm_op->initialize(n, sym, nullptr, neighbors, intersections); // we should not give a local dense matrix
495495

496496
auto local_hmatrix_solver = std::make_unique<LocalHMatrixPlusOverlapSolver<CoefficientPrecision, CoordinatePrecision>>(local_hmatrix, B, C, D);
497-
hpddm_op->get_local_solver().set_local_solver(std::move(local_hmatrix_solver));
497+
hpddm_op->getSolver().set_local_solver(std::move(local_hmatrix_solver));
498498

499499
mytime = MPI_Wtime() - time;
500500

include/htool/solvers/utility.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ class DDMSolverWithDenseLocalSolver {
184184
};
185185

186186
template <typename CoefficientPrecision, typename CoordinatePrecision = underlying_type<CoefficientPrecision>>
187-
class DDMSolver {
187+
class DDMSolverBuilder {
188188
private:
189189
std::vector<int> m_neighbors;
190190
std::vector<std::vector<int>> m_intersections;
@@ -273,13 +273,13 @@ class DDMSolver {
273273
DDM<CoefficientPrecision, HPDDMCustomLocalSolver> solver;
274274

275275
// Block Jacobi
276-
DDMSolver(DistributedOperator<CoefficientPrecision> &distributed_operator, HMatrix<CoefficientPrecision, CoordinatePrecision> &block_diagonal_hmatrix) : local_to_global_numbering(block_diagonal_hmatrix.get_target_cluster().get_permutation()), solver(make_DDM_solver_w_custom_local_solver(distributed_operator, block_diagonal_hmatrix, m_neighbors, m_intersections, false)) {}
276+
DDMSolverBuilder(DistributedOperator<CoefficientPrecision> &distributed_operator, HMatrix<CoefficientPrecision, CoordinatePrecision> &block_diagonal_hmatrix) : local_to_global_numbering(block_diagonal_hmatrix.get_target_cluster().get_permutation()), solver(make_DDM_solver_w_custom_local_solver(distributed_operator, block_diagonal_hmatrix, m_neighbors, m_intersections, false)) {}
277277

278278
// DDM building local hmatrix adding overlap
279-
DDMSolver(DistributedOperator<CoefficientPrecision> &distributed_operator, HMatrix<CoefficientPrecision, CoordinatePrecision> &block_diagonal_hmatrix, const VirtualGeneratorInUserNumbering<CoefficientPrecision> &generator, const std::vector<int> &ovr_subdomain_to_global, const std::vector<int> &cluster_to_ovr_subdomain, const std::vector<int> &neighbors, const std::vector<std::vector<int>> &intersections) : m_local_numbering(ovr_subdomain_to_global, cluster_to_ovr_subdomain, intersections), local_to_global_numbering(m_local_numbering.local_to_global_numbering), blocks_in_overlap(initialize_blocks_in_overlap(distributed_operator, block_diagonal_hmatrix, generator)), solver(make_DDM_solver_w_custom_local_solver(distributed_operator, block_diagonal_hmatrix, blocks_in_overlap[0], blocks_in_overlap[1], blocks_in_overlap[2], neighbors, m_local_numbering.intersections)) {}
279+
DDMSolverBuilder(DistributedOperator<CoefficientPrecision> &distributed_operator, HMatrix<CoefficientPrecision, CoordinatePrecision> &block_diagonal_hmatrix, const VirtualGeneratorInUserNumbering<CoefficientPrecision> &generator, const std::vector<int> &ovr_subdomain_to_global, const std::vector<int> &cluster_to_ovr_subdomain, const std::vector<int> &neighbors, const std::vector<std::vector<int>> &intersections) : m_local_numbering(ovr_subdomain_to_global, cluster_to_ovr_subdomain, intersections), local_to_global_numbering(m_local_numbering.local_to_global_numbering), blocks_in_overlap(initialize_blocks_in_overlap(distributed_operator, block_diagonal_hmatrix, generator)), solver(make_DDM_solver_w_custom_local_solver(distributed_operator, block_diagonal_hmatrix, blocks_in_overlap[0], blocks_in_overlap[1], blocks_in_overlap[2], neighbors, m_local_numbering.intersections)) {}
280280

281281
// DDM building local hmatrix with overlap
282-
DDMSolver(DistributedOperator<CoefficientPrecision> &distributed_operator, const std::vector<int> &ovr_subdomain_to_global, const std::vector<int> &cluster_to_ovr_subdomain, const std::vector<int> &neighbors, const std::vector<std::vector<int>> &intersections, const VirtualGeneratorInUserNumbering<CoefficientPrecision> &generator, int spatial_dimension, const CoordinatePrecision *global_geometry, underlying_type<CoefficientPrecision> epsilon, CoordinatePrecision eta) : m_local_numbering(ovr_subdomain_to_global, cluster_to_ovr_subdomain, intersections), local_to_global_numbering(m_local_numbering.local_to_global_numbering), local_cluster(std::make_unique<Cluster<CoordinatePrecision>>(initialize_local_cluster(spatial_dimension, global_geometry))), local_hmatrix(std::make_unique<HMatrix<CoefficientPrecision, CoordinatePrecision>>(initialize_local_hmatrix(generator, epsilon, eta, distributed_operator.get_symmetry_type()))), solver(make_DDM_solver_w_custom_local_solver(distributed_operator, *local_hmatrix, neighbors, m_local_numbering.intersections, true)) {}
282+
DDMSolverBuilder(DistributedOperator<CoefficientPrecision> &distributed_operator, const std::vector<int> &ovr_subdomain_to_global, const std::vector<int> &cluster_to_ovr_subdomain, const std::vector<int> &neighbors, const std::vector<std::vector<int>> &intersections, const VirtualGeneratorInUserNumbering<CoefficientPrecision> &generator, int spatial_dimension, const CoordinatePrecision *global_geometry, underlying_type<CoefficientPrecision> epsilon, CoordinatePrecision eta) : m_local_numbering(ovr_subdomain_to_global, cluster_to_ovr_subdomain, intersections), local_to_global_numbering(m_local_numbering.local_to_global_numbering), local_cluster(std::make_unique<Cluster<CoordinatePrecision>>(initialize_local_cluster(spatial_dimension, global_geometry))), local_hmatrix(std::make_unique<HMatrix<CoefficientPrecision, CoordinatePrecision>>(initialize_local_hmatrix(generator, epsilon, eta, distributed_operator.get_symmetry_type()))), solver(make_DDM_solver_w_custom_local_solver(distributed_operator, *local_hmatrix, neighbors, m_local_numbering.intersections, true)) {}
283283
};
284284

285285
} // namespace htool

tests/functional_tests/solvers/test_solver.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ int main(int argc, char *argv[]) {
3030
is_error = is_error || test_solver_wo_overlap<DDMSolverWithDenseLocalSolver<complex<double>, double>>(argc, argv, nb_rhs, symmetry, datapath_final);
3131
is_error = is_error || test_solver_ddm_adding_overlap<DDMSolverWithDenseLocalSolver<std::complex<double>>>(argc, argv, nb_rhs, data_symmetry, symmetry, datapath_final);
3232
is_error = is_error || test_solver_ddm<DDMSolverWithDenseLocalSolver<complex<double>>>(argc, argv, nb_rhs, data_symmetry, symmetry, datapath_final);
33-
is_error = is_error || test_solver_wo_overlap<DDMSolver<complex<double>, double>>(argc, argv, nb_rhs, symmetry, datapath_final);
34-
test_solver_ddm_adding_overlap<DDMSolver<std::complex<double>>>(argc, argv, nb_rhs, data_symmetry, symmetry, datapath_final);
35-
is_error = is_error || test_solver_ddm<DDMSolver<complex<double>>>(argc, argv, nb_rhs, data_symmetry, symmetry, datapath_final);
33+
is_error = is_error || test_solver_wo_overlap<DDMSolverBuilder<complex<double>, double>>(argc, argv, nb_rhs, symmetry, datapath_final);
34+
test_solver_ddm_adding_overlap<DDMSolverBuilder<std::complex<double>>>(argc, argv, nb_rhs, data_symmetry, symmetry, datapath_final);
35+
is_error = is_error || test_solver_ddm<DDMSolverBuilder<complex<double>>>(argc, argv, nb_rhs, data_symmetry, symmetry, datapath_final);
3636
}
3737
}
3838
}

tests/functional_tests/solvers/test_solver_ddm.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ int test_solver_ddm(int argc, char *argv[], int mu, char data_symmetry, char sym
232232
}
233233

234234
template <>
235-
int test_solver_ddm<DDMSolver<complex<double>>>(int argc, char *argv[], int mu, char, char symmetric, std::string datapath) {
235+
int test_solver_ddm<DDMSolverBuilder<complex<double>>>(int argc, char *argv[], int mu, char, char symmetric, std::string datapath) {
236236

237237
// Get the number of processes
238238
int size;
@@ -324,7 +324,7 @@ int test_solver_ddm<DDMSolver<complex<double>>>(int argc, char *argv[], int mu,
324324
std::cout << "Creating HMatrix" << std::endl;
325325
std::vector<double> geometry(n);
326326
bytes_to_vector(geometry, datapath + "/geometry.bin");
327-
DDMSolver<complex<double>> default_ddm_solver(Operator, ovr_subdomain_to_global, cluster_to_ovr_subdomain, neighbors, intersections, Generator, 3, geometry.data(), epsilon, eta);
327+
DDMSolverBuilder<complex<double>> default_ddm_solver(Operator, ovr_subdomain_to_global, cluster_to_ovr_subdomain, neighbors, intersections, Generator, 3, geometry.data(), epsilon, eta);
328328
auto &ddm_with_overlap = default_ddm_solver.solver;
329329

330330
// No precond with overlap

tests/functional_tests/solvers/test_solver_ddm_adding_overlap.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ int test_solver_ddm_adding_overlap(int argc, char *argv[], int mu, char data_sym
230230
}
231231

232232
template <>
233-
int test_solver_ddm_adding_overlap<DDMSolver<std::complex<double>>>(int argc, char *argv[], int mu, char, char symmetric, std::string datapath) {
233+
int test_solver_ddm_adding_overlap<DDMSolverBuilder<std::complex<double>>>(int argc, char *argv[], int mu, char, char symmetric, std::string datapath) {
234234

235235
// Get the number of processes
236236
int size;
@@ -320,7 +320,7 @@ int test_solver_ddm_adding_overlap<DDMSolver<std::complex<double>>>(int argc, ch
320320
// Solve
321321
if (rank == 0)
322322
std::cout << "Creating HMatrix" << std::endl;
323-
DDMSolver<std::complex<double>> default_ddm_solver(Operator, local_block_diagonal_hmatrix, Generator, ovr_subdomain_to_global, cluster_to_ovr_subdomain, neighbors, intersections);
323+
DDMSolverBuilder<std::complex<double>> default_ddm_solver(Operator, local_block_diagonal_hmatrix, Generator, ovr_subdomain_to_global, cluster_to_ovr_subdomain, neighbors, intersections);
324324
auto &ddm_with_overlap = default_ddm_solver.solver;
325325

326326
// No precond with overlap

0 commit comments

Comments
 (0)