Skip to content

Commit

Permalink
Added APIs to allow users set the flag: _children_on_boundary
Browse files Browse the repository at this point in the history
The motivaiton is that: "automatic" way might not work for cases.

For example, if the flag is on on a subset of processor cores, and
then we do reparitioning, and then we might hit trouble because
the flag is off on the other processors

I try to avoid having a global reduction to have everyone on the same page.
In fact, we know when we want to allow children on boundary in MOOSE.
In this case, we should set the flag to make the code more robust
  • Loading branch information
fdkong committed Apr 5, 2022
1 parent d6e2dd8 commit aeb6df3
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 8 deletions.
12 changes: 12 additions & 0 deletions include/mesh/boundary_info.h
Original file line number Diff line number Diff line change
Expand Up @@ -874,6 +874,18 @@ class BoundaryInfo : public ParallelObject
const std::multimap<const Elem *, std::pair<unsigned short int, boundary_id_type>> & get_sideset_map() const
{ return _boundary_side_id; }

/**
* \returns Whether or not there are some children on boundary sides
*/
bool is_children_on_boundary_side() const
{ return _children_on_boundary; }

/**
* Whether or not to allow set boundary sides on children elements
*/
void allow_children_on_boundary_side(const bool children_on_boundary)
{ _children_on_boundary = children_on_boundary; }

private:

/**
Expand Down
20 changes: 12 additions & 8 deletions src/mesh/boundary_info.C
Original file line number Diff line number Diff line change
Expand Up @@ -1364,8 +1364,8 @@ void BoundaryInfo::remove_edge (const Elem * elem,
{
libmesh_assert(elem);

// Only level 0 elements unless the flag "_children_on_boundary" is on.
libmesh_assert(elem->level()==0 || _children_on_boundary);
// Only level 0 elements are stored in BoundaryInfo.
libmesh_assert_equal_to (elem->level(), 0);

// Erase (elem, edge, *) entries from map.
erase_if(_boundary_edge_id, elem,
Expand All @@ -1381,8 +1381,8 @@ void BoundaryInfo::remove_edge (const Elem * elem,
{
libmesh_assert(elem);

// Only level 0 elements unless the flag "_children_on_boundary" is on.
libmesh_assert(elem->level() == 0 || _children_on_boundary);
// Only level 0 elements are stored in BoundaryInfo.
libmesh_assert_equal_to (elem->level(), 0);

// Erase (elem, edge, id) entries from map.
erase_if(_boundary_edge_id, elem,
Expand All @@ -1396,8 +1396,8 @@ void BoundaryInfo::remove_shellface (const Elem * elem,
{
libmesh_assert(elem);

// Only level 0 elements unless the flag "_children_on_boundary" is on.
libmesh_assert(elem->level() == 0 || _children_on_boundary);
// Only level 0 elements are stored in BoundaryInfo.
libmesh_assert_equal_to (elem->level(), 0);

// Shells only have 2 faces
libmesh_assert_less(shellface, 2);
Expand All @@ -1416,8 +1416,8 @@ void BoundaryInfo::remove_shellface (const Elem * elem,
{
libmesh_assert(elem);

// Only level 0 elements unless the flag "_children_on_boundary" is on.
libmesh_assert(elem->level() == 0 || _children_on_boundary);
// Only level 0 elements are stored in BoundaryInfo.
libmesh_assert_equal_to (elem->level(), 0);

// Shells only have 2 faces
libmesh_assert_less(shellface, 2);
Expand Down Expand Up @@ -1508,6 +1508,8 @@ unsigned int BoundaryInfo::side_with_boundary_id(const Elem * const elem,
// parent if any
if (elem->level() != 0)
searched_elem_vec.push_back(elem->top_parent());
else if (!_children_on_boundary)
searched_elem_vec.push_back(elem);

for (auto it = searched_elem_vec.begin(); it != searched_elem_vec.end(); ++it)
{
Expand Down Expand Up @@ -1567,6 +1569,8 @@ BoundaryInfo::sides_with_boundary_id(const Elem * const elem,
// Return boundary information of its parent as well
if (elem->level() != 0)
searched_elem_vec.push_back(elem->top_parent());
else if (!_children_on_boundary)
searched_elem_vec.push_back(elem);

for (auto it = searched_elem_vec.begin(); it != searched_elem_vec.end(); ++it)
{
Expand Down

0 comments on commit aeb6df3

Please sign in to comment.