15 if (params.count(
"models") == 0)
18 auto models = params[
"models"];
23 const std::string mat_spec = POLYFEM_MATERIAL_INPUT_SPEC;
24 std::ifstream file(mat_spec);
31 rules = jse.inject_include(rules);
33 for (
const auto &model : models)
35 const bool valid_input = jse.verify_json(model, rules);
38 jse.inject_defaults(model, rules);
40 const std::string model_name = model[
"type"];
44 assemblers_.emplace_back(std::dynamic_pointer_cast<NLAssembler>(assembler));
47 assemblers_.back()->add_multimaterial(index, model, units);
51 Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 3, 1>
54 assert(pt.size() ==
size());
55 Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 3, 1> res;
64 Eigen::VectorXd gradient =
assemblers_.front()->assemble_gradient(data);
68 gradient += assembler->assemble_gradient(data);
76 Eigen::MatrixXd hessian =
assemblers_.front()->assemble_hessian(data);
80 hessian += assembler->assemble_hessian(data);
87 double energy =
assemblers_.front()->compute_energy(data);
91 energy += assembler->compute_energy(data);
100 Eigen::MatrixXd &all,
101 const std::function<Eigen::MatrixXd(
const Eigen::MatrixXd &)> &fun)
const
105 std::dynamic_pointer_cast<assembler::ElasticityAssembler>(assembler)->assign_stress_tensor(data, all_size, type, all, fun);
111 std::map<std::string, Assembler::ParamFunc> params;
114 auto p = a->parameters();
117 params[a->name() +
"/" + it.first] = it.second;
static std::shared_ptr< Assembler > make_assembler(const std::string &formulation)
std::map< std::string, ParamFunc > parameters() const override
VectorNd compute_rhs(const AutodiffHessianPt &pt) const override
Eigen::VectorXd assemble_gradient(const NonLinearAssemblerData &data) const override
Eigen::MatrixXd assemble_hessian(const NonLinearAssemblerData &data) const override
std::vector< std::shared_ptr< assembler::NLAssembler > > assemblers_
void add_multimaterial(const int index, const json ¶ms, const Units &units) override
double compute_energy(const NonLinearAssemblerData &data) 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
Eigen::Matrix< AutodiffScalarHessian, Eigen::Dynamic, 1, 0, 3, 1 > AutodiffHessianPt
void log_and_throw_error(const std::string &msg)