Loading [MathJax]/extensions/tex2jax.js
PolyFEM
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
MultiModel.cpp
Go to the documentation of this file.
1#include "MultiModel.hpp"
2
3// #include <polyfem/basis/Basis.hpp>
4// #include <polyfem/autogen/auto_elasticity_rhs.hpp>
5
6// #include <igl/Timer.h>
7
8namespace polyfem::assembler
9{
16
17 void MultiModel::add_multimaterial(const int index, const json &params, const Units &units)
18 {
19 assert(size() == 2 || size() == 3);
20
21 all_elastic_materials_.add_multimaterial(index, params, units);
22 }
23
24 Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 3, 1>
26 {
27 assert(pt.size() == size());
28 Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 3, 1> res;
29 assert(false);
30
31 return res;
32 }
33
34 Eigen::VectorXd
36 {
37 const int el_id = data.vals.element_id;
38 const std::string model = multi_material_models_[el_id];
39 const auto assembler = all_elastic_materials_.get_assembler(model);
40 return assembler->assemble_gradient(data);
41 }
42
43 Eigen::MatrixXd
45 {
46 const int el_id = data.vals.element_id;
47 const std::string model = multi_material_models_[el_id];
48 const auto assembler = all_elastic_materials_.get_assembler(model);
49 return assembler->assemble_hessian(data);
50 }
51
53 {
54 const int el_id = data.vals.element_id;
55 const std::string model = multi_material_models_[el_id];
56 const auto assembler = all_elastic_materials_.get_assembler(model);
57 return assembler->compute_energy(data);
58 }
59
61 const OutputData &data,
62 const int all_size,
63 const ElasticityTensorType &type,
64 Eigen::MatrixXd &all,
65 const std::function<Eigen::MatrixXd(const Eigen::MatrixXd &)> &fun) const
66 {
67 const std::string model = multi_material_models_[data.el_id];
68 const auto assembler = all_elastic_materials_.get_assembler(model);
69 auto elasticity_assembler = std::dynamic_pointer_cast<assembler::ElasticityAssembler>(assembler);
70 assert(elasticity_assembler && "Failed to cast assembler to ElasticityAssembler.");
71 elasticity_assembler->assign_stress_tensor(data, all_size, type, all, fun);
72 }
73
74 std::map<std::string, Assembler::ParamFunc> MultiModel::parameters() const
75 {
77 }
78} // namespace polyfem::assembler
void add_multimaterial(const int index, const json &params, const Units &units)
std::map< std::string, Assembler::ParamFunc > parameters() const
std::shared_ptr< assembler::NLAssembler > get_assembler(const std::string &name) const
virtual void set_size(const int size)
Definition Assembler.hpp:64
VectorNd compute_rhs(const AutodiffHessianPt &pt) const override
std::vector< std::string > multi_material_models_
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
Used for test only.
Eigen::Matrix< AutodiffScalarHessian, Eigen::Dynamic, 1, 0, 3, 1 > AutodiffHessianPt
nlohmann::json json
Definition Common.hpp:9