16#ifndef BT_PRECONDITIONER_H
17#define BT_PRECONDITIONER_H
34 for (
int i = 0; i < b.
size(); ++i)
112 for (
int i = 0; i <
m_inv_A.size(); ++i)
115 for (
int d = 0; d < 3; ++d)
123 for (
int i = 0; i <
m_inv_S.size(); ++i)
126 for (
int d = 0; d < 3; ++d)
148 printf(
"implicit not implemented\n");
151 for (
int i = 0; i <
m_lf.size(); ++i)
154 m_lf[i]->buildDampingForceDifferentialDiagonal(-
m_dt, diagA);
160 for (
int c = 0; c <
m_projections.m_lagrangeMultipliers.size(); ++c)
170 for (
int d = 0; d < 3; ++d)
179#ifndef USE_FULL_PRECONDITIONER
183 for (
int i = 0; i <
m_inv_A.size(); ++i)
188 for (
int i = 0; i <
m_inv_S.size(); ++i)
190 b[i + offset] = x[i + offset] *
m_inv_S[i];
204 for (
int i = 0; i <
m_inv_S.size(); ++i)
206 b[i + offset].setZero();
209 for (
int c = 0; c <
m_projections.m_lagrangeMultipliers.size(); ++c)
211 const LagrangeMultiplier& lm =
m_projections.m_lagrangeMultipliers[c];
222 for (
int i = 0; i <
m_inv_S.size(); ++i)
224 b[i + offset] = b[i + offset] *
m_inv_S[i];
227 for (
int i = 0; i <
m_inv_A.size(); ++i)
232 for (
int c = 0; c <
m_projections.m_lagrangeMultipliers.size(); ++c)
235 const LagrangeMultiplier& lm =
m_projections.m_lagrangeMultipliers[c];
245 for (
int i = 0; i <
m_inv_A.size(); ++i)
247 b[i] = (x[i] - b[i]) *
m_inv_A[i];
252 for (
int i = 0; i <
m_inv_S.size(); ++i)
254 t[i + offset] = x[i + offset] *
m_inv_S[i];
256 for (
int i = 0; i <
m_inv_A.size(); ++i)
260 for (
int c = 0; c <
m_projections.m_lagrangeMultipliers.size(); ++c)
263 const LagrangeMultiplier& lm =
m_projections.m_lagrangeMultipliers[c];
272 for (
int i = 0; i <
m_inv_A.size(); ++i)
277 for (
int i = 0; i <
m_inv_S.size(); ++i)
279 b[i + offset] -= x[i + offset] *
m_inv_S[i];
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
virtual void operator()(const TVStack &x, TVStack &b)
virtual void reinitialize(bool nodeUpdated)
virtual ~DefaultPreconditioner()
KKTPreconditioner(const btAlignedObjectArray< btSoftBody * > &softBodies, const btDeformableContactProjection &projections, const btAlignedObjectArray< btDeformableLagrangianForce * > &lf, const btScalar &dt, const bool &implicit)
void buildDiagonalA(TVStack &diagA) const
const btAlignedObjectArray< btSoftBody * > & m_softBodies
const btDeformableContactProjection & m_projections
virtual void reinitialize(bool nodeUpdated)
void buildDiagonalS(const TVStack &inv_A, TVStack &diagS)
const btAlignedObjectArray< btDeformableLagrangianForce * > & m_lf
virtual void operator()(const TVStack &x, TVStack &b)
const btAlignedObjectArray< btSoftBody * > & m_softBodies
virtual void reinitialize(bool nodeUpdated)
MassPreconditioner(const btAlignedObjectArray< btSoftBody * > &softBodies)
virtual void operator()(const TVStack &x, TVStack &b)
btAlignedObjectArray< btScalar > m_inv_mass
virtual void reinitialize(bool nodeUpdated)=0
btAlignedObjectArray< btVector3 > TVStack
virtual ~Preconditioner()
virtual void operator()(const TVStack &x, TVStack &b)=0
The btAlignedObjectArray template class uses a subset of the stl::vector interface for its methods It...
int size() const
return the number of elements in the array
The btSoftBody is an class to simulate cloth and volumetric soft bodies.
btVector3 can be used to represent 3D points and vectors.