PolyFEM
Loading...
Searching...
No Matches
MultiModel.cpp
Go to the documentation of this file.
1#include "MultiModel.hpp"
2
3#include <cstddef>
4#include <set>
5
6// #include <polyfem/basis/Basis.hpp>
7// #include <polyfem/autogen/auto_elasticity_rhs.hpp>
8
9// #include <igl/Timer.h>
10
11namespace polyfem::assembler
12{
19
20 void MultiModel::add_multimaterial(const int index, const json &params, const Units &units, const std::string &root_path)
21 {
22 assert(size() == 2 || size() == 3);
23
24 all_elastic_materials_.add_multimaterial(index, params, units, root_path);
25 }
26
27 Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 3, 1>
29 {
30 assert(pt.size() == size());
31 Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 3, 1> res;
32 assert(false);
33
34 return res;
35 }
36
37 Eigen::VectorXd
39 {
40 const int el_id = data.vals.element_id;
41 const std::string model = multi_material_models_[el_id];
42 const auto assembler = all_elastic_materials_.get_assembler(model);
43 return assembler->assemble_gradient(data);
44 }
45
46 Eigen::MatrixXd
48 {
49 const int el_id = data.vals.element_id;
50 const std::string model = multi_material_models_[el_id];
51 const auto assembler = all_elastic_materials_.get_assembler(model);
52 return assembler->assemble_hessian(data);
53 }
54
56 {
57 const int el_id = data.vals.element_id;
58 const std::string model = multi_material_models_[el_id];
59 const auto assembler = all_elastic_materials_.get_assembler(model);
60 return assembler->compute_energy(data);
61 }
62
64 const OutputData &data,
65 const int all_size,
66 const ElasticityTensorType &type,
67 Eigen::MatrixXd &all,
68 const std::function<Eigen::MatrixXd(const Eigen::MatrixXd &)> &fun) const
69 {
70 const std::string model = multi_material_models_[data.el_id];
71 const auto assembler = all_elastic_materials_.get_assembler(model);
72 auto elasticity_assembler = dynamic_cast<ElasticityNLAssembler *>(assembler.get());
73 assert(elasticity_assembler && "Failed to cast assembler to ElasticityNLAssembler.");
74 elasticity_assembler->assign_stress_tensor(data, all_size, type, all, fun);
75 }
76
77 std::map<std::string, Assembler::ParamFunc> MultiModel::parameters() const
78 {
79 std::map<std::string, Assembler::ParamFunc> params;
80 const std::set<std::string> active_models(multi_material_models_.begin(), multi_material_models_.end());
81
82 for (const std::string &model : active_models)
83 {
84 const auto assembler = all_elastic_materials_.get_assembler(model);
85 for (const auto &entry : assembler->parameters())
86 {
87 const std::string name = entry.first;
88 const ParamFunc func = entry.second;
89 params[model + "/" + name] = [this, model, func](const RowVectorNd &uv, const RowVectorNd &p, double t, int e) {
90 if (e < 0 || std::size_t(e) >= multi_material_models_.size() || multi_material_models_[e] != model)
91 return 0.0;
92 return func(uv, p, t, e);
93 };
94 }
95 }
96
97 return params;
98 }
99} // namespace polyfem::assembler
std::shared_ptr< assembler::ElasticityNLAssembler > get_assembler(const std::string &name) const
void add_multimaterial(const int index, const json &params, const Units &units, const std::string &root_path)
std::function< double(const RowVectorNd &, const RowVectorNd &, double, int)> ParamFunc
Definition Assembler.hpp:59
virtual void set_size(const int size)
Definition Assembler.hpp:66
VectorNd compute_rhs(const AutodiffHessianPt &pt) const override
std::vector< std::string > multi_material_models_
void set_size(const int size) 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 add_multimaterial(const int index, const json &params, const Units &units, const std::string &root_path) override
Used for test only.
Eigen::Matrix< AutodiffScalarHessian, Eigen::Dynamic, 1, 0, 3, 1 > AutodiffHessianPt
nlohmann::json json
Definition Common.hpp:9
Eigen::Matrix< double, 1, Eigen::Dynamic, Eigen::RowMajor, 1, 3 > RowVectorNd
Definition Types.hpp:13