253{
254 auto model_ptr = this->data_manager_.GetModelData();
255 auto model_data = &dynamic_cast<nimble_kokkos::ModelData &>(*model_ptr);
256
257 auto field_ids = this->data_manager_.GetFieldIDs();
258 auto displacement_d = model_data->GetDeviceVectorNodeData(field_ids.displacement);
259
260 auto contact_force_h = model_data->GetHostVectorNodeData(field_ids.contact_force);
261 auto contact_force_d = model_data->GetDeviceVectorNodeData(field_ids.contact_force);
262 Kokkos::deep_copy(contact_force_d, 0.0);
263
264 this->ApplyDisplacements(displacement_d);
265
266 total_search_time.Start();
268
269
271
272 this->startTimer("BVH::SetEntity::Nodes");
274 this->stopTimer("BVH::SetEntity::Nodes");
275
276 this->startTimer("BVH::SetEntity::Faces");
278 this->stopTimer("BVH::SetEntity::Faces");
279
282
284
286 m_faces->for_each_result<NarrowphaseResult>(
287 [
this](
const NarrowphaseResult& _res) {
m_last_results.emplace_back(_res); });
288
290 total_search_time.Stop();
291
292 total_enforcement_time.Start();
293
295 if (r.node) {
296 if (r.local_index >= contact_nodes_d_.extent( 0 ))
297 std::cerr << "contact node index " << r.local_index << " is out of bounds (" << contact_nodes_d_.extent( 0 ) << ")\n";
298 auto& node = contact_nodes_d_(r.local_index);
299 node.set_contact_status(true);
300 node.SetNodalContactForces(r.contact_force);
301 node.ScatterForceToContactManagerForceVector(force_d_);
302 } else {
303 if (r.local_index >= contact_faces_d_.extent( 0 ))
304 std::cerr << "contact face index " << r.local_index << " is out of bounds (" << contact_faces_d_.extent( 0 ) << ")\n";
305 auto& face = contact_faces_d_(r.local_index);
306 face.set_contact_status(true);
307 face.SetNodalContactForces(r.contact_force, r.bary);
308 face.ScatterForceToContactManagerForceVector(force_d_);
309 }
310 }
312 total_enforcement_time.Stop();
313
314 this->GetForces(contact_force_d);
315 Kokkos::deep_copy(contact_force_h, contact_force_d);
316
317 constexpr int vector_dim = 3;
318 auto myVectorCommunicator = this->data_manager_.GetVectorCommunicator();
319 myVectorCommunicator->VectorReduction(vector_dim, contact_force_h);
320}