solvePressure method

void solvePressure(
  1. TimeStep step
)

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;
  }
}