16#ifndef BT_PRECONDITIONER_H
17#define BT_PRECONDITIONER_H
34 for (
int i = 0; i <
b.size(); ++i)
51 : m_softBodies(softBodies)
60 for (
int i = 0; i < m_softBodies.
size(); ++i)
73 for (
int i = 0; i < m_inv_mass.
size(); ++i)
75 b[i] = x[i] * m_inv_mass[i];
77 for (
int i = m_inv_mass.
size(); i <
b.size(); ++i)
91 const bool& m_implicit;
95 : m_softBodies(softBodies), m_projections(projections), m_lf(lf), m_dt(dt), m_implicit(implicit)
104 for (
int i = 0; i < m_softBodies.
size(); ++i)
109 m_inv_A.
resize(num_nodes);
112 for (
int i = 0; i < m_inv_A.
size(); ++i)
115 for (
int d = 0; d < 3; ++d)
117 m_inv_A[i][d] = (m_inv_A[i][d] == 0) ? 0.0 : 1.0 / m_inv_A[i][d];
123 for (
int i = 0; i < m_inv_S.
size(); ++i)
126 for (
int d = 0; d < 3; ++d)
128 m_inv_S[i][d] = (m_inv_S[i][d] == 0) ? 0.0 : 1.0 / m_inv_S[i][d];
136 for (
int i = 0; i < m_softBodies.
size(); ++i)
142 diagA[counter] = (node.m_im == 0) ?
btVector3(0, 0, 0) :
btVector3(1.0 / node.m_im, 1.0 / node.m_im, 1.0 / node.m_im);
148 printf(
"implicit not implemented\n");
151 for (
int i = 0; i < m_lf.
size(); ++i)
154 m_lf[i]->buildDampingForceDifferentialDiagonal(-m_dt, diagA);
164 btVector3& t = diagS[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)
185 b[i] = x[i] * m_inv_A[i];
187 int offset = m_inv_A.
size();
188 for (
int i = 0; i < m_inv_S.
size(); ++i)
190 b[i + offset] = x[i + offset] * m_inv_S[i];
197 int offset = m_inv_A.
size();
199 for (
int i = 0; i < m_inv_A.
size(); ++i)
201 b[i] = x[i] * m_inv_A[i];
204 for (
int i = 0; i < m_inv_S.
size(); ++i)
206 b[i + offset].setZero();
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)
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)
272 for (
int i = 0; i < m_inv_A.
size(); ++i)
274 b[i] += t[i] * m_inv_A[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...
btVector3
btVector3 can be used to represent 3D points and vectors. It has an un-used w component to suit 16-by...
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
virtual void reinitialize(bool nodeUpdated)
void buildDiagonalS(const TVStack &inv_A, TVStack &diagS)
virtual void operator()(const TVStack &x, TVStack &b)
virtual void reinitialize(bool nodeUpdated)
MassPreconditioner(const btAlignedObjectArray< btSoftBody * > &softBodies)
virtual void operator()(const TVStack &x, TVStack &b)
virtual void reinitialize(bool nodeUpdated)=0
btAlignedObjectArray< btVector3 > TVStack
virtual ~Preconditioner()
virtual void operator()(const TVStack &x, TVStack &b)=0
SIMD_FORCE_INLINE void clear()
clear the array, deallocated memory. Generally it is better to use array.resize(0),...
SIMD_FORCE_INLINE int size() const
return the number of elements in the array
SIMD_FORCE_INLINE void resize(int newsize, const T &fillData=T())
SIMD_FORCE_INLINE void push_back(const T &_Val)
local_group_size(16, 16) .push_constant(Type b