From d56aa0e58f656f3d83315fcf43206fa91e9ad12e Mon Sep 17 00:00:00 2001 From: cgilet Date: Mon, 2 Jun 2025 16:49:05 +0200 Subject: [PATCH 1/2] Fix memory leak for direction_dependent BCs --- src/projection/incflo_apply_nodal_projection.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/projection/incflo_apply_nodal_projection.cpp b/src/projection/incflo_apply_nodal_projection.cpp index df1da3c4..334e8eb5 100644 --- a/src/projection/incflo_apply_nodal_projection.cpp +++ b/src/projection/incflo_apply_nodal_projection.cpp @@ -167,12 +167,16 @@ void incflo::ApplyNodalProjection (Vector const& density, if (has_inout_bndry && set_inflow_bc) { Vector> vel_vec(finest_level+1); + Vector, AMREX_SPACEDIM>> vel_alias(finest_level+1); for (int lev = 0; lev <= finest_level; lev++) { auto& ld = *m_leveldata[lev]; - AMREX_D_TERM(vel_vec[lev][0] = new MultiFab(ld.velocity, amrex::make_alias, 0, 1);, - vel_vec[lev][1] = new MultiFab(ld.velocity, amrex::make_alias, 1, 1);, - vel_vec[lev][2] = new MultiFab(ld.velocity, amrex::make_alias, 2, 1);); + AMREX_D_TERM(vel_alias[lev][0] = std::make_unique(ld.velocity, amrex::make_alias, 0, 1);, + vel_alias[lev][1] = std::make_unique(ld.velocity, amrex::make_alias, 1, 1);, + vel_alias[lev][2] = std::make_unique(ld.velocity, amrex::make_alias, 2, 1);); + AMREX_D_TERM(vel_vec[lev][0] = vel_alias[lev][0].get();, + vel_vec[lev][1] = vel_alias[lev][1].get();, + vel_vec[lev][2] = vel_alias[lev][2].get();); } HydroUtils::enforceInOutSolvability(vel_vec, get_velocity_bcrec().data(), geom, true); From eef0596e8833254207a36355dbebfab30e506dd6 Mon Sep 17 00:00:00 2001 From: cgilet Date: Mon, 2 Jun 2025 21:00:44 +0200 Subject: [PATCH 2/2] Better way to do it --- src/projection/incflo_apply_nodal_projection.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/projection/incflo_apply_nodal_projection.cpp b/src/projection/incflo_apply_nodal_projection.cpp index 334e8eb5..dad0239f 100644 --- a/src/projection/incflo_apply_nodal_projection.cpp +++ b/src/projection/incflo_apply_nodal_projection.cpp @@ -166,20 +166,16 @@ void incflo::ApplyNodalProjection (Vector const& density, // Enforce solvability by matching outflow to inflow. if (has_inout_bndry && set_inflow_bc) { - Vector> vel_vec(finest_level+1); - Vector, AMREX_SPACEDIM>> vel_alias(finest_level+1); + Vector> vel_vec(finest_level+1); for (int lev = 0; lev <= finest_level; lev++) { auto& ld = *m_leveldata[lev]; - AMREX_D_TERM(vel_alias[lev][0] = std::make_unique(ld.velocity, amrex::make_alias, 0, 1);, - vel_alias[lev][1] = std::make_unique(ld.velocity, amrex::make_alias, 1, 1);, - vel_alias[lev][2] = std::make_unique(ld.velocity, amrex::make_alias, 2, 1);); - AMREX_D_TERM(vel_vec[lev][0] = vel_alias[lev][0].get();, - vel_vec[lev][1] = vel_alias[lev][1].get();, - vel_vec[lev][2] = vel_alias[lev][2].get();); + AMREX_D_TERM(vel_vec[lev][0] = MultiFab(ld.velocity, amrex::make_alias, 0, 1);, + vel_vec[lev][1] = MultiFab(ld.velocity, amrex::make_alias, 1, 1);, + vel_vec[lev][2] = MultiFab(ld.velocity, amrex::make_alias, 2, 1);); } - HydroUtils::enforceInOutSolvability(vel_vec, get_velocity_bcrec().data(), geom, true); + HydroUtils::enforceInOutSolvability(GetVecOfArrOfPtrs(vel_vec), get_velocity_bcrec().data(), geom, true); } LPInfo info;