solvePressure method
Implementation
void solvePressure(TimeStep step) {
// calculates the sum of contact-weights for each particle
// that means dimensionless density
for (final particle in _particles) {
particle.accumulation = 0.0;
}
for (final contact in bodyContactBuffer) {
contact.particle.accumulation += contact.weight;
}
for (final contact in contactBuffer) {
contact.particleA.accumulation += contact.weight;
contact.particleB.accumulation += contact.weight;
}
// ignores powder particles
if ((allParticleFlags & noPressureFlags) != 0) {
for (final particle in _particles) {
if ((particle.flags & noPressureFlags) != 0) {
particle.accumulation = 0.0;
}
}
}
// calculates pressure as a linear function of density
final pressurePerWeight = pressureStrength * getCriticalPressure(step);
for (final particle in _particles) {
final w = particle.accumulation;
final h = pressurePerWeight *
max(
0.0,
min(w, settings.maxParticleWeight) - settings.minParticleWeight,
);
particle.accumulation = h;
}
// applies pressure between each particles in contact
final velocityPerPressure = step.dt / (_particleDensity * particleDiameter);
for (final contact in bodyContactBuffer) {
final particle = contact.particle;
final b = contact.body;
final w = contact.weight;
final m = contact.mass;
final n = contact.normal;
final p = particle.position;
final h = particle.accumulation + pressurePerWeight * w;
final f = _tempVec;
final coef = velocityPerPressure * w * m * h;
f.x = coef * n.x;
f.y = coef * n.y;
final velData = particle.velocity;
velData.x -= particleInverseMass * f.x;
velData.y -= particleInverseMass * f.y;
b.applyLinearImpulse(f, point: p);
}
for (final contact in contactBuffer) {
final particleA = contact.particleA;
final particleB = contact.particleB;
final w = contact.weight;
final n = contact.normal;
final h = particleA.accumulation + particleB.accumulation;
final fx = velocityPerPressure * w * h * n.x;
final fy = velocityPerPressure * w * h * n.y;
final velDataA = particleA.velocity;
final velDataB = particleB.velocity;
velDataA.x -= fx;
velDataA.y -= fy;
velDataB.x += fx;
velDataB.y += fy;
}
}