7 : viscosity_(
"viscosity")
18 Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 3, 1>
21 assert(pt.size() ==
size());
22 Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 3, 1> res(
size());
24 Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 3, 1>
val(
size());
25 for (
int d = 0; d <
size(); ++d)
26 val(d) = pt(d).getValue();
29 for (
int d = 0; d <
size(); ++d)
31 res(d) = -
val.dot(pt(d).getGradient()) + nu * pt(d).getHessian().trace();
60 typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3> GradMat;
62 assert(data.
x.cols() == 1);
64 const int n_pts = data.
da.size();
67 Eigen::Matrix<double, Eigen::Dynamic, 1> local_vel(n_bases *
size(), 1);
69 for (
size_t i = 0; i < n_bases; ++i)
72 for (
size_t ii = 0; ii < bs.global.size(); ++ii)
74 for (
int d = 0; d <
size(); ++d)
76 local_vel(i *
size() + d) += bs.global[ii].val * data.
x(bs.global[ii].index *
size() + d);
81 Eigen::MatrixXd N(
size() * n_bases,
size() * n_bases);
87 Eigen::VectorXd vel(
size(), 1);
88 Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 3, 1> phi_j(
size(), 1);
90 for (
long p = 0; p < n_pts; ++p)
94 for (
size_t i = 0; i < n_bases; ++i)
97 const double val = bs.val(p);
99 for (
int d = 0; d <
size(); ++d)
101 vel(d) +=
val * local_vel(i *
size() + d);
105 for (
long k = 0; k < jac_it.size(); ++k)
108 for (
int i = 0; i < n_bases; ++i)
111 for (
int m = 0; m <
size(); ++m)
114 grad_i.row(m) = bi.grad.row(p);
115 grad_i = grad_i * jac_it;
117 for (
int j = 0; j < n_bases; ++j)
120 for (
int n = 0; n <
size(); ++n)
123 phi_j(n) = bj.val(p);
124 N(i *
size() + m, j *
size() + n) += (grad_i * vel).dot(phi_j) * data.
da(p);
138 typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3> GradMat;
140 assert(data.
x.cols() == 1);
142 const int n_pts = data.
da.size();
145 Eigen::Matrix<double, Eigen::Dynamic, 1> local_vel(n_bases *
size(), 1);
147 for (
size_t i = 0; i < n_bases; ++i)
150 for (
size_t ii = 0; ii < bs.global.size(); ++ii)
152 for (
int d = 0; d <
size(); ++d)
154 local_vel(i *
size() + d) += bs.global[ii].val * data.
x(bs.global[ii].index *
size() + d);
159 Eigen::MatrixXd W(
size() * n_bases,
size() * n_bases);
165 Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 3, 1> phi_i(
size(), 1);
166 Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 3, 1> phi_j(
size(), 1);
168 for (
long p = 0; p < n_pts; ++p)
172 for (
size_t i = 0; i < n_bases; ++i)
175 const Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 3, 1> grad = bs.grad.row(p);
176 assert(grad.size() ==
size());
178 for (
int d = 0; d <
size(); ++d)
180 for (
int c = 0; c <
size(); ++c)
182 grad_v(d, c) += grad(c) * local_vel(i *
size() + d);
187 for (
long k = 0; k < jac_it.size(); ++k)
189 grad_v = (grad_v * jac_it).eval();
191 for (
int i = 0; i < n_bases; ++i)
194 for (
int m = 0; m <
size(); ++m)
197 phi_i(m) = bi.val(p);
199 for (
int j = 0; j < n_bases; ++j)
202 for (
int n = 0; n <
size(); ++n)
205 phi_j(n) = bj.val(p);
206 W(i *
size() + m, j *
size() + n) += (grad_v * phi_i).dot(phi_j) * data.
da(p);
218 std::map<std::string, ParamFunc> res;
std::string viscosity() const
std::vector< AssemblyValues > basis_values
std::vector< Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3 > > jac_it
void add_multimaterial(const int index, const json ¶ms, const std::string &unit_type)
Eigen::MatrixXd assemble_hessian(const NonLinearAssemblerData &data) const override
Eigen::VectorXd assemble_gradient(const NonLinearAssemblerData &data) const override
void add_multimaterial(const int index, const json ¶ms, const Units &units) override
VectorNd compute_rhs(const AutodiffHessianPt &pt) const override
GenericMatParam viscosity_
std::map< std::string, ParamFunc > parameters() const override
Eigen::MatrixXd compute_N(const NonLinearAssemblerData &data) const
Eigen::MatrixXd compute_W(const NonLinearAssemblerData &data) const
const ElementAssemblyValues & vals
const Eigen::MatrixXd & x
const QuadratureVector & da
Eigen::Matrix< AutodiffScalarHessian, Eigen::Dynamic, 1, 0, 3, 1 > AutodiffHessianPt
Eigen::Matrix< double, 1, Eigen::Dynamic, Eigen::RowMajor, 1, 3 > RowVectorNd