Changeset 814 in Sophya for trunk/SophyaExt
- Timestamp:
- Apr 5, 2000, 5:45:21 PM (25 years ago)
- Location:
- trunk/SophyaExt/LinAlg
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaExt/LinAlg/intflapack.cc
r788 r814 1 #include <iostream.h> 1 2 #include "intflapack.h" 3 #include <typeinfo> 2 4 3 5 extern "C" { … … 10 12 void zgesv_(int_4* n, int_4* nrhs, complex<r_8>* a, int_4* lda, 11 13 int_4* ipiv, complex<r_8>* b, int_4* ldb, int_4* info); 14 } 15 16 template <class T> 17 TArray<T>& LapackServer<T>::LinSolve(TArray<T>& a, TArray<T> & b) 18 { 19 if ( ( a.NbDimensions() != 2 ) || ( b.NbDimensions() != 2 ) ) 20 throw(SzMismatchError("LapackServer::LinSolve(a,b) a Or b NbDimensions() != 2")); 21 22 uint_4 rowa = a.RowsKA(); 23 uint_4 cola = a.ColsKA(); 24 uint_4 rowb = b.RowsKA(); 25 uint_4 colb = b.ColsKA(); 26 if ( a.Size(rowa) != a.Size(cola)) 27 throw(SzMismatchError("LapackServer::LinSolve(a,b) a Not a square Array")); 28 if ( a.Size(rowa) != b.Size(rowa)) 29 throw(SzMismatchError("LapackServer::LinSolve(a,b) RowSize(a <> b) ")); 30 31 if (!a.IsPacked(rowa) || !b.IsPacked(rowb)) 32 throw(SzMismatchError("LapackServer::LinSolve(a,b) a Or b Not Packed Columns ")); 33 34 int_4 n = a.Size(rowa); 35 int_4 nrhs = b.Size(colb); 36 int_4 lda = a.Step(cola); 37 int_4 ldb = b.Step(colb); 38 int_4 info; 39 int_4* ipiv = new int_4[n]; 40 41 if (typeid(T) == typeid(r_4) ) 42 sgesv_(&n, &nrhs, (r_4 *)a.Data(), &lda, ipiv, (r_4 *)b.Data(), &ldb, &info); 43 else if (typeid(T) == typeid(r_8) ) 44 dgesv_(&n, &nrhs, (r_8 *)a.Data(), &lda, ipiv, (r_8 *)b.Data(), &ldb, &info); 45 else if (typeid(T) == typeid(complex<r_4>) ) 46 cgesv_(&n, &nrhs, (complex<r_4> *)a.Data(), &lda, ipiv, 47 (complex<r_4> *)b.Data(), &ldb, &info); 48 else if (typeid(T) == typeid(complex<r_8>) ) 49 zgesv_(&n, &nrhs, (complex<r_8> *)a.Data(), &lda, ipiv, 50 (complex<r_8> *)b.Data(), &ldb, &info); 51 else { 52 delete[] ipiv; 53 string tn = typeid(T).name(); 54 cerr << " LapackServer::LinSolve(a,b) - Unsupported DataType T = " << tn << endl; 55 throw TypeMismatchExc("LapackServer::LinSolve(a,b) - Unsupported DataType (T)"); 56 } 57 delete[] ipiv; 58 return(b); 12 59 } 13 60 … … 28 75 int_4* ipiv = new int_4[n]; 29 76 sgesv_(&n, &nrhs, aa.Data(), &lda, ipiv, bb.Data(), &ldb, &info); 77 delete[] ipiv; 30 78 cout << "rztest_lapack/Info= " << info << endl; 31 79 cout << aa << "\n" << bb << endl; 32 80 return; 33 81 } 82 83 /////////////////////////////////////////////////////////////// 84 #ifdef __CXX_PRAGMA_TEMPLATES__ 85 #pragma define_template LapackServer<r_4> 86 #pragma define_template LapackServer<r_8> 87 #pragma define_template LapackServer< complex<r_4> > 88 #pragma define_template LapackServer< complex<r_8> > 89 #endif 90 91 #if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES) 92 template class LapackServer<r_4>; 93 template class LapackServer<r_8>; 94 template class LapackServer< complex<r_4> >; 95 template class LapackServer< complex<r_8> >; 96 #endif 97 98 #if defined(OS_LINUX) 99 // Pour le link avec f2c sous Linux 100 extern "C" { 101 void MAIN__(); 102 } 103 104 void MAIN__() 105 { 106 cerr << "MAIN__() function for linking with libf2c.a " << endl; 107 cerr << " This function should never be called !!! " << endl; 108 throw PError("MAIN__() should not be called - see intflapack.cc"); 109 } 110 #endif -
trunk/SophyaExt/LinAlg/intflapack.h
r775 r814 5 5 #include "tarray.h" 6 6 7 namespace SOPHYA { 8 9 template <class T> 10 class LapackServer { 11 public: 12 TArray<T>& LinSolve(TArray<T>& a, TArray<T> & b); 13 }; 14 15 template <class T> 16 inline TArray<T>& LapackLinSolve(TArray<T>& a, TArray<T> & b) 17 { LapackServer<T> lps; return( lps.LinSolve(a, b) ); } 18 19 20 } // Fin du namespace 7 21 8 22 void rztest_lapack(TArray<r_4>& a, TArray<r_4>& b); 9 // void rztest_lapack(TMatrix<r_8>& a, TMatrix<r_8>& b);10 23 11 24 #endif
Note:
See TracChangeset
for help on using the changeset viewer.