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