25#include "libmesh/coupling_matrix.h"
26#include "libmesh/dof_map.h"
27#include "libmesh/elem.h"
28#include "libmesh/equation_systems.h"
29#include "libmesh/fe_interface.h"
30#include "libmesh/node.h"
31#include "libmesh/quadrature_gauss.h"
32#include "libmesh/sparse_matrix.h"
33#include "libmesh/tensor_value.h"
34#include "libmesh/vector_value.h"
35#include "libmesh/fe.h"
39template <
typename P,
typename C>
50template <
typename P,
typename C>
58 mooseAssert(neighbor_sub_id != libMesh::Elem::invalid_subdomain_id
59 ?
mesh.getCoordSystem(sub_id) ==
mesh.getCoordSystem(neighbor_sub_id)
61 "Coordinate systems must be the same between element and neighbor");
62 const auto coord_type =
mesh.getCoordSystem(sub_id);
66 if (
mesh.usingGeneralAxisymmetricCoordAxes())
68 const auto & axis =
mesh.getGeneralAxisymmetricCoordAxis(sub_id);
73 point, factor, coord_type,
mesh.getAxisymmetricRadialCoord());
81 _subproblem(_sys.subproblem()),
83 _nonlocal_cm(_subproblem.nonlocalCouplingMatrix(_sys.number())),
84 _computing_residual(_subproblem.currentlyComputingResidual()),
85 _computing_jacobian(_subproblem.currentlyComputingJacobian()),
86 _computing_residual_and_jacobian(_subproblem.currentlyComputingResidualAndJacobian()),
87 _dof_map(_sys.dofMap()),
90 _mesh_dimension(_mesh.dimension()),
92 FEType(_mesh.hasSecondOrderElements() ? SECOND : FIRST, LAGRANGE).set_p_refinement(false)),
93 _user_added_fe_of_helper_type(false),
94 _user_added_fe_face_of_helper_type(false),
95 _user_added_fe_face_neighbor_of_helper_type(false),
96 _user_added_fe_neighbor_of_helper_type(false),
97 _user_added_fe_lower_of_helper_type(false),
98 _building_helpers(false),
99 _current_qrule(nullptr),
100 _current_qrule_volume(nullptr),
101 _current_qrule_arbitrary(nullptr),
102 _coord_type(
Moose::COORD_XYZ),
103 _current_qrule_face(nullptr),
104 _current_qface_arbitrary(nullptr),
105 _current_qrule_neighbor(nullptr),
106 _need_JxW_neighbor(false),
108 _custom_mortar_qrule(false),
109 _current_qrule_lower(nullptr),
111 _current_elem(nullptr),
112 _current_elem_volume(0),
114 _current_side_elem(nullptr),
115 _current_side_volume(0),
116 _current_neighbor_elem(nullptr),
117 _current_neighbor_side(0),
118 _current_neighbor_side_elem(nullptr),
119 _need_neighbor_elem_volume(false),
120 _current_neighbor_volume(0),
121 _current_node(nullptr),
122 _current_neighbor_node(nullptr),
123 _current_elem_volume_computed(false),
124 _current_side_volume_computed(false),
126 _current_lower_d_elem(nullptr),
127 _current_neighbor_lower_d_elem(nullptr),
128 _need_lower_d_elem_volume(false),
129 _need_neighbor_lower_d_elem_volume(false),
132 _residual_vector_tags(_subproblem.getVectorTags(
Moose::VECTOR_TAG_RESIDUAL)),
133 _cached_residual_values(2),
134 _cached_residual_rows(2),
135 _max_cached_residuals(0),
136 _max_cached_jacobians(0),
138 _block_diagonal_matrix(false),
139 _calculate_xyz(false),
140 _calculate_face_xyz(false),
141 _calculate_curvatures(false),
142 _calculate_ad_coord(false),
143 _prepared_for_p_refinement(false)
173 const auto mortar_helper_type =
174 FEType(
_mesh_dimension == 2 ? helper_order : FIRST, LAGRANGE).set_p_refinement(
false);
177 _fe_msm->add_p_level_in_reinit(
false);
190 for (
auto & it :
_fe[
dim])
280 _fe[
dim][type] = FEGenericBase<Real>::build(
dim, type).release();
281 _fe[
dim][type]->add_p_level_in_reinit(type.p_refinement);
284 _fe[
dim][type]->get_phi();
285 _fe[
dim][type]->get_dphi();
289 _fe[
dim][type]->get_xyz();
291 _fe[
dim][type]->get_d2phi();
309 _fe_face[
dim][type] = FEGenericBase<Real>::build(
dim, type).release();
310 _fe_face[
dim][type]->add_p_level_in_reinit(type.p_refinement);
386 _fe_lower[
dim][type] = FEGenericBase<Real>::build(
dim, type).release();
387 _fe_lower[
dim][type]->add_p_level_in_reinit(type.p_refinement);
410 _fe_lower[
dim][type] = FEGenericBase<Real>::build(
dim, type).release();
411 _fe_lower[
dim][type]->add_p_level_in_reinit(type.p_refinement);
430 unsigned int dim = ((type.family == LAGRANGE_VEC) || (type.family == MONOMIAL_VEC)) ? 0 : 2;
432 if (ending_dim <
dim)
434 for (;
dim <= ending_dim;
dim++)
458 unsigned int dim = ((type.family == LAGRANGE_VEC) || (type.family == MONOMIAL_VEC)) ? 0 : 2;
460 if (ending_dim <
dim)
462 for (;
dim <= ending_dim;
dim++)
484 unsigned int min_dim;
485 if (type.family == NEDELEC_ONE || type.family == RAVIART_THOMAS ||
486 type.family == L2_RAVIART_THOMAS)
497 _vector_fe[
dim][type] = FEGenericBase<VectorValue<Real>>::build(
dim, type).release();
498 _vector_fe[
dim][type]->add_p_level_in_reinit(type.p_refinement);
518 unsigned int min_dim;
519 if (type.family == NEDELEC_ONE || type.family == RAVIART_THOMAS ||
520 type.family == L2_RAVIART_THOMAS)
551 unsigned int min_dim;
552 if (type.family == NEDELEC_ONE || type.family == RAVIART_THOMAS ||
553 type.family == L2_RAVIART_THOMAS)
584 unsigned int min_dim;
585 if (type.family == NEDELEC_ONE || type.family == RAVIART_THOMAS ||
586 type.family == L2_RAVIART_THOMAS)
598 FEGenericBase<VectorValue<Real>>::build(
dim, type).release();
615 mooseAssert(qdefault.size() > 0,
"default quadrature must be initialized before order bumps");
619 if (qvec.size() != ndims || !qvec[0].vol)
621 qdefault[0].arbitrary_vol->get_order(),
623 qdefault[0].face->get_order(),
625 else if (qvec[0].vol->get_order() < volume_order)
627 qvec[0].arbitrary_vol->get_order(),
629 qvec[0].face->get_order(),
638 mooseAssert(qdefault.size() > 0,
"default quadrature must be initialized before order bumps");
642 if (qvec.size() != ndims || !qvec[0].vol)
643 createQRules(qdefault[0].vol->type(), order, order, order, block);
644 else if (qvec[0].vol->get_order() < order || qvec[0].face->get_order() < order)
646 std::max(order, qvec[0].arbitrary_vol->get_order()),
647 std::max(order, qvec[0].vol->get_order()),
648 std::max(order, qvec[0].face->get_order()),
659 bool allow_negative_qweights)
663 if (qvec.size() != ndims)
666 for (
unsigned int i = 0; i < qvec.size(); i++)
669 auto & q = qvec[
dim];
670 q.vol = QBase::build(type,
dim, volume_order);
671 q.vol->allow_rules_with_negative_weights = allow_negative_qweights;
672 q.face = QBase::build(type,
dim - 1, face_order);
673 q.face->allow_rules_with_negative_weights = allow_negative_qweights;
675 q.fv_face->allow_rules_with_negative_weights = allow_negative_qweights;
676 q.neighbor = std::make_unique<ArbitraryQuadrature>(
dim - 1, face_order);
677 q.neighbor->allow_rules_with_negative_weights = allow_negative_qweights;
678 q.arbitrary_vol = std::make_unique<ArbitraryQuadrature>(
dim, order);
679 q.arbitrary_vol->allow_rules_with_negative_weights = allow_negative_qweights;
680 q.arbitrary_face = std::make_unique<ArbitraryQuadrature>(
dim - 1, face_order);
681 q.arbitrary_face->allow_rules_with_negative_weights = allow_negative_qweights;
698 for (
auto & it :
_fe[
dim])
699 it.second->attach_quadrature_rule(qrule);
701 it.second->attach_quadrature_rule(qrule);
704 mooseAssert(dim <
_unique_fe_helper.size(),
"We should not be indexing out of bounds");
716 it.second->attach_quadrature_rule(qrule);
718 it.second->attach_quadrature_rule(qrule);
735 it.second->attach_quadrature_rule(qrule);
737 it.second->attach_quadrature_rule(qrule);
751 it.second->attach_quadrature_rule(qrule);
753 it.second->attach_quadrature_rule(qrule);
757 "We should not be indexing out of bounds");
790 " does not match previously specified quadrature_order: ",
792 ". Quadrature_order (when specified) must match for all mortar constraints.");
799 unsigned int dim =
elem->dim();
801 for (
const auto & it :
_fe[
dim])
803 FEBase & fe = *it.second;
804 const FEType & fe_type = it.first;
812 fesd.
_phi.shallowCopy(
const_cast<std::vector<std::vector<Real>
> &>(fe.get_phi()));
814 const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe.get_dphi()));
817 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe.get_d2phi()));
821 FEVectorBase & fe = *it.second;
822 const FEType & fe_type = it.first;
830 fesd.
_phi.shallowCopy(
const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe.get_phi()));
832 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe.get_dphi()));
835 const_cast<std::vector<std::vector<TypeNTensor<3, Real>
>> &>(fe.get_d2phi()));
838 const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe.get_curl_phi()));
840 fesd.
_div_phi.shallowCopy(
const_cast<std::vector<std::vector<Real>
> &>(fe.get_div_phi()));
863 for (
unsigned int qp = 0; qp != n_qp; qp++)
868 for (
unsigned qp = 0; qp < n_qp; ++qp)
871 for (
unsigned qp = 0; qp < n_qp; ++qp)
875 for (
const auto & it :
_fe[
dim])
879 FEBase & fe = *it.second;
880 auto fe_type = it.first;
881 auto num_shapes = FEInterface::n_shape_functions(fe_type,
elem);
884 grad_phi.resize(num_shapes);
885 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
886 grad_phi[i].resize(n_qp);
892 const auto & regular_grad_phi =
_fe_shape_data[fe_type]->_grad_phi;
893 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
894 for (
unsigned qp = 0; qp < n_qp; ++qp)
895 grad_phi[i][qp] = regular_grad_phi[i][qp];
902 FEVectorBase & fe = *it.second;
903 auto fe_type = it.first;
904 auto num_shapes = FEInterface::n_shape_functions(fe_type,
elem);
907 grad_phi.resize(num_shapes);
908 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
909 grad_phi[i].resize(n_qp);
916 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
917 for (
unsigned qp = 0; qp < n_qp; ++qp)
918 grad_phi[i][qp] = regular_grad_phi[i][qp];
924 for (
auto i : make_range(n))
928 if (
_xfem !=
nullptr)
932template <
typename OutputType>
937 FEGenericBase<OutputType> * fe)
951 const auto & dphidxi = fe->get_dphidxi();
952 const auto & dphideta = fe->get_dphideta();
953 const auto & dphidzeta = fe->get_dphidzeta();
954 auto num_shapes = grad_phi.size();
960 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
961 for (
unsigned qp = 0; qp < n_qp; ++qp)
968 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
969 for (
unsigned qp = 0; qp < n_qp; ++qp)
971 grad_phi[i][qp].slice(0) = dphidxi[i][qp] *
_ad_dxidx_map[qp];
972 grad_phi[i][qp].slice(1) = dphidxi[i][qp] *
_ad_dxidy_map[qp];
973 grad_phi[i][qp].slice(2) = dphidxi[i][qp] *
_ad_dxidz_map[qp];
980 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
981 for (
unsigned qp = 0; qp < n_qp; ++qp)
983 grad_phi[i][qp].slice(0) =
985 grad_phi[i][qp].slice(1) =
987 grad_phi[i][qp].slice(2) =
995 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
996 for (
unsigned qp = 0; qp < n_qp; ++qp)
998 grad_phi[i][qp].slice(0) = dphidxi[i][qp] *
_ad_dxidx_map[qp] +
1001 grad_phi[i][qp].slice(1) = dphidxi[i][qp] *
_ad_dxidy_map[qp] +
1004 grad_phi[i][qp].slice(2) = dphidxi[i][qp] *
_ad_dxidz_map[qp] +
1045 const std::vector<Real> & qw,
1087 const auto & elem_nodes =
elem->get_nodes();
1088 const auto & phi_map = fe->get_fe_map().get_phi_map();
1091 const auto num_shapes = phi_map.size();
1092 const auto & dphidxi_map = fe->get_fe_map().get_dphidxi_map();
1093 const auto & dphideta_map = fe->get_fe_map().get_dphideta_map();
1094 const auto & dphidzeta_map = fe->get_fe_map().get_dphidzeta_map();
1096 const bool do_derivatives =
1117 for (std::size_t i = 0; i < num_shapes; i++)
1119 libmesh_assert(elem_nodes[i]);
1120 const Node &
node = *elem_nodes[i];
1124 if (
node.n_dofs(sys_num, disp_num))
1126 elem_point(direction).derivatives(),
node.dof_number(sys_num, disp_num, 0), 1.);
1136 if (
_ad_jac[p].value() <= -TOLERANCE * TOLERANCE)
1138 static bool failing =
false;
1143 libmesh_error_msg(
"ERROR: negative Jacobian " <<
_ad_jac[p].value() <<
" at point index "
1144 << p <<
" in element " <<
elem->id());
1167 for (std::size_t i = 0; i < num_shapes; i++)
1169 libmesh_assert(elem_nodes[i]);
1170 const Node &
node = *elem_nodes[i];
1174 if (
node.n_dofs(sys_num, disp_num))
1176 elem_point(direction).derivatives(),
node.dof_number(sys_num, disp_num, 0), 1.);
1189 const auto g11 = (dx_dxi * dx_dxi + dy_dxi * dy_dxi + dz_dxi * dz_dxi);
1191 const auto g12 = (dx_dxi * dx_deta + dy_dxi * dy_deta + dz_dxi * dz_deta);
1193 const auto & g21 = g12;
1195 const auto g22 = (dx_deta * dx_deta + dy_deta * dy_deta + dz_deta * dz_deta);
1197 auto det = (g11 * g22 - g12 * g21);
1199 if (det.value() <= -TOLERANCE * TOLERANCE)
1201 static bool failing =
false;
1206 libmesh_error_msg(
"ERROR: negative Jacobian " << det <<
" at point index " << p
1207 <<
" in element " <<
elem->id());
1212 else if (det.value() <= 0.)
1213 det.value() = TOLERANCE * TOLERANCE;
1215 const auto inv_det = 1. / det;
1221 const auto g11inv = g22 * inv_det;
1222 const auto g12inv = -g12 * inv_det;
1223 const auto g21inv = -g21 * inv_det;
1224 const auto g22inv = g11 * inv_det;
1245 for (std::size_t i = 0; i < num_shapes; i++)
1247 libmesh_assert(elem_nodes[i]);
1248 const Node &
node = *elem_nodes[i];
1252 if (
node.n_dofs(sys_num, disp_num))
1254 elem_point(direction).derivatives(),
node.dof_number(sys_num, disp_num, 0), 1.);
1270 _ad_jac[p] = (dx_dxi * (dy_deta * dz_dzeta - dz_deta * dy_dzeta) +
1271 dy_dxi * (dz_deta * dx_dzeta - dx_deta * dz_dzeta) +
1272 dz_dxi * (dx_deta * dy_dzeta - dy_deta * dx_dzeta));
1274 if (
_ad_jac[p].value() <= -TOLERANCE * TOLERANCE)
1276 static bool failing =
false;
1281 libmesh_error_msg(
"ERROR: negative Jacobian " <<
_ad_jac[p].value() <<
" at point index "
1282 << p <<
" in element " <<
elem->id());
1290 const auto inv_jac = 1. /
_ad_jac[p];
1292 _ad_dxidx_map[p] = (dy_deta * dz_dzeta - dz_deta * dy_dzeta) * inv_jac;
1293 _ad_dxidy_map[p] = (dz_deta * dx_dzeta - dx_deta * dz_dzeta) * inv_jac;
1294 _ad_dxidz_map[p] = (dx_deta * dy_dzeta - dy_deta * dx_dzeta) * inv_jac;
1296 _ad_detadx_map[p] = (dz_dxi * dy_dzeta - dy_dxi * dz_dzeta) * inv_jac;
1297 _ad_detady_map[p] = (dx_dxi * dz_dzeta - dz_dxi * dx_dzeta) * inv_jac;
1298 _ad_detadz_map[p] = (dy_dxi * dx_dzeta - dx_dxi * dy_dzeta) * inv_jac;
1308 libmesh_error_msg(
"Invalid dim = " <<
dim);
1315 unsigned int dim =
elem->dim();
1319 FEBase & fe_face = *it.second;
1320 const FEType & fe_type = it.first;
1325 fesd.
_phi.shallowCopy(
const_cast<std::vector<std::vector<Real>
> &>(fe_face.get_phi()));
1327 const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe_face.get_dphi()));
1330 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_face.get_d2phi()));
1334 FEVectorBase & fe_face = *it.second;
1335 const FEType & fe_type = it.first;
1343 fesd.
_phi.shallowCopy(
1344 const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe_face.get_phi()));
1346 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_face.get_dphi()));
1349 const_cast<std::vector<std::vector<TypeNTensor<3, Real>
>> &>(fe_face.get_d2phi()));
1352 const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe_face.get_curl_phi()));
1355 const_cast<std::vector<std::vector<Real>
> &>(fe_face.get_div_phi()));
1383 if (
_xfem !=
nullptr)
1387 for (
auto i : make_range(n))
1403 const auto n_qp = qw.size();
1407 std::vector<std::vector<Real>>
const * d2psidxi2_map =
nullptr;
1408 std::vector<std::vector<Real>>
const * d2psidxideta_map =
nullptr;
1409 std::vector<std::vector<Real>>
const * d2psideta2_map =
nullptr;
1427 if (side_elem.node_id(0) ==
elem.node_id(0))
1432 VectorValue<ADReal> side_point;
1435 const Node &
node = side_elem.node_ref(0);
1441 side_point(direction).derivatives(),
node.dof_number(sys_num, disp_num, 0), 1.);
1444 for (
const auto p : make_range(n_qp))
1465 for (
const auto p : make_range(n_qp))
1468 for (
const auto p : make_range(n_qp))
1471 for (
const auto p : make_range(n_qp))
1474 const auto n_mapping_shape_functions =
1477 for (
unsigned int i = 0; i < n_mapping_shape_functions; i++)
1479 const Node &
node = side_elem.node_ref(i);
1480 VectorValue<ADReal> side_point =
node;
1485 side_point(direction).derivatives(),
node.dof_number(sys_num, disp_num, 0), 1.);
1487 for (
const auto p : make_range(n_qp))
1490 for (
const auto p : make_range(n_qp))
1493 for (
const auto p : make_range(n_qp))
1497 for (
const auto p : make_range(n_qp))
1507 libmesh_assert_not_equal_to(denominator, 0);
1526 for (
const auto p : make_range(n_qp))
1532 for (
const auto p : make_range(n_qp))
1535 for (
const auto p : make_range(n_qp))
1542 const unsigned int n_mapping_shape_functions =
1545 for (
unsigned int i = 0; i < n_mapping_shape_functions; i++)
1547 const Node &
node = side_elem.node_ref(i);
1548 VectorValue<ADReal> side_point =
node;
1553 side_point(direction).derivatives(),
node.dof_number(sys_num, disp_num, 0), 1.);
1555 for (
const auto p : make_range(n_qp))
1561 for (
const auto p : make_range(n_qp))
1564 for (
const auto p : make_range(n_qp))
1572 for (
const auto p : make_range(n_qp))
1580 const auto g11 = (dxdxi * dxdxi + dydxi * dydxi + dzdxi * dzdxi);
1582 const auto g12 = (dxdxi * dxdeta + dydxi * dydeta + dzdxi * dzdeta);
1584 const auto & g21 = g12;
1586 const auto g22 = (dxdeta * dxdeta + dydeta * dydeta + dzdeta * dzdeta);
1589 const auto the_jac = sqrt(g11 * g22 - g12 * g21);
1602 const auto numerator = E * N - 2. * F * M + G * L;
1603 const auto denominator = E * G - F * F;
1604 libmesh_assert_not_equal_to(denominator, 0.);
1620 unsigned int neighbor_dim =
neighbor->dim();
1625 FEBase & fe_face_neighbor = *it.second;
1626 FEType fe_type = it.first;
1629 fe_face_neighbor.reinit(
neighbor, &reference_points);
1633 fesd.
_phi.shallowCopy(
const_cast<std::vector<std::vector<Real>
> &>(fe_face_neighbor.get_phi()));
1635 const_cast<std::vector<std::vector<RealGradient>
> &>(fe_face_neighbor.get_dphi()));
1638 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_face_neighbor.get_d2phi()));
1642 FEVectorBase & fe_face_neighbor = *it.second;
1643 const FEType & fe_type = it.first;
1649 fe_face_neighbor.reinit(
neighbor, &reference_points);
1651 fesd.
_phi.shallowCopy(
1652 const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe_face_neighbor.get_phi()));
1654 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_face_neighbor.get_dphi()));
1656 fesd.
_second_phi.shallowCopy(
const_cast<std::vector<std::vector<TypeNTensor<3, Real>
>> &>(
1657 fe_face_neighbor.get_d2phi()));
1659 fesd.
_curl_phi.shallowCopy(
const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(
1660 fe_face_neighbor.get_curl_phi()));
1663 const_cast<std::vector<std::vector<Real>
> &>(fe_face_neighbor.get_div_phi()));
1668 "We should be in bounds here");
1679 unsigned int neighbor_dim =
neighbor->dim();
1684 FEBase & fe_neighbor = *it.second;
1685 FEType fe_type = it.first;
1688 fe_neighbor.reinit(
neighbor, &reference_points);
1692 fesd.
_phi.shallowCopy(
const_cast<std::vector<std::vector<Real>
> &>(fe_neighbor.get_phi()));
1694 const_cast<std::vector<std::vector<RealGradient>
> &>(fe_neighbor.get_dphi()));
1697 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_neighbor.get_d2phi()));
1701 FEVectorBase & fe_neighbor = *it.second;
1702 const FEType & fe_type = it.first;
1708 fe_neighbor.reinit(
neighbor, &reference_points);
1710 fesd.
_phi.shallowCopy(
1711 const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe_neighbor.get_phi()));
1713 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_neighbor.get_dphi()));
1716 const_cast<std::vector<std::vector<TypeNTensor<3, Real>
>> &>(fe_neighbor.get_d2phi()));
1719 const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe_neighbor.get_curl_phi()));
1722 const_cast<std::vector<std::vector<Real>
> &>(fe_neighbor.get_div_phi()));
1734 unsigned int neighbor_dim =
neighbor->dim();
1736 "Neighbor subdomain ID has not been correctly set");
1740 neighbor_rule->
setPoints(reference_points);
1745 "current neighbor subdomain has been set incorrectly");
1754 fe.attach_quadrature_rule(qrule);
1757 const std::vector<Real> &
JxW = fe.get_JxW();
1759 q_points.
shallowCopy(
const_cast<std::vector<Point> &
>(fe.get_xyz()));
1764 for (
unsigned int qp = 0; qp < qrule->n_points(); qp++)
1769 for (
auto i : make_range(n))
1774template <
typename Po
ints,
typename Coords>
1777 const Points & q_points,
1782 mooseAssert(qrule,
"The quadrature rule is null in Assembly::setCoordinateTransformation");
1783 auto n_points = qrule->n_points();
1784 mooseAssert(n_points == q_points.size(),
1785 "The number of points in the quadrature rule doesn't match the number of passed-in "
1786 "points in Assembly::setCoordinateTransformation");
1793 coord.resize(n_points);
1794 for (
unsigned int qp = 0; qp < n_points; qp++)
1842 "current subdomain has been set incorrectly");
1856 unsigned int elem_dimension =
elem->dim();
1869 "current subdomain has been set incorrectly");
1883 "current subdomain has been set incorrectly");
1909 "current subdomain has been set incorrectly");
1933 "Our finite volume quadrature rule should always yield a single point");
1941 const auto & ref_point = ref_points[0];
1948 "current neighbor subdomain has been set incorrectly");
1970 return qruleFaceHelper<ArbitraryQuadrature>(
1977 const auto elem_dimension =
elem->dim();
1990 "current subdomain has been set incorrectly");
2004Assembly::reinit(
const Elem * elem,
unsigned int side,
const std::vector<Point> & reference_points)
2009 "current subdomain has been set incorrectly");
2041 const Elem * neighbor,
2042 unsigned int neighbor_side,
2043 const std::vector<Point> * neighbor_reference_points)
2049 unsigned int neighbor_dim =
neighbor->dim();
2051 if (neighbor_reference_points)
2065 unsigned int elem_side,
2067 const std::vector<Point> *
const pts,
2068 const std::vector<Real> *
const weights)
2072 unsigned int elem_dim =
elem->dim();
2078 face_rule->setPoints(*pts);
2089 for (
const auto & it :
_fe_face[elem_dim])
2091 FEBase & fe_face = *it.second;
2092 FEType fe_type = it.first;
2095 fe_face.reinit(
elem, elem_side, tolerance, pts, weights);
2099 fesd.
_phi.shallowCopy(
const_cast<std::vector<std::vector<Real>
> &>(fe_face.get_phi()));
2101 const_cast<std::vector<std::vector<RealGradient>
> &>(fe_face.get_dphi()));
2104 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_face.get_d2phi()));
2108 FEVectorBase & fe_face = *it.second;
2109 const FEType & fe_type = it.first;
2115 fe_face.reinit(
elem, elem_side, tolerance, pts, weights);
2117 fesd.
_phi.shallowCopy(
2118 const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe_face.get_phi()));
2120 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_face.get_dphi()));
2123 const_cast<std::vector<std::vector<TypeNTensor<3, Real>
>> &>(fe_face.get_d2phi()));
2126 const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe_face.get_curl_phi()));
2129 const_cast<std::vector<std::vector<Real>
> &>(fe_face.get_div_phi()));
2190 static thread_local std::vector<Real> dummy_qw;
2191 dummy_qw.resize(n_qp, 1.);
2193 for (
unsigned int qp = 0; qp != n_qp; qp++)
2199 for (
unsigned qp = 0; qp < n_qp; ++qp)
2205 for (
unsigned qp = 0; qp < n_qp; ++qp)
2208 for (
unsigned qp = 0; qp < n_qp; ++qp)
2216 FEBase & fe = *it.second;
2217 auto fe_type = it.first;
2218 auto num_shapes = FEInterface::n_shape_functions(fe_type, &
elem);
2221 grad_phi.resize(num_shapes);
2222 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
2223 grad_phi[i].resize(n_qp);
2230 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
2231 for (
unsigned qp = 0; qp < n_qp; ++qp)
2232 grad_phi[i][qp] = regular_grad_phi[i][qp];
2236 FEVectorBase & fe = *it.second;
2237 auto fe_type = it.first;
2238 auto num_shapes = FEInterface::n_shape_functions(fe_type, &
elem);
2241 grad_phi.resize(num_shapes);
2242 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
2243 grad_phi[i].resize(n_qp);
2250 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
2251 for (
unsigned qp = 0; qp < n_qp; ++qp)
2252 grad_phi[i][qp] = regular_grad_phi[i][qp];
2260 unsigned int neighbor_side,
2262 const std::vector<Point> *
const pts,
2263 const std::vector<Real> *
const weights)
2267 unsigned int neighbor_dim =
neighbor->dim();
2283 FEBase & fe_face_neighbor = *it.second;
2284 FEType fe_type = it.first;
2287 fe_face_neighbor.reinit(
neighbor, neighbor_side, tolerance, pts, weights);
2291 fesd.
_phi.shallowCopy(
const_cast<std::vector<std::vector<Real>
> &>(fe_face_neighbor.get_phi()));
2293 const_cast<std::vector<std::vector<RealGradient>
> &>(fe_face_neighbor.get_dphi()));
2296 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_face_neighbor.get_d2phi()));
2300 FEVectorBase & fe_face_neighbor = *it.second;
2301 const FEType & fe_type = it.first;
2307 fe_face_neighbor.reinit(
neighbor, neighbor_side, tolerance, pts, weights);
2309 fesd.
_phi.shallowCopy(
2310 const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe_face_neighbor.get_phi()));
2312 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_face_neighbor.get_dphi()));
2314 fesd.
_second_phi.shallowCopy(
const_cast<std::vector<std::vector<TypeNTensor<3, Real>
>> &>(
2315 fe_face_neighbor.get_d2phi()));
2317 fesd.
_curl_phi.shallowCopy(
const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(
2318 fe_face_neighbor.get_curl_phi()));
2321 const_cast<std::vector<std::vector<Real>
> &>(fe_face_neighbor.get_div_phi()));
2326 "We should be in bounds here");
2328 neighbor, neighbor_side, tolerance, pts, weights);
2338 const std::vector<Point> & pts,
2339 const std::vector<Real> & JxW)
2341 const unsigned int elem_dim =
elem->dim();
2343 "Dual shape functions should only be computed on lower dimensional face elements");
2345 for (
const auto & [fe_type, fe_lower] :
_fe_lower[elem_dim])
2352 fe_lower->set_calculate_default_dual_coeff(
false);
2353 fe_lower->reinit_dual_shape_coeffs(
elem, pts,
JxW);
2359 const std::vector<Point> *
const pts,
2360 const std::vector<Real> *
const weights)
2364 const unsigned int elem_dim =
elem->dim();
2366 "The lower dimensional element should truly be a lower dimensional element");
2384 for (
const auto & it :
_fe_lower[elem_dim])
2386 FEBase & fe_lower = *it.second;
2387 FEType fe_type = it.first;
2389 fe_lower.reinit(
elem);
2393 fesd->_phi.shallowCopy(
const_cast<std::vector<std::vector<Real>
> &>(fe_lower.get_phi()));
2394 fesd->_grad_phi.shallowCopy(
2395 const_cast<std::vector<std::vector<RealGradient>
> &>(fe_lower.get_dphi()));
2397 fesd->_second_phi.shallowCopy(
2398 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_lower.get_d2phi()));
2404 fesd->_phi.shallowCopy(
const_cast<std::vector<std::vector<Real>
> &>(fe_lower.get_dual_phi()));
2405 fesd->_grad_phi.shallowCopy(
2406 const_cast<std::vector<std::vector<RealGradient>
> &>(fe_lower.get_dual_dphi()));
2408 fesd->_second_phi.shallowCopy(
2409 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_lower.get_dual_d2phi()));
2421 if (pts && !weights)
2439 const auto & physical_q_points = helper_fe.get_xyz();
2440 const auto &
JxW = helper_fe.get_JxW();
2454 "You should be calling reinitNeighborLowerDElem on a lower dimensional element");
2475 "You should be calling reinitMortarElem on a lower dimensional element");
2487 unsigned int neighbor_side,
2488 const std::vector<Point> & physical_points)
2490 unsigned int neighbor_dim =
neighbor->dim();
2496 physical_points.size() == 1,
2497 "If reinitializing with more than one point, then I am dubious of your use case. Perhaps "
2498 "you are performing a DG type method and you are reinitializing using points from the "
2499 "element face. In such a case your neighbor JxW must have its index order 'match' the "
2500 "element JxW index order, e.g. imagining a vertical 1D face with two quadrature points, "
2502 "index 0 for elem JxW corresponds to the 'top' quadrature point, then index 0 for "
2504 "JxW must also correspond to the 'top' quadrature point. And libMesh/MOOSE has no way to "
2505 "guarantee that with multiple quadrature points.");
2523 const std::vector<Point> & physical_points)
2525 unsigned int neighbor_dim =
neighbor->dim();
2549 for (
auto & ivar :
vars)
2551 auto i = ivar->number();
2556 for (
unsigned int k = 0; k < ivar->count(); ++k)
2558 unsigned int iv = i + k;
2559 for (
const auto & j :
libMesh::ConstCouplingRow(iv, *
_cm))
2570 auto pair = std::make_pair(ivar, &jvar);
2571 auto c = ivar_start;
2573 bool has_pair =
false;
2586 if (i != jvar.number())
2597 for (
auto & ivar : scalar_vars)
2599 auto i = ivar->number();
2603 for (
const auto & j :
libMesh::ConstCouplingRow(i, *
_cm))
2604 if (
_sys.isScalarVariable(j))
2621 _sub_Re.resize(num_vector_tags);
2622 _sub_Rn.resize(num_vector_tags);
2623 _sub_Rl.resize(num_vector_tags);
2657 for (MooseIndex(num_matrix_tags) tag = 0; tag < num_matrix_tags; tag++)
2674 for (MooseIndex(n_vars) i = 0; i <
n_vars; ++i)
2723 for (
auto & ivar :
vars)
2725 auto i = ivar->number();
2727 for (
unsigned int k = 0; k < ivar->count(); ++k)
2729 unsigned int iv = i + k;
2734 auto pair = std::make_pair(ivar, &jvar);
2735 auto c = ivar_start;
2737 bool has_pair =
false;
2759 unsigned int vi = ivar.
number();
2760 unsigned int vj = jvar.
number();
2764 if (array_block_diagonal_purely_diagonal)
2765 num_cols /= jvar.
count();
2779 for (
const auto & var :
vars)
2781 tag_Re[var->number()].resize(var->dofIndices().size());
2799 unsigned int vi = ivar.
number();
2800 unsigned int vj = jvar.
number();
2804 if (array_block_diagonal_purely_diagonal)
2805 num_cols /= jvar.
count();
2825 unsigned int vi = ivar.
number();
2826 unsigned int vj = jvar.
number();
2830 if (array_block_diagonal_purely_diagonal)
2831 num_cols /= jvar.
count();
2855 unsigned int vi = ivar.
number();
2856 unsigned int vj = jvar.
number();
2860 if (array_block_diagonal_purely_diagonal)
2861 num_cols /= jvar.
count();
2885 unsigned int vi = ivar.
number();
2886 unsigned int vj = jvar.
number();
2889 const auto dofs_divisor = array_block_diagonal_purely_diagonal ? jvar.
count() : 1;
2910 for (
const auto & var :
vars)
2912 tag_Rn[var->number()].resize(var->dofIndicesNeighbor().size());
2923 unsigned int vi = ivar.
number();
2924 unsigned int vj = jvar.
number();
2927 const auto dofs_divisor = array_block_diagonal_purely_diagonal ? jvar.
count() : 1;
2962 for (
const auto & var :
vars)
2964 tag_Rl[var->number()].resize(var->dofIndicesLower().size());
2970 const std::vector<dof_id_type> & dof_indices)
2974 const unsigned int ivn = iv.
number();
2975 const unsigned int jvn = jv.number();
2976 const unsigned int icount = iv.count();
2977 unsigned int jcount = jv.count();
2984 .resize(dof_indices.size() * icount, dof_indices.size() * jcount);
2989 tag_Re[ivn].resize(dof_indices.size() * icount);
2995 const std::vector<dof_id_type> & idof_indices,
2996 const std::vector<dof_id_type> & jdof_indices)
3000 const unsigned int ivn = iv.
number();
3001 const unsigned int jvn = jv.number();
3002 const unsigned int icount = iv.count();
3003 unsigned int jcount = jv.count();
3012 .resize(idof_indices.size() * icount, jdof_indices.size() * jcount);
3022 for (
const auto & ivar :
vars)
3024 auto idofs = ivar->dofIndices().size();
3027 tag_Re[ivar->number()].resize(idofs);
3029 for (
const auto & jvar :
vars)
3031 auto jdofs = jvar->dofIndices().size();
3048 for (
const auto & ivar : scalar_vars)
3050 auto idofs = ivar->dofIndices().size();
3052 for (
const auto & jvar :
vars)
3054 auto jdofs = jvar->dofIndices().size() * jvar->count();
3067template <
typename T>
3071 phi(v).shallowCopy(v.
phi());
3095 if (v.computingCurl())
3096 curlPhi(v).shallowCopy(v.curlPhi());
3097 if (v.computingDiv())
3098 divPhi(v).shallowCopy(v.divPhi());
3101 mooseError(
"Unsupported variable field type!");
3104template <
typename T>
3132 if (v.computingCurl())
3134 if (v.computingDiv())
3138 mooseError(
"Unsupported variable field type!");
3141template <
typename T>
3182 mooseError(
"Unsupported variable field type!");
3185DenseMatrix<Number> &
3226DenseMatrix<Number> &
3288 std::vector<dof_id_type> & dof_indices,
3289 const std::vector<Real> & scaling_factor)
3291 mooseAssert(res_block.size() == dof_indices.size(),
3292 "The size of residual and degree of freedom container must be the same");
3297 const auto ntdof = res_block.size();
3298 const auto count = scaling_factor.size();
3299 const auto ndof = ntdof /
count;
3303 for (MooseIndex(
count) j = 0; j <
count; ++j)
3304 for (MooseIndex(ndof) i = 0; i < ndof; ++i)
3305 res_block(p++) *= scaling_factor[j];
3309 if (scaling_factor[0] != 1.0)
3310 res_block *= scaling_factor[0];
3318 DenseVector<Number> & res_block,
3319 const std::vector<dof_id_type> & dof_indices,
3320 const std::vector<Real> & scaling_factor)
3322 if (dof_indices.size() > 0 && res_block.size())
3333 std::vector<dof_id_type> & cached_residual_rows,
3334 DenseVector<Number> & res_block,
3335 const std::vector<dof_id_type> & dof_indices,
3336 const std::vector<Real> & scaling_factor)
3338 if (dof_indices.size() > 0 && res_block.size())
3346 cached_residual_values.push_back(
_tmp_Re(i));
3356 DenseVector<Number> & res_block,
3357 const std::vector<dof_id_type> & dof_indices,
3358 const std::vector<Real> & scaling_factor)
3360 if (dof_indices.size() > 0)
3362 std::vector<dof_id_type> di(dof_indices);
3373 "Non-residual tag in Assembly::addResidual");
3378 for (
const auto & var :
vars)
3379 addResidualBlock(residual, tag_Re[var->number()], var->dofIndices(), var->arrayScalingFactor());
3385 for (
const auto & vector_tag : vector_tags)
3394 "Non-residual tag in Assembly::addResidualNeighbor");
3399 for (
const auto & var :
vars)
3401 residual, tag_Rn[var->number()], var->dofIndicesNeighbor(), var->arrayScalingFactor());
3407 for (
const auto & vector_tag : vector_tags)
3416 "Non-residual tag in Assembly::addResidualLower");
3421 for (
const auto & var :
vars)
3423 residual, tag_Rl[var->number()], var->dofIndicesLower(), var->arrayScalingFactor());
3429 for (
const auto & vector_tag : vector_tags)
3439 "Non-residual tag in Assembly::addResidualScalar");
3445 for (
const auto & var :
vars)
3446 addResidualBlock(residual, tag_Re[var->number()], var->dofIndices(), var->arrayScalingFactor());
3452 for (
const auto & vector_tag : vector_tags)
3461 for (
const auto & var :
vars)
3462 for (
const auto & vector_tag : tags)
3466 _sub_Re[vector_tag._type_id][var->number()],
3468 var->arrayScalingFactor());
3485 for (
auto & tag : tags)
3491 const std::vector<dof_id_type> & dof_index,
3500 for (MooseIndex(dof_index) i = 0; i < dof_index.size(); ++i)
3511 for (
const auto & var :
vars)
3512 for (
const auto & vector_tag : tags)
3516 _sub_Rn[vector_tag._type_id][var->number()],
3517 var->dofIndicesNeighbor(),
3518 var->arrayScalingFactor());
3525 for (
const auto & var :
vars)
3526 for (
const auto & vector_tag : tags)
3530 _sub_Rl[vector_tag._type_id][var->number()],
3531 var->dofIndicesLower(),
3532 var->arrayScalingFactor());
3538 for (
const auto & vector_tag : tags)
3564 mooseAssert(
values.size() == rows.size(),
3565 "Number of cached residuals and number of rows must match!");
3588 mooseAssert(
values.size() == rows.size(),
3589 "Number of cached residuals and number of rows must match!");
3593 residual.add_vector(
values, rows);
3603 for (
const auto & var :
vars)
3604 setResidualBlock(residual, tag_Re[var->number()], var->dofIndices(), var->arrayScalingFactor());
3614 for (
const auto & var :
vars)
3616 residual, tag_Rn[var->number()], var->dofIndicesNeighbor(), var->arrayScalingFactor());
3622 DenseMatrix<Number> & jac_block,
3625 const std::vector<dof_id_type> & idof_indices,
3626 const std::vector<dof_id_type> & jdof_indices)
3628 if (idof_indices.size() == 0 || jdof_indices.size() == 0)
3630 if (jac_block.n() == 0 || jac_block.m() == 0)
3634 const unsigned int iv = ivar.
number();
3635 const unsigned int jv = jvar.
number();
3637 for (
unsigned int i = 0; i < ivar.
count(); ++i)
3641 if (jt < jv || jt >= jv + jvar.
count())
3643 unsigned int j = jt - jv;
3647 auto indof = di.size();
3648 auto jndof = dj.size();
3650 unsigned int jj = j;
3655 auto sub = jac_block.sub_matrix(i * indof, indof, jj * jndof, jndof);
3656 if (scaling_factors[i] != 1.0)
3657 sub *= scaling_factors[i];
3665 jacobian.add_matrix(sub, di, dj);
3675 const std::vector<dof_id_type> & idof_indices,
3676 const std::vector<dof_id_type> & jdof_indices,
3679 if (idof_indices.size() == 0 || jdof_indices.size() == 0)
3681 if (jac_block.n() == 0 || jac_block.m() == 0)
3687 const unsigned int iv = ivar.
number();
3688 const unsigned int jv = jvar.
number();
3690 for (
unsigned int i = 0; i < ivar.
count(); ++i)
3694 if (jt < jv || jt >= jv + jvar.
count())
3696 unsigned int j = jt - jv;
3700 auto indof = di.size();
3701 auto jndof = dj.size();
3703 unsigned int jj = j;
3708 auto sub = jac_block.sub_matrix(i * indof, indof, jj * jndof, jndof);
3709 if (scaling_factors[i] != 1.0)
3710 sub *= scaling_factors[i];
3718 for (MooseIndex(di) i = 0; i < di.size(); i++)
3719 for (MooseIndex(dj) j = 0; j < dj.size(); j++)
3734 const std::vector<dof_id_type> & idof_indices,
3735 const std::vector<dof_id_type> & jdof_indices,
3738 if (idof_indices.size() == 0 || jdof_indices.size() == 0)
3740 if (jac_block.n() == 0 || jac_block.m() == 0)
3747 for (
unsigned int i = 0; i < ivar.
count(); ++i)
3749 unsigned int iv = ivar.
number();
3752 unsigned int jv = jvar.
number();
3753 if (jt < jv || jt >= jv + jvar.
count())
3755 unsigned int j = jt - jv;
3759 auto indof = di.size();
3760 auto jndof = dj.size();
3762 unsigned int jj = j;
3767 auto sub = jac_block.sub_matrix(i * indof, indof, jj * jndof, jndof);
3768 if (scaling_factor[i] != 1.0)
3769 sub *= scaling_factor[i];
3773 for (MooseIndex(di) i = 0; i < di.size(); i++)
3774 for (MooseIndex(dj) j = 0; j < dj.size(); j++)
3775 if (sub(i, j) != 0.0)
3788 const std::vector<dof_id_type> & idof_indices,
3789 const std::vector<dof_id_type> & jdof_indices,
3790 Real scaling_factor,
3792 const std::set<TagID> & tags)
3794 const auto has_matrix =
3795 std::any_of(tags.begin(), tags.end(), [
this](
const auto tag) { return _sys.hasMatrix(tag); });
3799 if ((idof_indices.size() > 0) && (jdof_indices.size() > 0) && jac_block.n() && jac_block.m() &&
3802 _row_indices.assign(idof_indices.begin(), idof_indices.end());
3812 if (scaling_factor != 1.0)
3825 FEType fe_type(
elem->default_order(), LAGRANGE);
3826 std::unique_ptr<FEBase> fe(FEBase::build(
elem->dim(), fe_type));
3829 const std::vector<Real> &
JxW = fe->get_JxW();
3830 const std::vector<Point> & q_points = fe->get_xyz();
3834 QGauss qrule(
elem->dim(), fe_type.default_quadrature_order());
3835 fe->attach_quadrature_rule(&qrule);
3840 mooseAssert(qrule.n_points() == q_points.size(),
3841 "The number of points in the quadrature rule doesn't match the number of passed-in "
3842 "points in Assembly::setCoordinateTransformation");
3846 for (
unsigned int qp = 0; qp < qrule.n_points(); ++qp)
3850 vol +=
JxW[qp] * coord;
3859 const ADRealEigenVector & v)
const
3861 for (
unsigned int j = 0; j < v.size(); ++j, i += ntest)
3872 "Error: Cached data sizes MUST be the same!");
3875 "Error: Cached data sizes MUST be the same for a given tag!");
3940 auto ivar = it.first;
3941 auto jvar = it.second;
3942 auto i = ivar->number();
3943 auto j = jvar->number();
3953 jvar->allDofIndices());
3962 auto ivar = it.first;
3963 auto jvar = it.second;
3964 auto i = ivar->number();
3965 auto j = jvar->number();
3976 jvar->dofIndicesNeighbor());
3982 ivar->dofIndicesNeighbor(),
3983 jvar->dofIndices());
3989 ivar->dofIndicesNeighbor(),
3990 jvar->dofIndicesNeighbor());
4000 auto ivar = it.first;
4001 auto jvar = it.second;
4002 auto i = ivar->number();
4003 auto j = jvar->number();
4012 ivar->dofIndicesLower(),
4013 jvar->dofIndicesLower());
4019 ivar->dofIndicesLower(),
4020 jvar->dofIndicesNeighbor());
4026 ivar->dofIndicesLower(),
4027 jvar->dofIndices());
4033 ivar->dofIndicesNeighbor(),
4034 jvar->dofIndicesLower());
4041 jvar->dofIndicesLower());
4054 jvar->dofIndicesNeighbor());
4060 ivar->dofIndicesNeighbor(),
4061 jvar->dofIndices());
4067 ivar->dofIndicesNeighbor(),
4068 jvar->dofIndicesNeighbor());
4078 auto ivar = it.first;
4079 auto jvar = it.second;
4080 auto i = ivar->number();
4081 auto j = jvar->number();
4090 ivar->dofIndicesLower(),
4091 jvar->dofIndicesLower());
4097 ivar->dofIndicesLower(),
4098 jvar->dofIndices());
4105 jvar->dofIndicesLower());
4145 auto ivar = it.first;
4146 auto jvar = it.second;
4147 auto i = ivar->number();
4148 auto j = jvar->number();
4157 jvar->allDofIndices(),
4167 auto ivar = it.first;
4168 auto jvar = it.second;
4169 auto i = ivar->number();
4170 auto j = jvar->number();
4181 jvar->dofIndicesNeighbor(),
4186 ivar->dofIndicesNeighbor(),
4193 ivar->dofIndicesNeighbor(),
4194 jvar->dofIndicesNeighbor(),
4205 auto ivar = it.first;
4206 auto jvar = it.second;
4207 auto i = ivar->number();
4208 auto j = jvar->number();
4216 ivar->dofIndicesLower(),
4217 jvar->dofIndicesLower(),
4223 ivar->dofIndicesLower(),
4230 ivar->dofIndicesLower(),
4231 jvar->dofIndicesNeighbor(),
4238 jvar->dofIndicesLower(),
4253 jvar->dofIndicesNeighbor(),
4259 ivar->dofIndicesNeighbor(),
4260 jvar->dofIndicesLower(),
4266 ivar->dofIndicesNeighbor(),
4273 ivar->dofIndicesNeighbor(),
4274 jvar->dofIndicesNeighbor(),
4284 const DofMap & dof_map,
4285 std::vector<dof_id_type> & dof_indices,
4287 const std::set<TagID> & tags)
4289 for (
auto tag : tags)
4297 const DofMap & dof_map,
4298 std::vector<dof_id_type> & dof_indices,
4302 if (dof_indices.size() == 0)
4304 if (!(*
_cm)(ivar, jvar))
4311 const unsigned int ivn = iv.number();
4312 const unsigned int jvn = jv.number();
4321 const unsigned int i = ivar - ivn;
4322 const unsigned int j = jvar - jvn;
4325 auto di = dof_indices;
4326 auto dj = dof_indices;
4328 auto indof = di.size();
4329 auto jndof = dj.size();
4331 unsigned int jj = j;
4335 auto sub = ke.
sub_matrix(i * indof, indof, jj * jndof, jndof);
4340 dof_map.constrain_element_matrix(sub, di, dj,
false);
4342 if (scaling_factor[i] != 1.0)
4343 sub *= scaling_factor[i];
4345 jacobian.add_matrix(sub, di, dj);
4350 const unsigned int ivar,
4351 const unsigned int jvar,
4352 const DofMap & dof_map,
4353 const std::vector<dof_id_type> & idof_indices,
4354 const std::vector<dof_id_type> & jdof_indices,
4358 if (idof_indices.size() == 0 || jdof_indices.size() == 0)
4360 if (jacobian.n() == 0 || jacobian.m() == 0)
4362 if (!(*
_cm)(ivar, jvar))
4369 const unsigned int ivn = iv.number();
4370 const unsigned int jvn = jv.number();
4379 const unsigned int i = ivar - ivn;
4380 const unsigned int j = jvar - jvn;
4383 auto di = idof_indices;
4384 auto dj = jdof_indices;
4386 auto indof = di.size();
4387 auto jndof = dj.size();
4389 unsigned int jj = j;
4393 auto sub = keg.
sub_matrix(i * indof, indof, jj * jndof, jndof);
4398 dof_map.constrain_element_matrix(sub, di, dj,
false);
4400 if (scaling_factor[i] != 1.0)
4401 sub *= scaling_factor[i];
4403 jacobian.add_matrix(sub, di, dj);
4408 const unsigned int ivar,
4409 const unsigned int jvar,
4410 const DofMap & dof_map,
4411 const std::vector<dof_id_type> & idof_indices,
4412 const std::vector<dof_id_type> & jdof_indices,
4414 const std::set<TagID> & tags)
4416 for (
auto tag : tags)
4418 jacobian, ivar, jvar, dof_map, idof_indices, jdof_indices,
GlobalDataKey{}, tag);
4423 const unsigned int ivar,
4424 const unsigned int jvar,
4425 const DofMap & dof_map,
4426 std::vector<dof_id_type> & dof_indices,
4427 std::vector<dof_id_type> & neighbor_dof_indices,
4431 if (dof_indices.size() == 0 && neighbor_dof_indices.size() == 0)
4433 if (!(*
_cm)(ivar, jvar))
4440 const unsigned int ivn = iv.number();
4441 const unsigned int jvn = jv.number();
4452 const unsigned int i = ivar - ivn;
4453 const unsigned int j = jvar - jvn;
4455 auto dc = dof_indices;
4456 auto dn = neighbor_dof_indices;
4457 auto cndof = dc.size();
4458 auto nndof = dn.size();
4460 unsigned int jj = j;
4464 auto suben = ken.
sub_matrix(i * cndof, cndof, jj * nndof, nndof);
4465 auto subne = kne.
sub_matrix(i * nndof, nndof, jj * cndof, cndof);
4466 auto subnn = knn.
sub_matrix(i * nndof, nndof, jj * nndof, nndof);
4473 dof_map.constrain_element_matrix(suben, dc, dn,
false);
4474 dof_map.constrain_element_matrix(subne, dn, dc,
false);
4475 dof_map.constrain_element_matrix(subnn, dn, dn,
false);
4478 if (scaling_factor[i] != 1.0)
4480 suben *= scaling_factor[i];
4481 subne *= scaling_factor[i];
4482 subnn *= scaling_factor[i];
4485 jacobian.add_matrix(suben, dc, dn);
4486 jacobian.add_matrix(subne, dn, dc);
4487 jacobian.add_matrix(subnn, dn, dn);
4492 const unsigned int ivar,
4493 const unsigned int jvar,
4494 const DofMap & dof_map,
4495 std::vector<dof_id_type> & dof_indices,
4496 std::vector<dof_id_type> & neighbor_dof_indices,
4498 const std::set<TagID> & tags)
4500 for (
const auto tag : tags)
4502 jacobian, ivar, jvar, dof_map, dof_indices, neighbor_dof_indices,
GlobalDataKey{}, tag);
4516 if (it.first->number() == ivar)
4522 numeric_index_type i, numeric_index_type j, Real value,
LocalDataKey,
TagID tag)
4531 numeric_index_type j,
4534 const std::set<TagID> & tags)
4536 for (
auto tag : tags)
4585 mooseAssert(
_xfem !=
nullptr,
"This function should not be called if xfem is inactive");
4594 "Size of weight multipliers in xfem doesn't match number of quadrature points");
4595 for (
unsigned i = 0; i < xfem_weight_multipliers.
size(); i++)
4598 xfem_weight_multipliers.
release();
4605 mooseAssert(
_xfem !=
nullptr,
"This function should not be called if xfem is inactive");
4611 if (
_xfem->getXFEMFaceWeights(
4615 "Size of weight multipliers in xfem doesn't match number of quadrature points");
4616 for (
unsigned i = 0; i < xfem_face_weight_multipliers.
size(); i++)
4619 xfem_face_weight_multipliers.
release();
4629 for (MooseIndex(weights.size()) i = 0; i < weights.size(); ++i)
4635Assembly::fePhi<VectorValue<Real>>(FEType type)
const
4637 buildVectorFE(type);
4638 return _vector_fe_shape_data[type]->_phi;
4643Assembly::feGradPhi<VectorValue<Real>>(FEType type)
const
4645 buildVectorFE(type);
4646 return _vector_fe_shape_data[type]->_grad_phi;
4651Assembly::feSecondPhi<VectorValue<Real>>(FEType type)
const
4653 _need_second_derivative.insert(type);
4654 buildVectorFE(type);
4655 return _vector_fe_shape_data[type]->_second_phi;
4660Assembly::fePhiLower<VectorValue<Real>>(FEType type)
const
4662 buildVectorLowerDFE(type);
4663 return _vector_fe_shape_data_lower[type]->_phi;
4668Assembly::feDualPhiLower<VectorValue<Real>>(FEType type)
const
4670 buildVectorDualLowerDFE(type);
4671 return _vector_fe_shape_data_dual_lower[type]->_phi;
4676Assembly::feGradPhiLower<VectorValue<Real>>(FEType type)
const
4678 buildVectorLowerDFE(type);
4679 return _vector_fe_shape_data_lower[type]->_grad_phi;
4684Assembly::feGradDualPhiLower<VectorValue<Real>>(FEType type)
const
4686 buildVectorDualLowerDFE(type);
4687 return _vector_fe_shape_data_dual_lower[type]->_grad_phi;
4692Assembly::fePhiFace<VectorValue<Real>>(FEType type)
const
4694 buildVectorFaceFE(type);
4695 return _vector_fe_shape_data_face[type]->_phi;
4700Assembly::feGradPhiFace<VectorValue<Real>>(FEType type)
const
4702 buildVectorFaceFE(type);
4703 return _vector_fe_shape_data_face[type]->_grad_phi;
4708Assembly::feSecondPhiFace<VectorValue<Real>>(FEType type)
const
4710 _need_second_derivative.insert(type);
4711 buildVectorFaceFE(type);
4716 buildVectorFaceNeighborFE(type);
4718 return _vector_fe_shape_data_face[type]->_second_phi;
4723Assembly::fePhiNeighbor<VectorValue<Real>>(FEType type)
const
4725 buildVectorNeighborFE(type);
4726 return _vector_fe_shape_data_neighbor[type]->_phi;
4731Assembly::feGradPhiNeighbor<VectorValue<Real>>(FEType type)
const
4733 buildVectorNeighborFE(type);
4734 return _vector_fe_shape_data_neighbor[type]->_grad_phi;
4739Assembly::feSecondPhiNeighbor<VectorValue<Real>>(FEType type)
const
4741 _need_second_derivative_neighbor.insert(type);
4742 buildVectorNeighborFE(type);
4743 return _vector_fe_shape_data_neighbor[type]->_second_phi;
4748Assembly::fePhiFaceNeighbor<VectorValue<Real>>(FEType type)
const
4750 buildVectorFaceNeighborFE(type);
4751 return _vector_fe_shape_data_face_neighbor[type]->_phi;
4756Assembly::feGradPhiFaceNeighbor<VectorValue<Real>>(FEType type)
const
4758 buildVectorFaceNeighborFE(type);
4759 return _vector_fe_shape_data_face_neighbor[type]->_grad_phi;
4764Assembly::feSecondPhiFaceNeighbor<VectorValue<Real>>(FEType type)
const
4766 _need_second_derivative_neighbor.insert(type);
4767 buildVectorFaceNeighborFE(type);
4768 return _vector_fe_shape_data_face_neighbor[type]->_second_phi;
4773Assembly::feCurlPhi<VectorValue<Real>>(FEType type)
const
4775 _need_curl.insert(type);
4776 buildVectorFE(type);
4777 return _vector_fe_shape_data[type]->_curl_phi;
4782Assembly::feCurlPhiFace<VectorValue<Real>>(FEType type)
const
4784 _need_curl.insert(type);
4785 buildVectorFaceFE(type);
4790 buildVectorFaceNeighborFE(type);
4792 return _vector_fe_shape_data_face[type]->_curl_phi;
4797Assembly::feCurlPhiNeighbor<VectorValue<Real>>(FEType type)
const
4799 _need_curl.insert(type);
4800 buildVectorNeighborFE(type);
4801 return _vector_fe_shape_data_neighbor[type]->_curl_phi;
4806Assembly::feCurlPhiFaceNeighbor<VectorValue<Real>>(FEType type)
const
4808 _need_curl.insert(type);
4809 buildVectorFaceNeighborFE(type);
4811 return _vector_fe_shape_data_face_neighbor[type]->_curl_phi;
4816Assembly::feDivPhi<VectorValue<Real>>(FEType type)
const
4818 _need_div.insert(type);
4819 buildVectorFE(type);
4820 return _vector_fe_shape_data[type]->_div_phi;
4825Assembly::feDivPhiFace<VectorValue<Real>>(FEType type)
const
4827 _need_face_div.insert(type);
4828 buildVectorFaceFE(type);
4833 buildVectorFaceNeighborFE(type);
4835 return _vector_fe_shape_data_face[type]->_div_phi;
4840Assembly::feDivPhiNeighbor<VectorValue<Real>>(FEType type)
const
4842 _need_neighbor_div.insert(type);
4843 buildVectorNeighborFE(type);
4844 return _vector_fe_shape_data_neighbor[type]->_div_phi;
4849Assembly::feDivPhiFaceNeighbor<VectorValue<Real>>(FEType type)
const
4851 _need_face_neighbor_div.insert(type);
4852 buildVectorFaceNeighborFE(type);
4853 return _vector_fe_shape_data_face_neighbor[type]->_div_phi;
4909 auto process_fe_and_helpers = [&helper_type](
auto & unique_helper_container,
4910 auto & helper_container,
4911 const unsigned int num_dimensionalities,
4912 const bool user_added_helper_type,
4913 auto & fe_container)
4915 unique_helper_container.
resize(num_dimensionalities);
4916 for (
const auto dim : make_range(num_dimensionalities))
4918 auto & unique_helper = unique_helper_container[
dim];
4919 unique_helper = FEGenericBase<Real>::build(
dim, helper_type);
4921 unique_helper->add_p_level_in_reinit(
false);
4922 helper_container[
dim] = unique_helper.get();
4926 if (!user_added_helper_type)
4928 auto & fe_container_dim = libmesh_map_find(fe_container,
dim);
4929 auto fe_it = fe_container_dim.find(helper_type);
4930 mooseAssert(fe_it != fe_container_dim.end(),
"We should have the helper type");
4931 delete fe_it->second;
4932 fe_container_dim.erase(fe_it);
4971 const Point & point,
4981 const Point & point,
4992Assembly::genericQPoints<false>()
const
4999Assembly::genericQPoints<true>()
const
DualNumber< Real, DNDerivativeType, true > ADReal
template void coordTransformFactor< ADPoint, ADReal >(const SubProblem &s, SubdomainID sub_id, const ADPoint &point, ADReal &factor, SubdomainID neighbor_sub_id)
void coordTransformFactor(const SubProblem &s, const SubdomainID sub_id, const P &point, C &factor, const SubdomainID neighbor_sub_id)
Computes a conversion multiplier for use when computing integraals for the current coordinate system ...
template void coordTransformFactor< Point, Real >(const SubProblem &s, SubdomainID sub_id, const Point &point, Real &factor, SubdomainID neighbor_sub_id)
void coordTransformFactor(const SubProblem &s, SubdomainID sub_id, const P &point, C &factor, SubdomainID neighbor_sub_id=libMesh::Elem::invalid_subdomain_id)
Computes a conversion multiplier for use when computing integraals for the current coordinate system ...
subdomain_id_type SubdomainID
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
OutputTools< Real >::VariablePhiValue VariablePhiValue
OutputTools< Real >::VariablePhiCurl VariablePhiCurl
OutputTools< Real >::VariablePhiGradient VariablePhiGradient
typename OutputTools< typename Moose::ADType< T >::type >::VariablePhiGradient ADTemplateVariablePhiGradient
OutputTools< Real >::VariablePhiSecond VariablePhiSecond
OutputTools< Real >::VariablePhiDivergence VariablePhiDivergence
std::array< Real, 2 > values
if(!dmm->_nl) SETERRQ(PETSC_COMM_WORLD
Implements a fake quadrature rule where you can specify the locations (in the reference domain) of th...
void setWeights(const std::vector< libMesh::Real > &weights)
Set the quadrature weights.
void setPoints(const std::vector< libMesh::Point > &points)
Set the quadrature points.
VariablePhiGradient _grad_phi
VariablePhiSecond _second_phi
Key structure for APIs manipulating global vectors/matrices.
Key structure for APIs adding/caching local element residuals/Jacobians.
VectorVariablePhiValue _phi
VectorVariablePhiGradient _grad_phi
VectorVariablePhiSecond _second_phi
VectorVariablePhiCurl _curl_phi
VectorVariablePhiDivergence _div_phi
DenseMatrix< Number > & jacobianBlockNonlocal(unsigned int ivar, unsigned int jvar, LocalDataKey, TagID tag)
Get local Jacobian block from non-local contribution for a pair of variables and a tag.
std::vector< std::vector< std::vector< DenseMatrix< Number > > > > _sub_Kll
dlower/dlower
std::vector< bool > _component_block_diagonal
An flag array Indiced by variable index to show if there is no component-wise coupling for the variab...
void cacheJacobianNonlocal(GlobalDataKey)
Takes the values that are currently in _sub_Keg and appends them to the cached values.
std::map< unsigned int, FEBase * > _holder_fe_lower_helper
helper object for transforming coordinates for lower dimensional element quadrature points
const VariablePhiSecond & secondPhiNeighbor(const MooseVariableField< Real > &) const
std::vector< std::pair< MooseVariableScalar *, MooseVariableFieldBase * > > _cm_sf_entry
Entries in the coupling matrix for scalar variables vs field variables.
void addJacobian(GlobalDataKey)
Adds all local Jacobian to the global Jacobian matrices.
void jacobianBlockLowerUsed(TagID tag, unsigned int ivar, unsigned int jvar, bool used)
Sets whether or not lower Jacobian coupling between ivar and jvar is used to the value used.
void addResidualScalar(GlobalDataKey, const std::vector< VectorTag > &vector_tags)
Add residuals of all scalar variables for a set of tags onto the global residual vectors associated w...
std::map< FEType, std::unique_ptr< VectorFEShapeData > > _vector_fe_shape_data
Shape function values, gradients, second derivatives for each vector FE type.
MooseArray< Point > _current_q_points
The current list of quadrature points.
const std::vector< Real > * _JxW_msm
A JxW for working on mortar segement elements.
std::vector< std::vector< std::vector< DenseMatrix< Number > > > > _sub_Kee
std::set< FEType > _need_face_neighbor_div
void prepareLowerD()
Prepare the Jacobians and residuals for a lower dimensional element.
void modifyWeightsDueToXFEM(const Elem *elem)
Update the integration weights for XFEM partial elements.
void reinitFVFace(const FaceInfo &fi)
std::vector< std::vector< DenseVector< Number > > > _sub_Re
void cacheResidualNeighbor(GlobalDataKey, const std::vector< VectorTag > &tags)
Takes the values that are currently in _sub_Rn of all field variables and appends them to the cached ...
void reinitFE(const Elem *elem)
Just an internal helper function to reinit the volume FE objects.
DenseMatrix< Number > _element_matrix
A working matrix to avoid repeated heap allocations when caching Jacobians that must have libMesh-lev...
const VariablePhiValue & phiFace() const
void createQRules(QuadratureType type, Order order, Order volume_order, Order face_order, SubdomainID block, bool allow_negative_qweights=true)
Creates block-specific volume, face and arbitrary qrules based on the orders and the flag of whether ...
MooseArray< Real > _curvatures
std::vector< std::unique_ptr< FEBase > > _unique_fe_lower_helper
MooseArray< Real > _coord_neighbor
The current coordinate transformation coefficients.
void reinitFEFaceNeighbor(const Elem *neighbor, const std::vector< Point > &reference_points)
void reinitFENeighbor(const Elem *neighbor, const std::vector< Point > &reference_points)
void prepareVariableNonlocal(MooseVariableFieldBase *var)
void prepareBlock(unsigned int ivar, unsigned jvar, const std::vector< dof_id_type > &dof_indices)
std::vector< ADReal > _ad_dzetady_map
libMesh::QBase * _current_qrule_face
quadrature rule used on faces
bool _block_diagonal_matrix
Will be true if our preconditioning matrix is a block-diagonal matrix. Which means that we can take s...
std::vector< std::vector< std::vector< unsigned char > > > _jacobian_block_neighbor_used
Flag that indicates if the jacobian block for neighbor was used.
bool _need_ad_grad_phi_face
Whether any object needs the AD face shape function gradients.
void jacobianBlockUsed(TagID tag, unsigned int ivar, unsigned int jvar, bool used)
Sets whether or not Jacobian coupling between ivar and jvar is used to the value used.
void processLocalResidual(DenseVector< Number > &res_block, std::vector< dof_id_type > &dof_indices, const std::vector< Real > &scaling_factor)
Appling scaling, constraints to the local residual block and populate the full DoF indices for array ...
MooseArray< VectorValue< ADReal > > _ad_q_points
bool _current_side_volume_computed
Boolean to indicate whether current element side volumes has been computed.
bool _need_ad_volume_map
Whether any object needs the AD element JxW, quadrature points or coordinate transformation.
MooseArray< Real > _current_JxW_face
The current transformed jacobian weights on a face.
const FEType _helper_type
The finite element type of the FE helper classes.
Real _current_elem_volume
Volume of the current element.
const VectorVariablePhiDivergence & divPhi(const MooseVariableField< RealVectorValue > &) const
void cacheJacobianCoupledVarPair(const MooseVariableBase &ivar, const MooseVariableBase &jvar)
Caches element matrix for ivar rows and jvar columns.
bool _building_helpers
Whether we are currently building the FE classes for the helpers.
void addJacobianScalar(GlobalDataKey)
Add Jacobians for pairs of scalar variables into the global Jacobian matrices.
void setVolumeQRule(libMesh::QBase *qrule, unsigned int dim)
Set the qrule to be used for volume integration.
const VariablePhiGradient & gradPhi() const
void cacheJacobianBlockNonzero(const DenseMatrix< Number > &jac_block, const MooseVariableBase &ivar, const MooseVariableBase &jvar, const std::vector< dof_id_type > &idof_indices, const std::vector< dof_id_type > &jdof_indices, TagID tag)
Push non-zeros of a local Jacobian block with proper scaling into cache for a certain tag.
MooseArray< Point > _current_physical_points
This will be filled up with the physical points passed into reinitAtPhysical() if it is called....
void addJacobianLowerD(GlobalDataKey)
Add portions of the Jacobian of LowerLower, LowerSecondary, and SecondaryLower for boundary condition...
libMesh::QBase * _current_qrule
The current current quadrature rule being used (could be either volumetric or arbitrary - for dirac k...
const MooseArray< Point > & qPoints() const
Returns the reference to the quadrature points.
MooseArray< VectorValue< ADReal > > _ad_normals
void addJacobianOffDiagScalar(unsigned int ivar, GlobalDataKey)
Add Jacobians for a scalar variables with all other field variables into the global Jacobian matrices...
void modifyArbitraryWeights(const std::vector< Real > &weights)
Modify the weights when using the arbitrary quadrature rule.
void computeCurrentFaceVolume()
const VariablePhiGradient & gradPhiFace() const
bool _need_JxW_neighbor
Flag to indicate that JxW_neighbor is needed.
bool _user_added_fe_of_helper_type
Whether user code requested a FEType the same as our _helper_type.
std::map< FEType, ADTemplateVariablePhiGradient< RealVectorValue > > _ad_vector_grad_phi_data
std::map< unsigned int, std::map< FEType, FEVectorBase * > > _vector_fe
Each dimension's actual vector fe objects indexed on type.
MooseArray< ADReal > _ad_JxW_face
const VariablePhiValue & phi() const
void buildFaceNeighborFE(FEType type) const
Build FEs for a neighbor face with a type.
SubdomainID _current_subdomain_id
The current subdomain ID.
std::map< FEType, std::unique_ptr< VectorFEShapeData > > _vector_fe_shape_data_face
const libMesh::CouplingMatrix & _nonlocal_cm
Real _current_neighbor_volume
Volume of the current neighbor.
bool _need_neighbor_lower_d_elem_volume
Whether we need to compute the neighboring lower dimensional element volume.
Moose::CoordinateSystemType _coord_type
The coordinate system.
void reinitNeighborFaceRef(const Elem *neighbor_elem, unsigned int neighbor_side, Real tolerance, const std::vector< Point > *const pts, const std::vector< Real > *const weights=nullptr)
Reinitialize FE data for the given neighbor_element on the given side with a given set of reference p...
std::map< FEType, FEBase * > _current_fe_neighbor
The "neighbor" fe object that matches the current elem.
std::map< unsigned int, std::map< FEType, FEBase * > > _fe_lower
FE objects for lower dimensional elements.
std::vector< std::vector< DenseVector< Number > > > _sub_Rn
void buildVectorNeighborFE(FEType type) const
Build Vector FEs for a neighbor with a type.
std::vector< Eigen::Map< RealDIMValue > > _mapped_normals
Mapped normals.
const libMesh::DofMap & _dof_map
DOF map.
const VariablePhiSecond & secondPhiFace(const MooseVariableField< Real > &) const
void setFaceQRule(libMesh::QBase *qrule, unsigned int dim)
Set the qrule to be used for face integration.
std::map< unsigned int, std::map< FEType, FEBase * > > _fe_face_neighbor
std::set< FEType > _need_second_derivative_neighbor
std::vector< std::vector< std::vector< DenseMatrix< Number > > > > _sub_Ken
jacobian contributions from the element and neighbor <Tag, ivar, jvar>
std::vector< VectorValue< ADReal > > _ad_dxyzdxi_map
AD quantities.
const MooseArray< ADReal > & adCurvatures() const
bool _prepared_for_p_refinement
Whether helper FEs have been prepared for p-refinement.
std::vector< std::unique_ptr< FEBase > > _unique_fe_face_neighbor_helper
std::vector< Point > _temp_reference_points
Temporary work data for reinitAtPhysical()
std::vector< std::pair< MooseVariableScalar *, MooseVariableScalar * > > _cm_ss_entry
Entries in the coupling matrix for scalar variables.
const Elem * _current_lower_d_elem
The current lower dimensional element.
bool _need_ad_face_map
Whether any object needs the AD face JxW, normals, quadrature points, curvatures or coordinate transf...
unsigned int _current_side
The current side of the selected element (valid only when working with sides)
void buildNeighborFE(FEType type) const
Build FEs for a neighbor with a type.
ArbitraryQuadrature * qruleArbitraryFace(const Elem *elem, unsigned int side)
std::unordered_map< SubdomainID, std::vector< QRules > > _qrules
Holds quadrature rules for each dimension.
void setCoordinateTransformation(const libMesh::QBase *qrule, const Points &q_points, Coords &coord, SubdomainID sub_id)
void reinitAtPhysical(const Elem *elem, const std::vector< Point > &physical_points)
Reinitialize the assembly data at specific physical point in the given element.
std::map< FEType, FEVectorBase * > _current_vector_fe
The "volume" vector fe object that matches the current elem.
std::vector< VectorValue< ADReal > > _ad_dxyzdzeta_map
std::unique_ptr< FEBase > _fe_msm
A FE object for working on mortar segement elements.
std::vector< ADReal > _ad_detadx_map
void addJacobianNonlocal(GlobalDataKey)
Adds non-local Jacobian to the global Jacobian matrices.
const VariablePhiGradient & gradPhiNeighbor(const MooseVariableField< Real > &) const
void addResidualNeighbor(GlobalDataKey, const std::vector< VectorTag > &vector_tags)
Add local neighbor residuals of all field variables for a set of tags onto the global residual vector...
const Elem *const & elem() const
Return the current element.
std::map< FEType, FEVectorBase * > _current_vector_fe_face_neighbor
The "neighbor face" vector fe object that matches the current elem.
void reinitNeighborAtPhysical(const Elem *neighbor, unsigned int neighbor_side, const std::vector< Point > &physical_points)
Reinitializes the neighbor at the physical coordinates on neighbor side given.
const Node * _current_neighbor_node
The current neighboring node we are working with.
std::vector< ADReal > _ad_dxidx_map
void buildFE(FEType type) const
Build FEs with a type.
const Elem * _current_neighbor_side_elem
The current side element of the ncurrent neighbor element.
std::vector< ADReal > _ad_dxidz_map
void cacheResidualLower(GlobalDataKey, const std::vector< VectorTag > &tags)
Takes the values that are currently in _sub_Rl and appends them to the cached values.
std::map< unsigned int, std::map< FEType, FEVectorBase * > > _vector_fe_neighbor
std::vector< std::vector< std::vector< DenseMatrix< Number > > > > _sub_Kle
dlower/dsecondary (or dlower/delement)
MooseArray< ADReal > _ad_JxW
void cacheResidualNodes(const DenseVector< Number > &res, const std::vector< dof_id_type > &dof_index, LocalDataKey, TagID tag)
Lets an external class cache residual at a set of nodes.
void copyFaceShapes(MooseVariableField< T > &v)
void addResidual(GlobalDataKey, const std::vector< VectorTag > &vector_tags)
Add local residuals of all field variables for a set of tags onto the global residual vectors associa...
DenseVector< Number > _tmp_Re
auxiliary vector for scaling residuals (optimization to avoid expensive construction/destruction)
void setResidualBlock(NumericVector< Number > &residual, DenseVector< Number > &res_block, const std::vector< dof_id_type > &dof_indices, const std::vector< Real > &scaling_factor)
Set a local residual block to a global residual vector with proper scaling.
bool _calculate_ad_coord
Whether to calculate coord with AD.
const libMesh::CouplingMatrix * _cm
Coupling matrices.
VectorVariablePhiCurl _vector_curl_phi_face
MooseArray< Point > _current_q_points_face
The current quadrature points on a face.
std::map< FEType, std::unique_ptr< VectorFEShapeData > > _vector_fe_shape_data_neighbor
void cacheJacobianNeighbor(GlobalDataKey)
Takes the values that are currently in the neighbor Dense Matrices and appends them to the cached val...
DenseMatrix< Number > & jacobianBlockMortar(Moose::ConstraintJacobianType type, unsigned int ivar, unsigned int jvar, LocalDataKey, TagID tag)
Returns the jacobian block for the given mortar Jacobian type.
void reinitLowerDElem(const Elem *elem, const std::vector< Point > *const pts=nullptr, const std::vector< Real > *const weights=nullptr)
Reinitialize FE data for a lower dimenesional element with a given set of reference points.
void setNeighborQRule(libMesh::QBase *qrule, unsigned int dim)
Set the qrule to be used for neighbor integration.
void helpersRequestData()
request phi, dphi, xyz, JxW, etc.
std::vector< std::vector< std::vector< DenseMatrix< Number > > > > _sub_Knn
jacobian contributions from the neighbor <Tag, ivar, jvar>
const MooseArray< ADPoint > & adQPoints() const
void clearCachedQRules()
Set the cached quadrature rules to nullptr.
std::vector< std::vector< std::vector< DenseMatrix< Number > > > > _sub_Kln
dlower/dprimary (or dlower/dneighbor)
libMesh::QBase * _current_qrule_neighbor
quadrature rule used on neighbors
void setLowerQRule(libMesh::QBase *qrule, unsigned int dim)
Set the qrule to be used for lower dimensional integration.
void buildLowerDFE(FEType type) const
Build FEs for a lower dimensional element with a type.
std::vector< std::vector< std::vector< unsigned char > > > _jacobian_block_lower_used
Flag that indicates if the jacobian block for the lower dimensional element was used.
Real elementVolume(const Elem *elem) const
On-demand computation of volume element accounting for RZ/RSpherical.
std::map< unsigned int, std::map< FEType, FEBase * > > _fe_neighbor
types of finite elements
void computeGradPhiAD(const Elem *elem, unsigned int n_qp, ADTemplateVariablePhiGradient< OutputType > &grad_phi, libMesh::FEGenericBase< OutputType > *fe)
compute gradient of phi possibly with derivative information with respect to nonlinear displacement v...
const VariablePhiGradient & gradPhiFaceNeighbor(const MooseVariableField< Real > &) const
const unsigned int & side() const
Returns the current side.
std::vector< VectorValue< ADReal > > _ad_d2xyzdeta2_map
MooseArray< std::vector< Point > > _current_tangents
The current tangent vectors at the quadrature points.
std::vector< std::unique_ptr< FEBase > > _unique_fe_face_helper
std::map< FEType, FEBase * > _current_fe
The "volume" fe object that matches the current elem.
const VectorVariablePhiCurl & curlPhi(const MooseVariableField< RealVectorValue > &) const
void prepareBlockNonlocal(unsigned int ivar, unsigned jvar, const std::vector< dof_id_type > &idof_indices, const std::vector< dof_id_type > &jdof_indices)
std::map< FEType, std::unique_ptr< FEShapeData > > _fe_shape_data_lower
void cacheJacobianBlock(const DenseMatrix< Number > &jac_block, const std::vector< dof_id_type > &idof_indices, const std::vector< dof_id_type > &jdof_indices, Real scaling_factor, LocalDataKey, const std::set< TagID > &tags)
Cache a local Jacobian block with the provided rows (idof_indices) and columns (jdof_indices) for eve...
std::vector< VectorValue< ADReal > > _ad_d2xyzdxideta_map
std::vector< std::pair< unsigned int, unsigned short > > _disp_numbers_and_directions
Container of displacement numbers and directions.
std::map< unsigned int, std::map< FEType, FEVectorBase * > > _vector_fe_face
types of vector finite elements
void buildVectorLowerDFE(FEType type) const
Build Vector FEs for a lower dimensional element with a type.
void addJacobianNeighborTags(libMesh::SparseMatrix< Number > &jacobian, unsigned int ivar, unsigned int jvar, const libMesh::DofMap &dof_map, std::vector< dof_id_type > &dof_indices, std::vector< dof_id_type > &neighbor_dof_indices, GlobalDataKey, const std::set< TagID > &tags)
Adds three neighboring element matrices for ivar rows and jvar columns to the global Jacobian matrix.
std::map< unsigned int, std::map< FEType, FEBase * > > _fe
Each dimension's actual fe objects indexed on type.
std::set< FEType > _need_curl
const VariablePhiSecond & secondPhiFaceNeighbor(const MooseVariableField< Real > &) const
std::vector< std::unique_ptr< FEBase > > _unique_fe_helper
Containers for holding unique FE helper types if we are doing p-refinement.
unsigned int numExtraElemIntegers() const
Number of extra element integers Assembly tracked.
std::vector< std::pair< MooseVariableFieldBase *, MooseVariableFieldBase * > > _cm_ff_entry
Entries in the coupling matrix for field variables.
std::vector< std::pair< MooseVariableFieldBase *, MooseVariableFieldBase * > > _cm_nonlocal_entry
Entries in the coupling matrix for field variables for nonlocal calculations.
bool _current_elem_volume_computed
Boolean to indicate whether current element volumes has been computed.
void buildLowerDDualFE(FEType type) const
void addCachedResidualDirectly(NumericVector< Number > &residual, GlobalDataKey, const VectorTag &vector_tag)
Adds the values that have been cached by calling cacheResidual(), cacheResidualNeighbor(),...
std::map< unsigned int, std::map< FEType, FEBase * > > _fe_face
types of finite elements
std::vector< ADReal > _ad_jac
void addJacobianNeighbor(GlobalDataKey)
Add ElementNeighbor, NeighborElement, and NeighborNeighbor portions of the Jacobian for compute objec...
void setMortarQRule(Order order)
Specifies a custom qrule for integration on mortar segment mesh.
void saveLocalADArray(std::vector< ADReal > &re, unsigned int i, unsigned int ntest, const ADRealEigenVector &v) const
const std::vector< VectorTag > & _residual_vector_tags
The residual vector tags that Assembly could possibly contribute to.
const Elem * _current_neighbor_elem
The current neighbor "element".
VectorVariablePhiDivergence _vector_div_phi_face
bool _user_added_fe_face_neighbor_of_helper_type
std::vector< ADReal > _ad_dzetadx_map
std::vector< dof_id_type > _column_indices
const VariablePhiValue & phiNeighbor(const MooseVariableField< Real > &) const
DenseMatrix< Number > & jacobianBlockNeighbor(Moose::DGJacobianType type, unsigned int ivar, unsigned int jvar, LocalDataKey, TagID tag)
Get local Jacobian block of a DG Jacobian type for a pair of variables and a tag.
std::vector< ADReal > _ad_detadz_map
DenseMatrix< Number > & jacobianBlock(unsigned int ivar, unsigned int jvar, LocalDataKey, TagID tag)
Get local Jacobian block for a pair of variables and a tag.
std::vector< dof_id_type > _temp_dof_indices
Temporary work vector to keep from reallocating it.
std::vector< std::vector< std::vector< unsigned char > > > _jacobian_block_used
Flag that indicates if the jacobian block was used.
void buildVectorFaceNeighborFE(FEType type) const
Build Vector FEs for a neighbor face with a type.
void prepareJacobianBlock()
Sizes and zeroes the Jacobian blocks used for the current element.
void jacobianBlockNonlocalUsed(TagID tag, unsigned int ivar, unsigned int jvar, bool used)
Sets whether or not nonlocal Jacobian coupling between ivar and jvar is used to the value used.
void resizeADMappingObjects(unsigned int n_qp, unsigned int dim)
resize any objects that contribute to automatic differentiation-related mapping calculations
void cacheResidualBlock(std::vector< Real > &cached_residual_values, std::vector< dof_id_type > &cached_residual_rows, DenseVector< Number > &res_block, const std::vector< dof_id_type > &dof_indices, const std::vector< Real > &scaling_factor)
Push a local residual block with proper scaling into cache.
std::vector< VectorValue< ADReal > > _ad_dxyzdeta_map
const Node * _current_node
The current node we are working with.
std::map< FEType, ADTemplateVariablePhiGradient< RealVectorValue > > _ad_vector_grad_phi_data_face
void cacheJacobianMortar(GlobalDataKey)
Cache all portions of the Jacobian, e.g.
void bumpVolumeQRuleOrder(Order volume_order, SubdomainID block)
Increases the element/volume quadrature order for the specified mesh block if and only if the current...
THREAD_ID _tid
Thread number (id)
std::vector< std::vector< std::vector< DenseMatrix< Number > > > > _sub_Kel
dsecondary/dlower (or delement/dlower)
std::map< FEType, std::unique_ptr< VectorFEShapeData > > _vector_fe_shape_data_dual_lower
MooseArray< Point > _current_normals
The current Normal vectors at the quadrature points.
void cacheJacobian(GlobalDataKey)
Takes the values that are currently in _sub_Kee and appends them to the cached values.
bool _calculate_curvatures
std::vector< std::vector< Real > > _cached_residual_values
Values cached by calling cacheResidual() (the first vector is for TIME vs NONTIME)
const Node *const & node() const
Returns the reference to the node.
std::vector< std::vector< dof_id_type > > _cached_jacobian_cols
Column where the corresponding cached value should go.
ArbitraryQuadrature * _current_qrule_arbitrary
The current arbitrary quadrature rule used within the element interior.
void computeADFace(const Elem &elem, const unsigned int side)
compute AD things on an element face
libMesh::ElemSideBuilder _current_side_elem_builder
In place side element builder for _current_side_elem.
void computeFaceMap(const Elem &elem, const unsigned int side, const std::vector< Real > &qw)
std::map< unsigned int, std::map< FEType, FEVectorBase * > > _vector_fe_lower
Vector FE objects for lower dimensional elements.
void setCachedJacobian(GlobalDataKey)
Sets previously-cached Jacobian values via SparseMatrix::set() calls.
void bumpAllQRuleOrder(Order order, SubdomainID block)
Increases the element/volume and face/area quadrature orders for the specified mesh block if and only...
libMesh::QBase * qruleFace(const Elem *elem, unsigned int side)
This is an abstraction over the internal qrules function.
void preparePRefinement()
Prepare helper FEs for p-refinement.
std::vector< std::vector< DenseVector< Number > > > _sub_Rl
residual contributions for each variable from the lower dimensional element
std::map< FEType, FEBase * > _current_fe_face
The "face" fe object that matches the current elem.
void addCachedJacobian(GlobalDataKey)
Adds the values that have been cached by calling cacheJacobian() and or cacheJacobianNeighbor() to th...
void reinit(const Elem *elem)
Reinitialize objects (JxW, q_points, ...) for an elements.
std::vector< dof_id_type > _neighbor_extra_elem_ids
Extra element IDs of neighbor.
libMesh::ElemSideBuilder _compute_face_map_side_elem_builder
In place side element builder for computeFaceMap()
void cacheResidual(GlobalDataKey, const std::vector< VectorTag > &tags)
Takes the values that are currently in _sub_Re of all field variables and appends them to the cached ...
void modifyFaceWeightsDueToXFEM(const Elem *elem, unsigned int side=0)
Update the face integration weights for XFEM partial elements.
unsigned int _max_cached_residuals
void buildFaceFE(FEType type) const
Build FEs for a face with a type.
std::shared_ptr< XFEMInterface > _xfem
The XFEM controller.
std::map< unsigned int, FEBase * > _holder_fe_face_neighbor_helper
std::set< FEType > _need_neighbor_div
SubdomainID _current_neighbor_subdomain_id
The current neighbor subdomain ID.
std::map< FEType, FEVectorBase * > _current_vector_fe_face
The "face" vector fe object that matches the current elem.
bool _custom_mortar_qrule
Flag specifying whether a custom quadrature rule has been specified for mortar segment mesh.
libMesh::ElemSideBuilder _current_neighbor_side_elem_builder
In place side element builder for _current_neighbor_side_elem.
std::vector< std::vector< dof_id_type > > _cached_jacobian_rows
Row where the corresponding cached value should go.
std::map< FEType, ADTemplateVariablePhiGradient< Real > > _ad_grad_phi_data_face
MooseArray< ADReal > _ad_coord
The AD version of the current coordinate transformation coefficients.
std::vector< std::unique_ptr< FEBase > > _unique_fe_neighbor_helper
std::map< FEType, FEBase * > _current_fe_face_neighbor
The "neighbor face" fe object that matches the current elem.
void computeSinglePointMapAD(const Elem *elem, const std::vector< Real > &qw, unsigned p, FEBase *fe)
compute the finite element reference-physical mapping quantities (such as JxW) with possible dependen...
std::map< FEType, std::unique_ptr< FEShapeData > > _fe_shape_data_neighbor
void jacobianBlockNeighborUsed(TagID tag, unsigned int ivar, unsigned int jvar, bool used)
Sets whether or not neighbor Jacobian coupling between ivar and jvar is used to the value used.
bool _need_lower_d_elem_volume
Whether we need to compute the lower dimensional element volume.
std::map< FEType, std::unique_ptr< VectorFEShapeData > > _vector_fe_shape_data_face_neighbor
QRules & qrules(unsigned int dim)
void reinitDual(const Elem *elem, const std::vector< Point > &pts, const std::vector< Real > &JxW)
Reintialize dual basis coefficients based on a customized quadrature rule.
bool _need_neighbor_elem_volume
true is apps need to compute neighbor element volume
std::vector< std::vector< std::vector< DenseMatrix< Number > > > > _sub_Keg
std::set< FEType > _need_face_div
void reinitElemAndNeighbor(const Elem *elem, unsigned int side, const Elem *neighbor, unsigned int neighbor_side, const std::vector< Point > *neighbor_reference_points=nullptr)
Reinitialize an element and its neighbor along a particular side.
void addJacobianCoupledVarPair(const MooseVariableBase &ivar, const MooseVariableBase &jvar)
Adds element matrices for ivar rows and jvar columns to the global Jacobian matrices.
void reinitElemFaceRef(const Elem *elem, unsigned int elem_side, Real tolerance, const std::vector< Point > *const pts=nullptr, const std::vector< Real > *const weights=nullptr)
Reinitialize FE data for the given element on the given side, optionally with a given set of referenc...
void init(const libMesh::CouplingMatrix *cm)
Initialize the Assembly object and set the CouplingMatrix for use throughout.
void addJacobianBlockNonlocal(libMesh::SparseMatrix< Number > &jacobian, unsigned int ivar, unsigned int jvar, const libMesh::DofMap &dof_map, const std::vector< dof_id_type > &idof_indices, const std::vector< dof_id_type > &jdof_indices, GlobalDataKey, TagID tag)
Adds non-local element matrix for ivar rows and jvar columns to the global Jacobian matrix.
std::vector< std::pair< MooseVariableFieldBase *, MooseVariableScalar * > > _cm_fs_entry
Entries in the coupling matrix for field variables vs scalar variables.
Real _current_side_volume
Volume of the current side element.
void copyShapes(MooseVariableField< T > &v)
void addResidualBlock(NumericVector< Number > &residual, DenseVector< Number > &res_block, const std::vector< dof_id_type > &dof_indices, const std::vector< Real > &scaling_factor)
Add a local residual block to a global residual vector with proper scaling.
Real _current_neighbor_lower_d_elem_volume
The current neighboring lower dimensional element volume.
MooseArray< Real > _coord
The current coordinate transformation coefficients.
std::map< FEType, std::unique_ptr< VectorFEShapeData > > _vector_fe_shape_data_lower
void buildVectorFE(FEType type) const
Build Vector FEs with a type.
ArbitraryQuadrature * _current_qrule_arbitrary_face
The current arbitrary quadrature rule used on the element face.
const MooseArray< Real > & JxW() const
Returns the reference to the transformed jacobian weights.
std::vector< std::vector< std::vector< unsigned char > > > _jacobian_block_nonlocal_used
void prepareResidual()
Sizes and zeroes the residual for the current element.
void buildVectorFaceFE(FEType type) const
Build Vector FEs for a face with a type.
const MooseArray< Real > & JxWNeighbor() const
Returns the reference to the transformed jacobian weights on a current face.
bool _user_added_fe_neighbor_of_helper_type
void reinitFEFace(const Elem *elem, unsigned int side)
Just an internal helper function to reinit the face FE objects.
std::map< unsigned int, FEBase * > _holder_fe_neighbor_helper
Each dimension's helper objects.
void addJacobianBlockTags(libMesh::SparseMatrix< Number > &jacobian, unsigned int ivar, unsigned int jvar, const libMesh::DofMap &dof_map, std::vector< dof_id_type > &dof_indices, GlobalDataKey, const std::set< TagID > &tags)
Add element matrix for ivar rows and jvar columns to the global Jacobian matrix for given tags.
void reinitNeighborLowerDElem(const Elem *elem)
reinitialize a neighboring lower dimensional element
void initNonlocalCoupling()
Create pair of variables requiring nonlocal jacobian contributions.
MooseArray< ADReal > _ad_curvatures
bool _need_ad_grad_phi
Whether any object needs the AD element shape function gradients.
libMesh::QBase * _qrule_msm
A qrule object for working on mortar segement elements.
unsigned int _max_cached_jacobians
const Elem * _current_side_elem
The current "element" making up the side we are currently on.
std::set< FEType > _need_div
std::vector< std::vector< dof_id_type > > _cached_residual_rows
Where the cached values should go (the first vector is for TIME vs NONTIME)
std::map< FEType, ADTemplateVariablePhiGradient< Real > > _ad_grad_phi_data
std::map< unsigned int, FEBase * > _holder_fe_helper
Each dimension's helper objects.
MooseArray< Point > _current_q_points_face_neighbor
The current quadrature points on the neighbor face.
std::vector< ADReal > _ad_dzetadz_map
std::vector< ADReal > _ad_detady_map
std::vector< std::vector< std::vector< DenseMatrix< Number > > > > _sub_Kne
jacobian contributions from the neighbor and element <Tag, ivar, jvar>
MooseArray< Real > _current_JxW
The current list of transformed jacobian weights.
void zeroCachedJacobian(GlobalDataKey)
Zero out previously-cached Jacobian rows.
void buildVectorDualLowerDFE(FEType type) const
const Elem * _current_neighbor_lower_d_elem
The current neighboring lower dimensional element.
libMesh::QBase * _current_qrule_lower
quadrature rule used on lower dimensional elements.
const VariablePhiValue & phiFaceNeighbor(const MooseVariableField< Real > &) const
void clearCachedResiduals(GlobalDataKey)
Clears all of the residuals in _cached_residual_rows and _cached_residual_values.
void addJacobianBlockNonlocalTags(libMesh::SparseMatrix< Number > &jacobian, unsigned int ivar, unsigned int jvar, const libMesh::DofMap &dof_map, const std::vector< dof_id_type > &idof_indices, const std::vector< dof_id_type > &jdof_indices, GlobalDataKey, const std::set< TagID > &tags)
Adds non-local element matrix for ivar rows and jvar columns to the global Jacobian matrix.
void computeCurrentElemVolume()
unsigned int _current_neighbor_side
The current side of the selected neighboring element (valid only when working with sides)
std::vector< std::vector< std::vector< DenseMatrix< Number > > > > _sub_Knl
dprimary/dlower (or dneighbor/dlower)
void addResidualLower(GlobalDataKey, const std::vector< VectorTag > &vector_tags)
Add local neighbor residuals of all field variables for a set of tags onto the global residual vector...
MooseArray< VectorValue< ADReal > > _ad_q_points_face
void reinitMortarElem(const Elem *elem)
reinitialize a mortar segment mesh element in order to get a proper JxW
std::vector< VectorValue< ADReal > > _ad_d2xyzdxi2_map
const Elem * _current_elem
The current "element" we are currently on.
std::map< unsigned int, FEBase * > _holder_fe_face_helper
Each dimension's helper objects.
std::map< unsigned int, std::map< FEType, FEVectorBase * > > _vector_fe_face_neighbor
void reinitNeighbor(const Elem *neighbor, const std::vector< Point > &reference_points)
Reinitializes the neighbor side using reference coordinates.
libMesh::QBase * _current_qrule_volume
The current volumetric quadrature for the element.
void addJacobianNeighborLowerD(GlobalDataKey)
Add all portions of the Jacobian except PrimaryPrimary, e.g.
std::map< FEType, FEVectorBase * > _current_vector_fe_neighbor
The "neighbor" vector fe object that matches the current elem.
MooseArray< Real > _coord_msm
The coordinate transformation coefficients evaluated on the quadrature points of the mortar segment m...
Real _current_lower_d_elem_volume
The current lower dimensional element volume.
void setResidualNeighbor(NumericVector< Number > &residual, GlobalDataKey, const VectorTag &vector_tag)
Sets local neighbor residuals of all field variables to the global residual vector for a tag.
std::vector< std::vector< Real > > _cached_jacobian_values
Values cached by calling cacheJacobian()
bool _user_added_fe_face_of_helper_type
void clearCachedJacobian()
Clear any currently cached jacobians.
void addJacobianBlock(libMesh::SparseMatrix< Number > &jacobian, unsigned int ivar, unsigned int jvar, const libMesh::DofMap &dof_map, std::vector< dof_id_type > &dof_indices, GlobalDataKey, TagID tag)
Adds element matrix for ivar rows and jvar columns to the global Jacobian matrix.
std::map< FEType, std::unique_ptr< FEShapeData > > _fe_shape_data_dual_lower
std::map< FEType, std::unique_ptr< FEShapeData > > _fe_shape_data
Shape function values, gradients, second derivatives for each FE type.
std::vector< Point > _current_neighbor_ref_points
The current reference points on the neighbor element.
void copyNeighborShapes(MooseVariableField< T > &v)
std::set< FEType > _need_second_derivative
std::vector< dof_id_type > _row_indices
Working vectors to avoid repeated heap allocations when caching residuals/Jacobians that must have li...
std::vector< dof_id_type > _extra_elem_ids
Extra element IDs.
void addCachedResiduals(GlobalDataKey, const std::vector< VectorTag > &tags)
Pushes all cached residuals to the global residual vectors associated with each tag.
Assembly(SystemBase &sys, THREAD_ID tid)
std::map< FEType, std::unique_ptr< FEShapeData > > _fe_shape_data_face_neighbor
bool _user_added_fe_lower_of_helper_type
MooseArray< Real > _current_JxW_neighbor
The current transformed jacobian weights on a neighbor's face.
std::vector< ADReal > _ad_dxidy_map
unsigned int _mesh_dimension
void setResidual(NumericVector< Number > &residual, GlobalDataKey, const VectorTag &vector_tag)
Sets local residuals of all field variables to the global residual vector for a tag.
std::map< FEType, std::unique_ptr< FEShapeData > > _fe_shape_data_face
const VariablePhiSecond & secondPhi() const
const Elem *const & neighbor() const
Return the neighbor element.
void prepareOffDiagScalar()
void prepareVariable(MooseVariableFieldBase *var)
Used for preparing the dense residual and jacobian blocks for one particular variable.
This data structure is used to store geometric and variable related metadata about each cell face in ...
unsigned int neighborSideID() const
const Elem & elem() const
const Elem * neighborPtr() const
unsigned int elemSideID() const
void resize(unsigned int size)
Change the number of elements the array can store.
std::vector< T > stdVector() const
Extremely inefficient way to produce a std::vector from a MooseArray!
unsigned int size() const
The number of elements that can currently be stored in the array.
void shallowCopy(const MooseArray &rhs)
Doesn't actually make a copy of the data.
void release()
Manually deallocates the data pointer.
MooseMesh wraps a libMesh::Mesh object and enhances its capabilities by caching additional data and s...
MeshBase & getMesh()
Accessor for the underlying libMesh Mesh object.
bool hasSecondOrderElements()
check if the mesh has SECOND order elements
std::vector< dof_id_type > componentDofIndices(const std::vector< dof_id_type > &dof_indices, unsigned int component) const
Obtain DoF indices of a component with the indices of the 0th component.
virtual const std::vector< dof_id_type > & dofIndices() const
Get local DoF indices.
const std::vector< Real > & arrayScalingFactor() const
const std::vector< dof_id_type > & allDofIndices() const
Get all global dofindices for the variable.
unsigned int number() const
Get variable number coming from libMesh.
unsigned int count() const
Get the number of components Note: For standard and vector variables, the number is one.
This class provides an interface for common operations on field variables of both FE and FV types wit...
virtual const std::vector< dof_id_type > & dofIndicesLower() const =0
Get dof indices for the current lower dimensional element (this is meaningful when performing mortar ...
virtual const std::vector< dof_id_type > & dofIndicesNeighbor() const =0
Get neighbor DOF indices for currently selected element.
Class for stuff related to variables.
virtual const FieldVariablePhiGradient & gradPhiFaceNeighbor() const =0
Return the gradients of the variable's shape functions on a neighboring element face.
virtual const FieldVariablePhiGradient & gradPhiNeighbor() const =0
Return the gradients of the variable's shape functions on a neighboring element.
virtual const FieldVariablePhiValue & phiFaceNeighbor() const =0
Return the variable's shape functions on a neighboring element face.
virtual const FieldVariablePhiGradient & gradPhiFace() const =0
Return the gradients of the variable's shape functions on an element face.
virtual const FieldVariablePhiSecond & secondPhi() const =0
Return the rank-2 tensor of second derivatives of the variable's elemental shape functions.
bool usesPhiNeighbor() const
Whether or not this variable is actually using the shape function value.
virtual const FieldVariablePhiValue & phi() const =0
Return the variable's elemental shape functions.
virtual const FieldVariablePhiSecond & secondPhiFace() const =0
Return the rank-2 tensor of second derivatives of the variable's shape functions on an element face.
virtual const FieldVariablePhiSecond & secondPhiFaceNeighbor() const =0
Return the rank-2 tensor of second derivatives of the variable's shape functions on a neighboring ele...
virtual bool computingSecond() const =0
Whether or not this variable is computing any second derivatives.
virtual const FieldVariablePhiValue & phiFace() const =0
Return the variable's shape functions on an element face.
virtual const FieldVariablePhiSecond & secondPhiNeighbor() const =0
Return the rank-2 tensor of second derivatives of the variable's shape functions on a neighboring ele...
virtual bool usesSecondPhiNeighbor() const =0
Whether or not this variable is actually using the shape function second derivatives.
virtual const FieldVariablePhiGradient & gradPhi() const =0
Return the gradients of the variable's elemental shape functions.
virtual const FieldVariablePhiValue & phiNeighbor() const =0
Return the variable's shape functions on a neighboring element.
bool usesGradPhiNeighbor() const
Whether or not this variable is actually using the shape function gradient.
Generic class for solving transient nonlinear problems.
virtual MooseMesh & mesh()=0
virtual unsigned int currentNlSysNum() const =0
virtual const VectorTag & getVectorTag(const TagID tag_id) const
Get a VectorTag from a TagID.
virtual unsigned int numMatrixTags() const
The total number of tags.
virtual void haveADObjects(bool have_ad_objects)
Method for setting whether we have any ad objects.
virtual bool checkNonlocalCouplingRequirement() const =0
Moose::CoordinateSystemType getCoordSystem(SubdomainID sid) const
Base class for a system (of equations)
virtual libMesh::SparseMatrix< Number > & getMatrix(TagID tag)
Get a raw SparseMatrix.
bool hasVector(const std::string &tag_name) const
Check if the named vector exists in the system.
virtual unsigned int nVariables() const
Get the number of variables in this system.
MooseVariableFieldBase & getVariable(THREAD_ID tid, const std::string &var_name) const
Gets a reference to a variable of with specified name.
unsigned int number() const
Gets the number of this system.
virtual bool isScalarVariable(unsigned int var_name) const
virtual NumericVector< Number > & getVector(const std::string &name)
Get a raw NumericVector by name.
const std::vector< MooseVariableFieldBase * > & getVariables(THREAD_ID tid)
MooseVariableField< T > & getActualFieldVariable(THREAD_ID tid, const std::string &var_name)
Returns a field variable pointer - this includes finite volume variables.
bool computingScalingJacobian() const
Whether we are computing an initial Jacobian for automatic variable scaling.
virtual MooseVariableScalar & getScalarVariable(THREAD_ID tid, const std::string &var_name) const
Gets a reference to a scalar variable with specified number.
virtual bool hasMatrix(TagID tag) const
Check if the tagged matrix exists in the system.
const std::vector< MooseVariableScalar * > & getScalarVariables(THREAD_ID tid)
Storage for all of the information pretaining to a vector tag.
TagID _id
The id associated with the vector tag.
Moose::VectorTagType _type
The type of the vector tag.
TagTypeID _type_id
The index for this tag into a vector that contains tags of only its type ordered by ID.
DenseMatrix sub_matrix(unsigned int row_id, unsigned int row_size, unsigned int col_id, unsigned int col_size) const
void resize(const unsigned int new_m, const unsigned int new_n)
virtual unsigned int size() const override final
void constrain_element_matrix(DenseMatrix< Number > &matrix, std::vector< dof_id_type > &elem_dofs, bool asymmetric_constraint_rows=true) const
void constrain_element_vector(DenseVector< Number > &rhs, std::vector< dof_id_type > &dofs, bool asymmetric_constraint_rows=true) const
unsigned int n_dofs(const ElemType t, const Order o)
const std::vector< Point > & get_points() const
unsigned int n_points() const
virtual QuadratureType type() const=0
bool allow_rules_with_negative_weights
unsigned int get_dim() const
const std::vector< Real > & get_weights() const
virtual void init(const Elem &e, unsigned int p_level=invalid_uint)
virtual void zero_rows(std::vector< numeric_index_type > &rows, T diag_value=0.0)
virtual void add(const numeric_index_type i, const numeric_index_type j, const T value)=0
virtual void set(const numeric_index_type i, const numeric_index_type j, const T value)=0
LIBMESH_DEVICE_INLINE void add_scaled(const TypeVector< T2 > &, const T &)
void coordTransformFactorRZGeneral(const P &point, const std::pair< Point, RealVectorValue > &axis, C &factor)
Computes a coordinate transformation factor for a general axisymmetric axis.
void coordTransformFactor(const P &point, C &factor, const Moose::CoordinateSystemType coord_type, const unsigned int rz_radial_coord=libMesh::invalid_uint)
Compute a coordinate transformation volume integration factor.
MOOSE now contains C++17 code, so give a reasonable error message stating what the user can do to add...
const SubdomainID ANY_BLOCK_ID
void derivInsert(SemiDynamicSparseNumberArray< Real, libMesh::dof_id_type, NWrapper< N > > &derivs, libMesh::dof_id_type index, Real value)
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...
const unsigned int invalid_uint
OStreamProxy err(std::cerr)
Data structure for tracking/grouping a set of quadrature rules for a particular dimensionality of mes...
std::unique_ptr< ArbitraryQuadrature > arbitrary_vol
volume/elem (meshdim) custom points quadrature rule
std::unique_ptr< ArbitraryQuadrature > neighbor
area/face (meshdim-1) custom points quadrature rule for DG
std::unique_ptr< libMesh::QBase > vol
volume/elem (meshdim) quadrature rule
std::unique_ptr< ArbitraryQuadrature > arbitrary_face
area/face (meshdim-1) custom points quadrature rule
std::unique_ptr< libMesh::QBase > face
area/face (meshdim-1) quadrature rule