PolyFEM
Loading...
Searching...
No Matches
BodyForm.cpp
Go to the documentation of this file.
1#include "BodyForm.hpp"
2
3#include <vector>
4
5namespace polyfem::solver
6{
7 BodyForm::BodyForm(const int ndof,
8 const int n_pressure_bases,
9 const std::vector<int> &boundary_nodes,
10 const std::vector<mesh::LocalBoundary> &local_boundary,
11 const std::vector<mesh::LocalBoundary> &local_neumann_boundary,
12 const QuadratureOrders &n_boundary_samples,
13 const Eigen::MatrixXd &rhs,
14 const assembler::RhsAssembler &rhs_assembler,
15 const assembler::Density &density,
16 const bool is_formulation_mixed,
17 const bool is_time_dependent)
18 : ndof_(ndof),
19 n_pressure_bases_(n_pressure_bases),
20 boundary_nodes_(boundary_nodes),
21 local_boundary_(local_boundary),
22 local_neumann_boundary_(local_neumann_boundary),
23 n_boundary_samples_(n_boundary_samples),
24 rhs_(rhs),
25 rhs_assembler_(rhs_assembler),
26 density_(density),
27 is_formulation_mixed_(is_formulation_mixed)
28 {
29 t_ = 0;
30 if (!is_time_dependent)
31 update_current_rhs(Eigen::VectorXd());
32 }
33
38
39 void BodyForm::first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const
40 {
41 // REMEMBER -!!!!!
42 gradv = -current_rhs_;
43 }
44
45 void BodyForm::second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &hessian) const
46 {
47 hessian.resize(x.size(), x.size());
48 }
49
50 void BodyForm::update_quantities(const double t, const Eigen::VectorXd &x)
51 {
52 this->t_ = t;
53 this->x_prev_ = x;
55 }
56
57 void BodyForm::update_current_rhs(const Eigen::VectorXd &x)
58 {
63
65 {
66 current_rhs_.conservativeResize(
68 current_rhs_.bottomRows(n_pressure_bases_).setZero();
69 }
70
71 // Apply Neumann boundary conditions
73 std::vector<mesh::LocalBoundary>(), std::vector<int>(),
75 current_rhs_, x, t_);
76 }
77
78 void BodyForm::hessian_wrt_u_prev(const Eigen::VectorXd &u_prev, const double t, StiffnessMatrix &hessian) const
79 {
81 hessian *= -1;
82 }
83} // namespace polyfem::solver
int x
void compute_energy_hess(const std::vector< int > &bounday_nodes, const QuadratureOrders &resolution, const std::vector< mesh::LocalBoundary > &local_neumann_boundary, const Eigen::MatrixXd &displacement, const double t, const bool project_to_psd, StiffnessMatrix &hess) const
void set_bc(const std::vector< mesh::LocalBoundary > &local_boundary, const std::vector< int > &bounday_nodes, const QuadratureOrders &resolution, const std::vector< mesh::LocalBoundary > &local_neumann_boundary, Eigen::MatrixXd &rhs, const Eigen::MatrixXd &displacement=Eigen::MatrixXd(), const double t=1) const
double compute_energy(const Eigen::MatrixXd &displacement, const Eigen::MatrixXd &displacement_prev, const std::vector< mesh::LocalBoundary > &local_neumann_boundary, const Density &density, const QuadratureOrders &resolution, const double t) const
void compute_energy_grad(const std::vector< mesh::LocalBoundary > &local_boundary, const std::vector< int > &bounday_nodes, const Density &density, const QuadratureOrders &resolution, const std::vector< mesh::LocalBoundary > &local_neumann_boundary, const Eigen::MatrixXd &final_rhs, const double t, Eigen::MatrixXd &rhs) const
const assembler::RhsAssembler & rhs_assembler_
Reference to the RHS assembler.
Definition BodyForm.hpp:78
void second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &hessian) const override
Compute the second derivative of the value wrt x.
Definition BodyForm.cpp:45
bool is_formulation_mixed_
True if the formulation is mixed.
Definition BodyForm.hpp:81
const std::vector< int > & boundary_nodes_
Definition BodyForm.hpp:72
double t_
Current time.
Definition BodyForm.hpp:66
void update_quantities(const double t, const Eigen::VectorXd &x) override
Update time dependent quantities.
Definition BodyForm.cpp:50
void first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
Compute the first derivative of the value wrt x.
Definition BodyForm.cpp:39
const std::vector< mesh::LocalBoundary > & local_neumann_boundary_
Definition BodyForm.hpp:74
const int ndof_
Number of degrees of freedom.
Definition BodyForm.hpp:67
const assembler::Density & density_
Definition BodyForm.hpp:79
const QuadratureOrders n_boundary_samples_
Definition BodyForm.hpp:75
BodyForm(const int ndof, const int n_pressure_bases, const std::vector< int > &boundary_nodes, const std::vector< mesh::LocalBoundary > &local_boundary, const std::vector< mesh::LocalBoundary > &local_neumann_boundary, const QuadratureOrders &n_boundary_samples, const Eigen::MatrixXd &rhs, const assembler::RhsAssembler &rhs_assembler, const assembler::Density &density, const bool is_formulation_mixed, const bool is_time_dependent)
Construct a new Body Form object.
Definition BodyForm.cpp:7
Eigen::MatrixXd current_rhs_
Cached RHS for the current time.
Definition BodyForm.hpp:83
const std::vector< mesh::LocalBoundary > & local_boundary_
Definition BodyForm.hpp:73
void update_current_rhs(const Eigen::VectorXd &x)
Update current_rhs.
Definition BodyForm.cpp:57
const Eigen::MatrixXd & rhs_
static RHS for the current time
Definition BodyForm.hpp:77
Eigen::MatrixXd x_prev_
Cached previous solution.
Definition BodyForm.hpp:70
void hessian_wrt_u_prev(const Eigen::VectorXd &u_prev, const double t, StiffnessMatrix &hessian) const
Definition BodyForm.cpp:78
double value_unweighted(const Eigen::VectorXd &x) const override
Compute the value of the body force form.
Definition BodyForm.cpp:34
std::array< int, 2 > QuadratureOrders
Definition Types.hpp:19
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:24