Skip to content

Commit 670378e

Browse files
committed
more util functions
1 parent 40e9b2d commit 670378e

File tree

2 files changed

+44
-4
lines changed

2 files changed

+44
-4
lines changed

src/mesh/mesh.cpp

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ void define_mesh(py::module_ &m)
1212
{
1313
py::class_<Mesh>(m, "Mesh", "Mesh")
1414

15+
.def("dimension", &Mesh::dimension, "Dimension of the mesh (2 or 3)")
16+
1517
.def("n_elements", &Mesh::n_elements, "Number of elements")
1618

1719
.def("n_boundary_elements", &Mesh::n_boundary_elements,
@@ -92,6 +94,18 @@ void define_mesh(py::module_ &m)
9294
},
9395
"Get all vertex positions")
9496

97+
.def(
98+
"set_vertices",
99+
[](Mesh &mesh, const Eigen::VectorXi &ids,
100+
const Eigen::MatrixXd &points) {
101+
for (int i = 0; i < ids.size(); i++)
102+
{
103+
assert(ids(i) < mesh.n_vertices());
104+
mesh.set_point(ids(i), points.row(i));
105+
}
106+
},
107+
"Set a subset of vertex positions given a list of vertex indices")
108+
95109
.def(
96110
"set_vertices",
97111
[](Mesh &mesh, const Eigen::MatrixXd &points) {
@@ -103,12 +117,13 @@ void define_mesh(py::module_ &m)
103117
.def(
104118
"elements",
105119
[](const Mesh &mesh) {
106-
Eigen::MatrixXi elements(mesh.n_elements(), mesh.n_cell_vertices(0));
120+
Eigen::MatrixXi elements(mesh.n_elements(),
121+
mesh.n_cell_vertices(0));
107122
for (int e = 0; e < mesh.n_elements(); e++)
108123
{
109-
assert(mesh.n_cell_vertices(e) == elements.cols());
110-
for (int i = 0; i < elements.cols(); i++)
111-
elements(e, i) = mesh.element_vertex(e, i);
124+
assert(mesh.n_cell_vertices(e) == elements.cols());
125+
for (int i = 0; i < elements.cols(); i++)
126+
elements(e, i) = mesh.element_vertex(e, i);
112127
}
113128
return elements;
114129
},

src/state/state.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,9 @@ void define_solver(py::module_ &m)
156156
"load PDE and problem parameters from the settings", py::arg("json"),
157157
py::arg("strict_validation") = false)
158158

159+
.def("set_max_threads", &State::set_max_threads,
160+
"set maximum number of threads", py::arg("nthreads"))
161+
159162
.def("ndof", &State::ndof, "Dimension of the solution")
160163

161164
.def("n_bases", [](const State &s) { return s.n_bases; }, "Number of basis")
@@ -398,6 +401,28 @@ void define_solver(py::module_ &m)
398401
"set_cache_level",
399402
[](State &s, solver::CacheLevel level) {
400403
s.optimization_enabled = level;
404+
if (level == solver::CacheLevel::Derivatives)
405+
{
406+
if (s.is_contact_enabled())
407+
{
408+
if (!s.args["contact"]["use_convergent_formulation"])
409+
{
410+
s.args["contact"]["use_convergent_formulation"] = true;
411+
logger().info("Use convergent formulation for differentiable contact...");
412+
}
413+
if (s.args["/solver/contact/barrier_stiffness"_json_pointer].is_string())
414+
{
415+
logger().error("Only constant barrier stiffness is supported in differentiable contact!");
416+
}
417+
}
418+
419+
if (s.args.contains("boundary_conditions") && s.args["boundary_conditions"].contains("rhs"))
420+
{
421+
json rhs = s.args["boundary_conditions"]["rhs"];
422+
if ((rhs.is_array() && rhs.size() > 0 && rhs[0].is_string()) || rhs.is_string())
423+
logger().error("Only constant rhs over space is supported in differentiable code!");
424+
}
425+
}
401426
},
402427
"Set solution caching level", py::arg("cache_level"))
403428

0 commit comments

Comments
 (0)