19 val = Eigen::MatrixXd::Zero(pts.rows(), pts.cols());
24 val = Eigen::MatrixXd::Zero(pts.rows(), mesh.
dimension());
26 for (
long i = 0; i < pts.rows(); ++i)
50 val = Eigen::MatrixXd::Zero(pts.rows(), pts.cols());
55 val = Eigen::MatrixXd::Zero(pts.rows(), mesh.
dimension());
57 double alpha =
n_turns_ * t * 2 * M_PI;
59 rot << cos(alpha), -sin(alpha),
60 sin(alpha), cos(alpha);
62 for (
long i = 0; i < pts.rows(); ++i)
66 const Eigen::RowVector3d pt = pts.row(i);
67 Eigen::RowVector2d pt2;
82 if (params.contains(
"axis_coordiante"))
84 const int coord = params[
"axis_coordiante"];
89 if (params.contains(
"n_turns"))
94 if (params.contains(
"fixed_boundary"))
99 if (params.contains(
"turning_boundary"))
104 if (params.contains(
"bbox_center"))
106 auto bbox_center = params[
"bbox_center"];
107 if (bbox_center.is_array() && bbox_center.size() >= 3)
129 val = Eigen::MatrixXd::Zero(pts.rows(), pts.cols());
134 val = Eigen::MatrixXd::Zero(pts.rows(), pts.cols());
138 val = Eigen::MatrixXd::Zero(pts.rows(), pts.cols());
142 val = Eigen::MatrixXd::Zero(pts.rows(), pts.cols());
147 val = Eigen::MatrixXd::Zero(pts.rows(), mesh.
dimension());
151 Eigen::Matrix2d rot0;
152 rot0 << cos(alpha0), -sin(alpha0), sin(alpha0), cos(alpha0);
154 Eigen::Matrix2d rot1;
155 rot1 << cos(alpha1), -sin(alpha1), sin(alpha1), cos(alpha1);
157 for (
long i = 0; i < pts.rows(); ++i)
159 const Eigen::RowVector3d pt = pts.row(i);
163 Eigen::RowVector2d pt2;
175 Eigen::RowVector2d pt2;
190 if (params.contains(
"axis_coordiante0"))
192 const int coord = params[
"axis_coordiante0"];
197 if (params.contains(
"axis_coordiante1"))
199 const int coord = params[
"axis_coordiante1"];
204 if (params.contains(
"angular_v0"))
209 if (params.contains(
"angular_v1"))
214 if (params.contains(
"turning_boundary0"))
219 if (params.contains(
"turning_boundary1"))
224 if (params.contains(
"bbox_center"))
226 auto bbox_center = params[
"bbox_center"];
227 if (bbox_center.is_array() && bbox_center.size() >= 3)
246 val = Eigen::MatrixXd::Zero(pts.rows(), pts.cols());
247 val.col(1).setConstant(0.5);
252 val = Eigen::MatrixXd::Zero(pts.rows(), mesh.
dimension());
254 for (
long i = 0; i < pts.rows(); ++i)
257 val.row(i).setZero();
263 template <
typename T>
264 Eigen::Matrix<T, 2, 1> function(T
x, T
y,
const double t)
266 Eigen::Matrix<T, 2, 1> res;
268 res(0) = t * (
y *
y *
y +
x *
x +
x *
y) / 50.;
269 res(1) = t * (3 *
x *
x *
x *
x +
x *
y *
y +
x) / 50.;
274 template <
typename T>
275 Eigen::Matrix<T, 3, 1> function(T
x, T
y, T
z,
const double t)
277 Eigen::Matrix<T, 3, 1> res;
279 res(0) = t * (
x *
y +
x *
x +
y *
y *
y + 6 *
z) / 80.;
280 res(1) = t * (
z *
x -
z *
z *
z +
x *
y *
y + 3 *
x *
x *
x *
x) / 80.;
281 res(2) = t * (
x *
y *
z +
z *
z *
y *
y - 2 *
x) / 80.;
286 template <
typename T>
287 Eigen::Matrix<T, 2, 1> function_compression(T
x, T
y,
const double t)
289 Eigen::Matrix<T, 2, 1> res;
291 res(0) = -t * (
y *
y *
y +
x *
x +
x *
y) / 20.;
292 res(1) = -t * (3 *
x *
x *
x *
x +
x *
y *
y +
x) / 20.;
297 template <
typename T>
298 Eigen::Matrix<T, 3, 1> function_compression(T
x, T
y, T
z,
const double t)
300 Eigen::Matrix<T, 3, 1> res;
302 res(0) = -t * (
x *
y +
x *
x +
y *
y *
y + 6 *
z) / 14.;
303 res(1) = -t * (
z *
x -
z *
z *
z +
x *
y *
y + 3 *
x *
x *
x *
x) / 14.;
304 res(2) = -t * (
x *
y *
z +
z *
z *
y *
y - 2 *
x) / 14.;
309 template <
typename T>
310 Eigen::Matrix<T, 2, 1> function_quadratic(T
x, T
y,
const double t)
312 Eigen::Matrix<T, 2, 1> res;
314 res(0) = -t * (
y *
y +
x *
x +
x *
y) / 50.;
315 res(1) = -t * (3 *
x *
x +
y) / 50.;
320 template <
typename T>
321 Eigen::Matrix<T, 3, 1> function_quadratic(T
x, T
y, T
z,
const double t)
323 Eigen::Matrix<T, 3, 1> res;
325 res(0) = -t * (
y *
y +
x *
x +
x *
y +
z *
y) / 50.;
326 res(1) = -t * (3 *
x *
x +
y +
z *
z) / 50.;
327 res(2) = -t * (
x *
z +
y *
y - 2 *
z) / 50.;
332 template <
typename T>
333 Eigen::Matrix<T, 2, 1> function_linear(T
x, T
y,
const double t)
335 Eigen::Matrix<T, 2, 1> res;
337 res(0) = -t * (
y +
x) / 50.;
338 res(1) = -t * (3 *
x +
y) / 50.;
343 template <
typename T>
344 Eigen::Matrix<T, 3, 1> function_linear(T
x, T
y, T
z,
const double t)
346 Eigen::Matrix<T, 3, 1> res;
348 res(0) = -t * (
y +
x +
z) / 50.;
349 res(1) = -t * (3 *
x +
y -
z) / 50.;
350 res(2) = -t * (
x +
y - 2 *
z) / 50.;
355 template <
typename T>
356 void compute_singularity(
const T &
x,
const T &
y, Eigen::Matrix<T, -1, 1> &res,
const double a,
const double mu,
const double nu,
const double lambda,
const double t)
358 double b1, b2, b3, b4;
359 T r = sqrt(
x *
x +
y *
y);
363 b1 = sin(M_PI * a / 2) * ((a - 1) * mu + (1 - 2 * nu) * lambda) * (a - 4 * nu + 3) / cos(M_PI * a / 2) / ((a - 4 * nu + 2) * mu + (1 - 2 * nu) * lambda) / (a + 1);
364 b2 = (a + 4 * nu - 3) / (a + 1);
365 b3 = -sin(M_PI * a / 2) * ((a - 1) * mu + (1 - 2 * nu) * lambda) / cos(M_PI * a / 2) / ((a - 4 * nu + 2) * mu + (1 - 2 * nu) * lambda);
368 ur = -1 / mu * pow(r, a) * (b4 * (a + (4 * nu) - 3) * cos((a - 1) * phi) + b3 * (a + (4 * nu) - 3) * sin((a - 1) * phi) + (b2 * cos((a + 1) * phi) + b1 * sin((a + 1) * phi)) * (a + 1)) / 2;
369 ut = -1 / mu * pow(r, a) * (b3 * (a - (4 * nu) + 3) * cos((a - 1) * phi) - b4 * (a - (4 * nu) + 3) * sin((a - 1) * phi) + (b1 * cos((a + 1) * phi) - b2 * sin((a + 1) * phi)) * (a + 1)) / 2;
371 res(0) = 79.17 * t * ur * cos(ut);
372 res(1) = 79.17 * t * ur * sin(ut);
375 template <
typename T>
376 Eigen::Matrix<
T, -1, 1> function_cantilever(T
x, T
y,
const double t,
const double delta,
const double E,
const double nu,
const int dim,
const double L,
const double D)
378 Eigen::Matrix<
T, -1, 1> res, res1, res2;
380 res1.setZero(dim, 1);
381 res2.setZero(dim, 1);
382 const double lambda = (E * nu) / (1 + nu) / (1 - (
dim - 1) * nu);
383 const double mu = E / (2 * (1 + nu));
386 double a = 0.71117293;
388 double I = D * D * D / 12;
391 compute_singularity(
y + delta,
x + delta, res1, a, mu, nu, lambda, t);
392 compute_singularity(D -
y + delta,
x + delta, res2, a, mu, nu, lambda, t);
396 res(0) += t *
P * (
y - D / 2) / (6 * E * I) * ((6 * L - 3 *
x) *
x + (2 + nu) * ((
y - D / 2) * (
y - D / 2) - D * D / 4)) / 3;
397 res(1) += -t *
P / (6 * E * I) * (3 * nu * (
y - D / 2) * (
y - D / 2) * (L -
x) + (4 + 5 * nu) * D * D *
x / 4 + (3 * L -
x) *
x *
x) / 3;
411 return function(pt(0), pt(1), t);
412 else if (pt.size() == 3)
413 return function(pt(0), pt(1), pt(2), t);
422 return function(pt(0), pt(1), t);
423 else if (pt.size() == 3)
424 return function(pt(0), pt(1), pt(2), t);
433 return function(pt(0), pt(1), t);
434 else if (pt.size() == 3)
435 return function(pt(0), pt(1), pt(2), t);
449 return function_compression(pt(0), pt(1), t);
450 else if (pt.size() == 3)
451 return function_compression(pt(0), pt(1), pt(2), t);
460 return function_compression(pt(0), pt(1), t);
461 else if (pt.size() == 3)
462 return function_compression(pt(0), pt(1), pt(2), t);
471 return function_compression(pt(0), pt(1), t);
472 else if (pt.size() == 3)
473 return function_compression(pt(0), pt(1), pt(2), t);
487 return function_quadratic(pt(0), pt(1), t);
488 else if (pt.size() == 3)
489 return function_quadratic(pt(0), pt(1), pt(2), t);
498 return function_quadratic(pt(0), pt(1), t);
499 else if (pt.size() == 3)
500 return function_quadratic(pt(0), pt(1), pt(2), t);
509 return function_quadratic(pt(0), pt(1), t);
510 else if (pt.size() == 3)
511 return function_quadratic(pt(0), pt(1), pt(2), t);
525 return function_linear(pt(0), pt(1), t);
526 else if (pt.size() == 3)
527 return function_linear(pt(0), pt(1), pt(2), t);
536 return function_linear(pt(0), pt(1), t);
537 else if (pt.size() == 3)
538 return function_linear(pt(0), pt(1), pt(2), t);
547 return function_linear(pt(0), pt(1), t);
548 else if (pt.size() == 3)
549 return function_linear(pt(0), pt(1), pt(2), t);
563 if (params.contains(
"force"))
571 val = Eigen::MatrixXd::Zero(pts.rows(), pts.cols());
577 val = Eigen::MatrixXd::Zero(pts.rows(), pts.cols());
582 val = Eigen::MatrixXd::Zero(pts.rows(), pts.cols());
587 val = Eigen::MatrixXd::Zero(pts.rows(), pts.cols());
592 val = Eigen::MatrixXd::Zero(pts.rows(), pts.cols());
603 val = Eigen::MatrixXd::Zero(pts.rows(), pts.cols());
608 val = Eigen::MatrixXd::Zero(pts.rows(), mesh.
dimension());
610 for (
long i = 0; i < pts.rows(); ++i)
613 val(i, 2) = 0.2 * sin(t);
615 val(i, 2) = -0.2 * sin(t);
621 val = Eigen::MatrixXd::Zero(pts.rows(), pts.cols());
626 val = Eigen::MatrixXd::Zero(pts.rows(), pts.cols());
631 val = Eigen::MatrixXd::Zero(pts.rows(), pts.cols());
653 if (params.contains(
"displacement"))
657 if (params.contains(
"E"))
661 if (params.contains(
"nu"))
665 if (params.contains(
"formulation"))
669 if (params.contains(
"mesh_size"))
671 auto size = params[
"mesh_size"];
679 throw std::invalid_argument(
"Mesh_size needs to be an array!");
687 val.resize(pts.rows(), size);
689 const double lambda = (
E *
nu) / (1.0 +
nu) / (1.0 - (size - 1.0) *
nu);
690 const double mu =
E / (2.0 * (1.0 +
nu));
692 for (
long i = 0; i < pts.rows(); ++i)
694 Matrix<double, Dynamic, 1, 0, 3, 1> point(pts.cols()), result;
700 for (
long d = 0; d < pts.cols(); ++d)
717 for (
long i = 0; i < pts.rows(); ++i)
726 val.resize(pts.rows(), pts.cols() * size);
728 for (
long i = 0; i < pts.rows(); ++i)
733 for (
long d = 0; d < pts.cols(); ++d)
738 for (
int m = 0; m < size; ++m)
740 const auto &tmp = res(m);
741 val.block(i, m * pts.cols(), 1, pts.cols()) = tmp.getGradient().transpose();
748 val = Eigen::MatrixXd::Zero(pts.rows(), mesh.
dimension());
750 const double lambda = (
E *
nu) / (1.0 +
nu) / (1.0 - (mesh.
dimension() - 1.0) *
nu);
751 const double mu =
E / 2.0 / (1.0 +
nu);
753 for (
long i = 0; i < pts.rows(); ++i)
759 Eigen::VectorXd neumann_bc_normal = normals.row(i);
760 Eigen::MatrixXd sigma;
762 for (
long d = 0; d < pts.cols(); ++d)
767 for (
int d1 = 0; d1 < mesh.
dimension(); d1++)
769 for (
int d2 = 0; d2 < mesh.
dimension(); d2++)
771 grad_u(d1, d2) = res(d1).getGradient()(d2);
777 sigma = mu * (grad_u + grad_u.transpose()) + lambda * grad_u.trace() * Eigen::MatrixXd::Identity(mesh.
dimension(), mesh.
dimension());
781 Eigen::MatrixXd def_grad = Eigen::MatrixXd::Identity(grad_u.rows(), grad_u.cols()) + grad_u;
782 Eigen::MatrixXd FmT = def_grad.inverse().transpose();
783 sigma = mu * (def_grad - FmT) + lambda * std::log(def_grad.determinant()) * FmT;
787 throw std::invalid_argument(
"No specified formulation in params!");
791 val.row(i) = sigma * neumann_bc_normal;
virtual VectorNd compute_rhs(const AutodiffHessianPt &pt) const
std::vector< int > boundary_ids_
std::vector< int > neumann_boundary_ids_
Abstract mesh class to capture 2d/3d conforming and non-conforming meshes.
virtual int get_boundary_id(const int primitive) const
Get the boundary selection of an element (face in 3d, edge in 2d)
int dimension() const
utily for dimension
VectorNd eval_fun(const VectorNd &pt, const double t) const override
CompressionElasticProblemExact(const std::string &name)
void initial_solution(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &pts, Eigen::MatrixXd &val) const override
void initial_acceleration(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &pts, Eigen::MatrixXd &val) const override
DoubleTorsionElasticProblem(const std::string &name)
void set_parameters(const json ¶ms) override
void dirichlet_bc(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &uv, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const override
std::array< int, 2 > coordiante_0_
void initial_velocity(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &pts, Eigen::MatrixXd &val) const override
void rhs(const assembler::Assembler &assembler, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const override
std::array< int, 2 > coordiante_1_
ElasticCantileverExact(const std::string &name)
void exact(const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const override
void exact_grad(const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const override
int size_for(const Eigen::MatrixXd &pts) const
void set_parameters(const json ¶ms) override
void rhs(const assembler::Assembler &assembler, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const override
void neumann_bc(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &uv, const Eigen::MatrixXd &pts, const Eigen::MatrixXd &normals, const double t, Eigen::MatrixXd &val) const override
VectorNd eval_fun(const VectorNd &pt, const double t) const
void dirichlet_bc(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &uv, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const override
double singular_point_displacement
VectorNd eval_fun(const VectorNd &pt, const double t) const override
ElasticProblemExact(const std::string &name)
ElasticProblem(const std::string &name)
void dirichlet_bc(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &uv, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const override
void rhs(const assembler::Assembler &assembler, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const override
ElasticProblemZeroBC(const std::string &name)
void rhs(const assembler::Assembler &assembler, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const override
void dirichlet_bc(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &uv, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const override
void set_parameters(const json ¶ms) override
void initial_solution(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &pts, Eigen::MatrixXd &val) const override
void dirichlet_bc(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &uv, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const override
void rhs(const assembler::Assembler &assembler, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const override
void initial_velocity(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &pts, Eigen::MatrixXd &val) const override
GravityProblem(const std::string &name)
void initial_acceleration(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &pts, Eigen::MatrixXd &val) const override
VectorNd eval_fun(const VectorNd &pt, const double t) const override
LinearElasticProblemExact(const std::string &name)
VectorNd eval_fun(const VectorNd &pt, const double t) const override
QuadraticElasticProblemExact(const std::string &name)
void rhs(const assembler::Assembler &assembler, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const override
void set_parameters(const json ¶ms) override
void dirichlet_bc(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &uv, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const override
TorsionElasticProblem(const std::string &name)
void dirichlet_bc(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &uv, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const override
void initial_acceleration(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &pts, Eigen::MatrixXd &val) const override
void initial_solution(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &pts, Eigen::MatrixXd &val) const override
void initial_velocity(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &pts, Eigen::MatrixXd &val) const override
WalkProblem(const std::string &name)
void rhs(const assembler::Assembler &assembler, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const override
Eigen::ArrayXd P(const int m, const int p, const Eigen::ArrayXd &z)
Eigen::Matrix< AutodiffScalarHessian, Eigen::Dynamic, 1, 0, 3, 1 > AutodiffHessianPt
Eigen::Matrix< double, Eigen::Dynamic, 1, 0, 3, 1 > VectorNd
DScalar2< double, Eigen::Matrix< double, Eigen::Dynamic, 1, 0, 3, 1 >, Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3 > > AutodiffScalarHessian
DScalar1< double, Eigen::Matrix< double, Eigen::Dynamic, 1, 0, 3, 1 > > AutodiffScalarGrad
Eigen::Matrix< AutodiffScalarGrad, Eigen::Dynamic, 1, 0, 3, 1 > AutodiffGradPt
static void setVariableCount(size_t value)
Set the independent variable count used by the automatic differentiation layer.