Loading [MathJax]/extensions/tex2jax.js
PolyFEM
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
MultiModel.hpp
Go to the documentation of this file.
1#pragma once
2
5
6namespace polyfem::assembler
7{
9 {
10 public:
14
15 // compute elastic energy
16 double compute_energy(const NonLinearAssemblerData &data) const override;
17 // neccessary for mixing linear model with non-linear collision response
18 Eigen::MatrixXd assemble_hessian(const NonLinearAssemblerData &data) const override;
19 // compute gradient of elastic energy, as assembler
20 Eigen::VectorXd assemble_gradient(const NonLinearAssemblerData &data) const override;
21
22 // uses autodiff to compute the rhs for a fabbricated solution
23 // uses autogenerated code to compute div(sigma)
24 // pt is the evaluation of the solution at a point
25 VectorNd compute_rhs(const AutodiffHessianPt &pt) const override;
26 void set_size(const int size) override;
27
28 // inialize material parameter
29 void add_multimaterial(const int index, const json &params, const Units &units) override;
30
31 // initialized multi models
32 inline void init_multimodels(const std::vector<std::string> &mats) { multi_material_models_ = mats; }
33
34 std::string name() const override { return "MultiModels"; }
35 bool allow_inversion() const override { return true; }
36 std::map<std::string, ParamFunc> parameters() const override;
37
38 protected:
39 void assign_stress_tensor(const OutputData &data,
40 const int all_size,
41 const ElasticityTensorType &type,
42 Eigen::MatrixXd &all,
43 const std::function<Eigen::MatrixXd(const Eigen::MatrixXd &)> &fun) const override;
44
45 private:
46 std::vector<std::string> multi_material_models_;
47
49 };
50} // namespace polyfem::assembler
utility to create a map of all elastic materials
VectorNd compute_rhs(const AutodiffHessianPt &pt) const override
std::vector< std::string > multi_material_models_
bool allow_inversion() const override
void set_size(const int size) override
void add_multimaterial(const int index, const json &params, const Units &units) override
Eigen::MatrixXd assemble_hessian(const NonLinearAssemblerData &data) const override
Eigen::VectorXd assemble_gradient(const NonLinearAssemblerData &data) const override
double compute_energy(const NonLinearAssemblerData &data) const override
AllElasticMaterials all_elastic_materials_
std::map< std::string, ParamFunc > parameters() const override
void assign_stress_tensor(const OutputData &data, const int all_size, const ElasticityTensorType &type, Eigen::MatrixXd &all, const std::function< Eigen::MatrixXd(const Eigen::MatrixXd &)> &fun) const override
std::string name() const override
void init_multimodels(const std::vector< std::string > &mats)
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
Used for test only.
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