Lapack++
|
00001 // LAPACK++ (V. 1.1) 00002 // (C) 1992-1996 All Rights Reserved. 00003 00004 #ifndef _LA_SPD_FACT_DOUBLE_H_ 00005 #define _LA_SPD_FACT_DOUBLE_H_ 00006 00007 #include LA_SPD_MAT_DOUBLE_H 00008 00009 #include "lapack.h" 00010 00011 class LaSpdFactDouble 00012 { 00013 int size_; 00014 int gdim_; 00015 LaSpdMatDouble S_; 00016 00017 public: 00018 00019 LaSpdFactDouble(); 00020 LaSpdFactDouble(int, int); 00021 LaSpdFactDouble(const LaSpdFactDouble&); 00022 ~LaSpdFactDouble(); 00023 00024 LaSpdFactDouble& ref(LaSpdFactDouble&); 00025 LaSpdFactDouble& ref(LaSpdMatDouble&); 00026 LaSpdFactDouble& copy(const LaSpdFactDouble&); 00027 LaSpdFactDouble& copy(const LaSpdMatDouble&); 00028 00029 LaSpdMatDouble& S() 00030 { 00031 return S_; 00032 } 00033 int size() 00034 { 00035 return size_; 00036 } 00037 int gdim() 00038 { 00039 return gdim_; 00040 } 00041 }; 00042 00043 00044 inline LaSpdFactDouble::LaSpdFactDouble(): S_(), size_(0), gdim_(0) 00045 {} 00046 00047 inline LaSpdFactDouble::LaSpdFactDouble(int m, int n): S_(m, n), 00048 size_(n), gdim_(m) 00049 {} 00050 00051 inline LaSpdFactDouble::LaSpdFactDouble(const LaSpdFactDouble &X) 00052 { 00053 size_ = X.size_; 00054 gdim_ = X.gdim_; 00055 S_.copy(X.S_); 00056 } 00057 00058 inline LaSpdFactDouble::~LaSpdFactDouble() 00059 {} 00060 00061 inline LaSpdFactDouble& LaSpdFactDouble::ref(LaSpdFactDouble &X) 00062 { 00063 size_ = X.size_; 00064 gdim_ = X.gdim_; 00065 S_.ref(X.S_); 00066 00067 return *this; 00068 } 00069 00070 inline LaSpdFactDouble& LaSpdFactDouble::ref(LaSpdMatDouble &X) 00071 { 00072 size_ = X.size(1); 00073 gdim_ = X.gdim(0); 00074 S_.ref(X); 00075 00076 return *this; 00077 } 00078 00079 inline LaSpdFactDouble& LaSpdFactDouble::copy(const LaSpdFactDouble &X) 00080 { 00081 size_ = X.size_; 00082 gdim_ = X.gdim_; 00083 S_.copy(X.S_); 00084 00085 return *this; 00086 } 00087 00088 inline LaSpdFactDouble& LaSpdFactDouble::copy(const LaSpdMatDouble &X) 00089 { 00090 size_ = X.size(1); 00091 gdim_ = X.gdim(0); 00092 S_.copy(X); 00093 00094 return *this; 00095 } 00096 00097 inline void LaSpdMatFactorize(LaSpdMatDouble &A, LaSpdFactDouble &AF) 00098 { 00099 char uplo = 'L'; 00100 integer N = A.size(1), lda = A.gdim(0), info = 0; 00101 AF.copy(A); 00102 00103 F77NAME(dpotrf)(&uplo, &N, &(AF.S()(0, 0)), &lda, &info); 00104 } 00105 00106 00107 inline void LaLinearSolve(LaSpdFactDouble &AF, LaGenMatDouble &X, 00108 LaGenMatDouble &B) 00109 { 00110 char uplo = 'L'; 00111 integer N = AF.size(), nrhs = X.size(1), lda = AF.gdim(), 00112 ldb = B.size(0), info = 0; 00113 00114 X.inject(B); 00115 F77NAME(dpotrs)(&uplo, &N, &nrhs, &(AF.S()(0, 0)), &lda, &X(0, 0), 00116 &ldb, &info); 00117 } 00118 00119 #endif 00120 // _LA_SPD_FACT_DOUBLE_H_