MlcpGaussSeidelSolver.h
Go to the documentation of this file.
1 // This file is a part of the OpenSurgSim project.
2 // Copyright 2013, SimQuest Solutions Inc.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 
16 #ifndef SURGSIM_MATH_MLCPGAUSSSEIDELSOLVER_H
17 #define SURGSIM_MATH_MLCPGAUSSSEIDELSOLVER_H
18 
19 #include <memory.h>
20 
21 #include "SurgSim/Math/Matrix.h"
25 #include "SurgSim/Math/Vector.h"
26 
27 namespace SurgSim
28 {
29 namespace Framework
30 {
31 class Logger;
32 }
33 
34 namespace Math
35 {
36 
54 {
55 public:
58 
63  MlcpGaussSeidelSolver(double epsilonConvergence, double contactTolerance, size_t maxIterations);
64 
66  virtual ~MlcpGaussSeidelSolver();
67 
72  bool solve(const MlcpProblem& problem, MlcpSolution* solution);
73 
75  double getEpsilonConvergence() const;
76 
79  void setEpsilonConvergence(double precision);
80 
82  double getContactTolerance() const;
83 
86  void setContactTolerance(double tolerance);
87 
89  size_t getMaxIterations() const;
90 
93  void setMaxIterations(size_t maxIterations);
94 
95 private:
96  void computeEnforcementSystem(size_t problemSize, const MlcpProblem::Matrix& A,
97  const MlcpProblem::Vector& b,
98  const MlcpSolution::Vector& initialGuessAndSolution,
99  const std::vector<MlcpConstraintType>& constraintsType,
100  size_t constraintID, size_t matrixEntryForConstraintID);
101 
102  void calculateConvergenceCriteria(size_t problemSize, const MlcpProblem::Matrix& A,
103  const MlcpProblem::Vector& b,
104  const MlcpSolution::Vector& initialGuessAndSolution,
105  const std::vector<MlcpConstraintType>& constraintsType,
106  double constraintConvergenceCriteria[MLCP_NUM_CONSTRAINT_TYPES],
107  double* convergenceCriteria,
108  bool* validSignorini);
109 
110  void doOneIteration(size_t problemSize, const MlcpProblem::Matrix& A,
111  const MlcpProblem::Vector& b,
112  MlcpSolution::Vector* initialGuessAndSolution,
113  const MlcpProblem::Vector& frictionCoefs,
114  const std::vector<MlcpConstraintType>& constraintsType,
115  double constraintConvergenceCriteria[MLCP_NUM_CONSTRAINT_TYPES], double* convergenceCriteria,
116  bool* validSignorini);
117 
118  void printViolationsAndConvergence(size_t problemSize, const MlcpProblem::Matrix& A,
119  const MlcpProblem::Vector& b,
120  const MlcpSolution::Vector& initialGuessAndSolution,
121  const std::vector<MlcpConstraintType>& constraintsType,
122  double convergenceCriteria,
123  bool validSignorini, size_t iterations);
124 
127 
130 
133 
136 
139 
142 
144  std::shared_ptr<SurgSim::Framework::Logger> m_logger;
145 };
146 
147 }; // namespace Math
148 }; // namespace SurgSim
149 
150 #endif // SURGSIM_MATH_MLCPGAUSSSEIDELSOLVER_H
MlcpSolver.h
SurgSim::Math::MlcpGaussSeidelSolver::m_lhsEnforcedLocalSystem
Matrix m_lhsEnforcedLocalSystem
The left-hand side matrix.
Definition: MlcpGaussSeidelSolver.h:138
Vector.h
SurgSim::Math::MlcpProblem::Matrix
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > Matrix
Definition: MlcpProblem.h:62
SurgSim::Math::MlcpGaussSeidelSolver::solve
bool solve(const MlcpProblem &problem, MlcpSolution *solution)
Resolution of a given MLCP (Gauss Seidel iterative solver)
Definition: MlcpGaussSeidelSolver.cpp:83
SurgSim::Math::MlcpGaussSeidelSolver::getEpsilonConvergence
double getEpsilonConvergence() const
Definition: MlcpGaussSeidelSolver.cpp:53
SurgSim::Math::MlcpGaussSeidelSolver::calculateConvergenceCriteria
void calculateConvergenceCriteria(size_t problemSize, const MlcpProblem::Matrix &A, const MlcpProblem::Vector &b, const MlcpSolution::Vector &initialGuessAndSolution, const std::vector< MlcpConstraintType > &constraintsType, double constraintConvergenceCriteria[MLCP_NUM_CONSTRAINT_TYPES], double *convergenceCriteria, bool *validSignorini)
Definition: MlcpGaussSeidelSolver.cpp:152
SurgSim::Math::MlcpGaussSeidelSolver::computeEnforcementSystem
void computeEnforcementSystem(size_t problemSize, const MlcpProblem::Matrix &A, const MlcpProblem::Vector &b, const MlcpSolution::Vector &initialGuessAndSolution, const std::vector< MlcpConstraintType > &constraintsType, size_t constraintID, size_t matrixEntryForConstraintID)
Definition: MlcpGaussSeidelSolver.cpp:284
Matrix.h
MlcpProblem.h
SurgSim::Math::MlcpSolver
This class provides a solver interface for mixed linear complementarity problems.
Definition: MlcpSolver.h:30
SurgSim::Math::MlcpGaussSeidelSolver::m_rhsEnforcedLocalSystem
Vector m_rhsEnforcedLocalSystem
The right-hand side vector.
Definition: MlcpGaussSeidelSolver.h:141
SurgSim::Math::MlcpGaussSeidelSolver::MlcpGaussSeidelSolver
MlcpGaussSeidelSolver()
Constructor.
Definition: MlcpGaussSeidelSolver.cpp:30
SurgSim
Definition: CompoundShapeToGraphics.cpp:29
SurgSim::Math::MlcpGaussSeidelSolver::doOneIteration
void doOneIteration(size_t problemSize, const MlcpProblem::Matrix &A, const MlcpProblem::Vector &b, MlcpSolution::Vector *initialGuessAndSolution, const MlcpProblem::Vector &frictionCoefs, const std::vector< MlcpConstraintType > &constraintsType, double constraintConvergenceCriteria[MLCP_NUM_CONSTRAINT_TYPES], double *convergenceCriteria, bool *validSignorini)
Definition: MlcpGaussSeidelSolver.cpp:465
SurgSim::Math::MlcpGaussSeidelSolver::m_numEnforcedAtomicConstraints
size_t m_numEnforcedAtomicConstraints
The number of atomic constraints, aka the system size.
Definition: MlcpGaussSeidelSolver.h:135
SurgSim::Math::MlcpGaussSeidelSolver::setContactTolerance
void setContactTolerance(double tolerance)
Set the contact tolerance.
Definition: MlcpGaussSeidelSolver.cpp:68
SurgSim::Math::MlcpGaussSeidelSolver
A solver for mixed LCP problems using the Gauss-Seidel iterative method.
Definition: MlcpGaussSeidelSolver.h:53
SurgSim::Math::MlcpProblem
A description of an MLCP (mixed linear complementarity problem, or mixed LCP) system to be solved.
Definition: MlcpProblem.h:57
SurgSim::Math::MlcpGaussSeidelSolver::getContactTolerance
double getContactTolerance() const
Definition: MlcpGaussSeidelSolver.cpp:63
SurgSim::Math::MLCP_NUM_CONSTRAINT_TYPES
@ MLCP_NUM_CONSTRAINT_TYPES
Definition: MlcpConstraintType.h:44
SurgSim::Math::MlcpGaussSeidelSolver::m_maxIterations
size_t m_maxIterations
The maximum number of iterations.
Definition: MlcpGaussSeidelSolver.h:132
SurgSim::Math::MlcpProblem::Vector
Eigen::Matrix< double, Eigen::Dynamic, 1 > Vector
Definition: MlcpProblem.h:63
SurgSim::Math::MlcpGaussSeidelSolver::printViolationsAndConvergence
void printViolationsAndConvergence(size_t problemSize, const MlcpProblem::Matrix &A, const MlcpProblem::Vector &b, const MlcpSolution::Vector &initialGuessAndSolution, const std::vector< MlcpConstraintType > &constraintsType, double convergenceCriteria, bool validSignorini, size_t iterations)
Definition: MlcpGaussSeidelSolver.cpp:651
SurgSim::Math::MlcpGaussSeidelSolver::getMaxIterations
size_t getMaxIterations() const
Definition: MlcpGaussSeidelSolver.cpp:73
SurgSim::Math::MlcpGaussSeidelSolver::~MlcpGaussSeidelSolver
virtual ~MlcpGaussSeidelSolver()
Destructor.
Definition: MlcpGaussSeidelSolver.cpp:49
SurgSim::Math::MlcpGaussSeidelSolver::setMaxIterations
void setMaxIterations(size_t maxIterations)
Set the max number of iterations.
Definition: MlcpGaussSeidelSolver.cpp:78
SurgSim::Math::MlcpGaussSeidelSolver::m_contactTolerance
double m_contactTolerance
The contact tolerance.
Definition: MlcpGaussSeidelSolver.h:129
SurgSim::Math::Vector
Eigen::Matrix< double, Eigen::Dynamic, 1 > Vector
A dynamic size column vector.
Definition: Vector.h:68
SurgSim::Math::MlcpGaussSeidelSolver::m_epsilonConvergence
double m_epsilonConvergence
The precision.
Definition: MlcpGaussSeidelSolver.h:126
SurgSim::Math::MlcpGaussSeidelSolver::setEpsilonConvergence
void setEpsilonConvergence(double precision)
Set the precision.
Definition: MlcpGaussSeidelSolver.cpp:58
SurgSim::Math::MlcpSolution::Vector
Eigen::Matrix< double, Eigen::Dynamic, 1 > Vector
Definition: MlcpSolution.h:35
SurgSim::Math::MlcpGaussSeidelSolver::m_logger
std::shared_ptr< SurgSim::Framework::Logger > m_logger
The logger.
Definition: MlcpGaussSeidelSolver.h:144
SurgSim::Math::Matrix
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > Matrix
A dynamic size matrix.
Definition: Matrix.h:65
MlcpSolution.h
SurgSim::Math::MlcpSolution
The description of a solution to a mixed linear complementarity problem.
Definition: MlcpSolution.h:33