Go to the documentation of this file.00001
00002
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
00045
00046 inline LaSymmFactDouble();
00047 inline LaSymmFactDouble(int, int);
00048 inline LaSymmFactDouble(const LaSymmFactDouble &);
00049 inline ~LaSymmFactDouble();
00050
00051
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
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
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
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
00168
00169
00170 integer LWORK = N * NB;
00171 double *WORK = new double[LWORK];
00172 LaVectorLongInt piv(N);
00173 AF.pivot().copy(piv);
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