void SpringNetwork::Simulate(float3N &Xnew, float3N &Vnew, float dt, ClothVertex *extforce)
{
// Get ready for conjugate gradient iterative solver step.
// Initialize operands.
int n=X.count; // all our big vectors are of this size
float3N temp(n); // temp to store result of matrix multiply
float3N B(n);
dV.Zero();
A.Identity(); // build up the big matrix we feed to solver
if(!step) // implicit euler as initial guess for 2-nd order bdf
{
A = M * A;
A -= (dFdV * dt + dFdX * (dt*dt)); // A = I - (dFdV * dt + dFdX * (dt*dt))
temp = dFdX * V;
B = F * dt + temp * (dt*dt);
}
else // BDF-2
{
// multiplying the whole equation from left with M
// idea taken from Baraff[98] who applied this to the implicit euler formula
A = M * A; // M - [...]
A -= (dFdV * (2.0f*dt/3.0f) + dFdX * ((4.0f*dt*dt)/9.0f)); // A = I - (dFdV * (2*dt/3) + dFdX * (4*dt*dt/9))
B = (X-Xold) * (1.0f/3.0f); // (X - Xold) * 1/3
B += ( (V*8.0f - Vold*2.0f) * (dt/9.0f)); // + (8*V - 2*Vold)*(dt/9);
B = M * B;
temp = dFdV * V; // + ((4*dt*dt)/9)*(F - dFdV*V)
B += (F - temp) * ((4.0f*dt*dt)/9.0f);
temp = (X - Xold); // - (2*dt/9)*dFdV*(X-Xold);
temp = dFdV*temp;
B = B - (temp * (2.0f*dt/9.0f));
}
PreConjGradientFiltered(dV,A,B,S,z, olddV);
olddV = dV;
if(!step)
{
Vnew = V + dV;
Xnew = X + V*dt;
}
else
{
Xnew = X + dV;
Vnew = Xnew*(3.0f/2.0f) - X*2.0f;
Vnew = (Vnew + Xold*0.5f);
Vnew = Vnew * dt;
}
}