From 0d55f2df8442b50661a04bceebb67cd968b9a0dd Mon Sep 17 00:00:00 2001 From: Luca Heltai Date: Tue, 20 Oct 2026 16:16:04 +0200 Subject: [PATCH 1/3] Update to deal.II 9.7.1 and restore FPU state after tests --- .github/workflows/indentation.yml | 4 ++-- .github/workflows/tests.yml | 6 +++--- CMakeLists.txt | 2 +- README.md | 2 +- VERSION | 2 +- docker/Dockerfile | 2 +- docs/complex-robin.md | 20 ++++++++++---------- include/ass_leg_function.h | 2 +- include/bem_fma.h | 8 ++++---- include/bem_problem.h | 2 +- include/boundary_conditions.h | 2 +- include/computational_domain.h | 2 +- include/constrained_matrix.h | 2 +- include/constrained_matrix_complex.h | 2 +- include/driver.h | 2 +- include/laplace_kernel.h | 2 +- include/octree_block.h | 2 +- include/true_constrained_matrix.h | 2 +- include/vector_tools_integrate_difference.h | 2 +- scripts/docker.sh | 4 +++- scripts/dr.sh | 6 ++++-- scripts/run_docker.sh | 7 ++++--- tests/tests.h | 9 +++++++++ 23 files changed, 54 insertions(+), 40 deletions(-) diff --git a/.github/workflows/indentation.yml b/.github/workflows/indentation.yml index c8d0fc65..b9133bc0 100644 --- a/.github/workflows/indentation.yml +++ b/.github/workflows/indentation.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest container: - image: dealii/dealii:v9.6.0-jammy + image: dealii/dealii:v9.7.1-noble options: --user root --env OMPI_ALLOW_RUN_AS_ROOT=1 --env OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 steps: @@ -19,4 +19,4 @@ jobs: - name: Check indentation run: | git config --global --add safe.directory /__w/pi-BEM/pi-BEM - ./scripts/check_indentation.sh \ No newline at end of file + ./scripts/check_indentation.sh diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index abf6f71a..11e3e95a 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest container: - image: dealii/dealii:v9.6.0-jammy + image: dealii/dealii:v9.7.1-noble options: --user root --env OMPI_ALLOW_RUN_AS_ROOT=1 --env OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 steps: @@ -32,7 +32,7 @@ jobs: runs-on: ubuntu-latest container: - image: dealii/dealii:v9.6.0-jammy + image: dealii/dealii:v9.7.1-noble options: --user root --env OMPI_ALLOW_RUN_AS_ROOT=1 --env OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 steps: @@ -45,4 +45,4 @@ jobs: cmake .. -GNinja -DCMAKE_CXX_FLAGS=-Werror -DCMAKE_BUILD_TYPE=Release ninja ctest -N - ctest --output-on-failure \ No newline at end of file + ctest --output-on-failure diff --git a/CMakeLists.txt b/CMakeLists.txt index 2feb4829..9d1c6cdf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,7 +39,7 @@ ENDIF() CMAKE_MINIMUM_REQUIRED(VERSION 3.13.4) -FIND_PACKAGE(deal.II 9.5.0 REQUIRED +FIND_PACKAGE(deal.II 9.7.1 REQUIRED HINTS ${deal.II_DIR} ${DEAL_II_DIR} ../ ../../ $ENV{DEAL_II_DIR} ) diff --git a/README.md b/README.md index 89a84743..38666fb9 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ Just follow the [instructions](https://github.com/dealii/dealii/wiki/deal.II-in- We provide the possibility of using Docker as a tool to provide a fully operational environment for our library. To use such tool you need to install Docker following the [instructions](https://docs.docker.com/engine/installation/) provided by its authors. Then you can execute the following command line instruction ``` -docker run -v `pwd`:/pwd_to_your_own_directory/ -i -t dealii/dealii:v9.6.0-jammy bash +docker run -v `pwd`:/pwd_to_your_own_directory/ -i -t dealii/dealii:v9.7.1-noble bash ``` to retrieve the environment. In such a shell you can easily compile the pi-BEM library following its own instructions. diff --git a/VERSION b/VERSION index 4a3e1cf6..ff32e768 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -9.6.0 \ No newline at end of file +9.7.1 diff --git a/docker/Dockerfile b/docker/Dockerfile index d4893eac..843512a2 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM dealii/dealii:v9.6.0-jammy +FROM dealii/dealii:v9.7.1-noble # pi-BEM master image RUN git clone https://github.com/mathLab/pi-BEM/ &&\ diff --git a/docs/complex-robin.md b/docs/complex-robin.md index bc52dfc7..f085ac08 100644 --- a/docs/complex-robin.md +++ b/docs/complex-robin.md @@ -1,16 +1,16 @@ # Multiple potentials, complex problems and Robin conditions -## Build and run with deal.II 9.6.0 +## Build and run with deal.II 9.7.1 From the repository root, build both configurations in the supplied container: ```sh docker run --rm -v "$PWD:/workspace" -w /workspace \ - dealii/dealii:v9.6.0-jammy bash -lc ' - cmake -S . -B build-docker/9.6.0 -GNinja \ + dealii/dealii:v9.7.1-noble bash -lc ' + cmake -S . -B build-docker/9.7.1 -GNinja \ -DCMAKE_BUILD_TYPE=DebugRelease -DCMAKE_CXX_FLAGS=-Werror && - cmake --build build-docker/9.6.0 -j 4 && - cd build-docker/9.6.0 && ctest --output-on-failure + cmake --build build-docker/9.7.1 -j 4 && + cd build-docker/9.7.1 && ctest --output-on-failure ' ``` @@ -24,13 +24,13 @@ The sphere examples use paths relative to `samples/`. Keep each run's output separate, and copy both the parameter file and its grid directory: ```sh -mkdir -p build-docker/9.6.0/example-complex -cp -R samples/grids build-docker/9.6.0/example-complex/ +mkdir -p build-docker/9.7.1/example-complex +cp -R samples/grids build-docker/9.7.1/example-complex/ cp samples/ref_params_sphere_complex_DR_direct.prm \ - build-docker/9.6.0/example-complex/parameters_bem_3.prm + build-docker/9.7.1/example-complex/parameters_bem_3.prm docker run --rm -v "$PWD:/workspace" \ - -w /workspace/build-docker/9.6.0/example-complex \ - dealii/dealii:v9.6.0-jammy bash -lc ' + -w /workspace/build-docker/9.7.1/example-complex \ + dealii/dealii:v9.7.1-noble bash -lc ' mpirun -np 2 ../bem_fma_3d 2 ' ``` diff --git a/include/ass_leg_function.h b/include/ass_leg_function.h index c318c981..a23a1976 100644 --- a/include/ass_leg_function.h +++ b/include/ass_leg_function.h @@ -3,10 +3,10 @@ #define __sissa__ass_leg_function_h #include +#include #include #include #include -#include #include #include diff --git a/include/bem_fma.h b/include/bem_fma.h index 6dbb07f9..90227190 100644 --- a/include/bem_fma.h +++ b/include/bem_fma.h @@ -272,8 +272,8 @@ class BEMFMA : public ParameterAcceptor protected: /// Three pointers to the problem parameters to be set equal to /// the ones in the calling problem through the init function - SmartPointer> fma_dh; - SmartPointer> fma_mapping; + ObserverPointer> fma_dh; + ObserverPointer> fma_mapping; /// Truncation order for the multipole /// and local expansion series: it is @@ -455,8 +455,8 @@ class BEMFMA : public ParameterAcceptor ConditionalOStream pcout; /// TODO parsed quadrature? - std::shared_ptr> quadrature; - SmartPointer> dirichlet_nodes; + std::shared_ptr> quadrature; + ObserverPointer> dirichlet_nodes; /// This should be erased by the usage of the constraint matrix. const std::vector> *double_nodes_set; diff --git a/include/bem_problem.h b/include/bem_problem.h index 2750c3d0..d6574ba8 100644 --- a/include/bem_problem.h +++ b/include/bem_problem.h @@ -22,11 +22,11 @@ #include #include +#include #include #include #include #include -#include #include #include diff --git a/include/boundary_conditions.h b/include/boundary_conditions.h index 7396a2ca..891aef9f 100644 --- a/include/boundary_conditions.h +++ b/include/boundary_conditions.h @@ -15,11 +15,11 @@ #ifndef boundary_conditions_h #define boundary_conditions_h #include +#include #include #include #include #include -#include #include #include diff --git a/include/computational_domain.h b/include/computational_domain.h index f1a2435e..23b0076f 100644 --- a/include/computational_domain.h +++ b/include/computational_domain.h @@ -20,11 +20,11 @@ #include #include +#include #include #include #include #include -#include #include #include diff --git a/include/constrained_matrix.h b/include/constrained_matrix.h index 34ccb07c..a6908360 100644 --- a/include/constrained_matrix.h +++ b/include/constrained_matrix.h @@ -18,7 +18,7 @@ #include #include -#include +#include #include #include diff --git a/include/constrained_matrix_complex.h b/include/constrained_matrix_complex.h index e0f4c156..0e63e4fd 100644 --- a/include/constrained_matrix_complex.h +++ b/include/constrained_matrix_complex.h @@ -18,7 +18,7 @@ #include #include -#include +#include #include #include diff --git a/include/driver.h b/include/driver.h index d1dc8b8b..83c2372d 100644 --- a/include/driver.h +++ b/include/driver.h @@ -17,11 +17,11 @@ #include #include +#include #include #include #include #include -#include #include #include diff --git a/include/laplace_kernel.h b/include/laplace_kernel.h index 3c2b6132..838121c6 100644 --- a/include/laplace_kernel.h +++ b/include/laplace_kernel.h @@ -1,8 +1,8 @@ #ifndef laplace_kernel_h #define laplace_kernel_h +#include #include -#include #include #include diff --git a/include/octree_block.h b/include/octree_block.h index f8c58845..cdf497e9 100644 --- a/include/octree_block.h +++ b/include/octree_block.h @@ -16,11 +16,11 @@ #define octree_block_h #include +#include #include #include #include #include -#include #include #include diff --git a/include/true_constrained_matrix.h b/include/true_constrained_matrix.h index 16c4cb89..641cd761 100644 --- a/include/true_constrained_matrix.h +++ b/include/true_constrained_matrix.h @@ -19,7 +19,7 @@ # include # include -# include +# include # include # include diff --git a/include/vector_tools_integrate_difference.h b/include/vector_tools_integrate_difference.h index 1b76191a..a42a187c 100644 --- a/include/vector_tools_integrate_difference.h +++ b/include/vector_tools_integrate_difference.h @@ -2,10 +2,10 @@ #define vector_tools_integrate_difference_h #include +#include #include #include #include -#include #include #include diff --git a/scripts/docker.sh b/scripts/docker.sh index a288f3ce..0671459e 100755 --- a/scripts/docker.sh +++ b/scripts/docker.sh @@ -1 +1,3 @@ -docker run -P -t -i -v `pwd`:/home/dealii/app:rw mathlab/deal2lkit:v8.5.0-debugrelease +#!/bin/sh +# Open the supported deal.II environment in the current checkout. +exec docker run --rm -it -v "$PWD:/app" -w /app dealii/dealii:v9.7.1-noble bash diff --git a/scripts/dr.sh b/scripts/dr.sh index 9150be90..6d6f0de0 100755 --- a/scripts/dr.sh +++ b/scripts/dr.sh @@ -1,2 +1,4 @@ -#!/bin/bash -docker run --user $(id -u):$(id -g) -i -t --rm -P -v `pwd`:/app:rw dealii/dealii:v9.6.0-jammy /bin/sh -c "cd /app; $@" +#!/bin/sh +# Run a shell command in the supported deal.II environment. +exec docker run --user "$(id -u):$(id -g)" -it --rm \ + -v "$PWD:/app" -w /app dealii/dealii:v9.7.1-noble /bin/sh -c "$*" diff --git a/scripts/run_docker.sh b/scripts/run_docker.sh index fb28fad8..30fb1ace 100755 --- a/scripts/run_docker.sh +++ b/scripts/run_docker.sh @@ -1,3 +1,4 @@ -#!/bin/bash -CMD=`grep -e '- ' .travis.yml | sed 's/- //'` -docker run --user $(id -u):$(id -g) -i -t --rm -P -v `pwd`:/app:rw mathlab/deal2lkit:v9.1.1-debugrelease /bin/sh -c "cd /app; $CMD" +#!/bin/sh +# Run the same warning-free Debug/Release checks used for releases. +exec docker run --rm -v "$PWD:/app" -w /app dealii/dealii:v9.7.1-noble \ + bash -lc 'set -e; cmake -S . -B build-docker/9.7.1 -GNinja -DCMAKE_BUILD_TYPE=DebugRelease -DCMAKE_CXX_FLAGS=-Werror; cmake --build build-docker/9.7.1 -j 4; cd build-docker/9.7.1; ctest --output-on-failure' diff --git a/tests/tests.h b/tests/tests.h index a83c095c..386bdb24 100644 --- a/tests/tests.h +++ b/tests/tests.h @@ -717,6 +717,15 @@ struct EnableFPE #if defined(DEBUG) && defined(DEAL_II_HAVE_FP_EXCEPTIONS) // enable floating point exceptions feenableexcept(FE_DIVBYZERO | FE_INVALID); +#endif + } + + ~EnableFPE() + { +#if defined(DEBUG) && defined(DEAL_II_HAVE_FP_EXCEPTIONS) + // Restore the startup exception mask before CGAL checks the FPU at exit. + // See deal.II commit 5b0d034e0a73a56336301071d23200eef8948fe8. + fedisableexcept(FE_DIVBYZERO | FE_INVALID); #endif } } deal_II_enable_fpe; From 050144661cb6864e9c872eb142318196b94c9c27 Mon Sep 17 00:00:00 2001 From: Luca Heltai Date: Tue, 20 Oct 2026 16:18:40 +0200 Subject: [PATCH 2/3] Clarify coefficient reference lifetime and close Doxygen groups --- include/constrained_matrix.h | 2 +- include/local_expansion.h | 5 +++-- include/multipole_expansion.h | 5 +++-- include/true_constrained_matrix.h | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/include/constrained_matrix.h b/include/constrained_matrix.h index a6908360..5542e2f1 100644 --- a/include/constrained_matrix.h +++ b/include/constrained_matrix.h @@ -76,7 +76,7 @@ class ConstrainedOperator unsigned int this_mpi_process; }; -/*@}*/ +/** @} */ /*---------------------- Inline functions -----------------------------------*/ //--------------------------------Iterators--------------------------------------// diff --git a/include/local_expansion.h b/include/local_expansion.h index 2e25502c..afb0939d 100644 --- a/include/local_expansion.h +++ b/include/local_expansion.h @@ -146,8 +146,9 @@ class LocalExpansion /// Return a read-only reference to owned triangular coefficient storage, /// indexed by n*(n+1)/2+m. Copy the vector to retain an independent snapshot. - /// Use SetCoeff()/AddToCoeff() for changes; assignment invalidates - /// references. + /// Use SetCoeff()/AddToCoeff() for changes. Assignment can invalidate + /// references to individual coefficients; the vector object remains owned + /// here. inline const std::vector> & GetCoeffs() const { diff --git a/include/multipole_expansion.h b/include/multipole_expansion.h index bfa8e495..9d7413a1 100644 --- a/include/multipole_expansion.h +++ b/include/multipole_expansion.h @@ -141,8 +141,9 @@ class MultipoleExpansion /// Return a read-only reference to owned triangular coefficient storage, /// indexed by n*(n+1)/2+m. Copy the vector to retain an independent snapshot. - /// Use SetCoeff()/AddToCoeff() for changes; assignment invalidates - /// references. + /// Use SetCoeff()/AddToCoeff() for changes. Assignment can invalidate + /// references to individual coefficients; the vector object remains owned + /// here. inline const std::vector> & GetCoeffs() const { diff --git a/include/true_constrained_matrix.h b/include/true_constrained_matrix.h index 641cd761..0bbad2df 100644 --- a/include/true_constrained_matrix.h +++ b/include/true_constrained_matrix.h @@ -90,7 +90,7 @@ class ConstrainedOperator unsigned int this_mpi_process; }; -/*@}*/ +/** @} */ /*---------------------- Inline functions -----------------------------------*/ From 75cf562c32075805159aeb53fe493878ebe6d421 Mon Sep 17 00:00:00 2001 From: Luca Heltai Date: Tue, 20 Oct 2026 16:23:37 +0200 Subject: [PATCH 3/3] Import remote boundary data when assembling Direct preconditioners --- source/bem_problem.cc | 29 ++++-- tests/direct_preconditioner_mpi.cc | 96 +++++++++++++++++++ .../direct_preconditioner_mpi.mpirun=2.output | 2 + 3 files changed, 118 insertions(+), 9 deletions(-) create mode 100644 tests/direct_preconditioner_mpi.cc create mode 100644 tests/direct_preconditioner_mpi.mpirun=2.output diff --git a/source/bem_problem.cc b/source/bem_problem.cc index ba140754..73eaa3e7 100644 --- a/source/bem_problem.cc +++ b/source/bem_problem.cc @@ -2750,6 +2750,11 @@ template void BEMProblem::assemble_preconditioner() { + // Each owned matrix row also contains columns owned by other ranks. + // Import column data collectively before the rank-local assembly loops. + const Vector column_dirichlet_nodes(dirichlet_nodes); + const Vector column_robin_nodes(robin_nodes); + const Vector column_robin_diagonal(robin_matrix_diagonal); if (!is_preconditioner_initialized) { for (auto i : this_cpu_set) @@ -2794,18 +2799,18 @@ BEMProblem::assemble_preconditioner() ++j) { // if (dirichlet_nodes(i) == 0) - if (dirichlet_nodes(j) == 0) + if (column_dirichlet_nodes(j) == 0) { // Nodo di Neumann - or Robin band_system.add(i, j, neumann_matrix(i, j)); // TODO: account for Robin node - if (robin_nodes(j) == 1) + if (column_robin_nodes(j) == 1) { band_system.add(i, j, dirichlet_matrix(i, j) * - robin_matrix_diagonal(j)); + column_robin_diagonal(j)); } if (i == j) @@ -2843,6 +2848,12 @@ template void BEMProblem::assemble_preconditioner_complex() { + // Each owned matrix row also contains columns owned by other ranks. + // Import column data collectively before the rank-local assembly loops. + const Vector column_dirichlet_nodes(dirichlet_nodes); + const Vector column_robin_nodes(robin_nodes); + const Vector column_robin_diagonal(robin_matrix_diagonal); + const Vector column_robin_diagonal_imag(robin_matrix_diagonal_imag); if (!is_preconditioner_complex_initialized) { for (auto i : this_cpu_set) @@ -2890,7 +2901,7 @@ BEMProblem::assemble_preconditioner_complex() for (auto j = from; j < to; ++j) { - if (dirichlet_nodes(j) == 0) + if (column_dirichlet_nodes(j) == 0) { // neumann and robin nodes are implicitly merged, here band_system_complex.add(i, j, neumann_matrix(i, j)); @@ -2898,7 +2909,7 @@ BEMProblem::assemble_preconditioner_complex() j + this_cpu_set.size(), neumann_matrix(i, j)); - if (robin_nodes(j) == 1) + if (column_robin_nodes(j) == 1) { // scale the row from D, using the robin matrix // diagonal @@ -2906,11 +2917,11 @@ BEMProblem::assemble_preconditioner_complex() band_system_complex.add(i, j, dirichlet_matrix(i, j) * - robin_matrix_diagonal(j)); + column_robin_diagonal(j)); band_system_complex.add(i + this_cpu_set.size(), j + this_cpu_set.size(), dirichlet_matrix(i, j) * - robin_matrix_diagonal(j)); + column_robin_diagonal(j)); // check for pairing elements if ((robin_nodes(i) == 1) && @@ -2922,12 +2933,12 @@ BEMProblem::assemble_preconditioner_complex() band_system_complex.add(i, j + this_cpu_set.size(), -dirichlet_matrix(i, j) * - robin_matrix_diagonal_imag( + column_robin_diagonal_imag( j)); band_system_complex.add(i + this_cpu_set.size(), j, dirichlet_matrix(i, j) * - robin_matrix_diagonal_imag( + column_robin_diagonal_imag( j)); } } diff --git a/tests/direct_preconditioner_mpi.cc b/tests/direct_preconditioner_mpi.cc new file mode 100644 index 00000000..88a6049f --- /dev/null +++ b/tests/direct_preconditioner_mpi.cc @@ -0,0 +1,96 @@ +// An owned matrix row needs boundary data for columns on other MPI ranks. +// Exercise real and complex preconditioners against an explicit small matrix. +#include "bem_problem.h" +#include "tests.h" + +int +main(int argc, char **argv) +{ + Utilities::MPI::MPI_InitFinalize mpi(argc, argv, 1); + const auto rank = Utilities::MPI::this_mpi_process(MPI_COMM_WORLD); + if (rank == 0) + initlog(); + AssertThrow(Utilities::MPI::n_mpi_processes(MPI_COMM_WORLD) == 2, + ExcMessage("This regression requires two MPI ranks")); + ComputationalDomain<3> domain; + GridGenerator::hyper_cube(domain.tria); + BEMProblem<3> problem(domain); + problem.fe = std::make_unique>(1); + problem.dh.distribute_dofs(*problem.fe); + AssertThrow(problem.dh.n_dofs() == 4, ExcInternalError()); + problem.this_cpu_set = IndexSet(4); + problem.this_cpu_set.add_range(2 * rank, 2 * rank + 2); + problem.this_cpu_set.compress(); + problem.preconditioner_type = "ILU"; + problem.preconditioner_band = 8; + problem.is_preconditioner_initialized = false; + problem.is_preconditioner_complex_initialized = false; + problem.constraints.close(); + problem.constraints_imag.close(); + problem.full_sparsity_pattern.reinit(problem.this_cpu_set, MPI_COMM_WORLD); + problem.preconditioner_sparsity_pattern.reinit(problem.this_cpu_set, + MPI_COMM_WORLD, + 4); + IndexSet complex_owned(8); + complex_owned.add_indices(problem.this_cpu_set); + complex_owned.add_indices(problem.this_cpu_set, 4); + complex_owned.compress(); + problem.preconditioner_complex_sparsity_pattern.reinit(complex_owned, + MPI_COMM_WORLD, + 8); + for (auto i : problem.this_cpu_set) + for (unsigned int j = 0; j < 4; ++j) + problem.full_sparsity_pattern.add(i, j); + problem.full_sparsity_pattern.compress(); + problem.neumann_matrix.reinit(problem.full_sparsity_pattern); + problem.dirichlet_matrix.reinit(problem.full_sparsity_pattern); + for (auto *v : {&problem.dirichlet_nodes, + &problem.robin_nodes, + &problem.robin_matrix_diagonal, + &problem.robin_matrix_diagonal_imag, + &problem.alpha}) + v->reinit(problem.this_cpu_set, MPI_COMM_WORLD); + for (auto i : problem.this_cpu_set) + { + problem.dirichlet_nodes(i) = (i == 0 || i == 3) ? 1 : 0; + problem.robin_nodes(i) = i == 1 ? 1 : 0; + problem.robin_matrix_diagonal(i) = i == 1 ? 3 : 0; + problem.robin_matrix_diagonal_imag(i) = 0; + problem.alpha(i) = 4; + for (unsigned int j = 0; j < 4; ++j) + { + problem.neumann_matrix.set(i, j, 1); + problem.dirichlet_matrix.set(i, j, 2); + } + } + for (auto *v : {&problem.dirichlet_nodes, + &problem.robin_nodes, + &problem.robin_matrix_diagonal, + &problem.robin_matrix_diagonal_imag, + &problem.alpha}) + v->compress(VectorOperation::insert); + problem.neumann_matrix.compress(VectorOperation::insert); + problem.dirichlet_matrix.compress(VectorOperation::insert); + problem.assemble_preconditioner(); + problem.assemble_preconditioner_complex(); + const double expected[4][4] = {{-2, 7, 1, -2}, + {-2, 11, 1, -2}, + {-2, 7, 5, -2}, + {-2, 7, 1, -2}}; + for (auto i : problem.this_cpu_set) + for (unsigned int j = 0; j < 4; ++j) + { + AssertThrow(std::abs(problem.band_system.el(i, j) - expected[i][j]) < + 1e-14, + ExcInternalError()); + AssertThrow(std::abs(problem.band_system_complex.el(i, j) - + expected[i][j]) < 1e-14, + ExcInternalError()); + AssertThrow(std::abs(problem.band_system_complex.el(i + 4, j + 4) - + expected[i][j]) < 1e-14, + ExcInternalError()); + } + if (rank == 0) + deallog << "Real and complex preconditioners import remote column data" + << std::endl; +} diff --git a/tests/direct_preconditioner_mpi.mpirun=2.output b/tests/direct_preconditioner_mpi.mpirun=2.output new file mode 100644 index 00000000..aae66364 --- /dev/null +++ b/tests/direct_preconditioner_mpi.mpirun=2.output @@ -0,0 +1,2 @@ + +DEAL::Real and complex preconditioners import remote column data