Warning: this documentation for the development version is under construction.
00001 // Copyright (C) 2003-2009 Marc Duruflé 00002 // Copyright (C) 2001-2009 Vivien Mallet 00003 // 00004 // This file is part of the linear-algebra library Seldon, 00005 // http://seldon.sourceforge.net/. 00006 // 00007 // Seldon is free software; you can redistribute it and/or modify it under the 00008 // terms of the GNU Lesser General Public License as published by the Free 00009 // Software Foundation; either version 2.1 of the License, or (at your option) 00010 // any later version. 00011 // 00012 // Seldon is distributed in the hope that it will be useful, but WITHOUT ANY 00013 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 00014 // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for 00015 // more details. 00016 // 00017 // You should have received a copy of the GNU Lesser General Public License 00018 // along with Seldon. If not, see http://www.gnu.org/licenses/. 00019 00020 00021 #ifndef SELDON_FILE_MATRIX_ARRAY_COMPLEX_SPARSE_CXX 00022 00023 #include "Matrix_ArrayComplexSparse.hxx" 00024 00025 namespace Seldon 00026 { 00027 00028 00029 /**************** 00030 * CONSTRUCTORS * 00031 ****************/ 00032 00033 00035 00038 template <class T, class Prop, class Storage, class Allocator> 00039 inline Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00040 Matrix_ArrayComplexSparse() 00041 : val_real_(), val_imag_() 00042 { 00043 this->m_ = 0; 00044 this->n_ = 0; 00045 } 00046 00047 00049 00054 template <class T, class Prop, class Storage, class Allocator> 00055 inline Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00056 Matrix_ArrayComplexSparse(int i, int j): 00057 val_real_(Storage::GetFirst(i, j)), val_imag_(Storage::GetFirst(i, j)) 00058 { 00059 this->m_ = i; 00060 this->n_ = j; 00061 } 00062 00063 00064 /************** 00065 * DESTRUCTOR * 00066 **************/ 00067 00068 00070 template <class T, class Prop, class Storage, class Allocator> 00071 inline Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00072 ~Matrix_ArrayComplexSparse() 00073 { 00074 Clear(); 00075 } 00076 00077 00079 00082 template <class T, class Prop, class Storage, class Allocator> 00083 inline void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>::Clear() 00084 { 00085 this->m_ = 0; 00086 this->n_ = 0; 00087 val_real_.Clear(); 00088 val_imag_.Clear(); 00089 } 00090 00091 00092 /********************* 00093 * MEMORY MANAGEMENT * 00094 *********************/ 00095 00096 00098 00104 template <class T, class Prop, class Storage, class Allocator> 00105 inline void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00106 Reallocate(int i, int j) 00107 { 00108 // Clears previous entries. 00109 Clear(); 00110 00111 this->m_ = i; 00112 this->n_ = j; 00113 00114 int n = Storage::GetFirst(i,j); 00115 val_real_.Reallocate(n); 00116 val_imag_.Reallocate(n); 00117 } 00118 00119 00121 00127 template <class T, class Prop, class Storage, class Allocator> 00128 inline void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00129 Resize(int i, int j) 00130 { 00131 int n = Storage::GetFirst(this->m_, n_); 00132 int new_n = Storage::GetFirst(i, j); 00133 if (n != new_n) 00134 { 00135 Vector<Vector<T, VectSparse, Allocator>, VectFull, 00136 NewAlloc<Vector<T, VectSparse, Allocator> > > new_val_real; 00137 00138 Vector<Vector<T, VectSparse, Allocator>, VectFull, 00139 NewAlloc<Vector<T, VectSparse, Allocator> > > new_val_imag; 00140 00141 new_val_real.Reallocate(new_n); 00142 new_val_imag.Reallocate(new_n); 00143 00144 for (int k = 0 ; k < min(n, new_n) ; k++) 00145 { 00146 Swap(new_val_real(k), this->val_real_(k)); 00147 Swap(new_val_imag(k), this->val_imag_(k)); 00148 } 00149 00150 val_real_.SetData(new_n, new_val_real.GetData()); 00151 val_imag_.SetData(new_n, new_val_imag.GetData()); 00152 new_val_real.Nullify(); 00153 new_val_imag.Nullify(); 00154 00155 } 00156 00157 this->m_ = i; 00158 this->n_ = j; 00159 } 00160 00161 00162 /******************* 00163 * BASIC FUNCTIONS * 00164 *******************/ 00165 00166 00168 00171 template <class T, class Prop, class Storage, class Allocator> 00172 inline int Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 00173 ::GetM() const 00174 { 00175 return m_; 00176 } 00177 00178 00180 00183 template <class T, class Prop, class Storage, class Allocator> 00184 inline int Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 00185 ::GetN() const 00186 { 00187 return n_; 00188 } 00189 00190 00192 00196 template <class T, class Prop, class Storage, class Allocator> 00197 inline int Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 00198 ::GetM(const SeldonTranspose& status) const 00199 { 00200 if (status.NoTrans()) 00201 return m_; 00202 else 00203 return n_; 00204 } 00205 00206 00208 00212 template <class T, class Prop, class Storage, class Allocator> 00213 inline int Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 00214 ::GetN(const SeldonTranspose& status) const 00215 { 00216 if (status.NoTrans()) 00217 return n_; 00218 else 00219 return m_; 00220 } 00221 00222 00224 00227 template <class T, class Prop, class Storage, class Allocator> 00228 inline int Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00229 GetRealNonZeros() const 00230 { 00231 int nnz = 0; 00232 for (int i = 0; i < this->val_real_.GetM(); i++) 00233 nnz += this->val_real_(i).GetM(); 00234 00235 return nnz; 00236 } 00237 00238 00240 00243 template <class T, class Prop, class Storage, class Allocator> 00244 inline int Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00245 GetImagNonZeros() const 00246 { 00247 int nnz = 0; 00248 for (int i = 0; i < this->val_imag_.GetM(); i++) 00249 nnz += this->val_imag_(i).GetM(); 00250 00251 return nnz; 00252 } 00253 00254 00256 00261 template <class T, class Prop, class Storage, class Allocator> 00262 inline int Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00263 GetRealDataSize() const 00264 { 00265 return GetRealNonZeros(); 00266 } 00267 00268 00270 00275 template <class T, class Prop, class Storage, class Allocator> 00276 inline int Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00277 GetImagDataSize() const 00278 { 00279 return GetImagNonZeros(); 00280 } 00281 00282 00284 00289 template <class T, class Prop, class Storage, class Allocator> 00290 inline int Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00291 GetDataSize() const 00292 { 00293 return (GetRealNonZeros()+GetImagNonZeros()); 00294 } 00295 00296 00298 00303 template <class T, class Prop, class Storage, class Allocator> 00304 inline int* Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00305 GetRealInd(int i) const 00306 { 00307 return val_real_(i).GetIndex(); 00308 } 00309 00310 00312 00316 template <class T, class Prop, class Storage, class Allocator> inline T* 00317 Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>::GetRealData(int i) 00318 const 00319 { 00320 return val_real_(i).GetData(); 00321 } 00322 00323 00325 00330 template <class T, class Prop, class Storage, class Allocator> 00331 inline int* Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00332 GetImagInd(int i) const 00333 { 00334 return val_imag_(i).GetIndex(); 00335 } 00336 00337 00339 00343 template <class T, class Prop, class Storage, class Allocator> inline T* 00344 Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>::GetImagData(int i) 00345 const 00346 { 00347 return val_imag_(i).GetData(); 00348 } 00349 00350 00351 /********************************** 00352 * ELEMENT ACCESS AND AFFECTATION * 00353 **********************************/ 00354 00355 00357 00363 template <class T, class Prop, class Storage, class Allocator> 00364 inline complex<T> 00365 Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>::operator() 00366 (int i, int j) const 00367 { 00368 00369 #ifdef SELDON_CHECK_BOUNDS 00370 if (i < 0 || i >= this->m_) 00371 throw WrongRow("Matrix::operator()", "Index should be in [0, " 00372 + to_str(this->m_-1) + "], but is equal to " 00373 + to_str(i) + "."); 00374 00375 if (j < 0 || j >= this->n_) 00376 throw WrongCol("Matrix::operator()", "Index should be in [0, " 00377 + to_str(this->n_-1) + "], but is equal to " 00378 + to_str(j) + "."); 00379 #endif 00380 00381 return complex<T>(this->val_real_(Storage::GetFirst(i, j)) 00382 (Storage::GetSecond(i, j)), 00383 this->val_imag_(Storage::GetFirst(i, j)) 00384 (Storage::GetSecond(i, j)) ); 00385 } 00386 00387 00389 00395 template <class T, class Prop, class Storage, class Allocator> 00396 inline complex<T>& 00397 Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 00398 ::Val(int i, int j) 00399 { 00400 throw Undefined("Matrix_ArrayComplexSparse::Val(int i, int j)"); 00401 } 00402 00403 00405 00411 template <class T, class Prop, class Storage, class Allocator> 00412 inline const complex<T>& 00413 Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 00414 ::Val(int i, int j) const 00415 { 00416 throw Undefined("Matrix_ArrayComplexSparse::Val(int i, int j)"); 00417 } 00418 00419 00421 00427 template <class T, class Prop, class Storage, class Allocator> 00428 inline complex<T>& 00429 Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 00430 ::Get(int i, int j) 00431 { 00432 throw Undefined("Matrix_ArrayComplexSparse::Get(int i, int j)"); 00433 } 00434 00435 00437 00443 template <class T, class Prop, class Storage, class Allocator> 00444 inline const complex<T>& 00445 Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 00446 ::Get(int i, int j) const 00447 { 00448 throw Undefined("Matrix_ArrayComplexSparse::Get(int i, int j)"); 00449 } 00450 00451 00453 00458 template <class T, class Prop, class Storage, class Allocator> 00459 inline T& 00460 Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 00461 ::ValReal(int i, int j) 00462 { 00463 return val_real_(Storage::GetFirst(i, j)).Val(Storage::GetSecond(i, j)); 00464 } 00465 00466 00468 00473 template <class T, class Prop, class Storage, class Allocator> 00474 inline const T& 00475 Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 00476 ::ValReal(int i, int j) const 00477 { 00478 return val_real_(Storage::GetFirst(i, j)).Val(Storage::GetSecond(i, j)); 00479 } 00480 00481 00483 00488 template <class T, class Prop, class Storage, class Allocator> 00489 inline T& 00490 Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 00491 ::ValImag(int i, int j) 00492 { 00493 return val_imag_(Storage::GetFirst(i, j)).Val(Storage::GetSecond(i, j)); 00494 } 00495 00496 00498 00503 template <class T, class Prop, class Storage, class Allocator> 00504 inline const T& 00505 Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 00506 ::ValImag(int i, int j) const 00507 { 00508 return val_imag_(Storage::GetFirst(i, j)).Val(Storage::GetSecond(i, j)); 00509 } 00510 00511 00513 00518 template <class T, class Prop, class Storage, class Allocator> 00519 inline T& 00520 Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 00521 ::GetReal(int i, int j) 00522 { 00523 return val_real_(Storage::GetFirst(i, j)).Get(Storage::GetSecond(i, j)); 00524 } 00525 00526 00528 00533 template <class T, class Prop, class Storage, class Allocator> 00534 inline const T& 00535 Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 00536 ::GetReal(int i, int j) const 00537 { 00538 return val_real_(Storage::GetFirst(i, j)).Get(Storage::GetSecond(i, j)); 00539 } 00540 00541 00543 00548 template <class T, class Prop, class Storage, class Allocator> 00549 inline T& 00550 Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 00551 ::GetImag(int i, int j) 00552 { 00553 return val_imag_(Storage::GetFirst(i, j)).Get(Storage::GetSecond(i, j)); 00554 } 00555 00556 00558 00563 template <class T, class Prop, class Storage, class Allocator> 00564 inline const T& 00565 Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 00566 ::GetImag(int i, int j) const 00567 { 00568 return val_imag_(Storage::GetFirst(i, j)).Get(Storage::GetSecond(i, j)); 00569 } 00570 00571 00573 00578 template <class T, class Prop, class Storage, class Allocator> 00579 inline void 00580 Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 00581 ::Set(int i, int j, const complex<T>& x) 00582 { 00583 if (real(x) != T(0)) 00584 val_real_(Storage::GetFirst(i, j)).Get(Storage::GetSecond(i, j)) = real(x); 00585 else 00586 { 00587 if (val_real_(Storage::GetFirst(i, j))(Storage::GetSecond(i, j)) != T(0)) 00588 val_real_(Storage::GetFirst(i, j)).Get(Storage::GetSecond(i, j)) = T(0); 00589 } 00590 00591 if (imag(x) != T(0)) 00592 val_imag_(Storage::GetFirst(i, j)).Get(Storage::GetSecond(i, j)) = imag(x); 00593 else 00594 { 00595 if (val_imag_(Storage::GetFirst(i, j))(Storage::GetSecond(i, j)) != T(0)) 00596 val_imag_(Storage::GetFirst(i, j)).Get(Storage::GetSecond(i, j)) = T(0); 00597 } 00598 00599 } 00600 00601 00603 00608 template <class T, class Prop, class Storage, class Allocator> 00609 inline const T& Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00610 ValueReal(int i, int j) const 00611 { 00612 00613 #ifdef SELDON_CHECK_BOUNDS 00614 if (i < 0 || i >= Storage::GetFirst(this->m_, this->n_)) 00615 throw WrongRow("Matrix_ArraySparse::value", "Index should be in [0, " 00616 + to_str(Storage::GetFirst(this->m_, this->n_)-1) 00617 + "], but is equal to " + to_str(i) + "."); 00618 00619 if (j < 0 || j >= this->val_real_(i).GetM()) 00620 throw WrongCol("Matrix_ArraySparse::value", "Index should be in [0, " + 00621 to_str(this->val_real_(i).GetM()-1) + "], but is equal to " 00622 + to_str(j) + "."); 00623 #endif 00624 00625 return val_real_(i).Value(j); 00626 } 00627 00628 00630 00635 template <class T, class Prop, class Storage, class Allocator> 00636 inline T& 00637 Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00638 ValueReal(int i, int j) 00639 { 00640 00641 #ifdef SELDON_CHECK_BOUNDS 00642 if (i < 0 || i >= Storage::GetFirst(this->m_, this->n_)) 00643 throw WrongRow("Matrix_ArraySparse::value", "Index should be in [0, " 00644 + to_str(Storage::GetFirst(this->m_, this->n_)-1) 00645 + "], but is equal to " + to_str(i) + "."); 00646 if (j < 0 || j >= this->val_real_(i).GetM()) 00647 throw WrongCol("Matrix_ArraySparse::value", "Index should be in [0, " + 00648 to_str(this->val_real_(i).GetM()-1) + "], but is equal to " 00649 + to_str(j) + "."); 00650 #endif 00651 00652 return val_real_(i).Value(j); 00653 } 00654 00655 00657 00662 template <class T, class Prop, class Storage, class Allocator> 00663 inline int Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00664 IndexReal(int i, int j) const 00665 { 00666 00667 #ifdef SELDON_CHECK_BOUNDS 00668 if (i < 0 || i >= Storage::GetFirst(this->m_, this->n_)) 00669 throw WrongRow("Matrix_ArraySparse::index", "Index should be in [0, " 00670 + to_str(Storage::GetFirst(this->m_, this->n_)-1) 00671 + "], but is equal to " + to_str(i) + "."); 00672 00673 if (j < 0 || j >= this->val_real_(i).GetM()) 00674 throw WrongCol("Matrix_ArraySparse::index", "Index should be in [0, " + 00675 to_str(this->val_real_(i).GetM()-1) + "], but is equal to " 00676 + to_str(j) + "."); 00677 #endif 00678 00679 return val_real_(i).Index(j); 00680 } 00681 00682 00684 00689 template <class T, class Prop, class Storage, class Allocator> 00690 inline int& Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00691 IndexReal(int i, int j) 00692 { 00693 00694 #ifdef SELDON_CHECK_BOUNDS 00695 if (i < 0 || i >= Storage::GetFirst(this->m_, this->n_)) 00696 throw WrongRow("Matrix_ArraySparse::index", "Index should be in [0, " 00697 + to_str(Storage::GetFirst(this->m_, this->n_)-1) 00698 + "], but is equal to " + to_str(i) + "."); 00699 00700 if (j < 0 || j >= this->val_real_(i).GetM()) 00701 throw WrongCol("Matrix_ArraySparse::index", "Index should be in [0, " 00702 + to_str(this->val_real_(i).GetM()-1) 00703 + "], but is equal to " + to_str(j) + "."); 00704 #endif 00705 00706 return val_real_(i).Index(j); 00707 } 00708 00709 00711 00716 template <class T, class Prop, class Storage, class Allocator> 00717 inline const T& Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00718 ValueImag(int i, int j) const 00719 { 00720 00721 #ifdef SELDON_CHECK_BOUNDS 00722 if (i < 0 || i >= Storage::GetFirst(this->m_, this->n_)) 00723 throw WrongRow("Matrix_ArraySparse::value", "Index should be in [0, " 00724 + to_str(Storage::GetFirst(this->m_, this->n_)-1) 00725 + "], but is equal to " + to_str(i) + "."); 00726 00727 if (j < 0 || j >= this->val_imag_(i).GetM()) 00728 throw WrongCol("Matrix_ArraySparse::value", "Index should be in [0, " + 00729 to_str(this->val_imag_(i).GetM()-1) + "], but is equal to " 00730 + to_str(j) + "."); 00731 #endif 00732 00733 return val_imag_(i).Value(j); 00734 } 00735 00736 00738 00743 template <class T, class Prop, class Storage, class Allocator> 00744 inline T& Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00745 ValueImag (int i, int j) 00746 { 00747 00748 #ifdef SELDON_CHECK_BOUNDS 00749 if (i < 0 || i >= Storage::GetFirst(this->m_, this->n_)) 00750 throw WrongRow("Matrix_ArraySparse::value", "Index should be in [0, " 00751 + to_str(Storage::GetFirst(this->m_, this->n_)-1) 00752 + "], but is equal to " + to_str(i) + "."); 00753 00754 if (j < 0 || j >= this->val_imag_(i).GetM()) 00755 throw WrongCol("Matrix_ArraySparse::value", "Index should be in [0, " + 00756 to_str(this->val_imag_(i).GetM()-1) + "], but is equal to " 00757 + to_str(j) + "."); 00758 #endif 00759 00760 return val_imag_(i).Value(j); 00761 } 00762 00763 00765 00770 template <class T, class Prop, class Storage, class Allocator> 00771 inline int Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00772 IndexImag(int i, int j) const 00773 { 00774 00775 #ifdef SELDON_CHECK_BOUNDS 00776 if (i < 0 || i >= Storage::GetFirst(this->m_, this->n_)) 00777 throw WrongRow("Matrix_ArraySparse::index", "Index should be in [0, " 00778 + to_str(Storage::GetFirst(this->m_, this->n_)-1) 00779 + "], but is equal to " + to_str(i) + "."); 00780 00781 if (j < 0 || j >= this->val_imag_(i).GetM()) 00782 throw WrongCol("Matrix_ArraySparse::index", "Index should be in [0, " + 00783 to_str(this->val_imag_(i).GetM()-1) + "], but is equal to " 00784 + to_str(j) + "."); 00785 #endif 00786 00787 return val_imag_(i).Index(j); 00788 } 00789 00790 00792 00797 template <class T, class Prop, class Storage, class Allocator> 00798 inline int& Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00799 IndexImag(int i, int j) 00800 { 00801 00802 #ifdef SELDON_CHECK_BOUNDS 00803 if (i < 0 || i >= Storage::GetFirst(this->m_, this->n_)) 00804 throw WrongRow("Matrix_ArrayComplexSparse::index", 00805 "Index should be in [0, " 00806 + to_str(Storage::GetFirst(this->m_, this->n_)-1) 00807 + "], but is equal to " + to_str(i) + "."); 00808 00809 if (j < 0 || j >= this->val_imag_(i).GetM()) 00810 throw WrongCol("Matrix_ArraySparse::index", "Index should be in [0, " + 00811 to_str(this->val_imag_(i).GetM()-1) + "], but is equal to " 00812 + to_str(j) + "."); 00813 #endif 00814 00815 return val_imag_(i).Index(j); 00816 } 00817 00818 00820 00826 template <class T, class Prop, class Storage, class Allocator> 00827 inline void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00828 SetRealData(int i, int n, T* val, int* ind) 00829 { 00830 val_real_(i).SetData(n, val, ind); 00831 } 00832 00833 00835 00841 template <class T, class Prop, class Storage, class Allocator> 00842 inline void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00843 SetImagData(int i, int n, T* val, int* ind) 00844 { 00845 val_imag_(i).SetData(n, val, ind); 00846 } 00847 00848 00850 00854 template <class T, class Prop, class Storage, class Allocator> 00855 inline void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>::NullifyReal(int i) 00856 { 00857 val_real_(i).Nullify(); 00858 } 00859 00860 00862 00866 template <class T, class Prop, class Storage, class Allocator> 00867 inline void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>::NullifyImag(int i) 00868 { 00869 val_imag_(i).Nullify(); 00870 } 00871 00872 00874 00879 template <class T, class Prop, class Storage, class Allocator> 00880 inline void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00881 SetRealData(int m, int n, Vector<T, VectSparse, Allocator>* val) 00882 { 00883 m_ = m; 00884 n_ = n; 00885 val_real_.SetData(Storage::GetFirst(m, n), val); 00886 } 00887 00888 00890 00895 template <class T, class Prop, class Storage, class Allocator> 00896 inline void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 00897 SetImagData(int m, int n, Vector<T, VectSparse, Allocator>* val) 00898 { 00899 m_ = m; 00900 n_ = n; 00901 val_imag_.SetData(Storage::GetFirst(m, n), val); 00902 } 00903 00904 00906 00910 template <class T, class Prop, class Storage, class Allocator> 00911 inline void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>::NullifyReal() 00912 { 00913 m_ = 0; 00914 n_ = 0; 00915 val_real_.Nullify(); 00916 } 00917 00918 00920 00924 template <class T, class Prop, class Storage, class Allocator> 00925 inline void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>::NullifyImag() 00926 { 00927 m_ = 0; 00928 n_ = 0; 00929 val_imag_.Nullify(); 00930 } 00931 00932 00933 /************************ 00934 * CONVENIENT FUNCTIONS * 00935 ************************/ 00936 00937 00939 00944 template <class T, class Prop, class Storage, class Allocator> 00945 void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>::Print() const 00946 { 00947 if (Storage::GetFirst(1, 0) == 1) 00948 for (int i = 0; i < this->m_; i++) 00949 { 00950 for (int j = 0; j < this->val_real_(i).GetM(); j++) 00951 cout << (i+1) << " " << this->val_real_(i).Index(j)+1 00952 << " " << this->val_real_(i).Value(j) << endl; 00953 00954 for (int j = 0; j < this->val_imag_(i).GetM(); j++) 00955 cout << (i+1) << " " << this->val_imag_(i).Index(j)+1 00956 << " (0, " << this->val_imag_(i).Value(j) << ")"<<endl; 00957 } 00958 else 00959 for (int i = 0; i < this->n_; i++) 00960 { 00961 for (int j = 0; j < this->val_real_(i).GetM(); j++) 00962 cout << this->val_real_(i).Index(j)+1 << " " << i+1 00963 << " " << this->val_real_(i).Value(j) << endl; 00964 00965 for (int j = 0; j < this->val_imag_(i).GetM(); j++) 00966 cout << this->val_imag_(i).Index(j)+1 << " " << i+1 00967 << " (0, " << this->val_imag_(i).Value(j) << ")"<<endl; 00968 } 00969 } 00970 00971 00973 00980 template <class T, class Prop, class Storage, class Allocator> 00981 void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 00982 ::Write(string FileName) const 00983 { 00984 ofstream FileStream; 00985 FileStream.open(FileName.c_str()); 00986 00987 #ifdef SELDON_CHECK_IO 00988 // Checks if the file was opened. 00989 if (!FileStream.is_open()) 00990 throw IOError("Matrix_ArrayComplexSparse::Write(string FileName)", 00991 string("Unable to open file \"") + FileName + "\"."); 00992 #endif 00993 00994 this->Write(FileStream); 00995 00996 FileStream.close(); 00997 } 00998 00999 01001 01008 template <class T, class Prop, class Storage, class Allocator> 01009 void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 01010 ::Write(ostream& FileStream) const 01011 { 01012 01013 #ifdef SELDON_CHECK_IO 01014 // Checks if the stream is ready. 01015 if (!FileStream.good()) 01016 throw IOError("Matrix_ArrayComplexSparse::Write(ofstream& FileStream)", 01017 "Stream is not ready."); 01018 #endif 01019 01020 FileStream.write(reinterpret_cast<char*>(const_cast<int*>(&this->m_)), 01021 sizeof(int)); 01022 01023 FileStream.write(reinterpret_cast<char*>(const_cast<int*>(&this->n_)), 01024 sizeof(int)); 01025 01026 for (int i = 0; i < val_real_.GetM(); i++) 01027 { 01028 val_real_(i).Write(FileStream); 01029 val_imag_(i).Write(FileStream); 01030 } 01031 } 01032 01033 01035 01039 template <class T, class Prop, class Storage, class Allocator> 01040 void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 01041 ::WriteText(string FileName) const 01042 { 01043 ofstream FileStream; FileStream.precision(14); 01044 FileStream.open(FileName.c_str()); 01045 01046 #ifdef SELDON_CHECK_IO 01047 // Checks if the file was opened. 01048 if (!FileStream.is_open()) 01049 throw IOError("Matrix_ArrayComplexSparse::WriteText(string FileName)", 01050 string("Unable to open file \"") + FileName + "\"."); 01051 #endif 01052 01053 this->WriteText(FileStream); 01054 01055 FileStream.close(); 01056 } 01057 01058 01060 01064 template <class T, class Prop, class Storage, class Allocator> 01065 void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 01066 ::WriteText(ostream& FileStream) const 01067 { 01068 01069 #ifdef SELDON_CHECK_IO 01070 // Checks if the stream is ready. 01071 if (!FileStream.good()) 01072 throw IOError("Matrix_ArrayComplexSparse::" 01073 "WriteText(ofstream& FileStream)", 01074 "Stream is not ready."); 01075 #endif 01076 01077 // Conversion to coordinate format (1-index convention). 01078 IVect IndRow, IndCol; Vector<complex<T> > Value; 01079 const Matrix<T, Prop, Storage, Allocator>& leaf_class = 01080 static_cast<const Matrix<T, Prop, Storage, Allocator>& >(*this); 01081 01082 ConvertMatrix_to_Coordinates(leaf_class, IndRow, IndCol, 01083 Value, 1, true); 01084 01085 for (int i = 0; i < IndRow.GetM(); i++) 01086 FileStream << IndRow(i) << " " << IndCol(i) << " " << Value(i) << '\n'; 01087 01088 // If the last element a_{m,n} does not exist, we add a zero. 01089 int m = Storage::GetFirst(this->m_, this->n_); 01090 int n = Storage::GetSecond(this->m_, this->n_); 01091 bool presence_last_elt = false; 01092 if (m > 0 && n > 0) 01093 { 01094 if (this->val_real_(m-1).GetM() > 0) 01095 { 01096 int p = this->val_real_(m-1).GetM(); 01097 if (this->val_real_(m-1).Index(p-1) == n-1) 01098 presence_last_elt = true; 01099 } 01100 01101 if (this->val_imag_(m-1).GetM() > 0) 01102 { 01103 int p = this->val_imag_(m-1).GetM(); 01104 if (this->val_imag_(m-1).Index(p-1) == n-1) 01105 presence_last_elt = true; 01106 } 01107 01108 if (!presence_last_elt) 01109 { 01110 complex<T> zero; 01111 SetComplexZero(zero); 01112 FileStream << this->m_ << " " << this->n_ << " " << zero << '\n'; 01113 } 01114 } 01115 } 01116 01117 01119 01123 template <class T, class Prop, class Storage, class Allocator> 01124 void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 01125 ::Read(string FileName) 01126 { 01127 ifstream FileStream; 01128 FileStream.open(FileName.c_str()); 01129 01130 #ifdef SELDON_CHECK_IO 01131 // Checks if the file was opened. 01132 if (!FileStream.is_open()) 01133 throw IOError("Matrix_ArrayComplexSparse::Read(string FileName)", 01134 string("Unable to open file \"") + FileName + "\"."); 01135 #endif 01136 01137 this->Read(FileStream); 01138 01139 FileStream.close(); 01140 } 01141 01142 01144 01148 template <class T, class Prop, class Storage, class Allocator> 01149 void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 01150 ::Read(istream& FileStream) 01151 { 01152 01153 #ifdef SELDON_CHECK_IO 01154 // Checks if the stream is ready. 01155 if (!FileStream.good()) 01156 throw IOError("Matrix_ArraySparse::Read(ofstream& FileStream)", 01157 "Stream is not ready."); 01158 #endif 01159 01160 FileStream.read(reinterpret_cast<char*>(const_cast<int*>(&this->m_)), 01161 sizeof(int)); 01162 01163 FileStream.read(reinterpret_cast<char*>(const_cast<int*>(&this->n_)), 01164 sizeof(int)); 01165 01166 val_real_.Reallocate(Storage::GetFirst(this->m_, this->n_)); 01167 val_imag_.Reallocate(Storage::GetFirst(this->m_, this->n_)); 01168 for (int i = 0; i < val_real_.GetM(); i++) 01169 { 01170 val_real_(i).Read(FileStream); 01171 val_imag_(i).Read(FileStream); 01172 } 01173 01174 #ifdef SELDON_CHECK_IO 01175 // Checks if data was read. 01176 if (!FileStream.good()) 01177 throw IOError("Matrix_ArraySparse::Read(istream& FileStream)", 01178 string("Input operation failed.") 01179 + string(" The input file may have been removed") 01180 + " or may not contain enough data."); 01181 #endif 01182 01183 } 01184 01185 01187 01191 template <class T, class Prop, class Storage, class Allocator> 01192 void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 01193 ::ReadText(string FileName) 01194 { 01195 ifstream FileStream; 01196 FileStream.open(FileName.c_str()); 01197 01198 #ifdef SELDON_CHECK_IO 01199 // Checks if the file was opened. 01200 if (!FileStream.is_open()) 01201 throw IOError("Matrix_ArraySparse::ReadText(string FileName)", 01202 string("Unable to open file \"") + FileName + "\"."); 01203 #endif 01204 01205 this->ReadText(FileStream); 01206 01207 FileStream.close(); 01208 } 01209 01210 01212 01216 template <class T, class Prop, class Storage, class Allocator> 01217 void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator> 01218 ::ReadText(istream& FileStream) 01219 { 01220 Matrix<T, Prop, Storage, Allocator>& leaf_class = 01221 static_cast<Matrix<T, Prop, Storage, Allocator>& >(*this); 01222 01223 complex<T> zero; int index = 1; 01224 ReadCoordinateMatrix(leaf_class, FileStream, zero, index); 01225 } 01226 01227 01229 01235 template <class T, class Prop, class Storage, class Allocator> 01236 void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>::Assemble() 01237 { 01238 for (int i = 0; i < Storage::GetFirst(this->m_, this->n_); i++) 01239 { 01240 val_real_(i).Assemble(); 01241 val_imag_(i).Assemble(); 01242 } 01243 } 01244 01245 01247 template <class T, class Prop, class Storage, class Allocator> 01248 inline void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 01249 SetIdentity() 01250 { 01251 this->n_ = this->m_; 01252 for (int i = 0; i < this->m_; i++) 01253 { 01254 val_real_(i).Reallocate(1); 01255 val_real_(i).Index(0) = i; 01256 val_real_(i).Value(0) = T(1); 01257 } 01258 } 01259 01260 01262 template <class T, class Prop, class Storage, class Allocator> 01263 inline void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>::Zero() 01264 { 01265 for (int i = 0; i < Storage::GetFirst(this->m_, this->n_); i++) 01266 { 01267 val_real_(i).Zero(); 01268 val_imag_(i).Zero(); 01269 } 01270 } 01271 01272 01274 template <class T, class Prop, class Storage, class Allocator> 01275 inline void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>::Fill() 01276 { 01277 int value = 0; 01278 for (int i = 0; i < Storage::GetFirst(this->m_, this->n_); i++) 01279 { 01280 for (int j = 0; j < val_real_(i).GetM(); j++) 01281 val_real_(i).Value(j) = value++; 01282 01283 for (int j = 0; j < val_imag_(i).GetM(); j++) 01284 val_imag_(i).Value(j) = value++; 01285 } 01286 } 01287 01288 01290 01294 template <class T, class Prop, class Storage, class Allo> template<class T0> 01295 inline void Matrix_ArrayComplexSparse<T, Prop, Storage, Allo>:: 01296 Fill(const complex<T0>& x) 01297 { 01298 for (int i = 0; i < Storage::GetFirst(this->m_, this->n_); i++) 01299 { 01300 val_real_(i).Fill(real(x)); 01301 val_imag_(i).Fill(imag(x)); 01302 } 01303 } 01304 01305 01307 template <class T, class Prop, class Storage, class Allocator> 01308 template <class T0> 01309 inline Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>& 01310 Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>::operator= 01311 (const complex<T0>& x) 01312 { 01313 this->Fill(x); 01314 } 01315 01316 01318 template <class T, class Prop, class Storage, class Allocator> 01319 inline void Matrix_ArrayComplexSparse<T, Prop, Storage, Allocator>:: 01320 FillRand() 01321 { 01322 for (int i = 0; i < Storage::GetFirst(this->m_, this->n_); i++) 01323 { 01324 val_real_(i).FillRand(); 01325 val_imag_(i).FillRand(); 01326 } 01327 } 01328 01329 01331 // MATRIX<ARRAY_COLCOMPLEXSPARSE> // 01333 01334 01336 01339 template <class T, class Prop, class Allocator> 01340 inline Matrix<T, Prop, ArrayColComplexSparse, Allocator>::Matrix(): 01341 Matrix_ArrayComplexSparse<T, Prop, ArrayColComplexSparse, Allocator>() 01342 { 01343 } 01344 01345 01347 01352 template <class T, class Prop, class Allocator> 01353 inline Matrix<T, Prop, ArrayColComplexSparse, Allocator> 01354 ::Matrix(int i, int j) : 01355 Matrix_ArrayComplexSparse<T, Prop, ArrayColComplexSparse, Allocator>(i, j) 01356 { 01357 } 01358 01359 01361 template <class T, class Prop, class Allocator> 01362 inline void Matrix<T, Prop, ArrayColComplexSparse, Allocator> 01363 ::ClearRealColumn(int i) 01364 { 01365 this->val_real_(i).Clear(); 01366 } 01367 01368 01370 template <class T, class Prop, class Allocator> 01371 inline void Matrix<T, Prop, ArrayColComplexSparse, Allocator> 01372 ::ClearImagColumn(int i) 01373 { 01374 this->val_imag_(i).Clear(); 01375 } 01376 01377 01379 01383 template <class T, class Prop, class Alloc> inline 01384 void Matrix<T, Prop, ArrayColComplexSparse, Alloc> 01385 ::ReallocateRealColumn(int i, int j) 01386 { 01387 this->val_real_(i).Reallocate(j); 01388 } 01389 01390 01392 01396 template <class T, class Prop, class Alloc> inline 01397 void Matrix<T, Prop, ArrayColComplexSparse, Alloc> 01398 ::ReallocateImagColumn(int i, int j) 01399 { 01400 this->val_imag_(i).Reallocate(j); 01401 } 01402 01403 01405 01409 template <class T, class Prop, class Allocator> inline 01410 void Matrix<T, Prop, ArrayColComplexSparse, Allocator> 01411 ::ResizeRealColumn(int i, int j) 01412 { 01413 this->val_real_(i).Resize(j); 01414 } 01415 01416 01418 01422 template <class T, class Prop, class Allocator> inline 01423 void Matrix<T, Prop, ArrayColComplexSparse, Allocator> 01424 ::ResizeImagColumn(int i, int j) 01425 { 01426 this->val_imag_(i).Resize(j); 01427 } 01428 01429 01431 01435 template <class T, class Prop, class Allocator> inline 01436 void Matrix<T, Prop, ArrayColComplexSparse, Allocator> 01437 ::SwapRealColumn(int i, int j) 01438 { 01439 Swap(this->val_real_(i), this->val_real_(j)); 01440 } 01441 01442 01444 01448 template <class T, class Prop, class Allocator> inline 01449 void Matrix<T, Prop, ArrayColComplexSparse, Allocator> 01450 ::SwapImagColumn(int i, int j) 01451 { 01452 Swap(this->val_imag_(i), this->val_imag_(j)); 01453 } 01454 01455 01457 01461 template <class T, class Prop, class Allocator> 01462 inline void Matrix<T, Prop, ArrayColComplexSparse, Allocator>:: 01463 ReplaceRealIndexColumn(int i, IVect& new_index) 01464 { 01465 for (int j = 0; j < this->val_real_(i).GetM(); j++) 01466 this->val_real_(i).Index(j) = new_index(j); 01467 } 01468 01469 01471 01475 template <class T, class Prop, class Allocator> 01476 inline void Matrix<T, Prop, ArrayColComplexSparse, Allocator>:: 01477 ReplaceImagIndexColumn(int i, IVect& new_index) 01478 { 01479 for (int j = 0; j < this->val_imag_(i).GetM(); j++) 01480 this->val_imag_(i).Index(j) = new_index(j); 01481 } 01482 01483 01485 01489 template <class T, class Prop, class Allocator> 01490 inline int Matrix<T, Prop, ArrayColComplexSparse, Allocator>:: 01491 GetRealColumnSize(int i) const 01492 { 01493 return this->val_real_(i).GetSize(); 01494 } 01495 01496 01498 01502 template <class T, class Prop, class Allocator> 01503 inline int Matrix<T, Prop, ArrayColComplexSparse, Allocator>:: 01504 GetImagColumnSize(int i) const 01505 { 01506 return this->val_imag_(i).GetSize(); 01507 } 01508 01509 01511 template <class T, class Prop, class Allocator> inline 01512 void Matrix<T, Prop, ArrayColComplexSparse, Allocator> 01513 ::PrintRealColumn(int i) const 01514 { 01515 this->val_real_(i).Print(); 01516 } 01517 01518 01520 template <class T, class Prop, class Allocator> inline 01521 void Matrix<T, Prop, ArrayColComplexSparse, Allocator> 01522 ::PrintImagColumn(int i) const 01523 { 01524 this->val_imag_(i).Print(); 01525 } 01526 01527 01529 01534 template <class T, class Prop, class Allocator> inline 01535 void Matrix<T, Prop, ArrayColComplexSparse, Allocator> 01536 ::AssembleRealColumn(int i) 01537 { 01538 this->val_real_(i).Assemble(); 01539 } 01540 01541 01543 01548 template <class T, class Prop, class Allocator> inline 01549 void Matrix<T, Prop, ArrayColComplexSparse, Allocator> 01550 ::AssembleImagColumn(int i) 01551 { 01552 this->val_imag_(i).Assemble(); 01553 } 01554 01555 01557 01562 template <class T, class Prop, class Allocator> 01563 inline void Matrix<T, Prop, ArrayColComplexSparse, Allocator>:: 01564 AddInteraction(int i, int j, const complex<T>& val) 01565 { 01566 if (real(val) != T(0)) 01567 this->val_real_(j).AddInteraction(i, real(val)); 01568 01569 if (imag(val) != T(0)) 01570 this->val_imag_(j).AddInteraction(i, imag(val)); 01571 } 01572 01573 01575 01581 template <class T, class Prop, class Allocator> template <class Alloc1> 01582 inline void Matrix<T, Prop, ArrayColComplexSparse, Allocator>:: 01583 AddInteractionRow(int i, int nb, const IVect& col, 01584 const Vector<complex<T>, VectFull, Alloc1>& val) 01585 { 01586 for (int j = 0; j < nb; j++) 01587 AddInteraction(i, col(j), val(j)); 01588 } 01589 01590 01592 01598 template <class T, class Prop, class Allocator> template <class Alloc1> 01599 inline void Matrix<T, Prop, ArrayColComplexSparse, Allocator>:: 01600 AddInteractionColumn(int i, int nb, const IVect& row, 01601 const Vector<complex<T>, VectFull, Alloc1>& val) 01602 { 01603 int nb_real = 0; 01604 int nb_imag = 0; 01605 IVect row_real(nb), row_imag(nb); 01606 Vector<T> val_real(nb), val_imag(nb); 01607 for (int j = 0; j < nb; j++) 01608 { 01609 if (real(val(j)) != T(0)) 01610 { 01611 row_real(nb_real) = row(j); 01612 val_real(nb_real) = real(val(j)); 01613 nb_real++; 01614 } 01615 01616 if (imag(val(j)) != T(0)) 01617 { 01618 row_imag(nb_imag) = row(j); 01619 val_imag(nb_imag) = imag(val(j)); 01620 nb_imag++; 01621 } 01622 } 01623 01624 this->val_real_(i).AddInteractionRow(nb_real, row_real, val_real); 01625 this->val_imag_(i).AddInteractionRow(nb_imag, row_imag, val_imag); 01626 } 01627 01628 01630 // MATRIX<ARRAY_ROWCOMPLEXSPARSE> // 01632 01633 01635 01638 template <class T, class Prop, class Allocator> 01639 inline Matrix<T, Prop, ArrayRowComplexSparse, Allocator>::Matrix(): 01640 Matrix_ArrayComplexSparse<T, Prop, ArrayRowComplexSparse, Allocator>() 01641 { 01642 } 01643 01644 01646 01651 template <class T, class Prop, class Allocator> 01652 inline Matrix<T, Prop, ArrayRowComplexSparse, Allocator> 01653 ::Matrix(int i, int j): 01654 Matrix_ArrayComplexSparse<T, Prop, ArrayRowComplexSparse, Allocator>(i, j) 01655 { 01656 } 01657 01658 01660 template <class T, class Prop, class Allocator> 01661 inline void Matrix<T, Prop, ArrayRowComplexSparse, Allocator> 01662 ::ClearRealRow(int i) 01663 { 01664 this->val_real_(i).Clear(); 01665 } 01666 01667 01669 template <class T, class Prop, class Allocator> 01670 inline void Matrix<T, Prop, ArrayRowComplexSparse, Allocator> 01671 ::ClearImagRow(int i) 01672 { 01673 this->val_imag_(i).Clear(); 01674 } 01675 01676 01678 01683 template <class T, class Prop, class Allocator> 01684 inline void Matrix<T, Prop, ArrayRowComplexSparse, Allocator>:: 01685 ReallocateRealRow(int i, int j) 01686 { 01687 this->val_real_(i).Reallocate(j); 01688 } 01689 01690 01692 01697 template <class T, class Prop, class Allocator> 01698 inline void Matrix<T, Prop, ArrayRowComplexSparse, Allocator>:: 01699 ReallocateImagRow(int i, int j) 01700 { 01701 this->val_imag_(i).Reallocate(j); 01702 } 01703 01704 01706 01711 template <class T, class Prop, class Allocator> inline 01712 void Matrix<T, Prop, ArrayRowComplexSparse, Allocator> 01713 ::ResizeRealRow(int i, int j) 01714 { 01715 this->val_real_(i).Resize(j); 01716 } 01717 01718 01720 01725 template <class T, class Prop, class Allocator> inline 01726 void Matrix<T, Prop, ArrayRowComplexSparse, Allocator> 01727 ::ResizeImagRow(int i, int j) 01728 { 01729 this->val_imag_(i).Resize(j); 01730 } 01731 01732 01734 01738 template <class T, class Prop, class Allocator> 01739 inline void Matrix<T, Prop, ArrayRowComplexSparse, Allocator> 01740 ::SwapRealRow(int i,int j) 01741 { 01742 Swap(this->val_real_(i), this->val_real_(j)); 01743 } 01744 01745 01747 01751 template <class T, class Prop, class Allocator> 01752 inline void Matrix<T, Prop, ArrayRowComplexSparse, Allocator> 01753 ::SwapImagRow(int i, int j) 01754 { 01755 Swap(this->val_imag_(i), this->val_imag_(j)); 01756 } 01757 01758 01760 01764 template <class T, class Prop, class Allocator> 01765 inline void Matrix<T, Prop, ArrayRowComplexSparse, Allocator>:: 01766 ReplaceRealIndexRow(int i, IVect& new_index) 01767 { 01768 for (int j = 0; j < this->val_real_(i).GetM(); j++) 01769 this->val_real_(i).Index(j) = new_index(j); 01770 } 01771 01772 01774 01778 template <class T, class Prop, class Allocator> 01779 inline void Matrix<T, Prop, ArrayRowComplexSparse, Allocator>:: 01780 ReplaceImagIndexRow(int i, IVect& new_index) 01781 { 01782 for (int j = 0; j < this->val_imag_(i).GetM(); j++) 01783 this->val_imag_(i).Index(j) = new_index(j); 01784 } 01785 01786 01788 01792 template <class T, class Prop, class Allocator> inline 01793 int Matrix<T, Prop, ArrayRowComplexSparse, Allocator> 01794 ::GetRealRowSize(int i) const 01795 { 01796 return this->val_real_(i).GetSize(); 01797 } 01798 01799 01801 01805 template <class T, class Prop, class Allocator> inline 01806 int Matrix<T, Prop, ArrayRowComplexSparse, Allocator> 01807 ::GetImagRowSize(int i) const 01808 { 01809 return this->val_imag_(i).GetSize(); 01810 } 01811 01812 01814 template <class T, class Prop, class Allocator> inline 01815 void Matrix<T, Prop, ArrayRowComplexSparse, Allocator> 01816 ::PrintRealRow(int i) const 01817 { 01818 this->val_real_(i).Print(); 01819 } 01820 01821 01823 template <class T, class Prop, class Allocator> inline 01824 void Matrix<T, Prop, ArrayRowComplexSparse, Allocator> 01825 ::PrintImagRow(int i) const 01826 { 01827 this->val_imag_(i).Print(); 01828 } 01829 01830 01832 01837 template <class T, class Prop, class Allocator> 01838 inline void Matrix<T, Prop, ArrayRowComplexSparse, Allocator> 01839 ::AssembleRealRow(int i) 01840 { 01841 this->val_real_(i).Assemble(); 01842 } 01843 01844 01846 01851 template <class T, class Prop, class Allocator> 01852 inline void Matrix<T, Prop, ArrayRowComplexSparse, Allocator> 01853 ::AssembleImagRow(int i) 01854 { 01855 this->val_imag_(i).Assemble(); 01856 } 01857 01858 01860 01865 template <class T, class Prop, class Allocator> 01866 inline void Matrix<T, Prop, ArrayRowComplexSparse, Allocator>:: 01867 AddInteraction(int i, int j, const complex<T>& val) 01868 { 01869 if (real(val) != T(0)) 01870 this->val_real_(i).AddInteraction(j, real(val)); 01871 01872 if (imag(val) != T(0)) 01873 this->val_imag_(i).AddInteraction(j, imag(val)); 01874 } 01875 01876 01878 01884 template <class T, class Prop, class Allocator> template <class Alloc1> 01885 inline void Matrix<T, Prop, ArrayRowComplexSparse, Allocator>:: 01886 AddInteractionRow(int i, int nb, const IVect& col, 01887 const Vector<complex<T>, VectFull, Alloc1>& val) 01888 { 01889 if (nb <= 0) 01890 return; 01891 01892 int nb_real = 0; 01893 int nb_imag = 0; 01894 IVect col_real(nb), col_imag(nb); 01895 Vector<T> val_real(nb), val_imag(nb); 01896 for (int j = 0; j < nb; j++) 01897 { 01898 if (real(val(j)) != T(0)) 01899 { 01900 col_real(nb_real) = col(j); 01901 val_real(nb_real) = real(val(j)); 01902 nb_real++; 01903 } 01904 01905 if (imag(val(j)) != T(0)) 01906 { 01907 col_imag(nb_imag) = col(j); 01908 val_imag(nb_imag) = imag(val(j)); 01909 nb_imag++; 01910 } 01911 } 01912 01913 this->val_real_(i).AddInteractionRow(nb_real, col_real, val_real); 01914 this->val_imag_(i).AddInteractionRow(nb_imag, col_imag, val_imag); 01915 } 01916 01917 01919 01925 template <class T, class Prop, class Allocator> template <class Alloc1> 01926 inline void Matrix<T, Prop, ArrayRowComplexSparse, Allocator>:: 01927 AddInteractionColumn(int i, int nb, const IVect& row, 01928 const Vector<complex<T>, VectFull, Alloc1>& val) 01929 { 01930 for (int j = 0; j < nb; j++) 01931 AddInteraction(row(j), i, val(j)); 01932 } 01933 01934 01936 // MATRIX<ARRAY_COLSYMCOMPLEXSPARSE> // 01938 01939 01941 01944 template <class T, class Prop, class Allocator> 01945 inline Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>::Matrix(): 01946 Matrix_ArrayComplexSparse<T, Prop, ArrayColSymComplexSparse, Allocator>() 01947 { 01948 } 01949 01950 01952 01957 template <class T, class Prop, class Allocator> 01958 inline Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>::Matrix(int i, int j): 01959 Matrix_ArrayComplexSparse<T, Prop, ArrayColSymComplexSparse, Allocator>(i, j) 01960 { 01961 } 01962 01963 01964 /********************************** 01965 * ELEMENT ACCESS AND AFFECTATION * 01966 **********************************/ 01967 01968 01970 01976 template <class T, class Prop, class Allocator> 01977 inline complex<T> 01978 Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>::operator() (int i, int j) 01979 const 01980 { 01981 #ifdef SELDON_CHECK_BOUNDS 01982 if (i < 0 || i >= this->m_) 01983 throw WrongRow("Matrix::operator()", "Index should be in [0, " 01984 + to_str(this->m_-1) + "], but is equal to " 01985 + to_str(i) + "."); 01986 if (j < 0 || j >= this->n_) 01987 throw WrongCol("Matrix::operator()", "Index should be in [0, " 01988 + to_str(this->n_-1) + "], but is equal to " 01989 + to_str(j) + "."); 01990 #endif 01991 01992 if (i <= j) 01993 return complex<T>(this->val_real_(j)(i), this->val_imag_(j)(i)); 01994 01995 return complex<T>(this->val_real_(i)(j), this->val_imag_(i)(j)); 01996 } 01997 01998 02000 02005 template <class T, class Prop, class Allocator> 02006 inline T& 02007 Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>::ValReal(int i, int j) 02008 { 02009 #ifdef SELDON_CHECK_BOUNDS 02010 if (i < 0 || i >= this->m_) 02011 throw WrongRow("Matrix::ValReal", "Index should be in [0, " 02012 + to_str(this->m_-1) + "], but is equal to " 02013 + to_str(i) + "."); 02014 if (j < 0 || j >= this->n_) 02015 throw WrongCol("Matrix::ValReal", "Index should be in [0, " 02016 + to_str(this->n_-1) + "], but is equal to " 02017 + to_str(j) + "."); 02018 if (i > j) 02019 throw WrongArgument("Matrix::ValReal()", 02020 string("With this function, you ") 02021 + "can only access upper part of matrix."); 02022 #endif 02023 02024 return this->val_real_(j).Val(i); 02025 } 02026 02027 02029 02035 template <class T, class Prop, class Allocator> 02036 inline const T& 02037 Matrix<T, Prop, ArrayColSymComplexSparse, Allocator> 02038 ::ValReal(int i, int j) const 02039 { 02040 #ifdef SELDON_CHECK_BOUNDS 02041 if (i < 0 || i >= this->m_) 02042 throw WrongRow("Matrix::ValReal", "Index should be in [0, " 02043 + to_str(this->m_-1) + "], but is equal to " 02044 + to_str(i) + "."); 02045 if (j < 0 || j >= this->n_) 02046 throw WrongCol("Matrix::ValReal", "Index should be in [0, " 02047 + to_str(this->n_-1) + "], but is equal to " 02048 + to_str(j) + "."); 02049 if (i > j) 02050 throw WrongArgument("Matrix::ValReal()", 02051 string("With this function, you ") 02052 + "can only access upper part of matrix."); 02053 #endif 02054 02055 return this->val_real_(j).Val(i); 02056 } 02057 02058 02060 02066 template <class T, class Prop, class Allocator> 02067 inline T& 02068 Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>::GetReal(int i, int j) 02069 { 02070 #ifdef SELDON_CHECK_BOUNDS 02071 if (i < 0 || i >= this->m_) 02072 throw WrongRow("Matrix::GetReal", "Index should be in [0, " 02073 + to_str(this->m_-1) + "], but is equal to " 02074 + to_str(i) + "."); 02075 if (j < 0 || j >= this->n_) 02076 throw WrongCol("Matrix::GetReal", "Index should be in [0, " 02077 + to_str(this->n_-1) + "], but is equal to " 02078 + to_str(j) + "."); 02079 #endif 02080 02081 if (i <= j) 02082 return this->val_real_(j).Get(i); 02083 02084 return this->val_real_(i).Get(j); 02085 } 02086 02087 02089 02095 template <class T, class Prop, class Allocator> 02096 inline const T& 02097 Matrix<T, Prop, ArrayColSymComplexSparse, Allocator> 02098 ::GetReal(int i, int j) const 02099 { 02100 #ifdef SELDON_CHECK_BOUNDS 02101 if (i < 0 || i >= this->m_) 02102 throw WrongRow("Matrix::GetReal", "Index should be in [0, " 02103 + to_str(this->m_-1) + "], but is equal to " 02104 + to_str(i) + "."); 02105 if (j < 0 || j >= this->n_) 02106 throw WrongCol("Matrix::GetReal", "Index should be in [0, " 02107 + to_str(this->n_-1) + "], but is equal to " 02108 + to_str(j) + "."); 02109 #endif 02110 02111 if (i <= j) 02112 return this->val_real_(j).Get(i); 02113 02114 return this->val_real_(i).Get(j); 02115 } 02116 02117 02119 02125 template <class T, class Prop, class Allocator> 02126 inline T& 02127 Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>::ValImag(int i, int j) 02128 { 02129 #ifdef SELDON_CHECK_BOUNDS 02130 if (i < 0 || i >= this->m_) 02131 throw WrongRow("Matrix::ValImag", "Index should be in [0, " 02132 + to_str(this->m_-1) + "], but is equal to " 02133 + to_str(i) + "."); 02134 if (j < 0 || j >= this->n_) 02135 throw WrongCol("Matrix::ValImag", "Index should be in [0, " 02136 + to_str(this->n_-1) + "], but is equal to " 02137 + to_str(j) + "."); 02138 if (i > j) 02139 throw WrongArgument("Matrix::ValImag()", 02140 string("With this function, you ") 02141 + "can only access upper part of matrix."); 02142 #endif 02143 02144 return this->val_imag_(j).Val(i); 02145 } 02146 02147 02149 02154 template <class T, class Prop, class Allocator> 02155 inline const T& 02156 Matrix<T, Prop, ArrayColSymComplexSparse, Allocator> 02157 ::ValImag(int i, int j) const 02158 { 02159 #ifdef SELDON_CHECK_BOUNDS 02160 if (i < 0 || i >= this->m_) 02161 throw WrongRow("Matrix::ValImag", "Index should be in [0, " 02162 + to_str(this->m_-1) + "], but is equal to " 02163 + to_str(i) + "."); 02164 if (j < 0 || j >= this->n_) 02165 throw WrongCol("Matrix::ValImag", "Index should be in [0, " 02166 + to_str(this->n_-1) + "], but is equal to " 02167 + to_str(j) + "."); 02168 if (i > j) 02169 throw WrongArgument("Matrix::ValImag()", 02170 string("With this function, you ") 02171 + "can only access upper part of matrix."); 02172 #endif 02173 02174 return this->val_imag_(j).Val(i); 02175 } 02176 02177 02179 02184 template <class T, class Prop, class Allocator> 02185 inline T& 02186 Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>::GetImag(int i, int j) 02187 { 02188 #ifdef SELDON_CHECK_BOUNDS 02189 if (i < 0 || i >= this->m_) 02190 throw WrongRow("Matrix::GetImag", "Index should be in [0, " 02191 + to_str(this->m_-1) + "], but is equal to " 02192 + to_str(i) + "."); 02193 if (j < 0 || j >= this->n_) 02194 throw WrongCol("Matrix::GetImag", "Index should be in [0, " 02195 + to_str(this->n_-1) + "], but is equal to " 02196 + to_str(j) + "."); 02197 #endif 02198 02199 if (i <= j) 02200 return this->val_imag_(j).Get(i); 02201 02202 return this->val_imag_(i).Get(j); 02203 } 02204 02205 02207 02212 template <class T, class Prop, class Allocator> 02213 inline const T& 02214 Matrix<T, Prop, ArrayColSymComplexSparse, Allocator> 02215 ::GetImag(int i, int j) const 02216 { 02217 #ifdef SELDON_CHECK_BOUNDS 02218 if (i < 0 || i >= this->m_) 02219 throw WrongRow("Matrix::GetImag", "Index should be in [0, " 02220 + to_str(this->m_-1) + "], but is equal to " 02221 + to_str(i) + "."); 02222 if (j < 0 || j >= this->n_) 02223 throw WrongCol("Matrix::GetImag", "Index should be in [0, " 02224 + to_str(this->n_-1) + "], but is equal to " 02225 + to_str(j) + "."); 02226 #endif 02227 02228 if (i <= j) 02229 return this->val_imag_(j).Val(i); 02230 02231 return this->val_imag_(i).Val(j); 02232 } 02233 02234 02236 02241 template <class T, class Prop, class Allocator> 02242 inline void Matrix<T, Prop, ArrayColSymComplexSparse, Allocator> 02243 ::Set(int i, int j, const complex<T>& x) 02244 { 02245 if (i <= j) 02246 { 02247 if (real(x) != T(0)) 02248 this->val_real_(j).Get(i) = real(x); 02249 else 02250 { 02251 if (this->val_real_(j)(i) != T(0)) 02252 this->val_real_(j).Get(i) = T(0); 02253 } 02254 02255 if (imag(x) != T(0)) 02256 this->val_imag_(j).Get(i) = imag(x); 02257 else 02258 { 02259 if (this->val_imag_(j)(i) != T(0)) 02260 this->val_imag_(j).Get(i) = T(0); 02261 } 02262 } 02263 else 02264 { 02265 if (real(x) != T(0)) 02266 this->val_real_(i).Get(j) = real(x); 02267 else 02268 { 02269 if (this->val_real_(i)(j) != T(0)) 02270 this->val_real_(i).Get(j) = T(0); 02271 } 02272 02273 if (imag(x) != T(0)) 02274 this->val_imag_(i).Get(j) = imag(x); 02275 else 02276 { 02277 if (this->val_imag_(i)(j) != T(0)) 02278 this->val_imag_(i).Get(j) = T(0); 02279 } 02280 } 02281 } 02282 02283 02285 template <class T, class Prop, class Allocator> inline 02286 void Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>::ClearRealColumn(int i) 02287 { 02288 this->val_real_(i).Clear(); 02289 } 02290 02291 02293 template <class T, class Prop, class Allocator> inline 02294 void Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>::ClearImagColumn(int i) 02295 { 02296 this->val_imag_(i).Clear(); 02297 } 02298 02299 02301 02306 template <class T, class Prop, class Allocator> 02307 inline void Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>:: 02308 ReallocateRealColumn(int i, int j) 02309 { 02310 this->val_real_(i).Reallocate(j); 02311 } 02312 02313 02315 02320 template <class T, class Prop, class Allocator> 02321 inline void Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>:: 02322 ReallocateImagColumn(int i, int j) 02323 { 02324 this->val_imag_(i).Reallocate(j); 02325 } 02326 02327 02329 02333 template <class T, class Prop, class Allocator> 02334 inline void Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>:: 02335 ResizeRealColumn(int i, int j) 02336 { 02337 this->val_real_(i).Resize(j); 02338 } 02339 02340 02342 02346 template <class T, class Prop, class Allocator> 02347 inline void Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>:: 02348 ResizeImagColumn(int i, int j) 02349 { 02350 this->val_imag_(i).Resize(j); 02351 } 02352 02353 02355 02359 template <class T, class Prop, class Allocator> 02360 inline void Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>:: 02361 SwapRealColumn(int i, int j) 02362 { 02363 Swap(this->val_real_(i), this->val_real_(j)); 02364 } 02365 02366 02368 02372 template <class T, class Prop, class Allocator> 02373 inline void Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>:: 02374 SwapImagColumn(int i, int j) 02375 { 02376 Swap(this->val_imag_(i), this->val_imag_(j)); 02377 } 02378 02379 02381 02385 template <class T, class Prop, class Allocator> 02386 inline void Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>:: 02387 ReplaceRealIndexColumn(int i, IVect& new_index) 02388 { 02389 for (int j = 0; j < this->val_real_(i).GetM(); j++) 02390 this->val_real_(i).Index(j) = new_index(j); 02391 } 02392 02393 02395 02399 template <class T, class Prop, class Allocator> 02400 inline void Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>:: 02401 ReplaceImagIndexColumn(int i, IVect& new_index) 02402 { 02403 for (int j = 0; j < this->val_imag_(i).GetM(); j++) 02404 this->val_imag_(i).Index(j) = new_index(j); 02405 } 02406 02407 02409 02413 template <class T, class Prop, class Allocator> 02414 inline int Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>:: 02415 GetRealColumnSize(int i) const 02416 { 02417 return this->val_real_(i).GetSize(); 02418 } 02419 02420 02422 02426 template <class T, class Prop, class Allocator> 02427 inline int Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>:: 02428 GetImagColumnSize(int i) const 02429 { 02430 return this->val_imag_(i).GetSize(); 02431 } 02432 02433 02435 template <class T, class Prop, class Allocator> 02436 inline void Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>:: 02437 PrintRealColumn(int i) const 02438 { 02439 this->val_real_(i).Print(); 02440 } 02441 02442 02444 template <class T, class Prop, class Allocator> 02445 inline void Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>:: 02446 PrintImagColumn(int i) const 02447 { 02448 this->val_imag_(i).Print(); 02449 } 02450 02451 02453 02458 template <class T, class Prop, class Allocator> 02459 inline void Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>:: 02460 AssembleRealColumn(int i) 02461 { 02462 this->val_real_(i).Assemble(); 02463 } 02464 02465 02467 02472 template <class T, class Prop, class Allocator> 02473 inline void Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>:: 02474 AssembleImagColumn(int i) 02475 { 02476 this->val_imag_(i).Assemble(); 02477 } 02478 02479 02481 02486 template <class T, class Prop, class Allocator> 02487 inline void Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>:: 02488 AddInteraction(int i, int j, const complex<T>& val) 02489 { 02490 if (i <= j) 02491 { 02492 if (real(val) != T(0)) 02493 this->val_real_(j).AddInteraction(i, real(val)); 02494 02495 if (imag(val) != T(0)) 02496 this->val_imag_(j).AddInteraction(i, imag(val)); 02497 } 02498 } 02499 02500 02502 02508 template <class T, class Prop, class Allocator> template <class Alloc1> 02509 inline void Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>:: 02510 AddInteractionRow(int i, int nb, const IVect& col, 02511 const Vector<complex<T>, VectFull, Alloc1>& val) 02512 { 02513 for (int j = 0; j < nb; j++) 02514 AddInteraction(i, col(j), val(j)); 02515 } 02516 02517 02519 02525 template <class T, class Prop, class Allocator> template <class Alloc1> 02526 inline void Matrix<T, Prop, ArrayColSymComplexSparse, Allocator>:: 02527 AddInteractionColumn(int i, int nb, const IVect& row, 02528 const Vector<complex<T>, VectFull, Alloc1>& val) 02529 { 02530 int nb_real = 0; 02531 int nb_imag = 0; 02532 IVect row_real(nb), row_imag(nb); 02533 Vector<T> val_real(nb), val_imag(nb); 02534 for (int j = 0; j < nb; j++) 02535 if (row(j) <= i) 02536 { 02537 if (real(val(j)) != T(0)) 02538 { 02539 row_real(nb_real) = row(j); 02540 val_real(nb_real) = real(val(j)); 02541 nb_real++; 02542 } 02543 02544 if (imag(val(j)) != T(0)) 02545 { 02546 row_imag(nb_imag) = row(j); 02547 val_imag(nb_imag) = imag(val(j)); 02548 nb_imag++; 02549 } 02550 } 02551 02552 this->val_real_(i).AddInteractionRow(nb_real, row_real, val_real); 02553 this->val_imag_(i).AddInteractionRow(nb_imag, row_imag, val_imag); 02554 } 02555 02556 02558 // MATRIX<ARRAY_ROWSYMCOMPLEXSPARSE> // 02560 02561 02563 02566 template <class T, class Prop, class Allocator> 02567 inline Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator>::Matrix(): 02568 Matrix_ArrayComplexSparse<T, Prop, ArrayRowSymComplexSparse, Allocator>() 02569 { 02570 } 02571 02572 02574 02579 template <class T, class Prop, class Allocator> 02580 inline Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator> 02581 ::Matrix(int i, int j): 02582 Matrix_ArrayComplexSparse<T, Prop, ArrayRowSymComplexSparse, Allocator>(i, j) 02583 { 02584 } 02585 02586 02587 /********************************** 02588 * ELEMENT ACCESS AND AFFECTATION * 02589 **********************************/ 02590 02591 02593 02599 template <class T, class Prop, class Allocator> 02600 inline complex<T> 02601 Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator>::operator() (int i, int j) 02602 const 02603 { 02604 02605 #ifdef SELDON_CHECK_BOUNDS 02606 if (i < 0 || i >= this->m_) 02607 throw WrongRow("Matrix_ArraySparse::operator()", "Index should be in [0, " 02608 + to_str(this->m_-1) + "], but is equal to " 02609 + to_str(i) + "."); 02610 if (j < 0 || j >= this->n_) 02611 throw WrongCol("Matrix_ArraySparse::operator()", "Index should be in [0, " 02612 + to_str(this->n_-1) + "], but is equal to " 02613 + to_str(j) + "."); 02614 #endif 02615 02616 if (i <= j) 02617 return complex<T>(this->val_real_(i)(j), this->val_imag_(i)(j)); 02618 02619 return complex<T>(this->val_real_(j)(i), this->val_imag_(j)(i)); 02620 } 02621 02622 02624 02629 template <class T, class Prop, class Allocator> 02630 inline T& 02631 Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator>::ValReal(int i, int j) 02632 { 02633 #ifdef SELDON_CHECK_BOUNDS 02634 if (i < 0 || i >= this->m_) 02635 throw WrongRow("Matrix::ValReal", "Index should be in [0, " 02636 + to_str(this->m_-1) + "], but is equal to " 02637 + to_str(i) + "."); 02638 if (j < 0 || j >= this->n_) 02639 throw WrongCol("Matrix::ValReal", "Index should be in [0, " 02640 + to_str(this->n_-1) + "], but is equal to " 02641 + to_str(j) + "."); 02642 if (i > j) 02643 throw WrongArgument("Matrix::ValReal()", 02644 string("With this function, you ") 02645 + "can only access upper part of matrix."); 02646 #endif 02647 02648 return this->val_real_(i).Val(j); 02649 } 02650 02651 02653 02659 template <class T, class Prop, class Allocator> 02660 inline const T& 02661 Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator> 02662 ::ValReal(int i, int j) const 02663 { 02664 #ifdef SELDON_CHECK_BOUNDS 02665 if (i < 0 || i >= this->m_) 02666 throw WrongRow("Matrix::ValReal", "Index should be in [0, " 02667 + to_str(this->m_-1) + "], but is equal to " 02668 + to_str(i) + "."); 02669 if (j < 0 || j >= this->n_) 02670 throw WrongCol("Matrix::ValReal", "Index should be in [0, " 02671 + to_str(this->n_-1) + "], but is equal to " 02672 + to_str(j) + "."); 02673 if (i > j) 02674 throw WrongArgument("Matrix::ValReal()", 02675 string("With this function, you ") 02676 + "can only access upper part of matrix."); 02677 #endif 02678 02679 return this->val_real_(i).Val(j); 02680 } 02681 02682 02684 02690 template <class T, class Prop, class Allocator> 02691 inline T& 02692 Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator>::GetReal(int i, int j) 02693 { 02694 #ifdef SELDON_CHECK_BOUNDS 02695 if (i < 0 || i >= this->m_) 02696 throw WrongRow("Matrix::GetReal", "Index should be in [0, " 02697 + to_str(this->m_-1) + "], but is equal to " 02698 + to_str(i) + "."); 02699 if (j < 0 || j >= this->n_) 02700 throw WrongCol("Matrix::GetReal", "Index should be in [0, " 02701 + to_str(this->n_-1) + "], but is equal to " 02702 + to_str(j) + "."); 02703 #endif 02704 02705 if (i <= j) 02706 return this->val_real_(i).Get(j); 02707 02708 return this->val_real_(j).Get(i); 02709 } 02710 02711 02713 02719 template <class T, class Prop, class Allocator> 02720 inline const T& 02721 Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator> 02722 ::GetReal(int i, int j) const 02723 { 02724 #ifdef SELDON_CHECK_BOUNDS 02725 if (i < 0 || i >= this->m_) 02726 throw WrongRow("Matrix::GetReal", "Index should be in [0, " 02727 + to_str(this->m_-1) + "], but is equal to " 02728 + to_str(i) + "."); 02729 if (j < 0 || j >= this->n_) 02730 throw WrongCol("Matrix::GetReal", "Index should be in [0, " 02731 + to_str(this->n_-1) + "], but is equal to " 02732 + to_str(j) + "."); 02733 #endif 02734 02735 if (i <= j) 02736 return this->val_real_(i).Get(j); 02737 02738 return this->val_real_(j).Get(i); 02739 } 02740 02741 02743 02749 template <class T, class Prop, class Allocator> 02750 inline T& 02751 Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator>::ValImag(int i, int j) 02752 { 02753 #ifdef SELDON_CHECK_BOUNDS 02754 if (i < 0 || i >= this->m_) 02755 throw WrongRow("Matrix::ValImag", "Index should be in [0, " 02756 + to_str(this->m_-1) + "], but is equal to " 02757 + to_str(i) + "."); 02758 if (j < 0 || j >= this->n_) 02759 throw WrongCol("Matrix::ValImag", "Index should be in [0, " 02760 + to_str(this->n_-1) + "], but is equal to " 02761 + to_str(j) + "."); 02762 if (i > j) 02763 throw WrongArgument("Matrix::ValImag()", 02764 string("With this function, you ") 02765 + "can only access upper part of matrix."); 02766 #endif 02767 02768 return this->val_imag_(i).Val(j); 02769 } 02770 02771 02773 02778 template <class T, class Prop, class Allocator> 02779 inline const T& 02780 Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator> 02781 ::ValImag(int i, int j) const 02782 { 02783 #ifdef SELDON_CHECK_BOUNDS 02784 if (i < 0 || i >= this->m_) 02785 throw WrongRow("Matrix::ValImag", "Index should be in [0, " 02786 + to_str(this->m_-1) + "], but is equal to " 02787 + to_str(i) + "."); 02788 if (j < 0 || j >= this->n_) 02789 throw WrongCol("Matrix::ValImag", "Index should be in [0, " 02790 + to_str(this->n_-1) + "], but is equal to " 02791 + to_str(j) + "."); 02792 if (i > j) 02793 throw WrongArgument("Matrix::ValImag()", 02794 string("With this function, you ") 02795 + "can only access upper part of matrix."); 02796 #endif 02797 02798 return this->val_imag_(i).Val(j); 02799 } 02800 02801 02803 02808 template <class T, class Prop, class Allocator> 02809 inline T& 02810 Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator>::GetImag(int i, int j) 02811 { 02812 #ifdef SELDON_CHECK_BOUNDS 02813 if (i < 0 || i >= this->m_) 02814 throw WrongRow("Matrix::GetImag", "Index should be in [0, " 02815 + to_str(this->m_-1) + "], but is equal to " 02816 + to_str(i) + "."); 02817 if (j < 0 || j >= this->n_) 02818 throw WrongCol("Matrix::GetImag", "Index should be in [0, " 02819 + to_str(this->n_-1) + "], but is equal to " 02820 + to_str(j) + "."); 02821 #endif 02822 02823 if (i <= j) 02824 return this->val_imag_(i).Get(j); 02825 02826 return this->val_imag_(j).Get(i); 02827 } 02828 02829 02831 02836 template <class T, class Prop, class Allocator> 02837 inline const T& 02838 Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator> 02839 ::GetImag(int i, int j) const 02840 { 02841 #ifdef SELDON_CHECK_BOUNDS 02842 if (i < 0 || i >= this->m_) 02843 throw WrongRow("Matrix::GetImag", "Index should be in [0, " 02844 + to_str(this->m_-1) + "], but is equal to " 02845 + to_str(i) + "."); 02846 if (j < 0 || j >= this->n_) 02847 throw WrongCol("Matrix::GetImag", "Index should be in [0, " 02848 + to_str(this->n_-1) + "], but is equal to " 02849 + to_str(j) + "."); 02850 #endif 02851 02852 if (i <= j) 02853 return this->val_imag_(i).Val(j); 02854 02855 return this->val_imag_(j).Val(i); 02856 } 02857 02858 02860 02865 template <class T, class Prop, class Allocator> 02866 inline void Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator> 02867 ::Set(int i, int j, const complex<T>& x) 02868 { 02869 if (i <= j) 02870 { 02871 if (real(x) != T(0)) 02872 this->val_real_(i).Get(j) = real(x); 02873 else 02874 { 02875 if (this->val_real_(i)(j) != T(0)) 02876 this->val_real_(i).Get(j) = T(0); 02877 } 02878 02879 if (imag(x) != T(0)) 02880 this->val_imag_(i).Get(j) = imag(x); 02881 else 02882 { 02883 if (this->val_imag_(i)(j) != T(0)) 02884 this->val_imag_(i).Get(j) = T(0); 02885 } 02886 } 02887 else 02888 { 02889 if (real(x) != T(0)) 02890 this->val_real_(j).Get(i) = real(x); 02891 else 02892 { 02893 if (this->val_real_(j)(i) != T(0)) 02894 this->val_real_(j).Get(i) = T(0); 02895 } 02896 02897 if (imag(x) != T(0)) 02898 this->val_imag_(j).Get(i) = imag(x); 02899 else 02900 { 02901 if (this->val_imag_(j)(i) != T(0)) 02902 this->val_imag_(j).Get(i) = T(0); 02903 } 02904 } 02905 } 02906 02907 02909 template <class T, class Prop, class Allocator> 02910 inline void Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator>::ClearRealRow(int i) 02911 { 02912 this->val_real_(i).Clear(); 02913 } 02914 02915 02917 template <class T, class Prop, class Allocator> 02918 inline void Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator>::ClearImagRow(int i) 02919 { 02920 this->val_imag_(i).Clear(); 02921 } 02922 02923 02925 02930 template <class T, class Prop, class Allocator> 02931 inline void Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator>:: 02932 ReallocateRealRow(int i,int j) 02933 { 02934 this->val_real_(i).Reallocate(j); 02935 } 02936 02937 02939 02944 template <class T, class Prop, class Allocator> 02945 inline void Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator>:: 02946 ReallocateImagRow(int i,int j) 02947 { 02948 this->val_imag_(i).Reallocate(j); 02949 } 02950 02951 02953 02957 template <class T, class Prop, class Allocator> 02958 inline void Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator>:: 02959 ResizeRealRow(int i,int j) 02960 { 02961 this->val_real_(i).Resize(j); 02962 } 02963 02964 02966 02970 template <class T, class Prop, class Allocator> 02971 inline void Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator>:: 02972 ResizeImagRow(int i,int j) 02973 { 02974 this->val_imag_(i).Resize(j); 02975 } 02976 02977 02979 02983 template <class T, class Prop, class Allocator> 02984 inline void Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator>:: 02985 SwapRealRow(int i,int j) 02986 { 02987 Swap(this->val_real_(i), this->val_real_(j)); 02988 } 02989 02990 02992 02996 template <class T, class Prop, class Allocator> 02997 inline void Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator>:: 02998 SwapImagRow(int i,int j) 02999 { 03000 Swap(this->val_imag_(i), this->val_imag_(j)); 03001 } 03002 03003 03005 03009 template <class T, class Prop, class Allocator> 03010 inline void Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator>:: 03011 ReplaceRealIndexRow(int i, IVect& new_index) 03012 { 03013 for (int j = 0; j < this->val_real_(i).GetM(); j++) 03014 this->val_real_(i).Index(j) = new_index(j); 03015 } 03016 03017 03019 03023 template <class T, class Prop, class Allocator> 03024 inline void Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator>:: 03025 ReplaceImagIndexRow(int i,IVect& new_index) 03026 { 03027 for (int j = 0; j < this->val_imag_(i).GetM(); j++) 03028 this->val_imag_(i).Index(j) = new_index(j); 03029 } 03030 03031 03033 03037 template <class T, class Prop, class Allocator> 03038 inline int Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator> 03039 ::GetRealRowSize(int i) 03040 const 03041 { 03042 return this->val_real_(i).GetSize(); 03043 } 03044 03045 03047 03051 template <class T, class Prop, class Allocator> 03052 inline int Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator> 03053 ::GetImagRowSize(int i) const 03054 { 03055 return this->val_imag_(i).GetSize(); 03056 } 03057 03058 03060 template <class T, class Prop, class Allocator> 03061 inline void Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator> 03062 ::PrintRealRow(int i) const 03063 { 03064 this->val_real_(i).Print(); 03065 } 03066 03067 03069 template <class T, class Prop, class Allocator> 03070 inline void Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator> 03071 ::PrintImagRow(int i) const 03072 { 03073 this->val_imag_(i).Print(); 03074 } 03075 03076 03078 03083 template <class T, class Prop, class Allocator> 03084 inline void Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator> 03085 ::AssembleRealRow(int i) 03086 { 03087 this->val_real_(i).Assemble(); 03088 } 03089 03090 03092 03097 template <class T, class Prop, class Allocator> 03098 inline void Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator> 03099 ::AssembleImagRow(int i) 03100 { 03101 this->val_imag_(i).Assemble(); 03102 } 03103 03104 03106 03111 template <class T, class Prop, class Allocator> 03112 inline void Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator>:: 03113 AddInteraction(int i, int j, const complex<T>& val) 03114 { 03115 if (i <= j) 03116 { 03117 if (real(val) != T(0)) 03118 this->val_real_(i).AddInteraction(j, real(val)); 03119 03120 if (imag(val) != T(0)) 03121 this->val_imag_(i).AddInteraction(j, imag(val)); 03122 } 03123 } 03124 03125 03127 03133 template <class T, class Prop, class Allocator> template <class Alloc1> 03134 inline void Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator>:: 03135 AddInteractionRow(int i, int nb, const IVect& col, 03136 const Vector<complex<T>, VectFull, Alloc1>& val) 03137 { 03138 int nb_real = 0; 03139 int nb_imag = 0; 03140 IVect col_real(nb), col_imag(nb); 03141 Vector<T> val_real(nb), val_imag(nb); 03142 for (int j = 0; j < nb; j++) 03143 if (i <= col(j)) 03144 { 03145 if (real(val(j)) != T(0)) 03146 { 03147 col_real(nb_real) = col(j); 03148 val_real(nb_real) = real(val(j)); 03149 nb_real++; 03150 } 03151 03152 if (imag(val(j)) != T(0)) 03153 { 03154 col_imag(nb_imag) = col(j); 03155 val_imag(nb_imag) = imag(val(j)); 03156 nb_imag++; 03157 } 03158 } 03159 03160 this->val_real_(i).AddInteractionRow(nb_real, col_real, val_real); 03161 this->val_imag_(i).AddInteractionRow(nb_imag, col_imag, val_imag); 03162 } 03163 03164 03166 03172 template <class T, class Prop, class Allocator> template <class Alloc1> 03173 inline void Matrix<T, Prop, ArrayRowSymComplexSparse, Allocator>:: 03174 AddInteractionColumn(int i, int nb, const IVect& row, 03175 const Vector<complex<T>, VectFull, Alloc1>& val) 03176 { 03177 for (int j = 0; j < nb; j++) 03178 AddInteraction(row(j), i, val(j)); 03179 } 03180 03181 } // namespace Seldon 03182 03183 #define SELDON_FILE_MATRIX_ARRAY_COMPLEX_SPARSE_CXX 03184 #endif