181 const std::array<T, N> & augmented_tangential_pressure,
185 const T weight = std::max(
radius, augmented_norm);
187 return tangential_pressure;
189 std::array<T, N> residual;
190 for (
const auto i : index_range(residual))
191 residual[i] = weight * tangential_pressure[i] -
radius * augmented_tangential_pressure[i];
259 const std::array<T, N> & tangential_velocity,
262 const T & normal_pressure,
263 const T & scaled_normal_gap,
264 const T & friction_coefficient,
268 std::array<T, N> augmented_tangential_pressure;
269 for (
const auto i : index_range(augmented_tangential_pressure))
270 augmented_tangential_pressure[i] = tangential_pressure[i] + c_t * tangential_velocity[i] * dt;
275 switch (projection_degree)
279 tangential_pressure, augmented_tangential_pressure,
radius, normal_pressure, epsilon);
282 tangential_pressure, augmented_tangential_pressure,
radius, normal_pressure, epsilon);
301 const Parallel::Communicator & communicator,
302 const bool send_data_back)
304 libmesh_parallel_only(communicator);
305 const auto our_proc_id = communicator.rank();
308 using Datum = std::pair<dof_id_type, T>;
309 std::unordered_map<processor_id_type, std::vector<Datum>> push_data;
311 for (
auto & pr : dof_map)
313 const auto *
const dof_object = pr.first;
314 const auto proc_id = dof_object->processor_id();
315 if (proc_id == our_proc_id)
318 push_data[proc_id].push_back(std::make_pair(dof_object->id(), std::move(pr.second)));
321 const auto & lm_mesh =
mesh.getMesh();
322 std::unordered_map<processor_id_type, std::vector<const DofObject *>>
323 pid_to_dof_object_for_sending_back;
325 auto action_functor =
326 [nodal, our_proc_id, &lm_mesh, &dof_map, &pid_to_dof_object_for_sending_back, send_data_back](
327 const processor_id_type pid,
const std::vector<Datum> & sent_data)
329 mooseAssert(pid != our_proc_id,
"We do not send messages to ourself here");
330 libmesh_ignore(our_proc_id);
332 for (
auto & pr : sent_data)
334 const auto dof_id = pr.first;
335 const auto *
const dof_object = nodal ? cast_ptr<const DofObject *>(lm_mesh.node_ptr(dof_id))
336 : cast_ptr<const DofObject *>(lm_mesh.elem_ptr(dof_id));
337 mooseAssert(dof_object,
"This should be non-null");
340 pid_to_dof_object_for_sending_back[pid].push_back(dof_object);
342 dof_map[dof_object][0] += pr.second[0];
343 dof_map[dof_object][1] += pr.second[1];
353 std::unordered_map<processor_id_type, std::vector<Datum>> push_back_data;
355 for (
const auto & [pid, dof_objects] : pid_to_dof_object_for_sending_back)
357 auto & pid_send_data = push_back_data[pid];
358 pid_send_data.reserve(dof_objects.size());
359 for (
const DofObject *
const dof_object : dof_objects)
361 const auto & [tangent_one, tangent_two] = libmesh_map_find(dof_map, dof_object);
362 pid_send_data.push_back({dof_object->id(), {tangent_one, tangent_two}});
366 auto sent_back_action_functor =
367 [nodal, our_proc_id, &lm_mesh, &dof_map](
const processor_id_type libmesh_dbg_var(pid),
368 const std::vector<Datum> & sent_data)
370 mooseAssert(pid != our_proc_id,
"We do not send messages to ourself here");
371 libmesh_ignore(our_proc_id);
373 for (
auto & [dof_id, tangents] : sent_data)
375 const auto *
const dof_object = nodal ? cast_ptr<const DofObject *>(lm_mesh.node_ptr(dof_id))
376 : cast_ptr<const DofObject *>(lm_mesh.elem_ptr(dof_id));
377 mooseAssert(dof_object,
"This should be non-null");
378 auto & [our_tangent_one, our_tangent_two] = dof_map[dof_object];
379 our_tangent_one = tangents[0];
380 our_tangent_two = tangents[1];
396communicateR2T(std::unordered_map<const DofObject *, ADRankTwoTensor> & dof_map_adr2t,
399 const Parallel::Communicator & communicator,
400 const bool send_data_back)
402 libmesh_parallel_only(communicator);
403 const auto our_proc_id = communicator.rank();
406 using Datum = std::pair<dof_id_type, ADRankTwoTensor>;
407 std::unordered_map<processor_id_type, std::vector<Datum>> push_data;
409 for (
auto & pr : dof_map_adr2t)
411 const auto *
const dof_object = pr.first;
412 const auto proc_id = dof_object->processor_id();
413 if (proc_id == our_proc_id)
416 push_data[proc_id].push_back(std::make_pair(dof_object->id(), std::move(pr.second)));
419 const auto & lm_mesh =
mesh.getMesh();
420 std::unordered_map<processor_id_type, std::vector<const DofObject *>>
421 pid_to_dof_object_for_sending_back;
423 auto action_functor =
428 &pid_to_dof_object_for_sending_back,
429 send_data_back](
const processor_id_type pid,
const std::vector<Datum> & sent_data)
431 mooseAssert(pid != our_proc_id,
"We do not send messages to ourself here");
432 libmesh_ignore(our_proc_id);
434 for (
auto & pr : sent_data)
436 const auto dof_id = pr.first;
437 const auto *
const dof_object = nodal ? cast_ptr<const DofObject *>(lm_mesh.node_ptr(dof_id))
438 : cast_ptr<const DofObject *>(lm_mesh.elem_ptr(dof_id));
439 mooseAssert(dof_object,
"This should be non-null");
442 pid_to_dof_object_for_sending_back[pid].push_back(dof_object);
444 for (
const auto i : make_range(3))
445 for (
const auto j : make_range(3))
446 dof_map_adr2t[dof_object](i, j) += pr.second(i, j);
456 std::unordered_map<processor_id_type, std::vector<Datum>> push_back_data;
458 for (
const auto & [pid, dof_objects] : pid_to_dof_object_for_sending_back)
460 auto & pid_send_data = push_back_data[pid];
461 pid_send_data.reserve(dof_objects.size());
462 for (
const DofObject *
const dof_object : dof_objects)
464 const auto & r2t = libmesh_map_find(dof_map_adr2t, dof_object);
465 pid_send_data.push_back({dof_object->id(), r2t});
469 auto sent_back_action_functor =
470 [nodal, our_proc_id, &lm_mesh, &dof_map_adr2t](
const processor_id_type libmesh_dbg_var(pid),
471 const std::vector<Datum> & sent_data)
473 mooseAssert(pid != our_proc_id,
"We do not send messages to ourself here");
474 libmesh_ignore(our_proc_id);
476 for (
auto & [dof_id, r2t_sent] : sent_data)
478 const auto *
const dof_object = nodal ? cast_ptr<const DofObject *>(lm_mesh.node_ptr(dof_id))
479 : cast_ptr<const DofObject *>(lm_mesh.elem_ptr(dof_id));
480 mooseAssert(dof_object,
"This should be non-null");
481 auto & r2t = dof_map_adr2t[dof_object];
494 const Parallel::Communicator & communicator,
495 const bool send_data_back)
497 libmesh_parallel_only(communicator);
498 const auto our_proc_id = communicator.rank();
501 using Datum = std::tuple<dof_id_type, T>;
502 std::unordered_map<processor_id_type, std::vector<Datum>> push_data;
504 for (
auto & pr : dof_to_adreal)
506 const auto *
const dof_object = pr.first;
507 const auto proc_id = dof_object->processor_id();
508 if (proc_id == our_proc_id)
511 push_data[proc_id].push_back(std::make_tuple(dof_object->id(), std::move(pr.second)));
514 const auto & lm_mesh =
mesh.getMesh();
515 std::unordered_map<processor_id_type, std::vector<const DofObject *>>
516 pid_to_dof_object_for_sending_back;
518 auto action_functor =
523 &pid_to_dof_object_for_sending_back,
524 send_data_back](
const processor_id_type pid,
const std::vector<Datum> & sent_data)
526 mooseAssert(pid != our_proc_id,
"We do not send messages to ourself here");
527 libmesh_ignore(our_proc_id);
529 for (
auto & [dof_id, weighted_gap] : sent_data)
531 const auto *
const dof_object = nodal ? cast_ptr<const DofObject *>(lm_mesh.node_ptr(dof_id))
532 : cast_ptr<const DofObject *>(lm_mesh.elem_ptr(dof_id));
533 mooseAssert(dof_object,
"This should be non-null");
535 pid_to_dof_object_for_sending_back[pid].push_back(dof_object);
536 auto & our_adreal = dof_to_adreal[dof_object];
537 our_adreal += weighted_gap;
547 std::unordered_map<processor_id_type, std::vector<Datum>> push_back_data;
549 for (
const auto & [pid, dof_objects] : pid_to_dof_object_for_sending_back)
551 auto & pid_send_data = push_back_data[pid];
552 pid_send_data.reserve(dof_objects.size());
553 for (
const DofObject *
const dof_object : dof_objects)
555 const auto & our_adreal = libmesh_map_find(dof_to_adreal, dof_object);
556 pid_send_data.push_back(std::make_tuple(dof_object->id(), our_adreal));
560 auto sent_back_action_functor =
561 [nodal, our_proc_id, &lm_mesh, &dof_to_adreal](
const processor_id_type libmesh_dbg_var(pid),
562 const std::vector<Datum> & sent_data)
564 mooseAssert(pid != our_proc_id,
"We do not send messages to ourself here");
565 libmesh_ignore(our_proc_id);
567 for (
auto & [dof_id, adreal] : sent_data)
569 const auto *
const dof_object = nodal ? cast_ptr<const DofObject *>(lm_mesh.node_ptr(dof_id))
570 : cast_ptr<const DofObject *>(lm_mesh.elem_ptr(dof_id));
571 mooseAssert(dof_object,
"This should be non-null");
572 auto & our_adreal = dof_to_adreal[dof_object];