7 bool delta(
int i,
int j)
9 return (i == j) ? true :
false;
12 Eigen::VectorXd local_scalar_values(
const NonLinearAssemblerData &data)
14 assert(data.x.cols() == 1);
16 const int n_bases = int(data.vals.basis_values.size());
17 Eigen::VectorXd local_u = Eigen::VectorXd::Zero(n_bases);
18 for (
int i = 0; i < n_bases; ++i)
20 const auto &bs = data.vals.basis_values[i];
21 for (
const auto &global : bs.global)
22 local_u(i) += global.
val * data.
x(global.index);
30 : conductivity_param_name_(conductivity_param_name),
31 conductivity_(conductivity_param_name.empty() ?
"conductivity" : conductivity_param_name)
37 std::map<std::string, ParamFunc> res;
68 assert(gradi.rows() == data.
da.size());
69 for (
int k = 0; k < gradi.rows(); ++k)
73 res += kappa * gradi.row(k).dot(gradj.row(k)) * data.
da(k);
75 return Eigen::Matrix<double, 1, 1>::Constant(res);
82 const Eigen::VectorXd local_u = local_scalar_values(data);
98 Eigen::MatrixXd hessian = Eigen::MatrixXd::Zero(n_bases, n_bases);
99 for (
int i = 0; i < n_bases; ++i)
101 for (
int j = 0; j < n_bases; ++j)
110 Eigen::Matrix<double, 1, 1> result;
111 assert(pt.size() == 1);
112 result(0) = pt(0).getHessian().trace();
118 Eigen::Matrix<AutodiffScalarGrad, Eigen::Dynamic, 1, 0, 3, 1> res(1);
121 res(0) = -1. / (2 * M_PI) * log(r);
123 res(0) = 1. / (4 * M_PI * r);
131 const Eigen::MatrixXd &mat,
132 Eigen::MatrixXd &stress,
133 Eigen::MatrixXd &result)
const
141 const Eigen::MatrixXd &local_pts,
142 const Eigen::MatrixXd &displacement,
143 Eigen::MatrixXd &tensor)
const
145 const int dim = local_pts.cols();
146 tensor.resize(local_pts.rows(), dim * dim);
147 assert(displacement.cols() == 1);
149 for (
long p = 0; p < local_pts.rows(); ++p)
152 for (
int i = 0, idx = 0; i < dim; i++)
153 for (
int j = 0; j < dim; j++)
155 tensor(p, idx) = kappa * delta(i, j);
ElementAssemblyValues vals
std::string thermal_conductivity() const
stores per element basis values at given quadrature points and geometric mapping
std::vector< AssemblyValues > basis_values
quadrature::Quadrature quadrature
void add_multimaterial(const int index, const json ¶ms, const std::string &unit_type, const std::string &root_path)
Eigen::Matrix< AutodiffScalarGrad, Eigen::Dynamic, 1, 0, 3, 1 > kernel(const int dim, const AutodiffGradPt &rvect, const AutodiffScalarGrad &r) const override
kernel of the pde, used in kernel problem
double compute_energy(const NonLinearAssemblerData &data) const override
void compute_stress_grad_multiply_mat(const OptAssemblerData &data, const Eigen::MatrixXd &mat, Eigen::MatrixXd &stress, Eigen::MatrixXd &result) const override
Eigen::MatrixXd assemble_hessian(const NonLinearAssemblerData &data) const override
Eigen::Matrix< double, Eigen::Dynamic, 1, 0, 9, 1 > assemble(const LinearAssemblerData &data) const override
computes local stiffness matrix (1x1) for bases i,j where i,j is passed in through data ie integral o...
Laplacian(const std::string &conductivity_param_name="")
double conductivity(const RowVectorNd &uv, const RowVectorNd &p, double t, int element_id) const
void add_multimaterial(const int index, const json ¶ms, const Units &units, const std::string &root_path) override
Eigen::VectorXd assemble_gradient(const NonLinearAssemblerData &data) const override
void compute_stiffness_value(const double t, const assembler::ElementAssemblyValues &vals, const Eigen::MatrixXd &local_pts, const Eigen::MatrixXd &displacement, Eigen::MatrixXd &tensor) const override
GenericMatParam conductivity_
std::map< std::string, ParamFunc > parameters() const override
std::string conductivity_param_name_
VectorNd compute_rhs(const AutodiffHessianPt &pt) const override
uses autodiff to compute the rhs for a fabricated solution in this case it just return pt....
const ElementAssemblyValues & vals
stores the evaluation for that element
const QuadratureVector & da
contains both the quadrature weight and the change of metric in the integral
const int i
first local order
const int j
second local order
const ElementAssemblyValues & vals
const QuadratureVector & da
const Eigen::MatrixXd & grad_u_i
Eigen::Matrix< AutodiffScalarHessian, Eigen::Dynamic, 1, 0, 3, 1 > AutodiffHessianPt
Eigen::Matrix< double, 1, Eigen::Dynamic, Eigen::RowMajor, 1, 3 > RowVectorNd
Eigen::Matrix< AutodiffScalarGrad, Eigen::Dynamic, 1, 0, 3, 1 > AutodiffGradPt
Automatic differentiation scalar with first-order derivatives.