1 #include <libmesh/equation_systems.h> 2 #include <libmesh/int_range.h> 3 #include <libmesh/mesh.h> 4 #include <libmesh/node.h> 5 #include <libmesh/dof_map.h> 6 #include <libmesh/mesh_generation.h> 7 #include <libmesh/replicated_mesh.h> 8 #include <libmesh/mesh_function.h> 9 #include <libmesh/numeric_vector.h> 10 #include <libmesh/mesh_refinement.h> 11 #include <libmesh/sparse_matrix.h> 12 #include "libmesh/string_to_enum.h" 13 #include <libmesh/cell_tet4.h> 14 #include <libmesh/zero_function.h> 15 #include <libmesh/linear_implicit_system.h> 16 #include <libmesh/transient_system.h> 17 #include <libmesh/quadrature_gauss.h> 18 #include <libmesh/node_elem.h> 19 #include <libmesh/edge_edge2.h> 20 #include <libmesh/dg_fem_context.h> 21 #include <libmesh/enum_solver_type.h> 22 #include <libmesh/enum_preconditioner_type.h> 23 #include <libmesh/linear_solver.h> 24 #include <libmesh/parallel.h> 25 #include <libmesh/face_quad4.h> 26 #include <libmesh/face_quad9.h> 27 #include <libmesh/face_quad8.h> 28 #include <libmesh/face_tri3.h> 29 #include <libmesh/face_tri6.h> 30 #include <libmesh/face_tri7.h> 31 #include <libmesh/cell_hex8.h> 32 #include <libmesh/cell_hex20.h> 33 #include <libmesh/cell_hex27.h> 34 #include <libmesh/cell_tet10.h> 35 #include <libmesh/cell_tet14.h> 36 #include <libmesh/boundary_info.h> 65 virtual std::unique_ptr<GhostingFunctor>
clone ()
const override 67 return std::make_unique<AugmentSparsityOnNodes>(_mesh);
76 map_type & coupled_elements)
override 83 for (
const auto & elem :
as_range(range_begin, range_end))
85 if (elem->id() == node_elem_id_1)
87 if (elem->processor_id() != p)
89 coupled_elements.emplace(elem, null_mat);
93 coupled_elements.emplace(neighbor, null_mat);
96 if (elem->id() == node_elem_id_2)
98 if (elem->processor_id() != p)
100 coupled_elements.emplace(elem, null_mat);
104 coupled_elements.emplace(neighbor, null_mat);
123 { this->mesh_reinit(); }
138 std::vector<dof_id_type> dof_indices;
145 for ( ; el != end_el; ++el)
147 const Elem* elem = *el;
154 dof_map.dof_indices (elem, dof_indices);
155 const unsigned int n_dofs = dof_indices.size();
157 Ke.
resize (n_dofs, n_dofs);
160 for(
unsigned int i=0; i<n_dofs; i++)
174 dof_indices.resize(6);
189 const unsigned int n_dofs = dof_indices.size();
190 Ke.
resize (n_dofs, n_dofs);
193 for(
unsigned int i=0; i<n_dofs; i++)
217 std::vector<dof_id_type> dof_indices;
236 FEBase* neighbor_side_fe = NULL;
241 for (
const auto & elem :
mesh.active_local_element_ptr_range())
251 const std::vector<Real> &JxW = elem_fe->
get_JxW();
252 const std::vector<std::vector<Real> >& phi = elem_fe->
get_phi();
253 const std::vector<std::vector<RealGradient> >& dphi = elem_fe->
get_dphi();
258 for (
unsigned int qp=0; qp != n_qpoints; qp++)
259 for (
unsigned int i=0; i != n_dofs; i++)
260 for (
unsigned int j=0; j != n_dofs; j++)
263 for (
unsigned int qp=0; qp != n_qpoints; qp++)
264 for (
unsigned int i=0; i != n_dofs; i++)
272 for (context.
side = 0; context.
side != elem->n_sides(); ++context.
side)
289 const std::vector<Real> &JxW_face = side_fe->
get_JxW();
290 const std::vector<std::vector<Real> >& phi_face = side_fe->
get_phi();
292 FEBase* neighbor_side_fe = NULL;
297 const std::vector<std::vector<Real> >& phi_neighbor_face =
304 for (
unsigned int qp=0; qp<n_sidepoints; qp++)
306 for (
unsigned int i=0; i<n_dofs; i++)
307 for (
unsigned int j=0; j<n_dofs; j++)
310 JxW_face[qp] * phi_face[i][qp] * phi_face[j][qp];
313 for (
unsigned int i=0; i<n_dofs; i++)
314 for (
unsigned int j=0; j<n_neighbor_dofs; j++)
317 JxW_face[qp] * phi_face[i][qp] * phi_neighbor_face[j][qp];
320 for (
unsigned int i=0; i<n_neighbor_dofs; i++)
321 for (
unsigned int j=0; j<n_neighbor_dofs; j++)
324 JxW_face[qp] * phi_neighbor_face[i][qp] * phi_neighbor_face[j][qp];
327 for (
unsigned int i=0; i<n_neighbor_dofs; i++)
328 for (
unsigned int j=0; j<n_dofs; j++)
331 JxW_face[qp] * phi_neighbor_face[i][qp] * phi_face[j][qp];
361 const Real & x = p(0);
362 const Real & y = LIBMESH_DIM > 1 ? p(1) : 0;
363 const Real & z = LIBMESH_DIM > 2 ? p(2) : 0;
365 return x*(1-x)*(1-x) + x*x*(1-y) + x*(1-y)*(1-z) + y*(1-y)*z + z*(1-z)*(1-z);
374 const Real & x = p(0);
375 const Real & y = LIBMESH_DIM > 1 ? p(1) : 0;
376 const Real & z = LIBMESH_DIM > 2 ? p(2) : 0;
378 return x + 2*y + 3*z - 1;
387 const Real & x = p(0);
388 const Real & y = LIBMESH_DIM > 1 ? p(1) : 0;
389 const Real & z = LIBMESH_DIM > 2 ? p(2) : 0;
391 return (3*x < 1) + (3*y < 2) + (3*z > 2);
399 virtual std::unique_ptr<FunctionBase<Number>>
clone ()
const 400 {
return std::make_unique<TripleFunction>(offset); }
404 const Real = 0.)
override 407 virtual void operator() (
const Point & p,
411 libmesh_assert_greater(output.
size(), 0);
413 output(0) =
cubic_test(p, params,
"",
"") + offset;
414 if (output.
size() > 0)
416 if (output.
size() > 1)
427 return cubic_test(p, params,
"",
"") + offset;
446 CPPUNIT_TEST( test100KVariables );
448 CPPUNIT_TEST( testUninitializedInfo );
450 CPPUNIT_TEST( testPostInitAddVector );
451 CPPUNIT_TEST( testAddVectorProjChange );
452 CPPUNIT_TEST( testAddVectorTypeChange );
453 CPPUNIT_TEST( testPostInitAddVectorTypeChange );
455 CPPUNIT_TEST( testProjectHierarchicEdge3 );
457 CPPUNIT_TEST( testProjectHierarchicQuad9 );
458 CPPUNIT_TEST( testProjectHierarchicTri6 );
459 CPPUNIT_TEST( testProjectHierarchicTri7 );
460 CPPUNIT_TEST( test2DProjectVectorFETri3 );
461 CPPUNIT_TEST( test2DProjectVectorFEQuad4 );
462 CPPUNIT_TEST( test2DProjectVectorFETri6 );
463 CPPUNIT_TEST( test2DProjectVectorFETri7 );
464 CPPUNIT_TEST( test2DProjectVectorFEQuad8 );
465 CPPUNIT_TEST( test2DProjectVectorFEQuad9 );
466 #ifdef LIBMESH_HAVE_SOLVER 467 CPPUNIT_TEST( testBlockRestrictedVarNDofs );
469 #endif // LIBMESH_DIM > 1 471 CPPUNIT_TEST( testFirstScalarNumber );
472 CPPUNIT_TEST( testProjectHierarchicHex27 );
473 CPPUNIT_TEST( testProjectMeshFunctionHex27 );
474 CPPUNIT_TEST( testBoundaryProjectCube );
475 CPPUNIT_TEST( test3DProjectVectorFETet4 );
476 CPPUNIT_TEST( test3DProjectVectorFEHex8 );
477 CPPUNIT_TEST( test3DProjectVectorFETet10 );
478 CPPUNIT_TEST( test3DProjectVectorFETet14 );
479 CPPUNIT_TEST( test3DProjectVectorFEHex20 );
480 CPPUNIT_TEST( test3DProjectVectorFEHex27 );
481 #ifdef LIBMESH_HAVE_SOLVER 482 CPPUNIT_TEST( testSetSystemParameterOverEquationSystem);
483 CPPUNIT_TEST( testAssemblyWithDgFemContext );
485 #endif // LIBMESH_DIM > 2 486 #ifdef LIBMESH_HAVE_SOLVER 487 CPPUNIT_TEST( testDofCouplingWithVarGroups );
490 #ifdef LIBMESH_ENABLE_AMR 491 #ifdef LIBMESH_HAVE_METAPHYSICL 492 #ifdef LIBMESH_HAVE_PETSC 493 CPPUNIT_TEST( testProjectMatrixEdge2 );
495 CPPUNIT_TEST( testProjectMatrixQuad4 );
496 CPPUNIT_TEST( testProjectMatrixTri3 );
497 #endif // LIBMESH_DIM > 1 499 CPPUNIT_TEST( testProjectMatrixHex8 );
500 CPPUNIT_TEST( testProjectMatrixTet4 );
501 #endif // LIBMESH_DIM > 2 502 #endif // LIBMESH_HAVE_PETSC 503 #endif // LIBMESH_HAVE_METAPHYSICL 504 #endif // LIBMESH_ENABLE_AMR 506 CPPUNIT_TEST_SUITE_END();
512 std::set<subdomain_id_type> & u_subdomains,
513 std::set<subdomain_id_type> & v_subdomains,
514 std::set<subdomain_id_type> & w_subdomains,
517 const Elem * elem = locator(p);
521 if (u_subdomains.count(sbd_id))
523 LIBMESH_ASSERT_NUMBERS_EQUAL(
cubic_test(p,param,
"",
""),
524 sys.point_value(0,p),
526 LIBMESH_ASSERT_NUMBERS_EQUAL
530 LIBMESH_ASSERT_NUMBERS_EQUAL
535 if (v_subdomains.count(sbd_id))
537 LIBMESH_ASSERT_NUMBERS_EQUAL
540 LIBMESH_ASSERT_NUMBERS_EQUAL
544 LIBMESH_ASSERT_NUMBERS_EQUAL
549 if (w_subdomains.count(sbd_id))
551 LIBMESH_ASSERT_NUMBERS_EQUAL
554 LIBMESH_ASSERT_NUMBERS_EQUAL
558 LIBMESH_ASSERT_NUMBERS_EQUAL
596 0., 1., 0., 1., 0., 1.,
604 const std::string names[3] = {
"u",
"v",
"w"};
605 const unsigned int var_nums[3] =
612 for (
unsigned int i : {0, 1, 2})
615 CPPUNIT_ASSERT_EQUAL(i, var_nums[i]);
618 CPPUNIT_ASSERT_EQUAL(var.system(), &sys);
619 CPPUNIT_ASSERT_EQUAL(var.name(), names[i]);
620 CPPUNIT_ASSERT_EQUAL(var.number(), i);
621 CPPUNIT_ASSERT_EQUAL(var.first_scalar_number(), i*3);
622 CPPUNIT_ASSERT_EQUAL(var.type().family, types[i]);
623 CPPUNIT_ASSERT_EQUAL(
Order(var.type().order), orders[i]);
624 CPPUNIT_ASSERT_EQUAL(var.n_components(
mesh), 3u);
644 std::vector<std::string> var_names(n_dofs);
646 var_names[i] = std::to_string(i);
657 CPPUNIT_ASSERT_EQUAL(sys.
n_dofs(), n_dofs*5);
658 for (
const Node * node :
mesh.node_ptr_range())
659 CPPUNIT_ASSERT_EQUAL(
dof_id_type(node->n_vars(0)), n_dofs);
674 CPPUNIT_ASSERT (
info.find(
"uninitialized") != std::string::npos);
690 CPPUNIT_ASSERT_EQUAL(late_vec.size(),
dof_id_type(11));
691 CPPUNIT_ASSERT_EQUAL(late_vec.local_size(), sys.
solution->local_size());
720 CPPUNIT_ASSERT_EQUAL(late_vec.type(),
PARALLEL);
726 CPPUNIT_ASSERT_EQUAL(late_vec.type(),
GHOSTED);
732 CPPUNIT_ASSERT_EQUAL(late_vec.type(),
GHOSTED);
748 CPPUNIT_ASSERT_EQUAL(late_vec.type(),
PARALLEL);
759 late_vec.set(i, 2.0*i);
763 CPPUNIT_ASSERT_EQUAL(late_vec.type(),
GHOSTED);
765 std::vector<dof_id_type> dof_indices;
766 for (
auto & elem :
mesh.active_local_element_ptr_range())
768 dof_map.dof_indices (elem, dof_indices);
770 for (
auto d : dof_indices)
771 CPPUNIT_ASSERT_EQUAL(late_vec(d),
Number(2.0*d));
785 std::set<subdomain_id_type> u_subdomains {0, 1, 4, 5},
786 v_subdomains {1, 2, 3, 4},
787 w_subdomains {0, 1, 2, 3, 4};
798 for (
auto & elem :
mesh.element_ptr_range())
799 elem->subdomain_id() = elem->id();
803 sys.project_solution(&tfunc);
810 locator->enable_out_of_mesh_mode();
811 for (
Real x = 0.1; x < 1; x += 0.2)
812 tripleValueTest(
Point(x), sys, *locator,
813 u_subdomains, v_subdomains, w_subdomains,
816 #ifdef LIBMESH_ENABLE_AMR 817 for (
auto & elem :
mesh.element_ptr_range())
818 if ((elem->id()/2)%2)
823 locator->enable_out_of_mesh_mode();
824 for (
Real x = 0.1; x < 1; x += 0.2)
825 tripleValueTest(
Point(x), sys, *locator,
826 u_subdomains, v_subdomains, w_subdomains,
850 for (
const auto & node :
mesh.local_node_ptr_range())
854 auto dof_index = node->dof_number(sys.number(), u_var, i);
855 sys.solution->set(dof_index, (*node)(i));
860 sys.solution->close();
863 #ifdef LIBMESH_ENABLE_AMR 864 for (
auto & elem :
mesh.element_ptr_range())
869 for (
const auto & node :
mesh.local_node_ptr_range())
874 auto dof_index = node->dof_number(sys.number(), u_var, i);
875 auto value = (*sys.solution)(dof_index);
889 auto u_var = sys.add_variable
894 0., 1., 0., 1., 0., 1.,
901 for (
const auto & node :
mesh.local_node_ptr_range())
905 auto dof_index = node->dof_number(sys.number(), u_var, i);
906 sys.solution->set(dof_index, (*node)(i));
911 sys.solution->close();
914 #ifdef LIBMESH_ENABLE_AMR 915 for (
auto & elem :
mesh.element_ptr_range())
920 for (
const auto & node :
mesh.local_node_ptr_range())
924 auto dof_index = node->dof_number(sys.number(), u_var, i);
925 auto value = (*sys.solution)(dof_index);
939 std::set<subdomain_id_type> u_subdomains {0, 1, 4, 5},
940 v_subdomains {1, 2, 3, 4},
941 w_subdomains {0, 1, 2, 3, 4};
952 for (
auto & elem :
mesh.element_ptr_range())
953 elem->subdomain_id() = elem->id()/2;
957 sys.project_solution(&tfunc);
964 locator->enable_out_of_mesh_mode();
965 for (
Real x = 0.1; x < 1; x += 0.2)
966 for (
Real y = 0.1; y < 1; y += 0.2)
967 tripleValueTest(
Point(x,y), sys, *locator,
968 u_subdomains, v_subdomains, w_subdomains,
971 #ifdef LIBMESH_ENABLE_AMR 972 for (
auto & elem :
mesh.element_ptr_range())
973 if ((elem->id()/2)%2)
978 locator->enable_out_of_mesh_mode();
979 for (
Real x = 0.1; x < 1; x += 0.2)
980 for (
Real y = 0.1; y < 1; y += 0.2)
981 tripleValueTest(
Point(x,y), sys, *locator,
982 u_subdomains, v_subdomains, w_subdomains,
995 std::set<subdomain_id_type> u_subdomains {0, 1, 4, 5},
996 v_subdomains {1, 2, 3, 4},
997 w_subdomains {0, 1, 2, 3, 4};
1005 0., 1., 0., 1., 0., 1.,
1008 for (
auto & elem :
mesh.element_ptr_range())
1009 elem->subdomain_id() = elem->id()/6;
1013 sys.project_solution(&tfunc);
1020 locator->enable_out_of_mesh_mode();
1021 for (
Real x = 0.1; x < 1; x += 0.2)
1022 for (
Real y = 0.1; y < 1; y += 0.2)
1023 for (
Real z = 0.1; z < 1; z += 0.2)
1024 tripleValueTest(
Point(x,y,z), sys, *locator,
1025 u_subdomains, v_subdomains, w_subdomains,
1028 #ifdef LIBMESH_ENABLE_AMR 1029 for (
auto & elem :
mesh.element_ptr_range())
1030 if ((elem->id()/2)%2)
1035 locator->enable_out_of_mesh_mode();
1036 for (
Real x = 0.1; x < 1; x += 0.2)
1037 for (
Real y = 0.1; y < 1; y += 0.2)
1038 for (
Real z = 0.1; z < 1; z += 0.2)
1039 tripleValueTest(
Point(x,y,z), sys, *locator,
1040 u_subdomains, v_subdomains, w_subdomains,
1057 0., 1., 0., 1., 0., 1.,
1063 std::vector<unsigned int> variables;
1065 std::sort(variables.begin(),variables.end());
1067 std::unique_ptr< NumericVector<Number> > mesh_function_vector =
1069 mesh_function_vector->init(sys.
n_dofs(),
false,
SERIAL);
1070 sys.
solution->localize( *mesh_function_vector );
1073 *mesh_function_vector,
1076 mesh_function.
init();
1089 0., 1., 0., 1., 0., 1.,
1095 for (
Real x = 0.1; x < 1; x += 0.2)
1096 for (
Real y = 0.1; y < 1; y += 0.2)
1097 for (
Real z = 0.1; z < 1; z += 0.2)
1100 LIBMESH_ASSERT_NUMBERS_EQUAL
1128 0., 1., 0., 1., 0., 1.,
1132 std::set<dof_id_type> projected_nodes_set;
1134 for (
const auto & elem :
mesh.element_ptr_range())
1136 for (
auto side : elem->side_index_range())
1138 std::vector<boundary_id_type> vec_to_fill;
1141 auto vec_it = std::find(vec_to_fill.begin(), vec_to_fill.end(), SIDE_BOUNDARY_ID);
1142 if (vec_it != vec_to_fill.end())
1144 for (
unsigned int node_index=0; node_index<elem->n_nodes(); node_index++)
1146 if( elem->is_node_on_side(node_index, side))
1148 projected_nodes_set.insert(elem->node_id(node_index));
1156 for (
const auto & elem :
mesh.element_ptr_range())
1159 side_max_x = 0, side_min_y = 0,
1160 side_max_y = 0, side_max_z = 0;
1163 found_side_max_x =
false, found_side_max_y =
false,
1164 found_side_min_y =
false, found_side_max_z =
false;
1166 for (
auto side : elem->side_index_range())
1171 found_side_max_x =
true;
1177 found_side_min_y =
true;
1183 found_side_max_y =
true;
1189 found_side_max_z =
true;
1196 if (found_side_max_x && found_side_max_y && found_side_max_z)
1197 for (
auto n : elem->node_index_range())
1198 if (elem->is_node_on_side(n, side_max_x) &&
1199 elem->is_node_on_side(n, side_max_y) &&
1200 elem->is_node_on_side(n, side_max_z))
1202 projected_nodes_set.insert(elem->node_id(n));
1209 if (found_side_max_x && found_side_min_y)
1210 for (
auto e : elem->edge_index_range())
1211 if (elem->is_edge_on_side(e, side_max_x) &&
1212 elem->is_edge_on_side(e, side_min_y))
1216 for (
unsigned int node_index=0; node_index<elem->n_nodes(); node_index++)
1218 if (elem->is_node_on_edge(node_index, e))
1220 projected_nodes_set.insert(elem->node_id(node_index));
1230 std::set<boundary_id_type> boundary_ids;
1231 boundary_ids.insert(NODE_BOUNDARY_ID);
1232 boundary_ids.insert(EDGE_BOUNDARY_ID);
1233 boundary_ids.insert(SIDE_BOUNDARY_ID);
1234 std::vector<unsigned int> variables;
1235 variables.push_back(u_var);
1246 Real ref_l1_norm =
static_cast<Real>(
mesh.
n_nodes()) - static_cast<Real>(projected_nodes_set.size());
1266 Point new_point_a(2.);
1267 Point new_point_b(3.);
1271 new_edge_elem->
set_node(0, new_node_a);
1272 new_edge_elem->set_node(1, new_node_b);
1281 node_elem_2->
set_node(0, new_node_a);
1294 std::set<subdomain_id_type> theta_subdomains;
1295 theta_subdomains.insert(10);
1310 equation_systems.
init ();
1337 Point new_point_a(2.);
1338 Point new_point_b(3.);
1342 new_edge_elem->
set_node(0, new_node_a);
1343 new_edge_elem->set_node(1, new_node_b);
1354 equation_systems.
parameters.
set<
unsigned int>(
"linear solver maximum iterations") = 0;
1366 0., 1., 0., 1., 0., 1.,
1370 li_system.get_linear_solver()->set_solver_type(
GMRES);
1375 li_system.parameters.set<
unsigned int>(
"linear solver maximum iterations") = 5;
1376 li_system.parameters.set<
Real>(
"linear solver tolerance") = 1e-100;
1379 equation_systems.
init ();
1385 CPPUNIT_ASSERT_EQUAL(li_system.n_linear_iterations(), 5u);
1403 0., 1., 0., 1., 0., 1.,
1429 for (
const auto & elem :
mesh.element_ptr_range())
1431 Point c = elem->vertex_average();
1432 if (c(0) <= 0.5 && c(1) <= 0.5)
1433 elem->subdomain_id() = 0;
1435 elem->subdomain_id() = 1;
1445 std::set<subdomain_id_type> block0;
1446 std::set<subdomain_id_type> block1;
1451 equation_systems.
init();
1453 std::vector<dof_id_type> u0_dofs;
1455 std::vector<dof_id_type> u1_dofs;
1458 std::set<dof_id_type> sys_u0_dofs;
1460 std::set<dof_id_type> sys_u1_dofs;
1469 const std::size_t c9 = 9;
1470 const std::size_t c21 = 21;
1471 CPPUNIT_ASSERT_EQUAL(c9, u0_dofs.size());
1472 CPPUNIT_ASSERT_EQUAL(c21, u1_dofs.size());
1473 CPPUNIT_ASSERT_EQUAL(c9, sys_u0_dofs.size());
1474 CPPUNIT_ASSERT_EQUAL(c21, sys_u1_dofs.size());
1477 #ifdef LIBMESH_ENABLE_AMR 1478 #ifdef LIBMESH_HAVE_METAPHYSICL 1479 #ifdef LIBMESH_HAVE_PETSC 1501 std::set<dof_id_type> coarse_nodes({0,1,2,3,4});
1502 std::vector<dof_id_type> node_order_f({0,5,1,6,2,7,3,8,4});
1505 int n_old_dofs = sys.
n_dofs();
1508 std::map <dof_id_type, dof_id_type> node2dof_c;
1509 for (
const auto & node :
mesh.node_ptr_range() )
1512 node2dof_c.insert( std::pair<dof_id_type,dof_id_type>( node->id() , cdof_id) );
1521 std::map <dof_id_type, dof_id_type> node2dof_f;
1522 for (
const auto & node :
mesh.local_node_ptr_range() )
1525 node2dof_f.insert( std::pair<dof_id_type,dof_id_type>(node->id() , fdof_id) );
1529 int n_new_dofs = sys.
n_dofs();
1533 int n_old_dofs_local = ndofs_old_end - ndofs_old_first;
1536 std::unique_ptr<SparseMatrix<Number> > proj_mat_ptr =
1539 proj_mat.
init(n_new_dofs, n_old_dofs, n_new_dofs_local, n_old_dofs_local);
1544 std::unique_ptr<SparseMatrix<Number> > gold_mat_ptr =
1547 gold_mat.
init(n_new_dofs, n_old_dofs, n_new_dofs_local, n_old_dofs_local);
1550 for (
const auto & node :
mesh.local_node_ptr_range() )
1553 dof_id_type fdof_id = (node2dof_f.find(node_id))->second;
1555 if (coarse_nodes.find(node_id) != coarse_nodes.end() )
1559 auto cdof_id = node2dof_c.find(node_id);
1560 gold_mat.
set(fdof_id, cdof_id->second, 1.0);
1567 auto node_loc = std::find(node_order_f.begin(), node_order_f.end(), node_id);
1570 auto dof_p = node2dof_c.find(node_p);
1571 auto dof_n = node2dof_c.find(node_n);
1573 gold_mat.
set(fdof_id, dof_p->second, 0.5);
1574 gold_mat.
set(fdof_id, dof_n->second, 0.5);
1582 gold_mat.
add(-1.0, proj_mat);
1601 if (elem_type == Utility::string_to_enum<ElemType>(
"QUAD4"))
1606 else if (elem_type == Utility::string_to_enum<ElemType>(
"TRI3"))
1615 std::set<dof_id_type> coarse_nodes;
1616 std::map<dof_id_type, std::vector<dof_id_type>> side_nbr_nodes;
1617 std::map<dof_id_type, std::vector<dof_id_type>> int_nbr_nodes;
1620 if (elem_type == Utility::string_to_enum<ElemType>(
"QUAD4"))
1622 coarse_nodes.insert({0,1,2,3,4,5,6,7,8});
1624 side_nbr_nodes.insert({9, {0,1}});
1625 side_nbr_nodes.insert({14, {1,2}});
1626 side_nbr_nodes.insert({11, {0,3}});
1627 side_nbr_nodes.insert({12, {1,4}});
1628 side_nbr_nodes.insert({16, {2,5}});
1629 side_nbr_nodes.insert({13, {3,4}});
1630 side_nbr_nodes.insert({17, {4,5}});
1631 side_nbr_nodes.insert({19, {3,6}});
1632 side_nbr_nodes.insert({20, {4,7}});
1633 side_nbr_nodes.insert({23, {5,8}});
1634 side_nbr_nodes.insert({21, {6,7}});
1635 side_nbr_nodes.insert({24, {7,8}});
1637 int_nbr_nodes.insert({10, {0,1,3,4}});
1638 int_nbr_nodes.insert({15, {1,2,4,5}});
1639 int_nbr_nodes.insert({18, {3,4,6,7}});
1640 int_nbr_nodes.insert({22, {4,5,7,8}});
1642 else if (elem_type == Utility::string_to_enum<ElemType>(
"TRI3"))
1644 coarse_nodes.insert({0,1,2,3});
1646 side_nbr_nodes.insert({4, {0,1}});
1647 side_nbr_nodes.insert({5, {0,3}});
1648 side_nbr_nodes.insert({6, {1,3}});
1649 side_nbr_nodes.insert({7, {0,2}});
1650 side_nbr_nodes.insert({8, {2,3}});
1654 int n_old_dofs = sys.
n_dofs();
1657 std::map <dof_id_type, dof_id_type> node2dof_c;
1658 for (
const auto & node :
mesh.node_ptr_range() )
1661 node2dof_c.insert( std::pair<dof_id_type,dof_id_type>( node->id() , cdof_id) );
1670 std::map <dof_id_type, dof_id_type> node2dof_f;
1671 for (
const auto & node :
mesh.local_node_ptr_range() )
1674 node2dof_f.insert( std::pair<dof_id_type,dof_id_type>(node->id() , fdof_id) );
1678 int n_new_dofs = sys.
n_dofs();
1682 int n_old_dofs_local = ndofs_old_end - ndofs_old_first;
1685 std::unique_ptr<SparseMatrix<Number> > proj_mat_ptr =
1688 proj_mat.
init(n_new_dofs, n_old_dofs, n_new_dofs_local, n_old_dofs_local);
1693 std::unique_ptr<SparseMatrix<Number> > gold_mat_ptr =
1696 gold_mat.
init(n_new_dofs, n_old_dofs, n_new_dofs_local, n_old_dofs_local);
1699 for (
const auto & node :
mesh.local_node_ptr_range() )
1702 dof_id_type fdof_id = (node2dof_f.find(node_id))->second;
1704 if (coarse_nodes.find(node_id) != coarse_nodes.end() )
1708 auto cdof_id = node2dof_c.find(node_id);
1709 gold_mat.
set(fdof_id, cdof_id->second, 1.0);
1712 else if ( side_nbr_nodes.find(node_id) != side_nbr_nodes.end() )
1716 auto node_nbrs = side_nbr_nodes.find(node_id);
1717 for (
auto nbr : node_nbrs->second)
1719 auto nbr_dof = node2dof_c.find(nbr);
1720 gold_mat.
set(fdof_id, nbr_dof->second, 0.5);
1728 auto node_nbrs = int_nbr_nodes.find(node_id);
1729 for (
auto nbr : node_nbrs->second)
1731 auto nbr_dof = node2dof_c.find(nbr);
1732 gold_mat.
set(fdof_id, nbr_dof->second, 0.25);
1741 proj_mat.
add(-1.0, gold_mat);
1760 if (elem_type == Utility::string_to_enum<ElemType>(
"HEX8"))
1763 0., 1., 0., 1., 0., 1.,
1765 else if (elem_type == Utility::string_to_enum<ElemType>(
"TET4"))
1784 std::set<dof_id_type> coarse_nodes;
1785 std::map<dof_id_type, std::vector<dof_id_type>> side_nbr_nodes;
1786 std::map<dof_id_type, std::vector<dof_id_type>> face_nbr_nodes;
1787 std::map<dof_id_type, std::vector<dof_id_type>> int_nbr_nodes;
1789 if (elem_type == Utility::string_to_enum<ElemType>(
"HEX8"))
1791 coarse_nodes.insert({0,1,2,3,4,5,6,7});
1794 side_nbr_nodes.insert({8, {0,1}});
1795 side_nbr_nodes.insert({10, {0,2}});
1796 side_nbr_nodes.insert({15, {1,3}});
1797 side_nbr_nodes.insert({18, {2,3}});
1798 side_nbr_nodes.insert({11, {0,4}});
1799 side_nbr_nodes.insert({16, {1,5}});
1800 side_nbr_nodes.insert({21, {3,7}});
1801 side_nbr_nodes.insert({20, {2,6}});
1802 side_nbr_nodes.insert({22, {4,5}});
1803 side_nbr_nodes.insert({24, {4,6}});
1804 side_nbr_nodes.insert({25, {5,7}});
1805 side_nbr_nodes.insert({26, {6,7}});
1807 face_nbr_nodes.insert({12, {0,1,4,5}});
1808 face_nbr_nodes.insert({9 , {0,1,2,3}});
1809 face_nbr_nodes.insert({14, {0,2,4,6}});
1810 face_nbr_nodes.insert({17, {1,3,5,7}});
1811 face_nbr_nodes.insert({19, {2,3,6,7}});
1812 face_nbr_nodes.insert({23, {4,5,6,7}});
1814 int_nbr_nodes.insert({13, {0,1,2,3,4,5,6,7}});
1816 else if (elem_type == Utility::string_to_enum<ElemType>(
"TET4"))
1818 coarse_nodes.insert({0,1,2,3});
1821 side_nbr_nodes.insert({4, {0,1}});
1822 side_nbr_nodes.insert({5, {0,2}});
1823 side_nbr_nodes.insert({6, {0,3}});
1824 side_nbr_nodes.insert({7, {1,2}});
1825 side_nbr_nodes.insert({8, {1,3}});
1826 side_nbr_nodes.insert({9, {2,3}});
1830 int n_old_dofs = sys.
n_dofs();
1833 std::map <dof_id_type, dof_id_type> node2dof_c;
1834 for (
const auto & node :
mesh.node_ptr_range() )
1837 node2dof_c.insert( std::pair<dof_id_type,dof_id_type>( node->id() , cdof_id) );
1846 std::map <dof_id_type, dof_id_type> node2dof_f;
1847 for (
const auto & node :
mesh.local_node_ptr_range() )
1850 node2dof_f.insert( std::pair<dof_id_type,dof_id_type>(node->id() , fdof_id) );
1854 int n_new_dofs = sys.
n_dofs();
1858 int n_old_dofs_local = ndofs_old_end - ndofs_old_first;
1861 std::unique_ptr<SparseMatrix<Number> > proj_mat_ptr =
1864 proj_mat.
init(n_new_dofs, n_old_dofs, n_new_dofs_local, n_old_dofs_local);
1869 std::unique_ptr<SparseMatrix<Number> > gold_mat_ptr =
1872 gold_mat.
init(n_new_dofs, n_old_dofs, n_new_dofs_local, n_old_dofs_local);
1875 for (
const auto & node :
mesh.local_node_ptr_range() )
1878 dof_id_type fdof_id = (node2dof_f.find(node_id))->second;
1880 if (coarse_nodes.find(node_id) != coarse_nodes.end() )
1884 auto cdof_id = node2dof_c.find(node_id);
1885 gold_mat.
set(fdof_id, cdof_id->second, 1.0);
1888 else if ( side_nbr_nodes.find(node_id) != side_nbr_nodes.end() )
1892 auto node_nbrs = side_nbr_nodes.find(node_id);
1893 for (
auto nbr : node_nbrs->second)
1895 auto nbr_dof = node2dof_c.find(nbr);
1896 gold_mat.
set(fdof_id, nbr_dof->second, 0.5);
1900 else if ( face_nbr_nodes.find(node_id) != face_nbr_nodes.end() )
1904 auto node_nbrs = face_nbr_nodes.find(node_id);
1905 for (
auto nbr : node_nbrs->second)
1907 auto nbr_dof = node2dof_c.find(nbr);
1908 gold_mat.
set(fdof_id, nbr_dof->second, 0.25);
1916 auto node_nbrs = int_nbr_nodes.find(node_id);
1917 for (
auto nbr : node_nbrs->second)
1919 auto nbr_dof = node2dof_c.find(nbr);
1920 gold_mat.
set(fdof_id, nbr_dof->second, 0.125);
1929 proj_mat.
add(-1.0, gold_mat);
1933 #endif // LIBMESH_HAVE_PETSC 1934 #endif // LIBMESH_HAVE_METAPHYSICL 1935 #endif // LIBMESH_ENABLE_AMR 1957 #ifdef LIBMESH_ENABLE_AMR 1958 #ifdef LIBMESH_HAVE_METAPHYSICL 1959 #ifdef LIBMESH_HAVE_PETSC 1966 #endif // LIBMESH_HAVE_PETSC 1967 #endif // LIBMESH_HAVE_METAPHYSICL 1968 #endif // LIBMESH_ENABLE_AMR unsigned int add_variables(const std::vector< std::string > &vars, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
Adds the variables vars to the list of variables for this system.
void test3DProjectVectorFETet14()
void test2DProjectVectorFETri7()
static const Order type_to_default_order_map[INVALID_ELEM]
This array maps the integer representation of the ElemType enum to the default approximation order of...
Number cubic_test(const Point &p, const Parameters &, const std::string &, const std::string &)
void local_dof_indices(const unsigned int var, std::set< dof_id_type > &var_indices) const
Fills the std::set with the degrees of freedom on the local processor corresponding the the variable ...
void testAddVectorTypeChange()
ElemType
Defines an enum for geometric element types.
void testProjectMatrixQuad4()
void allgather(const T &send_data, std::vector< T, A > &recv_data) const
This is the EquationSystems class.
dof_id_type dof_number(const unsigned int s, const unsigned int var, const unsigned int comp) const
The ReplicatedMesh class is derived from the MeshBase class, and is used to store identical copies of...
const DenseMatrix< Number > & get_elem_jacobian() const
Const accessor for element Jacobian.
Order
defines an enum for polynomial orders.
virtual Node *& set_node(const unsigned int i)
A Node is like a Point, but with more information.
This abstract base class defines the interface by which library code and user code can report associa...
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
void tripleValueTest(const Point &p, const TransientExplicitSystem &sys, const PointLocatorBase &locator, std::set< subdomain_id_type > &u_subdomains, std::set< subdomain_id_type > &v_subdomains, std::set< subdomain_id_type > &w_subdomains, const Parameters ¶m)
void get_side_fe(unsigned int var, FEGenericBase< OutputShape > *&fe) const
Accessor for edge/face (2D/3D) finite element object for variable var for the largest dimension in th...
virtual void pre_fe_reinit(const System &, const Elem *e)
Reinitializes local data vectors/matrices on the current geometric element.
bool has_boundary_id(const Node *const node, const boundary_id_type id) const
std::unique_ptr< PointLocatorBase > sub_point_locator() const
void testProjectHierarchicTri6()
ConstFunction that simply returns 0.
This class provides the ability to map between arbitrary, user-defined strings and several data types...
void allow_renumbering(bool allow)
If false is passed in then this mesh will no longer be renumbered when being prepared for use...
void testUninitializedInfo()
void neighbor_side_fe_reinit()
Initialize neighbor side data needed to assemble DG terms.
libMesh::Parallel::Communicator * TestCommWorld
void test3DProjectVectorFE(const ElemType elem_type)
The definition of the const_element_iterator struct.
std::size_t distribute_dofs(MeshBase &)
Distribute dofs on the current mesh.
static constexpr Real TOLERANCE
void local_variable_indices(T &idx, const MeshBase &mesh, unsigned int var_num) const
If T == dof_id_type, counts, if T == std::vector<dof_id_type>, fills an array of, those dof indices w...
dof_id_type end_old_dof(const processor_id_type proc) const
Manages consistently variables, degrees of freedom, coefficient vectors, matrices and linear solvers ...
void testProjectMatrixHex8()
virtual void side_fe_reinit() override
Override side_fe_reinit to set a boolean flag so that by default DG terms are assumed to be inactive...
void resize(const unsigned int n)
Resize the vector.
virtual void add_vector(const T *v, const std::vector< numeric_index_type > &dof_indices)
Computes , where v is a pointer and each dof_indices[i] specifies where to add value v[i]...
const std::vector< dof_id_type > & get_neighbor_dof_indices() const
Accessor for neighbor dof indices.
void prepare_for_use(const bool skip_renumber_nodes_and_elements, const bool skip_find_neighbors)
Prepare a newly created (or read) mesh for use.
virtual void mesh_reinit() override
Rebuild the cached _lower_to_upper map whenever our Mesh has changed.
static const unsigned int type_to_dim_map[INVALID_ELEM]
This array maps the integer representation of the ElemType enum to the geometric dimension of the ele...
void testAddVectorProjChange()
void projection_matrix(SparseMatrix< Number > &proj_mat) const
This method creates a projection matrix which corresponds to the operation of project_vector between ...
TripleFunction(Number _offset=0)
virtual std::unique_ptr< FunctionBase< Number > > clone() const
This is the base class from which all geometric element types are derived.
Number point_value(unsigned int var, const Point &p, const bool insist_on_success=true, const NumericVector< Number > *sol=nullptr) const
NumericVector< Number > * rhs
The system matrix.
void testSetSystemParameterOverEquationSystem()
const Parallel::Communicator & comm() const
Manages storage and variables for transient systems.
NumericVector< Number > & add_vector(std::string_view vec_name, const bool projections=true, const ParallelType type=PARALLEL)
Adds the additional vector vec_name to this system.
void get_all_variable_numbers(std::vector< unsigned int > &all_variable_numbers) const
Fills all_variable_numbers with all the variable numbers for the variables that have been added to th...
Number disc_thirds_test(const Point &p, const Parameters &, const std::string &, const std::string &)
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.
std::map< const Elem *, const CouplingMatrix *, CompareDofObjectsByPIDAndThenID > map_type
What elements do we care about and what variables do we care about on each element?
dof_id_type n_dofs(const unsigned int vn) const
void test2DProjectVectorFEQuad8()
virtual LinearSolver< Number > * get_linear_solver() const override
const DenseMatrix< Number > & get_neighbor_neighbor_jacobian() const
Const accessor for element-neighbor Jacobian.
The libMesh namespace provides an interface to certain functionality in the library.
void test2DProjectVectorFEQuad9()
dof_id_type n_local_dofs(const unsigned int vn) const
const BoundaryInfo & get_boundary_info() const
The information about boundary ids on the mesh.
void test2DProjectVectorFEQuad4()
virtual void solve() override
Assembles & solves the linear system A*x=b.
const T_sys & get_system(std::string_view name) const
void test3DProjectVectorFETet10()
CPPUNIT_TEST_SUITE_REGISTRATION(SystemsTest)
unsigned char get_side() const
Accessor for current side of Elem object.
void testProjectMatrix3D(const ElemType elem_type)
void add_coupling_functor(GhostingFunctor &coupling_functor, bool to_mesh=true)
Adds a functor which can specify coupling requirements for creation of sparse matrices.
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.
static std::unique_ptr< SparseMatrix< T > > build(const Parallel::Communicator &comm, const SolverPackage solver_package=libMesh::default_solver_package(), const MatrixBuildType matrix_build_type=MatrixBuildType::AUTOMATIC)
Builds a SparseMatrix<T> using the linear solver package specified by solver_package.
void testPostInitAddVectorTypeChange()
NumericVector< Number > * old_local_solution
All the values I need to compute my contribution to the simulation at hand.
dof_id_type n_dofs() const
void test2DProjectVectorFETri3()
This is the MeshBase class.
virtual numeric_index_type row_stop() const =0
void assemble_matrix_and_rhs(EquationSystems &es, const std::string &)
virtual void set(const numeric_index_type i, const numeric_index_type j, const T value)=0
Set the element (i,j) to value.
virtual void elem_fe_reinit(const std::vector< Point > *const pts=nullptr)
Reinitializes interior FE objects on the current geometric element.
unsigned int variable_number(std::string_view var) const
virtual void add(const numeric_index_type i, const numeric_index_type j, const T value)=0
Add value to the element (i,j).
This class handles the numbering of degrees of freedom on a mesh.
NumericVector< Number > * older_local_solution
All the values I need to compute my contribution to the simulation at hand.
processor_id_type size() const
const std::vector< std::vector< OutputGradient > > & get_dphi() const
uint8_t processor_id_type
void add_node(const Node *node, const boundary_id_type id)
Add Node node with boundary id id to the boundary information data structures.
unsigned int number() const
virtual void add_matrix(const DenseMatrix< T > &dm, const std::vector< numeric_index_type > &rows, const std::vector< numeric_index_type > &cols)=0
Add the full matrix dm to the SparseMatrix.
void testBlockRestrictedVarNDofs()
void get_neighbor_side_fe(unsigned int var, FEGenericBase< OutputShape > *&fe) const
Accessor for neighbor edge/face (2D/3D) finite element object for variable var.
Implements (adaptive) mesh refinement algorithms for a MeshBase.
void set_neighbor(const Elem &neighbor)
Set the neighbor element which we will use to assemble DG terms.
The UnstructuredMesh class is derived from the MeshBase class.
Manages consistently variables, degrees of freedom, and coefficient vectors.
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)
void testProjectMatrixTri3()
virtual void reinit()
Handle any mesh changes and reinitialize all the systems on the updated mesh.
void test3DProjectVectorFEHex20()
SimpleRange< IndexType > as_range(const std::pair< IndexType, IndexType > &p)
Helper function that allows us to treat a homogenous pair as a range.
void test2DProjectVectorFETri6()
Number new_linear_test(const Point &p, const Parameters &, const std::string &, const std::string &)
void testProjectHierarchicEdge3()
void set_preconditioner_type(const PreconditionerType pct)
Sets the type of preconditioner to use.
std::string get_info() const
AugmentSparsityOnNodes(MeshBase &mesh)
Constructor.
std::unique_ptr< NumericVector< Number > > solution
Data structure to hold solution values.
This class extends FEMContext in order to provide extra data required to perform local element residu...
virtual void init() override
Override the FunctionBase::init() member function.
virtual_for_inffe const std::vector< Real > & get_JxW() const
const std::vector< dof_id_type > & get_dof_indices() const
Accessor for element dof indices.
unsigned int add_variable(std::string_view var, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
Adds the variable var to the list of variables for this system.
void testProjectSquare(const ElemType elem_type)
unsigned int n_points() const
void testProjectMatrixTet4()
This is the base class for point locators.
void set_solver_type(const SolverType st)
Sets the type of solver to use.
void attach_assemble_function(void fptr(EquationSystems &es, const std::string &name))
Register a user function to use in assembling the system matrix and RHS.
dof_id_type n_dofs_on_processor(const processor_id_type proc) const
void project_solution(FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, std::optional< ConstElemRange > active_local_range=std::nullopt, std::optional< std::vector< unsigned int >> variable_numbers=std::nullopt) const
Projects arbitrary functions onto the current solution.
void testProjectMatrix1D(const ElemType elem_type)
const DenseMatrix< Number > & get_elem_neighbor_jacobian() const
Const accessor for element-neighbor Jacobian.
void test2DProjectVectorFE(const ElemType elem_type)
virtual void solve()
Solves the system.
virtual void close()=0
Calls the NumericVector's internal assembly routines, ensuring that the values are consistent across ...
void boundary_project_solution(const std::set< boundary_id_type > &b, const std::vector< unsigned int > &variables, FunctionBase< Number > *f, FunctionBase< Gradient > *g=nullptr, std::optional< ConstElemRange > active_local_range=std::nullopt)
Projects arbitrary boundary functions onto a vector of degree of freedom values for the current syste...
void testProjectCube(const ElemType elem_type)
virtual void redistribute() override
Update the cached _lower_to_upper map whenever our Mesh has been redistributed.
void testBoundaryProjectCube()
virtual const Elem * elem_ptr(const dof_id_type i) const =0
void test3DProjectVectorFEHex8()
const DenseMatrix< Number > & get_neighbor_elem_jacobian() const
Const accessor for element-neighbor Jacobian.
const Elem * neighbor_ptr(unsigned int i) const
const DenseVector< Number > & get_elem_residual() const
Const accessor for element residual.
virtual void close()=0
Calls the SparseMatrix's internal assembly routines, ensuring that the values are consistent across p...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
subdomain_id_type subdomain_id() const
void testFirstScalarNumber()
MeshBase & _mesh
The Mesh we're calculating on.
unsigned char side
Current side for side_* to examine.
void max(const T &r, T &o, Request &req) const
virtual numeric_index_type row_start() const =0
const Node * node_ptr(const unsigned int i) const
void testDofCouplingWithVarGroups()
T & set(const std::string &)
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 ...
const MeshBase & get_mesh() const
virtual const Elem & elem_ref(const dof_id_type i) const
void resize(const unsigned int new_m, const unsigned int new_n)
Resizes the matrix to the specified size and calls zero().
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...
void test3DProjectVectorFEHex27()
ExplicitSystem & simpleSetup(UnstructuredMesh &mesh, EquationSystems &es)
static std::unique_ptr< NumericVector< T > > build(const Parallel::Communicator &comm, SolverPackage solver_package=libMesh::default_solver_package(), ParallelType parallel_type=AUTOMATIC)
Builds a NumericVector on the processors in communicator comm using the linear solver package specifi...
Parameters parameters
Data structure holding arbitrary parameters.
virtual unsigned int size() const override final
void get_element_fe(unsigned int var, FEGenericBase< OutputShape > *&fe) const
Accessor for interior finite element object for variable var for the largest dimension in the mesh...
virtual Real linfty_norm() const =0
virtual const Node & node_ref(const dof_id_type i) const
void testProjectHierarchicTri7()
const DenseMatrix< Number > & get_elem_elem_jacobian() const
Const accessor for element-element Jacobian.
virtual std::unique_ptr< GhostingFunctor > clone() const override
A clone() is needed because GhostingFunctor can not be shared between different meshes.
virtual void init()
Initialize all the systems.
dof_id_type first_old_dof(const processor_id_type proc) const
This class provides function-like objects for data distributed over a mesh.
void testAssemblyWithDgFemContext()
FEFamily
defines an enum for finite element families.
void testProjectMatrix2D(const ElemType elem_type)
unsigned int n_vars() const
void testProjectMeshFunctionHex27()
virtual System & add_system(std::string_view system_type, std::string_view name)
Add the system of type system_type named name to the systems array.
virtual const Node * node_ptr(const dof_id_type i) const =0
void testProjectMatrixEdge2()
Base class for functors that can be evaluated at a point and (optionally) time.
The Mesh class is a thin wrapper, around the ReplicatedMesh class by default.
processor_id_type processor_id() const
void testProjectHierarchicHex27()
bool vector_preservation(std::string_view vec_name) const
void testProjectLine(const ElemType elem_type)
const DofMap & get_dof_map() const
processor_id_type processor_id() const
virtual ElemType type() const =0
Number component(unsigned int i, const Point &p, Real) override
void assembly_with_dg_fem_context(EquationSystems &es, const std::string &)
void testProjectCubeWithMeshFunction(const ElemType elem_type)
void testPostInitAddVector()
A Point defines a location in LIBMESH_DIM dimensional Real space.
void test3DProjectVectorFETet4()
const SparseMatrix< Number > & get_system_matrix() const
std::vector< dof_id_type > n_dofs_per_processor(const unsigned int vn) const
virtual dof_id_type n_nodes() const =0
This class forms the foundation from which generic finite elements may be derived.
const QBase & get_element_qrule() const
Accessor for element interior quadrature rule for the dimension of the current _elem.
Manages consistently variables, degrees of freedom, and coefficient vectors for explicit systems...
const QBase & get_side_qrule() const
Accessor for element side quadrature rule for the dimension of the current _elem. ...
void testProjectHierarchicQuad9()
void add_edge(const dof_id_type elem, const unsigned short int edge, const boundary_id_type id)
Add edge edge of element number elem with boundary id id to the boundary information data structure...
const std::vector< std::vector< OutputShape > > & get_phi() const
virtual void init(const numeric_index_type m, const numeric_index_type n, const numeric_index_type m_l, const numeric_index_type n_l, const numeric_index_type nnz=30, const numeric_index_type noz=10, const numeric_index_type blocksize=1)=0
Initialize SparseMatrix with the specified sizes.
void uniformly_refine(unsigned int n=1)
Uniformly refines the mesh n times.
This class defines a coupling matrix.
void set_union(T &data, const unsigned int root_id) const