21 #include "libmesh/mesh_generation.h" 22 #include "libmesh/unstructured_mesh.h" 23 #include "libmesh/mesh_refinement.h" 24 #include "libmesh/edge_edge2.h" 25 #include "libmesh/edge_edge3.h" 26 #include "libmesh/edge_edge4.h" 27 #include "libmesh/face_tri3.h" 28 #include "libmesh/face_tri6.h" 29 #include "libmesh/face_tri7.h" 30 #include "libmesh/face_quad4.h" 31 #include "libmesh/face_quad8.h" 32 #include "libmesh/face_quad9.h" 33 #include "libmesh/cell_hex8.h" 34 #include "libmesh/cell_hex20.h" 35 #include "libmesh/cell_hex27.h" 36 #include "libmesh/cell_prism6.h" 37 #include "libmesh/cell_prism15.h" 38 #include "libmesh/cell_prism18.h" 39 #include "libmesh/cell_prism20.h" 40 #include "libmesh/cell_prism21.h" 41 #include "libmesh/cell_tet4.h" 42 #include "libmesh/cell_pyramid5.h" 43 #include "libmesh/libmesh_logging.h" 44 #include "libmesh/boundary_info.h" 45 #include "libmesh/remote_elem.h" 46 #include "libmesh/sphere.h" 47 #include "libmesh/mesh_modification.h" 48 #include "libmesh/mesh_smoother_laplace.h" 49 #include "libmesh/node_elem.h" 50 #include "libmesh/vector_value.h" 51 #include "libmesh/function_base.h" 52 #include "libmesh/enum_order.h" 53 #include "libmesh/int_range.h" 54 #include "libmesh/parallel.h" 55 #include "libmesh/parallel_ghost_sync.h" 56 #include "libmesh/enum_to_string.h" 61 #include <unordered_set> 68 namespace Generation {
79 const unsigned int nx,
101 return i + j*(2*nx+1);
116 const unsigned int nx,
117 const unsigned int ny,
118 const unsigned int i,
119 const unsigned int j,
120 const unsigned int k)
128 return i + (nx+1)*(j + k*(ny+1));
145 return i + (2*nx+1)*(j + k*(2*ny+1));
195 for (
unsigned dir=0; dir<3; ++dir)
217 virtual std::unique_ptr<FunctionBase<Real>>
clone ()
const override 219 return std::make_unique<GaussLobattoRedistributionFunction>(*this);
233 for (
unsigned dir=0; dir<3; ++dir)
240 Real integer_part_f = 0;
241 const Real fractional_part = std::modf(float_index, &integer_part_f);
243 const int integer_part =
int(integer_part_f);
246 if (std::abs(fractional_part) <
TOLERANCE || std::abs(fractional_part - 1.0) <
TOLERANCE)
248 int index =
int(round(float_index));
255 else if (std::abs(fractional_part - 0.5) <
TOLERANCE)
264 else if (std::abs(fractional_part - 1./3.) <
TOLERANCE)
269 (1.0 - 2./3.*
_cosines[dir][integer_part] - 1./3.*
_cosines[dir][integer_part+1]);
273 else if (std::abs(fractional_part - 2./3.) <
TOLERANCE)
278 (1.0 - 1./3.*
_cosines[dir][integer_part] - 2./3.*
_cosines[dir][integer_part+1]);
282 libmesh_error_msg(
"Cannot redistribute node: " << p);
291 const Real )
override 293 libmesh_not_implemented();
314 const unsigned int nx,
315 const unsigned int ny,
316 const unsigned int nz,
321 const bool gauss_lobatto_grid)
323 LOG_SCOPE(
"build_cube()",
"MeshTools::Generation");
332 using namespace MeshTools::Generation::Private;
341 mesh.set_mesh_dimension(3);
342 mesh.set_spatial_dimension(3);
346 mesh.set_mesh_dimension(2);
347 mesh.set_spatial_dimension(2);
351 mesh.set_mesh_dimension(1);
352 mesh.set_spatial_dimension(1);
357 mesh.set_mesh_dimension(0);
358 mesh.set_spatial_dimension(0);
361 switch (
mesh.mesh_dimension())
367 libmesh_assert_equal_to (nx, 0);
368 libmesh_assert_equal_to (ny, 0);
369 libmesh_assert_equal_to (nz, 0);
387 libmesh_assert_not_equal_to (nx, 0);
388 libmesh_assert_equal_to (ny, 0);
389 libmesh_assert_equal_to (nz, 0);
390 libmesh_assert_less (xmin, xmax);
400 mesh.reserve_elem (nx);
414 mesh.reserve_nodes(nx+1);
420 mesh.reserve_nodes(2*nx+1);
426 mesh.reserve_nodes(3*nx+1);
437 unsigned int node_id = 0;
443 for (
unsigned int i=0; i<=nx; i++)
445 const Node *
const node =
mesh.add_point (
Point(static_cast<Real>(i)/nx, 0, 0), node_id++);
457 for (
unsigned int i=0; i<=2*nx; i++)
459 const Node *
const node =
mesh.add_point (
Point(static_cast<Real>(i)/(2*nx), 0, 0), node_id++);
470 for (
unsigned int i=0; i<=3*nx; i++)
472 const Node *
const node =
mesh.add_point (
Point(static_cast<Real>(i)/(3*nx), 0, 0), node_id++);
493 for (
unsigned int i=0; i<nx; i++)
511 for (
unsigned int i=0; i<nx; i++)
529 for (
unsigned int i=0; i<nx; i++)
551 if (gauss_lobatto_grid)
553 GaussLobattoRedistributionFunction func(nx, xmin, xmax);
558 for (
Node * node :
mesh.node_ptr_range())
559 (*node)(0) = (*node)(0)*(xmax-xmin) + xmin;
586 libmesh_assert_not_equal_to (nx, 0);
587 libmesh_assert_not_equal_to (ny, 0);
588 libmesh_assert_equal_to (nz, 0);
589 libmesh_assert_less (xmin, xmax);
590 libmesh_assert_less (ymin, ymax);
604 mesh.reserve_elem (nx*ny);
613 mesh.reserve_elem (2*nx*ny);
633 mesh.reserve_nodes( (nx+1)*(ny+1) );
643 mesh.reserve_nodes( (2*nx+1)*(2*ny+1) );
649 mesh.reserve_nodes( (2*nx+1)*(2*ny+1) + 2*nx*ny );
662 unsigned int node_id = 0;
671 for (
unsigned int j=0; j<=ny; j++)
672 for (
unsigned int i=0; i<=nx; i++)
674 const Node *
const node =
675 mesh.add_point(
Point(static_cast<Real>(i) / static_cast<Real>(nx),
676 static_cast<Real>(j) / static_cast<Real>(ny),
699 for (
unsigned int j=0; j<=(2*ny); j++)
700 for (
unsigned int i=0; i<=(2*nx); i++)
702 const Node *
const node =
703 mesh.add_point(
Point(static_cast<Real>(i) / static_cast<Real>(2 * nx),
704 static_cast<Real>(j) / static_cast<Real>(2 * ny),
720 for (
unsigned int j=0; j<(3*ny); j += 3)
721 for (
unsigned int i=0; i<(3*nx); i += 3)
724 mesh.add_point(
Point(static_cast<Real>(i+2) / static_cast<Real>(3 * nx),
725 static_cast<Real>(j+1) / static_cast<Real>(3 * ny),
729 mesh.add_point(
Point(static_cast<Real>(i+1) / static_cast<Real>(3 * nx),
730 static_cast<Real>(j+2) / static_cast<Real>(3 * ny),
749 unsigned int elem_id = 0;
757 for (
unsigned int j=0; j<ny; j++)
758 for (
unsigned int i=0; i<nx; i++)
785 for (
unsigned int j=0; j<ny; j++)
786 for (
unsigned int i=0; i<nx; i++)
822 for (
unsigned int j=0; j<(2*ny); j += 2)
823 for (
unsigned int i=0; i<(2*nx); i += 2)
857 for (
unsigned int j=0; j<(2*ny); j += 2)
858 for (
unsigned int i=0; i<(2*nx); i += 2)
908 if (gauss_lobatto_grid)
910 GaussLobattoRedistributionFunction func(nx, xmin, xmax,
916 for (
Node * node :
mesh.node_ptr_range())
918 (*node)(0) = ((*node)(0))*(xmax-xmin) + xmin;
919 (*node)(1) = ((*node)(1))*(ymax-ymin) + ymin;
952 libmesh_assert_not_equal_to (nx, 0);
953 libmesh_assert_not_equal_to (ny, 0);
954 libmesh_assert_not_equal_to (nz, 0);
955 libmesh_assert_less (xmin, xmax);
956 libmesh_assert_less (ymin, ymax);
957 libmesh_assert_less (zmin, zmax);
976 mesh.reserve_elem(nx*ny*nz);
986 mesh.reserve_elem(2*nx*ny*nz);
1005 mesh.reserve_nodes( (nx+1)*(ny+1)*(nz+1) );
1024 mesh.reserve_nodes( (2*nx+1)*(2*ny+1)*(2*nz+1) );
1030 mesh.reserve_nodes( (2*nx+1)*(2*ny+1)*(2*nz+1) +
1032 4*(nx*ny + ny*nz + nx*nz) );
1038 mesh.reserve_nodes( (2*nx+1)*(2*ny+1)*(2*nz+1) +
1045 mesh.reserve_nodes( (2*nx+1)*(2*ny+1)*(2*nz+1) +
1058 unsigned int node_id = 0;
1065 for (
unsigned int k=0; k<=nz; k++)
1066 for (
unsigned int j=0; j<=ny; j++)
1067 for (
unsigned int i=0; i<=nx; i++)
1069 const Node *
const node =
1070 mesh.add_point(
Point(static_cast<Real>(i) / static_cast<Real>(nx),
1071 static_cast<Real>(j) / static_cast<Real>(ny),
1072 static_cast<Real>(k) / static_cast<Real>(nz)),
1105 for (
unsigned int k=0; k<=(2*nz); k++)
1106 for (
unsigned int j=0; j<=(2*ny); j++)
1107 for (
unsigned int i=0; i<=(2*nx); i++)
1109 const Node *
const node =
1110 mesh.add_point(
Point(static_cast<Real>(i) / static_cast<Real>(2 * nx),
1111 static_cast<Real>(j) / static_cast<Real>(2 * ny),
1112 static_cast<Real>(k) / static_cast<Real>(2 * nz)),
1131 const unsigned int kmax = (type ==
PRISM20) ? nz : 2*nz;
1132 for (
unsigned int k=0; k<=kmax; k++)
1133 for (
unsigned int j=0; j<ny; j++)
1134 for (
unsigned int i=0; i<nx; i++)
1136 const Node *
const node1 =
1137 mesh.add_point(
Point((static_cast<Real>(i)+1/
Real(3)) / static_cast<Real>(nx),
1138 (static_cast<Real>(j)+1/
Real(3)) / static_cast<Real>(ny),
1139 static_cast<Real>(k) / static_cast<Real>(kmax)),
1146 const Node *
const node2 =
1147 mesh.add_point(
Point((static_cast<Real>(i)+2/
Real(3)) / static_cast<Real>(nx),
1148 (static_cast<Real>(j)+2/
Real(3)) / static_cast<Real>(ny),
1149 static_cast<Real>(k) / static_cast<Real>(kmax)),
1170 unsigned int elem_id = 0;
1176 for (
unsigned int k=0; k<nz; k++)
1177 for (
unsigned int j=0; j<ny; j++)
1178 for (
unsigned int i=0; i<nx; i++)
1191 boundary_info.
add_side(elem, 0, 0);
1194 boundary_info.
add_side(elem, 5, 5);
1197 boundary_info.
add_side(elem, 1, 1);
1200 boundary_info.
add_side(elem, 3, 3);
1203 boundary_info.
add_side(elem, 4, 4);
1206 boundary_info.
add_side(elem, 2, 2);
1216 for (
unsigned int k=0; k<nz; k++)
1217 for (
unsigned int j=0; j<ny; j++)
1218 for (
unsigned int i=0; i<nx; i++)
1231 boundary_info.
add_side(elem, 3, 4);
1234 boundary_info.
add_side(elem, 1, 1);
1237 boundary_info.
add_side(elem, 0, 0);
1240 boundary_info.
add_side(elem, 4, 5);
1253 boundary_info.
add_side(elem, 1, 2);
1256 boundary_info.
add_side(elem, 2, 3);
1259 boundary_info.
add_side(elem, 0, 0);
1262 boundary_info.
add_side(elem, 4, 5);
1282 for (
unsigned int k=0; k<(2*nz); k += 2)
1283 for (
unsigned int j=0; j<(2*ny); j += 2)
1284 for (
unsigned int i=0; i<(2*nx); i += 2)
1324 boundary_info.
add_side(elem, 0, 0);
1327 boundary_info.
add_side(elem, 5, 5);
1330 boundary_info.
add_side(elem, 1, 1);
1333 boundary_info.
add_side(elem, 3, 3);
1336 boundary_info.
add_side(elem, 4, 4);
1339 boundary_info.
add_side(elem, 2, 2);
1352 for (
unsigned int k=0; k<(2*nz); k += 2)
1353 for (
unsigned int j=0; j<(2*ny); j += 2)
1354 for (
unsigned int i=0; i<(2*nx); i += 2)
1385 const dof_id_type base_idx = (2*nx+1)*(2*ny+1)*(2*nz+1);
1386 elem->
set_node(18) =
mesh.node_ptr(base_idx+((k/2)*(nx*ny)+j/2*nx+i/2)*2);
1387 elem->
set_node(19) =
mesh.node_ptr(base_idx+(((k/2)+1)*(nx*ny)+j/2*nx+i/2)*2);
1392 const dof_id_type base_idx = (2*nx+1)*(2*ny+1)*(2*nz+1);
1393 elem->
set_node(18) =
mesh.node_ptr(base_idx+(k*(nx*ny)+j/2*nx+i/2)*2);
1394 elem->
set_node(19) =
mesh.node_ptr(base_idx+((k+2)*(nx*ny)+j/2*nx+i/2)*2);
1395 elem->
set_node(20) =
mesh.node_ptr(base_idx+((k+1)*(nx*ny)+j/2*nx+i/2)*2);
1400 boundary_info.
add_side(elem, 3, 4);
1403 boundary_info.
add_side(elem, 1, 1);
1406 boundary_info.
add_side(elem, 0, 0);
1409 boundary_info.
add_side(elem, 4, 5);
1441 const dof_id_type base_idx = (2*nx+1)*(2*ny+1)*(2*nz+1);
1442 elem->
set_node(18) =
mesh.node_ptr(base_idx+((k/2)*(nx*ny)+j/2*nx+i/2)*2+1);
1443 elem->
set_node(19) =
mesh.node_ptr(base_idx+(((k/2)+1)*(nx*ny)+j/2*nx+i/2)*2+1);
1448 const dof_id_type base_idx = (2*nx+1)*(2*ny+1)*(2*nz+1);
1449 elem->
set_node(18) =
mesh.node_ptr(base_idx+(k*(nx*ny)+j/2*nx+i/2)*2+1);
1450 elem->
set_node(19) =
mesh.node_ptr(base_idx+((k+2)*(nx*ny)+j/2*nx+i/2)*2+1);
1451 elem->
set_node(20) =
mesh.node_ptr(base_idx+((k+1)*(nx*ny)+j/2*nx+i/2)*2+1);
1456 boundary_info.
add_side(elem, 1, 2);
1459 boundary_info.
add_side(elem, 2, 3);
1462 boundary_info.
add_side(elem, 0, 0);
1465 boundary_info.
add_side(elem, 4, 5);
1484 if (gauss_lobatto_grid)
1486 GaussLobattoRedistributionFunction func(nx, xmin, xmax,
1493 for (
unsigned int p=0; p<
mesh.n_nodes(); p++)
1495 mesh.node_ref(p)(0) = (
mesh.node_ref(p)(0))*(xmax-xmin) + xmin;
1496 mesh.node_ref(p)(1) = (
mesh.node_ref(p)(1))*(ymax-ymin) + ymin;
1497 mesh.node_ref(p)(2) = (
mesh.node_ref(p)(2))*(zmax-zmin) + zmin;
1510 if ((type ==
TET4) ||
1519 std::vector<std::unique_ptr<Elem>> new_elements;
1522 std::unique_ptr<Elem> side;
1525 new_elements.reserve(24*
mesh.n_elem());
1527 new_elements.reserve(6*
mesh.n_elem());
1530 for (
auto & base_hex :
mesh.element_ptr_range())
1533 Node * apex_node = base_hex->node_ptr(26);
1536 std::vector<boundary_id_type> ids;
1538 for (
auto s : base_hex->side_index_range())
1550 base_hex->build_side_ptr(side, s);
1555 for (
unsigned int sub_tet=0; sub_tet<4; ++sub_tet)
1558 auto & sub_elem = new_elements.back();
1559 sub_elem->set_node(0) = side->node_ptr(sub_tet);
1560 sub_elem->set_node(1) = side->node_ptr(8);
1561 sub_elem->set_node(2) = side->node_ptr(sub_tet==3 ? 0 : sub_tet+1 );
1562 sub_elem->set_node(3) = apex_node;
1568 boundary_info.
add_side(sub_elem.get(), 0, b_id);
1576 auto & sub_elem = new_elements.back();
1581 sub_elem->set_node(0) = side->node_ptr(0);
1582 sub_elem->set_node(1) = side->node_ptr(3);
1583 sub_elem->set_node(2) = side->node_ptr(2);
1584 sub_elem->set_node(3) = side->node_ptr(1);
1587 sub_elem->set_node(4) = apex_node;
1592 boundary_info.
add_side(sub_elem.get(), 4, b_id);
1599 for (
auto & elem :
mesh.element_ptr_range())
1601 boundary_info.
remove(elem);
1602 mesh.delete_elem(elem);
1608 new_elements[i]->set_id(i);
1609 mesh.add_elem( std::move(new_elements[i]) );
1617 mesh.all_second_order();
1620 mesh.all_second_order(
false);
1623 mesh.all_complete_order();
1646 libmesh_error_msg(
"Unknown dimension " <<
mesh.mesh_dimension());
1650 mesh.prepare_for_use ();
1657 const bool gauss_lobatto_grid)
1669 gauss_lobatto_grid);
1674 const unsigned int nx,
1677 const bool gauss_lobatto_grid)
1689 gauss_lobatto_grid);
1695 const unsigned int nx,
1696 const unsigned int ny,
1700 const bool gauss_lobatto_grid)
1713 gauss_lobatto_grid);
1724 #ifndef LIBMESH_ENABLE_AMR 1732 libmesh_error_msg(
"Building a circle/sphere only works with AMR.");
1739 const unsigned int nr,
1741 const unsigned int n_smooth,
1744 libmesh_assert_greater (rad, 0.);
1747 LOG_SCOPE(
"build_sphere()",
"MeshTools::Generation");
1753 unsigned char orig_mesh_dimension =
1795 libmesh_error_msg(
"build_sphere(): Please specify a mesh dimension or a valid ElemType (EDGE{2,3,4}, TRI{3,6,7}, QUAD{4,8,9}, HEX{8,27}, TET{4,10,14})");
1807 const Sphere sphere (cent, rad);
1831 unsigned node_id = 0;
1835 const Real sqrt_2 = std::sqrt(2.);
1836 const Real rad_2 = .25*rad;
1837 const Real rad_sqrt_2 = rad/sqrt_2;
1840 std::vector<Node *> nodes(8);
1843 nodes[0] =
mesh.
add_point (Point(-rad_2,-rad_2, 0.), node_id++);
1846 nodes[1] =
mesh.
add_point (Point( rad_2,-rad_2, 0.), node_id++);
1849 nodes[2] =
mesh.
add_point (Point( rad_2, rad_2, 0.), node_id++);
1852 nodes[3] =
mesh.
add_point (Point(-rad_2, rad_2, 0.), node_id++);
1855 nodes[4] =
mesh.
add_point (Point(-rad_sqrt_2,-rad_sqrt_2, 0.), node_id++);
1858 nodes[5] =
mesh.
add_point (Point( rad_sqrt_2,-rad_sqrt_2, 0.), node_id++);
1861 nodes[6] =
mesh.
add_point (Point( rad_sqrt_2, rad_sqrt_2, 0.), node_id++);
1864 nodes[7] =
mesh.
add_point (Point(-rad_sqrt_2, rad_sqrt_2, 0.), node_id++);
1872 elem0->set_node(1) = nodes[1];
1873 elem0->set_node(2) = nodes[2];
1874 elem0->set_node(3) = nodes[3];
1881 elem1->set_node(1) = nodes[0];
1882 elem1->set_node(2) = nodes[3];
1883 elem1->set_node(3) = nodes[7];
1890 elem2->set_node(1) = nodes[5];
1891 elem2->set_node(2) = nodes[1];
1892 elem2->set_node(3) = nodes[0];
1899 elem3->set_node(1) = nodes[5];
1900 elem3->set_node(2) = nodes[6];
1901 elem3->set_node(3) = nodes[2];
1908 elem4->set_node(1) = nodes[2];
1909 elem4->set_node(2) = nodes[6];
1910 elem4->set_node(3) = nodes[7];
1917 Real t = 0.5 * (1 + std::sqrt(5.0));
1918 Real s = rad / std::sqrt(1 + t*t);
1937 static const unsigned int idx1 [6] = {11, 5, 1, 7, 10, 11};
1938 static const unsigned int idx2 [6] = {9, 4, 2, 6, 8, 9};
1939 static const unsigned int idx3 [6] = {1, 5, 11, 10, 7, 1};
1941 for (
unsigned int i = 0; i < 5; ++i)
1981 if (!((type ==
HEX8) || (type ==
HEX27) || (type ==
TET4) ||
1984 libmesh_error_msg(
"Error: Only HEX8/27 and TET4/10/14 are currently supported in 3D.");
1991 r_med = (0.125*std::sqrt(2.)+0.5)*rad;
1994 std::vector<Node *> nodes(16);
2000 unsigned node_id = 0;
2003 nodes[0] =
mesh.
add_point (Point(-r_small,-r_small, -r_small), node_id++);
2004 nodes[1] =
mesh.
add_point (Point( r_small,-r_small, -r_small), node_id++);
2005 nodes[2] =
mesh.
add_point (Point( r_small, r_small, -r_small), node_id++);
2006 nodes[3] =
mesh.
add_point (Point(-r_small, r_small, -r_small), node_id++);
2007 nodes[4] =
mesh.
add_point (Point(-r_small,-r_small, r_small), node_id++);
2008 nodes[5] =
mesh.
add_point (Point( r_small,-r_small, r_small), node_id++);
2009 nodes[6] =
mesh.
add_point (Point( r_small, r_small, r_small), node_id++);
2010 nodes[7] =
mesh.
add_point (Point(-r_small, r_small, r_small), node_id++);
2013 nodes[8] =
mesh.
add_point (Point(-r_med,-r_med, -r_med), node_id++);
2014 nodes[9] =
mesh.
add_point (Point( r_med,-r_med, -r_med), node_id++);
2015 nodes[10] =
mesh.
add_point (Point( r_med, r_med, -r_med), node_id++);
2016 nodes[11] =
mesh.
add_point (Point(-r_med, r_med, -r_med), node_id++);
2017 nodes[12] =
mesh.
add_point (Point(-r_med,-r_med, r_med), node_id++);
2018 nodes[13] =
mesh.
add_point (Point( r_med,-r_med, r_med), node_id++);
2019 nodes[14] =
mesh.
add_point (Point( r_med, r_med, r_med), node_id++);
2020 nodes[15] =
mesh.
add_point (Point(-r_med, r_med, r_med), node_id++);
2027 elem0->set_node(1) = nodes[1];
2028 elem0->set_node(2) = nodes[2];
2029 elem0->set_node(3) = nodes[3];
2030 elem0->set_node(4) = nodes[4];
2031 elem0->set_node(5) = nodes[5];
2032 elem0->set_node(6) = nodes[6];
2033 elem0->set_node(7) = nodes[7];
2040 elem1->set_node(1) = nodes[9];
2041 elem1->set_node(2) = nodes[10];
2042 elem1->set_node(3) = nodes[11];
2043 elem1->set_node(4) = nodes[0];
2044 elem1->set_node(5) = nodes[1];
2045 elem1->set_node(6) = nodes[2];
2046 elem1->set_node(7) = nodes[3];
2053 elem2->set_node(1) = nodes[9];
2054 elem2->set_node(2) = nodes[1];
2055 elem2->set_node(3) = nodes[0];
2056 elem2->set_node(4) = nodes[12];
2057 elem2->set_node(5) = nodes[13];
2058 elem2->set_node(6) = nodes[5];
2059 elem2->set_node(7) = nodes[4];
2066 elem3->set_node(1) = nodes[9];
2067 elem3->set_node(2) = nodes[10];
2068 elem3->set_node(3) = nodes[2];
2069 elem3->set_node(4) = nodes[5];
2070 elem3->set_node(5) = nodes[13];
2071 elem3->set_node(6) = nodes[14];
2072 elem3->set_node(7) = nodes[6];
2079 elem4->set_node(1) = nodes[2];
2080 elem4->set_node(2) = nodes[10];
2081 elem4->set_node(3) = nodes[11];
2082 elem4->set_node(4) = nodes[7];
2083 elem4->set_node(5) = nodes[6];
2084 elem4->set_node(6) = nodes[14];
2085 elem4->set_node(7) = nodes[15];
2092 elem5->set_node(1) = nodes[0];
2093 elem5->set_node(2) = nodes[3];
2094 elem5->set_node(3) = nodes[11];
2095 elem5->set_node(4) = nodes[12];
2096 elem5->set_node(5) = nodes[4];
2097 elem5->set_node(6) = nodes[7];
2098 elem5->set_node(7) = nodes[15];
2105 elem6->set_node(1) = nodes[5];
2106 elem6->set_node(2) = nodes[6];
2107 elem6->set_node(3) = nodes[7];
2108 elem6->set_node(4) = nodes[12];
2109 elem6->set_node(5) = nodes[13];
2110 elem6->set_node(6) = nodes[14];
2111 elem6->set_node(7) = nodes[15];
2127 MeshRefinement mesh_refinement (
mesh);
2130 std::unique_ptr<Elem> side;
2133 for (
unsigned int r=0; r<nr; r++)
2137 std::unordered_set<dof_id_type> moved_ghost_nodes;
2141 mesh_refinement.uniformly_refine(1);
2143 for (
const auto & elem :
mesh.active_element_ptr_range())
2144 for (
auto s : elem->side_index_range())
2147 elem->build_side_ptr(side, s);
2152 for (
auto n : side->node_index_range())
2154 Node & side_node = side->node_ref(n);
2156 sphere.closest_point(side->point(n));
2158 if (!is_replicated &&
2160 moved_ghost_nodes.insert(side_node.id());
2166 std::map<processor_id_type, std::vector<dof_id_type>> moved_nodes_map;
2167 for (
auto id : moved_ghost_nodes)
2170 moved_nodes_map[node.processor_id()].push_back(node.id());
2173 auto action_functor =
2176 const std::vector<dof_id_type> & my_moved_nodes)
2178 for (
auto id : my_moved_nodes)
2181 node = sphere.closest_point(node);
2186 Parallel::push_parallel_vector_data
2187 (
mesh.
comm(), moved_nodes_map, action_functor);
2190 SyncNodalPositions sync_object(
mesh);
2208 if ((type ==
TRI7) || (type ==
TRI6) || (type ==
TRI3) ||
2229 bool full_ordered = !((type==
QUAD8) || (type==
HEX20));
2234 for (
const auto & elem :
mesh.active_element_ptr_range())
2235 for (
auto s : elem->side_index_range())
2236 if (elem->neighbor_ptr(s) ==
nullptr)
2238 elem->build_side_ptr(side, s);
2241 for (
auto n : side->node_index_range())
2243 sphere.closest_point(side->point(n));
2251 LaplaceMeshSmoother smoother(
mesh);
2252 smoother.smooth(n_smooth);
2256 for (
const auto & elem :
mesh.active_element_ptr_range())
2257 for (
auto s : elem->side_index_range())
2258 if (!elem->neighbor_ptr(s))
2259 boundary_info.add_side(elem, s, 0);
2265 #endif // #ifndef LIBMESH_ENABLE_AMR 2271 const unsigned int nz,
2275 LOG_SCOPE(
"build_extrusion()",
"MeshTools::Generation");
2277 if (!cross_section.
n_elem())
2283 #ifdef LIBMESH_ENABLE_UNIQUE_ID 2287 unsigned int order = 1;
2308 if (cross_section.elements_begin() != cross_section.elements_end() &&
2309 (*cross_section.elements_begin())->default_order() ==
SECOND)
2316 std::vector<boundary_id_type> ids_to_copy;
2318 for (
const auto & node : cross_section.node_ptr_range())
2320 for (
unsigned int k=0; k != order*nz+1; ++k)
2322 const dof_id_type new_node_id = node->id() + k * orig_nodes;
2327 (*node + (extrusion_vector * k / nz / order),
2329 new_node->processor_id() = node->processor_id();
2331 #ifdef LIBMESH_ENABLE_UNIQUE_ID 2337 orig_unique_ids + (k-1)*(orig_nodes + orig_elem) + node->id();
2339 new_node->set_unique_id(uid);
2342 cross_section_boundary_info.
boundary_ids(node, ids_to_copy);
2343 boundary_info.
add_node(new_node.get(), ids_to_copy);
2350 const std::set<boundary_id_type> & side_ids =
2354 0 : cast_int<boundary_id_type>(*side_ids.rbegin() + 1);
2359 cross_section.
comm().
max(next_side_id);
2361 for (
const auto & elem : cross_section.element_ptr_range())
2363 const ElemType etype = elem->type();
2368 for (
unsigned int k=0; k != nz; ++k)
2370 std::unique_ptr<Elem> new_elem;
2376 new_elem->set_node(0) =
mesh.
node_ptr(elem->node_ptr(0)->id() + (k * orig_nodes));
2377 new_elem->set_node(1) =
mesh.
node_ptr(elem->node_ptr(1)->id() + (k * orig_nodes));
2378 new_elem->set_node(2) =
mesh.
node_ptr(elem->node_ptr(1)->id() + ((k+1) * orig_nodes));
2379 new_elem->set_node(3) =
mesh.
node_ptr(elem->node_ptr(0)->id() + ((k+1) * orig_nodes));
2382 new_elem->set_neighbor(3, const_cast<RemoteElem *>(
remote_elem));
2384 new_elem->set_neighbor(1, const_cast<RemoteElem *>(
remote_elem));
2391 new_elem->set_node(0) =
mesh.
node_ptr(elem->node_ptr(0)->id() + (2*k * orig_nodes));
2392 new_elem->set_node(1) =
mesh.
node_ptr(elem->node_ptr(1)->id() + (2*k * orig_nodes));
2393 new_elem->set_node(2) =
mesh.
node_ptr(elem->node_ptr(1)->id() + ((2*k+2) * orig_nodes));
2394 new_elem->set_node(3) =
mesh.
node_ptr(elem->node_ptr(0)->id() + ((2*k+2) * orig_nodes));
2395 new_elem->set_node(4) =
mesh.
node_ptr(elem->node_ptr(2)->id() + (2*k * orig_nodes));
2396 new_elem->set_node(5) =
mesh.
node_ptr(elem->node_ptr(1)->id() + ((2*k+1) * orig_nodes));
2397 new_elem->set_node(6) =
mesh.
node_ptr(elem->node_ptr(2)->id() + ((2*k+2) * orig_nodes));
2398 new_elem->set_node(7) =
mesh.
node_ptr(elem->node_ptr(0)->id() + ((2*k+1) * orig_nodes));
2399 new_elem->set_node(8) =
mesh.
node_ptr(elem->node_ptr(2)->id() + ((2*k+1) * orig_nodes));
2402 new_elem->set_neighbor(3, const_cast<RemoteElem *>(
remote_elem));
2404 new_elem->set_neighbor(1, const_cast<RemoteElem *>(
remote_elem));
2411 new_elem->set_node(0) =
mesh.
node_ptr(elem->node_ptr(0)->id() + (k * orig_nodes));
2412 new_elem->set_node(1) =
mesh.
node_ptr(elem->node_ptr(1)->id() + (k * orig_nodes));
2413 new_elem->set_node(2) =
mesh.
node_ptr(elem->node_ptr(2)->id() + (k * orig_nodes));
2414 new_elem->set_node(3) =
mesh.
node_ptr(elem->node_ptr(0)->id() + ((k+1) * orig_nodes));
2415 new_elem->set_node(4) =
mesh.
node_ptr(elem->node_ptr(1)->id() + ((k+1) * orig_nodes));
2416 new_elem->set_node(5) =
mesh.
node_ptr(elem->node_ptr(2)->id() + ((k+1) * orig_nodes));
2419 new_elem->set_neighbor(1, const_cast<RemoteElem *>(
remote_elem));
2421 new_elem->set_neighbor(2, const_cast<RemoteElem *>(
remote_elem));
2423 new_elem->set_neighbor(3, const_cast<RemoteElem *>(
remote_elem));
2430 new_elem->set_node(0) =
mesh.
node_ptr(elem->node_ptr(0)->id() + (2*k * orig_nodes));
2431 new_elem->set_node(1) =
mesh.
node_ptr(elem->node_ptr(1)->id() + (2*k * orig_nodes));
2432 new_elem->set_node(2) =
mesh.
node_ptr(elem->node_ptr(2)->id() + (2*k * orig_nodes));
2433 new_elem->set_node(3) =
mesh.
node_ptr(elem->node_ptr(0)->id() + ((2*k+2) * orig_nodes));
2434 new_elem->set_node(4) =
mesh.
node_ptr(elem->node_ptr(1)->id() + ((2*k+2) * orig_nodes));
2435 new_elem->set_node(5) =
mesh.
node_ptr(elem->node_ptr(2)->id() + ((2*k+2) * orig_nodes));
2436 new_elem->set_node(6) =
mesh.
node_ptr(elem->node_ptr(3)->id() + (2*k * orig_nodes));
2437 new_elem->set_node(7) =
mesh.
node_ptr(elem->node_ptr(4)->id() + (2*k * orig_nodes));
2438 new_elem->set_node(8) =
mesh.
node_ptr(elem->node_ptr(5)->id() + (2*k * orig_nodes));
2439 new_elem->set_node(9) =
mesh.
node_ptr(elem->node_ptr(0)->id() + ((2*k+1) * orig_nodes));
2440 new_elem->set_node(10) =
mesh.
node_ptr(elem->node_ptr(1)->id() + ((2*k+1) * orig_nodes));
2441 new_elem->set_node(11) =
mesh.
node_ptr(elem->node_ptr(2)->id() + ((2*k+1) * orig_nodes));
2442 new_elem->set_node(12) =
mesh.
node_ptr(elem->node_ptr(3)->id() + ((2*k+2) * orig_nodes));
2443 new_elem->set_node(13) =
mesh.
node_ptr(elem->node_ptr(4)->id() + ((2*k+2) * orig_nodes));
2444 new_elem->set_node(14) =
mesh.
node_ptr(elem->node_ptr(5)->id() + ((2*k+2) * orig_nodes));
2445 new_elem->set_node(15) =
mesh.
node_ptr(elem->node_ptr(3)->id() + ((2*k+1) * orig_nodes));
2446 new_elem->set_node(16) =
mesh.
node_ptr(elem->node_ptr(4)->id() + ((2*k+1) * orig_nodes));
2447 new_elem->set_node(17) =
mesh.
node_ptr(elem->node_ptr(5)->id() + ((2*k+1) * orig_nodes));
2450 new_elem->set_neighbor(1, const_cast<RemoteElem *>(
remote_elem));
2452 new_elem->set_neighbor(2, const_cast<RemoteElem *>(
remote_elem));
2454 new_elem->set_neighbor(3, const_cast<RemoteElem *>(
remote_elem));
2461 new_elem->set_node(0) =
mesh.
node_ptr(elem->node_ptr(0)->id() + (2*k * orig_nodes));
2462 new_elem->set_node(1) =
mesh.
node_ptr(elem->node_ptr(1)->id() + (2*k * orig_nodes));
2463 new_elem->set_node(2) =
mesh.
node_ptr(elem->node_ptr(2)->id() + (2*k * orig_nodes));
2464 new_elem->set_node(3) =
mesh.
node_ptr(elem->node_ptr(0)->id() + ((2*k+2) * orig_nodes));
2465 new_elem->set_node(4) =
mesh.
node_ptr(elem->node_ptr(1)->id() + ((2*k+2) * orig_nodes));
2466 new_elem->set_node(5) =
mesh.
node_ptr(elem->node_ptr(2)->id() + ((2*k+2) * orig_nodes));
2467 new_elem->set_node(6) =
mesh.
node_ptr(elem->node_ptr(3)->id() + (2*k * orig_nodes));
2468 new_elem->set_node(7) =
mesh.
node_ptr(elem->node_ptr(4)->id() + (2*k * orig_nodes));
2469 new_elem->set_node(8) =
mesh.
node_ptr(elem->node_ptr(5)->id() + (2*k * orig_nodes));
2470 new_elem->set_node(9) =
mesh.
node_ptr(elem->node_ptr(0)->id() + ((2*k+1) * orig_nodes));
2471 new_elem->set_node(10) =
mesh.
node_ptr(elem->node_ptr(1)->id() + ((2*k+1) * orig_nodes));
2472 new_elem->set_node(11) =
mesh.
node_ptr(elem->node_ptr(2)->id() + ((2*k+1) * orig_nodes));
2473 new_elem->set_node(12) =
mesh.
node_ptr(elem->node_ptr(3)->id() + ((2*k+2) * orig_nodes));
2474 new_elem->set_node(13) =
mesh.
node_ptr(elem->node_ptr(4)->id() + ((2*k+2) * orig_nodes));
2475 new_elem->set_node(14) =
mesh.
node_ptr(elem->node_ptr(5)->id() + ((2*k+2) * orig_nodes));
2476 new_elem->set_node(15) =
mesh.
node_ptr(elem->node_ptr(3)->id() + ((2*k+1) * orig_nodes));
2477 new_elem->set_node(16) =
mesh.
node_ptr(elem->node_ptr(4)->id() + ((2*k+1) * orig_nodes));
2478 new_elem->set_node(17) =
mesh.
node_ptr(elem->node_ptr(5)->id() + ((2*k+1) * orig_nodes));
2480 new_elem->set_node(18) =
mesh.
node_ptr(elem->node_ptr(6)->id() + (2*k * orig_nodes));
2481 new_elem->set_node(19) =
mesh.
node_ptr(elem->node_ptr(6)->id() + ((2*k+2) * orig_nodes));
2482 new_elem->set_node(20) =
mesh.
node_ptr(elem->node_ptr(6)->id() + ((2*k+1) * orig_nodes));
2485 new_elem->set_neighbor(1, const_cast<RemoteElem *>(
remote_elem));
2487 new_elem->set_neighbor(2, const_cast<RemoteElem *>(
remote_elem));
2489 new_elem->set_neighbor(3, const_cast<RemoteElem *>(
remote_elem));
2496 new_elem->set_node(0) =
mesh.
node_ptr(elem->node_ptr(0)->id() + (k * orig_nodes));
2497 new_elem->set_node(1) =
mesh.
node_ptr(elem->node_ptr(1)->id() + (k * orig_nodes));
2498 new_elem->set_node(2) =
mesh.
node_ptr(elem->node_ptr(2)->id() + (k * orig_nodes));
2499 new_elem->set_node(3) =
mesh.
node_ptr(elem->node_ptr(3)->id() + (k * orig_nodes));
2500 new_elem->set_node(4) =
mesh.
node_ptr(elem->node_ptr(0)->id() + ((k+1) * orig_nodes));
2501 new_elem->set_node(5) =
mesh.
node_ptr(elem->node_ptr(1)->id() + ((k+1) * orig_nodes));
2502 new_elem->set_node(6) =
mesh.
node_ptr(elem->node_ptr(2)->id() + ((k+1) * orig_nodes));
2503 new_elem->set_node(7) =
mesh.
node_ptr(elem->node_ptr(3)->id() + ((k+1) * orig_nodes));
2506 new_elem->set_neighbor(1, const_cast<RemoteElem *>(
remote_elem));
2508 new_elem->set_neighbor(2, const_cast<RemoteElem *>(
remote_elem));
2510 new_elem->set_neighbor(3, const_cast<RemoteElem *>(
remote_elem));
2512 new_elem->set_neighbor(4, const_cast<RemoteElem *>(
remote_elem));
2519 new_elem->set_node(0) =
mesh.
node_ptr(elem->node_ptr(0)->id() + (2*k * orig_nodes));
2520 new_elem->set_node(1) =
mesh.
node_ptr(elem->node_ptr(1)->id() + (2*k * orig_nodes));
2521 new_elem->set_node(2) =
mesh.
node_ptr(elem->node_ptr(2)->id() + (2*k * orig_nodes));
2522 new_elem->set_node(3) =
mesh.
node_ptr(elem->node_ptr(3)->id() + (2*k * orig_nodes));
2523 new_elem->set_node(4) =
mesh.
node_ptr(elem->node_ptr(0)->id() + ((2*k+2) * orig_nodes));
2524 new_elem->set_node(5) =
mesh.
node_ptr(elem->node_ptr(1)->id() + ((2*k+2) * orig_nodes));
2525 new_elem->set_node(6) =
mesh.
node_ptr(elem->node_ptr(2)->id() + ((2*k+2) * orig_nodes));
2526 new_elem->set_node(7) =
mesh.
node_ptr(elem->node_ptr(3)->id() + ((2*k+2) * orig_nodes));
2527 new_elem->set_node(8) =
mesh.
node_ptr(elem->node_ptr(4)->id() + (2*k * orig_nodes));
2528 new_elem->set_node(9) =
mesh.
node_ptr(elem->node_ptr(5)->id() + (2*k * orig_nodes));
2529 new_elem->set_node(10) =
mesh.
node_ptr(elem->node_ptr(6)->id() + (2*k * orig_nodes));
2530 new_elem->set_node(11) =
mesh.
node_ptr(elem->node_ptr(7)->id() + (2*k * orig_nodes));
2531 new_elem->set_node(12) =
mesh.
node_ptr(elem->node_ptr(0)->id() + ((2*k+1) * orig_nodes));
2532 new_elem->set_node(13) =
mesh.
node_ptr(elem->node_ptr(1)->id() + ((2*k+1) * orig_nodes));
2533 new_elem->set_node(14) =
mesh.
node_ptr(elem->node_ptr(2)->id() + ((2*k+1) * orig_nodes));
2534 new_elem->set_node(15) =
mesh.
node_ptr(elem->node_ptr(3)->id() + ((2*k+1) * orig_nodes));
2535 new_elem->set_node(16) =
mesh.
node_ptr(elem->node_ptr(4)->id() + ((2*k+2) * orig_nodes));
2536 new_elem->set_node(17) =
mesh.
node_ptr(elem->node_ptr(5)->id() + ((2*k+2) * orig_nodes));
2537 new_elem->set_node(18) =
mesh.
node_ptr(elem->node_ptr(6)->id() + ((2*k+2) * orig_nodes));
2538 new_elem->set_node(19) =
mesh.
node_ptr(elem->node_ptr(7)->id() + ((2*k+2) * orig_nodes));
2539 new_elem->set_node(20) =
mesh.
node_ptr(elem->node_ptr(8)->id() + (2*k * orig_nodes));
2540 new_elem->set_node(21) =
mesh.
node_ptr(elem->node_ptr(4)->id() + ((2*k+1) * orig_nodes));
2541 new_elem->set_node(22) =
mesh.
node_ptr(elem->node_ptr(5)->id() + ((2*k+1) * orig_nodes));
2542 new_elem->set_node(23) =
mesh.
node_ptr(elem->node_ptr(6)->id() + ((2*k+1) * orig_nodes));
2543 new_elem->set_node(24) =
mesh.
node_ptr(elem->node_ptr(7)->id() + ((2*k+1) * orig_nodes));
2544 new_elem->set_node(25) =
mesh.
node_ptr(elem->node_ptr(8)->id() + ((2*k+2) * orig_nodes));
2545 new_elem->set_node(26) =
mesh.
node_ptr(elem->node_ptr(8)->id() + ((2*k+1) * orig_nodes));
2548 new_elem->set_neighbor(1, const_cast<RemoteElem *>(
remote_elem));
2550 new_elem->set_neighbor(2, const_cast<RemoteElem *>(
remote_elem));
2552 new_elem->set_neighbor(3, const_cast<RemoteElem *>(
remote_elem));
2554 new_elem->set_neighbor(4, const_cast<RemoteElem *>(
remote_elem));
2560 libmesh_not_implemented();
2565 new_elem->set_id(elem->id() + (k * orig_elem));
2566 new_elem->processor_id() = elem->processor_id();
2568 #ifdef LIBMESH_ENABLE_UNIQUE_ID 2574 orig_unique_ids + (k-1)*(orig_nodes + orig_elem) + orig_nodes + elem->id();
2576 new_elem->set_unique_id(uid);
2579 if (!elem_subdomain)
2581 new_elem->subdomain_id() = elem->subdomain_id();
2589 for (
auto s : elem->side_index_range())
2591 cross_section_boundary_info.
boundary_ids(elem, s, ids_to_copy);
2593 if (added_elem->
dim() == 3)
2600 cast_int<unsigned short>(s+1),
2609 libmesh_assert_less(s, 2);
2610 const unsigned short sidemap[2] = {3, 1};
2611 boundary_info.
add_side(added_elem, sidemap[s], ids_to_copy);
2617 boundary_info.
add_side(added_elem, 0, next_side_id);
2623 const unsigned short top_id = added_elem->
dim() == 3 ?
2624 cast_int<unsigned short>(elem->n_sides()+1) : 2;
2627 cast_int<boundary_id_type>(next_side_id+1));
2639 #if defined(LIBMESH_HAVE_TRIANGLE) && LIBMESH_DIM > 1 2643 const unsigned int nx,
2644 const unsigned int ny,
2648 const std::vector<TriangleInterface::Hole*> * holes)
2651 libmesh_assert_greater_equal (nx, 1);
2652 libmesh_assert_greater_equal (ny, 1);
2653 libmesh_assert_less (xmin, xmax);
2654 libmesh_assert_less (ymin, ymax);
2665 const Real delta_x = (xmax-xmin) / static_cast<Real>(nx);
2666 const Real delta_y = (ymax-ymin) / static_cast<Real>(ny);
2669 for (
unsigned int p=0; p<=nx; ++p)
2673 for (
unsigned int p=1; p<ny; ++p)
2677 for (
unsigned int p=0; p<=nx; ++p)
2681 for (
unsigned int p=1; p<ny; ++p)
2685 libmesh_assert_equal_to (
mesh.
n_nodes(), 2*(nx+ny));
2691 t.
desired_area() = 0.5 * (xmax-xmin)*(ymax-ymin) /
static_cast<Real>(nx*ny);
2695 if (holes !=
nullptr)
2702 std::unique_ptr<const Elem> side;
2707 for (
auto & elem :
mesh.element_ptr_range())
2708 for (
auto s : elem->side_index_range())
2709 if (elem->neighbor_ptr(s) ==
nullptr)
2711 elem->build_side_ptr(side, s);
2717 Point side_midpoint= 0.5f*( side->point(0) + side->point(1) );
2728 if (std::fabs(side_midpoint(1) - ymin) <
TOLERANCE)
2732 else if (std::fabs(side_midpoint(0) - xmax) <
TOLERANCE)
2736 else if (std::fabs(side_midpoint(1) - ymax) <
TOLERANCE)
2740 else if (std::fabs(side_midpoint(0) - xmin) <
TOLERANCE)
2747 boundary_info.
add_side(elem->id(), s, bc_id);
2752 #endif // LIBMESH_HAVE_TRIANGLE && LIBMESH_DIM > 1 2762 const Real xavg = (xmin + xmax)/2;
2763 const Real yavg = (ymin + ymax)/2;
2764 const Real zavg = (zmin + zmax)/2;
2772 auto add_tri = [&
mesh, flip_tris](std::array<dof_id_type,3> nodes)
ElemType
Defines an enum for geometric element types.
Class for receiving the callback during extrusion generation and providing user-defined subdomains ba...
virtual void reserve_nodes(const dof_id_type nn)=0
Reserves space for a known number of nodes.
virtual void triangulate() override
Internally, this calls Triangle's triangulate routine.
const std::set< boundary_id_type > & get_side_boundary_ids() const
virtual Node *& set_node(const unsigned int i)
A Node is like a Point, but with more information.
virtual unique_id_type parallel_max_unique_id() const =0
std::string & nodeset_name(boundary_id_type id)
const unsigned int invalid_uint
A number which is used quite often to represent an invalid or uninitialized value for an unsigned int...
static constexpr Real TOLERANCE
void resize(const unsigned int n)
Resize the vector.
void prepare_for_use(const bool skip_renumber_nodes_and_elements, const bool skip_find_neighbors)
Prepare a newly ecreated (or read) mesh for use.
void remove(const Node *node)
Removes the boundary conditions associated with node node, if any exist.
const std::map< boundary_id_type, std::string > & get_sideset_name_map() const
This is the base class from which all geometric element types are derived.
const Parallel::Communicator & comm() const
void boundary_ids(const Node *node, std::vector< boundary_id_type > &vec_to_fill) const
Fills a user-provided std::vector with the boundary ids associated with Node node.
The libMesh namespace provides an interface to certain functionality in the library.
ElemType & elem_type()
Sets and/or gets the desired element type.
const BoundaryInfo & get_boundary_info() const
The information about boundary ids on the mesh.
virtual Node * add_point(const Point &p, const dof_id_type id=DofObject::invalid_id, const processor_id_type proc_id=DofObject::invalid_processor_id)=0
Add a new Node at Point p to the end of the vertex array, with processor_id procid.
This is the MeshBase class.
TriangulationType & triangulation_type()
Sets and/or gets the desired triangulation type.
uint8_t processor_id_type
std::map< boundary_id_type, std::string > & set_sideset_name_map()
virtual bool is_serial() const
void add_node(const Node *node, const boundary_id_type id)
Add Node node with boundary id id to the boundary information data structures.
const std::map< boundary_id_type, std::string > & get_nodeset_name_map() const
static const boundary_id_type invalid_id
Number used for internal use.
void attach_hole_list(const std::vector< Hole *> *holes)
Attaches a vector of Hole* pointers which will be meshed around.
The UnstructuredMesh class is derived from the MeshBase class.
virtual Elem * add_elem(Elem *e)=0
Add elem e to the end of the element array.
static std::unique_ptr< Elem > build(const ElemType type, Elem *p=nullptr)
virtual const Node * query_node_ptr(const dof_id_type i) const =0
const std::map< boundary_id_type, std::string > & get_edgeset_name_map() const
The BoundaryInfo class contains information relevant to boundary conditions including storing faces...
void set_mesh_dimension(unsigned char d)
Resets the logical dimension of the mesh.
void sync_dofobject_data_by_id(const Communicator &comm, const Iterator &range_begin, const Iterator &range_end, SyncFunctor &sync)
Request data about a range of ghost dofobjects uniquely identified by their id.
virtual void clear()
Deletes all the element and node data that is currently stored.
std::string & sideset_name(boundary_id_type id)
const boundary_id_type top_id
std::string enum_to_string(const T e)
Real & desired_area()
Sets and/or gets the desired triangle area.
virtual Node * add_node(Node *n)=0
Add Node n to the end of the vertex array.
Triangulate the interior of a Planar Straight Line Graph, which is defined implicitly by the order of...
static std::unique_ptr< Node > build(const Node &n)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void max(const T &r, T &o, Request &req) const
virtual unsigned short dim() const =0
virtual void all_complete_order()
Calls the range-based version of this function with a range consisting of all elements in the mesh...
std::map< boundary_id_type, std::string > & set_nodeset_name_map()
static std::unique_ptr< Elem > build_with_id(const ElemType type, dof_id_type id)
Calls the build() method above with a nullptr parent, and additionally sets the newly-created Elem's ...
virtual bool is_replicated() const
void add_side(const dof_id_type elem, const unsigned short int side, const boundary_id_type id)
Add side side of element number elem with boundary id id to the boundary information data structure...
void all_second_order(const bool full_ordered=true)
Calls the range-based version of this function with a range consisting of all elements in the mesh...
unsigned int mesh_dimension() const
virtual const Node & node_ref(const dof_id_type i) const
Defines a dense vector for use in Finite Element-type computations.
virtual void delete_remote_elements()
When supported, deletes all nonlocal elements of the mesh except for "ghosts" which touch a local ele...
virtual subdomain_id_type get_subdomain_for_layer(const Elem *old_elem, unsigned int layer)=0
virtual dof_id_type n_elem() const =0
virtual const Node * node_ptr(const dof_id_type i) const =0
Base class for functors that can be evaluated at a point and (optionally) time.
processor_id_type processor_id() const
A C++ interface between LibMesh and the Triangle library written by J.R.
A Point defines a location in LIBMESH_DIM dimensional Real space.
virtual void reserve_elem(const dof_id_type ne)=0
Reserves space for a known number of elements.
void ErrorVector unsigned int
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
virtual dof_id_type n_nodes() const =0
std::map< boundary_id_type, std::string > & set_edgeset_name_map()
const RemoteElem * remote_elem