Lapack++
spdfd.h
Go to the documentation of this file.
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_