Changeset 814 in Sophya for trunk/SophyaExt/LinAlg


Ignore:
Timestamp:
Apr 5, 2000, 5:45:21 PM (25 years ago)
Author:
ansari
Message:

Debut LapackServer avec LinSolve - Reza 5/4/2000

Location:
trunk/SophyaExt/LinAlg
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaExt/LinAlg/intflapack.cc

    r788 r814  
     1#include <iostream.h>
    12#include "intflapack.h"
     3#include <typeinfo>
    24
    35extern "C" {
     
    1012void zgesv_(int_4* n, int_4* nrhs, complex<r_8>* a, int_4* lda,
    1113            int_4* ipiv, complex<r_8>* b, int_4* ldb, int_4* info);
     14}
     15
     16template <class T>
     17TArray<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);
    1259}
    1360
     
    2875  int_4* ipiv = new int_4[n];
    2976  sgesv_(&n, &nrhs, aa.Data(), &lda, ipiv, bb.Data(), &ldb, &info);
     77  delete[] ipiv;
    3078  cout << "rztest_lapack/Info= " << info << endl;
    3179  cout << aa << "\n" << bb << endl;
    3280  return;
    3381}
     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)
     92template class LapackServer<r_4>;
     93template class LapackServer<r_8>;
     94template class LapackServer< complex<r_4> >;
     95template class LapackServer< complex<r_8> >;
     96#endif
     97
     98#if defined(OS_LINUX)
     99//  Pour le link avec f2c sous Linux
     100extern "C" {
     101    void MAIN__();
     102}
     103
     104void 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  
    55#include "tarray.h"
    66
     7namespace SOPHYA {
     8
     9template <class T>
     10class LapackServer {
     11public:
     12  TArray<T>& LinSolve(TArray<T>& a, TArray<T> & b);
     13};
     14
     15template <class T>
     16inline TArray<T>& LapackLinSolve(TArray<T>& a, TArray<T> & b)
     17  { LapackServer<T> lps; return( lps.LinSolve(a, b) );  }
     18
     19
     20} // Fin du namespace
    721
    822void rztest_lapack(TArray<r_4>& a, TArray<r_4>& b);
    9 // void rztest_lapack(TMatrix<r_8>& a, TMatrix<r_8>& b);
    1023
    1124#endif
Note: See TracChangeset for help on using the changeset viewer.