PolyFEM
Loading...
Searching...
No Matches
Assembler.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <polyfem/Units.hpp>
5
8
13
14#include <functional>
15
16// this casses are instantiated in the cpp, cannot be used with generic assembler
17// without adding template instantiation
18namespace polyfem::assembler
19{
20 // mixed formulation assembler
22 {
23 public:
25 virtual ~MixedAssembler() = default;
26
27 // this assembler takes two bases: psi_bases are the scalar ones, phi_bases are the tensor ones
28 // both have the same geometric mapping
30 const bool is_volume,
31 const int n_psi_basis,
32 const int n_phi_basis,
33 const std::vector<basis::ElementBases> &psi_bases,
34 const std::vector<basis::ElementBases> &phi_bases,
35 const std::vector<basis::ElementBases> &gbases,
36 const AssemblyValsCache &psi_cache,
37 const AssemblyValsCache &phi_cache,
38 const double t,
39 StiffnessMatrix &stiffness) const;
40
41 virtual std::string name() const = 0;
42
43 int size() const { return size_; }
44 virtual void set_size(const int size) { size_ = size; }
45
46 protected:
47 int size_ = -1;
48
49 virtual int rows() const = 0;
50 virtual int cols() const = 0;
51
52 virtual Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 3, 1> assemble(const MixedAssemblerData &data) const = 0;
53 };
54
57 {
58 public:
59 typedef std::pair<std::string, Eigen::MatrixXd> NamedMatrix;
60 typedef std::function<double(const RowVectorNd &, const RowVectorNd &, double, int)> ParamFunc;
61
62 virtual ~Assembler() = default;
63
64 virtual std::string name() const = 0;
65
66 int size() const { return size_; }
67 virtual void set_size(const int size) { size_ = size; }
68
69 // assembler stiffness matrix, is the mesh is volumetric, number of bases and bases (FE and geom)
70 // gbases and bases can be the same (ie isoparametric)
71 virtual void assemble(
72 const bool is_volume,
73 const int n_basis,
74 const std::vector<basis::ElementBases> &bases,
75 const std::vector<basis::ElementBases> &gbases,
77 const double t,
78 StiffnessMatrix &stiffness,
79 const bool is_mass = false) const { log_and_throw_error("Assembler not implemented by {}!", name()); }
80
81 // assemble energy
82 virtual double assemble_energy(
83 const bool is_volume,
84 const std::vector<basis::ElementBases> &bases,
85 const std::vector<basis::ElementBases> &gbases,
87 const double t,
88 const double dt,
89 const Eigen::MatrixXd &displacement,
90 const Eigen::MatrixXd &displacement_prev) const { log_and_throw_error("Assemble energy not implemented by {}!", name()); }
91
92 virtual Eigen::VectorXd assemble_energy_per_element(
93 const bool is_volume,
94 const std::vector<basis::ElementBases> &bases,
95 const std::vector<basis::ElementBases> &gbases,
97 const double t,
98 const double dt,
99 const Eigen::MatrixXd &displacement,
100 const Eigen::MatrixXd &displacement_prev) const { log_and_throw_error("Assemble energy not implemented by {}!", name()); }
101
102 // assemble gradient of energy (rhs)
103 virtual void assemble_gradient(
104 const bool is_volume,
105 const int n_basis,
106 const std::vector<basis::ElementBases> &bases,
107 const std::vector<basis::ElementBases> &gbases,
109 const double t,
110 const double dt,
111 const Eigen::MatrixXd &displacement,
112 const Eigen::MatrixXd &displacement_prev,
113 Eigen::MatrixXd &rhs) const { log_and_throw_error("Assemble grad not implemented by {}!", name()); }
114
115 // assemble hessian of energy (grad)
116 virtual void assemble_hessian(
117 const bool is_volume,
118 const int n_basis,
119 const bool project_to_psd,
120 const std::vector<basis::ElementBases> &bases,
121 const std::vector<basis::ElementBases> &gbases,
123 const double t,
124 const double dt,
125 const Eigen::MatrixXd &displacement,
126 const Eigen::MatrixXd &displacement_prev,
127 utils::MatrixCache &mat_cache,
128 StiffnessMatrix &grad) const { log_and_throw_error("Assemble hessian not implemented by {}!", name()); }
129
130 // plotting (eg von mises), assembler is the name of the formulation
132 const OutputData &data,
133 std::vector<NamedMatrix> &result) const {}
134
135 // computes tensor, assembler is the name of the formulation
137 const OutputData &data,
138 std::vector<NamedMatrix> &result) const
139 {
140 }
141
142 // computes tensor, assembler is the name of the formulation
144 const double t,
146 const Eigen::MatrixXd &local_pts,
147 const Eigen::MatrixXd &displacement,
148 Eigen::MatrixXd &tensor) const { log_and_throw_error("Not implemented!"); }
149
151 const OptAssemblerData &data,
152 Eigen::MatrixXd &dstress_dmu,
153 Eigen::MatrixXd &dstress_dlambda) const { log_and_throw_adjoint_error("Not implemented!"); }
154
156 const OptAssemblerData &data,
157 const Eigen::MatrixXd &mat,
158 Eigen::MatrixXd &stress,
159 Eigen::MatrixXd &result) const { log_and_throw_adjoint_error("Not implemented!"); }
160
162 const OptAssemblerData &data,
163 Eigen::MatrixXd &stress,
164 Eigen::MatrixXd &result) const
165 {
166 Eigen::MatrixXd unused;
167 compute_stress_grad_multiply_mat(data, Eigen::MatrixXd::Zero(data.grad_u_i.rows(), data.grad_u_i.cols()), stress, unused);
168 compute_stress_grad_multiply_mat(data, stress, unused, result);
169 }
170
172 const OptAssemblerData &data,
173 const Eigen::MatrixXd &vect,
174 Eigen::MatrixXd &stress,
175 Eigen::MatrixXd &result) const { log_and_throw_error("Not implemented!"); }
176
178 const OptAssemblerData &data,
179 const Eigen::MatrixXd &prev_grad_u_i,
180 Eigen::MatrixXd &stress,
181 Eigen::MatrixXd &result) const { log_and_throw_adjoint_error("Not implemented!"); }
183 const OptAssemblerData &data,
184 const Eigen::MatrixXd &prev_grad_u_i,
185 Eigen::MatrixXd &result) const { log_and_throw_adjoint_error("Not implemented!"); }
186
187 virtual std::map<std::string, ParamFunc> parameters() const = 0;
188 virtual VectorNd compute_rhs(const AutodiffHessianPt &pt) const { log_and_throw_error("Rhs not supported by {}!", name()); }
189
190 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()); }
191
192 void set_materials(const std::vector<int> &body_ids, const json &body_params, const Units &units, const io::ResourceIO &resources);
193 virtual void add_multimaterial(const int index, const json &params, const Units &units, const io::ResourceIO &resources) {}
194
195 virtual void update_lame_params(const Eigen::MatrixXd &lambdas, const Eigen::MatrixXd &mus)
196 {
197 log_and_throw_error("Not implemented!");
198 }
199
200 virtual bool is_linear() const = 0;
201 virtual bool is_solution_displacement() const { return false; }
202 virtual bool is_fluid() const { return false; }
203 virtual bool is_tensor() const { return false; }
204
205 protected:
206 int size_ = -1;
207 };
208
209 class MixedNLAssembler : virtual public Assembler
210 {
211 public:
212 using SolutionSplitter = std::function<void(
213 const Eigen::MatrixXd &x,
214 Eigen::MatrixXd &x_phi,
215 Eigen::MatrixXd &x_psi)>;
216
221
222 virtual ~MixedNLAssembler() = default;
223
224 double assemble_energy(
225 const bool is_volume,
226 const int n_psi_basis,
227 const int n_phi_basis,
228 const std::vector<basis::ElementBases> &psi_bases,
229 const std::vector<basis::ElementBases> &phi_bases,
230 const std::vector<basis::ElementBases> &gbases,
231 const AssemblyValsCache &psi_cache,
232 const AssemblyValsCache &phi_cache,
233 const double t,
234 const double dt,
235 const Eigen::MatrixXd &x,
236 const Eigen::MatrixXd &x_prev,
237 const SolutionSplitter &split_solution) const;
238
239 Eigen::VectorXd assemble_energy_per_element(
240 const bool is_volume,
241 const int n_psi_basis,
242 const int n_phi_basis,
243 const std::vector<basis::ElementBases> &psi_bases,
244 const std::vector<basis::ElementBases> &phi_bases,
245 const std::vector<basis::ElementBases> &gbases,
246 const AssemblyValsCache &psi_cache,
247 const AssemblyValsCache &phi_cache,
248 const double t,
249 const double dt,
250 const Eigen::MatrixXd &x,
251 const Eigen::MatrixXd &x_prev,
252 const SolutionSplitter &split_solution) const;
253
255 const bool is_volume,
256 const int n_psi_basis,
257 const int n_phi_basis,
258 const std::vector<basis::ElementBases> &psi_bases,
259 const std::vector<basis::ElementBases> &phi_bases,
260 const std::vector<basis::ElementBases> &gbases,
261 const AssemblyValsCache &psi_cache,
262 const AssemblyValsCache &phi_cache,
263 const double t,
264 const double dt,
265 const Eigen::MatrixXd &x,
266 const Eigen::MatrixXd &x_prev,
267 const SolutionSplitter &split_solution,
268 Eigen::MatrixXd &grad) const;
269
270 void assemble_hessian(
271 const bool is_volume,
272 const int n_psi_basis,
273 const int n_phi_basis,
274 const bool project_to_psd,
275 const std::vector<basis::ElementBases> &psi_bases,
276 const std::vector<basis::ElementBases> &phi_bases,
277 const std::vector<basis::ElementBases> &gbases,
278 const AssemblyValsCache &psi_cache,
279 const AssemblyValsCache &phi_cache,
280 const double t,
281 const double dt,
282 const Eigen::MatrixXd &x,
283 const Eigen::MatrixXd &x_prev,
284 const SolutionSplitter &split_solution,
285 utils::MatrixCache &mat_cache,
286 StiffnessMatrix &hessian) const;
287
288 bool is_linear() const override { return false; }
289
290 protected:
291 virtual int rows() const = 0;
292 virtual int cols() const = 0;
293
294 virtual double compute_energy(const MixedNonLinearAssemblerData &data) const = 0;
295 virtual Eigen::VectorXd compute_gradient(const MixedNonLinearAssemblerData &data) const = 0;
296 virtual Eigen::MatrixXd compute_hessian(const MixedNonLinearAssemblerData &data) const = 0;
297 };
298
302 class MultiSpacesNLAssembler : virtual public Assembler
303 {
304 public:
307
308 virtual ~MultiSpacesNLAssembler() = default;
309
310 virtual double compute_energy(const MultiSpacesNLAssemblerData &data) const = 0;
311 virtual Eigen::VectorXd assemble_gradient(const MultiSpacesNLAssemblerData &data) const = 0;
312 virtual Eigen::MatrixXd assemble_hessian(
313 const MultiSpacesNLAssemblerData &data,
314 int row_space,
315 int col_space) const = 0;
316
317 bool is_linear() const override { return false; }
318 };
319
322 class LinearAssembler : virtual public Assembler
323 {
324 public:
326 virtual ~LinearAssembler() = default;
327
335 const bool is_volume,
336 const int n_basis,
337 const std::vector<basis::ElementBases> &bases,
338 const std::vector<basis::ElementBases> &gbases,
340 const double t,
341 StiffnessMatrix &stiffness,
342 const bool is_mass = false) const override;
343
344 virtual bool is_linear() const override { return true; }
345
348 virtual Eigen::Matrix<double, Eigen::Dynamic, 1, 0, 9, 1> assemble(const LinearAssemblerData &data) const = 0;
349 };
350
351 // non-linear assembler (eg neohookean elasticity)
352 class NLAssembler : virtual public Assembler
353 {
354 public:
355 virtual ~NLAssembler() = default;
356
357 // assemble energy
358 double assemble_energy(
359 const bool is_volume,
360 const std::vector<basis::ElementBases> &bases,
361 const std::vector<basis::ElementBases> &gbases,
363 const double t,
364 const double dt,
365 const Eigen::MatrixXd &displacement,
366 const Eigen::MatrixXd &displacement_prev) const override;
367
368 // assemble the energy per element
369 Eigen::VectorXd assemble_energy_per_element(
370 const bool is_volume,
371 const std::vector<basis::ElementBases> &bases,
372 const std::vector<basis::ElementBases> &gbases,
374 const double t,
375 const double dt,
376 const Eigen::MatrixXd &displacement,
377 const Eigen::MatrixXd &displacement_prev) const override;
378
379 // assemble gradient of energy (rhs)
381 const bool is_volume,
382 const int n_basis,
383 const std::vector<basis::ElementBases> &bases,
384 const std::vector<basis::ElementBases> &gbases,
386 const double t,
387 const double dt,
388 const Eigen::MatrixXd &displacement,
389 const Eigen::MatrixXd &displacement_prev,
390 Eigen::MatrixXd &rhs) const override;
391
392 // assemble hessian of energy (grad)
394 const bool is_volume,
395 const int n_basis,
396 const bool project_to_psd,
397 const std::vector<basis::ElementBases> &bases,
398 const std::vector<basis::ElementBases> &gbases,
400 const double t,
401 const double dt,
402 const Eigen::MatrixXd &displacement,
403 const Eigen::MatrixXd &displacement_prev,
404 utils::MatrixCache &mat_cache,
405 StiffnessMatrix &grad) const override;
406
407 virtual bool is_linear() const override { return false; }
408
409 // energy, gradient, and hessian used in newton method
410 virtual double compute_energy(const NonLinearAssemblerData &data) const = 0;
411 virtual Eigen::VectorXd assemble_gradient(const NonLinearAssemblerData &data) const = 0;
412 virtual Eigen::MatrixXd assemble_hessian(const NonLinearAssemblerData &data) const = 0;
413 };
414
415 class ElasticityAssembler : virtual public Assembler
416 {
417 public:
419 virtual ~ElasticityAssembler() = default;
420
422
423 // plotting (eg von mises), assembler is the name of the formulation
425 const OutputData &data,
426 std::vector<NamedMatrix> &result) const override
427 {
428 result.clear();
429 Eigen::MatrixXd tmp;
431 result.emplace_back("von_mises", tmp);
432 }
433
434 // computes tensor, assembler is the name of the formulation
436 const OutputData &data,
437 std::vector<NamedMatrix> &result) const override
438 {
439 result.clear();
440 Eigen::MatrixXd cauchy, pk1, pk2, F;
441
446
447 result.emplace_back("cauchy_stess", cauchy);
448 result.emplace_back("pk1_stess", pk1);
449 result.emplace_back("pk2_stess", pk2);
450 result.emplace_back("F", F);
451 }
452
454 const ElasticityTensorType &type,
455 Eigen::MatrixXd &stresses) const
456 {
457 assign_stress_tensor(data, size() * size(), type, stresses, [&](const Eigen::MatrixXd &stress) {
458 Eigen::MatrixXd tmp = stress;
459 auto a = Eigen::Map<Eigen::MatrixXd>(tmp.data(), 1, size() * size());
460 return Eigen::MatrixXd(a);
461 });
462 }
463
465 Eigen::MatrixXd &stresses) const
466 {
467 assign_stress_tensor(data, 1, ElasticityTensorType::CAUCHY, stresses, [&](const Eigen::MatrixXd &stress) {
468 Eigen::Matrix<double, 1, 1> res;
469 res.setConstant(von_mises_stress_for_stress_tensor(stress));
470 return res;
471 });
472 }
473
474 bool is_solution_displacement() const override { return true; }
475 bool is_tensor() const override { return true; }
476 virtual bool allow_inversion() const = 0;
477
478 virtual void assign_stress_tensor(const OutputData &data,
479 const int all_size,
480 const ElasticityTensorType &type,
481 Eigen::MatrixXd &all,
482 const std::function<Eigen::MatrixXd(const Eigen::MatrixXd &)> &fun) const = 0;
483
484 protected:
486 };
487
488 class ElasticityNLAssembler : virtual public ElasticityAssembler, virtual public NLAssembler
489 {
490 };
491
492} // namespace polyfem::assembler
std::unique_ptr< MatrixCache > cache
Definition Assembler.cpp:25
ElementAssemblyValues vals
Definition Assembler.cpp:26
int x
void set_materials(const std::vector< int > &body_ids, const json &body_params, const Units &units, const io::ResourceIO &resources)
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:71
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:59
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:60
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:92
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:67
virtual void add_multimaterial(const int index, const json &params, const Units &units, const io::ResourceIO &resources)
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:82
virtual bool is_fluid() const
virtual bool is_linear() const =0
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:44
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
Local data shared by assemblers involving an arbitrary number of FE spaces.
Local nonlinear assembler for an arbitrary number of FE spaces.
virtual Eigen::MatrixXd assemble_hessian(const MultiSpacesNLAssemblerData &data, int row_space, int col_space) const =0
virtual double compute_energy(const MultiSpacesNLAssemblerData &data) const =0
virtual Eigen::VectorXd assemble_gradient(const MultiSpacesNLAssemblerData &data) const =0
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
Read-only interface to a hierarchical collection of simulation resources.
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