solveTensile method

void solveTensile(
  1. TimeStep step
)

Implementation

void solveTensile(TimeStep step) {
  for (final particle in _particles) {
    particle.accumulation = 0.0;
    particle.accumulationVector.setZero();
  }
  for (final contact in contactBuffer) {
    if ((contact.flags & ParticleType.tensileParticle) != 0) {
      final particleA = contact.particleA;
      final particleB = contact.particleB;
      final w = contact.weight;
      final n = contact.normal;
      particleA.accumulation += w;
      particleB.accumulation += w;
      final a2A = particleA.accumulationVector;
      final a2B = particleB.accumulationVector;
      final inter = (1 - w) * w;
      a2A.x -= inter * n.x;
      a2A.y -= inter * n.y;
      a2B.x += inter * n.x;
      a2B.y += inter * n.y;
    }
  }
  final strengthA = surfaceTensionStrengthA * getCriticalVelocity(step);
  final strengthB = surfaceTensionStrengthB * getCriticalVelocity(step);
  for (final contact in contactBuffer) {
    if ((contact.flags & ParticleType.tensileParticle) != 0) {
      final particleA = contact.particleA;
      final particleB = contact.particleB;
      final w = contact.weight;
      final n = contact.normal;
      final a2A = particleA.accumulationVector;
      final a2B = particleB.accumulationVector;
      final h = particleA.accumulation + particleB.accumulation;
      final sx = a2B.x - a2A.x;
      final sy = a2B.y - a2A.y;
      final fn =
          (strengthA * (h - 2) + strengthB * (sx * n.x + sy * n.y)) * w;
      final fx = fn * n.x;
      final fy = fn * n.y;
      final va = particleA.velocity;
      final vb = particleB.velocity;
      va.x -= fx;
      va.y -= fy;
      vb.x += fx;
      vb.y += fy;
    }
  }
}