PolyFEM
Loading...
Searching...
No Matches
BodyForm.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "Form.hpp"
4
8
10
11#include <vector>
12
13namespace polyfem::solver
14{
16 class BodyForm : public Form
17 {
18 friend class BodyForceDerivative;
19
20 public:
24 BodyForm(const int ndof,
25 const int n_pressure_bases,
26 const std::vector<int> &boundary_nodes,
27 const std::vector<mesh::LocalBoundary> &local_boundary,
28 const std::vector<mesh::LocalBoundary> &local_neumann_boundary,
29 const QuadratureOrders &n_boundary_samples,
30 const Eigen::MatrixXd &rhs,
31 const assembler::RhsAssembler &rhs_assembler,
32 const assembler::Density &density,
33 const bool is_formulation_mixed,
34 const bool is_time_dependent);
35
36 std::string name() const override { return "body"; }
37
38 protected:
42 double value_unweighted(const Eigen::VectorXd &x) const override;
43
47 void first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
48
52 void second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &hessian) const override;
53
54 public:
58 void update_quantities(const double t, const Eigen::VectorXd &x) override;
59
61 const Eigen::VectorXd &u_prev,
62 const double t,
63 StiffnessMatrix &hessian) const;
64
65 private:
66 double t_;
67 const int ndof_;
69
70 Eigen::MatrixXd x_prev_;
71
72 const std::vector<int> &boundary_nodes_;
73 const std::vector<mesh::LocalBoundary> &local_boundary_;
74 const std::vector<mesh::LocalBoundary> &local_neumann_boundary_;
76
77 const Eigen::MatrixXd &rhs_;
80
82
83 Eigen::MatrixXd current_rhs_;
84
86 void update_current_rhs(const Eigen::VectorXd &x);
87 };
88} // namespace polyfem::solver
int x
Form representing body forces.
Definition BodyForm.hpp:17
std::string name() const override
Definition BodyForm.hpp:36
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
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