3 #include <libmesh/elem.h>     4 #include <libmesh/enum_elem_type.h>     5 #include <libmesh/mesh.h>     6 #include <libmesh/mesh_generation.h>     9 #include <libmesh/cell_c0polyhedron.h>    10 #include <libmesh/face_c0polygon.h>    18 template <ElemType elem_type>
    28     const Real minpos = 1.5, maxpos = 5.5;
    29     const unsigned int N = 2;
    31     _mesh = std::make_unique<Mesh>(*TestCommWorld);
    33     std::unique_ptr<Elem> test_elem;
    38 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS    40     if (test_elem.get() && test_elem->infinite())
    42         Elem * elem = _mesh->add_elem(std::move(test_elem));
    44         const auto add_point =
    45           [
this, elem](
const unsigned int i,
    55             auto node = _mesh->add_point(
Point(x, y), i);
    57             auto node = _mesh->add_point(
Point(x, y, z), i);
    62         const Real halfpos = (minpos + maxpos) / 2.;
    69             add_point(0, minpos, minpos, minpos);
    70             add_point(1, maxpos, minpos, minpos);
    71             add_point(2+is_quad, maxpos, maxpos, minpos);
    72             add_point(3-is_quad, minpos, maxpos, minpos);
    76                 add_point(4, halfpos, minpos, minpos);
    77                 add_point(5, halfpos, maxpos, minpos);
    82             add_point(4, minpos, minpos, maxpos);
    83             add_point(5, maxpos, minpos, maxpos);
    84             add_point(6, maxpos, maxpos, maxpos);
    85             add_point(7, minpos, maxpos, maxpos);
    89                 add_point(8, halfpos, minpos, minpos);
    90                 add_point(9, maxpos, halfpos, minpos);
    91                 add_point(10, halfpos, maxpos, minpos);
    92                 add_point(11, minpos, halfpos, minpos);
    93                 add_point(12, halfpos, minpos, maxpos);
    94                 add_point(13, maxpos, halfpos, maxpos);
    95                 add_point(14, halfpos, maxpos, maxpos);
    96                 add_point(15, minpos, halfpos, maxpos);
   100                 add_point(16, halfpos, halfpos, minpos);
   101                 add_point(17, halfpos, halfpos, maxpos);
   106             add_point(0, minpos, minpos, minpos);
   107             add_point(1, maxpos, minpos, minpos);
   108             add_point(2, halfpos, maxpos, minpos);
   109             add_point(3, minpos, minpos, maxpos);
   110             add_point(4, maxpos, minpos, maxpos);
   111             add_point(5, halfpos, maxpos, maxpos);
   115                 add_point(6, halfpos, minpos, minpos);
   116                 add_point(7, (halfpos + maxpos) / 2., halfpos, minpos);
   117                 add_point(8, (halfpos + minpos) / 2., halfpos, minpos);
   118                 add_point(9, halfpos, minpos, maxpos);
   119                 add_point(10, (halfpos + maxpos) / 2., halfpos, maxpos);
   120                 add_point(11, (halfpos + minpos) / 2., halfpos, maxpos);
   124         _mesh->prepare_for_use();
   127 #endif // LIBMESH_DIM > 1   128 #endif // LIBMESH_ENABLE_INFINITE_ELEMENTS   138         _mesh->add_point(
Point(0, 0), 0);
   139         _mesh->add_point(
Point(1, 0), 1);
   140         _mesh->add_point(
Point(1.5, 0.5), 2);
   141         _mesh->add_point(
Point(1, 1), 3);
   142         _mesh->add_point(
Point(0, 1), 4);
   144         std::unique_ptr<Elem> polygon = std::make_unique<C0Polygon>(5);
   146           polygon->set_node(i, _mesh->node_ptr(i));
   147         polygon->set_id() = 0;
   149         _mesh->add_elem(std::move(polygon));
   150         _mesh->prepare_for_use();
   164         _mesh->add_point(
Point(1/
Real(3), 0, 0), 0);
   165         _mesh->add_point(
Point(2/
Real(3), 0, 0), 1);
   166         _mesh->add_point(
Point(1, 1/
Real(3), 0), 2);
   167         _mesh->add_point(
Point(1, 2/
Real(3), 0), 3);
   168         _mesh->add_point(
Point(2/
Real(3), 1, 0), 4);
   169         _mesh->add_point(
Point(1/
Real(3), 1, 0), 5);
   170         _mesh->add_point(
Point(0, 2/
Real(3), 0), 6);
   171         _mesh->add_point(
Point(0, 1/
Real(3), 0), 7);
   174         _mesh->add_point(
Point(0, 0, 1/
Real(3)), 8);
   175         _mesh->add_point(
Point(1, 0, 1/
Real(3)), 9);
   176         _mesh->add_point(
Point(1, 1, 1/
Real(3)), 10);
   177         _mesh->add_point(
Point(0, 1, 1/
Real(3)), 11);
   180         _mesh->add_point(
Point(0, 0, 2/
Real(3)), 12);
   181         _mesh->add_point(
Point(1, 0, 2/
Real(3)), 13);
   182         _mesh->add_point(
Point(1, 1, 2/
Real(3)), 14);
   183         _mesh->add_point(
Point(0, 1, 2/
Real(3)), 15);
   186         _mesh->add_point(
Point(1/
Real(3), 0, 1), 16);
   187         _mesh->add_point(
Point(2/
Real(3), 0, 1), 17);
   188         _mesh->add_point(
Point(1, 1/
Real(3), 1), 18);
   189         _mesh->add_point(
Point(1, 2/
Real(3), 1), 19);
   190         _mesh->add_point(
Point(2/
Real(3), 1, 1), 20);
   191         _mesh->add_point(
Point(1/
Real(3), 1, 1), 21);
   192         _mesh->add_point(
Point(0, 2/
Real(3), 1), 22);
   193         _mesh->add_point(
Point(0, 1/
Real(3), 1), 23);
   195         const std::vector<std::vector<unsigned int>> nodes_on_side =
   196           { {0, 1, 2, 3, 4, 5, 6, 7},         
   197             {0, 1, 9, 13, 17, 16, 12, 8},     
   198             {2, 3, 10, 14, 19, 18, 13, 9},    
   199             {4, 5, 11, 15, 21, 20, 14, 10},   
   200             {6, 7, 8, 12, 23, 22, 15, 11},    
   201             {16, 17, 18, 19, 20, 21, 22, 23}, 
   214         _mesh->add_point(
Point(0, 0, 0), 0);
   215         _mesh->add_point(
Point(1, 0, 0), 1);
   216         _mesh->add_point(
Point(1, 1, 0), 2);
   217         _mesh->add_point(
Point(0, 1, 0), 3);
   218         _mesh->add_point(
Point(0, 0, 1), 4);
   219         _mesh->add_point(
Point(1, 0, 1), 5);
   220         _mesh->add_point(
Point(1, 1, 1), 6);
   221         _mesh->add_point(
Point(0, 1, 1), 7);
   230         const std::vector<std::vector<unsigned int>> nodes_on_side =
   243         std::vector<std::shared_ptr<Polygon>> sides(nodes_on_side.size());
   247             const auto & nodes_on_s = nodes_on_side[s];
   248             sides[s] = std::make_shared<C0Polygon>(nodes_on_s.size());
   250               sides[s]->set_node(i, _mesh->node_ptr(nodes_on_s[i]));
   253         std::unique_ptr<Elem> polyhedron = std::make_unique<C0Polyhedron>(sides);
   254         _mesh->add_elem(std::move(polyhedron));
   255         _mesh->prepare_for_use();
   259         const unsigned int dim = test_elem->dim();
   260         const unsigned int use_x = 
dim > 0;
   261         const unsigned int use_y = 
dim > 1;
   262         const unsigned int use_z = 
dim > 2;
   265                                            N*use_x, N*use_y, N*use_z,
   267                                            minpos, use_y*maxpos,
   268                                            minpos, use_z*maxpos,
   274     for (
const auto & elem :
   275          this->_mesh->element_ptr_range())
   276       elem->subdomain_id() = 10 + (elem->id() % 10);
   280     this->_mesh->cache_elem_data();
 virtual Node *& set_node(const unsigned int i)
std::string libmesh_suite_name
std::unique_ptr< Mesh > _mesh
This is the base class from which all geometric element types are derived. 
The libMesh namespace provides an interface to certain functionality in the library. 
static std::unique_ptr< Elem > build(const ElemType type, Elem *p=nullptr)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
A Point defines a location in LIBMESH_DIM dimensional Real space. 
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...