Skip to content

Commit 610beb6

Browse files
committed
Recover boundary elements (idaholab#32198)
1 parent 4545b09 commit 610beb6

File tree

3 files changed

+29
-9
lines changed

3 files changed

+29
-9
lines changed

framework/include/utils/MooseUtils.h

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -648,14 +648,10 @@ getUnion(const std::vector<T> & vector1, const std::vector<T> & vector2, std::ve
648648
{
649649
std::unordered_set<T> unique_elements;
650650
unique_elements.reserve(vector1.size() + vector2.size());
651-
652-
for (const T & entry : vector1)
653-
unique_elements.insert(entry);
654-
for (const T & entry : vector2)
655-
unique_elements.insert(entry);
651+
unique_elements.insert(vector1.begin(), vector1.end());
652+
unique_elements.insert(vector2.begin(), vector2.end());
656653

657654
// Now populate the common vector with the union
658-
common.clear();
659655
common.assign(unique_elements.begin(), unique_elements.end());
660656
}
661657

modules/solid_mechanics/include/timeintegrators/NEML2CentralDifference.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class NEML2CentralDifference : public ExplicitMixedOrder
3636

3737
private:
3838
/// Empty element vector to help zero out the algebraic range
39-
std::vector<const Elem *> _no_elem = {};
39+
std::vector<const Elem *> _boundary_elements = {};
4040

4141
/// Empty node vector to help zero out the algebraic range
4242
std::vector<const Node *> _no_node = {};

modules/solid_mechanics/src/timeintegrators/NEML2CentralDifference.C

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
//* Licensed under LGPL 2.1, please see LICENSE for details
88
//* https://www.gnu.org/licenses/lgpl-2.1.html
99

10+
#include "MooseTypes.h"
11+
#include "IntegratedBCBase.h"
12+
1013
#ifdef NEML2_ENABLED
1114

1215
// MOOSE includes
@@ -35,6 +38,27 @@ NEML2CentralDifference::NEML2CentralDifference(const InputParameters & parameter
3538
void
3639
NEML2CentralDifference::initialSetup()
3740
{
41+
// build boundary element list by iterating over all integrated BCs
42+
const auto & ibcs = _nl->getIntegratedBCWarehouse();
43+
std::unordered_set<BoundaryID> bnds;
44+
for (const auto & ibc : ibcs.getObjects())
45+
bnds.insert(ibc->boundaryIDs().begin(), ibc->boundaryIDs().end());
46+
47+
if (!bnds.empty())
48+
{
49+
mooseInfo("Dectected BCs on ", bnds.size(), " boundaries.");
50+
51+
// deduplicate elements that have multiple boundaries
52+
std::unordered_set<const Elem *> unique_elems;
53+
const auto end = _fe_problem.mesh().bndElemsEnd();
54+
for (auto it = _fe_problem.mesh().bndElemsBegin(); it != end; ++it)
55+
if (bnds.find((*it)->_bnd_id) != bnds.end())
56+
unique_elems.insert((*it)->_elem);
57+
58+
_boundary_elems.assign(unique_elems.begin(), unique_elems.end());
59+
mooseInfo("Adding ", _boundary_elems.size(), " elements to the algebraic range.");
60+
}
61+
3862
ExplicitMixedOrder::initialSetup();
3963
_neml2_assembly = &_fe_problem.getUserObject<NEML2Assembly>("assembly", /*tid=*/0);
4064
_fe = &_fe_problem.getUserObject<NEML2FEInterpolation>("fe", /*tid=*/0);
@@ -52,8 +76,8 @@ NEML2CentralDifference::evaluateRHSResidual()
5276
{
5377
if (_fe->contextUpToDate() && _neml2_assembly->upToDate())
5478
{
55-
libMesh::ConstElemRange null_elem_range(&_no_elem);
56-
_fe_problem.setCurrentAlgebraicElementRange(&null_elem_range);
79+
libMesh::ConstElemRange boundary_elem_range(&_boundary_elems);
80+
_fe_problem.setCurrentAlgebraicElementRange(&boundary_elem_range);
5781

5882
libMesh::ConstNodeRange null_node_range(&_no_node);
5983
_fe_problem.setCurrentAlgebraicNodeRange(&null_node_range);

0 commit comments

Comments
 (0)