From 78dda1d036e1a73e5636fc172ace1bf3b8afe6b1 Mon Sep 17 00:00:00 2001 From: mayani_s Date: Wed, 17 Jun 2026 19:07:44 +0200 Subject: [PATCH] fix by applying BCs before lifting --- src/FEM/LagrangeSpace.hpp | 2 +- src/PoissonSolvers/FEMPoissonSolver.h | 5 +++++ src/PoissonSolvers/PreconditionedFEMPoissonSolver.h | 5 +++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/FEM/LagrangeSpace.hpp b/src/FEM/LagrangeSpace.hpp index b1743cd4f..04d1e15fd 100644 --- a/src/FEM/LagrangeSpace.hpp +++ b/src/FEM/LagrangeSpace.hpp @@ -1417,7 +1417,7 @@ namespace ippl { }); temp_field.accumulateHalo(); - if ((bcType == PERIODIC_FACE) || (bcType == CONSTANT_FACE)) { + if (bcType == PERIODIC_FACE) { bcField.apply(temp_field); bcField.assignGhostToPhysical(temp_field); } diff --git a/src/PoissonSolvers/FEMPoissonSolver.h b/src/PoissonSolvers/FEMPoissonSolver.h index 8c183a6ea..6fd2a14ce 100644 --- a/src/PoissonSolvers/FEMPoissonSolver.h +++ b/src/PoissonSolvers/FEMPoissonSolver.h @@ -125,6 +125,11 @@ namespace ippl { // send boundary values to RHS (load vector) i.e. lifting (Dirichlet BCs) if (bcType == CONSTANT_FACE) { + // Set per-face Dirichlet values on physical boundary nodes before halo exchange; + // fillHalo must see the correct boundary state after load vector assembly. + bcField.apply(*(this->rhs_mp)); + bcField.assignGhostToPhysical(*(this->rhs_mp)); + this->rhs_mp->fillHalo(); *(this->rhs_mp) = *(this->rhs_mp) - lagrangeSpace_m.evaluateAx_lift(*(this->rhs_mp), poissonEquationEval); diff --git a/src/PoissonSolvers/PreconditionedFEMPoissonSolver.h b/src/PoissonSolvers/PreconditionedFEMPoissonSolver.h index 64a917a60..4bf066cfe 100644 --- a/src/PoissonSolvers/PreconditionedFEMPoissonSolver.h +++ b/src/PoissonSolvers/PreconditionedFEMPoissonSolver.h @@ -199,6 +199,11 @@ namespace ippl { // send boundary values to RHS (load vector) i.e. lifting (Dirichlet BCs) if (bcType == CONSTANT_FACE) { + // Set per-face Dirichlet values on physical boundary nodes before halo exchange; + // fillHalo must see the correct boundary state after load vector assembly. + bcField.apply(*(this->rhs_mp)); + bcField.assignGhostToPhysical(*(this->rhs_mp)); + this->rhs_mp->fillHalo(); *(this->rhs_mp) = *(this->rhs_mp) - lagrangeSpace_m.evaluateAx_lift(*(this->rhs_mp), poissonEquationEval);