Changeset 1494 in Sophya for trunk/SophyaExt/LinAlg
- Timestamp:
- May 15, 2001, 10:16:59 AM (24 years ago)
- Location:
- trunk/SophyaExt/LinAlg
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaExt/LinAlg/intflapack.cc
r1424 r1494 62 62 int_4* ipiv, complex<r_8>* b, int_4* ldb, int_4* info); 63 63 64 // Driver pour resolution de systemes au sens de Xi2 65 void sgels_(char * trans, int_4* m, int_4* n, int_4* nrhs, r_4* a, int_4* lda, 66 r_4* b, int_4* ldb, r_4* work, int_4* lwork, int_4* info); 67 void dgels_(char * trans, int_4* m, int_4* n, int_4* nrhs, r_8* a, int_4* lda, 68 r_8* b, int_4* ldb, r_8* work, int_4* lwork, int_4* info); 69 void cgels_(char * trans, int_4* m, int_4* n, int_4* nrhs, complex<r_4>* a, int_4* lda, 70 complex<r_4>* b, int_4* ldb, complex<r_4>* work, int_4* lwork, int_4* info); 71 void zgels_(char * trans, int_4* m, int_4* n, int_4* nrhs, complex<r_8>* a, int_4* lda, 72 complex<r_8>* b, int_4* ldb, complex<r_8>* work, int_4* lwork, int_4* info); 73 64 74 // Driver pour decomposition SVD 65 75 void sgesvd_(char* jobu, char* jobvt, int_4* m, int_4* n, r_4* a, int_4* lda, … … 143 153 return(info); 144 154 } 155 156 template <class T> 157 int LapackServer<T>::LeastSquareSolve(TArray<T>& a, TArray<T> & b) 158 { 159 if ( ( a.NbDimensions() != 2 ) || ( b.NbDimensions() != 2 ) ) 160 throw(SzMismatchError("LapackServer::LinSolve(a,b) a Or b NbDimensions() != 2")); 161 162 int_4 rowa = a.RowsKA(); 163 int_4 cola = a.ColsKA(); 164 int_4 rowb = b.RowsKA(); 165 int_4 colb = b.ColsKA(); 166 167 168 if ( a.Size(rowa) != b.Size(rowb)) 169 throw(SzMismatchError("LapackServer::LeastSquareSolve(a,b) RowSize(a <> b) ")); 170 171 if (!a.IsPacked(rowa) || !b.IsPacked(rowb)) 172 throw(SzMismatchError("LapackServer::LinSolve(a,b) a Or b Not Column Packed")); 173 174 if ( a.Size(rowa) < a.Size(cola)) 175 throw(SzMismatchError("LapackServer::LeastSquareSolve(a,b) NRows<NCols ")); 176 177 int_4 m = a.Size(rowa); 178 int_4 n = a.Size(cola); 179 int_4 nrhs = b.Size(colb); 180 181 int_4 lda = a.Step(cola); 182 int_4 ldb = b.Step(colb); 183 int_4 info; 184 185 int_4 minmn = (m < n) ? m : n; 186 int_4 maxmn = (m > n) ? m : n; 187 int_4 maxmnrhs = (nrhs > maxmn) ? nrhs : maxmn; 188 if (maxmnrhs < 1) maxmnrhs = 1; 189 190 int_4 lwork = minmn+maxmnrhs*5; 191 T * work = new T[lwork]; 192 193 char trans = 'N'; 194 195 if (typeid(T) == typeid(r_4) ) 196 sgels_(&trans, &m, &n, &nrhs, (r_4 *)a.Data(), &lda, 197 (r_4 *)b.Data(), &ldb, (r_4 *)work, &lwork, &info); 198 else if (typeid(T) == typeid(r_8) ) 199 dgels_(&trans, &m, &n, &nrhs, (r_8 *)a.Data(), &lda, 200 (r_8 *)b.Data(), &ldb, (r_8 *)work, &lwork, &info); 201 else if (typeid(T) == typeid(complex<r_4>) ) 202 cgels_(&trans, &m, &n, &nrhs, (complex<r_4> *)a.Data(), &lda, 203 (complex<r_4> *)b.Data(), &ldb, (complex<r_4> *)work, &lwork, &info); 204 else if (typeid(T) == typeid(complex<r_8>) ) 205 zgels_(&trans, &m, &n, &nrhs, (complex<r_8> *)a.Data(), &lda, 206 (complex<r_8> *)b.Data(), &ldb, (complex<r_8> *)work, &lwork, &info); 207 else { 208 delete[] work; 209 string tn = typeid(T).name(); 210 cerr << " LapackServer::LeastSquareSolve(a,b) - Unsupported DataType T = " << tn << endl; 211 throw TypeMismatchExc("LapackServer::LeastSquareSolve(a,b) - Unsupported DataType (T)"); 212 } 213 delete[] work; 214 return(info); 215 } 216 145 217 146 218 //! Interface to Lapack SVD driver s/d/c/zgesv(). -
trunk/SophyaExt/LinAlg/intflapack.h
r1424 r1494 14 14 15 15 virtual int LinSolve(TArray<T>& a, TArray<T> & b); 16 virtual int LeastSquareSolve(TArray<T>& a, TArray<T> & b); 17 16 18 virtual int SVD(TArray<T>& a, TArray<T> & s); 17 19 virtual int SVD(TArray<T>& a, TArray<T> & s, TArray<T> & u, TArray<T> & vt); … … 40 42 { LapackServer<T> lps; return( lps.LinSolve(a, b) ); } 41 43 44 template <class T> 45 inline int LapackLeastSquareSolve(TArray<T>& a, TArray<T> & b) 46 { LapackServer<T> lps; return( lps.LeastSquareSolve(a, b) ); } 47 42 48 /*! \ingroup LinAlg 43 49 \fn LapackSVD(TArray<T>&, TArray<T> &)
Note:
See TracChangeset
for help on using the changeset viewer.