@@ -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