12 return std::vector<std::shared_ptr<Parametrization>>();
16 : from_(from), to_(to)
25 Eigen::VectorXd res =
y;
30 return y.array().log();
37 Eigen::VectorXd
y =
x;
42 return x.array().exp();
49 Eigen::VectorXd res = grad.array();
54 return x.array().exp() * grad.array();
58 : from_(from), to_(to), scale_(scale)
68 Eigen::VectorXd res =
y;
80 Eigen::VectorXd
y =
x;
92 Eigen::VectorXd res = grad.array();
97 return scale_ * grad.array();
104 Eigen::VectorXd res =
y;
109 return y.array().pow(1. /
power_);
116 Eigen::VectorXd
y =
x;
128 Eigen::VectorXd res = grad;
137 : is_volume_(is_volume)
143 const int size =
y.size() / 2;
144 assert(
size * 2 ==
y.size());
146 Eigen::VectorXd
x(
y.size());
147 for (
int i = 0; i <
size; i++)
158 const int size =
x.size() / 2;
159 assert(
size * 2 ==
x.size());
163 for (
int i = 0; i <
size; i++)
174 const int size = grad.size() / 2;
175 assert(
size * 2 == grad.size());
176 assert(
size * 2 ==
x.size());
178 Eigen::VectorXd grad_E_nu;
179 grad_E_nu.setZero(grad.size());
180 for (
int i = 0; i <
size; i++)
183 grad_E_nu(i) = grad(i) * jacobian(0, 0) + grad(i +
size) * jacobian(1, 0);
184 grad_E_nu(i +
size) = grad(i) * jacobian(0, 1) + grad(i +
size) * jacobian(1, 1);
193 std::map<int, int> body_id_map;
197 if (!body_id_map.count(body_id))
207 for (
int e = 0; e < bases.size(); e++)
210 const int id = body_id_map.at(body_id);
211 for (
const auto &bs : bases[e].bases)
213 for (
const auto &g : bs.global())
227 y.setZero(
size(
x.size()));
232 for (
int d = 0; d < dim; d++)
249 assert(grad.size() ==
size(
x.size()));
250 Eigen::VectorXd grad_body;
251 grad_body.setZero(
x.size());
256 for (
int d = 0; d < dim; d++)
283 y.setZero(
size(
x.size()));
304 assert(grad.size() ==
size(
x.size()));
305 Eigen::VectorXd grad_body;
306 grad_body.setZero(
x.size());
319 SliceMap::SliceMap(
const int from,
const int to,
const int total) : from_(from), to_(to), total_(total)
331 if (
y.size() !=
size(0))
346 Eigen::VectorXd grad_full;
347 grad_full.setZero(
x.size());
365 return x_size +
values_.size();
372 Eigen::VectorXd
x(
y.size() -
values_.size());
379 return y.head(
y.size() -
values_.size());
385 y.setZero(
size(
x.size()));
400 assert(
x.size() == grad.size() -
values_.size());
401 Eigen::VectorXd reduced_grad(grad.size() -
values_.size());
409 reduced_grad = grad.head(grad.size() -
values_.size());
416 std::vector<Eigen::Triplet<double>> tt_adjacency_list;
418 Eigen::MatrixXd barycenters;
427 for (
int i = 0; i < barycenters.rows(); i++)
429 auto center_i = barycenters.row(i);
430 for (
int j = 0; j <= i; j++)
432 auto center_j = barycenters.row(j);
434 dist = (center_i - center_j).norm();
437 tt_adjacency_list.emplace_back(i, j, radius - dist);
439 tt_adjacency_list.emplace_back(j, i, radius - dist);
466 x.setZero(
size(
y.size()));
468 for (
int i = 1; i <
x.size(); ++i)
469 x(i) = (
y(i) -
y(i - 1)) /
dt_;
476 y.setZero(
size(
x.size()));
478 for (
int i = 1; i <
x.size(); ++i)
479 y(i) =
y(i - 1) +
dt_ *
x(i);
485 assert(
x.size() == grad.size());
487 Eigen::MatrixXd hess;
488 hess.setZero(
x.size(),
size(
x.size()));
489 for (
int i = 0; i < hess.rows(); ++i)
490 for (
int j = 0; j <= i; ++j)
493 return hess.transpose() * grad;
Abstract mesh class to capture 2d/3d conforming and non-conforming meshes.
int n_elements() const
utitlity to return the number of elements, cells or faces in 3d and 2d
virtual int get_body_id(const int primitive) const
Get the volume selection of an element (cell in 3d, face in 2d)
void cell_barycenters(Eigen::MatrixXd &barycenters) const
all cells barycenters
virtual void bounding_box(RowVectorNd &min, RowVectorNd &max) const =0
computes the bbox of the mesh
void face_barycenters(Eigen::MatrixXd &barycenters) const
all face barycenters
virtual bool is_volume() const =0
checks if mesh is volume
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
int size(const int x_size) const override
ENu2LambdaMu(const bool is_volume)
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override
ExponentialMap(const int from=-1, const int to=-1)
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override
int size(const int x_size) const override
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
InsertConstantMap(const int size=-1, const double val=0, const int start_index=-1)
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override
Eigen::SparseMatrix< double > tt_radius_adjacency
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override
Eigen::VectorXd tt_radius_adjacency_row_sum
LinearFilter(const mesh::Mesh &mesh, const double radius)
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
static std::vector< std::shared_ptr< Parametrization > > build(const json ¶ms, const int full_size)
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
PerBody2PerElem(const mesh::Mesh &mesh)
int size(const int x_size) const override
std::map< int, std::array< int, 2 > > body_id_map_
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override
int size(const int x_size) const override
Eigen::VectorXi node_id_to_body_id_
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
PerBody2PerNode(const mesh::Mesh &mesh, const std::vector< basis::ElementBases > &bases, const int n_bases)
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override
int size(const int x_size) const override
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Scaling(const double scale, const int from=-1, const int to=-1)
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad, const Eigen::VectorXd &x) const override
SliceMap(const int from=-1, const int to=-1, const int total=-1)
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) override
int size(const int x_size) const override
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
spdlog::logger & logger()
Retrieves the current logger.
double convert_to_E(const bool is_volume, const double lambda, const double mu)
double convert_to_mu(const double E, const double nu)
void log_and_throw_adjoint_error(const std::string &msg)
double convert_to_nu(const bool is_volume, const double lambda, const double mu)
Eigen::Matrix< double, 1, Eigen::Dynamic, Eigen::RowMajor, 1, 3 > RowVectorNd
double convert_to_lambda(const bool is_volume, const double E, const double nu)
Eigen::Matrix2d d_lambda_mu_d_E_nu(const bool is_volume, const double E, const double nu)