17 Eigen::Vector3d& gravity,
18 std::unique_ptr<PressureCalculator::Interface>&& pressureCalculator,
19 std::unique_ptr<SurfaceDetector::Interface>&& surfaceDetector
47 particle.pressure = pressures[particle.id];
56 auto pressures = explicitPressureCalculator->calc(
particles);
58 particle.pressure = pressures[particle.id];
66#pragma omp parallel for
71 p.acceleration.setZero();
81#pragma omp parallel for
86 Eigen::Vector3d viscosityTerm = Eigen::Vector3d::Zero();
88 for (
auto& neighbor : pi.neighbors) {
92 double w =
weight(neighbor.distance, re);
93 viscosityTerm += (pj.velocity - pi.velocity) * w;
98 pi.acceleration += viscosityTerm;
103#pragma omp parallel for
109 p.acceleration.setZero();
118 for (
auto& neighbor : pi.neighbors) {
125 double invMi = pi.inverseDensity();
127 double mass = 1.0 / (invMi + invMj);
129 Eigen::Vector3d normal = (pj.
position - pi.position).normalized();
130 double relVel = (pj.
velocity - pi.velocity).dot(normal);
131 double impulse = 0.0;
134 pi.velocity -= impulse * invMi * normal;
135 pj.
velocity += impulse * invMj * normal;
138 double positionImpulse = depth * mass;
139 pi.position -= positionImpulse * invMi * normal;
140 pj.
position += positionImpulse * invMj * normal;
150#pragma omp parallel for
152 pi.numberDensity = 0.0;
157 for (
auto& neighbor : pi.neighbors)
158 pi.numberDensity +=
weight(neighbor.distance, re);
163#pragma omp parallel for
179#pragma omp parallel for
181 p.minimumPressure = p.pressure;
188 for (
auto& neighbor : pi.neighbors) {
195 if (neighbor.distance < re) {
196 pi.minimumPressure = std::min(pi.minimumPressure, pj.
pressure);
206#pragma omp parallel for
211 Eigen::Vector3d grad = Eigen::Vector3d::Zero();
212 for (
auto& neighbor : pi.neighbors) {
217 if (neighbor.distance < re) {
218 double w =
weight(neighbor.distance, re);
220 double dist2 = (pj.
position - pi.position).squaredNorm();
221 double pij = (pj.
pressure - pi.minimumPressure) / dist2;
222 grad += (pj.
position - pi.position) * pij * w;
226 pi.acceleration -= grad / pi.density;
231#pragma omp parallel for
238 p.acceleration.setZero();
254 cerr <<
"ERROR: Courant number is larger than CFL condition. Courant = " <<
courant << endl;
void setMinimumPressure(const double &re)
set minimum pressure for pressure gradient calculation
void calViscosity(const double &re)
calculate viscosity term of Navier-Stokes equation
std::unique_ptr< PressureCalculator::Interface > pressureCalculator
Interface for pressure calculation.
void moveParticleUsingPressureGradient()
move particles in correction step
Settings settings
Settings for the simulation.
double courant
Maximum courant number among all particles.
void calPressureGradient(const double &re)
calculate pressure gradient term
RefValues refValuesForLaplacian
Reference values for the simulation ( , )
void moveParticle()
move particles in prediction step
void setBoundaryCondition()
set boundary condition of pressure Poisson equation
RefValues refValuesForNumberDensity
Reference values for the simulation ( , )
void calCourant()
calculate Courant number
void collision()
calculate collision between particles when they are too close
Eigen::Vector3d gravity
Gravity vector for the simulation.
NeighborSearcher neighborSearcher
Neighbor searcher for neighbor search.
std::unique_ptr< SurfaceDetector::Interface > surfaceDetector
Interface for free surface detection.
void calNumberDensity(const double &re)
calculate number density of each particle
RefValues refValuesForGradient
Reference values for the simulation ( , )
void calGravity()
calculate gravity term
Particles particles
Particles in the simulation.
Domain domain
Domain of the simulation.
void setNeighbors(Particles &particles)
Class for particle in MPS method.
double inverseDensity() const
calculate inverse of density for collision
Eigen::Vector3d position
position of the particle
double pressure
pressure of the particle
int id
index of the particle
double minimumPressure
minimum pressure of the particle
Eigen::Vector3d velocity
velocity of the particle
ParticleType type
type of the particle
int size() const
Get the number of particles.
Class for explicit pressure calculation.
Struct for reference values of MPS method.
double n0
reference value of number density for source term of pressure Poisson equation
double lambda
coefficient for laplacian
@ Inner
inner fluid particle
@ FreeSurface
free surface particle
@ Ghost
Ghost particle (outside of the domain, not used for calculation)
@ DummyWall
Dummy wall particle (pressure is not calculated)
double reMax
Maximum of effective radius.
double collisionDistance
Distance for collision detection.
double particleDistance
Initial distance between particles.
int dim
Dimension of the simulation.
double re_forNumberDensity
Effective radius for number density.
double kinematicViscosity
Kinematic viscosity.
double cflCondition
CFL condition.
double coefficientOfRestitution
Coefficient of restitution.
double re_forGradient
Effective radius for gradient.
Domain domain
domain of the simulation
double re_forLaplacian
Effective radius for Laplacian.
double weight(double dis, double re)
Wight function for MPS method presented by Koshizuka and Oka, 1996