Skip to content

Commit ebffdd6

Browse files
committed
Add parameters
1 parent 66792ae commit ebffdd6

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

Sofa/Component/Constraint/Lagrangian/Solver/src/sofa/component/constraint/lagrangian/solver/ImprovedJacobiConstraintSolver.cpp

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,17 @@
3030
namespace sofa::component::constraint::lagrangian::solver
3131
{
3232

33+
ImprovedJacobiConstraintSolver::ImprovedJacobiConstraintSolver()
34+
: BuiltConstraintSolver()
35+
, d_useSpectralCorrection(initData(&d_useSpectralCorrection,false,"useSpectralCorrection","If set to true, the solution found after each iteration will be multiplied by spectralCorrectionFactor*2/spr(W), with spr() denoting the spectral radius."))
36+
, d_spectralCorrectionFactor(initData(&d_spectralCorrectionFactor,1.0,"spectralCorrectionFactor","Factor used to modulate the spectral correction"))
37+
, d_useConjugateResidue(initData(&d_useConjugateResidue,false,"useConjugateResidue","If set to true, the solution found after each iteration will be corrected along the solution direction using `\\lambda^{i+1} -= beta^{i} * (\\lambda^{i} - \\lambda^{i-1})` with beta following the formula beta^{i} = min(1, (i/maxIterations)^{conjugateResidueSpeedFactor}) "))
38+
, d_conjugateResidueSpeedFactor(initData(&d_conjugateResidueSpeedFactor,10.0,"conjugateResidueSpeedFactor","FActor used to modulate the speed in which beta used in the conjugate residue part reaches 1.0. The higher the value, the slower the reach. "))
39+
{
40+
41+
}
42+
43+
3344
void ImprovedJacobiConstraintSolver::doSolve( SReal timeout)
3445
{
3546
SCOPED_TIMER_VARNAME(gaussSeidelTimer, "ImprovedJacobiConstraintSolver");
@@ -90,21 +101,26 @@ void ImprovedJacobiConstraintSolver::doSolve( SReal timeout)
90101

91102
int iterCount = 0;
92103

93-
Eigen::Map<Eigen::MatrixX<SReal>> EigenW(w[0],dimension, dimension) ;
94-
SReal eigenRadius = 0;
95-
for(auto s : EigenW.eigenvalues())
104+
SReal rho = 1.0;
105+
106+
if (d_useSpectralCorrection.getValue())
96107
{
97-
eigenRadius=std::max(eigenRadius,norm(s));
108+
Eigen::Map<Eigen::MatrixX<SReal>> EigenW(w[0],dimension, dimension) ;
109+
SReal eigenRadius = 0;
110+
for(auto s : EigenW.eigenvalues())
111+
{
112+
eigenRadius=std::max(eigenRadius,norm(s));
113+
}
114+
rho = d_spectralCorrectionFactor.getValue()*std::min(1.0, 0.9 * 2/eigenRadius);
98115
}
99-
const SReal rho = std::min(1.0, 0.9 * 2/eigenRadius);
100116

101117
for(int i=0; i<current_cp->maxIterations; i++)
102118
{
103119
iterCount ++;
104120
bool constraintsAreVerified = true;
105121

106122
error=0.0;
107-
SReal beta = std::min(1.0, pow( ((float)i)/current_cp->maxIterations,0.6));
123+
SReal beta = d_useConjugateResidue.getValue() * std::min(1.0, pow( ((float)i)/current_cp->maxIterations,d_conjugateResidueSpeedFactor.getValue()));
108124

109125
for(int j=0; j<dimension; ) // increment of j realized at the end of the loop
110126
{

Sofa/Component/Constraint/Lagrangian/Solver/src/sofa/component/constraint/lagrangian/solver/ImprovedJacobiConstraintSolver.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ class SOFA_COMPONENT_CONSTRAINT_LAGRANGIAN_SOLVER_API ImprovedJacobiConstraintSo
3131
public:
3232
SOFA_CLASS(ImprovedJacobiConstraintSolver, BuiltConstraintSolver);
3333

34+
Data<bool> d_useSpectralCorrection;
35+
Data<SReal> d_spectralCorrectionFactor;
36+
Data<bool> d_useConjugateResidue;
37+
Data<SReal> d_conjugateResidueSpeedFactor;
38+
39+
ImprovedJacobiConstraintSolver();
3440

3541
/**
3642
* Based on paper

0 commit comments

Comments
 (0)