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()),
91 _helper_type(_mesh.hasSecondOrderElements() ? SECOND : FIRST, LAGRANGE),
92 _user_added_fe_of_helper_type(false),
93 _user_added_fe_face_of_helper_type(false),
94 _user_added_fe_face_neighbor_of_helper_type(false),
95 _user_added_fe_neighbor_of_helper_type(false),
96 _user_added_fe_lower_of_helper_type(false),
97 _building_helpers(false),
98 _current_qrule(nullptr),
99 _current_qrule_volume(nullptr),
100 _current_qrule_arbitrary(nullptr),
101 _coord_type(
Moose::COORD_XYZ),
102 _current_qrule_face(nullptr),
103 _current_qface_arbitrary(nullptr),
104 _current_qrule_neighbor(nullptr),
105 _need_JxW_neighbor(false),
107 _custom_mortar_qrule(false),
108 _current_qrule_lower(nullptr),
110 _current_elem(nullptr),
111 _current_elem_volume(0),
113 _current_side_elem(nullptr),
114 _current_side_volume(0),
115 _current_neighbor_elem(nullptr),
116 _current_neighbor_side(0),
117 _current_neighbor_side_elem(nullptr),
118 _need_neighbor_elem_volume(false),
119 _current_neighbor_volume(0),
120 _current_node(nullptr),
121 _current_neighbor_node(nullptr),
122 _current_elem_volume_computed(false),
123 _current_side_volume_computed(false),
125 _current_lower_d_elem(nullptr),
126 _current_neighbor_lower_d_elem(nullptr),
127 _need_lower_d_elem_volume(false),
128 _need_neighbor_lower_d_elem_volume(false),
131 _residual_vector_tags(_subproblem.getVectorTags(
Moose::VECTOR_TAG_RESIDUAL)),
132 _cached_residual_values(2),
133 _cached_residual_rows(2),
134 _max_cached_residuals(0),
135 _max_cached_jacobians(0),
137 _block_diagonal_matrix(false),
138 _calculate_xyz(false),
139 _calculate_face_xyz(false),
140 _calculate_curvatures(false),
141 _calculate_ad_coord(false),
142 _have_p_refinement(false)
147 buildFE(FEType(helper_order, LAGRANGE));
173 ? FEGenericBase<Real>::build(
_mesh_dimension - 1, FEType(helper_order, LAGRANGE))
174 : FEGenericBase<Real>::build(
_mesh_dimension - 1, FEType(FIRST, LAGRANGE));
176 _fe_msm->add_p_level_in_reinit(
false);
189 for (
auto & it :
_fe[
dim])
278 _fe[
dim][type] = FEGenericBase<Real>::build(
dim, type).release();
280 _fe[
dim][type]->get_phi();
281 _fe[
dim][type]->get_dphi();
285 _fe[
dim][type]->get_xyz();
287 _fe[
dim][type]->get_d2phi();
304 _fe_face[
dim][type] = FEGenericBase<Real>::build(
dim, type).release();
372 _fe_lower[
dim][type] = FEGenericBase<Real>::build(
dim, type).release();
393 _fe_lower[
dim][type] = FEGenericBase<Real>::build(
dim, type).release();
411 unsigned int dim = ((type.family == LAGRANGE_VEC) || (type.family == MONOMIAL_VEC)) ? 0 : 2;
413 if (ending_dim <
dim)
415 for (;
dim <= ending_dim;
dim++)
436 unsigned int dim = ((type.family == LAGRANGE_VEC) || (type.family == MONOMIAL_VEC)) ? 0 : 2;
438 if (ending_dim <
dim)
440 for (;
dim <= ending_dim;
dim++)
459 unsigned int min_dim;
460 if (type.family == NEDELEC_ONE || type.family == RAVIART_THOMAS ||
461 type.family == L2_RAVIART_THOMAS)
471 _vector_fe[
dim][type] = FEGenericBase<VectorValue<Real>>::build(
dim, type).release();
490 unsigned int min_dim;
491 if (type.family == NEDELEC_ONE || type.family == RAVIART_THOMAS ||
492 type.family == L2_RAVIART_THOMAS)
520 unsigned int min_dim;
521 if (type.family == NEDELEC_ONE || type.family == RAVIART_THOMAS ||
522 type.family == L2_RAVIART_THOMAS)
550 unsigned int min_dim;
551 if (type.family == NEDELEC_ONE || type.family == RAVIART_THOMAS ||
552 type.family == L2_RAVIART_THOMAS)
563 FEGenericBase<VectorValue<Real>>::build(
dim, type).release();
578 mooseAssert(qdefault.size() > 0,
"default quadrature must be initialized before order bumps");
582 if (qvec.size() != ndims || !qvec[0].vol)
584 qdefault[0].arbitrary_vol->get_order(),
586 qdefault[0].face->get_order(),
588 else if (qvec[0].vol->get_order() < volume_order)
590 qvec[0].arbitrary_vol->get_order(),
592 qvec[0].face->get_order(),
601 mooseAssert(qdefault.size() > 0,
"default quadrature must be initialized before order bumps");
605 if (qvec.size() != ndims || !qvec[0].vol)
606 createQRules(qdefault[0].vol->type(), order, order, order, block);
607 else if (qvec[0].vol->get_order() < order || qvec[0].face->get_order() < order)
609 std::max(order, qvec[0].arbitrary_vol->get_order()),
610 std::max(order, qvec[0].vol->get_order()),
611 std::max(order, qvec[0].face->get_order()),
622 bool allow_negative_qweights)
626 if (qvec.size() != ndims)
629 for (
unsigned int i = 0; i < qvec.size(); i++)
632 auto & q = qvec[
dim];
633 q.vol = QBase::build(type,
dim, volume_order);
634 q.vol->allow_rules_with_negative_weights = allow_negative_qweights;
635 q.face = QBase::build(type,
dim - 1, face_order);
636 q.face->allow_rules_with_negative_weights = allow_negative_qweights;
638 q.fv_face->allow_rules_with_negative_weights = allow_negative_qweights;
639 q.neighbor = std::make_unique<ArbitraryQuadrature>(
dim - 1, face_order);
640 q.neighbor->allow_rules_with_negative_weights = allow_negative_qweights;
641 q.arbitrary_vol = std::make_unique<ArbitraryQuadrature>(
dim, order);
642 q.arbitrary_vol->allow_rules_with_negative_weights = allow_negative_qweights;
643 q.arbitrary_face = std::make_unique<ArbitraryQuadrature>(
dim - 1, face_order);
644 q.arbitrary_face->allow_rules_with_negative_weights = allow_negative_qweights;
661 for (
auto & it :
_fe[
dim])
662 it.second->attach_quadrature_rule(qrule);
664 it.second->attach_quadrature_rule(qrule);
667 mooseAssert(dim <
_unique_fe_helper.size(),
"We should not be indexing out of bounds");
679 it.second->attach_quadrature_rule(qrule);
681 it.second->attach_quadrature_rule(qrule);
698 it.second->attach_quadrature_rule(qrule);
700 it.second->attach_quadrature_rule(qrule);
714 it.second->attach_quadrature_rule(qrule);
716 it.second->attach_quadrature_rule(qrule);
720 "We should not be indexing out of bounds");
753 " does not match previously specified quadrature_order: ",
755 ". Quadrature_order (when specified) must match for all mortar constraints.");
762 unsigned int dim =
elem->dim();
764 for (
const auto & it :
_fe[
dim])
766 FEBase & fe = *it.second;
767 const FEType & fe_type = it.first;
775 fesd.
_phi.shallowCopy(
const_cast<std::vector<std::vector<Real>
> &>(fe.get_phi()));
777 const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe.get_dphi()));
780 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe.get_d2phi()));
784 FEVectorBase & fe = *it.second;
785 const FEType & fe_type = it.first;
793 fesd.
_phi.shallowCopy(
const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe.get_phi()));
795 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe.get_dphi()));
798 const_cast<std::vector<std::vector<TypeNTensor<3, Real>
>> &>(fe.get_d2phi()));
801 const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe.get_curl_phi()));
803 fesd.
_div_phi.shallowCopy(
const_cast<std::vector<std::vector<Real>
> &>(fe.get_div_phi()));
824 for (
unsigned int qp = 0; qp != n_qp; qp++)
829 for (
unsigned qp = 0; qp < n_qp; ++qp)
832 for (
unsigned qp = 0; qp < n_qp; ++qp)
836 for (
const auto & it :
_fe[
dim])
838 FEBase & fe = *it.second;
839 auto fe_type = it.first;
840 auto num_shapes = FEInterface::n_shape_functions(fe_type,
elem);
843 grad_phi.resize(num_shapes);
844 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
845 grad_phi[i].resize(n_qp);
851 const auto & regular_grad_phi =
_fe_shape_data[fe_type]->_grad_phi;
852 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
853 for (
unsigned qp = 0; qp < n_qp; ++qp)
854 grad_phi[i][qp] = regular_grad_phi[i][qp];
859 FEVectorBase & fe = *it.second;
860 auto fe_type = it.first;
861 auto num_shapes = FEInterface::n_shape_functions(fe_type,
elem);
864 grad_phi.resize(num_shapes);
865 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
866 grad_phi[i].resize(n_qp);
873 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
874 for (
unsigned qp = 0; qp < n_qp; ++qp)
875 grad_phi[i][qp] = regular_grad_phi[i][qp];
881 for (
auto i : make_range(n))
885 if (
_xfem !=
nullptr)
889template <
typename OutputType>
894 FEGenericBase<OutputType> * fe)
908 const auto & dphidxi = fe->get_dphidxi();
909 const auto & dphideta = fe->get_dphideta();
910 const auto & dphidzeta = fe->get_dphidzeta();
911 auto num_shapes = grad_phi.size();
917 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
918 for (
unsigned qp = 0; qp < n_qp; ++qp)
925 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
926 for (
unsigned qp = 0; qp < n_qp; ++qp)
928 grad_phi[i][qp].slice(0) = dphidxi[i][qp] *
_ad_dxidx_map[qp];
929 grad_phi[i][qp].slice(1) = dphidxi[i][qp] *
_ad_dxidy_map[qp];
930 grad_phi[i][qp].slice(2) = dphidxi[i][qp] *
_ad_dxidz_map[qp];
937 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
938 for (
unsigned qp = 0; qp < n_qp; ++qp)
940 grad_phi[i][qp].slice(0) =
942 grad_phi[i][qp].slice(1) =
944 grad_phi[i][qp].slice(2) =
952 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
953 for (
unsigned qp = 0; qp < n_qp; ++qp)
955 grad_phi[i][qp].slice(0) = dphidxi[i][qp] *
_ad_dxidx_map[qp] +
958 grad_phi[i][qp].slice(1) = dphidxi[i][qp] *
_ad_dxidy_map[qp] +
961 grad_phi[i][qp].slice(2) = dphidxi[i][qp] *
_ad_dxidz_map[qp] +
1002 const std::vector<Real> & qw,
1044 const auto & elem_nodes =
elem->get_nodes();
1045 auto num_shapes = FEInterface::n_shape_functions(fe->get_fe_type(),
elem);
1046 const auto & phi_map = fe->get_fe_map().get_phi_map();
1047 const auto & dphidxi_map = fe->get_fe_map().get_dphidxi_map();
1048 const auto & dphideta_map = fe->get_fe_map().get_dphideta_map();
1049 const auto & dphidzeta_map = fe->get_fe_map().get_dphidzeta_map();
1051 const bool do_derivatives =
1072 for (std::size_t i = 0; i < num_shapes; i++)
1074 libmesh_assert(elem_nodes[i]);
1075 const Node &
node = *elem_nodes[i];
1079 if (
node.n_dofs(sys_num, disp_num))
1081 elem_point(direction).derivatives(),
node.dof_number(sys_num, disp_num, 0), 1.);
1091 if (
_ad_jac[p].value() <= -TOLERANCE * TOLERANCE)
1093 static bool failing =
false;
1098 libmesh_error_msg(
"ERROR: negative Jacobian " <<
_ad_jac[p].value() <<
" at point index "
1099 << p <<
" in element " <<
elem->id());
1122 for (std::size_t i = 0; i < num_shapes; i++)
1124 libmesh_assert(elem_nodes[i]);
1125 const Node &
node = *elem_nodes[i];
1129 if (
node.n_dofs(sys_num, disp_num))
1131 elem_point(direction).derivatives(),
node.dof_number(sys_num, disp_num, 0), 1.);
1144 const auto g11 = (dx_dxi * dx_dxi + dy_dxi * dy_dxi + dz_dxi * dz_dxi);
1146 const auto g12 = (dx_dxi * dx_deta + dy_dxi * dy_deta + dz_dxi * dz_deta);
1148 const auto & g21 = g12;
1150 const auto g22 = (dx_deta * dx_deta + dy_deta * dy_deta + dz_deta * dz_deta);
1152 auto det = (g11 * g22 - g12 * g21);
1154 if (det.value() <= -TOLERANCE * TOLERANCE)
1156 static bool failing =
false;
1161 libmesh_error_msg(
"ERROR: negative Jacobian " << det <<
" at point index " << p
1162 <<
" in element " <<
elem->id());
1167 else if (det.value() <= 0.)
1168 det.value() = TOLERANCE * TOLERANCE;
1170 const auto inv_det = 1. / det;
1176 const auto g11inv = g22 * inv_det;
1177 const auto g12inv = -g12 * inv_det;
1178 const auto g21inv = -g21 * inv_det;
1179 const auto g22inv = g11 * inv_det;
1200 for (std::size_t i = 0; i < num_shapes; i++)
1202 libmesh_assert(elem_nodes[i]);
1203 const Node &
node = *elem_nodes[i];
1207 if (
node.n_dofs(sys_num, disp_num))
1209 elem_point(direction).derivatives(),
node.dof_number(sys_num, disp_num, 0), 1.);
1225 _ad_jac[p] = (dx_dxi * (dy_deta * dz_dzeta - dz_deta * dy_dzeta) +
1226 dy_dxi * (dz_deta * dx_dzeta - dx_deta * dz_dzeta) +
1227 dz_dxi * (dx_deta * dy_dzeta - dy_deta * dx_dzeta));
1229 if (
_ad_jac[p].value() <= -TOLERANCE * TOLERANCE)
1231 static bool failing =
false;
1236 libmesh_error_msg(
"ERROR: negative Jacobian " <<
_ad_jac[p].value() <<
" at point index "
1237 << p <<
" in element " <<
elem->id());
1245 const auto inv_jac = 1. /
_ad_jac[p];
1247 _ad_dxidx_map[p] = (dy_deta * dz_dzeta - dz_deta * dy_dzeta) * inv_jac;
1248 _ad_dxidy_map[p] = (dz_deta * dx_dzeta - dx_deta * dz_dzeta) * inv_jac;
1249 _ad_dxidz_map[p] = (dx_deta * dy_dzeta - dy_deta * dx_dzeta) * inv_jac;
1251 _ad_detadx_map[p] = (dz_dxi * dy_dzeta - dy_dxi * dz_dzeta) * inv_jac;
1252 _ad_detady_map[p] = (dx_dxi * dz_dzeta - dz_dxi * dx_dzeta) * inv_jac;
1253 _ad_detadz_map[p] = (dy_dxi * dx_dzeta - dx_dxi * dy_dzeta) * inv_jac;
1263 libmesh_error_msg(
"Invalid dim = " <<
dim);
1270 unsigned int dim =
elem->dim();
1274 FEBase & fe_face = *it.second;
1275 const FEType & fe_type = it.first;
1280 fesd.
_phi.shallowCopy(
const_cast<std::vector<std::vector<Real>
> &>(fe_face.get_phi()));
1282 const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe_face.get_dphi()));
1285 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_face.get_d2phi()));
1289 FEVectorBase & fe_face = *it.second;
1290 const FEType & fe_type = it.first;
1298 fesd.
_phi.shallowCopy(
1299 const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe_face.get_phi()));
1301 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_face.get_dphi()));
1304 const_cast<std::vector<std::vector<TypeNTensor<3, Real>
>> &>(fe_face.get_d2phi()));
1307 const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe_face.get_curl_phi()));
1310 const_cast<std::vector<std::vector<Real>
> &>(fe_face.get_div_phi()));
1338 if (
_xfem !=
nullptr)
1342 for (
auto i : make_range(n))
1358 const auto n_qp = qw.size();
1362 std::vector<std::vector<Real>>
const * d2psidxi2_map =
nullptr;
1363 std::vector<std::vector<Real>>
const * d2psidxideta_map =
nullptr;
1364 std::vector<std::vector<Real>>
const * d2psideta2_map =
nullptr;
1382 if (side_elem.node_id(0) ==
elem.node_id(0))
1387 VectorValue<ADReal> side_point;
1390 const Node &
node = side_elem.node_ref(0);
1396 side_point(direction).derivatives(),
node.dof_number(sys_num, disp_num, 0), 1.);
1399 for (
const auto p : make_range(n_qp))
1420 for (
const auto p : make_range(n_qp))
1423 for (
const auto p : make_range(n_qp))
1426 for (
const auto p : make_range(n_qp))
1429 const auto n_mapping_shape_functions =
1432 for (
unsigned int i = 0; i < n_mapping_shape_functions; i++)
1434 const Node &
node = side_elem.node_ref(i);
1435 VectorValue<ADReal> side_point =
node;
1440 side_point(direction).derivatives(),
node.dof_number(sys_num, disp_num, 0), 1.);
1442 for (
const auto p : make_range(n_qp))
1445 for (
const auto p : make_range(n_qp))
1448 for (
const auto p : make_range(n_qp))
1452 for (
const auto p : make_range(n_qp))
1462 libmesh_assert_not_equal_to(denominator, 0);
1481 for (
const auto p : make_range(n_qp))
1487 for (
const auto p : make_range(n_qp))
1490 for (
const auto p : make_range(n_qp))
1497 const unsigned int n_mapping_shape_functions =
1500 for (
unsigned int i = 0; i < n_mapping_shape_functions; i++)
1502 const Node &
node = side_elem.node_ref(i);
1503 VectorValue<ADReal> side_point =
node;
1508 side_point(direction).derivatives(),
node.dof_number(sys_num, disp_num, 0), 1.);
1510 for (
const auto p : make_range(n_qp))
1516 for (
const auto p : make_range(n_qp))
1519 for (
const auto p : make_range(n_qp))
1527 for (
const auto p : make_range(n_qp))
1535 const auto g11 = (dxdxi * dxdxi + dydxi * dydxi + dzdxi * dzdxi);
1537 const auto g12 = (dxdxi * dxdeta + dydxi * dydeta + dzdxi * dzdeta);
1539 const auto & g21 = g12;
1541 const auto g22 = (dxdeta * dxdeta + dydeta * dydeta + dzdeta * dzdeta);
1544 const auto the_jac = sqrt(g11 * g22 - g12 * g21);
1557 const auto numerator = E * N - 2. * F * M + G * L;
1558 const auto denominator = E * G - F * F;
1559 libmesh_assert_not_equal_to(denominator, 0.);
1575 unsigned int neighbor_dim =
neighbor->dim();
1580 FEBase & fe_face_neighbor = *it.second;
1581 FEType fe_type = it.first;
1584 fe_face_neighbor.reinit(
neighbor, &reference_points);
1588 fesd.
_phi.shallowCopy(
const_cast<std::vector<std::vector<Real>
> &>(fe_face_neighbor.get_phi()));
1590 const_cast<std::vector<std::vector<RealGradient>
> &>(fe_face_neighbor.get_dphi()));
1593 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_face_neighbor.get_d2phi()));
1597 FEVectorBase & fe_face_neighbor = *it.second;
1598 const FEType & fe_type = it.first;
1604 fe_face_neighbor.reinit(
neighbor, &reference_points);
1606 fesd.
_phi.shallowCopy(
1607 const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe_face_neighbor.get_phi()));
1609 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_face_neighbor.get_dphi()));
1611 fesd.
_second_phi.shallowCopy(
const_cast<std::vector<std::vector<TypeNTensor<3, Real>
>> &>(
1612 fe_face_neighbor.get_d2phi()));
1614 fesd.
_curl_phi.shallowCopy(
const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(
1615 fe_face_neighbor.get_curl_phi()));
1618 const_cast<std::vector<std::vector<Real>
> &>(fe_face_neighbor.get_div_phi()));
1623 "We should be in bounds here");
1634 unsigned int neighbor_dim =
neighbor->dim();
1639 FEBase & fe_neighbor = *it.second;
1640 FEType fe_type = it.first;
1643 fe_neighbor.reinit(
neighbor, &reference_points);
1647 fesd.
_phi.shallowCopy(
const_cast<std::vector<std::vector<Real>
> &>(fe_neighbor.get_phi()));
1649 const_cast<std::vector<std::vector<RealGradient>
> &>(fe_neighbor.get_dphi()));
1652 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_neighbor.get_d2phi()));
1656 FEVectorBase & fe_neighbor = *it.second;
1657 const FEType & fe_type = it.first;
1663 fe_neighbor.reinit(
neighbor, &reference_points);
1665 fesd.
_phi.shallowCopy(
1666 const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe_neighbor.get_phi()));
1668 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_neighbor.get_dphi()));
1671 const_cast<std::vector<std::vector<TypeNTensor<3, Real>
>> &>(fe_neighbor.get_d2phi()));
1674 const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe_neighbor.get_curl_phi()));
1677 const_cast<std::vector<std::vector<Real>
> &>(fe_neighbor.get_div_phi()));
1689 unsigned int neighbor_dim =
neighbor->dim();
1691 "Neighbor subdomain ID has not been correctly set");
1695 neighbor_rule->
setPoints(reference_points);
1700 "current neighbor subdomain has been set incorrectly");
1709 fe.attach_quadrature_rule(qrule);
1712 const std::vector<Real> &
JxW = fe.get_JxW();
1714 q_points.
shallowCopy(
const_cast<std::vector<Point> &
>(fe.get_xyz()));
1719 for (
unsigned int qp = 0; qp < qrule->n_points(); qp++)
1724 for (
auto i : make_range(n))
1729template <
typename Po
ints,
typename Coords>
1732 const Points & q_points,
1737 mooseAssert(qrule,
"The quadrature rule is null in Assembly::setCoordinateTransformation");
1738 auto n_points = qrule->n_points();
1739 mooseAssert(n_points == q_points.size(),
1740 "The number of points in the quadrature rule doesn't match the number of passed-in "
1741 "points in Assembly::setCoordinateTransformation");
1748 coord.resize(n_points);
1749 for (
unsigned int qp = 0; qp < n_points; qp++)
1797 "current subdomain has been set incorrectly");
1811 unsigned int elem_dimension =
elem->dim();
1824 "current subdomain has been set incorrectly");
1838 "current subdomain has been set incorrectly");
1864 "current subdomain has been set incorrectly");
1888 "Our finite volume quadrature rule should always yield a single point");
1896 const auto & ref_point = ref_points[0];
1903 "current neighbor subdomain has been set incorrectly");
1925 return qruleFaceHelper<ArbitraryQuadrature>(
1932 const auto elem_dimension =
elem->dim();
1945 "current subdomain has been set incorrectly");
1959Assembly::reinit(
const Elem * elem,
unsigned int side,
const std::vector<Point> & reference_points)
1964 "current subdomain has been set incorrectly");
1996 const Elem * neighbor,
1997 unsigned int neighbor_side,
1998 const std::vector<Point> * neighbor_reference_points)
2004 unsigned int neighbor_dim =
neighbor->dim();
2006 if (neighbor_reference_points)
2020 unsigned int elem_side,
2022 const std::vector<Point> *
const pts,
2023 const std::vector<Real> *
const weights)
2027 unsigned int elem_dim =
elem->dim();
2033 face_rule->setPoints(*pts);
2044 for (
const auto & it :
_fe_face[elem_dim])
2046 FEBase & fe_face = *it.second;
2047 FEType fe_type = it.first;
2050 fe_face.reinit(
elem, elem_side, tolerance, pts, weights);
2054 fesd.
_phi.shallowCopy(
const_cast<std::vector<std::vector<Real>
> &>(fe_face.get_phi()));
2056 const_cast<std::vector<std::vector<RealGradient>
> &>(fe_face.get_dphi()));
2059 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_face.get_d2phi()));
2063 FEVectorBase & fe_face = *it.second;
2064 const FEType & fe_type = it.first;
2070 fe_face.reinit(
elem, elem_side, tolerance, pts, weights);
2072 fesd.
_phi.shallowCopy(
2073 const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe_face.get_phi()));
2075 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_face.get_dphi()));
2078 const_cast<std::vector<std::vector<TypeNTensor<3, Real>
>> &>(fe_face.get_d2phi()));
2081 const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe_face.get_curl_phi()));
2084 const_cast<std::vector<std::vector<Real>
> &>(fe_face.get_div_phi()));
2130 const std::vector<Real> dummy_qw(n_qp, 1.);
2132 for (
unsigned int qp = 0; qp != n_qp; qp++)
2137 for (
unsigned qp = 0; qp < n_qp; ++qp)
2143 for (
unsigned qp = 0; qp < n_qp; ++qp)
2146 for (
unsigned qp = 0; qp < n_qp; ++qp)
2152 FEBase & fe = *it.second;
2153 auto fe_type = it.first;
2154 auto num_shapes = FEInterface::n_shape_functions(fe_type, &
elem);
2157 grad_phi.resize(num_shapes);
2158 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
2159 grad_phi[i].resize(n_qp);
2166 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
2167 for (
unsigned qp = 0; qp < n_qp; ++qp)
2168 grad_phi[i][qp] = regular_grad_phi[i][qp];
2172 FEVectorBase & fe = *it.second;
2173 auto fe_type = it.first;
2174 auto num_shapes = FEInterface::n_shape_functions(fe_type, &
elem);
2177 grad_phi.resize(num_shapes);
2178 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
2179 grad_phi[i].resize(n_qp);
2186 for (
decltype(num_shapes) i = 0; i < num_shapes; ++i)
2187 for (
unsigned qp = 0; qp < n_qp; ++qp)
2188 grad_phi[i][qp] = regular_grad_phi[i][qp];
2195 unsigned int neighbor_side,
2197 const std::vector<Point> *
const pts,
2198 const std::vector<Real> *
const weights)
2202 unsigned int neighbor_dim =
neighbor->dim();
2218 FEBase & fe_face_neighbor = *it.second;
2219 FEType fe_type = it.first;
2222 fe_face_neighbor.reinit(
neighbor, neighbor_side, tolerance, pts, weights);
2226 fesd.
_phi.shallowCopy(
const_cast<std::vector<std::vector<Real>
> &>(fe_face_neighbor.get_phi()));
2228 const_cast<std::vector<std::vector<RealGradient>
> &>(fe_face_neighbor.get_dphi()));
2231 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_face_neighbor.get_d2phi()));
2235 FEVectorBase & fe_face_neighbor = *it.second;
2236 const FEType & fe_type = it.first;
2242 fe_face_neighbor.reinit(
neighbor, neighbor_side, tolerance, pts, weights);
2244 fesd.
_phi.shallowCopy(
2245 const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(fe_face_neighbor.get_phi()));
2247 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_face_neighbor.get_dphi()));
2249 fesd.
_second_phi.shallowCopy(
const_cast<std::vector<std::vector<TypeNTensor<3, Real>
>> &>(
2250 fe_face_neighbor.get_d2phi()));
2252 fesd.
_curl_phi.shallowCopy(
const_cast<std::vector<std::vector<VectorValue<Real>
>> &>(
2253 fe_face_neighbor.get_curl_phi()));
2256 const_cast<std::vector<std::vector<Real>
> &>(fe_face_neighbor.get_div_phi()));
2261 "We should be in bounds here");
2263 neighbor, neighbor_side, tolerance, pts, weights);
2273 const std::vector<Point> & pts,
2274 const std::vector<Real> & JxW)
2276 const unsigned int elem_dim =
elem->dim();
2278 "Dual shape functions should only be computed on lower dimensional face elements");
2280 for (
const auto & it :
_fe_lower[elem_dim])
2282 FEBase & fe_lower = *it.second;
2284 fe_lower.set_calculate_default_dual_coeff(
false);
2285 fe_lower.reinit_dual_shape_coeffs(
elem, pts,
JxW);
2291 const std::vector<Point> *
const pts,
2292 const std::vector<Real> *
const weights)
2296 const unsigned int elem_dim =
elem->dim();
2298 "The lower dimensional element should truly be a lower dimensional element");
2316 for (
const auto & it :
_fe_lower[elem_dim])
2318 FEBase & fe_lower = *it.second;
2319 FEType fe_type = it.first;
2321 fe_lower.reinit(
elem);
2325 fesd->_phi.shallowCopy(
const_cast<std::vector<std::vector<Real>
> &>(fe_lower.get_phi()));
2326 fesd->_grad_phi.shallowCopy(
2327 const_cast<std::vector<std::vector<RealGradient>
> &>(fe_lower.get_dphi()));
2329 fesd->_second_phi.shallowCopy(
2330 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_lower.get_d2phi()));
2336 fesd->_phi.shallowCopy(
const_cast<std::vector<std::vector<Real>
> &>(fe_lower.get_dual_phi()));
2337 fesd->_grad_phi.shallowCopy(
2338 const_cast<std::vector<std::vector<RealGradient>
> &>(fe_lower.get_dual_dphi()));
2340 fesd->_second_phi.shallowCopy(
2341 const_cast<std::vector<std::vector<TensorValue<Real>
>> &>(fe_lower.get_dual_d2phi()));
2353 if (pts && !weights)
2371 const auto & physical_q_points = helper_fe.get_xyz();
2372 const auto &
JxW = helper_fe.get_JxW();
2386 "You should be calling reinitNeighborLowerDElem on a lower dimensional element");
2407 "You should be calling reinitMortarElem on a lower dimensional element");
2419 unsigned int neighbor_side,
2420 const std::vector<Point> & physical_points)
2422 unsigned int neighbor_dim =
neighbor->dim();
2428 physical_points.size() == 1,
2429 "If reinitializing with more than one point, then I am dubious of your use case. Perhaps "
2430 "you are performing a DG type method and you are reinitializing using points from the "
2431 "element face. In such a case your neighbor JxW must have its index order 'match' the "
2432 "element JxW index order, e.g. imagining a vertical 1D face with two quadrature points, "
2434 "index 0 for elem JxW corresponds to the 'top' quadrature point, then index 0 for "
2436 "JxW must also correspond to the 'top' quadrature point. And libMesh/MOOSE has no way to "
2437 "guarantee that with multiple quadrature points.");
2455 const std::vector<Point> & physical_points)
2457 unsigned int neighbor_dim =
neighbor->dim();
2481 for (
auto & ivar :
vars)
2483 auto i = ivar->number();
2488 for (
unsigned int k = 0; k < ivar->count(); ++k)
2490 unsigned int iv = i + k;
2491 for (
const auto & j :
libMesh::ConstCouplingRow(iv, *
_cm))
2502 auto pair = std::make_pair(ivar, &jvar);
2503 auto c = ivar_start;
2505 bool has_pair =
false;
2518 if (i != jvar.number())
2529 for (
auto & ivar : scalar_vars)
2531 auto i = ivar->number();
2535 for (
const auto & j :
libMesh::ConstCouplingRow(i, *
_cm))
2536 if (
_sys.isScalarVariable(j))
2553 _sub_Re.resize(num_vector_tags);
2554 _sub_Rn.resize(num_vector_tags);
2555 _sub_Rl.resize(num_vector_tags);
2589 for (MooseIndex(num_matrix_tags) tag = 0; tag < num_matrix_tags; tag++)
2606 for (MooseIndex(n_vars) i = 0; i <
n_vars; ++i)
2655 for (
auto & ivar :
vars)
2657 auto i = ivar->number();
2659 for (
unsigned int k = 0; k < ivar->count(); ++k)
2661 unsigned int iv = i + k;
2666 auto pair = std::make_pair(ivar, &jvar);
2667 auto c = ivar_start;
2669 bool has_pair =
false;
2691 unsigned int vi = ivar.
number();
2692 unsigned int vj = jvar.
number();
2696 if (array_block_diagonal_purely_diagonal)
2697 num_cols /= jvar.
count();
2711 for (
const auto & var :
vars)
2713 tag_Re[var->number()].resize(var->dofIndices().size());
2731 unsigned int vi = ivar.
number();
2732 unsigned int vj = jvar.
number();
2736 if (array_block_diagonal_purely_diagonal)
2737 num_cols /= jvar.
count();
2757 unsigned int vi = ivar.
number();
2758 unsigned int vj = jvar.
number();
2762 if (array_block_diagonal_purely_diagonal)
2763 num_cols /= jvar.
count();
2787 unsigned int vi = ivar.
number();
2788 unsigned int vj = jvar.
number();
2792 if (array_block_diagonal_purely_diagonal)
2793 num_cols /= jvar.
count();
2817 unsigned int vi = ivar.
number();
2818 unsigned int vj = jvar.
number();
2821 const auto dofs_divisor = array_block_diagonal_purely_diagonal ? jvar.
count() : 1;
2842 for (
const auto & var :
vars)
2844 tag_Rn[var->number()].resize(var->dofIndicesNeighbor().size());
2855 unsigned int vi = ivar.
number();
2856 unsigned int vj = jvar.
number();
2859 const auto dofs_divisor = array_block_diagonal_purely_diagonal ? jvar.
count() : 1;
2894 for (
const auto & var :
vars)
2896 tag_Rl[var->number()].resize(var->dofIndicesLower().size());
2902 const std::vector<dof_id_type> & dof_indices)
2906 const unsigned int ivn = iv.
number();
2907 const unsigned int jvn = jv.number();
2908 const unsigned int icount = iv.count();
2909 unsigned int jcount = jv.count();
2916 .resize(dof_indices.size() * icount, dof_indices.size() * jcount);
2921 tag_Re[ivn].resize(dof_indices.size() * icount);
2927 const std::vector<dof_id_type> & idof_indices,
2928 const std::vector<dof_id_type> & jdof_indices)
2932 const unsigned int ivn = iv.
number();
2933 const unsigned int jvn = jv.number();
2934 const unsigned int icount = iv.count();
2935 unsigned int jcount = jv.count();
2944 .resize(idof_indices.size() * icount, jdof_indices.size() * jcount);
2954 for (
const auto & ivar :
vars)
2956 auto idofs = ivar->dofIndices().size();
2959 tag_Re[ivar->number()].resize(idofs);
2961 for (
const auto & jvar :
vars)
2963 auto jdofs = jvar->dofIndices().size();
2980 for (
const auto & ivar : scalar_vars)
2982 auto idofs = ivar->dofIndices().size();
2984 for (
const auto & jvar :
vars)
2986 auto jdofs = jvar->dofIndices().size() * jvar->count();
2999template <
typename T>
3003 phi(v).shallowCopy(v.
phi());
3027 if (v.computingCurl())
3028 curlPhi(v).shallowCopy(v.curlPhi());
3029 if (v.computingDiv())
3030 divPhi(v).shallowCopy(v.divPhi());
3033 mooseError(
"Unsupported variable field type!");
3036template <
typename T>
3064 if (v.computingCurl())
3066 if (v.computingDiv())
3070 mooseError(
"Unsupported variable field type!");
3073template <
typename T>
3114 mooseError(
"Unsupported variable field type!");
3117DenseMatrix<Number> &
3158DenseMatrix<Number> &
3220 std::vector<dof_id_type> & dof_indices,
3221 const std::vector<Real> & scaling_factor)
3223 mooseAssert(res_block.size() == dof_indices.size(),
3224 "The size of residual and degree of freedom container must be the same");
3229 const auto ntdof = res_block.size();
3230 const auto count = scaling_factor.size();
3231 const auto ndof = ntdof /
count;
3235 for (MooseIndex(
count) j = 0; j <
count; ++j)
3236 for (MooseIndex(ndof) i = 0; i < ndof; ++i)
3237 res_block(p++) *= scaling_factor[j];
3241 if (scaling_factor[0] != 1.0)
3242 res_block *= scaling_factor[0];
3250 DenseVector<Number> & res_block,
3251 const std::vector<dof_id_type> & dof_indices,
3252 const std::vector<Real> & scaling_factor)
3254 if (dof_indices.size() > 0 && res_block.size())
3265 std::vector<dof_id_type> & cached_residual_rows,
3266 DenseVector<Number> & res_block,
3267 const std::vector<dof_id_type> & dof_indices,
3268 const std::vector<Real> & scaling_factor)
3270 if (dof_indices.size() > 0 && res_block.size())
3278 cached_residual_values.push_back(
_tmp_Re(i));
3288 DenseVector<Number> & res_block,
3289 const std::vector<dof_id_type> & dof_indices,
3290 const std::vector<Real> & scaling_factor)
3292 if (dof_indices.size() > 0)
3294 std::vector<dof_id_type> di(dof_indices);
3305 "Non-residual tag in Assembly::addResidual");
3310 for (
const auto & var :
vars)
3311 addResidualBlock(residual, tag_Re[var->number()], var->dofIndices(), var->arrayScalingFactor());
3317 for (
const auto & vector_tag : vector_tags)
3326 "Non-residual tag in Assembly::addResidualNeighbor");
3331 for (
const auto & var :
vars)
3333 residual, tag_Rn[var->number()], var->dofIndicesNeighbor(), var->arrayScalingFactor());
3339 for (
const auto & vector_tag : vector_tags)
3348 "Non-residual tag in Assembly::addResidualLower");
3353 for (
const auto & var :
vars)
3355 residual, tag_Rl[var->number()], var->dofIndicesLower(), var->arrayScalingFactor());
3361 for (
const auto & vector_tag : vector_tags)
3371 "Non-residual tag in Assembly::addResidualScalar");
3377 for (
const auto & var :
vars)
3378 addResidualBlock(residual, tag_Re[var->number()], var->dofIndices(), var->arrayScalingFactor());
3384 for (
const auto & vector_tag : vector_tags)
3393 for (
const auto & var :
vars)
3394 for (
const auto & vector_tag : tags)
3398 _sub_Re[vector_tag._type_id][var->number()],
3400 var->arrayScalingFactor());
3417 for (
auto & tag : tags)
3423 const std::vector<dof_id_type> & dof_index,
3432 for (MooseIndex(dof_index) i = 0; i < dof_index.size(); ++i)
3443 for (
const auto & var :
vars)
3444 for (
const auto & vector_tag : tags)
3448 _sub_Rn[vector_tag._type_id][var->number()],
3449 var->dofIndicesNeighbor(),
3450 var->arrayScalingFactor());
3457 for (
const auto & var :
vars)
3458 for (
const auto & vector_tag : tags)
3462 _sub_Rl[vector_tag._type_id][var->number()],
3463 var->dofIndicesLower(),
3464 var->arrayScalingFactor());
3470 for (
const auto & vector_tag : tags)
3496 mooseAssert(
values.size() == rows.size(),
3497 "Number of cached residuals and number of rows must match!");
3520 mooseAssert(
values.size() == rows.size(),
3521 "Number of cached residuals and number of rows must match!");
3525 residual.add_vector(
values, rows);
3535 for (
const auto & var :
vars)
3536 setResidualBlock(residual, tag_Re[var->number()], var->dofIndices(), var->arrayScalingFactor());
3546 for (
const auto & var :
vars)
3548 residual, tag_Rn[var->number()], var->dofIndicesNeighbor(), var->arrayScalingFactor());
3554 DenseMatrix<Number> & jac_block,
3557 const std::vector<dof_id_type> & idof_indices,
3558 const std::vector<dof_id_type> & jdof_indices)
3560 if (idof_indices.size() == 0 || jdof_indices.size() == 0)
3562 if (jac_block.n() == 0 || jac_block.m() == 0)
3566 const unsigned int iv = ivar.
number();
3567 const unsigned int jv = jvar.
number();
3569 for (
unsigned int i = 0; i < ivar.
count(); ++i)
3573 if (jt < jv || jt >= jv + jvar.
count())
3575 unsigned int j = jt - jv;
3579 auto indof = di.size();
3580 auto jndof = dj.size();
3582 unsigned int jj = j;
3587 auto sub = jac_block.sub_matrix(i * indof, indof, jj * jndof, jndof);
3588 if (scaling_factors[i] != 1.0)
3589 sub *= scaling_factors[i];
3597 jacobian.add_matrix(sub, di, dj);
3607 const std::vector<dof_id_type> & idof_indices,
3608 const std::vector<dof_id_type> & jdof_indices,
3611 if (idof_indices.size() == 0 || jdof_indices.size() == 0)
3613 if (jac_block.n() == 0 || jac_block.m() == 0)
3619 const unsigned int iv = ivar.
number();
3620 const unsigned int jv = jvar.
number();
3622 for (
unsigned int i = 0; i < ivar.
count(); ++i)
3626 if (jt < jv || jt >= jv + jvar.
count())
3628 unsigned int j = jt - jv;
3632 auto indof = di.size();
3633 auto jndof = dj.size();
3635 unsigned int jj = j;
3640 auto sub = jac_block.sub_matrix(i * indof, indof, jj * jndof, jndof);
3641 if (scaling_factors[i] != 1.0)
3642 sub *= scaling_factors[i];
3650 for (MooseIndex(di) i = 0; i < di.size(); i++)
3651 for (MooseIndex(dj) j = 0; j < dj.size(); j++)
3666 const std::vector<dof_id_type> & idof_indices,
3667 const std::vector<dof_id_type> & jdof_indices,
3670 if (idof_indices.size() == 0 || jdof_indices.size() == 0)
3672 if (jac_block.n() == 0 || jac_block.m() == 0)
3679 for (
unsigned int i = 0; i < ivar.
count(); ++i)
3681 unsigned int iv = ivar.
number();
3684 unsigned int jv = jvar.
number();
3685 if (jt < jv || jt >= jv + jvar.
count())
3687 unsigned int j = jt - jv;
3691 auto indof = di.size();
3692 auto jndof = dj.size();
3694 unsigned int jj = j;
3699 auto sub = jac_block.sub_matrix(i * indof, indof, jj * jndof, jndof);
3700 if (scaling_factor[i] != 1.0)
3701 sub *= scaling_factor[i];
3705 for (MooseIndex(di) i = 0; i < di.size(); i++)
3706 for (MooseIndex(dj) j = 0; j < dj.size(); j++)
3707 if (sub(i, j) != 0.0)
3720 const std::vector<dof_id_type> & idof_indices,
3721 const std::vector<dof_id_type> & jdof_indices,
3722 Real scaling_factor,
3724 const std::set<TagID> & tags)
3726 const auto has_matrix =
3727 std::any_of(tags.begin(), tags.end(), [
this](
const auto tag) { return _sys.hasMatrix(tag); });
3731 if ((idof_indices.size() > 0) && (jdof_indices.size() > 0) && jac_block.n() && jac_block.m() &&
3734 _row_indices.assign(idof_indices.begin(), idof_indices.end());
3744 if (scaling_factor != 1.0)
3757 FEType fe_type(
elem->default_order(), LAGRANGE);
3758 std::unique_ptr<FEBase> fe(FEBase::build(
elem->dim(), fe_type));
3761 const std::vector<Real> &
JxW = fe->get_JxW();
3762 const std::vector<Point> & q_points = fe->get_xyz();
3766 QGauss qrule(
elem->dim(), fe_type.default_quadrature_order());
3767 fe->attach_quadrature_rule(&qrule);
3772 mooseAssert(qrule.n_points() == q_points.size(),
3773 "The number of points in the quadrature rule doesn't match the number of passed-in "
3774 "points in Assembly::setCoordinateTransformation");
3778 for (
unsigned int qp = 0; qp < qrule.n_points(); ++qp)
3782 vol +=
JxW[qp] * coord;
3791 const ADRealEigenVector & v)
const
3793 for (
unsigned int j = 0; j < v.size(); ++j, i += ntest)
3804 "Error: Cached data sizes MUST be the same!");
3807 "Error: Cached data sizes MUST be the same for a given tag!");
3872 auto ivar = it.first;
3873 auto jvar = it.second;
3874 auto i = ivar->number();
3875 auto j = jvar->number();
3885 jvar->allDofIndices());
3894 auto ivar = it.first;
3895 auto jvar = it.second;
3896 auto i = ivar->number();
3897 auto j = jvar->number();
3908 jvar->dofIndicesNeighbor());
3914 ivar->dofIndicesNeighbor(),
3915 jvar->dofIndices());
3921 ivar->dofIndicesNeighbor(),
3922 jvar->dofIndicesNeighbor());
3932 auto ivar = it.first;
3933 auto jvar = it.second;
3934 auto i = ivar->number();
3935 auto j = jvar->number();
3944 ivar->dofIndicesLower(),
3945 jvar->dofIndicesLower());
3951 ivar->dofIndicesLower(),
3952 jvar->dofIndicesNeighbor());
3958 ivar->dofIndicesLower(),
3959 jvar->dofIndices());
3965 ivar->dofIndicesNeighbor(),
3966 jvar->dofIndicesLower());
3973 jvar->dofIndicesLower());
3986 jvar->dofIndicesNeighbor());
3992 ivar->dofIndicesNeighbor(),
3993 jvar->dofIndices());
3999 ivar->dofIndicesNeighbor(),
4000 jvar->dofIndicesNeighbor());
4010 auto ivar = it.first;
4011 auto jvar = it.second;
4012 auto i = ivar->number();
4013 auto j = jvar->number();
4022 ivar->dofIndicesLower(),
4023 jvar->dofIndicesLower());
4029 ivar->dofIndicesLower(),
4030 jvar->dofIndices());
4037 jvar->dofIndicesLower());
4077 auto ivar = it.first;
4078 auto jvar = it.second;
4079 auto i = ivar->number();
4080 auto j = jvar->number();
4089 jvar->allDofIndices(),
4099 auto ivar = it.first;
4100 auto jvar = it.second;
4101 auto i = ivar->number();
4102 auto j = jvar->number();
4113 jvar->dofIndicesNeighbor(),
4118 ivar->dofIndicesNeighbor(),
4125 ivar->dofIndicesNeighbor(),
4126 jvar->dofIndicesNeighbor(),
4137 auto ivar = it.first;
4138 auto jvar = it.second;
4139 auto i = ivar->number();
4140 auto j = jvar->number();
4148 ivar->dofIndicesLower(),
4149 jvar->dofIndicesLower(),
4155 ivar->dofIndicesLower(),
4162 ivar->dofIndicesLower(),
4163 jvar->dofIndicesNeighbor(),
4170 jvar->dofIndicesLower(),
4185 jvar->dofIndicesNeighbor(),
4191 ivar->dofIndicesNeighbor(),
4192 jvar->dofIndicesLower(),
4198 ivar->dofIndicesNeighbor(),
4205 ivar->dofIndicesNeighbor(),
4206 jvar->dofIndicesNeighbor(),
4216 const DofMap & dof_map,
4217 std::vector<dof_id_type> & dof_indices,
4219 const std::set<TagID> & tags)
4221 for (
auto tag : tags)
4229 const DofMap & dof_map,
4230 std::vector<dof_id_type> & dof_indices,
4234 if (dof_indices.size() == 0)
4236 if (!(*
_cm)(ivar, jvar))
4243 const unsigned int ivn = iv.number();
4244 const unsigned int jvn = jv.number();
4253 const unsigned int i = ivar - ivn;
4254 const unsigned int j = jvar - jvn;
4257 auto di = dof_indices;
4258 auto dj = dof_indices;
4260 auto indof = di.size();
4261 auto jndof = dj.size();
4263 unsigned int jj = j;
4267 auto sub = ke.
sub_matrix(i * indof, indof, jj * jndof, jndof);
4272 dof_map.constrain_element_matrix(sub, di, dj,
false);
4274 if (scaling_factor[i] != 1.0)
4275 sub *= scaling_factor[i];
4277 jacobian.add_matrix(sub, di, dj);
4282 const unsigned int ivar,
4283 const unsigned int jvar,
4284 const DofMap & dof_map,
4285 const std::vector<dof_id_type> & idof_indices,
4286 const std::vector<dof_id_type> & jdof_indices,
4290 if (idof_indices.size() == 0 || jdof_indices.size() == 0)
4292 if (jacobian.n() == 0 || jacobian.m() == 0)
4294 if (!(*
_cm)(ivar, jvar))
4301 const unsigned int ivn = iv.number();
4302 const unsigned int jvn = jv.number();
4311 const unsigned int i = ivar - ivn;
4312 const unsigned int j = jvar - jvn;
4315 auto di = idof_indices;
4316 auto dj = jdof_indices;
4318 auto indof = di.size();
4319 auto jndof = dj.size();
4321 unsigned int jj = j;
4325 auto sub = keg.
sub_matrix(i * indof, indof, jj * jndof, jndof);
4330 dof_map.constrain_element_matrix(sub, di, dj,
false);
4332 if (scaling_factor[i] != 1.0)
4333 sub *= scaling_factor[i];
4335 jacobian.add_matrix(sub, di, dj);
4340 const unsigned int ivar,
4341 const unsigned int jvar,
4342 const DofMap & dof_map,
4343 const std::vector<dof_id_type> & idof_indices,
4344 const std::vector<dof_id_type> & jdof_indices,
4346 const std::set<TagID> & tags)
4348 for (
auto tag : tags)
4350 jacobian, ivar, jvar, dof_map, idof_indices, jdof_indices,
GlobalDataKey{}, tag);
4355 const unsigned int ivar,
4356 const unsigned int jvar,
4357 const DofMap & dof_map,
4358 std::vector<dof_id_type> & dof_indices,
4359 std::vector<dof_id_type> & neighbor_dof_indices,
4363 if (dof_indices.size() == 0 && neighbor_dof_indices.size() == 0)
4365 if (!(*
_cm)(ivar, jvar))
4372 const unsigned int ivn = iv.number();
4373 const unsigned int jvn = jv.number();
4384 const unsigned int i = ivar - ivn;
4385 const unsigned int j = jvar - jvn;
4387 auto dc = dof_indices;
4388 auto dn = neighbor_dof_indices;
4389 auto cndof = dc.size();
4390 auto nndof = dn.size();
4392 unsigned int jj = j;
4396 auto suben = ken.
sub_matrix(i * cndof, cndof, jj * nndof, nndof);
4397 auto subne = kne.
sub_matrix(i * nndof, nndof, jj * cndof, cndof);
4398 auto subnn = knn.
sub_matrix(i * nndof, nndof, jj * nndof, nndof);
4405 dof_map.constrain_element_matrix(suben, dc, dn,
false);
4406 dof_map.constrain_element_matrix(subne, dn, dc,
false);
4407 dof_map.constrain_element_matrix(subnn, dn, dn,
false);
4410 if (scaling_factor[i] != 1.0)
4412 suben *= scaling_factor[i];
4413 subne *= scaling_factor[i];
4414 subnn *= scaling_factor[i];
4417 jacobian.add_matrix(suben, dc, dn);
4418 jacobian.add_matrix(subne, dn, dc);
4419 jacobian.add_matrix(subnn, dn, dn);
4424 const unsigned int ivar,
4425 const unsigned int jvar,
4426 const DofMap & dof_map,
4427 std::vector<dof_id_type> & dof_indices,
4428 std::vector<dof_id_type> & neighbor_dof_indices,
4430 const std::set<TagID> & tags)
4432 for (
const auto tag : tags)
4434 jacobian, ivar, jvar, dof_map, dof_indices, neighbor_dof_indices,
GlobalDataKey{}, tag);
4449 for (
const auto & var_j :
vars)
4455 numeric_index_type i, numeric_index_type j, Real value,
LocalDataKey,
TagID tag)
4464 numeric_index_type j,
4467 const std::set<TagID> & tags)
4469 for (
auto tag : tags)
4518 mooseAssert(
_xfem !=
nullptr,
"This function should not be called if xfem is inactive");
4527 "Size of weight multipliers in xfem doesn't match number of quadrature points");
4528 for (
unsigned i = 0; i < xfem_weight_multipliers.
size(); i++)
4531 xfem_weight_multipliers.
release();
4538 mooseAssert(
_xfem !=
nullptr,
"This function should not be called if xfem is inactive");
4544 if (
_xfem->getXFEMFaceWeights(
4548 "Size of weight multipliers in xfem doesn't match number of quadrature points");
4549 for (
unsigned i = 0; i < xfem_face_weight_multipliers.
size(); i++)
4552 xfem_face_weight_multipliers.
release();
4568 for (MooseIndex(weights.size()) i = 0; i < weights.size(); ++i)
4574Assembly::fePhi<VectorValue<Real>>(FEType type)
const
4576 buildVectorFE(type);
4577 return _vector_fe_shape_data[type]->_phi;
4582Assembly::feGradPhi<VectorValue<Real>>(FEType type)
const
4584 buildVectorFE(type);
4585 return _vector_fe_shape_data[type]->_grad_phi;
4590Assembly::feSecondPhi<VectorValue<Real>>(FEType type)
const
4592 _need_second_derivative.insert(type);
4593 buildVectorFE(type);
4594 return _vector_fe_shape_data[type]->_second_phi;
4599Assembly::fePhiLower<VectorValue<Real>>(FEType type)
const
4601 buildVectorLowerDFE(type);
4602 return _vector_fe_shape_data_lower[type]->_phi;
4607Assembly::feDualPhiLower<VectorValue<Real>>(FEType type)
const
4609 buildVectorDualLowerDFE(type);
4610 return _vector_fe_shape_data_dual_lower[type]->_phi;
4615Assembly::feGradPhiLower<VectorValue<Real>>(FEType type)
const
4617 buildVectorLowerDFE(type);
4618 return _vector_fe_shape_data_lower[type]->_grad_phi;
4623Assembly::feGradDualPhiLower<VectorValue<Real>>(FEType type)
const
4625 buildVectorDualLowerDFE(type);
4626 return _vector_fe_shape_data_dual_lower[type]->_grad_phi;
4631Assembly::fePhiFace<VectorValue<Real>>(FEType type)
const
4633 buildVectorFaceFE(type);
4634 return _vector_fe_shape_data_face[type]->_phi;
4639Assembly::feGradPhiFace<VectorValue<Real>>(FEType type)
const
4641 buildVectorFaceFE(type);
4642 return _vector_fe_shape_data_face[type]->_grad_phi;
4647Assembly::feSecondPhiFace<VectorValue<Real>>(FEType type)
const
4649 _need_second_derivative.insert(type);
4650 buildVectorFaceFE(type);
4655 buildVectorFaceNeighborFE(type);
4657 return _vector_fe_shape_data_face[type]->_second_phi;
4662Assembly::fePhiNeighbor<VectorValue<Real>>(FEType type)
const
4664 buildVectorNeighborFE(type);
4665 return _vector_fe_shape_data_neighbor[type]->_phi;
4670Assembly::feGradPhiNeighbor<VectorValue<Real>>(FEType type)
const
4672 buildVectorNeighborFE(type);
4673 return _vector_fe_shape_data_neighbor[type]->_grad_phi;
4678Assembly::feSecondPhiNeighbor<VectorValue<Real>>(FEType type)
const
4680 _need_second_derivative_neighbor.insert(type);
4681 buildVectorNeighborFE(type);
4682 return _vector_fe_shape_data_neighbor[type]->_second_phi;
4687Assembly::fePhiFaceNeighbor<VectorValue<Real>>(FEType type)
const
4689 buildVectorFaceNeighborFE(type);
4690 return _vector_fe_shape_data_face_neighbor[type]->_phi;
4695Assembly::feGradPhiFaceNeighbor<VectorValue<Real>>(FEType type)
const
4697 buildVectorFaceNeighborFE(type);
4698 return _vector_fe_shape_data_face_neighbor[type]->_grad_phi;
4703Assembly::feSecondPhiFaceNeighbor<VectorValue<Real>>(FEType type)
const
4705 _need_second_derivative_neighbor.insert(type);
4706 buildVectorFaceNeighborFE(type);
4707 return _vector_fe_shape_data_face_neighbor[type]->_second_phi;
4712Assembly::feCurlPhi<VectorValue<Real>>(FEType type)
const
4714 _need_curl.insert(type);
4715 buildVectorFE(type);
4716 return _vector_fe_shape_data[type]->_curl_phi;
4721Assembly::feCurlPhiFace<VectorValue<Real>>(FEType type)
const
4723 _need_curl.insert(type);
4724 buildVectorFaceFE(type);
4729 buildVectorFaceNeighborFE(type);
4731 return _vector_fe_shape_data_face[type]->_curl_phi;
4736Assembly::feCurlPhiNeighbor<VectorValue<Real>>(FEType type)
const
4738 _need_curl.insert(type);
4739 buildVectorNeighborFE(type);
4740 return _vector_fe_shape_data_neighbor[type]->_curl_phi;
4745Assembly::feCurlPhiFaceNeighbor<VectorValue<Real>>(FEType type)
const
4747 _need_curl.insert(type);
4748 buildVectorFaceNeighborFE(type);
4750 return _vector_fe_shape_data_face_neighbor[type]->_curl_phi;
4755Assembly::feDivPhi<VectorValue<Real>>(FEType type)
const
4757 _need_div.insert(type);
4758 buildVectorFE(type);
4759 return _vector_fe_shape_data[type]->_div_phi;
4764Assembly::feDivPhiFace<VectorValue<Real>>(FEType type)
const
4766 _need_face_div.insert(type);
4767 buildVectorFaceFE(type);
4772 buildVectorFaceNeighborFE(type);
4774 return _vector_fe_shape_data_face[type]->_div_phi;
4779Assembly::feDivPhiNeighbor<VectorValue<Real>>(FEType type)
const
4781 _need_neighbor_div.insert(type);
4782 buildVectorNeighborFE(type);
4783 return _vector_fe_shape_data_neighbor[type]->_div_phi;
4788Assembly::feDivPhiFaceNeighbor<VectorValue<Real>>(FEType type)
const
4790 _need_face_neighbor_div.insert(type);
4791 buildVectorFaceNeighborFE(type);
4792 return _vector_fe_shape_data_face_neighbor[type]->_div_phi;
4800 const FEType helper_type(helper_order, LAGRANGE);
4803 feSecondPhi<Real>(helper_type);
4804 feSecondPhiFace<Real>(helper_type);
4849 const FEType helper_type(helper_order, LAGRANGE);
4851 [&disable_families](
const unsigned int num_dimensionalities,
auto & fe_container)
4853 if (!disable_families.empty())
4854 for (
const auto dim : make_range(num_dimensionalities))
4856 auto fe_container_it = fe_container.find(
dim);
4857 if (fe_container_it != fe_container.end())
4858 for (
auto & [fe_type, fe_ptr] : fe_container_it->second)
4859 if (disable_families.count(fe_type.family))
4860 fe_ptr->add_p_level_in_reinit(
false);
4863 auto process_fe_and_helpers = [process_fe, &helper_type](
auto & unique_helper_container,
4864 auto & helper_container,
4865 const unsigned int num_dimensionalities,
4866 const bool user_added_helper_type,
4867 auto & fe_container)
4869 unique_helper_container.resize(num_dimensionalities);
4870 for (
const auto dim : make_range(num_dimensionalities))
4872 auto & unique_helper = unique_helper_container[
dim];
4873 unique_helper = FEGenericBase<Real>::build(
dim, helper_type);
4875 unique_helper->add_p_level_in_reinit(
false);
4876 helper_container[
dim] = unique_helper.get();
4881 if (!user_added_helper_type)
4883 auto & fe_container_dim = libmesh_map_find(fe_container,
dim);
4884 auto fe_it = fe_container_dim.find(helper_type);
4885 mooseAssert(fe_it != fe_container_dim.end(),
"We should have the helper type");
4886 delete fe_it->second;
4887 fe_container_dim.erase(fe_it);
4891 process_fe(num_dimensionalities, fe_container);
4934 const Point & point,
4944 const Point & point,
4955Assembly::genericQPoints<false>()
const
4962Assembly::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.
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.
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
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.
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.
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.
void havePRefinement(const std::unordered_set< FEFamily > &disable_p_refinement_for_families)
Indicate that we have p-refinement.
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
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>
const NumericVector< Real > * _scaling_vector
The map from global index to variable scaling factor.
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
bool _have_p_refinement
Whether we have ever conducted p-refinement.
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 hasScalingVector()
signals this object that a vector containing variable scaling factors should be used when doing resid...
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.
Class for scalar variables (they are different).
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
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