PolyFEM
Loading...
Searching...
No Matches
MixedAssemblerForm.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "Form.hpp"
4
10
11#include <memory>
12#include <vector>
13
14namespace polyfem::solver
15{
16 class MixedAssemblerForm : public Form
17 {
18 public:
20 const int n_phi_bases,
21 const int n_psi_bases,
22 const std::vector<basis::ElementBases> &phi_bases,
23 const std::vector<basis::ElementBases> &psi_bases,
24 const std::vector<basis::ElementBases> &geom_bases,
25 const assembler::MixedNLAssembler &assembler,
28 const double t,
29 const double dt,
30 const bool is_volume);
31
32 std::string name() const override { return "mixed-assembler"; }
33
34 void set_row_weights(const double phi_weight, const double psi_weight);
35
36 void update_quantities(const double t, const Eigen::VectorXd &x) override
37 {
38 t_ = t;
39 x_prev_ = x;
40 }
41
42 protected:
43 double value_unweighted(const Eigen::VectorXd &x) const override;
44 Eigen::VectorXd value_per_element_unweighted(const Eigen::VectorXd &x) const override;
45 void first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
46 void second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &hessian) const override;
47
48 private:
49 int phi_ndof() const;
50 int psi_ndof() const;
52
53 const int n_phi_bases_;
54 const int n_psi_bases_;
55 const std::vector<basis::ElementBases> &phi_bases_;
56 const std::vector<basis::ElementBases> &psi_bases_;
57 const std::vector<basis::ElementBases> &geom_bases_;
61 double t_;
62 const double dt_;
63 const bool is_volume_;
64 Eigen::VectorXd x_prev_;
65 double phi_row_weight_ = 1;
66 double psi_row_weight_ = 1;
67 mutable std::unique_ptr<utils::MatrixCache> mat_cache_;
68 };
69} // namespace polyfem::solver
int x
Caches basis evaluation and geometric mapping at every element.
std::function< void(const Eigen::MatrixXd &x, Eigen::MatrixXd &x_phi, Eigen::MatrixXd &x_psi)> SolutionSplitter
void set_row_weights(const double phi_weight, const double psi_weight)
void second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &hessian) const override
Compute the second derivative of the value wrt x.
Eigen::VectorXd value_per_element_unweighted(const Eigen::VectorXd &x) const override
Compute the value of the form multiplied per element.
void update_quantities(const double t, const Eigen::VectorXd &x) override
Update time-dependent fields.
const std::vector< basis::ElementBases > & psi_bases_
std::string name() const override
const std::vector< basis::ElementBases > & phi_bases_
assembler::MixedNLAssembler::SolutionSplitter split_solution() const
assembler::AssemblyValsCache & psi_cache_
std::unique_ptr< utils::MatrixCache > mat_cache_
assembler::AssemblyValsCache & phi_cache_
const std::vector< basis::ElementBases > & geom_bases_
const assembler::MixedNLAssembler & assembler_
double value_unweighted(const Eigen::VectorXd &x) const override
Compute the value of the form.
void first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
Compute the first derivative of the value wrt x.
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:24