00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __itkFEMLinearSystemWrapperVNL_h
00019 #define __itkFEMLinearSystemWrapperVNL_h
00020 #include "itkFEMLinearSystemWrapper.h"
00021 #include "vnl/vnl_sparse_matrix.h"
00022 #include "vnl/vnl_vector.h"
00023 #include <vnl/vnl_sparse_matrix_linear_system.h>
00024 #include <vxl/vnl/algo/vnl_lsqr.h>
00025 #include <vector>
00026
00027
00028 namespace itk {
00029 namespace fem {
00030
00031
00038 class LinearSystemWrapperVNL : public LinearSystemWrapper
00039 {
00040 public:
00041
00042
00043 typedef LinearSystemWrapper::Float Float;
00044
00045
00046 typedef LinearSystemWrapper SuperClass;
00047
00048
00049 typedef vnl_sparse_matrix<Float> MatrixRepresentation;
00050
00051
00052 typedef std::vector< MatrixRepresentation* > MatrixHolder;
00053
00054
00055 LinearSystemWrapperVNL() : LinearSystemWrapper(), m_Matrices(0), m_Vectors(0), m_Solutions(0) {}
00056 virtual ~LinearSystemWrapperVNL();
00057
00058
00059 virtual void InitializeMatrix(unsigned int matrixIndex);
00060 virtual bool IsMatrixInitialized(unsigned int matrixIndex);
00061 virtual void DestroyMatrix(unsigned int matrixIndex);
00062 virtual void InitializeVector(unsigned int vectorIndex);
00063 virtual bool IsVectorInitialized(unsigned int vectorIndex);
00064 virtual void DestroyVector(unsigned int vectorIndex);
00065 virtual void InitializeSolution(unsigned int solutionIndex);
00066 virtual bool IsSolutionInitialized(unsigned int solutionIndex);
00067 virtual void DestroySolution(unsigned int solutionIndex);
00068 virtual void SetMaximumNonZeroValuesInMatrix(unsigned int, unsigned int) {}
00069
00070
00071
00072 virtual Float GetMatrixValue(unsigned int i, unsigned int j, unsigned int matrixIndex) const { return (*((*m_Matrices)[matrixIndex]))(i,j); }
00073 virtual void SetMatrixValue(unsigned int i, unsigned int j, Float value, unsigned int matrixIndex) { (*((*m_Matrices)[matrixIndex]))(i,j) = value; }
00074 virtual void AddMatrixValue(unsigned int i, unsigned int j, Float value, unsigned int matrixIndex) { (*((*m_Matrices)[matrixIndex]))(i,j) += value; }
00075 virtual Float GetVectorValue(unsigned int i, unsigned int vectorIndex) const { return (* ( (*m_Vectors)[vectorIndex] ) )[i]; }
00076 virtual void SetVectorValue(unsigned int i, Float value, unsigned int vectorIndex) { (*((*m_Vectors)[vectorIndex]))(i) = value; }
00077 virtual void AddVectorValue(unsigned int i, Float value, unsigned int vectorIndex) { (*((*m_Vectors)[vectorIndex]))(i) += value; }
00078 virtual Float GetSolutionValue(unsigned int i, unsigned int solutionIndex) const;
00079 virtual void SetSolutionValue(unsigned int i, Float value, unsigned int solutionIndex) { (*((*m_Solutions)[solutionIndex]))(i) = value; }
00080 virtual void AddSolutionValue(unsigned int i, Float value, unsigned int solutionIndex) { (*((*m_Solutions)[solutionIndex]))(i) += value; }
00081 virtual void Solve(void);
00082
00083
00084 virtual void ScaleMatrix(Float scale, unsigned int matrixIndex);
00085 virtual void SwapMatrices(unsigned int matrixIndex1, unsigned int matrixIndex2);
00086 virtual void SwapVectors(unsigned int vectorIndex1, unsigned int vectorIndex2);
00087 virtual void SwapSolutions(unsigned int solutionIndex1, unsigned int solutionIndex2);
00088 virtual void CopySolution2Vector(unsigned solutionIndex, unsigned int vectorIndex);
00089 virtual void CopyVector2Solution(unsigned int vectorIndex, unsigned int solutionIndex);
00090 virtual void MultiplyMatrixMatrix(unsigned int resultMatrixIndex, unsigned int leftMatrixIndex, unsigned int rightMatrixIndex);
00091 virtual void MultiplyMatrixVector(unsigned int resultVectorIndex, unsigned int matrixIndex, unsigned int vectorIndex);
00092
00093 private:
00094
00096
00097 MatrixHolder *m_Matrices;
00098
00100 std::vector< vnl_vector<Float>* > *m_Vectors;
00101
00103 std::vector< vnl_vector<Float>* > *m_Solutions;
00104
00105 };
00106
00107 }}
00108
00109 #endif // #ifndef __itkFEMLinearSystemWrapperVNL_h
00110
00111