Lapack++
syfd.h
Go to the documentation of this file.
00001 //      LAPACK++ (V. 1.1)
00002 //      (C) 1992-1996 All Rights Reserved.
00003 
00004 
00005 #ifndef _LA_SYMM_FACT_DOUBLE_H_
00006 #define _LA_SYMM_FACT_DOUBLE_H_
00007 
00019 #include "lafnames.h"
00020 #include LA_VECTOR_INT_H
00021 #include LA_SYMM_MAT_DOUBLE_H
00022 
00023 
00024 #include "lapack.h"
00025 
00033 class LaSymmFactDouble
00034 {
00035     LaSymmMatDouble             S_;
00036     LaVectorLongInt             pivot_;
00037     int                      info_;
00038     char                     uplo_;
00039     int                     size_;
00040     int                     gdim_;
00041 
00042 public:
00043 
00044     // constructor
00045 
00046     inline LaSymmFactDouble();
00047     inline LaSymmFactDouble(int, int);
00048     inline LaSymmFactDouble(const LaSymmFactDouble &);
00049     inline ~LaSymmFactDouble();
00050 
00051     // extraction functions for components
00052 
00053     inline LaSymmMatDouble& S()
00054     {
00055         return S_;
00056     }
00057     inline LaVectorLongInt& pivot()
00058     {
00059         return pivot_;
00060     }
00061     inline int info()
00062     {
00063         return info_;
00064     }
00065     inline char uplo()
00066     {
00067         return uplo_;
00068     }
00069     inline int size()
00070     {
00071         return size_;
00072     }
00073     inline int gdim()
00074     {
00075         return gdim_;
00076     }
00077 
00078     // operators
00079 
00080     inline LaSymmFactDouble ref(LaSymmFactDouble &);
00081     inline LaSymmFactDouble ref(LaSymmMatDouble &);
00082     inline LaSymmFactDouble& copy(const LaSymmFactDouble &);
00083     inline LaSymmFactDouble& copy(const LaSymmMatDouble &);
00084 
00085 };
00086 
00087 
00088 
00089 // constructor/destructor functions
00090 
00091 inline LaSymmFactDouble::LaSymmFactDouble(): S_(), pivot_(), info_(0), uplo_('L')
00092 {}
00093 
00094 
00095 inline LaSymmFactDouble::LaSymmFactDouble(int n, int m): S_(n, m), pivot_(n*m),
00096     info_(0), uplo_('L')
00097 {}
00098 
00099 
00100 inline LaSymmFactDouble::LaSymmFactDouble(const LaSymmFactDouble &F)
00101 {
00102     S_.copy(F.S_);
00103     pivot_.copy(F.pivot_);
00104     info_ = F.info_;
00105     uplo_ = F.uplo_;
00106     size_ = F.size_;
00107     gdim_ = F.gdim_;
00108 }
00109 
00110 inline LaSymmFactDouble::~LaSymmFactDouble()
00111 {}
00112 
00113 // operators
00114 
00115 
00116 inline LaSymmFactDouble LaSymmFactDouble::ref(LaSymmFactDouble& F)
00117 {
00118     S_.ref(F.S_);
00119     pivot_.ref(F.pivot_);
00120     info_ = F.info_;
00121     uplo_ = F.uplo_;
00122     size_ = F.size_;
00123     gdim_ = F.gdim_;
00124 
00125     return *this;
00126 }
00127 
00128 inline LaSymmFactDouble& LaSymmFactDouble::copy(const LaSymmFactDouble& F)
00129 {
00130     S_.copy(F.S_);
00131     pivot_.copy(F.pivot_);
00132     info_ = F.info_;
00133     uplo_ = F.uplo_;
00134     size_ = F.size_;
00135     gdim_ = F.gdim_;
00136 
00137     return *this;
00138 }
00139 
00140 inline LaSymmFactDouble LaSymmFactDouble::ref(LaSymmMatDouble &G)
00141 {
00142     S_.ref(G);
00143     info_ = 0;
00144     uplo_ = 'L';
00145     size_ = G.size(0);
00146     gdim_ = G.gdim(0);
00147 
00148     return *this;
00149 }
00150 
00151 inline LaSymmFactDouble& LaSymmFactDouble::copy(const LaSymmMatDouble &G)
00152 {
00153     S_.copy(G);
00154     info_ = 0;
00155     uplo_ = 'L';
00156     size_ = G.size(0);
00157     gdim_ = G.gdim(0);
00158 
00159     return *this;
00160 }
00161 
00162 #if 0
00163 inline void LaSymmMatFactorize(LaSymmMatDouble &A, LaSymmFactDouble &AF)
00164 {
00165     char UPLO = 'L';
00166     integer N = A.size(0), LDA = A.gdim(0), info = 0;
00167 //    integer M = DSYTRF;
00168 //    integer NB = F77NAME(get_nb)(&N,&M);
00169 
00170     integer LWORK = N * NB;
00171     double *WORK = new double[LWORK];
00172     LaVectorLongInt piv(N);
00173     AF.pivot().copy(piv); // make copies of A and pivot information
00174     AF.copy(A);
00175 
00176     F77NAME(dsytrf)(&UPLO, &N, &(AF.S()(0, 0)), &LDA, &(AF.pivot()(0)), WORK,
00177                     &LWORK, &info);
00178 
00179     delete [] WORK;
00180 }
00181 #endif
00182 inline void LaLinearSolve(LaSymmFactDouble &AF, LaGenMatDouble &X,
00183                           LaGenMatDouble &B)
00184 {
00185     char uplo = 'L';
00186     integer N = AF.size(), nrhs = X.size(1), lda = AF.gdim(),
00187             ldb = B.size(0), info = 0;
00188 
00189     X.inject(B);
00190     F77NAME(dsytrs)(&uplo, &N, &nrhs, &(AF.S()(0, 0)), &lda,
00191                     &(AF.pivot()(0)), &X(0, 0), &ldb, &info);
00192 
00193 }
00194 
00195 #endif
00196 // _LA_SYMM_FACT_DOUBLE_H_