173 : _mci_fe_problem(*moose_object->getCheckedPointerParam<
FEProblemBase *>(
"_fe_problem_base")),
174 _mci_subproblem(*moose_object->getCheckedPointerParam<
SubProblem *>(
"_subproblem")),
175 _mci_tid(moose_object->getParam<
THREAD_ID>(
"_tid")),
176 _mci_mesh(_mci_subproblem.
mesh()),
178 _mci_assembly(_mci_subproblem.assembly(_mci_tid, 0)),
179 _mortar_data(_mci_fe_problem.mortarData()),
181 _mci_mesh.getBoundaryID(moose_object->getParam<BoundaryName>(
"secondary_boundary"))),
182 _primary_id(_mci_mesh.getBoundaryID(moose_object->getParam<BoundaryName>(
"primary_boundary"))),
183 _secondary_subdomain_id(
184 _mci_mesh.getSubdomainID(moose_object->getParam<SubdomainName>(
"secondary_subdomain"))),
185 _primary_subdomain_id(
186 _mci_mesh.getSubdomainID(moose_object->getParam<SubdomainName>(
"primary_subdomain"))),
188 _interpolate_normals(moose_object->getParam<
bool>(
"interpolate_normals")),
189 _phys_points_secondary(_mci_assembly.qPointsFace()),
190 _phys_points_primary(_mci_assembly.qPointsFaceNeighbor()),
191 _qrule_msm(_mci_assembly.qRuleMortar()),
192 _qrule_face(_mci_assembly.qRuleFace()),
193 _lower_secondary_elem(_mci_assembly.lowerDElem()),
194 _lower_primary_elem(_mci_assembly.neighborLowerDElem()),
195 _JxW_msm(_mci_assembly.jxWMortar()),
196 _msm_elem(_mci_assembly.msmElem())
198 const bool displaced = moose_object->isParamValid(
"use_displaced_mesh")
199 ? moose_object->getParam<
bool>(
"use_displaced_mesh")
201 const auto minimum_projection_angle = moose_object->getParam<Real>(
"minimum_projection_angle");
202 const auto mortar_3d_subpatch_plane =
203 moose_object->getParam<
MooseEnum>(
"mortar_3d_subpatch_plane")
204 .getEnum<Mortar3DSubpatchPlane>();
208 if (_mci_mesh.dimension() == 3 &&
209 mortar_3d_subpatch_plane == Mortar3DSubpatchPlane::GEOMETRIC_NORMAL &&
210 (minimum_projection_angle < 0.0 || minimum_projection_angle > 90.0))
211 moose_object->paramError(
"minimum_projection_angle",
212 "Must be between 0 and 90 degrees when "
213 "mortar_3d_subpatch_plane = GEOMETRIC_NORMAL.");
216 _mci_fe_problem.createMortarInterface(
217 std::make_pair(_primary_id, _secondary_id),
218 std::make_pair(_primary_subdomain_id, _secondary_subdomain_id),
220 moose_object->getParam<
bool>(
"periodic"),
221 moose_object->getParam<
bool>(
"debug_mesh"),
222 moose_object->getParam<
bool>(
"correct_edge_dropping"),
223 minimum_projection_angle,
224 mortar_3d_subpatch_plane,
225 moose_object->getParam<
MooseEnum>(
"triangulation"),
226 moose_object->getParam<
bool>(
"triangulate_triangles"),
227 moose_object->getParam<
MooseEnum>(
"mortar_3d_qp_mapping")
228 .
getEnum<Mortar3DQuadraturePointMapping>());
230 _amg = &_mci_fe_problem.getMortarInterface(
231 std::make_pair(_primary_id, _secondary_id),
232 std::make_pair(_primary_subdomain_id, _secondary_subdomain_id),
235 const auto & secondary_set = _mortar_data.getHigherDimSubdomainIDs(_secondary_subdomain_id);
236 const auto & primary_set = _mortar_data.getHigherDimSubdomainIDs(_primary_subdomain_id);
238 std::set_union(secondary_set.begin(),
242 std::inserter(_higher_dim_subdomain_ids, _higher_dim_subdomain_ids.begin()));
243 _boundary_ids = {_secondary_id, _primary_id};
259 auto md_it = dual_number.derivatives().nude_data().begin();
260 auto mi_it = dual_number.derivatives().nude_indices().begin();
262 auto d_it = dual_number.derivatives().nude_data().begin();
264 for (
auto i_it = dual_number.derivatives().nude_indices().begin();
265 i_it != dual_number.derivatives().nude_indices().end();
267 if (*i_it != remove_derivative_index)
275 std::size_t n_indices = md_it - dual_number.derivatives().nude_data().begin();
276 dual_number.derivatives().nude_indices().resize(n_indices);
277 dual_number.derivatives().nude_data().resize(n_indices);