Lapack++
|
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_