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,
13 const Eigen::MatrixXd &rhs,
16 const bool is_formulation_mixed,
17 const bool is_time_dependent)
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),
25 rhs_assembler_(rhs_assembler),
27 is_formulation_mixed_(is_formulation_mixed)
30 if (!is_time_dependent)
47 hessian.resize(
x.size(),
x.size());
73 std::vector<mesh::LocalBoundary>(), std::vector<int>(),
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.
void second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &hessian) const override
Compute the second derivative of the value wrt x.
bool is_formulation_mixed_
True if the formulation is mixed.
const std::vector< int > & boundary_nodes_
void update_quantities(const double t, const Eigen::VectorXd &x) override
Update time dependent quantities.
void first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
Compute the first derivative of the value wrt x.
const std::vector< mesh::LocalBoundary > & local_neumann_boundary_
const int ndof_
Number of degrees of freedom.
const assembler::Density & density_
const QuadratureOrders n_boundary_samples_
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.
Eigen::MatrixXd current_rhs_
Cached RHS for the current time.
const std::vector< mesh::LocalBoundary > & local_boundary_
const int n_pressure_bases_
void update_current_rhs(const Eigen::VectorXd &x)
Update current_rhs.
const Eigen::MatrixXd & rhs_
static RHS for the current time
Eigen::MatrixXd x_prev_
Cached previous solution.
void hessian_wrt_u_prev(const Eigen::VectorXd &u_prev, const double t, StiffnessMatrix &hessian) const
double value_unweighted(const Eigen::VectorXd &x) const override
Compute the value of the body force form.
std::array< int, 2 > QuadratureOrders
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix