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