PolyFEM
Loading...
Searching...
No Matches
NavierStokesFSIForm.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "Form.hpp"
4
9
10#include <array>
11#include <memory>
12
13namespace polyfem::solver
14{
20 {
21 public:
23 int total_size,
24 int n_velocity_bases,
25 int n_pressure_bases,
26 int n_mesh_displacement_bases,
27 int multiplier_offset,
28 int dim,
29 const std::vector<basis::ElementBases> &pressure_bases,
30 const std::vector<basis::ElementBases> &mesh_displacement_bases,
31 const std::vector<basis::ElementBases> &geom_bases,
32 const assembler::AssemblyValsCache &pressure_cache,
33 const assembler::AssemblyValsCache &mesh_displacement_cache,
34 bool is_volume);
35
36 std::string name() const override { return "navier-stokes-fsi-average-pressure"; }
37
38 protected:
39 double value_unweighted(const Eigen::VectorXd &x) const override;
40 void first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &residual) const override;
41 void second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &jacobian) const override;
42
43 private:
45 const Eigen::VectorXd &x,
46 Eigen::VectorXd &weights,
47 Eigen::MatrixXd &weight_derivative) const;
48
49 const int total_size_;
50 const int dim_;
56 const std::vector<basis::ElementBases> &pressure_bases_;
57 const std::vector<basis::ElementBases> &mesh_displacement_bases_;
58 const std::vector<basis::ElementBases> &geom_bases_;
61 const bool is_volume_;
62 };
63
68 {
69 public:
71 using VelocityTildeUpdater = std::function<void(
72 double time,
73 const Eigen::VectorXd &current_velocity,
74 Eigen::VectorXd &velocity_tilde)>;
75
77 int total_size,
78 int n_velocity_bases,
79 int n_pressure_bases,
80 int n_mesh_displacement_bases,
81 const std::vector<basis::ElementBases> &velocity_bases,
82 const std::vector<basis::ElementBases> &pressure_bases,
83 const std::vector<basis::ElementBases> &mesh_displacement_bases,
84 const std::vector<basis::ElementBases> &geom_bases,
85 const assembler::AssemblyValsCache &velocity_cache,
86 const assembler::AssemblyValsCache &pressure_cache,
87 const assembler::AssemblyValsCache &mesh_displacement_cache,
88 std::vector<std::shared_ptr<assembler::MultiSpacesNLAssembler>> assemblers,
89 const time_integrator::ImplicitTimeIntegrator *velocity_time_integrator,
90 const time_integrator::ImplicitTimeIntegrator *mesh_displacement_time_integrator,
91 double t,
92 double dt,
93 bool is_volume,
94 BodyForceEvaluator body_force_evaluator = {});
95
96 std::string name() const override { return "navier-stokes-fsi"; }
97 void update_quantities(double t, const Eigen::VectorXd &x) override;
99 bool is_step_valid(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override;
100
101 int velocity_ndof() const { return global_sizes_[0]; }
102 int pressure_ndof() const { return global_sizes_[1]; }
103 int mesh_displacement_ndof() const { return global_sizes_[2]; }
104
105 protected:
106 double value_unweighted(const Eigen::VectorXd &x) const override;
107 void first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &residual) const override;
108 void second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &jacobian) const override;
109
110 private:
111 using SpaceValues = std::array<assembler::ElementAssemblyValues, 3>;
112 using LocalCoefficients = std::array<Eigen::VectorXd, 3>;
113
114 void compute_element_values(int element, SpaceValues &vals, QuadratureVector &da) const;
115 Eigen::VectorXd gather(const Eigen::VectorXd &x, const assembler::ElementAssemblyValues &vals, int components, int global_offset) const;
116 void scatter_local_residual(const SpaceValues &vals, const Eigen::VectorXd &local, Eigen::VectorXd &global) const;
118 const SpaceValues &vals,
119 int row_space,
120 int col_space,
121 const Eigen::MatrixXd &local,
122 std::vector<Eigen::Triplet<double>> &entries) const;
124 const SpaceValues &vals,
125 const LocalCoefficients &x,
126 const LocalCoefficients &x_prev,
127 const QuadratureVector &da,
128 const Eigen::VectorXd &velocity_tilde,
129 const Eigen::VectorXd &mesh_velocity) const;
130 bool has_valid_ale_mapping(const Eigen::VectorXd &x) const;
131
132 const int total_size_;
133 const int dim_;
134 const std::array<int, 3> n_bases_;
135 const std::array<int, 3> components_;
136 const std::array<int, 3> global_offsets_;
137 const std::array<int, 3> global_sizes_;
138 const std::array<std::reference_wrapper<const std::vector<basis::ElementBases>>, 3> bases_;
139 const std::vector<basis::ElementBases> &geom_bases_;
140 const std::array<std::reference_wrapper<const assembler::AssemblyValsCache>, 3> caches_;
141 const std::vector<std::shared_ptr<assembler::MultiSpacesNLAssembler>> assemblers_;
144 double t_;
145 const double dt_;
146 const bool is_volume_;
149 Eigen::VectorXd x_prev_;
150 };
151} // namespace polyfem::solver
QuadratureVector da
Definition Assembler.cpp:26
ElementAssemblyValues vals
Definition Assembler.cpp:25
std::vector< Eigen::Triplet< double > > entries
std::vector< std::pair< int, double > > weights
int x
Caches basis evaluation and geometric mapping at every element.
stores per element basis values at given quadrature points and geometric mapping
std::function< void(int element_id, const Eigen::MatrixXd &physical_points, double time, Eigen::MatrixXd &values)> BodyForceEvaluator
Mean-zero pressure constraint on the current ALE domain.
double value_unweighted(const Eigen::VectorXd &x) const override
Compute the value of the form.
const std::vector< basis::ElementBases > & mesh_displacement_bases_
const assembler::AssemblyValsCache & pressure_cache_
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.
const std::vector< basis::ElementBases > & geom_bases_
void compute_constraint(const Eigen::VectorXd &x, Eigen::VectorXd &weights, Eigen::MatrixXd &weight_derivative) const
const assembler::AssemblyValsCache & mesh_displacement_cache_
const std::vector< basis::ElementBases > & pressure_bases_
Global residual form for ALE Navier–Stokes on velocity, pressure, and mesh-displacement spaces.
bool is_step_valid(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override
Determine if a step from solution x0 to solution x1 is allowed.
void update_quantities(double t, const Eigen::VectorXd &x) override
Update time-dependent fields.
const time_integrator::ImplicitTimeIntegrator * mesh_displacement_time_integrator_
assembler::NavierStokesFSIAssemblerData make_data(const SpaceValues &vals, const LocalCoefficients &x, const LocalCoefficients &x_prev, const QuadratureVector &da, const Eigen::VectorXd &velocity_tilde, const Eigen::VectorXd &mesh_velocity) const
void first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &residual) const override
Compute the first derivative of the value wrt x.
std::array< Eigen::VectorXd, 3 > LocalCoefficients
double value_unweighted(const Eigen::VectorXd &x) const override
Compute the value of the form.
bool has_valid_ale_mapping(const Eigen::VectorXd &x) const
const std::vector< std::shared_ptr< assembler::MultiSpacesNLAssembler > > assemblers_
const std::vector< basis::ElementBases > & geom_bases_
const std::array< std::reference_wrapper< const std::vector< basis::ElementBases > >, 3 > bases_
const std::array< std::reference_wrapper< const assembler::AssemblyValsCache >, 3 > caches_
void compute_element_values(int element, SpaceValues &vals, QuadratureVector &da) const
std::function< void(double time, const Eigen::VectorXd &current_velocity, Eigen::VectorXd &velocity_tilde)> VelocityTildeUpdater
void scatter_local_residual(const SpaceValues &vals, const Eigen::VectorXd &local, Eigen::VectorXd &global) const
Eigen::VectorXd gather(const Eigen::VectorXd &x, const assembler::ElementAssemblyValues &vals, int components, int global_offset) const
void scatter_local_block(const SpaceValues &vals, int row_space, int col_space, const Eigen::MatrixXd &local, std::vector< Eigen::Triplet< double > > &entries) const
std::array< assembler::ElementAssemblyValues, 3 > SpaceValues
void set_velocity_tilde_updater(VelocityTildeUpdater updater)
const time_integrator::ImplicitTimeIntegrator * velocity_time_integrator_
assembler::NavierStokesFSIAssemblerData::BodyForceEvaluator BodyForceEvaluator
void second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &jacobian) const override
Compute the second derivative of the value wrt x.
Implicit time integrator of a second order ODE (equivently a system of coupled first order ODEs).
Eigen::Matrix< double, Eigen::Dynamic, 1, 0, MAX_QUAD_POINTS, 1 > QuadratureVector
Definition Types.hpp:17
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:24