PolyFEM
Loading...
Searching...
No Matches
Laplacian.hpp
Go to the documentation of this file.
1#pragma once
2
6
7// local assembler for laplace equation
8namespace polyfem
9{
10 namespace assembler
11 {
12 class Laplacian : public LinearAssembler, public NLAssembler
13 {
14 public:
15 explicit Laplacian(const std::string &conductivity_param_name = "");
16
21
22 std::string name() const override { return "Laplacian"; }
23 std::map<std::string, ParamFunc> parameters() const override;
24 void add_multimaterial(const int index, const json &params, const Units &units, const std::string &root_path) override;
25
29 Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 9, 1> assemble(const LinearAssemblerData &data) const override;
30
31 double compute_energy(const NonLinearAssemblerData &data) const override;
32 Eigen::VectorXd assemble_gradient(const NonLinearAssemblerData &data) const override;
33 Eigen::MatrixXd assemble_hessian(const NonLinearAssemblerData &data) const override;
34
38 VectorNd compute_rhs(const AutodiffHessianPt &pt) const override;
39
41 const Eigen::MatrixXd &mat,
42 Eigen::MatrixXd &stress,
43 Eigen::MatrixXd &result) const override;
44
45 void compute_stiffness_value(const double t,
47 const Eigen::MatrixXd &local_pts,
48 const Eigen::MatrixXd &displacement,
49 Eigen::MatrixXd &tensor) const override;
50
52 Eigen::Matrix<AutodiffScalarGrad, Eigen::Dynamic, 1, 0, 3, 1> kernel(const int dim, const AutodiffGradPt &rvect, const AutodiffScalarGrad &r) const override;
53
54 bool is_linear() const override { return true; }
55
56 private:
57 double conductivity(const RowVectorNd &uv, const RowVectorNd &p, double t, int element_id) const;
58
61 };
62 } // namespace assembler
63} // namespace polyfem
ElementAssemblyValues vals
Definition Assembler.cpp:25
stores per element basis values at given quadrature points and geometric mapping
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
Definition Laplacian.cpp:78
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
Definition Laplacian.cpp:93
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...
Definition Laplacian.cpp:62
double conductivity(const RowVectorNd &uv, const RowVectorNd &p, double t, int element_id) const
Definition Laplacian.cpp:54
void add_multimaterial(const int index, const json &params, const Units &units, const std::string &root_path) override
Definition Laplacian.cpp:48
Eigen::VectorXd assemble_gradient(const NonLinearAssemblerData &data) const override
Definition Laplacian.cpp:86
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_
Definition Laplacian.hpp:60
std::map< std::string, ParamFunc > parameters() const override
Definition Laplacian.cpp:35
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....
std::string name() const override
Definition Laplacian.hpp:22
bool is_linear() const override
Definition Laplacian.hpp:54
assemble matrix based on the local assembler local assembler is eg Laplace, LinearElasticity etc
void assemble(const bool is_volume, const int n_basis, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &cache, const double t, StiffnessMatrix &stiffness, const bool is_mass=false) const override
assembles the stiffness matrix for the given basis the bilinear form (local assembler) is encoded by ...
double assemble_energy(const bool is_volume, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &cache, const double t, const double dt, const Eigen::MatrixXd &displacement, const Eigen::MatrixXd &displacement_prev) const override
void assemble_gradient(const bool is_volume, const int n_basis, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &cache, const double t, const double dt, const Eigen::MatrixXd &displacement, const Eigen::MatrixXd &displacement_prev, Eigen::MatrixXd &rhs) const override
void assemble_hessian(const bool is_volume, const int n_basis, const bool project_to_psd, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &cache, const double t, const double dt, const Eigen::MatrixXd &displacement, const Eigen::MatrixXd &displacement_prev, utils::MatrixCache &mat_cache, StiffnessMatrix &grad) 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
nlohmann::json json
Definition Common.hpp:9
Eigen::Matrix< double, 1, Eigen::Dynamic, Eigen::RowMajor, 1, 3 > RowVectorNd
Definition Types.hpp:13
Eigen::Matrix< AutodiffScalarGrad, Eigen::Dynamic, 1, 0, 3, 1 > AutodiffGradPt
Automatic differentiation scalar with first-order derivatives.
Definition autodiff.h:112