PolyFEM
Loading...
Searching...
No Matches
Assembler.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <polyfem/Units.hpp>
4
7
12
13#include <functional>
14
15// this casses are instantiated in the cpp, cannot be used with generic assembler
16// without adding template instantiation
17namespace polyfem::assembler
18{
19 // mixed formulation assembler
21 {
22 public:
24 virtual ~MixedAssembler() = default;
25
26 // this assembler takes two bases: psi_bases are the scalar ones, phi_bases are the tensor ones
27 // both have the same geometric mapping
29 const bool is_volume,
30 const int n_psi_basis,
31 const int n_phi_basis,
32 const std::vector<basis::ElementBases> &psi_bases,
33 const std::vector<basis::ElementBases> &phi_bases,
34 const std::vector<basis::ElementBases> &gbases,
35 const AssemblyValsCache &psi_cache,
36 const AssemblyValsCache &phi_cache,
37 const double t,
38 StiffnessMatrix &stiffness) const;
39
40 virtual std::string name() const = 0;
41
42 int size() const { return size_; }
43 virtual void set_size(const int size) { size_ = size; }
44
45 protected:
46 int size_ = -1;
47
48 virtual int rows() const = 0;
49 virtual int cols() const = 0;
50
51 virtual Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 3, 1> assemble(const MixedAssemblerData &data) const = 0;
52 };
53
56 {
57 public:
58 typedef std::pair<std::string, Eigen::MatrixXd> NamedMatrix;
59 typedef std::function<double(const RowVectorNd &, const RowVectorNd &, double, int)> ParamFunc;
60
61 virtual ~Assembler() = default;
62
63 virtual std::string name() const = 0;
64
65 int size() const { return size_; }
66 virtual void set_size(const int size) { size_ = size; }
67
68 // assembler stiffness matrix, is the mesh is volumetric, number of bases and bases (FE and geom)
69 // gbases and bases can be the same (ie isoparametric)
70 virtual void assemble(
71 const bool is_volume,
72 const int n_basis,
73 const std::vector<basis::ElementBases> &bases,
74 const std::vector<basis::ElementBases> &gbases,
76 const double t,
77 StiffnessMatrix &stiffness,
78 const bool is_mass = false) const { log_and_throw_error("Assembler not implemented by {}!", name()); }
79
80 // assemble energy
81 virtual double assemble_energy(
82 const bool is_volume,
83 const std::vector<basis::ElementBases> &bases,
84 const std::vector<basis::ElementBases> &gbases,
86 const double t,
87 const double dt,
88 const Eigen::MatrixXd &displacement,
89 const Eigen::MatrixXd &displacement_prev) const { log_and_throw_error("Assemble energy not implemented by {}!", name()); }
90
91 virtual Eigen::VectorXd assemble_energy_per_element(
92 const bool is_volume,
93 const std::vector<basis::ElementBases> &bases,
94 const std::vector<basis::ElementBases> &gbases,
96 const double t,
97 const double dt,
98 const Eigen::MatrixXd &displacement,
99 const Eigen::MatrixXd &displacement_prev) const { log_and_throw_error("Assemble energy not implemented by {}!", name()); }
100
101 // assemble gradient of energy (rhs)
102 virtual void assemble_gradient(
103 const bool is_volume,
104 const int n_basis,
105 const std::vector<basis::ElementBases> &bases,
106 const std::vector<basis::ElementBases> &gbases,
108 const double t,
109 const double dt,
110 const Eigen::MatrixXd &displacement,
111 const Eigen::MatrixXd &displacement_prev,
112 Eigen::MatrixXd &rhs) const { log_and_throw_error("Assemble grad not implemented by {}!", name()); }
113
114 // assemble hessian of energy (grad)
115 virtual void assemble_hessian(
116 const bool is_volume,
117 const int n_basis,
118 const bool project_to_psd,
119 const std::vector<basis::ElementBases> &bases,
120 const std::vector<basis::ElementBases> &gbases,
122 const double t,
123 const double dt,
124 const Eigen::MatrixXd &displacement,
125 const Eigen::MatrixXd &displacement_prev,
126 utils::MatrixCache &mat_cache,
127 StiffnessMatrix &grad) const { log_and_throw_error("Assemble hessian not implemented by {}!", name()); }
128
129 // plotting (eg von mises), assembler is the name of the formulation
131 const OutputData &data,
132 std::vector<NamedMatrix> &result) const {}
133
134 // computes tensor, assembler is the name of the formulation
136 const OutputData &data,
137 std::vector<NamedMatrix> &result) const
138 {
139 }
140
141 // computes tensor, assembler is the name of the formulation
143 const double t,
145 const Eigen::MatrixXd &local_pts,
146 const Eigen::MatrixXd &displacement,
147 Eigen::MatrixXd &tensor) const { log_and_throw_error("Not implemented!"); }
148
150 const OptAssemblerData &data,
151 Eigen::MatrixXd &dstress_dmu,
152 Eigen::MatrixXd &dstress_dlambda) const { log_and_throw_adjoint_error("Not implemented!"); }
153
155 const OptAssemblerData &data,
156 const Eigen::MatrixXd &mat,
157 Eigen::MatrixXd &stress,
158 Eigen::MatrixXd &result) const { log_and_throw_adjoint_error("Not implemented!"); }
159
161 const OptAssemblerData &data,
162 Eigen::MatrixXd &stress,
163 Eigen::MatrixXd &result) const
164 {
165 Eigen::MatrixXd unused;
166 compute_stress_grad_multiply_mat(data, Eigen::MatrixXd::Zero(data.grad_u_i.rows(), data.grad_u_i.cols()), stress, unused);
167 compute_stress_grad_multiply_mat(data, stress, unused, result);
168 }
169
171 const OptAssemblerData &data,
172 const Eigen::MatrixXd &vect,
173 Eigen::MatrixXd &stress,
174 Eigen::MatrixXd &result) const { log_and_throw_error("Not implemented!"); }
175
177 const OptAssemblerData &data,
178 const Eigen::MatrixXd &prev_grad_u_i,
179 Eigen::MatrixXd &stress,
180 Eigen::MatrixXd &result) const { log_and_throw_adjoint_error("Not implemented!"); }
182 const OptAssemblerData &data,
183 const Eigen::MatrixXd &prev_grad_u_i,
184 Eigen::MatrixXd &result) const { log_and_throw_adjoint_error("Not implemented!"); }
185
186 virtual std::map<std::string, ParamFunc> parameters() const = 0;
187 virtual VectorNd compute_rhs(const AutodiffHessianPt &pt) const { log_and_throw_error("Rhs not supported by {}!", name()); }
188
189 virtual Eigen::Matrix<AutodiffScalarGrad, Eigen::Dynamic, 1, 0, 3, 1> kernel(const int dim, const AutodiffGradPt &rvect, const AutodiffScalarGrad &r) const { log_and_throw_error("Kernel not supported by {}!", name()); }
190
191 void set_materials(const std::vector<int> &body_ids, const json &body_params, const Units &units, const std::string &root_path);
192 virtual void add_multimaterial(const int index, const json &params, const Units &units, const std::string &root_path) {}
193
194 virtual void update_lame_params(const Eigen::MatrixXd &lambdas, const Eigen::MatrixXd &mus)
195 {
196 log_and_throw_error("Not implemented!");
197 }
198
199 virtual bool is_linear() const = 0;
200 virtual bool is_solution_displacement() const { return false; }
201 virtual bool is_fluid() const { return false; }
202 virtual bool is_tensor() const { return false; }
203
204 protected:
205 int size_ = -1;
206 };
207
208 class MixedNLAssembler : virtual public Assembler
209 {
210 public:
211 using SolutionSplitter = std::function<void(
212 const Eigen::MatrixXd &x,
213 Eigen::MatrixXd &x_phi,
214 Eigen::MatrixXd &x_psi)>;
215
220
221 virtual ~MixedNLAssembler() = default;
222
223 double assemble_energy(
224 const bool is_volume,
225 const int n_psi_basis,
226 const int n_phi_basis,
227 const std::vector<basis::ElementBases> &psi_bases,
228 const std::vector<basis::ElementBases> &phi_bases,
229 const std::vector<basis::ElementBases> &gbases,
230 const AssemblyValsCache &psi_cache,
231 const AssemblyValsCache &phi_cache,
232 const double t,
233 const double dt,
234 const Eigen::MatrixXd &x,
235 const Eigen::MatrixXd &x_prev,
236 const SolutionSplitter &split_solution) const;
237
238 Eigen::VectorXd assemble_energy_per_element(
239 const bool is_volume,
240 const int n_psi_basis,
241 const int n_phi_basis,
242 const std::vector<basis::ElementBases> &psi_bases,
243 const std::vector<basis::ElementBases> &phi_bases,
244 const std::vector<basis::ElementBases> &gbases,
245 const AssemblyValsCache &psi_cache,
246 const AssemblyValsCache &phi_cache,
247 const double t,
248 const double dt,
249 const Eigen::MatrixXd &x,
250 const Eigen::MatrixXd &x_prev,
251 const SolutionSplitter &split_solution) const;
252
254 const bool is_volume,
255 const int n_psi_basis,
256 const int n_phi_basis,
257 const std::vector<basis::ElementBases> &psi_bases,
258 const std::vector<basis::ElementBases> &phi_bases,
259 const std::vector<basis::ElementBases> &gbases,
260 const AssemblyValsCache &psi_cache,
261 const AssemblyValsCache &phi_cache,
262 const double t,
263 const double dt,
264 const Eigen::MatrixXd &x,
265 const Eigen::MatrixXd &x_prev,
266 const SolutionSplitter &split_solution,
267 Eigen::MatrixXd &grad) const;
268
269 void assemble_hessian(
270 const bool is_volume,
271 const int n_psi_basis,
272 const int n_phi_basis,
273 const bool project_to_psd,
274 const std::vector<basis::ElementBases> &psi_bases,
275 const std::vector<basis::ElementBases> &phi_bases,
276 const std::vector<basis::ElementBases> &gbases,
277 const AssemblyValsCache &psi_cache,
278 const AssemblyValsCache &phi_cache,
279 const double t,
280 const double dt,
281 const Eigen::MatrixXd &x,
282 const Eigen::MatrixXd &x_prev,
283 const SolutionSplitter &split_solution,
284 utils::MatrixCache &mat_cache,
285 StiffnessMatrix &hessian) const;
286
287 bool is_linear() const override { return false; }
288
289 protected:
290 virtual int rows() const = 0;
291 virtual int cols() const = 0;
292
293 virtual double compute_energy(const MixedNonLinearAssemblerData &data) const = 0;
294 virtual Eigen::VectorXd compute_gradient(const MixedNonLinearAssemblerData &data) const = 0;
295 virtual Eigen::MatrixXd compute_hessian(const MixedNonLinearAssemblerData &data) const = 0;
296 };
297
300 class LinearAssembler : virtual public Assembler
301 {
302 public:
304 virtual ~LinearAssembler() = default;
305
313 const bool is_volume,
314 const int n_basis,
315 const std::vector<basis::ElementBases> &bases,
316 const std::vector<basis::ElementBases> &gbases,
318 const double t,
319 StiffnessMatrix &stiffness,
320 const bool is_mass = false) const override;
321
322 virtual bool is_linear() const override { return true; }
323
326 virtual Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 9, 1> assemble(const LinearAssemblerData &data) const = 0;
327 };
328
329 // non-linear assembler (eg neohookean elasticity)
330 class NLAssembler : virtual public Assembler
331 {
332 public:
333 virtual ~NLAssembler() = default;
334
335 // assemble energy
336 double assemble_energy(
337 const bool is_volume,
338 const std::vector<basis::ElementBases> &bases,
339 const std::vector<basis::ElementBases> &gbases,
341 const double t,
342 const double dt,
343 const Eigen::MatrixXd &displacement,
344 const Eigen::MatrixXd &displacement_prev) const override;
345
346 // assemble the energy per element
347 Eigen::VectorXd assemble_energy_per_element(
348 const bool is_volume,
349 const std::vector<basis::ElementBases> &bases,
350 const std::vector<basis::ElementBases> &gbases,
352 const double t,
353 const double dt,
354 const Eigen::MatrixXd &displacement,
355 const Eigen::MatrixXd &displacement_prev) const override;
356
357 // assemble gradient of energy (rhs)
359 const bool is_volume,
360 const int n_basis,
361 const std::vector<basis::ElementBases> &bases,
362 const std::vector<basis::ElementBases> &gbases,
364 const double t,
365 const double dt,
366 const Eigen::MatrixXd &displacement,
367 const Eigen::MatrixXd &displacement_prev,
368 Eigen::MatrixXd &rhs) const override;
369
370 // assemble hessian of energy (grad)
372 const bool is_volume,
373 const int n_basis,
374 const bool project_to_psd,
375 const std::vector<basis::ElementBases> &bases,
376 const std::vector<basis::ElementBases> &gbases,
378 const double t,
379 const double dt,
380 const Eigen::MatrixXd &displacement,
381 const Eigen::MatrixXd &displacement_prev,
382 utils::MatrixCache &mat_cache,
383 StiffnessMatrix &grad) const override;
384
385 virtual bool is_linear() const override { return false; }
386
387 // energy, gradient, and hessian used in newton method
388 virtual double compute_energy(const NonLinearAssemblerData &data) const = 0;
389 virtual Eigen::VectorXd assemble_gradient(const NonLinearAssemblerData &data) const = 0;
390 virtual Eigen::MatrixXd assemble_hessian(const NonLinearAssemblerData &data) const = 0;
391 };
392
393 class ElasticityAssembler : virtual public Assembler
394 {
395 public:
397 virtual ~ElasticityAssembler() = default;
398
400
401 // plotting (eg von mises), assembler is the name of the formulation
403 const OutputData &data,
404 std::vector<NamedMatrix> &result) const override
405 {
406 result.clear();
407 Eigen::MatrixXd tmp;
409 result.emplace_back("von_mises", tmp);
410 }
411
412 // computes tensor, assembler is the name of the formulation
414 const OutputData &data,
415 std::vector<NamedMatrix> &result) const override
416 {
417 result.clear();
418 Eigen::MatrixXd cauchy, pk1, pk2, F;
419
424
425 result.emplace_back("cauchy_stess", cauchy);
426 result.emplace_back("pk1_stess", pk1);
427 result.emplace_back("pk2_stess", pk2);
428 result.emplace_back("F", F);
429 }
430
432 const ElasticityTensorType &type,
433 Eigen::MatrixXd &stresses) const
434 {
435 assign_stress_tensor(data, size() * size(), type, stresses, [&](const Eigen::MatrixXd &stress) {
436 Eigen::MatrixXd tmp = stress;
437 auto a = Eigen::Map<Eigen::MatrixXd>(tmp.data(), 1, size() * size());
438 return Eigen::MatrixXd(a);
439 });
440 }
441
443 Eigen::MatrixXd &stresses) const
444 {
445 assign_stress_tensor(data, 1, ElasticityTensorType::CAUCHY, stresses, [&](const Eigen::MatrixXd &stress) {
446 Eigen::Matrix<double, 1, 1> res;
447 res.setConstant(von_mises_stress_for_stress_tensor(stress));
448 return res;
449 });
450 }
451
452 bool is_solution_displacement() const override { return true; }
453 bool is_tensor() const override { return true; }
454 virtual bool allow_inversion() const = 0;
455
456 virtual void assign_stress_tensor(const OutputData &data,
457 const int all_size,
458 const ElasticityTensorType &type,
459 Eigen::MatrixXd &all,
460 const std::function<Eigen::MatrixXd(const Eigen::MatrixXd &)> &fun) const = 0;
461
462 protected:
464 };
465
466 class ElasticityNLAssembler : virtual public ElasticityAssembler, virtual public NLAssembler
467 {
468 };
469
470} // namespace polyfem::assembler
std::unique_ptr< MatrixCache > cache
Definition Assembler.cpp:24
ElementAssemblyValues vals
Definition Assembler.cpp:25
int x
virtual void compute_stress_grad_multiply_stress(const OptAssemblerData &data, Eigen::MatrixXd &stress, Eigen::MatrixXd &result) const
virtual void assemble(const bool is_volume, const int n_basis, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &cache, const double t, StiffnessMatrix &stiffness, const bool is_mass=false) const
Definition Assembler.hpp:70
virtual void compute_stiffness_value(const double t, const assembler::ElementAssemblyValues &vals, const Eigen::MatrixXd &local_pts, const Eigen::MatrixXd &displacement, Eigen::MatrixXd &tensor) const
std::pair< std::string, Eigen::MatrixXd > NamedMatrix
Definition Assembler.hpp:58
virtual ~Assembler()=default
virtual void compute_dstress_dmu_dlambda(const OptAssemblerData &data, Eigen::MatrixXd &dstress_dmu, Eigen::MatrixXd &dstress_dlambda) const
virtual void compute_stress_grad_multiply_vect(const OptAssemblerData &data, const Eigen::MatrixXd &vect, Eigen::MatrixXd &stress, Eigen::MatrixXd &result) const
virtual bool is_solution_displacement() const
virtual void update_lame_params(const Eigen::MatrixXd &lambdas, const Eigen::MatrixXd &mus)
virtual void compute_stress_grad_multiply_mat(const OptAssemblerData &data, const Eigen::MatrixXd &mat, Eigen::MatrixXd &stress, Eigen::MatrixXd &result) const
virtual Eigen::Matrix< AutodiffScalarGrad, Eigen::Dynamic, 1, 0, 3, 1 > kernel(const int dim, const AutodiffGradPt &rvect, const AutodiffScalarGrad &r) const
virtual bool is_tensor() const
std::function< double(const RowVectorNd &, const RowVectorNd &, double, int)> ParamFunc
Definition Assembler.hpp:59
virtual std::string name() const =0
virtual Eigen::VectorXd assemble_energy_per_element(const bool is_volume, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &cache, const double t, const double dt, const Eigen::MatrixXd &displacement, const Eigen::MatrixXd &displacement_prev) const
Definition Assembler.hpp:91
virtual void assemble_gradient(const bool is_volume, const int n_basis, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &cache, const double t, const double dt, const Eigen::MatrixXd &displacement, const Eigen::MatrixXd &displacement_prev, Eigen::MatrixXd &rhs) const
virtual void compute_stress_grad(const OptAssemblerData &data, const Eigen::MatrixXd &prev_grad_u_i, Eigen::MatrixXd &stress, Eigen::MatrixXd &result) const
virtual void set_size(const int size)
Definition Assembler.hpp:66
virtual void compute_scalar_value(const OutputData &data, std::vector< NamedMatrix > &result) const
virtual void assemble_hessian(const bool is_volume, const int n_basis, const bool project_to_psd, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &cache, const double t, const double dt, const Eigen::MatrixXd &displacement, const Eigen::MatrixXd &displacement_prev, utils::MatrixCache &mat_cache, StiffnessMatrix &grad) const
virtual std::map< std::string, ParamFunc > parameters() const =0
virtual VectorNd compute_rhs(const AutodiffHessianPt &pt) const
virtual double assemble_energy(const bool is_volume, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &cache, const double t, const double dt, const Eigen::MatrixXd &displacement, const Eigen::MatrixXd &displacement_prev) const
Definition Assembler.hpp:81
virtual bool is_fluid() const
void set_materials(const std::vector< int > &body_ids, const json &body_params, const Units &units, const std::string &root_path)
virtual bool is_linear() const =0
virtual void add_multimaterial(const int index, const json &params, const Units &units, const std::string &root_path)
virtual void compute_tensor_value(const OutputData &data, std::vector< NamedMatrix > &result) const
virtual void compute_stress_prev_grad(const OptAssemblerData &data, const Eigen::MatrixXd &prev_grad_u_i, Eigen::MatrixXd &result) const
Caches basis evaluation and geometric mapping at every element.
void compute_von_mises_stresses(const OutputData &data, Eigen::MatrixXd &stresses) const
void compute_scalar_value(const OutputData &data, std::vector< NamedMatrix > &result) const override
bool is_solution_displacement() const override
void compute_tensor_value(const OutputData &data, std::vector< NamedMatrix > &result) const override
void compute_stress_tensor(const OutputData &data, const ElasticityTensorType &type, Eigen::MatrixXd &stresses) const
virtual 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 =0
virtual bool allow_inversion() const =0
stores per element basis values at given quadrature points and geometric mapping
assemble matrix based on the local assembler local assembler is eg Laplace, LinearElasticity etc
virtual Eigen::Matrix< double, Eigen::Dynamic, 1, 0, 9, 1 > assemble(const LinearAssemblerData &data) const =0
local assembly function that defines the bilinear form (LHS) computes and returns a single local stif...
void assemble(const bool is_volume, const int n_basis, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &cache, const double t, StiffnessMatrix &stiffness, const bool is_mass=false) const override
assembles the stiffness matrix for the given basis the bilinear form (local assembler) is encoded by ...
virtual bool is_linear() const override
virtual int rows() const =0
virtual void set_size(const int size)
Definition Assembler.hpp:43
virtual Eigen::Matrix< double, Eigen::Dynamic, 1, 0, 3, 1 > assemble(const MixedAssemblerData &data) const =0
void assemble(const bool is_volume, const int n_psi_basis, const int n_phi_basis, const std::vector< basis::ElementBases > &psi_bases, const std::vector< basis::ElementBases > &phi_bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &psi_cache, const AssemblyValsCache &phi_cache, const double t, StiffnessMatrix &stiffness) const
virtual int cols() const =0
virtual std::string name() const =0
void assemble_gradient(const bool is_volume, const int n_psi_basis, const int n_phi_basis, const std::vector< basis::ElementBases > &psi_bases, const std::vector< basis::ElementBases > &phi_bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &psi_cache, const AssemblyValsCache &phi_cache, const double t, const double dt, const Eigen::MatrixXd &x, const Eigen::MatrixXd &x_prev, const SolutionSplitter &split_solution, Eigen::MatrixXd &grad) const
virtual double compute_energy(const MixedNonLinearAssemblerData &data) const =0
void assemble_hessian(const bool is_volume, const int n_psi_basis, const int n_phi_basis, const bool project_to_psd, const std::vector< basis::ElementBases > &psi_bases, const std::vector< basis::ElementBases > &phi_bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &psi_cache, const AssemblyValsCache &phi_cache, const double t, const double dt, const Eigen::MatrixXd &x, const Eigen::MatrixXd &x_prev, const SolutionSplitter &split_solution, utils::MatrixCache &mat_cache, StiffnessMatrix &hessian) const
Eigen::VectorXd assemble_energy_per_element(const bool is_volume, const int n_psi_basis, const int n_phi_basis, const std::vector< basis::ElementBases > &psi_bases, const std::vector< basis::ElementBases > &phi_bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &psi_cache, const AssemblyValsCache &phi_cache, const double t, const double dt, const Eigen::MatrixXd &x, const Eigen::MatrixXd &x_prev, const SolutionSplitter &split_solution) const
virtual Eigen::VectorXd compute_gradient(const MixedNonLinearAssemblerData &data) const =0
virtual Eigen::MatrixXd compute_hessian(const MixedNonLinearAssemblerData &data) const =0
std::function< void(const Eigen::MatrixXd &x, Eigen::MatrixXd &x_phi, Eigen::MatrixXd &x_psi)> SolutionSplitter
double assemble_energy(const bool is_volume, const int n_psi_basis, const int n_phi_basis, const std::vector< basis::ElementBases > &psi_bases, const std::vector< basis::ElementBases > &phi_bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &psi_cache, const AssemblyValsCache &phi_cache, const double t, const double dt, const Eigen::MatrixXd &x, const Eigen::MatrixXd &x_prev, const SolutionSplitter &split_solution) const
virtual bool is_linear() const override
double assemble_energy(const bool is_volume, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &cache, const double t, const double dt, const Eigen::MatrixXd &displacement, const Eigen::MatrixXd &displacement_prev) const override
Eigen::VectorXd assemble_energy_per_element(const bool is_volume, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &cache, const double t, const double dt, const Eigen::MatrixXd &displacement, const Eigen::MatrixXd &displacement_prev) const override
virtual double compute_energy(const NonLinearAssemblerData &data) const =0
virtual ~NLAssembler()=default
void assemble_gradient(const bool is_volume, const int n_basis, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &cache, const double t, const double dt, const Eigen::MatrixXd &displacement, const Eigen::MatrixXd &displacement_prev, Eigen::MatrixXd &rhs) const override
void assemble_hessian(const bool is_volume, const int n_basis, const bool project_to_psd, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &cache, const double t, const double dt, const Eigen::MatrixXd &displacement, const Eigen::MatrixXd &displacement_prev, utils::MatrixCache &mat_cache, StiffnessMatrix &grad) const override
virtual Eigen::VectorXd assemble_gradient(const NonLinearAssemblerData &data) const =0
virtual Eigen::MatrixXd assemble_hessian(const NonLinearAssemblerData &data) const =0
abstract class used for caching
Used for test only.
Eigen::Matrix< AutodiffScalarHessian, Eigen::Dynamic, 1, 0, 3, 1 > AutodiffHessianPt
Eigen::Matrix< double, Eigen::Dynamic, 1, 0, 3, 1 > VectorNd
Definition Types.hpp:11
nlohmann::json json
Definition Common.hpp:9
void log_and_throw_adjoint_error(const std::string &msg)
Definition Logger.cpp:79
double von_mises_stress_for_stress_tensor(const Eigen::MatrixXd &stress)
Eigen::Matrix< double, 1, Eigen::Dynamic, Eigen::RowMajor, 1, 3 > RowVectorNd
Definition Types.hpp:13
void log_and_throw_error(const std::string &msg)
Definition Logger.cpp:73
Eigen::Matrix< AutodiffScalarGrad, Eigen::Dynamic, 1, 0, 3, 1 > AutodiffGradPt
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:24
Automatic differentiation scalar with first-order derivatives.
Definition autodiff.h:112