00001 #ifndef _psi_src_lib_libmemtrix_block_matrix_h_
00002 #define _psi_src_lib_libmemtrix_block_matrix_h_
00003
00004 #include "block_vector.h"
00005 #include "matrix_base.h"
00006 #include <string>
00007
00008 typedef std::vector<int> vecint;
00009
00010 extern FILE* outfile;
00011
00012 namespace psi{ namespace MCSCF{
00013
00014 class BlockMatrix
00015 {
00016 public:
00017 BlockMatrix();
00018 BlockMatrix(std::string label, int nirreps, size_t*& rows_size, size_t*& cols_size);
00019 BlockMatrix(std::string label, int nirreps, int*& rows_size, int*& cols_size);
00020 BlockMatrix(std::string label, int nirreps, vecint& rows_size, vecint& cols_size);
00021 ~BlockMatrix();
00022
00023
00024 void set(int h, int i, int j, double value) {matrix_base_[h]->set(i,j,value);}
00025 void add(int h, int i, int j, double value) {matrix_base_[h]->add(i,j,value);}
00026 double get(int h, int i, int j) {return(matrix_base_[h]->get(i,j));}
00027 size_t get_rows(int h) {return(matrix_base_[h]->get_rows());}
00028 size_t get_cols(int h) {return(matrix_base_[h]->get_cols());}
00029 size_t get_abs_row(int h,int i) {return(rows_offset_[h] + i);}
00030 size_t get_abs_col(int h,int i) {return(cols_offset_[h] + i);}
00031
00032
00033 BlockMatrix& operator=(BlockMatrix& rhs);
00034 BlockMatrix& operator+=(const BlockMatrix& rhs);
00035 friend double dot(BlockMatrix* A,BlockMatrix* B);
00036
00037 void print();
00038 void zero();
00039 void zero_diagonal();
00040 void scale(double factor);
00041 void transpose();
00042
00043 void multiply(bool transpose_A, bool transpose_B, BlockMatrix* A, BlockMatrix* B);
00044 void diagonalize(BlockMatrix* eigenvectors, BlockVector* eigenvalues);
00045 MatrixBase* getMatrixBase(int h) {return(matrix_base_[h]);}
00046
00047
00048
00049 unsigned int ref () const { return ref_;}
00050 void add_reference () { ref_++;}
00051 void subtract_reference () { if (--ref_ == 0) delete this;}
00052
00053 unsigned int ref_;
00054
00055 private:
00056
00057 std::string label_;
00058 MatrixBase** matrix_base_;
00059
00060
00061 size_t* rows_size_;
00062 size_t* cols_size_;
00063 size_t* rows_offset_;
00064 size_t* cols_offset_;
00065 int nirreps_;
00066
00067 void startup(std::string label, int nirreps, size_t*& rows_size, size_t*& cols_size );
00068 void startup(std::string label, int nirreps, int*& rows_size, int*& cols_size);
00069 void startup(std::string label, int nirreps, vecint& rows_size, vecint& cols_size);
00070 void cleanup();
00071 };
00072
00073 }}
00074
00075 #endif // _psi_src_lib_libmemtrix_block_matrix_h_