16 const Eigen::MatrixXd &eval_points,
17 const double &tolerance) {
18 const double h = 1e-6;
20 const size_t num_points = eval_points.cols();
21 const size_t dim_local = geom.
DimLocal();
22 const size_t dim_global = geom.
DimGlobal();
24 Eigen::MatrixXd jacobians = geom.
Jacobian(eval_points);
26 EXPECT_EQ(jacobians.rows(), dim_global) <<
"Jacobian has " << jacobians.rows()
27 <<
" rows instead of " << dim_global;
28 EXPECT_EQ(jacobians.cols(), num_points * dim_local)
29 <<
"Jacobian has " << jacobians.cols() <<
" cols instead of "
30 << num_points * dim_local;
32 for (
size_t j = 0; j < num_points; ++j) {
33 auto point = eval_points.col(j);
35 Eigen::MatrixXd jacobian =
36 jacobians.block(0, j * dim_local, dim_global, dim_local);
37 Eigen::MatrixXd approx_jacobian =
38 Eigen::MatrixXd::Zero(dim_global, dim_local);
40 for (
size_t i = 0; i < dim_local; ++i) {
41 Eigen::VectorXd h_vec = Eigen::VectorXd::Zero(dim_local);
45 approx_jacobian.col(i) =
46 (geom.
Global(point + h_vec) - geom.
Global(point - h_vec)) / (2. * h);
49 EXPECT_TRUE(jacobian.isApprox(approx_jacobian, tolerance))
50 <<
"Jacobian incorrect at point " << point;
void checkJacobian(const lf::geometry::Geometry &geom, const Eigen::MatrixXd &eval_points, const double &tolerance)
Checks if Jacobian() is implemented correctly by comparing it to the symmetric difference quotient ap...