diff --git a/src/BulletSoftBody/btConjugateGradient.h b/src/BulletSoftBody/btConjugateGradient.h index c1816600e..bd51e584b 100644 --- a/src/BulletSoftBody/btConjugateGradient.h +++ b/src/BulletSoftBody/btConjugateGradient.h @@ -27,12 +27,12 @@ class btConjugateGradient typedef btAlignedObjectArray TVStack; TVStack r,p,z,temp; int max_iterations; - btScalar tolerance; + btScalar tolerance_squared; public: btConjugateGradient(const int max_it_in) : max_iterations(max_it_in) { - tolerance = 1e-5; + tolerance_squared = 1e-5; } virtual ~btConjugateGradient(){} @@ -51,8 +51,7 @@ public: A.precondition(r, z); A.project(z); btScalar r_dot_z = dot(z,r); - btScalar local_tolerance = tolerance; - if (r_dot_z <= local_tolerance) { + if (r_dot_z <= tolerance_squared) { if (verbose) { std::cout << "Iteration = 0" << std::endl; @@ -86,7 +85,7 @@ public: A.precondition(r, z); r_dot_z = r_dot_z_new; r_dot_z_new = dot(r,z); - if (r_dot_z_new < local_tolerance) { + if (r_dot_z_new < tolerance_squared) { if (verbose) { std::cout << "ConjugateGradient iterations " << k << std::endl; diff --git a/src/BulletSoftBody/btDeformableBodySolver.cpp b/src/BulletSoftBody/btDeformableBodySolver.cpp index 676df528d..01a71aa3e 100644 --- a/src/BulletSoftBody/btDeformableBodySolver.cpp +++ b/src/BulletSoftBody/btDeformableBodySolver.cpp @@ -18,13 +18,13 @@ #include "btDeformableBodySolver.h" #include "btSoftBodyInternals.h" #include "LinearMath/btQuickprof.h" - +static const int kMaxConjugateGradientIterations = 200; btDeformableBodySolver::btDeformableBodySolver() : m_numNodes(0) -, m_cg(200) +, m_cg(kMaxConjugateGradientIterations) , m_maxNewtonIterations(5) , m_newtonTolerance(1e-4) -, m_lineSearch(true) +, m_lineSearch(false) { m_objective = new btDeformableBackwardEulerObjective(m_softBodies, m_backupVelocity); } @@ -101,6 +101,7 @@ void btDeformableBodySolver::solveDeformableConstraints(btScalar solverdt) m_residual[j].setZero(); } } + updateVelocity(); } } @@ -298,9 +299,14 @@ void btDeformableBodySolver::setupDeformableSolve(bool implicit) { if (implicit) { + if ((psb->m_nodes[j].m_v - m_backupVelocity[counter]).norm() < SIMD_EPSILON) + m_dv[counter] = psb->m_nodes[j].m_v - m_backupVelocity[counter]; + else + m_dv[counter] = psb->m_nodes[j].m_v - psb->m_nodes[j].m_vn; m_backupVelocity[counter] = psb->m_nodes[j].m_vn; } - m_dv[counter] = psb->m_nodes[j].m_v - m_backupVelocity[counter]; + else + m_dv[counter] = psb->m_nodes[j].m_v - m_backupVelocity[counter]; psb->m_nodes[j].m_v = m_backupVelocity[counter]; ++counter; }