diff --git a/src/shammodels/gsph/include/shammodels/gsph/Solver.hpp b/src/shammodels/gsph/include/shammodels/gsph/Solver.hpp index a1b9c54c24..d864d916e4 100644 --- a/src/shammodels/gsph/include/shammodels/gsph/Solver.hpp +++ b/src/shammodels/gsph/include/shammodels/gsph/Solver.hpp @@ -89,7 +89,10 @@ namespace shammodels::gsph { // Serial patch tree control void gen_serial_patch_tree(); - inline void reset_serial_patch_tree() { storage.serial_patch_tree.reset(); } + inline void reset_serial_patch_tree() { + shambase::get_check_ref(storage.serial_patch_tree_ref).free_alloc(); + storage.serial_patch_tree.reset(); + } // Ghost handling - use GSPH ghost handler with Newtonian field names using GhostHandle = GSPHGhostHandler; diff --git a/src/shammodels/gsph/include/shammodels/gsph/modules/SolverStorage.hpp b/src/shammodels/gsph/include/shammodels/gsph/modules/SolverStorage.hpp index 0a4ee8cd88..629ac7fd74 100644 --- a/src/shammodels/gsph/include/shammodels/gsph/modules/SolverStorage.hpp +++ b/src/shammodels/gsph/include/shammodels/gsph/modules/SolverStorage.hpp @@ -36,6 +36,7 @@ #include "shamrock/solvergraph/FieldRefs.hpp" #include "shamrock/solvergraph/Indexes.hpp" #include "shamrock/solvergraph/ScalarsEdge.hpp" +#include "shamrock/solvergraph/SerialPatchTreeEdge.hpp" #include "shamrock/solvergraph/SolverGraph.hpp" #include "shamsys/legacy/log.hpp" #include "shamtree/CompressedLeafBVH.hpp" @@ -88,6 +89,8 @@ namespace shammodels::gsph { /// Patch rank ownership std::shared_ptr> patch_rank_owner; + std::shared_ptr> serial_patch_tree_ref; + /// Serial patch tree for load balancing Component> serial_patch_tree; diff --git a/src/shammodels/gsph/src/Solver.cpp b/src/shammodels/gsph/src/Solver.cpp index f076e76fab..548626a8f5 100644 --- a/src/shammodels/gsph/src/Solver.cpp +++ b/src/shammodels/gsph/src/Solver.cpp @@ -91,6 +91,12 @@ void shammodels::gsph::Solver::init_solver_graph() { storage.ghost_handler = storage.solver_graph.register_edge( "ghost_handler", solvergraph::GhostHandlerEdge("ghost_handler", "\\mathcal{G}")); + // Register serial patch tree reference edge for dependency tracking + storage.serial_patch_tree_ref = storage.solver_graph.register_edge( + "serial_patch_tree", + shamrock::solvergraph::SerialPatchTreeRefEdge( + "serial_patch_tree", "\\mathcal{T}_{\\rm patch}")); + storage.omega = std::make_shared>(1, "omega", "\\Omega"); storage.density = std::make_shared>(1, "density", "\\rho"); storage.pressure = std::make_shared>(1, "pressure", "P"); @@ -125,6 +131,10 @@ void shammodels::gsph::Solver::gen_serial_patch_tree() { SerialPatchTree _sptree = SerialPatchTree::build(scheduler()); _sptree.attach_buf(); storage.serial_patch_tree.set(std::move(_sptree)); + + // Set solvergraph edge reference to the stored tree + shambase::get_check_ref(storage.serial_patch_tree_ref).patch_tree + = storage.serial_patch_tree.get(); } template class Kern>