00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __itkFEMLinearSystemWrapper_h
00019 #define __itkFEMLinearSystemWrapper_h
00020
00021 #include "itkMacro.h"
00022 #include "itkFEMSolution.h"
00023 #include "itkFEMException.h"
00024
00025 #include <vector>
00026 #include <typeinfo>
00027 #include <string>
00028
00029 namespace itk {
00030 namespace fem {
00031
00032
00051 class LinearSystemWrapper : public Solution
00052 {
00053 public:
00054 typedef LinearSystemWrapper Self;
00055 typedef Solution Superclass;
00056 typedef Self* Pointer;
00057 typedef const Self* ConstPointer;
00058
00059 typedef std::vector<unsigned int> ColumnArray;
00060
00065 LinearSystemWrapper()
00066 : m_Order(0), m_NumberOfMatrices(1), m_NumberOfVectors(1), m_NumberOfSolutions(1) {}
00067
00069
00074 virtual ~LinearSystemWrapper() {};
00075
00080 virtual void Clean( void );
00081
00087 void SetSystemOrder(unsigned int N) { m_Order = N; }
00088
00092 unsigned int GetSystemOrder() const { return m_Order; }
00093
00098 void SetNumberOfMatrices(unsigned int nMatrices) { m_NumberOfMatrices = nMatrices; }
00099
00107
00108
00112 unsigned int GetNumberOfMatrices() { return m_NumberOfMatrices; }
00113
00118 void SetNumberOfVectors(unsigned int nVectors) { m_NumberOfVectors = nVectors; }
00119
00123 unsigned int GetNumberOfVectors() { return m_NumberOfVectors; }
00124
00129 void SetNumberOfSolutions(unsigned int nSolutions) { m_NumberOfSolutions = nSolutions; }
00130
00134 unsigned int GetNumberOfSolutions() { return m_NumberOfSolutions; }
00135
00143 virtual void InitializeMatrix(unsigned int matrixIndex = 0) = 0;
00144
00145
00150 virtual bool IsMatrixInitialized(unsigned int matrixIndex = 0) = 0;
00151
00156 virtual void DestroyMatrix(unsigned int matrixIndex = 0) = 0;
00157
00164 virtual void InitializeVector(unsigned int vectorIndex = 0) = 0;
00165
00166
00171 virtual bool IsVectorInitialized(unsigned int vectorIndex = 0) = 0;
00172
00177 virtual void DestroyVector(unsigned int vectorIndex = 0) = 0;
00178
00185 virtual void InitializeSolution(unsigned int solutionIndex = 0) = 0;
00186
00191 virtual bool IsSolutionInitialized(unsigned int solutionIndex = 0) = 0;
00192
00196 virtual void DestroySolution(unsigned int solutionIndex = 0) = 0;
00197
00204 virtual Float GetMatrixValue(unsigned int i, unsigned int j, unsigned int matrixIndex = 0) const = 0;
00205
00213 virtual void SetMatrixValue(unsigned int i, unsigned int j, Float value, unsigned int matrixIndex = 0) = 0;
00214
00222 virtual void AddMatrixValue(unsigned int i, unsigned int j, Float value, unsigned int matrixIndex = 0) = 0;
00223
00236 virtual void GetColumnsOfNonZeroMatrixElementsInRow( unsigned int row, ColumnArray& cols, unsigned int matrixIndex = 0 );
00237
00243 virtual Float GetVectorValue(unsigned int i, unsigned int vectorIndex = 0) const = 0;
00244
00251 virtual void SetVectorValue(unsigned int i, Float value, unsigned int vectorIndex = 0) = 0;
00252
00259 virtual void AddVectorValue(unsigned int i, Float value, unsigned int vectorIndex = 0) = 0;
00260
00268 virtual void SetSolutionValue(unsigned int i, Float value, unsigned int solutionIndex = 0) = 0;
00269
00277 virtual void AddSolutionValue(unsigned int i, Float value, unsigned int solutionIndex = 0) = 0;
00278
00286 virtual void Solve(void) = 0;
00287
00293 virtual void SwapMatrices(unsigned int matrixIndex1, unsigned int matrixIndex2) = 0;
00294
00302 virtual void CopyMatrix(unsigned int matrixIndex1, unsigned int matrixIndex2);
00303
00309 virtual void SwapVectors(unsigned int vectorIndex1, unsigned int vectorIndex2) = 0;
00310
00316 virtual void SwapSolutions(unsigned int solutionIndex1, unsigned int solutionIndex2) = 0;
00317
00318
00324 virtual void ScaleMatrix(Float scale, unsigned int matrixIndex = 0);
00325
00326
00332 void ScaleVector(Float scale, unsigned int vectorIndex = 0);
00333
00334
00340 void ScaleSolution(Float scale, unsigned int solutionIndex = 0);
00341
00348 virtual void MultiplyMatrixMatrix(unsigned int resultMatrixIndex, unsigned int leftMatrixIndex, unsigned int rightMatrixIndex) = 0;
00349
00356 virtual void AddMatrixMatrix(unsigned int matrixIndex1, unsigned int matrixIndex2);
00357
00364 virtual void AddVectorVector(unsigned int vectorIndex1, unsigned int vectorIndex2);
00365
00372 virtual void MultiplyMatrixVector(unsigned int resultVectorIndex, unsigned int matrixIndex, unsigned int vectorIndex);
00373
00379 virtual void CopySolution2Vector(unsigned int solutionIndex, unsigned int vectorIndex) = 0;
00380
00386 virtual void CopyVector2Solution(unsigned int vectorIndex, unsigned int solutionIndex) = 0;
00387
00393 virtual void CopyVector(unsigned int vectorSource, unsigned int vectorDestination);
00394
00401 virtual void OptimizeMatrixStorage(unsigned int matrixIndex, unsigned int tempMatrixIndex);
00402
00408 virtual void ReverseCuthillMckeeOrdering(ColumnArray& newNumbering, unsigned int matrixIndex = 0);
00409
00410 protected:
00411
00413 unsigned int m_Order;
00414
00418 unsigned int m_NumberOfMatrices;
00419
00423 unsigned int m_NumberOfVectors;
00424
00428 unsigned int m_NumberOfSolutions;
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445 private:
00446
00450 void CuthillMckeeOrdering(ColumnArray& newNumbering, int startingRow, unsigned int matrixIndex = 0);
00451
00452 void FollowConnectionsCuthillMckeeOrdering(unsigned int rowNumber, ColumnArray& rowDegree, ColumnArray& newNumbering, unsigned int nextRowNumber, unsigned int matrixIndex = 0);
00453
00455 LinearSystemWrapper(const LinearSystemWrapper&);
00456
00458 const LinearSystemWrapper& operator= (const LinearSystemWrapper&);
00459
00460 };
00461
00462 class FEMExceptionLinearSystem : public FEMException
00463 {
00464 public:
00470 FEMExceptionLinearSystem(const char *file, unsigned int lineNumber, std::string location, std::string moreDescription);
00471
00473 virtual ~FEMExceptionLinearSystem() throw() {}
00474
00476 itkTypeMacro(FEMExceptionLinearSystem,FEMException);
00477
00478 };
00479
00480 class FEMExceptionLinearSystemBounds : public FEMException
00481 {
00482 public:
00488 FEMExceptionLinearSystemBounds(const char *file, unsigned int lineNumber, std::string location, std::string moreDescription, unsigned int index1);
00489
00494 FEMExceptionLinearSystemBounds(const char *file, unsigned int lineNumber, std::string location, std::string moreDescription, unsigned int index1, unsigned int index2);
00495
00497 virtual ~FEMExceptionLinearSystemBounds() throw() {}
00498
00500 itkTypeMacro(FEMExceptionLinearSystem,FEMException);
00501
00502 };
00503
00504 }}
00505
00506 #endif // #ifndef __itkFEMLinearSystemWrapper_h
00507