PolyFEM
Loading...
Searching...
No Matches
NavierStokesForm.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "Form.hpp"
4
10
11#include <memory>
12
13namespace polyfem::solver
14{
16 class NavierStokesForm : public Form
17 {
18 public:
20 int n_bases,
21 const std::vector<basis::ElementBases> &bases,
22 const std::vector<basis::ElementBases> &geom_bases,
23 std::shared_ptr<assembler::Assembler> stokes_assembler,
24 assembler::NavierStokesVelocity &navier_stokes_assembler,
25 const assembler::AssemblyValsCache &ass_vals_cache,
26 double t,
27 bool is_volume);
28
29 std::string name() const override { return "navier-stokes"; }
30
31 void update_quantities(double t, const Eigen::VectorXd &x) override;
32
33 protected:
34 double value_unweighted(const Eigen::VectorXd &x) const override;
35 void first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &residual) const override;
36 void second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &jacobian) const override;
37
38 private:
39 void assemble_stokes(double t);
40 void assemble_convection(const Eigen::VectorXd &x, bool picard, StiffnessMatrix &jacobian) const;
41
43 const std::vector<basis::ElementBases> &bases_;
44 const std::vector<basis::ElementBases> &geom_bases_;
45 std::shared_ptr<assembler::Assembler> stokes_assembler_;
48 double t_;
51 };
52
54 class MixedLinearForm : public Form
55 {
56 public:
58 int n_velocity_bases,
59 int n_pressure_bases,
60 const std::vector<basis::ElementBases> &velocity_bases,
61 const std::vector<basis::ElementBases> &pressure_bases,
62 const std::vector<basis::ElementBases> &geom_bases,
63 const assembler::MixedAssembler &assembler,
64 const assembler::AssemblyValsCache &velocity_cache,
65 const assembler::AssemblyValsCache &pressure_cache,
66 double t,
67 bool is_volume);
68
69 std::string name() const override { return "mixed-linear"; }
70 void set_row_weights(double velocity_weight, double pressure_weight);
71
72 protected:
73 double value_unweighted(const Eigen::VectorXd &x) const override;
74 void first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &residual) const override;
75 void second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &jacobian) const override;
76
77 private:
81 double velocity_weight_ = 1;
82 double pressure_weight_ = 1;
83 };
84
87 {
88 public:
89 explicit AveragePressureForm(int n_pressure_bases);
90
91 std::string name() const override { return "average-pressure"; }
92
93 protected:
94 double value_unweighted(const Eigen::VectorXd &x) const override;
95 void first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &residual) const override;
96 void second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &jacobian) const override;
97
98 private:
100 };
101} // namespace polyfem::solver
int x
Caches basis evaluation and geometric mapping at every element.
Mean-zero pressure equation with a scalar Lagrange multiplier.
void first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &residual) const override
Compute the first derivative of the value wrt x.
double value_unweighted(const Eigen::VectorXd &x) const override
Compute the value of the form.
void second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &jacobian) const override
Compute the second derivative of the value wrt x.
std::string name() const override
Constant saddle-point coupling between velocity and pressure.
std::string name() const override
double value_unweighted(const Eigen::VectorXd &x) const override
Compute the value of the form.
void set_row_weights(double velocity_weight, double pressure_weight)
void first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &residual) const override
Compute the first derivative of the value wrt x.
void second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &jacobian) const override
Compute the second derivative of the value wrt x.
Residual form for the viscous and convective velocity terms of Navier–Stokes.
assembler::NavierStokesVelocity & navier_stokes_assembler_
std::shared_ptr< assembler::Assembler > stokes_assembler_
void assemble_convection(const Eigen::VectorXd &x, bool picard, StiffnessMatrix &jacobian) const
const std::vector< basis::ElementBases > & geom_bases_
void first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &residual) const override
Compute the first derivative of the value wrt x.
double value_unweighted(const Eigen::VectorXd &x) const override
Compute the value of the form.
const assembler::AssemblyValsCache & ass_vals_cache_
void update_quantities(double t, const Eigen::VectorXd &x) override
Update time-dependent fields.
std::string name() const override
void second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &jacobian) const override
Compute the second derivative of the value wrt x.
const std::vector< basis::ElementBases > & bases_
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:24