![]() |
TAPs 0.7.7.3
|
00001 /****************************************************************************** 00002 TAPsSparseSymmetricMatrix_Matrix3x3.hpp 00003 ******************************************************************************/ 00007 /****************************************************************************** 00008 SUKITTI PUNAK (12/30/2009) 00009 UPDATE (04/10/2010) 00010 ******************************************************************************/ 00011 #ifndef TAPs_SPARSE_SYMMETRIC_MATRIX_MATRIX3X3_HPP 00012 #define TAPs_SPARSE_SYMMETRIC_MATRIX_MATRIX3X3_HPP 00013 00014 #include "TAPsSparseVector_Matrix3x3.hpp" 00015 00016 BEGIN_NAMESPACE_TAPs 00017 //============================================================================= 00018 template <typename T> 00019 class SparseSymmetricMatrix_Matrix3x3 { 00020 //============================================================================= 00021 public: 00022 // Member Functions ------------------------------------------------------- 00024 friend std::ostream & operator<< ( std::ostream &output, SparseSymmetricMatrix_Matrix3x3<T> const &obj ) 00025 { 00026 output << obj.StrInfo(); 00027 return output; 00028 } 00029 //------------------------------------------------------------------------- 00031 SparseSymmetricMatrix_Matrix3x3 ( unsigned int numOfRows = 0 ); 00033 SparseSymmetricMatrix_Matrix3x3 ( SparseSymmetricMatrix_Matrix3x3<T> const &orig ); 00035 virtual ~SparseSymmetricMatrix_Matrix3x3 (); 00036 //------------------------------------------------------------------------- 00038 virtual std::string StrInfo () const; 00039 //------------------------------------------------------------------------- 00040 // Operators 00041 00043 inline SparseSymmetricMatrix_Matrix3x3<T> & operator= ( SparseSymmetricMatrix_Matrix3x3<T> const &orig ); 00044 00045 //------------------------------------------------------------------------- 00046 // Operations 00047 00049 inline void MulWith ( 00050 std::vector< Vector3<T> > const &I, 00051 std::vector< Vector3<T> > &O 00052 ) const; 00053 00057 inline void MulWith_wSkippedElements ( 00058 std::vector< Vector3<T> > const &I, 00059 std::vector< Vector3<T> > &O, 00060 std::vector< bool > const &Skip 00061 ) const; 00062 00065 inline void ChangeNumOfRows ( unsigned int numOfRows ); 00066 00070 inline void DiagonalizeRowCol ( unsigned int ii, T diagonalValue = 1 ); 00071 00076 inline void DiagonalizeRowsCols ( 00077 std::vector< bool > const & ii, 00078 T diagonalValue = 1 00079 ); 00080 00082 inline void DiagonalizeRowsCols ( 00083 std::vector< unsigned int > const & ii, 00084 T diagonalValue = 1 00085 ); 00086 00088 inline unsigned int GetNumOfRows () const { return m_Rows.size(); } 00089 00091 void SetDirectAccessors (); 00092 00095 inline SparseVector_Matrix3x3<T> * const DirectAccess ( unsigned int row ); 00096 00105 static void MPCGSolver ( 00106 SparseSymmetricMatrix_Matrix3x3<T> const &A, 00107 std::vector< Vector3<T> > const &x, 00108 std::vector< Vector3<T> > const &b, 00109 std::vector< Vector3<T> > &x_out, 00110 std::vector< Vector3<T> > const &ft, 00111 std::vector< Vector3<T> > const &P, 00112 int iterationLimit = 100, 00113 T errorThreshold = 1E-10 00114 ); 00115 00124 static void MPCGSolverSpecificForFEM ( 00125 std::vector< bool > const &fixedNodes, 00126 SparseSymmetricMatrix_Matrix3x3<T> const &A, 00127 std::vector< Vector3<T> > const &x, 00128 std::vector< Vector3<T> > const &b, 00129 std::vector< Vector3<T> > &x_out, 00130 std::vector< Vector3<T> > const &ft, 00131 std::vector< Vector3<T> > const &P, 00132 int iterationLimit = 100, 00133 T errorThreshold = 1E-10 00134 ); 00135 //------------------------------------------------------------------------- 00136 00137 // Data Members ----------------------------------------------------------- 00138 //============================================================================= 00139 protected: 00140 // Member Functions ------------------------------------------------------- 00141 00142 // Data Members ----------------------------------------------------------- 00143 std::list< SparseVector_Matrix3x3<T> > m_Rows; 00144 std::vector< SparseVector_Matrix3x3<T>* > m_DirectAccessors; 00145 //============================================================================= 00146 private: 00147 // Member Functions ------------------------------------------------------- 00148 00149 static inline std::string DEBUG_ToStr ( std::vector< Vector3<T> > const &V ) 00150 { 00151 std::stringstream ss; 00152 ss << "Dense Vector of size "<<V.size()<<":\n"; 00153 for ( unsigned int i = 0; i < V.size(); ++i ) { 00154 ss << V[i] << "\n"; 00155 } 00156 return ss.str(); 00157 } 00158 00159 static inline std::string DEBUG_ToStr ( std::vector< Matrix3x3<T> > const &V ) 00160 { 00161 std::stringstream ss; 00162 ss << "Dense Vector of size "<<V.size()<<":\n"; 00163 for ( unsigned int i = 0; i < V.size(); ++i ) { 00164 ss << V[i] << "\n"; 00165 } 00166 return ss.str(); 00167 } 00168 // Data Members ----------------------------------------------------------- 00169 //============================================================================= 00170 00171 #if defined(__gl_h_) || defined(__GL_H__) 00172 public: 00173 //virtual void Draw (); 00174 #endif 00175 00176 //============================================================================= 00177 }; // END CLASS SparseSymmetricMatrix_Matrix3x3 00178 //============================================================================= 00179 END_NAMESPACE_TAPs 00180 //----------------------------------------------------------------------------- 00182 #include "TAPsSparseSymmetricMatrix_Matrix3x3.cpp" 00183 00185 // Include definition if TAPs_USE_EXPORT is not defined 00186 //#if !defined( TAPs_USE_EXPORT ) 00187 // #include "TAPsSparseSymmetricMatrix_Matrix3x3.cpp" 00188 //#endif 00189 //----------------------------------------------------------------------------- 00190 #endif 00191 //34567890123456789012345678901234567890123456789012345678901234567890123456789 00192 //--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----