@@ -404,8 +404,46 @@ void check_smooth_friction_force_jacobian(
404404
405405 // /////////////////////////////////////////////////////////////////////////
406406
407+ auto create_smooth_collision = [&](const CollisionMesh &fd_mesh, const Eigen::MatrixXd &fd_lagged_positions) {
408+ SmoothCollisions<dim> fd_collisions;
409+ assert (friction_collisions.size () == 1 );
410+
411+ if constexpr (dim == 3 )
412+ {
413+ auto cc = friction_collisions[0 ].smooth_collision_3d ;
414+
415+ std::shared_ptr<SmoothCollision<max_vert_3d>> fd_cc;
416+ if (cc->type () == CollisionType::EdgeEdge)
417+ fd_cc = std::make_shared<SmoothCollisionTemplate<max_vert_3d, Edge3, Edge3>>((*cc)[0 ], (*cc)[1 ], PrimitiveDistType<Edge3, Edge3>::type::AUTO, fd_mesh, params, dhat, fd_lagged_positions);
418+ else if (cc->type () == CollisionType::EdgeVertex)
419+ fd_cc = std::make_shared<SmoothCollisionTemplate<max_vert_3d, Edge3, Point3>>((*cc)[0 ], (*cc)[1 ], PrimitiveDistType<Edge3, Point3>::type::AUTO, fd_mesh, params, dhat, fd_lagged_positions);
420+ else if (cc->type () == CollisionType::VertexVertex)
421+ fd_cc = std::make_shared<SmoothCollisionTemplate<max_vert_3d, Point3, Point3>>((*cc)[0 ], (*cc)[1 ], PrimitiveDistType<Point3, Point3>::type::AUTO, fd_mesh, params, dhat, fd_lagged_positions);
422+ else if (cc->type () == CollisionType::FaceVertex)
423+ fd_cc = std::make_shared<SmoothCollisionTemplate<max_vert_3d, Face, Point3>>((*cc)[0 ], (*cc)[1 ], PrimitiveDistType<Face, Point3>::type::AUTO, fd_mesh, params, dhat, fd_lagged_positions);
424+
425+ fd_collisions.collisions .push_back (fd_cc);
426+ }
427+ else
428+ {
429+ auto cc = friction_collisions[0 ].smooth_collision_2d ;
430+
431+ std::shared_ptr<SmoothCollision<max_vert_2d>> fd_cc;
432+ if (cc->type () == CollisionType::EdgeVertex)
433+ fd_cc = std::make_shared<SmoothCollisionTemplate<max_vert_2d, Edge2, Point2>>((*cc)[0 ], (*cc)[1 ], PrimitiveDistType<Edge2, Point2>::type::AUTO, fd_mesh, params, dhat, fd_lagged_positions);
434+ else if (cc->type () == CollisionType::VertexVertex)
435+ fd_cc = std::make_shared<SmoothCollisionTemplate<max_vert_2d, Point2, Point2>>((*cc)[0 ], (*cc)[1 ], PrimitiveDistType<Point2, Point2>::type::AUTO, fd_mesh, params, dhat, fd_lagged_positions);
436+
437+ fd_collisions.collisions .push_back (fd_cc);
438+ }
439+
440+ return fd_collisions;
441+ };
442+
443+ // /////////////////////////////////////////////////////////////////////////
444+
407445 // test contact force norm derivative
408- {
446+ if constexpr (dim == 3 ) {
409447 const Eigen::MatrixXd lagged_disp = X + Ut;
410448 Eigen::MatrixXd normal_force_jacobian = Eigen::MatrixXd::Zero (friction_collisions.size (), X.size ());
411449 for (int i = 0 ; i < friction_collisions.size (); i++)
@@ -471,23 +509,7 @@ void check_smooth_friction_force_jacobian(
471509
472510 CollisionMesh fd_mesh (fd_X, mesh.edges (), mesh.faces ());
473511
474- SmoothCollisions<dim> fd_collisions;
475- {
476- CHECK (friction_collisions.size () == 1 );
477- auto cc = friction_collisions[0 ].smooth_collision_3d ;
478-
479- std::shared_ptr<SmoothCollision<max_vert_3d>> fd_cc;
480- if (cc->type () == CollisionType::EdgeEdge)
481- fd_cc = std::make_shared<SmoothCollisionTemplate<max_vert_3d, Edge3, Edge3>>((*cc)[0 ], (*cc)[1 ], PrimitiveDistType<Edge3, Edge3>::type::AUTO, fd_mesh, params, dhat, fd_lagged_positions);
482- else if (cc->type () == CollisionType::EdgeVertex)
483- fd_cc = std::make_shared<SmoothCollisionTemplate<max_vert_3d, Edge3, Point3>>((*cc)[0 ], (*cc)[1 ], PrimitiveDistType<Edge3, Point3>::type::AUTO, fd_mesh, params, dhat, fd_lagged_positions);
484- else if (cc->type () == CollisionType::VertexVertex)
485- fd_cc = std::make_shared<SmoothCollisionTemplate<max_vert_3d, Point3, Point3>>((*cc)[0 ], (*cc)[1 ], PrimitiveDistType<Point3, Point3>::type::AUTO, fd_mesh, params, dhat, fd_lagged_positions);
486- else if (cc->type () == CollisionType::FaceVertex)
487- fd_cc = std::make_shared<SmoothCollisionTemplate<max_vert_3d, Face, Point3>>((*cc)[0 ], (*cc)[1 ], PrimitiveDistType<Face, Point3>::type::AUTO, fd_mesh, params, dhat, fd_lagged_positions);
488-
489- fd_collisions.collisions .push_back (fd_cc);
490- }
512+ SmoothCollisions<dim> fd_collisions = create_smooth_collision (fd_mesh, fd_lagged_positions);
491513
492514 FrictionCollisions fd_friction_collisions;
493515 fd_friction_collisions.build_for_smooth_contact <dim>(
@@ -514,23 +536,7 @@ void check_smooth_friction_force_jacobian(
514536 Eigen::MatrixXd fd_Ut = fd::unflatten (ut, Ut.cols ());
515537 Eigen::MatrixXd fd_lagged_positions = X + fd_Ut;
516538
517- SmoothCollisions<dim> fd_collisions;
518- {
519- CHECK (friction_collisions.size () == 1 );
520- auto cc = friction_collisions[0 ].smooth_collision_3d ;
521-
522- std::shared_ptr<SmoothCollision<max_vert_3d>> fd_cc;
523- if (cc->type () == CollisionType::EdgeEdge)
524- fd_cc = std::make_shared<SmoothCollisionTemplate<max_vert_3d, Edge3, Edge3>>((*cc)[0 ], (*cc)[1 ], PrimitiveDistType<Edge3, Edge3>::type::AUTO, mesh, params, dhat, fd_lagged_positions);
525- else if (cc->type () == CollisionType::EdgeVertex)
526- fd_cc = std::make_shared<SmoothCollisionTemplate<max_vert_3d, Edge3, Point3>>((*cc)[0 ], (*cc)[1 ], PrimitiveDistType<Edge3, Point3>::type::AUTO, mesh, params, dhat, fd_lagged_positions);
527- else if (cc->type () == CollisionType::VertexVertex)
528- fd_cc = std::make_shared<SmoothCollisionTemplate<max_vert_3d, Point3, Point3>>((*cc)[0 ], (*cc)[1 ], PrimitiveDistType<Point3, Point3>::type::AUTO, mesh, params, dhat, fd_lagged_positions);
529- else if (cc->type () == CollisionType::FaceVertex)
530- fd_cc = std::make_shared<SmoothCollisionTemplate<max_vert_3d, Face, Point3>>((*cc)[0 ], (*cc)[1 ], PrimitiveDistType<Face, Point3>::type::AUTO, mesh, params, dhat, fd_lagged_positions);
531-
532- fd_collisions.collisions .push_back (fd_cc);
533- }
539+ SmoothCollisions<dim> fd_collisions = create_smooth_collision (mesh, fd_lagged_positions);
534540
535541 FrictionCollisions fd_friction_collisions;
536542 fd_friction_collisions.build_for_smooth_contact <dim>(
@@ -563,9 +569,28 @@ void check_smooth_friction_force_jacobian(
563569 CHECK ((fd_JF_wrt_V - JF_wrt_V).norm () <= 1e-7 * JF_wrt_V.norm ());
564570}
565571
566- TEST_CASE (" Smooth friction force jacobian" , " [friction-smooth][force-jacobian]" )
572+ TEST_CASE (" Smooth friction force jacobian 2D " , " [friction-smooth][force-jacobian]" )
567573{
568- SmoothFrictionData<3 > data = smooth_friction_data_generator ();
574+ SmoothFrictionData<2 > data = smooth_friction_data_generator_2d ();
575+ const auto & [V0, V1, E, F, collisions, mu, epsv_times_h, param, barrier_stiffness] =
576+ data;
577+ REQUIRE (collisions.are_shape_derivatives_enabled ());
578+
579+ Eigen::MatrixXd X, Ut, U;
580+ X = V0;
581+ Ut = V0 - X;
582+ U = V1 - X;
583+
584+ CollisionMesh mesh (X, E, F);
585+
586+ check_smooth_friction_force_jacobian<2 >(
587+ mesh, Ut, U, collisions, mu, epsv_times_h, param, barrier_stiffness,
588+ false );
589+ }
590+
591+ TEST_CASE (" Smooth friction force jacobian 3D" , " [friction-smooth][force-jacobian]" )
592+ {
593+ SmoothFrictionData<3 > data = smooth_friction_data_generator_3d ();
569594 const auto & [V0, V1, E, F, collisions, mu, epsv_times_h, param, barrier_stiffness] =
570595 data;
571596 REQUIRE (collisions.are_shape_derivatives_enabled ());
@@ -576,7 +601,6 @@ TEST_CASE("Smooth friction force jacobian", "[friction-smooth][force-jacobian]")
576601 U = V1 - X;
577602
578603 CollisionMesh mesh (X, E, F);
579- mesh.init_area_jacobians ();
580604
581605 check_smooth_friction_force_jacobian<3 >(
582606 mesh, Ut, U, collisions, mu, epsv_times_h, param, barrier_stiffness,
0 commit comments