So-Bogus
A c++ sparse block matrix library aimed at Second Order cone problems
|
Classes | |
struct | Options |
Public Types | |
enum | Algorithm { GaussSeidel = 0, ProjectedGradient = 1, MatrixFreeGaussSeidel, ADMM, DualAMA } |
Public Member Functions | |
void | fromPrimal (unsigned int NObj, const unsigned int *ndof, const double *const *MassMat, const double *f_in, unsigned int n_in, const double *mu_in, const double *E_in, const double *w_in, const int *const ObjA, const int *const ObjB, const double *const HA[], const double *const HB[]) |
Allocates and sets up the primal friction problem. More... | |
double | solve (double *r, double *v, bool staticProblem, double problemRegularization, const Options &options) |
Solves the friction problem. More... | |
double | solve (double *r, double *v, int maxThreads=0, double tol=0., unsigned maxIters=0, bool staticProblem=false, double regularization=0., bool useInfinityNorm=false, bool useProjectedGradient=false, unsigned cadouxIters=0) |
Solves the friction problem (old interface) More... | |
void | computeDual (double regularization) |
Computes the dual from the primal. | |
void | reset () |
Cleams up the problem, then allocates a new PrimalFrictionProblem and make m_primal point to it. | |
unsigned | nDegreesOfFreedom () const |
unsigned | nContacts () const |
void | setOutStream (std::ostream *out) |
Sets the standard output stream ( out can be NULL to remove all output ) | |
Signal< unsigned, double, double > & | callback () |
Signal< interationNumber, error, elapsedTime > that will be triggered every few iterations. | |
bool | dumpToFile (const char *fileName, const double *r0=(static_cast< const double * >(0))) const |
Dumps the current primal() to fileName . More... | |
bool | fromFile (const char *fileName, double *&r0) |
Loads the primal from a previously saved problem file. More... | |
void | ackCurrentResidual (unsigned GSIter, double err) |
const PrimalFrictionProblem< 3u > & | primal () const |
const DualFrictionProblem< 3u > & | dual () const |
PrimalFrictionProblem< 3u > & | primal () |
DualFrictionProblem< 3u > & | dual () |
double * | f () |
double * | w () |
double * | mu () |
double | lastSolveTime () const |
Time spent in last solver call. In seconds. | |
Protected Member Functions | |
void | destroy () |
Protected Attributes | |
PrimalFrictionProblem< 3u > * | m_primal |
DualFrictionProblem< 3u > * | m_dual |
double | m_lastSolveTime |
Signal< unsigned, double, double > | m_callback |
Timer | m_timer |
bool bogus::MecheFrictionProblem::dumpToFile | ( | const char * | fileName, |
const double * | r0 = (static_cast< const double *>(0)) |
||
) | const |
Dumps the current primal() to fileName
.
r0 | The initial guess that shouls be saved with the problem, or NULL |
bool bogus::MecheFrictionProblem::fromFile | ( | const char * | fileName, |
double *& | r0 | ||
) |
Loads the primal from a previously saved problem file.
r0 | Will be set to ploint to a newly allocated array containing the initial guess, if such one was saved with the problem. Will have to be manually freed by the caller using the delete[] operator. |
void bogus::MecheFrictionProblem::fromPrimal | ( | unsigned int | NObj, |
const unsigned int * | ndof, | ||
const double *const * | MassMat, | ||
const double * | f_in, | ||
unsigned int | n_in, | ||
const double * | mu_in, | ||
const double * | E_in, | ||
const double * | w_in, | ||
const int *const | ObjA, | ||
const int *const | ObjB, | ||
const double *const | HA[], | ||
const double *const | HB[] | ||
) |
Allocates and sets up the primal friction problem.
NObj | number of subsystems |
ndof | array of size NObj, the number of degree of freedom of each subsystem |
MassMat | array of pointers to the mass matrix of each subsystem |
f_in | the constant term in |
n_in | number of contact points |
mu_in | array of size n giving the friction coeffs |
E_in | array of size giving the n normals followed by the n tangent vectors (and by again n tangent vectors if d is 3). Said otherwise, E is a matrix, stored column-major, formed by n blocks of size with each block being an orthogonal matrix (the transition matrix from the world space coordinates to the local coordinates |
w_in | array of size nd, the constant term in |
ObjA | array of size n, the first object involved in the i-th contact (must be an internal object) (counted from 0) |
ObjB | array of size n, the second object involved in the i-th contact (-1 for an external object) (counted from 0) |
HA | array of size n, containing pointers to a dense, colum-major matrix of size d*ndof[ObjA[i]] corresponding to the H-matrix of ObjA[i] |
HB | array of size n, containing pointers to a dense, colum-major matrix of size d*ndof[ObjA[i]] corresponding to the H-matrix of ObjB[i] (NULL for an external object) |
double bogus::MecheFrictionProblem::solve | ( | double * | r, |
double * | v, | ||
bool | staticProblem, | ||
double | problemRegularization, | ||
const Options & | options | ||
) |
Solves the friction problem.
r | length nd : initialization for r (in world space coordinates) + used to return computed r |
v | length m: to return computed v ( or NULL if not needed ) |
staticProblem | If true, do not use DeSaxce change of variable |
problemRegularization | Amount to add on the diagonal of the Delassus operator |
options | Solver options |
double bogus::MecheFrictionProblem::solve | ( | double * | r, |
double * | v, | ||
int | maxThreads = 0 , |
||
double | tol = 0. , |
||
unsigned | maxIters = 0 , |
||
bool | staticProblem = false , |
||
double | regularization = 0. , |
||
bool | useInfinityNorm = false , |
||
bool | useProjectedGradient = false , |
||
unsigned | cadouxIters = 0 |
||
) |
Solves the friction problem (old interface)
r | length nd : initialization for r (in world space coordinates) + used to return computed r |
v | length m: to return computed v ( or NULL if not needed ) |
maxThreads | Maximum number of threads that the GS will use. If 0, use OpenMP default. If > 1, enable coloring to ensure deterministicity |
tol | Gauss-Seidel tolerance. 0. means GS's default |
maxIters | Max number of iterations. 0 means GS's default |
staticProblem | If true, do not use DeSaxce change of variable |
regularization | Coefficient to add to the diagonal of static problems / GS regularization coefficient for friction problems |
useInfinityNorm | Whether to use the infinity norm to evaluate the residual of the friction problem, |
useProjectedGradient | 0 = GS, 1 = PG, 2 = ADMM, 3 = DualAMA. |
cadouxIters | If staticProblem is false and cadouxIters is greater than zero, use the Cadoux algorithm to solve the friction problem. |