TAPs 0.7.7.3
TAPsSparseSymmetricMatrix_Matrix3x3.cpp
Go to the documentation of this file.
00001 /******************************************************************************
00002 TAPsSparseSymmetricMatrix_Matrix3x3.cpp
00003 ******************************************************************************/
00007 /******************************************************************************
00008 SUKITTI PUNAK   (12/30/2009)
00009 UPDATE          (04/10/2010)
00010 ******************************************************************************/
00011 #include "TAPsSparseSymmetricMatrix_Matrix3x3.hpp"
00012 // Using Inclusion Model (i.e. definitions are included in declarations)
00013 //                       (this name.cpp is included in name.hpp)
00014 // Each friend is defined directly inside its declaration.
00015 
00016 BEGIN_NAMESPACE_TAPs
00017 //=============================================================================
00018 // Constructors
00019 //-----------------------------------------------------------------------------
00020 template <typename T>
00021 SparseSymmetricMatrix_Matrix3x3<T>::SparseSymmetricMatrix_Matrix3x3 ( unsigned int numOfRows )
00022 {
00023     m_Rows.resize( numOfRows );
00024 }
00025 //-----------------------------------------------------------------------------
00026 template <typename T>
00027 SparseSymmetricMatrix_Matrix3x3<T>::SparseSymmetricMatrix_Matrix3x3 ( SparseSymmetricMatrix_Matrix3x3<T> const &orig )
00028 {
00029     //m_Rows = orig.m_Rows;
00030     *this = orig;
00031 }
00032 //-----------------------------------------------------------------------------
00033 template <typename T>
00034 SparseSymmetricMatrix_Matrix3x3<T>::~SparseSymmetricMatrix_Matrix3x3 ()
00035 {}  
00036 //-----------------------------------------------------------------------------
00037 template <typename T>
00038 std::string SparseSymmetricMatrix_Matrix3x3<T>::StrInfo () const
00039 {
00040     std::ostringstream ss;
00041     ss << "SparseSymmetricMatrix_Matrix3x3<" << typeid(T).name() << "> has " << m_Rows.size() << " rows:\n";
00042     std::list< SparseVector_Matrix3x3<T> >::const_iterator it = m_Rows.begin();
00043 
00044     // string of matrix (the symmetry part are shown as zeroes)
00045     it = m_Rows.begin();
00046     Matrix3x3<T> *M = new Matrix3x3<T>[m_Rows.size()];
00047     Matrix3x3<T> const *N;
00048     for ( unsigned int i = 0; i < m_Rows.size(); ++i ) {
00049         for ( unsigned int j = 0; j < m_Rows.size(); ++j ) {
00050             if ( N = it->ReturnMatrix3x3( j ) ) {
00051                 M[j] = *N;
00052             }
00053             else {
00054                 M[j].MakeZero();
00055             }
00056         }
00057         unsigned int j;
00058         for ( unsigned int r = 0; r < 9; r+=3 ) {
00059             ss << "[ ";
00060             for ( j = 0; j < m_Rows.size()-1; ++j ) {
00061                 ss.width(12);
00062                 ss << M[j][0+r] << ", ";
00063                 ss.width(12);
00064                 ss << M[j][1+r] << ", ";
00065                 ss.width(12);
00066                 ss << M[j][2+r] << ", ";
00067             }
00068             ss.width(12);
00069             ss << M[j][0+r] << ", ";
00070             ss.width(12);
00071             ss << M[j][1+r] << ", ";
00072             ss.width(12);
00073             ss << M[j][2+r];
00074             ss << " ]\n";
00075         }
00076         ++it;
00077     }
00078     delete [] M;
00079 
00080     return ss.str();
00081 }
00082 //-----------------------------------------------------------------------------
00083 //=============================================================================
00084 // Assignment Operator
00085 //-----------------------------------------------------------------------------
00086 template <typename T>
00087 inline SparseSymmetricMatrix_Matrix3x3<T> & SparseSymmetricMatrix_Matrix3x3<T>::operator= ( SparseSymmetricMatrix_Matrix3x3<T> const &orig )
00088 {   
00089     m_Rows = orig.m_Rows;
00090     if ( orig.m_DirectAccessors.size() > 0 ) {
00091         this->SetDirectAccessors();
00092     }
00093     return *this;
00094 }
00095 //-----------------------------------------------------------------------------
00096 //=============================================================================
00097 
00098 //=============================================================================
00099 // Operations
00100 //-----------------------------------------------------------------------------
00101 template <typename T>
00102 void SparseSymmetricMatrix_Matrix3x3<T>::MulWith (
00103     std::vector< Vector3<T> > const &I, 
00104     std::vector< Vector3<T> > &O        
00105 ) const
00106 {
00107     for ( unsigned int i = 0; i < O.size(); ++i ) {
00108         O[i].SetXYZ( 0, 0, 0 );
00109     }
00110     unsigned int r = 0;
00111     std::list< SparseVector_Matrix3x3<T> >::const_iterator it = m_Rows.begin();
00112     while ( it != m_Rows.end() ) {
00113         it->MulForSparseSymmetricMatrix( r, I, O );
00114         ++r;
00115         ++it;
00116     }
00117 }
00118 //-----------------------------------------------------------------------------
00119 template <typename T>
00120 void SparseSymmetricMatrix_Matrix3x3<T>::MulWith_wSkippedElements (
00121     std::vector< Vector3<T> > const &I, 
00122     std::vector< Vector3<T> > &O,       
00123     std::vector< bool > const &Skip     
00124 ) const
00125 {
00126     for ( unsigned int i = 0; i < O.size(); ++i ) {
00127         O[i].SetXYZ( 0, 0, 0 );
00128     }
00129     unsigned int r = 0;
00130     std::list< SparseVector_Matrix3x3<T> >::const_iterator it = m_Rows.begin();
00131     while ( it != m_Rows.end() ) {
00132         if ( Skip[r] == false ) {
00133             it->MulForFEMSparseSymmetricMatrix_wSkippedElements( r, I, O, Skip );
00134         }
00135         else {
00136             O[r] = I[r];
00137         }
00138         ++r;
00139         ++it;
00140     }
00141 }
00142 //-----------------------------------------------------------------------------
00143 template <typename T>
00144 void SparseSymmetricMatrix_Matrix3x3<T>::ChangeNumOfRows ( unsigned int numOfRows )
00145 {   
00146     m_Rows.resize( numOfRows );
00147 }
00148 //-----------------------------------------------------------------------------
00149 template <typename T>
00150 void SparseSymmetricMatrix_Matrix3x3<T>::DiagonalizeRowCol ( unsigned int ii, T diagonalValue )
00151 {   
00152     std::list< SparseVector_Matrix3x3_ElementData<T> >::iterator data;
00153     // From row 0 to row (ii-1)
00154     for ( unsigned int m = 0; m < ii; ++m ) {
00155         data = DirectAccess( m )->RefToElements().begin();
00156         while ( data != DirectAccess( m )->RefToElements().end() && data->idx < ii ) {
00157             ++data;
00158         }
00159         if ( data != DirectAccess( m )->RefToElements().end() && data->idx == ii ) {
00160             data->M.MakeZero();
00161         }
00162     }
00163 
00164     // Row ii
00165     data = DirectAccess( ii )->RefToElements().begin();
00166     while ( data != DirectAccess( ii )->RefToElements().end() ) {
00167         if ( data->idx == ii ) {
00168             data->M.MakeDiagonal( diagonalValue );
00169         }
00170         else {
00171             data->M.MakeZero();
00172         }
00173         ++data;
00174     }
00175 }
00176 //-----------------------------------------------------------------------------
00177 template <typename T>
00178 void SparseSymmetricMatrix_Matrix3x3<T>::DiagonalizeRowsCols (
00179     std::vector< bool > const & ii, 
00180     T diagonalValue = 1             
00181 )
00182 {   
00183     std::list< SparseVector_Matrix3x3_ElementData<T> >::iterator data;
00184     for ( unsigned int r = 0; r < GetNumOfRows(); ++r ) {
00185         data = DirectAccess( r )->RefToElements().begin();
00186         while ( data != DirectAccess( r )->RefToElements().end() ) {
00187             if ( ii[data->idx] ) {
00188                 if ( data->idx == r ) {
00189                     data->M.MakeDiagonal( diagonalValue );
00190                 }
00191                 else {
00192                     data->M.MakeZero();
00193                 }
00194             }
00195             ++data;
00196         }
00197     }
00198 }
00199 //-----------------------------------------------------------------------------
00200 template <typename T>
00201 void SparseSymmetricMatrix_Matrix3x3<T>::DiagonalizeRowsCols (
00202     std::vector< unsigned int > const & ii, 
00203     T diagonalValue = 1                     
00204 )
00205 {   
00206     std::list< SparseVector_Matrix3x3_ElementData<T> >::iterator data;
00207     for ( unsigned int r = 0; r < ii.size(); ++r ) {
00208         // From row 0 to row ii[r]
00209         unsigned int row = ii[r];
00210         for ( unsigned int m = 0; m < row; ++m ) {
00211             data = DirectAccess( m )->RefToElements().begin();
00212             while ( data != DirectAccess( m )->RefToElements().end() && data->idx < row ) {
00213                 ++data;
00214             }
00215             if ( data != DirectAccess( m )->RefToElements().end() && data->idx == row ) {
00216                 data->M.MakeZero();
00217             }
00218         }
00219 
00220         // Row r
00221         data = DirectAccess( row )->RefToElements().begin();
00222         while ( data != DirectAccess( row )->RefToElements().end() ) {
00223             if ( data->idx == row ) {
00224                 data->M.MakeDiagonal( diagonalValue );
00225             }
00226             else {
00227                 data->M.MakeZero();
00228             }
00229             ++data;
00230         }
00231     }
00232     /*
00233     for ( unsigned int r = 0; r < ii.size(); ++r ) {
00234         std::list< SparseVector_Matrix3x3_ElementData<T> >::iterator data = DirectAccess( ii[r] )->RefToElements().begin();
00235         while ( data != DirectAccess( ii[r] )->RefToElements().end() ) {
00236             if ( data->idx == ii[r] ) {
00237                 data->M.MakeDiagonal( diagonalValue );
00238             }
00239             else {
00240                 data->M.MakeZero();
00241             }
00242             ++data;
00243         }
00244     }
00245     //*/
00246 }
00247 //-----------------------------------------------------------------------------
00248 template <typename T>
00249 void SparseSymmetricMatrix_Matrix3x3<T>::SetDirectAccessors ()
00250 {   
00251     m_DirectAccessors.resize( m_Rows.size() );
00252     unsigned int n = 0;
00253     std::list< SparseVector_Matrix3x3<T> >::iterator it = m_Rows.begin();
00254     while ( it != m_Rows.end() ) {
00255         m_DirectAccessors[n++] = &(*it);
00256         ++it;
00257     }
00258 }
00259 //-----------------------------------------------------------------------------
00260 template <typename T>
00261 SparseVector_Matrix3x3<T> * const SparseSymmetricMatrix_Matrix3x3<T>::DirectAccess ( unsigned int row )
00262 {
00263     return m_DirectAccessors[row];
00264 }
00265 //-----------------------------------------------------------------------------
00266 template <typename T>
00267 void SparseSymmetricMatrix_Matrix3x3<T>::MPCGSolver ( 
00268     SparseSymmetricMatrix_Matrix3x3<T> const &A,    
00269     std::vector< Vector3<T> > const &x,     
00270     std::vector< Vector3<T> > const &b,     
00271     std::vector< Vector3<T> > &x_out,       
00272     std::vector< Vector3<T> > const &ft,    
00273     std::vector< Vector3<T> > const &P,     
00274     int iterationLimit = 100,               
00275     T errorThreshold = 1E-10                
00276 )
00277 {
00278     //std::cout << "START MPCGSolver() ------------------------------------------" << std::endl;
00279 
00280     unsigned int size = b.size();
00281     
00282     // inputs
00283     // A, x, b, x_out, ft, P
00284     // temps
00285     std::vector< Vector3<T> > v( size );
00286     T D0, Dold, Dnew, alpha;
00287     std::vector< Vector3<T> > Pinv( size );
00288     std::vector< Vector3<T> > r( size );
00289     std::vector< Vector3<T> > s( size );
00290     std::vector< Vector3<T> > c( size );
00291     std::vector< Vector3<T> > q( size );
00292 
00293     // x_out = x
00294     // D0 = Filter(b)^T.P.Filter(b)
00295     D0 = 0;
00296     Vector3<T> filterB;
00297     for ( unsigned int i = 0; i < size; ++i ) {
00298         // x_out
00299         x_out[i][0] = x[i][0];
00300         x_out[i][1] = x[i][1];
00301         x_out[i][2] = x[i][2];
00302         // D0
00303         filterB[0] = ft[i][0]*b[i][0];
00304         filterB[1] = ft[i][1]*b[i][1];
00305         filterB[2] = ft[i][2]*b[i][2];
00306         D0 += filterB[0]*filterB[0]*P[i][0] + filterB[1]*filterB[1]*P[i][1] + filterB[2]*filterB[2]*P[i][2];
00307         //std::cout << "D0: " << D0 << "\n";
00308     }
00309     // r = Filter(b - A.x_out)
00310     // c = Filter(P^{-1}.r)
00311     // Dnew = r^{T}.c
00312     Dnew = 0;
00313     A.MulWith( x_out, v );      // v = A.x_out
00314 
00315     // DEBUG
00316     //std::cout << "x_out:\n" << DEBUG_ToStr(x_out) << "\n";
00317     //std::cout << "v = A.x_out:\n" << DEBUG_ToStr(v) << "\n";
00318 
00319     for ( unsigned int i = 0; i < size; ++i ) {
00320         // r
00321         r[i][0] = b[i][0] - v[i][0];
00322         r[i][1] = b[i][1] - v[i][1];
00323         r[i][2] = b[i][2] - v[i][2];
00324         r[i][0] = ft[i][0]*r[i][0];
00325         r[i][1] = ft[i][1]*r[i][1];
00326         r[i][2] = ft[i][2]*r[i][2];
00327         // c
00328         Pinv[i][0] = T(1) / P[i][0];
00329         Pinv[i][1] = T(1) / P[i][1];
00330         Pinv[i][2] = T(1) / P[i][2];
00331         c[i][0] = Pinv[i][0] * r[i][0];
00332         c[i][1] = Pinv[i][1] * r[i][1];
00333         c[i][2] = Pinv[i][2] * r[i][2];
00334         c[i][0] = ft[i][0]*c[i][0];
00335         c[i][1] = ft[i][1]*c[i][1];
00336         c[i][2] = ft[i][2]*c[i][2];
00337         // Dnew
00338         Dnew += r[i] * c[i];
00339     }
00340 
00341     //D0 = Dnew;
00342 
00343     int count = 0;
00344     T err = 1;
00345     T ths = errorThreshold * errorThreshold * D0 * D0;
00346 
00347     /*
00348     std::cout << "FT P PINV DO X_OUT R C DNEW COUNT ERROR\n";
00349     std::cout << "BEFORE ENTERING THE LOOP\n";
00350     std::cout << "ft:\n" << DEBUG_ToStr(ft) << "\n";
00351     std::cout << "P:\n" << DEBUG_ToStr(P) << "\n";
00352     std::cout << "Pinv:\n" << DEBUG_ToStr(Pinv) << "\n";
00353     std::cout << "D0:\n" << D0 << "\n";
00354     std::cout << "x_out:\n" << DEBUG_ToStr(x_out) << "\n";
00355     std::cout << "r:\n" << DEBUG_ToStr(r) << "\n";
00356     std::cout << "c:\n" << DEBUG_ToStr(c) << "\n";
00357     std::cout << "Dnew:\n" << Dnew << "\n";
00358 
00359     std::cout << "count: " << count << ";\t";
00360     std::cout << "error: " << err << "\n";
00361     //*/
00362 
00363     while ( err > 0 && count < iterationLimit ) {
00364 
00365         // q = Filter(A.c)
00366         // alpha = Dnew / (c^T.q)
00367         T tmp = 0;
00368         A.MulWith( c, v );  // v = A.c
00369 
00370         // DEBUG
00371         //std::cout << "c:\n" << DEBUG_ToStr(c) << "\n";
00372         //std::cout << "v = A.c:\n" << DEBUG_ToStr(v) << "\n";
00373 
00374         for ( unsigned int i = 0; i < size; ++i ) {
00375             // q
00376             q[i][0] = ft[i][0]*v[i][0];
00377             q[i][1] = ft[i][1]*v[i][1];
00378             q[i][2] = ft[i][2]*v[i][2];
00379 
00380             //std::cout << "ft["<<i<<"]: " << ft[i] << "\n";
00381             //std::cout << "v["<<i<<"]: " << v[i] << "\n";
00382             //std::cout << "q["<<i<<"]: " << q[i] << "\n";
00383 
00384             // alpha
00385             tmp += c[i]*q[i];
00386 
00387             //std::cout << "tmp: " << tmp << "\n";
00388         }
00389         if ( tmp != 0 ) {
00390             alpha = Dnew / tmp;
00391 
00392             //std::cout << "alpha: " << alpha << "\n";
00393         }
00394         else {
00395             break;
00396         }
00397         // x_out += alpha.c
00398         // r -= alpha.q
00399         // s = P^{-1}.r
00400         for ( unsigned int i = 0; i < size; ++i ) {
00401             // x_out
00402             x_out[i][0] += alpha * c[i][0];
00403             x_out[i][1] += alpha * c[i][1];
00404             x_out[i][2] += alpha * c[i][2];
00405             // r
00406             r[i][0] -= alpha * q[i][0];
00407             r[i][1] -= alpha * q[i][1];
00408             r[i][2] -= alpha * q[i][2];
00409             // s
00410             s[i][0] = Pinv[i][0]*r[i][0];
00411             s[i][1] = Pinv[i][1]*r[i][1];
00412             s[i][2] = Pinv[i][2]*r[i][2];
00413         }
00414         // Dold = Dnew
00415         Dold = Dnew;
00416         // Dnew = r^T.s
00417         Dnew = 0;
00418         for ( unsigned int i = 0; i < size; ++i ) {
00419             Dnew += r[i] * s[i];
00420         }
00421         // c = Filter( s + (Dnew/Dold)*c )
00422         tmp = Dnew/Dold;
00423         for ( unsigned int i = 0; i < size; ++i ) {
00424             c[i][0] = s[i][0] + tmp*c[i][0];
00425             c[i][1] = s[i][1] + tmp*c[i][1];
00426             c[i][2] = s[i][2] + tmp*c[i][2];
00427             c[i][0] = ft[i][0]*c[i][0];
00428             c[i][1] = ft[i][1]*c[i][1];
00429             c[i][2] = ft[i][2]*c[i][2];
00430         }
00431 
00432         // update values for stop conditions
00433         err = Dnew*Dnew - ths;
00434         ++count;
00435 
00436         /*
00437         std::cout << "MPCGSolver: count: " << count << "\n";
00438         std::cout << "q:\n" << DEBUG_ToStr(q) << "\n";
00439         std::cout << "alpha:\n" << alpha << "\n";
00440         std::cout << "x_out:\n" << DEBUG_ToStr(x_out) << "\n";
00441         std::cout << "r:\n" << DEBUG_ToStr(r) << "\n";
00442         std::cout << "s:\n" << DEBUG_ToStr(s) << "\n";
00443         std::cout << "Dold:\n" << Dold << "\n";
00444         std::cout << "Dnew:\n" << Dnew << "\n";
00445         std::cout << "c:\n" << DEBUG_ToStr(c) << "\n";
00446 
00447         std::cout << "count: " << count << ";\t";
00448         std::cout << "error: " << err << "\n";
00449         //*/
00450     }
00451 
00452     /*
00453     std::cout << "count: " << count << ";\t";
00454     std::cout << "error: " << err << "\n";
00455     std::cout << "A:\n" << A << "\n";
00456     std::cout << "x:\n" << DEBUG_ToStr(x) << "\n";
00457     std::cout << "x_out:\n" << DEBUG_ToStr(x_out) << "\n";
00458     std::cout << "b:\n" << DEBUG_ToStr(b) << "\n";
00459     A.MulWith( x_out, v );
00460     std::cout << "v:\n" << DEBUG_ToStr(v) << "\n";
00461     //*/
00462 
00463     //std::cout << "END MPCGSolver() --------------------------------------------" << std::endl;
00464 }
00465 
00466 
00467 //-----------------------------------------------------------------------------
00468 template <typename T>
00469 void SparseSymmetricMatrix_Matrix3x3<T>::MPCGSolverSpecificForFEM (
00470     std::vector< bool > const &fixedNodes,  
00471     SparseSymmetricMatrix_Matrix3x3<T> const &A,    
00472     std::vector< Vector3<T> > const &x,     
00473     std::vector< Vector3<T> > const &b,     
00474     std::vector< Vector3<T> > &x_out,       
00475     std::vector< Vector3<T> > const &ft,    
00476     std::vector< Vector3<T> > const &P,     
00477     int iterationLimit = 100,               
00478     T errorThreshold = 1E-10                
00479 )
00480 {
00481     //std::cout << "START MPCGSolverSpecificForFEM() ------------------------------------------" << std::endl;
00482 
00483     unsigned int size = b.size();
00484     
00485     // inputs
00486     // A, x, b, x_out, ft, P
00487     // temps
00488     std::vector< Vector3<T> > v( size );
00489     T D0, Dold, Dnew, alpha;
00490     std::vector< Vector3<T> > Pinv( size );
00491     std::vector< Vector3<T> > r( size );
00492     std::vector< Vector3<T> > s( size );
00493     std::vector< Vector3<T> > c( size );
00494     std::vector< Vector3<T> > q( size );
00495 
00496     // x_out = x
00497     // D0 = Filter(b)^T.P.Filter(b)
00498     D0 = 0;
00499     Vector3<T> filterB;
00500     for ( unsigned int i = 0; i < size; ++i ) {
00501         // x_out
00502         x_out[i][0] = x[i][0];
00503         x_out[i][1] = x[i][1];
00504         x_out[i][2] = x[i][2];
00505         // D0
00506         filterB[0] = ft[i][0]*b[i][0];
00507         filterB[1] = ft[i][1]*b[i][1];
00508         filterB[2] = ft[i][2]*b[i][2];
00509         D0 += filterB[0]*filterB[0]*P[i][0] + filterB[1]*filterB[1]*P[i][1] + filterB[2]*filterB[2]*P[i][2];
00510         //std::cout << "D0: " << D0 << "\n";
00511     }
00512     // r = Filter(b - A.x_out)
00513     // c = Filter(P^{-1}.r)
00514     // Dnew = r^{T}.c
00515     Dnew = 0;
00516     A.MulWith_wSkippedElements( x_out, v, fixedNodes );     // v = A.x_out
00517 
00518     for ( unsigned int i = 0; i < size; ++i ) {
00519         // r
00520         r[i][0] = b[i][0] - v[i][0];
00521         r[i][1] = b[i][1] - v[i][1];
00522         r[i][2] = b[i][2] - v[i][2];
00523         r[i][0] = ft[i][0]*r[i][0];
00524         r[i][1] = ft[i][1]*r[i][1];
00525         r[i][2] = ft[i][2]*r[i][2];
00526         // c
00527         Pinv[i][0] = T(1) / P[i][0];
00528         Pinv[i][1] = T(1) / P[i][1];
00529         Pinv[i][2] = T(1) / P[i][2];
00530         c[i][0] = Pinv[i][0] * r[i][0];
00531         c[i][1] = Pinv[i][1] * r[i][1];
00532         c[i][2] = Pinv[i][2] * r[i][2];
00533         c[i][0] = ft[i][0]*c[i][0];
00534         c[i][1] = ft[i][1]*c[i][1];
00535         c[i][2] = ft[i][2]*c[i][2];
00536         // Dnew
00537         Dnew += r[i] * c[i];
00538     }
00539 
00540     //D0 = Dnew;
00541 
00542     int count = 0;
00543     T err = 1;
00544     T ths = errorThreshold * errorThreshold * D0 * D0;
00545 
00546     while ( err > 0 && count < iterationLimit ) {
00547 
00548         // q = Filter(A.c)
00549         // alpha = Dnew / (c^T.q)
00550         T tmp = 0;
00551         A.MulWith_wSkippedElements( c, v, fixedNodes ); // v = A.c
00552 
00553         for ( unsigned int i = 0; i < size; ++i ) {
00554             // q
00555             q[i][0] = ft[i][0]*v[i][0];
00556             q[i][1] = ft[i][1]*v[i][1];
00557             q[i][2] = ft[i][2]*v[i][2];
00558             // alpha
00559             tmp += c[i]*q[i];
00560         }
00561         if ( tmp != 0 ) {
00562             alpha = Dnew / tmp;
00563         }
00564         else {
00565             break;
00566         }
00567         // x_out += alpha.c
00568         // r -= alpha.q
00569         // s = P^{-1}.r
00570         for ( unsigned int i = 0; i < size; ++i ) {
00571             // x_out
00572             x_out[i][0] += alpha * c[i][0];
00573             x_out[i][1] += alpha * c[i][1];
00574             x_out[i][2] += alpha * c[i][2];
00575             // r
00576             r[i][0] -= alpha * q[i][0];
00577             r[i][1] -= alpha * q[i][1];
00578             r[i][2] -= alpha * q[i][2];
00579             // s
00580             s[i][0] = Pinv[i][0]*r[i][0];
00581             s[i][1] = Pinv[i][1]*r[i][1];
00582             s[i][2] = Pinv[i][2]*r[i][2];
00583         }
00584         // Dold = Dnew
00585         Dold = Dnew;
00586         // Dnew = r^T.s
00587         Dnew = 0;
00588         for ( unsigned int i = 0; i < size; ++i ) {
00589             Dnew += r[i] * s[i];
00590         }
00591         // c = Filter( s + (Dnew/Dold)*c )
00592         tmp = Dnew/Dold;
00593         for ( unsigned int i = 0; i < size; ++i ) {
00594             c[i][0] = s[i][0] + tmp*c[i][0];
00595             c[i][1] = s[i][1] + tmp*c[i][1];
00596             c[i][2] = s[i][2] + tmp*c[i][2];
00597             c[i][0] = ft[i][0]*c[i][0];
00598             c[i][1] = ft[i][1]*c[i][1];
00599             c[i][2] = ft[i][2]*c[i][2];
00600         }
00601 
00602         // update values for stop conditions
00603         err = Dnew*Dnew - ths;
00604         ++count;
00605     }
00606 
00607     //*
00608     std::cout << "count: " << count << ";\t";
00609     std::cout << "error: " << err << "\n";
00610     std::cout << "x:\n" << DEBUG_ToStr(x) << "\n";
00611     std::cout << "x_out:\n" << DEBUG_ToStr(x_out) << "\n";
00612     std::cout << "b:\n" << DEBUG_ToStr(b) << "\n";
00613     //*/
00614 
00615     //std::cout << "END MPCGSolverSpecificForFEM() --------------------------------------------" << std::endl;
00616 }
00617 //-----------------------------------------------------------------------------
00618 //=============================================================================
00619 
00620 //-----------------------------------------------------------------------------
00621 //=============================================================================
00622 END_NAMESPACE_TAPs
00623 //34567890123456789012345678901234567890123456789012345678901234567890123456789
00624 //--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines