18 #include "smith/smith_config.hpp"
20 #ifdef SMITH_USE_TRIBOL
22 #include "tribol/interface/tribol.hpp"
45 class FiniteElementState;
55 class ContactConstraint :
public Constraint {
67 ContactConstraint(
int interaction_id,
const mfem::ParMesh& mesh,
const std::set<int>& bdry_attr_surf1,
68 const std::set<int>& bdry_attr_surf2, ContactOptions contact_opts,
69 const std::string& name =
"contact_constraint")
70 : Constraint(name), contact_(mesh), contact_opts_{contact_opts}
73 contact_.addContactInteraction(interaction_id, bdry_attr_surf1, bdry_attr_surf2, contact_opts_);
74 interaction_id_ = interaction_id;
78 virtual ~ContactConstraint() {}
88 mfem::Vector evaluate([[maybe_unused]]
double time, [[maybe_unused]]
double dt,
89 [[maybe_unused]]
const std::vector<ConstFieldPtr>& fields)
const
91 contact_.setDisplacements(*fields[ContactFields::SHAPE], *fields[ContactFields::DISP]);
92 tribol::setLagrangeMultiplierOptions(interaction_id_, tribol::ImplicitEvalMode::MORTAR_GAP);
96 contact_.update(cycle, time, dt);
97 auto gaps_hpv = contact_.mergedGaps(
false);
100 mfem::Vector gaps = gaps_hpv;
112 std::unique_ptr<mfem::HypreParMatrix> jacobian([[maybe_unused]]
double time, [[maybe_unused]]
double dt,
113 [[maybe_unused]]
const std::vector<ConstFieldPtr>& fields,
114 [[maybe_unused]]
int direction)
const
116 contact_.setDisplacements(*fields[ContactFields::SHAPE], *fields[ContactFields::DISP]);
117 tribol::setLagrangeMultiplierOptions(interaction_id_, tribol::ImplicitEvalMode::MORTAR_JACOBIAN);
120 contact_.update(cycle, time, dt);
121 auto J_contact = contact_.mergedJacobian();
122 J_contact->owns_blocks =
false;
126 for (
int i = 0; i < 2; i++) {
127 for (
int j = 0; j < 2; j++) {
128 if (i == iblock && j == jblock) {
131 if (!J_contact->IsZeroBlock(i, j)) {
132 delete &J_contact->GetBlock(i, j);
137 SLIC_ERROR_IF(J_contact->IsZeroBlock(iblock, jblock),
"attempting to extract a null block");
138 auto dgdu =
dynamic_cast<mfem::HypreParMatrix*
>(&J_contact->GetBlock(iblock, jblock));
139 std::unique_ptr<mfem::HypreParMatrix> dgdu_unique(dgdu);
147 mutable ContactData contact_;
152 ContactOptions contact_opts_;
Specifies interface for evaluating distributed constriants from fields as well as their Jacobians and...
Defines common types and helper functions for using the residual and scalar_objective classes.
Accelerator functionality.