9 #include <stk_mesh/fixtures/GridFixture.hpp> 11 #include <Shards_BasicTopologies.hpp> 13 #include <stk_util/parallel/Parallel.hpp> 15 #include <stk_mesh/base/MetaData.hpp> 16 #include <stk_mesh/base/BulkData.hpp> 17 #include <stk_mesh/base/Entity.hpp> 18 #include <stk_mesh/base/GetEntities.hpp> 20 #include <stk_mesh/fem/FEMMetaData.hpp> 21 #include <stk_mesh/fem/FEMHelpers.hpp> 45 : m_spatial_dimension(2)
46 , m_fem_meta( m_spatial_dimension, fem::entity_rank_names(m_spatial_dimension) )
47 , m_bulk_data(
stk_classic::mesh::fem::FEMMetaData::get_meta_data(m_fem_meta) , pm )
48 , m_quad_part( fem::
declare_part<shards::Quadrilateral<4> >(m_fem_meta,
"quad_part") )
52 GridFixture::~GridFixture()
55 void GridFixture::generate_grid()
57 const unsigned num_nodes = 25;
58 const unsigned num_quad_faces = 16;
59 const unsigned p_rank = m_bulk_data.parallel_rank();
60 const unsigned p_size = m_bulk_data.parallel_size();
61 const EntityRank element_rank = m_fem_meta.element_rank();
62 std::vector<Entity*> all_entities;
66 std::vector<unsigned> quad_face_ids(num_quad_faces);
67 std::vector<unsigned> node_ids(num_nodes);
70 for (
unsigned i = 0 ; i < num_quad_faces; ++i, ++curr_id) {
71 quad_face_ids[i] = curr_id;
73 for (
unsigned i = 0 ; i < num_nodes; ++i, ++curr_id) {
74 node_ids[i] = curr_id;
85 const unsigned first_quad = (p_rank * num_quad_faces) / p_size;
86 const unsigned end_quad = ((p_rank + 1) * num_quad_faces) / p_size;
90 face_parts.push_back(&m_quad_part);
91 const unsigned num_nodes_per_quad = 4;
93 const int stencil_for_4x4_quad_mesh[num_nodes_per_quad] = {0, 5, 1, -5};
94 for (
unsigned i = first_quad; i < end_quad; ++i) {
96 unsigned face_id = quad_face_ids[i];
97 unsigned row = (face_id - 1) / num_nodes_per_quad;
99 Entity& face = m_bulk_data.declare_entity(element_rank, face_id, face_parts);
101 unsigned node_id = num_quad_faces + face_id + row;
103 for (
unsigned chg_itr = 0; chg_itr < num_nodes_per_quad; ++chg_itr) {
104 node_id += stencil_for_4x4_quad_mesh[chg_itr];
105 Entity& node = m_bulk_data.declare_entity(fem::FEMMetaData::NODE_RANK, node_id, no_parts);
106 m_bulk_data.declare_relation( face , node , chg_itr);
Part & declare_part(FEMMetaData &meta_data, const std::string &name)
Declare a part with a given cell topology. This is just a convenient function that wraps FEMMetaData'...
std::vector< Part *> PartVector
Collections of parts are frequently maintained as a vector of Part pointers.