![]() |
TAPs 0.7.7.3
|
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----+----