PolyFEM
Loading...
Searching...
No Matches
SumModel.cpp
Go to the documentation of this file.
1#include "SumModel.hpp"
2
3#include <jse/jse.h>
4
5// #include <polyfem/basis/Basis.hpp>
6// #include <polyfem/autogen/auto_elasticity_rhs.hpp>
7
8// #include <igl/Timer.h>
9
10namespace polyfem::assembler
11{
12 void SumModel::add_multimaterial(const int index, const json &params, const Units &units, const std::string &root_path)
13 {
14 assert(size() == 2 || size() == 3);
15 if (params.count("models") == 0)
16 return;
17
18 auto models = params["models"];
19
20 // add_multimaterial may be invoked once per mesh element (see Assembler::set_materials),
21 // so the child assemblers must be created once and then reused across calls, not appended every time.
22 if (assemblers_.empty())
23 {
24 for (const auto &model : models)
25 {
26 const std::string model_name = model["type"];
27
28 const auto assembler = AssemblerUtils::make_assembler(model_name);
29 // cast assembler to elasticity assembler
30 assemblers_.emplace_back(std::dynamic_pointer_cast<NLAssembler>(assembler));
31 assert(assemblers_.back() != nullptr);
32 assemblers_.back()->set_size(size());
33 }
34 }
35
36 assert(assemblers_.size() == models.size());
37 for (size_t i = 0; i < assemblers_.size(); ++i)
38 assemblers_[i]->add_multimaterial(index, models[i], units, root_path);
39 }
40
41 Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 3, 1>
43 {
44 assert(pt.size() == size());
45 Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 3, 1> res;
46 assert(false);
47
48 return res;
49 }
50
51 Eigen::VectorXd
53 {
54 Eigen::VectorXd gradient = assemblers_.front()->assemble_gradient(data);
55 for (size_t i = 1; i < assemblers_.size(); ++i)
56 {
57 const auto assembler = assemblers_[i];
58 gradient += assembler->assemble_gradient(data);
59 }
60 return gradient;
61 }
62
63 Eigen::MatrixXd
65 {
66 Eigen::MatrixXd hessian = assemblers_.front()->assemble_hessian(data);
67 for (size_t i = 1; i < assemblers_.size(); ++i)
68 {
69 const auto assembler = assemblers_[i];
70 hessian += assembler->assemble_hessian(data);
71 }
72 return hessian;
73 }
74
76 {
77 double energy = assemblers_.front()->compute_energy(data);
78 for (size_t i = 1; i < assemblers_.size(); ++i)
79 {
80 const auto assembler = assemblers_[i];
81 energy += assembler->compute_energy(data);
82 }
83 return energy;
84 }
85
87 const OutputData &data,
88 const int all_size,
89 const ElasticityTensorType &type,
90 Eigen::MatrixXd &all,
91 const std::function<Eigen::MatrixXd(const Eigen::MatrixXd &)> &fun) const
92 {
93 all.resize(data.local_pts.rows(), all_size);
94 all.setZero();
95
96 Eigen::MatrixXd tmp;
97
98 if (type == ElasticityTensorType::F)
99 {
100 std::dynamic_pointer_cast<assembler::ElasticityAssembler>(assemblers_.front())
101 ->assign_stress_tensor(data, all_size, type, all, fun);
102 return;
103 }
104
105 for (const auto &assembler : assemblers_)
106 {
107 std::dynamic_pointer_cast<assembler::ElasticityNLAssembler>(assembler)->assign_stress_tensor(data, all_size, type, tmp, fun);
108 all += tmp;
109 }
110 }
111
112 std::map<std::string, Assembler::ParamFunc> SumModel::parameters() const
113 {
114 std::map<std::string, Assembler::ParamFunc> params;
115 for (const auto &a : assemblers_)
116 {
117 auto p = a->parameters();
118 for (auto &it : p)
119 {
120 params[a->name() + "/" + it.first] = it.second;
121 }
122 }
123 return params;
124 }
125} // namespace polyfem::assembler
static std::shared_ptr< Assembler > make_assembler(const std::string &formulation)
const Eigen::MatrixXd & local_pts
void add_multimaterial(const int index, const json &params, const Units &units, const std::string &root_path) override
Definition SumModel.cpp:12
std::map< std::string, ParamFunc > parameters() const override
Definition SumModel.cpp:112
VectorNd compute_rhs(const AutodiffHessianPt &pt) const override
Definition SumModel.cpp:42
Eigen::VectorXd assemble_gradient(const NonLinearAssemblerData &data) const override
Definition SumModel.cpp:52
Eigen::MatrixXd assemble_hessian(const NonLinearAssemblerData &data) const override
Definition SumModel.cpp:64
std::vector< std::shared_ptr< assembler::NLAssembler > > assemblers_
Definition SumModel.hpp:42
double compute_energy(const NonLinearAssemblerData &data) const override
Definition SumModel.cpp:75
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
Definition SumModel.cpp:86
Used for test only.
Eigen::Matrix< AutodiffScalarHessian, Eigen::Dynamic, 1, 0, 3, 1 > AutodiffHessianPt
nlohmann::json json
Definition Common.hpp:9