PolyFEM
Loading...
Searching...
No Matches
PressureForm.cpp
Go to the documentation of this file.
1#include "PressureForm.hpp"
2
3#include <unordered_map>
4#include <vector>
5
6namespace polyfem::solver
7{
9 const std::vector<mesh::LocalBoundary> &local_pressure_boundary,
10 const std::unordered_map<int, std::vector<mesh::LocalBoundary>> &local_pressure_cavity,
11 const std::vector<int> &dirichlet_nodes,
12 const QuadratureOrders &n_boundary_samples,
13 const assembler::PressureAssembler &pressure_assembler,
14 const bool is_time_dependent)
15 : ndof_(ndof),
16 local_pressure_boundary_(local_pressure_boundary),
17 local_pressure_cavity_(local_pressure_cavity),
18 dirichlet_nodes_(dirichlet_nodes),
19 n_boundary_samples_(n_boundary_samples),
20 pressure_assembler_(pressure_assembler)
21 {
22 t_ = 0;
23 }
24
25 double PressureForm::value_unweighted(const Eigen::VectorXd &x) const
26 {
29 return -1 * (pressure_energy + pressure_cavity_energy);
30 }
31
32 void PressureForm::first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const
33 {
34 // REMEMBER -!!!!!
35 Eigen::VectorXd pressure_gradv, pressure_cavity_gradv;
38 gradv = pressure_gradv + pressure_cavity_gradv;
39 gradv *= -1;
40 }
41
42 void PressureForm::second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &hessian) const
43 {
44 StiffnessMatrix pressure_hessian, pressure_cavity_hessian;
47 hessian = pressure_hessian + pressure_cavity_hessian;
48 hessian *= -1;
49 }
50
51 void PressureForm::update_quantities(const double t, const Eigen::VectorXd &x)
52 {
53 this->t_ = t;
54 }
55} // namespace polyfem::solver
int x
void compute_cavity_energy_hess(const Eigen::MatrixXd &displacement, const std::unordered_map< int, std::vector< mesh::LocalBoundary > > &local_pressure_cavity, const std::vector< int > &dirichlet_nodes, const QuadratureOrders &resolution, const double t, const bool project_to_psd, StiffnessMatrix &hess) const
double compute_energy(const Eigen::MatrixXd &displacement, const std::vector< mesh::LocalBoundary > &local_pressure_boundary, const QuadratureOrders &resolution, const double t) const
void compute_energy_hess(const Eigen::MatrixXd &displacement, const std::vector< mesh::LocalBoundary > &local_pressure_boundary, const std::vector< int > &dirichlet_nodes, const QuadratureOrders &resolution, const double t, const bool project_to_psd, StiffnessMatrix &hess) const
void compute_cavity_energy_grad(const Eigen::MatrixXd &displacement, const std::unordered_map< int, std::vector< mesh::LocalBoundary > > &local_pressure_cavity, const std::vector< int > &dirichlet_nodes, const QuadratureOrders &resolution, const double t, Eigen::VectorXd &grad) const
double compute_cavity_energy(const Eigen::MatrixXd &displacement, const std::unordered_map< int, std::vector< mesh::LocalBoundary > > &local_pressure_cavity, const QuadratureOrders &resolution, const double t) const
void compute_energy_grad(const Eigen::MatrixXd &displacement, const std::vector< mesh::LocalBoundary > &local_pressure_boundary, const std::vector< int > &dirichlet_nodes, const QuadratureOrders &resolution, const double t, Eigen::VectorXd &grad) const
bool project_to_psd_
If true, the form's second derivative is projected to be positive semidefinite.
Definition Form.hpp:147
void second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &hessian) const override
Compute the second derivative of the value wrt x.
void update_quantities(const double t, const Eigen::VectorXd &x) override
Update time dependent quantities.
double value_unweighted(const Eigen::VectorXd &x) const override
Compute the value of the body force form.
const assembler::PressureAssembler & pressure_assembler_
Reference to the pressure assembler.
PressureForm(const int ndof, const std::vector< mesh::LocalBoundary > &local_pressure_boundary, const std::unordered_map< int, std::vector< mesh::LocalBoundary > > &local_pressure_cavity, const std::vector< int > &dirichlet_nodes, const QuadratureOrders &n_boundary_samples, const assembler::PressureAssembler &pressure_assembler, const bool is_time_dependent)
Construct a new Body Form object.
const QuadratureOrders n_boundary_samples_
const std::vector< mesh::LocalBoundary > & local_pressure_boundary_
const std::vector< int > & dirichlet_nodes_
void first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
Compute the first derivative of the value wrt x.
const std::unordered_map< int, std::vector< mesh::LocalBoundary > > & local_pressure_cavity_
std::array< int, 2 > QuadratureOrders
Definition Types.hpp:19
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:24