@@ -16,7 +16,7 @@ void TangentialCollisions::build_for_smooth_contact(
1616 const CollisionMesh& mesh,
1717 const Eigen::MatrixXd& vertices,
1818 const SmoothCollisions<dim>& collisions,
19- const ParameterType & params,
19+ const ParameterType& params,
2020 const double barrier_stiffness,
2121 const Eigen::VectorXd& mus,
2222 const std::function<double (double , double )>& blend_mu)
@@ -34,66 +34,93 @@ void TangentialCollisions::build_for_smooth_contact(
3434 // FC_vv.reserve(C_vv.size());
3535 for (size_t i = 0 ; i < collisions.size (); i++) {
3636 const auto & cc = collisions[i];
37- Eigen::VectorXd contact_potential_grad = cc.gradient (cc.dof (vertices, edges, faces), params);
38- const double contact_force = barrier_stiffness * contact_potential_grad.norm ();
37+ Eigen::VectorXd contact_potential_grad =
38+ cc.gradient (cc.dof (vertices, edges, faces), params);
39+ const double contact_force =
40+ barrier_stiffness * contact_potential_grad.norm ();
3941
40- if constexpr (dim == 3 )
41- {
42+ if constexpr (dim == 3 ) {
4243 TangentialCollision* ptr = nullptr ;
43- if (const auto cvv = dynamic_cast <const SmoothCollisionTemplate<max_vert_3d, Point3, Point3> *>(&cc))
44- {
45- Eigen::VectorXd collision_points = cvv->core_dof (vertices, edges, faces);
44+ if (const auto cvv = dynamic_cast <const SmoothCollisionTemplate<
45+ max_vert_3d, Point3, Point3>*>(&cc)) {
46+ Eigen::VectorXd collision_points =
47+ cvv->core_dof (vertices, edges, faces);
4648 FC_vv.emplace_back (
47- VertexVertexNormalCollision (cc[0 ], cc[1 ], 1 ., Eigen::SparseVector<double >()), collision_points, contact_force);
48- const auto & [v0i, v1i, _, __] = FC_vv.back ().vertex_ids (edges, faces);
49+ VertexVertexNormalCollision (
50+ cc[0 ], cc[1 ], 1 ., Eigen::SparseVector<double >()),
51+ collision_points, contact_force);
52+ const auto & [v0i, v1i, _, __] =
53+ FC_vv.back ().vertex_ids (edges, faces);
4954
5055 FC_vv.back ().mu = blend_mu (mus (v0i), mus (v1i));
5156 ptr = &(FC_vv.back ());
52- }
53- else if (const auto cev = dynamic_cast <const SmoothCollisionTemplate<max_vert_3d, Edge3, Point3> *>(&cc))
54- {
55- Eigen::VectorXd collision_points = cev->core_dof (vertices, edges, faces);
56- collision_points = collision_points ({6 ,7 ,8 ,0 ,1 ,2 ,3 ,4 ,5 }).eval (); // {edge, point} -> {point, edge}
57+ } else if (
58+ const auto cev = dynamic_cast <
59+ const SmoothCollisionTemplate<max_vert_3d, Edge3, Point3>*>(
60+ &cc)) {
61+ Eigen::VectorXd collision_points =
62+ cev->core_dof (vertices, edges, faces);
63+ collision_points =
64+ collision_points ({ 6 , 7 , 8 , 0 , 1 , 2 , 3 , 4 , 5 })
65+ .eval (); // {edge, point} -> {point, edge}
5766 FC_ev.emplace_back (
58- EdgeVertexNormalCollision (cc[0 ], cc[1 ], 1 ., Eigen::SparseVector<double >()), collision_points, contact_force);
59- const auto & [vi, e0i, e1i, _] = FC_ev.back ().vertex_ids (edges, faces);
67+ EdgeVertexNormalCollision (
68+ cc[0 ], cc[1 ], 1 ., Eigen::SparseVector<double >()),
69+ collision_points, contact_force);
70+ const auto & [vi, e0i, e1i, _] =
71+ FC_ev.back ().vertex_ids (edges, faces);
6072
6173 const double edge_mu =
62- (mus (e1i) - mus (e0i)) * FC_ev.back ().closest_point [0 ] + mus (e0i);
74+ (mus (e1i) - mus (e0i)) * FC_ev.back ().closest_point [0 ]
75+ + mus (e0i);
6376 FC_ev.back ().mu = blend_mu (edge_mu, mus (vi));
6477 ptr = &(FC_ev.back ());
65- }
66- else if (const auto cee = dynamic_cast <const SmoothCollisionTemplate<max_vert_3d, Edge3, Edge3> *>(&cc))
67- {
68- Eigen::VectorXd collision_points = cee->core_dof (vertices, edges, faces);
78+ } else if (
79+ const auto cee = dynamic_cast <
80+ const SmoothCollisionTemplate<max_vert_3d, Edge3, Edge3>*>(
81+ &cc)) {
82+ Eigen::VectorXd collision_points =
83+ cee->core_dof (vertices, edges, faces);
6984 const auto vert_ids = cee->core_vertex_ids (edges, faces);
7085 const Eigen::Vector3d ea0 = vertices.row (vert_ids[0 ]);
7186 const Eigen::Vector3d ea1 = vertices.row (vert_ids[1 ]);
7287 const Eigen::Vector3d eb0 = vertices.row (vert_ids[2 ]);
7388 const Eigen::Vector3d eb1 = vertices.row (vert_ids[3 ]);
7489
7590 // Skip EE collisions that are close to parallel
76- if (edge_edge_cross_squarednorm (ea0, ea1, eb0, eb1) < edge_edge_mollifier_threshold (ea0, ea1, eb0, eb1)) {
91+ if (edge_edge_cross_squarednorm (ea0, ea1, eb0, eb1)
92+ < edge_edge_mollifier_threshold (ea0, ea1, eb0, eb1)) {
7793 continue ;
7894 }
7995
8096 FC_ee.emplace_back (
81- EdgeEdgeNormalCollision (cc[0 ], cc[1 ], 0 ., EdgeEdgeDistanceType::EA_EB), collision_points, contact_force);
82-
83- double ea_mu =
84- (mus (vert_ids[1 ]) - mus (vert_ids[0 ])) * FC_ee.back ().closest_point [0 ] + mus (vert_ids[0 ]);
85- double eb_mu =
86- (mus (vert_ids[3 ]) - mus (vert_ids[2 ])) * FC_ee.back ().closest_point [1 ] + mus (vert_ids[2 ]);
97+ EdgeEdgeNormalCollision (
98+ cc[0 ], cc[1 ], 0 ., EdgeEdgeDistanceType::EA_EB),
99+ collision_points, contact_force);
100+
101+ double ea_mu = (mus (vert_ids[1 ]) - mus (vert_ids[0 ]))
102+ * FC_ee.back ().closest_point [0 ]
103+ + mus (vert_ids[0 ]);
104+ double eb_mu = (mus (vert_ids[3 ]) - mus (vert_ids[2 ]))
105+ * FC_ee.back ().closest_point [1 ]
106+ + mus (vert_ids[2 ]);
87107 FC_ee.back ().mu = blend_mu (ea_mu, eb_mu);
88108 ptr = &(FC_ee.back ());
89- }
90- else if (const auto cfv = dynamic_cast <const SmoothCollisionTemplate<max_vert_3d, Face, Point3> *>(&cc))
91- {
92- Eigen::VectorXd collision_points = cfv->core_dof (vertices, edges, faces);
93- collision_points = collision_points ({9 ,10 ,11 ,0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 }).eval (); // {face, point} -> {point, face}
109+ } else if (
110+ const auto cfv = dynamic_cast <
111+ const SmoothCollisionTemplate<max_vert_3d, Face, Point3>*>(
112+ &cc)) {
113+ Eigen::VectorXd collision_points =
114+ cfv->core_dof (vertices, edges, faces);
115+ collision_points =
116+ collision_points ({ 9 , 10 , 11 , 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 })
117+ .eval (); // {face, point} -> {point, face}
94118 FC_fv.emplace_back (
95- FaceVertexNormalCollision (cc[0 ], cc[1 ], 1 ., Eigen::SparseVector<double >()), collision_points, contact_force);
96- const auto & [vi, f0i, f1i, f2i] = FC_fv.back ().vertex_ids (edges, faces);
119+ FaceVertexNormalCollision (
120+ cc[0 ], cc[1 ], 1 ., Eigen::SparseVector<double >()),
121+ collision_points, contact_force);
122+ const auto & [vi, f0i, f1i, f2i] =
123+ FC_fv.back ().vertex_ids (edges, faces);
97124
98125 double face_mu = mus (f0i)
99126 + FC_fv.back ().closest_point [0 ] * (mus (f1i) - mus (f0i))
@@ -103,30 +130,40 @@ void TangentialCollisions::build_for_smooth_contact(
103130 }
104131 if (ptr)
105132 ptr->smooth_collision_3d = collisions.collisions [i];
106- }
107- else
108- {
133+ } else {
109134 TangentialCollision* ptr = nullptr ;
110- if (const auto cvv = dynamic_cast <const SmoothCollisionTemplate<max_vert_2d, Point2, Point2> *>(&cc))
111- {
112- Eigen::VectorXd collision_points = cvv->core_dof (vertices, edges, faces);
135+ if (const auto cvv = dynamic_cast <const SmoothCollisionTemplate<
136+ max_vert_2d, Point2, Point2>*>(&cc)) {
137+ Eigen::VectorXd collision_points =
138+ cvv->core_dof (vertices, edges, faces);
113139 FC_vv.emplace_back (
114- VertexVertexNormalCollision (cc[0 ], cc[1 ], 1 ., Eigen::SparseVector<double >()), collision_points, contact_force);
115- const auto & [v0i, v1i, _, __] = FC_vv.back ().vertex_ids (edges, faces);
140+ VertexVertexNormalCollision (
141+ cc[0 ], cc[1 ], 1 ., Eigen::SparseVector<double >()),
142+ collision_points, contact_force);
143+ const auto & [v0i, v1i, _, __] =
144+ FC_vv.back ().vertex_ids (edges, faces);
116145
117146 FC_vv.back ().mu = blend_mu (mus (v0i), mus (v1i));
118147 ptr = &(FC_vv.back ());
119- }
120- else if (const auto cev = dynamic_cast <const SmoothCollisionTemplate<max_vert_2d, Edge2, Point2> *>(&cc))
121- {
122- Eigen::VectorXd collision_points = cev->core_dof (vertices, edges, faces);
123- collision_points = collision_points ({4 ,5 ,0 ,1 ,2 ,3 }).eval (); // {edge, point} -> {point, edge}
148+ } else if (
149+ const auto cev = dynamic_cast <
150+ const SmoothCollisionTemplate<max_vert_2d, Edge2, Point2>*>(
151+ &cc)) {
152+ Eigen::VectorXd collision_points =
153+ cev->core_dof (vertices, edges, faces);
154+ collision_points =
155+ collision_points ({ 4 , 5 , 0 , 1 , 2 , 3 })
156+ .eval (); // {edge, point} -> {point, edge}
124157 FC_ev.emplace_back (
125- EdgeVertexNormalCollision (cc[0 ], cc[1 ], 1 ., Eigen::SparseVector<double >()), collision_points, contact_force);
126- const auto & [vi, e0i, e1i, _] = FC_ev.back ().vertex_ids (edges, faces);
158+ EdgeVertexNormalCollision (
159+ cc[0 ], cc[1 ], 1 ., Eigen::SparseVector<double >()),
160+ collision_points, contact_force);
161+ const auto & [vi, e0i, e1i, _] =
162+ FC_ev.back ().vertex_ids (edges, faces);
127163
128164 const double edge_mu =
129- (mus (e1i) - mus (e0i)) * FC_ev.back ().closest_point [0 ] + mus (e0i);
165+ (mus (e1i) - mus (e0i)) * FC_ev.back ().closest_point [0 ]
166+ + mus (e0i);
130167 FC_ev.back ().mu = blend_mu (edge_mu, mus (vi));
131168 ptr = &(FC_ev.back ());
132169 }
@@ -136,22 +173,20 @@ void TangentialCollisions::build_for_smooth_contact(
136173 }
137174}
138175
139- template
140- void TangentialCollisions::build_for_smooth_contact<2 >(
176+ template void TangentialCollisions::build_for_smooth_contact<2 >(
141177 const CollisionMesh& mesh,
142178 const Eigen::MatrixXd& vertices,
143179 const SmoothCollisions<2 >& collisions,
144- const ParameterType & params,
180+ const ParameterType& params,
145181 const double barrier_stiffness,
146182 const Eigen::VectorXd& mus,
147183 const std::function<double (double , double )>& blend_mu);
148184
149- template
150- void TangentialCollisions::build_for_smooth_contact<3 >(
185+ template void TangentialCollisions::build_for_smooth_contact<3 >(
151186 const CollisionMesh& mesh,
152187 const Eigen::MatrixXd& vertices,
153188 const SmoothCollisions<3 >& collisions,
154- const ParameterType & params,
189+ const ParameterType& params,
155190 const double barrier_stiffness,
156191 const Eigen::VectorXd& mus,
157192 const std::function<double (double , double )>& blend_mu);
0 commit comments