Bug#1109543: unblock: dolfinx-mpc/0.9.1-2
Package: release.debian.org
Followup-For: Bug #1109543
debdiff
diff -Nru dolfinx-mpc-0.9.1/debian/changelog dolfinx-mpc-0.9.1/debian/changelog
--- dolfinx-mpc-0.9.1/debian/changelog 2025-03-10 21:45:46.000000000 +0100
+++ dolfinx-mpc-0.9.1/debian/changelog 2025-07-09 12:33:18.000000000 +0200
@@ -1,3 +1,10 @@
+dolfinx-mpc (0.9.1-2) unstable; urgency=medium
+
+ * debian patch free_MPI_communicator_PR171.patch applies upstream
+ PR#171 (release 0.9.2) to free MPI communicators after use
+
+ -- Drew Parsons <dparsons@debian.org> Wed, 09 Jul 2025 12:33:18 +0200
+
dolfinx-mpc (0.9.1-1) unstable; urgency=medium
* New upstream release
diff -Nru dolfinx-mpc-0.9.1/debian/patches/free_MPI_communicator_PR171.patch dolfinx-mpc-0.9.1/debian/patches/free_MPI_communicator_PR171.patch
--- dolfinx-mpc-0.9.1/debian/patches/free_MPI_communicator_PR171.patch 1970-01-01 01:00:00.000000000 +0100
+++ dolfinx-mpc-0.9.1/debian/patches/free_MPI_communicator_PR171.patch 2025-07-09 12:33:18.000000000 +0200
@@ -0,0 +1,156 @@
+From 40298081b822513d1b188d7d5d2ed8f66395ef87 Mon Sep 17 00:00:00 2001
+From: jorgensd <dokken92@gmail.com>
+Date: Thu, 3 Jul 2025 06:38:31 +0000
+Subject: [PATCH 1/2] Free communicators after usage. Should resolve: #170
+
+---
+ cpp/ContactConstraint.h | 21 +++++++++++++++++----
+ cpp/PeriodicConstraint.h | 10 ++++++++--
+ cpp/utils.cpp | 3 ++-
+ cpp/utils.h | 3 +++
+ 4 files changed, 30 insertions(+), 7 deletions(-)
+
+Index: dolfinx-mpc/cpp/ContactConstraint.h
+===================================================================
+--- dolfinx-mpc.orig/cpp/ContactConstraint.h 2025-07-09 12:31:25.942819506 +0200
++++ dolfinx-mpc/cpp/ContactConstraint.h 2025-07-09 12:31:25.938819426 +0200
+@@ -583,6 +583,9 @@
+ num_slaves_recv3.data(), disp3.data(),
+ dolfinx::MPI::mpi_type<U>(), neighborhood_comms[0]);
+
++ int err0 = MPI_Comm_free(&neighborhood_comms[0]);
++ dolfinx::MPI::check_error(comm, err0);
++
+ // Compute off-process contributions
+ mpc_data<T> remote_data;
+ {
+@@ -735,6 +738,9 @@
+ /// Wait for all communication to finish
+ MPI_Waitall(4, requests.data(), status.data());
+
++ int err1 = MPI_Comm_free(&neighborhood_comms[1]);
++ dolfinx::MPI::check_error(comm, err1);
++
+ // Move the masters, coeffs and owners from the input adjacency list
+ // to one where each node corresponds to an entry in slave_indices_remote
+ std::vector<std::int32_t> offproc_offsets(slave_indices_remote.size() + 1, 0);
+@@ -953,10 +959,6 @@
+ std::array<MPI_Comm, 2> neighborhood_comms
+ = create_neighborhood_comms(comm, meshtags, has_slave, master_marker);
+
+- // Create communicator local_blocks -> ghost_block
+- MPI_Comm slave_to_ghost
+- = create_owner_to_ghost_comm(local_blocks, ghost_blocks, imap);
+-
+ /// Compute which rank (relative to neighbourhood) to send each ghost to
+ std::span<const int> ghost_owners = imap->owners();
+
+@@ -1171,6 +1173,9 @@
+ num_block_coordinates.data(), coordinate_disp.data(),
+ dolfinx::MPI::mpi_type<U>(), neighborhood_comms[0]);
+
++ int err0 = MPI_Comm_free(&neighborhood_comms[0]);
++ dolfinx::MPI::check_error(comm, err0);
++
+ // Vector for processes with slaves, mapping slaves with
+ // collision on this process
+ std::vector<std::vector<std::int64_t>> collision_slaves(indegree);
+@@ -1394,6 +1399,9 @@
+ recv_num_found_blocks.data(), inc_block_disp.data(),
+ dolfinx::MPI::mpi_type<std::int32_t>(), neighborhood_comms[1]);
+
++ int err1 = MPI_Comm_free(&neighborhood_comms[1]);
++ dolfinx::MPI::check_error(comm, err1);
++
+ // Iterate through the processors
+ for (std::size_t i = 0; i < src_ranks_rev.size(); ++i)
+ {
+@@ -1476,6 +1484,8 @@
+ ghost_slaves[i * tdim + j] = ghost_blocks[i] * block_size + j;
+
+ // Compute source and dest ranks of communicator
++ MPI_Comm slave_to_ghost
++ = create_owner_to_ghost_comm(local_blocks, ghost_blocks, imap);
+ auto neighbour_ranks = dolfinx_mpc::compute_neighborhood(slave_to_ghost);
+ const std::vector<int>& src_ranks_ghost = neighbour_ranks.first;
+ const std::vector<int>& dest_ranks_ghost = neighbour_ranks.second;
+@@ -1640,6 +1650,9 @@
+ disp_recv_ghost_masters.data(), dolfinx::MPI::mpi_type<std::int32_t>(),
+ slave_to_ghost);
+
++ int err3 = MPI_Comm_free(&slave_to_ghost);
++ dolfinx::MPI::check_error(comm, err3);
++
+ // Accumulate offsets of masters from different processors
+ std::vector<std::int32_t> ghost_offsets = {0};
+ for (std::size_t i = 0; i < src_ranks_ghost.size(); ++i)
+Index: dolfinx-mpc/cpp/PeriodicConstraint.h
+===================================================================
+--- dolfinx-mpc.orig/cpp/PeriodicConstraint.h 2025-07-09 12:31:25.942819506 +0200
++++ dolfinx-mpc/cpp/PeriodicConstraint.h 2025-07-09 12:31:25.938819426 +0200
+@@ -246,7 +246,7 @@
+ // Slave block owners -> Process with possible masters
+ std::vector<int> s_to_m_weights(s_to_m_ranks.size(), 1);
+ std::vector<int> m_to_s_weights(m_to_s_ranks.size(), 1);
+- auto slave_to_master = MPI_COMM_NULL;
++ MPI_Comm slave_to_master = MPI_COMM_NULL;
+ MPI_Dist_graph_create_adjacent(
+ mesh->comm(), (int)m_to_s_ranks.size(), m_to_s_ranks.data(),
+ m_to_s_weights.data(), (int)s_to_m_ranks.size(), s_to_m_ranks.data(),
+@@ -335,6 +335,9 @@
+ dolfinx::MPI::mpi_type<U>(), coords_recvb.data(), num_recv_slaves.data(),
+ disp_in.data(), dolfinx::MPI::mpi_type<U>(), slave_to_master);
+
++ int err = MPI_Comm_free(&slave_to_master);
++ dolfinx::MPI::check_error(mesh->comm(), err);
++
+ // Reset in_displacements to be per block for later usage
+ auto d_3 = [](auto& num) { num /= 3; };
+ std::ranges::for_each(disp_in, d_3);
+@@ -426,7 +429,7 @@
+
+ // Create inverse communicator
+ // Procs with possible masters -> slave block owners
+- auto master_to_slave = MPI_COMM_NULL;
++ MPI_Comm master_to_slave = MPI_COMM_NULL;
+ MPI_Dist_graph_create_adjacent(
+ mesh->comm(), (int)s_to_m_ranks.size(), s_to_m_ranks.data(),
+ s_to_m_weights.data(), (int)m_to_s_ranks.size(), m_to_s_ranks.data(),
+@@ -438,6 +441,9 @@
+ num_masters_per_slave_remote, masters_remote, coeffs_remote,
+ owners_remote);
+
++ err = MPI_Comm_free(&master_to_slave);
++ dolfinx::MPI::check_error(mesh->comm(), err);
++
+ // Append found slaves/master pairs
+ dolfinx_mpc::append_master_data<T>(
+ recv_data, searching_dofs, slaves, masters, coeffs, owners,
+Index: dolfinx-mpc/cpp/utils.cpp
+===================================================================
+--- dolfinx-mpc.orig/cpp/utils.cpp 2025-07-09 12:31:25.942819506 +0200
++++ dolfinx-mpc/cpp/utils.cpp 2025-07-09 12:31:25.938819426 +0200
+@@ -116,7 +116,8 @@
+ source_weights.data(), dest_edges.size(),
+ dest_edges.data(), dest_weights.data(),
+ MPI_INFO_NULL, false, &comm_loc);
+-
++ int err = MPI_Comm_free(&comm);
++ dolfinx::MPI::check_error(index_map->comm(), err);
+ return comm_loc;
+ }
+
+Index: dolfinx-mpc/cpp/utils.h
+===================================================================
+--- dolfinx-mpc.orig/cpp/utils.h 2025-07-09 12:31:25.942819506 +0200
++++ dolfinx-mpc/cpp/utils.h 2025-07-09 12:31:25.938819426 +0200
+@@ -944,6 +944,9 @@
+ disp_in_masters.data(), dolfinx::MPI::mpi_type<T>(),
+ local_to_ghost, &ghost_requests[4]);
+
++ int err = MPI_Comm_free(&local_to_ghost);
++ dolfinx::MPI::check_error(imap.comm(), err);
++
+ mpc_data<T> ghost_data;
+ ghost_data.slaves = recv_local;
+ ghost_data.offsets = recv_num;
diff -Nru dolfinx-mpc-0.9.1/debian/patches/series dolfinx-mpc-0.9.1/debian/patches/series
--- dolfinx-mpc-0.9.1/debian/patches/series 2025-03-10 21:45:46.000000000 +0100
+++ dolfinx-mpc-0.9.1/debian/patches/series 2025-07-09 12:33:18.000000000 +0200
@@ -2,3 +2,4 @@
tests_no_numba.patch
cmake_no_runpath.patch
python_local_LICENSE.patch
+free_MPI_communicator_PR171.patch
Reply to: