Skip to content

Commit

Permalink
Merge pull request #27703 from miaoyinb/revolvePR
Browse files Browse the repository at this point in the history
Enable Mesh Revolving
  • Loading branch information
GiudGiud authored Jun 14, 2024
2 parents aba4d5f + 66d7916 commit c36c4a1
Show file tree
Hide file tree
Showing 39 changed files with 3,386 additions and 131 deletions.
10 changes: 1 addition & 9 deletions framework/include/meshgenerators/AdvancedExtruderGenerator.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ class AdvancedExtruderGenerator : public MeshGenerator
std::vector<std::unordered_map<boundary_id_type, boundary_id_type>> _boundary_swap_pairs;

/// Easier to work with version of _elem_integers_swaps
std::vector<std::unordered_map<unsigned int, unsigned int>> _elem_integers_swap_pairs;
std::vector<std::unordered_map<dof_id_type, dof_id_type>> _elem_integers_swap_pairs;

/// The direction of the extrusion
Point _direction;
Expand All @@ -83,12 +83,4 @@ class AdvancedExtruderGenerator : public MeshGenerator

/// Axial pitch for a full rotation
const Real _twist_pitch;

/**
* Swap two nodes within an element
* @param elem element whose nodes need to be swapped
* @param nd1 index of the first node to be swapped
* @param nd2 index of the second node to be swapped
*/
void swapNodesInElem(Elem & elem, const unsigned int nd1, const unsigned int nd2);
};
62 changes: 62 additions & 0 deletions framework/include/utils/MooseMeshUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -316,4 +316,66 @@ getIDFromName(const T & name)

return id_Q;
}

/**
* Swap two nodes within an element
* @param elem element whose nodes need to be swapped
* @param nd1 index of the first node to be swapped
* @param nd2 index of the second node to be swapped
*/
void swapNodesInElem(Elem & elem, const unsigned int nd1, const unsigned int nd2);

/**
* Reprocess the swap related input parameters to make pairs out of them to ease further processing
* @param class_name name of the mesh generator class used for exception messages
* @param id_name name of the parameter to be swapped used for exception messages
* @param id_swaps vector of vectors of the ids to be swapped
* @param id_swap_pairs vector of maps of the swapped pairs
* @param row_index_shift shift to be applied to the row index in the exception messages (useful
* when this method is utilized to process a fraction of a long vector)
*/
template <typename T>
void
idSwapParametersProcessor(const std::string & class_name,
const std::string & id_name,
const std::vector<std::vector<T>> & id_swaps,
std::vector<std::unordered_map<T, T>> & id_swap_pairs,
const unsigned int row_index_shift = 0)
{
id_swap_pairs.resize(id_swaps.size());
for (const auto i : index_range(id_swaps))
{
const auto & swaps = id_swaps[i];
auto & swap_pairs = id_swap_pairs[i];

if (swaps.size() % 2)
throw MooseException("Row ",
row_index_shift + i + 1,
" of ",
id_name,
" in ",
class_name,
" does not contain an even number of entries! Num entries: ",
swaps.size());

swap_pairs.reserve(swaps.size() / 2);
for (unsigned int j = 0; j < swaps.size(); j += 2)
swap_pairs[swaps[j]] = swaps[j + 1];
}
}

/**
* Reprocess the elem_integers_swaps into maps so they are easier to use
* @param class_name name of the mesh generator class used for exception messages
* @param num_sections number of sections in the mesh
* @param num_integers number of extra element integers in the mesh
* @param elem_integers_swaps vector of vectors of vectors of extra element ids to be swapped
* @param elem_integers_swap_pairs vector of maps of the swapped pairs
*/
void extraElemIntegerSwapParametersProcessor(
const std::string & class_name,
const unsigned int num_sections,
const unsigned int num_integers,
const std::vector<std::vector<std::vector<dof_id_type>>> & elem_integers_swaps,
std::vector<std::unordered_map<dof_id_type, dof_id_type>> & elem_integers_swap_pairs);
}
190 changes: 75 additions & 115 deletions framework/src/meshgenerators/AdvancedExtruderGenerator.C
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

#include "AdvancedExtruderGenerator.h"
#include "MooseUtils.h"
#include "MooseMeshUtils.h"

#include "libmesh/boundary_info.h"
#include "libmesh/function_base.h"
Expand Down Expand Up @@ -179,51 +180,29 @@ AdvancedExtruderGenerator::AdvancedExtruderGenerator(const InputParameters & par
"If specified, 'subdomain_swaps' must be the same length as 'heights' in ",
name());

_subdomain_swap_pairs.resize(_subdomain_swaps.size());

// Reprocess the subdomain swaps to make pairs out of them so they are easier to use
for (unsigned int i = 0; i < _subdomain_swaps.size(); i++)
try
{
const auto & elevation_swaps = _subdomain_swaps[i];
auto & elevation_swap_pairs = _subdomain_swap_pairs[i];

if (elevation_swaps.size() % 2)
paramError("subdomain_swaps",
"Row ",
i + 1,
" of subdomain_swaps in ",
name(),
" does not contain an even number of entries! Num entries: ",
elevation_swaps.size());

for (unsigned int j = 0; j < elevation_swaps.size(); j += 2)
elevation_swap_pairs[elevation_swaps[j]] = elevation_swaps[j + 1];
MooseMeshUtils::idSwapParametersProcessor(
name(), "subdomain_swaps", _subdomain_swaps, _subdomain_swap_pairs);
}
catch (const MooseException & e)
{
paramError("subdomain_swaps", e.what());
}

if (_boundary_swaps.size() && (_boundary_swaps.size() != num_elevations))
paramError("boundary_swaps",
"If specified, 'boundary_swaps' must be the same length as 'heights' in ",
name());

_boundary_swap_pairs.resize(_boundary_swaps.size());

// Reprocess the boundary swaps to make pairs out of them so they are easier to use
for (unsigned int i = 0; i < _boundary_swaps.size(); i++)
try
{
const auto & elevation_bdry_swaps = _boundary_swaps[i];
auto & elevation_bdry_swap_pairs = _boundary_swap_pairs[i];

if (elevation_bdry_swaps.size() % 2)
paramError("boundary_swaps",
"Row ",
i + 1,
" of boundary_swaps in ",
name(),
" does not contain an even number of entries! Num entries: ",
elevation_bdry_swaps.size());

for (unsigned int j = 0; j < elevation_bdry_swaps.size(); j += 2)
elevation_bdry_swap_pairs[elevation_bdry_swaps[j]] = elevation_bdry_swaps[j + 1];
MooseMeshUtils::idSwapParametersProcessor(
name(), "boundary_swaps", _boundary_swaps, _boundary_swap_pairs);
}
catch (const MooseException & e)
{
paramError("boundary_swaps", e.what());
}

if (_elem_integers_swaps.size() &&
Expand All @@ -238,26 +217,17 @@ AdvancedExtruderGenerator::AdvancedExtruderGenerator(const InputParameters & par
"If specified, each element of 'elem_integers_swaps' must have the same length as "
"the length of 'heights'.");

_elem_integers_swap_pairs.resize(num_elevations * _elem_integer_names_to_swap.size());
// Reprocess the elem_integers_swaps to make pairs out of them so they are easier to use
for (unsigned int i = 0; i < _elem_integer_names_to_swap.size(); i++)
try
{
for (unsigned int j = 0; j < num_elevations; j++)
{
const auto & elevation_extra_swaps = _elem_integers_swaps[i][j];
auto & elevation_extra_swap_pairs = _elem_integers_swap_pairs[i * num_elevations + j];

if (elevation_extra_swaps.size() % 2)
paramError("elem_integers_swaps",
"Row ",
i * num_elevations + j + 1,
" of elem_integers_swaps in ",
name(),
" does not contain an even number of entries! Num entries: ",
elevation_extra_swaps.size());
for (unsigned int k = 0; k < elevation_extra_swaps.size(); k += 2)
elevation_extra_swap_pairs[elevation_extra_swaps[k]] = elevation_extra_swaps[k + 1];
}
MooseMeshUtils::extraElemIntegerSwapParametersProcessor(name(),
num_elevations,
_elem_integer_names_to_swap.size(),
_elem_integers_swaps,
_elem_integers_swap_pairs);
}
catch (const MooseException & e)
{
paramError("elem_integers_swaps", e.what());
}

bool has_negative_entry = false;
Expand Down Expand Up @@ -502,7 +472,7 @@ AdvancedExtruderGenerator::generate()
for (unsigned int k = 0; k != num_layers; ++k)
{
std::unique_ptr<Elem> new_elem;
bool isFlipped(false);
bool is_flipped(false);
switch (etype)
{
case EDGE2:
Expand Down Expand Up @@ -578,10 +548,10 @@ AdvancedExtruderGenerator::generate()

if (new_elem->volume() < 0.0)
{
swapNodesInElem(*new_elem, 0, 3);
swapNodesInElem(*new_elem, 1, 4);
swapNodesInElem(*new_elem, 2, 5);
isFlipped = true;
MooseMeshUtils::swapNodesInElem(*new_elem, 0, 3);
MooseMeshUtils::swapNodesInElem(*new_elem, 1, 4);
MooseMeshUtils::swapNodesInElem(*new_elem, 2, 5);
is_flipped = true;
}

break;
Expand Down Expand Up @@ -635,13 +605,13 @@ AdvancedExtruderGenerator::generate()

if (new_elem->volume() < 0.0)
{
swapNodesInElem(*new_elem, 0, 3);
swapNodesInElem(*new_elem, 1, 4);
swapNodesInElem(*new_elem, 2, 5);
swapNodesInElem(*new_elem, 6, 12);
swapNodesInElem(*new_elem, 7, 13);
swapNodesInElem(*new_elem, 8, 14);
isFlipped = true;
MooseMeshUtils::swapNodesInElem(*new_elem, 0, 3);
MooseMeshUtils::swapNodesInElem(*new_elem, 1, 4);
MooseMeshUtils::swapNodesInElem(*new_elem, 2, 5);
MooseMeshUtils::swapNodesInElem(*new_elem, 6, 12);
MooseMeshUtils::swapNodesInElem(*new_elem, 7, 13);
MooseMeshUtils::swapNodesInElem(*new_elem, 8, 14);
is_flipped = true;
}

break;
Expand Down Expand Up @@ -701,14 +671,14 @@ AdvancedExtruderGenerator::generate()

if (new_elem->volume() < 0.0)
{
swapNodesInElem(*new_elem, 0, 3);
swapNodesInElem(*new_elem, 1, 4);
swapNodesInElem(*new_elem, 2, 5);
swapNodesInElem(*new_elem, 6, 12);
swapNodesInElem(*new_elem, 7, 13);
swapNodesInElem(*new_elem, 8, 14);
swapNodesInElem(*new_elem, 18, 19);
isFlipped = true;
MooseMeshUtils::swapNodesInElem(*new_elem, 0, 3);
MooseMeshUtils::swapNodesInElem(*new_elem, 1, 4);
MooseMeshUtils::swapNodesInElem(*new_elem, 2, 5);
MooseMeshUtils::swapNodesInElem(*new_elem, 6, 12);
MooseMeshUtils::swapNodesInElem(*new_elem, 7, 13);
MooseMeshUtils::swapNodesInElem(*new_elem, 8, 14);
MooseMeshUtils::swapNodesInElem(*new_elem, 18, 19);
is_flipped = true;
}

break;
Expand Down Expand Up @@ -744,11 +714,11 @@ AdvancedExtruderGenerator::generate()

if (new_elem->volume() < 0.0)
{
swapNodesInElem(*new_elem, 0, 4);
swapNodesInElem(*new_elem, 1, 5);
swapNodesInElem(*new_elem, 2, 6);
swapNodesInElem(*new_elem, 3, 7);
isFlipped = true;
MooseMeshUtils::swapNodesInElem(*new_elem, 0, 4);
MooseMeshUtils::swapNodesInElem(*new_elem, 1, 5);
MooseMeshUtils::swapNodesInElem(*new_elem, 2, 6);
MooseMeshUtils::swapNodesInElem(*new_elem, 3, 7);
is_flipped = true;
}

break;
Expand Down Expand Up @@ -808,15 +778,15 @@ AdvancedExtruderGenerator::generate()

if (new_elem->volume() < 0.0)
{
swapNodesInElem(*new_elem, 0, 4);
swapNodesInElem(*new_elem, 1, 5);
swapNodesInElem(*new_elem, 2, 6);
swapNodesInElem(*new_elem, 3, 7);
swapNodesInElem(*new_elem, 8, 16);
swapNodesInElem(*new_elem, 9, 17);
swapNodesInElem(*new_elem, 10, 18);
swapNodesInElem(*new_elem, 11, 19);
isFlipped = true;
MooseMeshUtils::swapNodesInElem(*new_elem, 0, 4);
MooseMeshUtils::swapNodesInElem(*new_elem, 1, 5);
MooseMeshUtils::swapNodesInElem(*new_elem, 2, 6);
MooseMeshUtils::swapNodesInElem(*new_elem, 3, 7);
MooseMeshUtils::swapNodesInElem(*new_elem, 8, 16);
MooseMeshUtils::swapNodesInElem(*new_elem, 9, 17);
MooseMeshUtils::swapNodesInElem(*new_elem, 10, 18);
MooseMeshUtils::swapNodesInElem(*new_elem, 11, 19);
is_flipped = true;
}

break;
Expand Down Expand Up @@ -890,16 +860,16 @@ AdvancedExtruderGenerator::generate()

if (new_elem->volume() < 0.0)
{
swapNodesInElem(*new_elem, 0, 4);
swapNodesInElem(*new_elem, 1, 5);
swapNodesInElem(*new_elem, 2, 6);
swapNodesInElem(*new_elem, 3, 7);
swapNodesInElem(*new_elem, 8, 16);
swapNodesInElem(*new_elem, 9, 17);
swapNodesInElem(*new_elem, 10, 18);
swapNodesInElem(*new_elem, 11, 19);
swapNodesInElem(*new_elem, 20, 25);
isFlipped = true;
MooseMeshUtils::swapNodesInElem(*new_elem, 0, 4);
MooseMeshUtils::swapNodesInElem(*new_elem, 1, 5);
MooseMeshUtils::swapNodesInElem(*new_elem, 2, 6);
MooseMeshUtils::swapNodesInElem(*new_elem, 3, 7);
MooseMeshUtils::swapNodesInElem(*new_elem, 8, 16);
MooseMeshUtils::swapNodesInElem(*new_elem, 9, 17);
MooseMeshUtils::swapNodesInElem(*new_elem, 10, 18);
MooseMeshUtils::swapNodesInElem(*new_elem, 11, 19);
MooseMeshUtils::swapNodesInElem(*new_elem, 20, 25);
is_flipped = true;
}

break;
Expand Down Expand Up @@ -938,7 +908,7 @@ AdvancedExtruderGenerator::generate()
for (unsigned int i = 0; i < _upward_boundary_source_blocks[e].size(); i++)
if (new_elem->subdomain_id() == _upward_boundary_source_blocks[e][i])
boundary_info.add_side(
new_elem.get(), isFlipped ? 0 : top_id, _upward_boundary_ids[e][i]);
new_elem.get(), is_flipped ? 0 : top_id, _upward_boundary_ids[e][i]);
}
// define downward boundaries
if (k == 0)
Expand All @@ -948,7 +918,7 @@ AdvancedExtruderGenerator::generate()
for (unsigned int i = 0; i < _downward_boundary_source_blocks[e].size(); i++)
if (new_elem->subdomain_id() == _downward_boundary_source_blocks[e][i])
boundary_info.add_side(
new_elem.get(), isFlipped ? top_id : 0, _downward_boundary_ids[e][i]);
new_elem.get(), is_flipped ? top_id : 0, _downward_boundary_ids[e][i]);
}

if (_subdomain_swap_pairs.size())
Expand Down Expand Up @@ -1029,9 +999,9 @@ AdvancedExtruderGenerator::generate()
const unsigned short top_id =
added_elem->dim() == 3 ? cast_int<unsigned short>(elem->n_sides() + 1) : 2;
if (_has_bottom_boundary)
boundary_info.add_side(added_elem, isFlipped ? top_id : 0, _bottom_boundary);
boundary_info.add_side(added_elem, is_flipped ? top_id : 0, _bottom_boundary);
else
boundary_info.add_side(added_elem, isFlipped ? top_id : 0, next_side_id);
boundary_info.add_side(added_elem, is_flipped ? top_id : 0, next_side_id);
}

if (current_layer == total_num_layers - 1)
Expand All @@ -1043,10 +1013,10 @@ AdvancedExtruderGenerator::generate()
added_elem->dim() == 3 ? cast_int<unsigned short>(elem->n_sides() + 1) : 2;

if (_has_top_boundary)
boundary_info.add_side(added_elem, isFlipped ? 0 : top_id, _top_boundary);
boundary_info.add_side(added_elem, is_flipped ? 0 : top_id, _top_boundary);
else
boundary_info.add_side(
added_elem, isFlipped ? 0 : top_id, cast_int<boundary_id_type>(next_side_id + 1));
added_elem, is_flipped ? 0 : top_id, cast_int<boundary_id_type>(next_side_id + 1));
}

current_layer++;
Expand Down Expand Up @@ -1079,13 +1049,3 @@ AdvancedExtruderGenerator::generate()

return mesh;
}

void
AdvancedExtruderGenerator::swapNodesInElem(Elem & elem,
const unsigned int nd1,
const unsigned int nd2)
{
Node * n_temp = elem.node_ptr(nd1);
elem.set_node(nd1) = elem.node_ptr(nd2);
elem.set_node(nd2) = n_temp;
}
Loading

0 comments on commit c36c4a1

Please sign in to comment.