Go to the documentation of this file.00001
00002
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