PolyFEM
Loading...
Searching...
No Matches
ProblemWithSolution.cpp
Go to the documentation of this file.
2
3namespace polyfem
4{
5 namespace problem
6 {
8 : Problem(name)
9 {
10 }
11
12 void ProblemWithSolution::rhs(const assembler::Assembler &assembler, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const
13 {
14 const int size = size_for(pts);
15 val.resize(pts.rows(), size);
16
17 for (long i = 0; i < pts.rows(); ++i)
18 {
20 AutodiffHessianPt pt(pts.cols());
21
22 for (long d = 0; d < pts.cols(); ++d)
23 pt(d) = AutodiffScalarHessian(d, pts(i, d));
24
25 const auto res = eval_fun(pt, t);
26
27 val.row(i) = assembler.compute_rhs(res).transpose();
28 }
29 }
30
31 void ProblemWithSolution::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
32 {
33 exact(pts, t, val);
34 }
35
36 void ProblemWithSolution::exact(const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const
37 {
38 val.resize(pts.rows(), size_for(pts));
39
40 for (long i = 0; i < pts.rows(); ++i)
41 {
42 val.row(i) = eval_fun(VectorNd(pts.row(i)), t);
43 }
44 }
45
46 void ProblemWithSolution::exact_grad(const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const
47 {
48 const int size = size_for(pts);
49 val.resize(pts.rows(), pts.cols() * size);
50
51 for (long i = 0; i < pts.rows(); ++i)
52 {
54 AutodiffGradPt pt(pts.cols());
55
56 for (long d = 0; d < pts.cols(); ++d)
57 pt(d) = AutodiffScalarGrad(d, pts(i, d));
58
59 const auto res = eval_fun(pt, t);
60
61 for (int m = 0; m < size; ++m)
62 {
63 const auto &tmp = res(m);
64 val.block(i, m * pts.cols(), 1, pts.cols()) = tmp.getGradient().transpose();
65 }
66 }
67 }
68
70 : Problem(name)
71 {
72 }
73
74 void BilaplacianProblemWithSolution::rhs(const assembler::Assembler &assembler, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const
75 {
76 val.resize(pts.rows(), 1);
77
78 for (long i = 0; i < pts.rows(); ++i)
79 {
80 const double x = pts(i, 0);
81 const double y = pts(i, 1);
82 val(i) = 24 * x * x * x * x - 48 * x * x * x + 288 * (y - 0.5) * (y - 0.5) * x * x + (-288 * y * y + 288 * y - 48) * x + 24 * y * y * y * y - 48 * y * y * y + 72 * y * y - 48 * y + 8;
83 }
84 }
85
86 void BilaplacianProblemWithSolution::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
87 {
88 exact(pts, t, val);
89 }
90
91 void BilaplacianProblemWithSolution::exact(const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const
92 {
93 val.resize(pts.rows(), 1);
94
95 for (long i = 0; i < pts.rows(); ++i)
96 {
97 const double x = pts(i, 0);
98 const double y = pts(i, 1);
99 val(i) = x * x * (1 - x) * (1 - x) * y * y * (1 - y) * (1 - y);
100 }
101 }
102
103 void BilaplacianProblemWithSolution::exact_grad(const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const
104 {
105 val.resize(pts.rows(), pts.cols());
106 }
107 } // namespace problem
108} // namespace polyfem
double val
Definition Assembler.cpp:86
int y
int x
virtual VectorNd compute_rhs(const AutodiffHessianPt &pt) const
Abstract mesh class to capture 2d/3d conforming and non-conforming meshes.
Definition Mesh.hpp:39
void exact_grad(const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const override
void exact(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 rhs(const assembler::Assembler &assembler, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const override
virtual void rhs(const assembler::Assembler &assembler, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const override
virtual int size_for(const Eigen::MatrixXd &pts) const
virtual void exact(const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const override
virtual 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
virtual VectorNd eval_fun(const VectorNd &pt, double t) const =0
virtual void exact_grad(const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val) const override
Eigen::Matrix< AutodiffScalarHessian, Eigen::Dynamic, 1, 0, 3, 1 > AutodiffHessianPt
Eigen::Matrix< double, Eigen::Dynamic, 1, 0, 3, 1 > VectorNd
Definition Types.hpp:11
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.
Definition autodiff.h:54