Loading [MathJax]/extensions/tex2jax.js
PolyFEM
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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)
13 {
14 assert(size() == 2 || size() == 3);
15 if (params.count("models") == 0)
16 return;
17
18 auto models = params["models"];
19
20 json rules;
21 jse::JSE jse;
22 jse.strict = true;
23 const std::string mat_spec = POLYFEM_MATERIAL_INPUT_SPEC;
24 std::ifstream file(mat_spec);
25
26 if (file.is_open())
27 file >> rules;
28 else
29 log_and_throw_error(fmt::format("unable to open {} rules", mat_spec));
30
31 rules = jse.inject_include(rules);
32
33 for (const auto &model : models)
34 {
35 const bool valid_input = jse.verify_json(model, rules);
36 if (!valid_input)
37 log_and_throw_error(fmt::format("invalid material json:\n{}", jse.log2str()));
38 jse.inject_defaults(model, rules);
39
40 const std::string model_name = model["type"];
41
42 const auto assembler = AssemblerUtils::make_assembler(model_name);
43 // cast assembler to elasticity assembler
44 assemblers_.emplace_back(std::dynamic_pointer_cast<NLAssembler>(assembler));
45 assert(assemblers_.back() != nullptr);
46 assemblers_.back()->set_size(size());
47 assemblers_.back()->add_multimaterial(index, model, units);
48 }
49 }
50
51 Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 3, 1>
53 {
54 assert(pt.size() == size());
55 Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 3, 1> res;
56 assert(false);
57
58 return res;
59 }
60
61 Eigen::VectorXd
63 {
64 Eigen::VectorXd gradient = assemblers_.front()->assemble_gradient(data);
65 for (size_t i = 1; i < assemblers_.size(); ++i)
66 {
67 const auto assembler = assemblers_[i];
68 gradient += assembler->assemble_gradient(data);
69 }
70 return gradient;
71 }
72
73 Eigen::MatrixXd
75 {
76 Eigen::MatrixXd hessian = assemblers_.front()->assemble_hessian(data);
77 for (size_t i = 1; i < assemblers_.size(); ++i)
78 {
79 const auto assembler = assemblers_[i];
80 hessian += assembler->assemble_hessian(data);
81 }
82 return hessian;
83 }
84
86 {
87 double energy = assemblers_.front()->compute_energy(data);
88 for (size_t i = 1; i < assemblers_.size(); ++i)
89 {
90 const auto assembler = assemblers_[i];
91 energy += assembler->compute_energy(data);
92 }
93 return energy;
94 }
95
97 const OutputData &data,
98 const int all_size,
99 const ElasticityTensorType &type,
100 Eigen::MatrixXd &all,
101 const std::function<Eigen::MatrixXd(const Eigen::MatrixXd &)> &fun) const
102 {
103 for (const auto &assembler : assemblers_)
104 {
105 std::dynamic_pointer_cast<assembler::ElasticityAssembler>(assembler)->assign_stress_tensor(data, all_size, type, all, fun);
106 }
107 }
108
109 std::map<std::string, Assembler::ParamFunc> SumModel::parameters() const
110 {
111 std::map<std::string, Assembler::ParamFunc> params;
112 for (const auto &a : assemblers_)
113 {
114 auto p = a->parameters();
115 for (auto &it : p)
116 {
117 params[a->name() + "/" + it.first] = it.second;
118 }
119 }
120 return params;
121 }
122} // namespace polyfem::assembler
static std::shared_ptr< Assembler > make_assembler(const std::string &formulation)
std::map< std::string, ParamFunc > parameters() const override
Definition SumModel.cpp:109
VectorNd compute_rhs(const AutodiffHessianPt &pt) const override
Definition SumModel.cpp:52
Eigen::VectorXd assemble_gradient(const NonLinearAssemblerData &data) const override
Definition SumModel.cpp:62
Eigen::MatrixXd assemble_hessian(const NonLinearAssemblerData &data) const override
Definition SumModel.cpp:74
std::vector< std::shared_ptr< assembler::NLAssembler > > assemblers_
Definition SumModel.hpp:42
void add_multimaterial(const int index, const json &params, const Units &units) override
Definition SumModel.cpp:12
double compute_energy(const NonLinearAssemblerData &data) const override
Definition SumModel.cpp:85
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:96
Used for test only.
Eigen::Matrix< AutodiffScalarHessian, Eigen::Dynamic, 1, 0, 3, 1 > AutodiffHessianPt
nlohmann::json json
Definition Common.hpp:9
void log_and_throw_error(const std::string &msg)
Definition Logger.cpp:73