Loading...
Searching...
No Matches
GridFluidSolver3.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_SOLVER3_HPP
12#define CUBBYFLOW_GRID_FLUID_SOLVER3_HPP
13
21
22namespace CubbyFlow
23{
36{
37 public:
38 class Builder;
39
42
45 const Vector3D& 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 GridSystemData3Ptr m_grids;
293 Collider3Ptr m_collider;
294 GridEmitter3Ptr m_emitter;
295
296 AdvectionSolver3Ptr m_advectionSolver;
297 GridDiffusionSolver3Ptr m_diffusionSolver;
298 GridPressureSolver3Ptr m_pressureSolver;
299 GridBoundaryConditionSolver3Ptr m_boundaryConditionSolver;
300
301 Vector3D m_gravity = Vector3D{ 0.0, -9.8, 0.0 };
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 GridFluidSolver3Ptr = std::shared_ptr<GridFluidSolver3>;
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_gridSpacing.z = gridSpacing;
369 m_useDomainSize = false;
370 return static_cast<T&>(*this);
371}
372
373template <typename T>
375{
376 m_domainSizeX = domainSizeX;
377 m_useDomainSize = true;
378 return static_cast<T&>(*this);
379}
380
381template <typename T>
383{
384 m_gridOrigin = gridOrigin;
385 return static_cast<T&>(*this);
386}
387
388template <typename T>
390{
391 Vector3D gridSpacing = m_gridSpacing;
392
393 if (m_useDomainSize)
394 {
395 gridSpacing.Fill(m_domainSizeX / static_cast<double>(m_resolution.x));
396 }
397
398 return gridSpacing;
399}
400
405 : public GridFluidSolverBuilderBase3<Builder>
406{
407 public:
410
413 {
414 return std::make_shared<GridFluidSolver3>(
416 }
417};
418} // namespace CubbyFlow
419
420#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 GridFluidSolver3 objects step by step.
Definition GridFluidSolver3.hpp:406
GridFluidSolver3Ptr MakeShared() const
Builds shared pointer of GridFluidSolver3 instance.
Definition GridFluidSolver3.hpp:412
GridFluidSolver3 Build() const
Builds GridFluidSolver3.
Abstract base class for grid-based 3-D fluid solver.
Definition GridFluidSolver3.hpp:36
void ResizeGrid(const Vector3UZ &newSize, const Vector3D &newGridSpacing, const Vector3D &newGridOrigin) const
Resizes grid system data.
void SetUseCompressedLinearSystem(bool isOn)
Sets whether the solver should use compressed linear system.
virtual void ComputeExternalForces(double timeIntervalInSeconds)
Computes the external force terms.
void SetViscosityCoefficient(double newValue)
Sets the viscosity coefficient.
void SetClosedDomainBoundaryFlag(int flag)
Sets the closed domain boundary flag.
const AdvectionSolver3Ptr & GetAdvectionSolver() const
Returns the advection solver instance.
void ExtrapolateIntoCollider(ScalarGrid3 *grid)
Extrapolates given field into the collider-occupied region.
virtual void ComputeAdvection(double timeIntervalInSeconds)
Computes the advection term using the advection solver.
Vector3D GetGridSpacing() const
Returns the grid spacing of the grid system data.
virtual void ComputeViscosity(double timeIntervalInSeconds)
Computes the viscosity term using the diffusion solver.
virtual void OnBeginAdvanceTimeStep(double timeIntervalInSeconds)
Called at the beginning of a time-step.
virtual ScalarField3Ptr GetFluidSDF() const
Returns the signed-distance representation of the fluid.
double GetViscosityCoefficient() const
Returns the viscosity coefficient.
double GetMaxCFL() const
Returns the max allowed CFL number.
void OnInitialize() override
Called when it needs to setup initial condition.
GridFluidSolver3()
Default constructor.
GridFluidSolver3(const Vector3UZ &resolution, const Vector3D &gridSpacing, const Vector3D &gridOrigin)
Constructs solver with initial grid size.
static Builder GetBuilder()
Returns builder fox GridFluidSolver3.
void SetCollider(const Collider3Ptr &newCollider)
Sets the collider.
const Collider3Ptr & GetCollider() const
Returns the collider.
double GetCFL(double timeIntervalInSeconds) const
Returns the CFL number from the current velocity field for given time interval.
void SetEmitter(const GridEmitter3Ptr &newEmitter)
Sets the emitter.
void ComputeGravity(double timeIntervalInSeconds)
Computes the gravity term.
void SetPressureSolver(const GridPressureSolver3Ptr &newSolver)
Sets the pressure solver.
GridFluidSolver3(GridFluidSolver3 &&) noexcept=delete
Deleted move constructor.
virtual void OnEndAdvanceTimeStep(double timeIntervalInSeconds)
Called at the end of a time-step.
ScalarField3Ptr GetColliderSDF() const
Returns the signed-distance field representation of the collider.
unsigned int GetNumberOfSubTimeSteps(double timeIntervalInSeconds) const override
Returns the required sub-time-steps for given time interval.
Vector3UZ GetResolution() const
Returns the resolution of the grid system data.
Vector3D GetGridOrigin() const
Returns the origin of the grid system data.
int GetClosedDomainBoundaryFlag() const
Returns the closed domain boundary flag.
GridFluidSolver3(const GridFluidSolver3 &)=delete
Deleted copy constructor.
const GridSystemData3Ptr & GetGridSystemData() const
Returns the grid system data.
void ApplyBoundaryCondition() const
Applies the boundary condition to the velocity field.
void SetGravity(const Vector3D &newGravity)
Sets the gravity of the system.
VectorField3Ptr GetColliderVelocityField() const
Returns the velocity field of the collider.
const Vector3D & GetGravity() const
Returns the gravity vector of the system.
const FaceCenteredGrid3Ptr & GetVelocity() const
Returns the velocity field.
const GridDiffusionSolver3Ptr & GetDiffusionSolver() const
Returns the diffusion solver instance.
virtual void ComputePressure(double timeIntervalInSeconds)
Computes the pressure term using the pressure solver.
void SetMaxCFL(double newCFL)
Sets the max allowed CFL number.
void SetAdvectionSolver(const AdvectionSolver3Ptr &newSolver)
Sets the advection solver.
bool GetUseCompressedLinearSystem() const
Returns true if the solver is using compressed linear system.
const GridPressureSolver3Ptr & GetPressureSolver() const
Returns the pressure solver instance.
const GridEmitter3Ptr & GetEmitter() const
Returns the emitter.
void SetDiffusionSolver(const GridDiffusionSolver3Ptr &newSolver)
Sets the diffusion solver.
void OnAdvanceTimeStep(double timeIntervalInSeconds) override
Called when advancing a single time-step.
Base class for grid-based fluid solver builder.
Definition GridFluidSolver3.hpp:316
bool m_useDomainSize
Definition GridFluidSolver3.hpp:345
Vector3D m_gridOrigin
Definition GridFluidSolver3.hpp:343
DerivedBuilder & WithDomainSizeX(double domainSizeX)
Returns builder with domain size in x-direction.
Definition GridFluidSolver3.hpp:374
DerivedBuilder & WithResolution(const Vector3UZ &resolution)
Returns builder with grid resolution.
Definition GridFluidSolver3.hpp:349
double m_domainSizeX
Definition GridFluidSolver3.hpp:344
DerivedBuilder & WithGridSpacing(double gridSpacing)
Returns builder with grid spacing.
Definition GridFluidSolver3.hpp:364
Vector3D m_gridSpacing
Definition GridFluidSolver3.hpp:342
DerivedBuilder & WithOrigin(const Vector3D &gridOrigin)
Returns builder with grid origin.
Definition GridFluidSolver3.hpp:382
Vector3D GetGridSpacing() const
Definition GridFluidSolver3.hpp:389
DerivedBuilder & WithGridSpacing(const Vector3D &gridSpacing)
Returns builder with grid spacing.
Definition GridFluidSolver3.hpp:356
Vector3UZ m_resolution
Definition GridFluidSolver3.hpp:341
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< GridEmitter3 > GridEmitter3Ptr
Shared pointer type for the GridEmitter3.
Definition GridEmitter3.hpp:87
std::shared_ptr< GridDiffusionSolver3 > GridDiffusionSolver3Ptr
Shared pointer type for the GridDiffusionSolver3.
Definition GridDiffusionSolver3.hpp:108
std::shared_ptr< GridSystemData3 > GridSystemData3Ptr
Shared pointer type of GridSystemData3.
Definition GridSystemData.hpp:276
std::shared_ptr< GridFluidSolver3 > GridFluidSolver3Ptr
Shared pointer type for the GridFluidSolver3.
Definition GridFluidSolver3.hpp:309
std::shared_ptr< GridPressureSolver3 > GridPressureSolver3Ptr
Shared pointer type for the GridPressureSolver3.
Definition GridPressureSolver3.hpp:96
Matrix< T, Rows, 1 > Vector
Definition Matrix.hpp:738
std::shared_ptr< Collider3 > Collider3Ptr
Shared pointer type for the Collider3.
Definition Collider.hpp:144
std::shared_ptr< ScalarField3 > ScalarField3Ptr
Shared pointer for the ScalarField3 type.
Definition ScalarField.hpp:70
constexpr int DIRECTION_ALL
All direction.
Definition Constants.hpp:332
std::shared_ptr< AdvectionSolver3 > AdvectionSolver3Ptr
Shared pointer type for the 3-D advection solver.
Definition AdvectionSolver3.hpp:125
std::shared_ptr< FaceCenteredGrid3 > FaceCenteredGrid3Ptr
Shared pointer type for the FaceCenteredGrid3.
Definition FaceCenteredGrid.hpp:437
std::shared_ptr< VectorField3 > VectorField3Ptr
Shared pointer for the VectorField3 type.
Definition VectorField.hpp:90
std::shared_ptr< GridBoundaryConditionSolver3 > GridBoundaryConditionSolver3Ptr
Shared pointer type for the GridBoundaryConditionSolver3.
Definition GridBoundaryConditionSolver3.hpp:117