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,
41 virtual std::string
name()
const = 0;
49 virtual int rows()
const = 0;
50 virtual int cols()
const = 0;
64 virtual std::string
name()
const = 0;
74 const std::vector<basis::ElementBases> &bases,
75 const std::vector<basis::ElementBases> &gbases,
84 const std::vector<basis::ElementBases> &bases,
85 const std::vector<basis::ElementBases> &gbases,
89 const Eigen::MatrixXd &displacement,
90 const Eigen::MatrixXd &displacement_prev)
const {
log_and_throw_error(
"Assemble energy not implemented by {}!",
name()); }
94 const std::vector<basis::ElementBases> &bases,
95 const std::vector<basis::ElementBases> &gbases,
99 const Eigen::MatrixXd &displacement,
100 const Eigen::MatrixXd &displacement_prev)
const {
log_and_throw_error(
"Assemble energy not implemented by {}!",
name()); }
104 const bool is_volume,
106 const std::vector<basis::ElementBases> &bases,
107 const std::vector<basis::ElementBases> &gbases,
111 const Eigen::MatrixXd &displacement,
112 const Eigen::MatrixXd &displacement_prev,
117 const bool is_volume,
119 const bool project_to_psd,
120 const std::vector<basis::ElementBases> &bases,
121 const std::vector<basis::ElementBases> &gbases,
125 const Eigen::MatrixXd &displacement,
126 const Eigen::MatrixXd &displacement_prev,
133 std::vector<NamedMatrix> &result)
const {}
138 std::vector<NamedMatrix> &result)
const
146 const Eigen::MatrixXd &local_pts,
147 const Eigen::MatrixXd &displacement,
152 Eigen::MatrixXd &dstress_dmu,
157 const Eigen::MatrixXd &mat,
158 Eigen::MatrixXd &stress,
163 Eigen::MatrixXd &stress,
164 Eigen::MatrixXd &result)
const
166 Eigen::MatrixXd unused;
173 const Eigen::MatrixXd &vect,
174 Eigen::MatrixXd &stress,
179 const Eigen::MatrixXd &prev_grad_u_i,
180 Eigen::MatrixXd &stress,
184 const Eigen::MatrixXd &prev_grad_u_i,
187 virtual std::map<std::string, ParamFunc>
parameters()
const = 0;
213 const Eigen::MatrixXd &
x,
214 Eigen::MatrixXd &x_phi,
215 Eigen::MatrixXd &x_psi)>;
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,
235 const Eigen::MatrixXd &
x,
236 const Eigen::MatrixXd &x_prev,
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,
250 const Eigen::MatrixXd &
x,
251 const Eigen::MatrixXd &x_prev,
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,
265 const Eigen::MatrixXd &
x,
266 const Eigen::MatrixXd &x_prev,
268 Eigen::MatrixXd &grad)
const;
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,
282 const Eigen::MatrixXd &
x,
283 const Eigen::MatrixXd &x_prev,
315 int col_space)
const = 0;
335 const bool is_volume,
337 const std::vector<basis::ElementBases> &bases,
338 const std::vector<basis::ElementBases> &gbases,
342 const bool is_mass =
false)
const override;
344 virtual bool is_linear()
const override {
return true; }
359 const bool is_volume,
360 const std::vector<basis::ElementBases> &bases,
361 const std::vector<basis::ElementBases> &gbases,
365 const Eigen::MatrixXd &displacement,
366 const Eigen::MatrixXd &displacement_prev)
const override;
370 const bool is_volume,
371 const std::vector<basis::ElementBases> &bases,
372 const std::vector<basis::ElementBases> &gbases,
376 const Eigen::MatrixXd &displacement,
377 const Eigen::MatrixXd &displacement_prev)
const override;
381 const bool is_volume,
383 const std::vector<basis::ElementBases> &bases,
384 const std::vector<basis::ElementBases> &gbases,
388 const Eigen::MatrixXd &displacement,
389 const Eigen::MatrixXd &displacement_prev,
390 Eigen::MatrixXd &rhs)
const override;
394 const bool is_volume,
396 const bool project_to_psd,
397 const std::vector<basis::ElementBases> &bases,
398 const std::vector<basis::ElementBases> &gbases,
402 const Eigen::MatrixXd &displacement,
403 const Eigen::MatrixXd &displacement_prev,
407 virtual bool is_linear()
const override {
return false; }
426 std::vector<NamedMatrix> &result)
const override
431 result.emplace_back(
"von_mises", tmp);
437 std::vector<NamedMatrix> &result)
const override
440 Eigen::MatrixXd cauchy, pk1, pk2,
F;
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);
455 Eigen::MatrixXd &stresses)
const
458 Eigen::MatrixXd tmp = stress;
459 auto a = Eigen::Map<Eigen::MatrixXd>(tmp.data(), 1,
size() *
size());
460 return Eigen::MatrixXd(a);
465 Eigen::MatrixXd &stresses)
const
468 Eigen::Matrix<double, 1, 1> res;
481 Eigen::MatrixXd &all,
482 const std::function<Eigen::MatrixXd(
const Eigen::MatrixXd &)> &fun)
const = 0;
std::unique_ptr< MatrixCache > cache
ElementAssemblyValues vals
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
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
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
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
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)
virtual void add_multimaterial(const int index, const json ¶ms, 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
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.
bool is_tensor() const override
virtual ~ElasticityAssembler()=default
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 set_use_robust_jacobian()
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 ~LinearAssembler()=default
virtual bool is_linear() const override
virtual int rows() const =0
virtual void set_size(const int size)
virtual Eigen::Matrix< double, Eigen::Dynamic, 1, 0, 3, 1 > assemble(const MixedAssemblerData &data) const =0
virtual ~MixedAssembler()=default
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 ~MixedNLAssembler()=default
virtual int rows() const =0
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
bool is_linear() const override
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 int cols() const =0
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
bool is_linear() const override
virtual ~MultiSpacesNLAssembler()=default
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
const Eigen::MatrixXd & grad_u_i
Read-only interface to a hierarchical collection of simulation resources.
abstract class used for caching
Eigen::Matrix< AutodiffScalarHessian, Eigen::Dynamic, 1, 0, 3, 1 > AutodiffHessianPt
Eigen::Matrix< double, Eigen::Dynamic, 1, 0, 3, 1 > VectorNd
void log_and_throw_adjoint_error(const std::string &msg)
double von_mises_stress_for_stress_tensor(const Eigen::MatrixXd &stress)
Eigen::Matrix< double, 1, Eigen::Dynamic, Eigen::RowMajor, 1, 3 > RowVectorNd
void log_and_throw_error(const std::string &msg)
Eigen::Matrix< AutodiffScalarGrad, Eigen::Dynamic, 1, 0, 3, 1 > AutodiffGradPt
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Automatic differentiation scalar with first-order derivatives.