44#ifndef SRC_NIMBLE_CONTACT_INTERFACE_H_
45#define SRC_NIMBLE_CONTACT_INTERFACE_H_
51#ifdef NIMBLE_HAVE_KOKKOS
57#ifdef NIMBLE_HAVE_KOKKOS
59struct KokkosPenaltyContactEnforcement
61 KokkosPenaltyContactEnforcement() : penalty(0.0) {}
63 ~KokkosPenaltyContactEnforcement() =
default;
65 KOKKOS_FORCEINLINE_FUNCTION
72 const double direction[3],
73 const double closest_pt[3])
const
76 double contact_force[3]{};
77 const double scale = penalty * gap / numNodeFaces;
78 for (
int i = 0; i < 3; ++i) { contact_force[i] = scale * direction[i]; }
79 face.ComputeNodalContactForces(contact_force, closest_pt);
80 for (
double& ff : contact_force) { ff *= -1.0; }
81 node.ComputeNodalContactForces(contact_force, closest_pt);
82 node.ScatterForceToContactManagerForceVector(contact_manager_force);
83 face.ScatterForceToContactManagerForceVector(contact_manager_force);
102#ifdef NIMBLE_HAVE_KOKKOS
103 enforcement.penalty = penalty_param;
107#ifdef NIMBLE_HAVE_KOKKOS
112 enforcement.contact_manager_force = contact_manager_force;
121 ZeroContactForces(contact_manager_force);
122 enforcement.contact_manager_force = contact_manager_force;
123 DoSearchAndEnforcement(contact_nodes, contact_faces, enforcement);
130 Kokkos::deep_copy(contact_manager_force, 0.0);
134 DoSearchAndEnforcement(
137 KokkosPenaltyContactEnforcement contact_enforcement)
139 std::cerr <<
"Warning: running no-op contact---no interface enabled!" << std::endl;
142 KOKKOS_FORCEINLINE_FUNCTION
144 EnforceNodeFaceInteraction(
149 const double direction[3],
150 const double closest_pt[3])
const
152 if (gap < 0.0) { enforcement.EnforceContact(node, face, numNodeFaces, gap, direction, closest_pt); }
156 KokkosPenaltyContactEnforcement enforcement;
Kokkos::View< nimble::ContactEntity *, nimble_kokkos::kokkos_layout, nimble_kokkos::kokkos_device > DeviceContactEntityArrayView
Definition nimble_kokkos_contact_defs.h:15
Field< FieldType::DeviceScalarNode >::View DeviceScalarNodeView
Definition nimble_kokkos_defs.h:582
Definition kokkos_contact_manager.h:49