GridFractionalSinglePhasePressureSolver2.h
Go to the documentation of this file.
1 /*************************************************************************
2 > File Name: GridFractionalSinglePhasePressureSolver2.h
3 > Project Name: CubbyFlow
4 > Author: Chan-Ho Chris Ohk
5 > Purpose: 2-D fractional single-phase pressure solver.
6 > Created Time: 2017/08/14
7 > Copyright (c) 2018, Chan-Ho Chris Ohk
8 *************************************************************************/
9 #ifndef CUBBYFLOW_FRACTIONAL_SINGLE_PHASE_PRESSURE_SOLVER2_H
10 #define CUBBYFLOW_FRACTIONAL_SINGLE_PHASE_PRESSURE_SOLVER2_H
11 
16 
17 namespace CubbyFlow
18 {
44  {
45  public:
48 
51 
74  void Solve(
75  const FaceCenteredGrid2& input,
76  double timeIntervalInSeconds,
77  FaceCenteredGrid2* output,
78  const ScalarField2& boundarySDF = ConstantScalarField2(std::numeric_limits<double>::max()),
79  const VectorField2& boundaryVelocity = ConstantVectorField2({ 0, 0 }),
80  const ScalarField2& fluidSDF = ConstantScalarField2(-std::numeric_limits<double>::max()),
81  bool useCompressed = false) override;
82 
93 
96 
99 
101  const FDMVector2& GetPressure() const;
102 
103  private:
104  FDMLinearSystem2 m_system;
105  FDMCompressedLinearSystem2 m_compSystem;
106  FDMLinearSystemSolver2Ptr m_systemSolver;
107 
108  FDMMGLinearSystem2 m_mgSystem;
109  FDMMGSolver2Ptr m_mgSystemSolver;
110 
111  std::vector<Array2<float>> m_uWeights;
112  std::vector<Array2<float>> m_vWeights;
113  std::vector<Array2<float>> m_fluidSDF;
114 
115  std::function<Vector2D(const Vector2D&)> m_boundaryVel;
116 
117  void BuildWeights(
118  const FaceCenteredGrid2& input,
119  const ScalarField2& boundarySDF,
120  const VectorField2& boundaryVelocity,
121  const ScalarField2& fluidSDF);
122 
123  void DecompressSolution();
124 
125  virtual void BuildSystem(const FaceCenteredGrid2& input, bool useCompressed);
126 
127  void ApplyPressureGradient(const FaceCenteredGrid2& input, FaceCenteredGrid2* output);
128  };
129 
131  using GridFractionalSinglePhasePressureSolver2Ptr = std::shared_ptr<GridFractionalSinglePhasePressureSolver2>;
132 }
133 
134 #endif
std::shared_ptr< FDMLinearSystemSolver2 > FDMLinearSystemSolver2Ptr
Shared pointer type for the FDMLinearSystemSolver2.
Definition: FDMLinearSystemSolver2.h:33
Linear system (Ax=b) for 2-D finite differencing.
Definition: FDMLinearSystem2.h:39
Abstract base class for 2-D scalar field.
Definition: ScalarField2.h:21
GridFractionalSinglePhasePressureSolver2()
Default constructor.
Abstract base class for 2-D grid-based pressure solver.
Definition: GridPressureSolver2.h:27
std::shared_ptr< GridBoundaryConditionSolver2 > GridBoundaryConditionSolver2Ptr
Shared pointer type for the GridBoundaryConditionSolver2.
Definition: GridBoundaryConditionSolver2.h:104
2-D fractional single-phase pressure solver.
Definition: GridFractionalSinglePhasePressureSolver2.h:43
void Solve(const FaceCenteredGrid2 &input, double timeIntervalInSeconds, FaceCenteredGrid2 *output, const ScalarField2 &boundarySDF=ConstantScalarField2(std::numeric_limits< double >::max()), const VectorField2 &boundaryVelocity=ConstantVectorField2({ 0, 0 }), const ScalarField2 &fluidSDF=ConstantScalarField2(-std::numeric_limits< double >::max()), bool useCompressed=false) override
Solves the pressure term and apply it to the velocity field.
2-D face-centered (a.k.a MAC or staggered) grid.
Definition: FaceCenteredGrid2.h:25
const FDMLinearSystemSolver2Ptr & GetLinearSystemSolver() const
Returns the linear system solver.
Definition: pybind11Utils.h:24
std::shared_ptr< FDMMGSolver2 > FDMMGSolver2Ptr
Shared pointer type for the FDMMGSolver2.
Definition: FDMMGSolver2.h:55
virtual ~GridFractionalSinglePhasePressureSolver2()
Default destructor.
const FDMVector2 & GetPressure() const
Returns the pressure field.
GridBoundaryConditionSolver2Ptr SuggestedBoundaryConditionSolver() const override
Returns the best boundary condition solver for this solver.
Compressed linear system (Ax=b) for 2-D finite differencing.
Definition: FDMLinearSystem2.h:58
2-D constant vector field.
Definition: ConstantVectorField2.h:17
void SetLinearSystemSolver(const FDMLinearSystemSolver2Ptr &solver)
Sets the linear system solver.
2-D constant scalar field.
Definition: ConstantScalarField2.h:17
Abstract base class for 2-D vector field.
Definition: VectorField2.h:21
2-D array class.
Definition: Array2.h:42
Multigrid-syle 2-D linear system.
Definition: FDMMGLinearSystem2.h:24
std::shared_ptr< GridFractionalSinglePhasePressureSolver2 > GridFractionalSinglePhasePressureSolver2Ptr
Shared pointer type for the GridFractionalSinglePhasePressureSolver2.
Definition: GridFractionalSinglePhasePressureSolver2.h:131