Skip to content
This repository was archived by the owner on Oct 22, 2025. It is now read-only.

Commit cbf0f79

Browse files
committed
fix python binding and compile error
1 parent 8dda64a commit cbf0f79

File tree

6 files changed

+80
-62
lines changed

6 files changed

+80
-62
lines changed

python/src/potentials/barrier_potential.cpp

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -76,21 +76,23 @@ void define_barrier_potential(py::module_& m)
7676
.def(
7777
"shape_derivative",
7878
py::overload_cast<
79-
const CollisionsBase&, const CollisionMesh&,
79+
const Collisions&, const CollisionMesh&,
8080
const Eigen::MatrixXd&>(
8181
&BarrierPotential::shape_derivative, py::const_),
8282
R"ipc_Qu8mg5v7(
8383
Compute the shape derivative of the potential.
8484
85-
std::runtime_error If the collision collisions were not built with shape derivatives enabled.
85+
std::runtime_error If the collision collisions were not built
86+
with shape derivatives enabled.
8687
8788
Parameters:
8889
collisions: The set of collisions.
8990
mesh: The collision mesh.
9091
vertices: Vertices of the collision mesh.
9192
9293
Returns:
93-
The derivative of the force with respect to X, the rest vertices.
94+
The derivative of the force with respect to X, the rest
95+
vertices.
9496
)ipc_Qu8mg5v7",
9597
py::arg("collisions"), py::arg("mesh"), py::arg("vertices"))
9698
.def(
@@ -142,7 +144,8 @@ void define_barrier_potential(py::module_& m)
142144
py::arg("project_hessian_to_psd") = false)
143145
.def(
144146
"shape_derivative",
145-
[](const DistanceBasedPotential& self, const Collision<4>& collision,
147+
[](const DistanceBasedPotential& self,
148+
const Collision<4>& collision,
146149
const std::array<long, 4>& vertex_ids,
147150
const VectorMax12d& rest_positions,
148151
const VectorMax12d& positions) {
@@ -180,33 +183,36 @@ void define_smooth_potential(py::module_& m)
180183
{
181184
py::class_<ParameterType>(m, "ParameterType")
182185
.def(
183-
py::init<const double&,const double&,const double&,const double&,const double&,
184-
const int&>(),
186+
py::init<
187+
const double&, const double&, const double&, const double&,
188+
const double&, const int&, const int&>(),
185189
R"ipc_Qu8mg5v7(
186190
Construct parameter set for smooth contact.
187191
188192
Parameters:
189193
dhat, alpha_t, beta_t, alpha_n, beta_n, r
190194
)ipc_Qu8mg5v7",
191-
py::arg("dhat"), py::arg("alpha_t"), py::arg("beta_t"), py::arg("alpha_n"),
192-
py::arg("beta_n"), py::arg("r"))
195+
py::arg("dhat"), py::arg("alpha_t"), py::arg("beta_t"),
196+
py::arg("alpha_n"), py::arg("beta_n"), py::arg("r"))
193197
.def(
194-
py::init<const double&,const double&,const double&,const int&>(),
198+
py::init<const double&, const double&, const double&, const int&>(),
195199
R"ipc_Qu8mg5v7(
196200
Construct parameter set for smooth contact.
197201
198202
Parameters:
199203
dhat, alpha_t, beta_t, r
200204
)ipc_Qu8mg5v7",
201-
py::arg("dhat"), py::arg("alpha_t"), py::arg("beta_t"), py::arg("r"))
205+
py::arg("dhat"), py::arg("alpha_t"), py::arg("beta_t"),
206+
py::arg("r"))
202207
.def_readonly("dhat", &ParameterType::dhat)
203208
.def_readonly("alpha_t", &ParameterType::alpha_t)
204209
.def_readonly("beta_t", &ParameterType::beta_t)
205210
.def_readonly("alpha_n", &ParameterType::alpha_n)
206211
.def_readonly("beta_n", &ParameterType::beta_n)
207212
.def_readonly("r", &ParameterType::r);
208213

209-
py::class_<SmoothContactPotential<SmoothCollisions<2>>>(m, "SmoothPotential")
214+
py::class_<SmoothContactPotential<SmoothCollisions<2>>>(
215+
m, "SmoothPotential")
210216
.def(
211217
py::init<const ParameterType&>(),
212218
R"ipc_Qu8mg5v7(
@@ -221,7 +227,9 @@ void define_smooth_potential(py::module_& m)
221227
py::overload_cast<
222228
const SmoothCollisions<2>&, const CollisionMesh&,
223229
const Eigen::MatrixXd&>(
224-
&SmoothContactPotential<SmoothCollisions<2>>::Potential::operator(), py::const_),
230+
&SmoothContactPotential<
231+
SmoothCollisions<2>>::Potential::operator(),
232+
py::const_),
225233
R"ipc_Qu8mg5v7(
226234
Compute the barrier potential for a set of collisions.
227235
@@ -239,7 +247,9 @@ void define_smooth_potential(py::module_& m)
239247
py::overload_cast<
240248
const SmoothCollisions<2>&, const CollisionMesh&,
241249
const Eigen::MatrixXd&>(
242-
&SmoothContactPotential<SmoothCollisions<2>>::Potential::gradient, py::const_),
250+
&SmoothContactPotential<
251+
SmoothCollisions<2>>::Potential::gradient,
252+
py::const_),
243253
R"ipc_Qu8mg5v7(
244254
Compute the gradient of the barrier potential.
245255
@@ -255,8 +265,11 @@ void define_smooth_potential(py::module_& m)
255265
.def(
256266
"hessian",
257267
py::overload_cast<
258-
const SmoothCollisions<2>&, const CollisionMesh&, const Eigen::MatrixXd&,
259-
const bool>(&SmoothContactPotential<SmoothCollisions<2>>::Potential::hessian, py::const_),
268+
const SmoothCollisions<2>&, const CollisionMesh&,
269+
const Eigen::MatrixXd&, const bool>(
270+
&SmoothContactPotential<
271+
SmoothCollisions<2>>::Potential::hessian,
272+
py::const_),
260273
R"ipc_Qu8mg5v7(
261274
Compute the hessian of the barrier potential.
262275
@@ -273,8 +286,10 @@ void define_smooth_potential(py::module_& m)
273286
py::arg("project_hessian_to_psd") = false)
274287
.def(
275288
"__call__",
276-
py::overload_cast<const SmoothCollision<6>&, const Vector<double, -1, 18>&>(
277-
&SmoothContactPotential<SmoothCollisions<2>>::operator(), py::const_),
289+
py::overload_cast<
290+
const SmoothCollision<6>&, const Vector<double, -1, 18>&>(
291+
&SmoothContactPotential<SmoothCollisions<2>>::operator(),
292+
py::const_),
278293
R"ipc_Qu8mg5v7(
279294
Compute the potential for a single collision.
280295
@@ -288,8 +303,10 @@ void define_smooth_potential(py::module_& m)
288303
py::arg("collision"), py::arg("x"))
289304
.def(
290305
"gradient",
291-
py::overload_cast<const SmoothCollision<6>&, const Vector<double, -1, 18>&>(
292-
&SmoothContactPotential<SmoothCollisions<2>>::gradient, py::const_),
306+
py::overload_cast<
307+
const SmoothCollision<6>&, const Vector<double, -1, 18>&>(
308+
&SmoothContactPotential<SmoothCollisions<2>>::gradient,
309+
py::const_),
293310
R"ipc_Qu8mg5v7(
294311
Compute the gradient of the potential for a single collision.
295312
@@ -304,8 +321,10 @@ void define_smooth_potential(py::module_& m)
304321
.def(
305322
"hessian",
306323
py::overload_cast<
307-
const SmoothCollision<6>&, const Vector<double, -1, 18>&, const bool>(
308-
&SmoothContactPotential<SmoothCollisions<2>>::hessian, py::const_),
324+
const SmoothCollision<6>&, const Vector<double, -1, 18>&,
325+
const bool>(
326+
&SmoothContactPotential<SmoothCollisions<2>>::hessian,
327+
py::const_),
309328
R"ipc_Qu8mg5v7(
310329
Compute the hessian of the potential for a single collision.
311330

src/ipc/friction/friction_collisions.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
namespace ipc {
1313

1414
template <int dim>
15-
void FrictionCollisions::build(
15+
void FrictionCollisions::build_for_smooth_contact(
1616
const CollisionMesh& mesh,
1717
const Eigen::MatrixXd& vertices,
1818
const SmoothCollisions<dim>& collisions,
@@ -137,7 +137,7 @@ void FrictionCollisions::build(
137137
}
138138

139139
template
140-
void FrictionCollisions::build<2>(
140+
void FrictionCollisions::build_for_smooth_contact<2>(
141141
const CollisionMesh& mesh,
142142
const Eigen::MatrixXd& vertices,
143143
const SmoothCollisions<2>& collisions,
@@ -147,7 +147,7 @@ void FrictionCollisions::build<2>(
147147
const std::function<double(double, double)>& blend_mu);
148148

149149
template
150-
void FrictionCollisions::build<3>(
150+
void FrictionCollisions::build_for_smooth_contact<3>(
151151
const CollisionMesh& mesh,
152152
const Eigen::MatrixXd& vertices,
153153
const SmoothCollisions<3>& collisions,

src/ipc/friction/friction_collisions.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,21 +49,21 @@ class FrictionCollisions {
4949
default_blend_mu);
5050

5151
template <int dim>
52-
void build(
52+
void build_for_smooth_contact(
5353
const CollisionMesh& mesh,
5454
const Eigen::MatrixXd& vertices,
5555
const SmoothCollisions<dim>& collisions,
5656
const ParameterType &params,
5757
const double barrier_stiffness,
5858
double mu)
5959
{
60-
this->build(
60+
this->build_for_smooth_contact(
6161
mesh, vertices, collisions, params, barrier_stiffness,
6262
Eigen::VectorXd::Constant(vertices.rows(), mu));
6363
}
6464

6565
template <int dim>
66-
void build(
66+
void build_for_smooth_contact(
6767
const CollisionMesh& mesh,
6868
const Eigen::MatrixXd& vertices,
6969
const SmoothCollisions<dim>& collisions,

src/ipc/smooth_contact/smooth_collisions_builder.cpp

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,10 @@ namespace {
1919
std::shared_ptr<typename SmoothCollisions<dim>::value_type>>&
2020
collisions_)
2121
{
22-
if (pair->is_active() && cc_to_id_.find(pair->get_hash()) == cc_to_id_.end())
23-
{
22+
if (pair->is_active()
23+
&& cc_to_id_.find(pair->get_hash()) == cc_to_id_.end()) {
2424
// New collision, so add it to the end of collisions
25-
cc_to_id_.emplace(
26-
pair->get_hash(),
27-
pair);
25+
cc_to_id_.emplace(pair->get_hash(), pair);
2826
collisions_.push_back(pair);
2927
}
3028
}
@@ -107,7 +105,8 @@ void SmoothCollisionsBuilder<3>::add_edge_edge_collisions(
107105
std::make_shared<
108106
SmoothCollisionTemplate<max_vert_3d, Edge3, Edge3>>(
109107
std::min(eai, ebi), std::max(eai, ebi), actual_dtype, mesh,
110-
param, std::min(edge_dhat(eai), edge_dhat(ebi)), vertices), collisions);
108+
param, std::min(edge_dhat(eai), edge_dhat(ebi)), vertices),
109+
collisions);
111110
}
112111
}
113112

@@ -143,7 +142,8 @@ void SmoothCollisionsBuilder<3>::add_face_vertex_collisions(
143142
std::make_shared<
144143
SmoothCollisionTemplate<max_vert_3d, Face, Point3>>(
145144
fi, vi, pt_dtype, mesh, param,
146-
std::min(face_dhat(fi), vert_dhat(vi)), vertices), collisions);
145+
std::min(face_dhat(fi), vert_dhat(vi)), vertices),
146+
collisions);
147147

148148
for (int lv = 0; lv < 3; lv++) {
149149
const auto& vj = mesh.faces()(fi, lv);
@@ -205,10 +205,11 @@ void SmoothCollisionsBuilder<3>::merge(
205205
merged_collisions.collisions.reserve(total);
206206

207207
// merge
208-
for (const auto& builder : local_storage)
209-
{
210-
vert_vert_3_to_id.insert(builder.vert_vert_3_to_id.begin(), builder.vert_vert_3_to_id.end());
211-
edge_vert_3_to_id.insert(builder.edge_vert_3_to_id.begin(), builder.edge_vert_3_to_id.end());
208+
for (const auto& builder : local_storage) {
209+
vert_vert_3_to_id.insert(
210+
builder.vert_vert_3_to_id.begin(), builder.vert_vert_3_to_id.end());
211+
edge_vert_3_to_id.insert(
212+
builder.edge_vert_3_to_id.begin(), builder.edge_vert_3_to_id.end());
212213
}
213214
int edge_vert_count = edge_vert_3_to_id.size();
214215
int vert_vert_count = vert_vert_3_to_id.size();
@@ -220,17 +221,12 @@ void SmoothCollisionsBuilder<3>::merge(
220221
for (const auto& [key, val] : edge_vert_3_to_id)
221222
merged_collisions.collisions.push_back(val);
222223

223-
for (const auto& builder : local_storage)
224-
{
225-
for (const auto& cc : builder.collisions)
226-
{
227-
if (cc->type() == CollisionType::FaceVertex)
228-
{
224+
for (const auto& builder : local_storage) {
225+
for (const auto& cc : builder.collisions) {
226+
if (cc->type() == CollisionType::FaceVertex) {
229227
face_vert_count++;
230228
merged_collisions.collisions.push_back(cc);
231-
}
232-
else if (cc->type() == CollisionType::EdgeEdge)
233-
{
229+
} else if (cc->type() == CollisionType::EdgeEdge) {
234230
edge_edge_count++;
235231
merged_collisions.collisions.push_back(cc);
236232
}
@@ -266,10 +262,11 @@ void SmoothCollisionsBuilder<2>::merge(
266262
merged_collisions.collisions.reserve(total);
267263

268264
// merge
269-
for (auto& builder : local_storage)
270-
{
271-
vert_vert_2_to_id.insert(builder.vert_vert_2_to_id.begin(), builder.vert_vert_2_to_id.end());
272-
vert_edge_2_to_id.insert(builder.vert_edge_2_to_id.begin(), builder.vert_edge_2_to_id.end());
265+
for (auto& builder : local_storage) {
266+
vert_vert_2_to_id.insert(
267+
builder.vert_vert_2_to_id.begin(), builder.vert_vert_2_to_id.end());
268+
vert_edge_2_to_id.insert(
269+
builder.vert_edge_2_to_id.begin(), builder.vert_edge_2_to_id.end());
273270
}
274271
int edge_vert_count = vert_edge_2_to_id.size();
275272
int vert_vert_count = vert_vert_2_to_id.size();

src/ipc/smooth_contact/smooth_collisions_builder.hpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ template <int dim> class SmoothCollisionsBuilder;
1212

1313
template <> class SmoothCollisionsBuilder<2> {
1414
public:
15-
SmoothCollisionsBuilder() {}
15+
SmoothCollisionsBuilder() { }
1616

1717
void add_edge_vertex_collisions(
1818
const CollisionMesh& mesh,
@@ -25,9 +25,10 @@ template <> class SmoothCollisionsBuilder<2> {
2525
const size_t end_i);
2626

2727
// -------------------------------------------------------------------------
28-
28+
2929
static void merge(
30-
const utils::ParallelCacheType<SmoothCollisionsBuilder<2>>& local_storage,
30+
const utils::ParallelCacheType<SmoothCollisionsBuilder<2>>&
31+
local_storage,
3132
SmoothCollisions<2>& merged_collisions);
3233

3334
// Constructed collisions
@@ -49,7 +50,7 @@ template <> class SmoothCollisionsBuilder<2> {
4950

5051
template <> class SmoothCollisionsBuilder<3> {
5152
public:
52-
SmoothCollisionsBuilder() {}
53+
SmoothCollisionsBuilder() { }
5354

5455
void add_edge_edge_collisions(
5556
const CollisionMesh& mesh,
@@ -75,7 +76,8 @@ template <> class SmoothCollisionsBuilder<3> {
7576
// -------------------------------------------------------------------------
7677

7778
static void merge(
78-
const utils::ParallelCacheType<SmoothCollisionsBuilder<3>>& local_storage,
79+
const utils::ParallelCacheType<SmoothCollisionsBuilder<3>>&
80+
local_storage,
7981
SmoothCollisions<3>& merged_collisions);
8082

8183
// Constructed collisions
@@ -84,7 +86,8 @@ template <> class SmoothCollisionsBuilder<3> {
8486

8587
// -------------------------------------------------------------------------
8688

87-
// Store the indices to pairs to avoid duplicates, no need for Face-Vertex and Edge-Edge
89+
// Store the indices to pairs to avoid duplicates, no need for Face-Vertex
90+
// and Edge-Edge
8891
unordered_map<
8992
std::pair<long, long>,
9093
std::shared_ptr<SmoothCollisionTemplate<max_vert_3d, Point3, Point3>>>

tests/src/tests/friction/test_force_jacobian.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ void check_smooth_friction_force_jacobian(
364364
collisions.size());
365365

366366
FrictionCollisions friction_collisions;
367-
friction_collisions.build(
367+
friction_collisions.build_for_smooth_contact<dim>(
368368
mesh, X + Ut, collisions, params, barrier_stiffness, mu);
369369
CHECK(friction_collisions.size());
370370

@@ -484,23 +484,22 @@ void check_smooth_friction_force_jacobian(
484484
// fd_collisions.build(mesh, X + fd_Ut, params);
485485
fd_collisions.collisions.push_back(std::make_shared<SmoothCollisionTemplate<max_vert_3d, Face, Point3>>(0, 0, PointTriangleDistanceType::P_T, mesh, params, params.dhat, X + fd_Ut));
486486

487-
fd_friction_collisions.build(
487+
fd_friction_collisions.build_for_smooth_contact(
488488
mesh, X + fd_Ut, fd_collisions, params, barrier_stiffness, mu);
489489
} else {
490490
fd_friction_collisions = friction_collisions;
491491
}
492492

493493
return D.smooth_contact_force(
494-
friction_collisions, mesh, X, fd_Ut, velocities, dhat,
495-
barrier_stiffness);
494+
friction_collisions, mesh, X, fd_Ut, velocities);
496495
};
497496
Eigen::MatrixXd fd_JF_wrt_Ut;
498497
fd::finite_jacobian(fd::flatten(Ut), F_Ut, fd_JF_wrt_Ut);
499498
// CHECK(fd::compare_jacobian(JF_wrt_Ut, fd_JF_wrt_Ut));
500499
// if (!fd::compare_jacobian(JF_wrt_Ut, fd_JF_wrt_Ut)) {
501500
// tests::print_compare_nonzero(JF_wrt_Ut, fd_JF_wrt_Ut);
502501
// }
503-
std::cout << std::setprecision(8) << JF_wrt_Ut.transpose() << "\n\n" << fd_JF_wrt_Ut.transpose() << "\n";
502+
// std::cout << std::setprecision(8) << JF_wrt_Ut.transpose() << "\n\n" << fd_JF_wrt_Ut.transpose() << "\n";
504503
CHECK((JF_wrt_Ut - fd_JF_wrt_Ut).norm() <= 1e-7 * JF_wrt_Ut.norm());
505504

506505
// ///////////////////////////////////////////////////////////////////////////

0 commit comments

Comments
 (0)