Loading...
Searching...
No Matches
GridFluidSolver2.hpp
Go to the documentation of this file.
1// This code is based on Jet framework.
2// Copyright (c) 2018 Doyub Kim
3// CubbyFlow is voxel-based fluid simulation engine for computer games.
4// Copyright (c) 2020 CubbyFlow Team
5// Core Part: Chris Ohk, Junwoo Hwang, Jihong Sin, Seungwoo Yoo
6// AI Part: Dongheon Cho, Minseo Kim
7// We are making my contributions/submissions to this project solely in our
8// personal capacity and are not conveying any rights to any intellectual
9// property of any third parties.
10
11#ifndef CUBBYFLOW_GRID_FLUID_SOLVER2_HPP
12#define CUBBYFLOW_GRID_FLUID_SOLVER2_HPP
13
21
22namespace CubbyFlow
23{
36{
37 public:
38 class Builder;
39
42
45 const Vector2D& gridOrigin);
46
49
52
55
58
61
64
67
70
80
87 [[nodiscard]] double GetCFL(double timeIntervalInSeconds) const;
88
91
93 void SetMaxCFL(double newCFL);
94
97
100
103
106
109
112
115
118
121
124
135
150
159
168
177
185
188
191
194
197
200
201 protected:
204
206 void OnAdvanceTimeStep(double timeIntervalInSeconds) override;
207
219 double timeIntervalInSeconds) const override;
220
222 virtual void OnBeginAdvanceTimeStep(double timeIntervalInSeconds);
223
225 virtual void OnEndAdvanceTimeStep(double timeIntervalInSeconds);
226
235 virtual void ComputeExternalForces(double timeIntervalInSeconds);
236
238 virtual void ComputeViscosity(double timeIntervalInSeconds);
239
241 virtual void ComputePressure(double timeIntervalInSeconds);
242
244 virtual void ComputeAdvection(double timeIntervalInSeconds);
245
256
258 void ComputeGravity(double timeIntervalInSeconds);
259
267
270
273
276
279
282
283 private:
284 void BeginAdvanceTimeStep(double timeIntervalInSeconds);
285
286 void EndAdvanceTimeStep(double timeIntervalInSeconds);
287
288 void UpdateCollider(double timeIntervalInSeconds) const;
289
290 void UpdateEmitter(double timeIntervalInSeconds) const;
291
292 GridSystemData2Ptr m_grids;
293 Collider2Ptr m_collider;
294 GridEmitter2Ptr m_emitter;
295
296 AdvectionSolver2Ptr m_advectionSolver;
297 GridDiffusionSolver2Ptr m_diffusionSolver;
298 GridPressureSolver2Ptr m_pressureSolver;
299 GridBoundaryConditionSolver2Ptr m_boundaryConditionSolver;
300
301 Vector2D m_gravity = Vector2D{ 0.0, -9.8 };
302 double m_viscosityCoefficient = 0.0;
303 double m_maxCFL = 5.0;
304 int m_closedDomainBoundaryFlag = DIRECTION_ALL;
305 bool m_useCompressedLinearSys = false;
306};
307
309using GridFluidSolver2Ptr = std::shared_ptr<GridFluidSolver2>;
310
314template <typename DerivedBuilder>
316{
317 public:
320
323
326
334
337
338 protected:
340
344 double m_domainSizeX = 1.0;
345 bool m_useDomainSize = false;
346};
347
348template <typename T>
350{
351 m_resolution = resolution;
352 return static_cast<T&>(*this);
353}
354
355template <typename T>
357{
358 m_gridSpacing = gridSpacing;
359 m_useDomainSize = false;
360 return static_cast<T&>(*this);
361}
362
363template <typename T>
365{
366 m_gridSpacing.x = gridSpacing;
367 m_gridSpacing.y = gridSpacing;
368 m_useDomainSize = false;
369 return static_cast<T&>(*this);
370}
371
372template <typename T>
374{
375 m_domainSizeX = domainSizeX;
376 m_useDomainSize = true;
377 return static_cast<T&>(*this);
378}
379
380template <typename T>
382{
383 m_gridOrigin = gridOrigin;
384 return static_cast<T&>(*this);
385}
386
387template <typename T>
389{
390 Vector2D gridSpacing = m_gridSpacing;
391
392 if (m_useDomainSize)
393 {
394 gridSpacing.Fill(m_domainSizeX / static_cast<double>(m_resolution.x));
395 }
396
397 return gridSpacing;
398}
399
404 : public GridFluidSolverBuilderBase2<Builder>
405{
406 public:
409
412 {
413 return std::make_shared<GridFluidSolver2>(
415 }
416};
417} // namespace CubbyFlow
418
419#endif
Abstract base class for N-D collocated vector grid structure.
Definition CollocatedVectorGrid.hpp:23
N-D face-centered (a.k.a MAC or staggered) grid.
Definition FaceCenteredGrid.hpp:32
Front-end to create GridFluidSolver2 objects step by step.
Definition GridFluidSolver2.hpp:405
GridFluidSolver2Ptr MakeShared() const
Builds shared pointer of GridFluidSolver2 instance.
Definition GridFluidSolver2.hpp:411
GridFluidSolver2 Build() const
Builds GridFluidSolver2.
Abstract base class for grid-based 2-D fluid solver.
Definition GridFluidSolver2.hpp:36
void ResizeGrid(const Vector2UZ &newSize, const Vector2D &newGridSpacing, const Vector2D &newGridOrigin) const
Resizes grid system data.
void SetViscosityCoefficient(double newValue)
Sets the viscosity coefficient.
const GridPressureSolver2Ptr & GetPressureSolver() const
Returns the pressure solver instance.
int GetClosedDomainBoundaryFlag() const
Returns the closed domain boundary flag.
virtual void ComputeViscosity(double timeIntervalInSeconds)
Computes the viscosity term using the diffusion solver.
void ComputeGravity(double timeIntervalInSeconds)
Computes the gravity term.
Vector2D GetGridSpacing() const
Returns the grid spacing of the grid system data.
unsigned int GetNumberOfSubTimeSteps(double timeIntervalInSeconds) const override
Returns the required sub-time-steps for given time interval.
void ApplyBoundaryCondition() const
Applies the boundary condition to the velocity field.
const GridEmitter2Ptr & GetEmitter() const
Returns the emitter.
void SetUseCompressedLinearSystem(bool isOn)
Sets whether the solver should use compressed linear system.
const Vector2D & GetGravity() const
Returns the gravity vector of the system.
virtual void ComputePressure(double timeIntervalInSeconds)
Computes the pressure term using the pressure solver.
VectorField2Ptr GetColliderVelocityField() const
Returns the velocity field of the collider.
void OnInitialize() override
Called when it needs to setup initial condition.
GridFluidSolver2()
Default constructor.
void SetPressureSolver(const GridPressureSolver2Ptr &newSolver)
Sets the pressure solver.
void SetGravity(const Vector2D &newGravity)
Sets the gravity of the system.
const Collider2Ptr & GetCollider() const
Returns the collider.
bool GetUseCompressedLinearSystem() const
Returns true if the solver is using compressed linear system.
virtual ScalarField2Ptr GetFluidSDF() const
Returns the signed-distance representation of the fluid.
void ExtrapolateIntoCollider(ScalarGrid2 *grid)
Extrapolates given field into the collider-occupied region.
virtual void OnEndAdvanceTimeStep(double timeIntervalInSeconds)
Called at the end of a time-step.
Vector2D GetGridOrigin() const
Returns the origin of the grid system data.
void SetCollider(const Collider2Ptr &newCollider)
Sets the collider.
virtual void OnBeginAdvanceTimeStep(double timeIntervalInSeconds)
Called at the beginning of a time-step.
virtual void ComputeExternalForces(double timeIntervalInSeconds)
Computes the external force terms.
GridFluidSolver2(const GridFluidSolver2 &)=delete
Deleted copy constructor.
GridFluidSolver2(GridFluidSolver2 &&) noexcept=delete
Deleted move constructor.
double GetViscosityCoefficient() const
Returns the viscosity coefficient.
double GetMaxCFL() const
Returns the max allowed CFL number.
ScalarField2Ptr GetColliderSDF() const
Returns the signed-distance field representation of the collider.
static Builder GetBuilder()
Returns builder fox GridFluidSolver2.
void SetMaxCFL(double newCFL)
Sets the max allowed CFL number.
double GetCFL(double timeIntervalInSeconds) const
Returns the CFL number from the current velocity field for given time interval.
Vector2UZ GetResolution() const
Returns the resolution of the grid system data.
void OnAdvanceTimeStep(double timeIntervalInSeconds) override
Called when advancing a single time-step.
const FaceCenteredGrid2Ptr & GetVelocity() const
Returns the velocity field.
virtual void ComputeAdvection(double timeIntervalInSeconds)
Computes the advection term using the advection solver.
const GridSystemData2Ptr & GetGridSystemData() const
Returns the grid system data.
const GridDiffusionSolver2Ptr & GetDiffusionSolver() const
Returns the diffusion solver instance.
void SetAdvectionSolver(const AdvectionSolver2Ptr &newSolver)
Sets the advection solver.
GridFluidSolver2(const Vector2UZ &resolution, const Vector2D &gridSpacing, const Vector2D &gridOrigin)
Constructs solver with initial grid size.
void SetDiffusionSolver(const GridDiffusionSolver2Ptr &newSolver)
Sets the diffusion solver.
void SetEmitter(const GridEmitter2Ptr &newEmitter)
Sets the emitter.
const AdvectionSolver2Ptr & GetAdvectionSolver() const
Returns the advection solver instance.
void SetClosedDomainBoundaryFlag(int flag)
Sets the closed domain boundary flag.
Base class for grid-based fluid solver builder.
Definition GridFluidSolver2.hpp:316
bool m_useDomainSize
Definition GridFluidSolver2.hpp:345
Vector2UZ m_resolution
Definition GridFluidSolver2.hpp:341
double m_domainSizeX
Definition GridFluidSolver2.hpp:344
DerivedBuilder & WithOrigin(const Vector2D &gridOrigin)
Returns builder with grid origin.
Definition GridFluidSolver2.hpp:381
DerivedBuilder & WithGridSpacing(double gridSpacing)
Returns builder with grid spacing.
Definition GridFluidSolver2.hpp:364
DerivedBuilder & WithGridSpacing(const Vector2D &gridSpacing)
Returns builder with grid spacing.
Definition GridFluidSolver2.hpp:356
DerivedBuilder & WithDomainSizeX(double domainSizeX)
Returns builder with domain size in x-direction.
Definition GridFluidSolver2.hpp:373
Vector2D m_gridOrigin
Definition GridFluidSolver2.hpp:343
DerivedBuilder & WithResolution(const Vector2UZ &resolution)
Returns builder with grid resolution.
Definition GridFluidSolver2.hpp:349
Vector2D m_gridSpacing
Definition GridFluidSolver2.hpp:342
Vector2D GetGridSpacing() const
Definition GridFluidSolver2.hpp:388
Definition Matrix.hpp:30
void Fill(const T &val)
Definition Matrix-Impl.hpp:226
Abstract base class for physics-based animation.
Definition PhysicsAnimation.hpp:25
Abstract base class for N-D scalar grid structure.
Definition ScalarGrid.hpp:25
Definition pybind11Utils.hpp:21
std::shared_ptr< GridSystemData2 > GridSystemData2Ptr
Shared pointer type of GridSystemData2.
Definition GridSystemData.hpp:273
std::shared_ptr< Collider2 > Collider2Ptr
Shared pointer type for the Collider2.
Definition Collider.hpp:141
std::shared_ptr< GridFluidSolver2 > GridFluidSolver2Ptr
Shared pointer type for the GridFluidSolver2.
Definition GridFluidSolver2.hpp:309
std::shared_ptr< GridDiffusionSolver2 > GridDiffusionSolver2Ptr
Shared pointer type for the GridDiffusionSolver2.
Definition GridDiffusionSolver2.hpp:108
std::shared_ptr< ScalarField2 > ScalarField2Ptr
Shared pointer for the ScalarField2 type.
Definition ScalarField.hpp:67
Matrix< T, Rows, 1 > Vector
Definition Matrix.hpp:738
std::shared_ptr< AdvectionSolver2 > AdvectionSolver2Ptr
Shared pointer type for the 2-D advection solver.
Definition AdvectionSolver2.hpp:125
std::shared_ptr< GridPressureSolver2 > GridPressureSolver2Ptr
Shared pointer type for the GridPressureSolver2.
Definition GridPressureSolver2.hpp:95
std::shared_ptr< VectorField2 > VectorField2Ptr
Shared pointer for the VectorField2 type.
Definition VectorField.hpp:87
std::shared_ptr< FaceCenteredGrid2 > FaceCenteredGrid2Ptr
Shared pointer type for the FaceCenteredGrid2.
Definition FaceCenteredGrid.hpp:434
constexpr int DIRECTION_ALL
All direction.
Definition Constants.hpp:332
std::shared_ptr< GridBoundaryConditionSolver2 > GridBoundaryConditionSolver2Ptr
Shared pointer type for the GridBoundaryConditionSolver2.
Definition GridBoundaryConditionSolver2.hpp:117
std::shared_ptr< GridEmitter2 > GridEmitter2Ptr
Shared pointer type for the GridEmitter2.
Definition GridEmitter2.hpp:87