00001 #ifndef _psi_src_lib_libmemtrix_block_vector_h_
00002 #define _psi_src_lib_libmemtrix_block_vector_h_
00003
00004 #include <string>
00005 #include <vector>
00006
00007 #include "vector_base.h"
00008
00009 typedef std::vector<int> vecint;
00010
00011 namespace psi{ namespace MCSCF{
00012
00013 class BlockVector
00014 {
00015 public:
00016 BlockVector();
00017 BlockVector(std::string label, int nirreps, size_t*& rows_size);
00018 BlockVector(std::string label, int nirreps, int*& rows_size);
00019 BlockVector(std::string label, int nirreps, vecint& rows_size);
00020 ~BlockVector();
00021
00022 void print();
00023 void copy(BlockVector& source);
00024
00025
00026 void set(int h, int i, double value) {vector_base_[h]->set(i,value);}
00027 void add(int h, int i, double value) {vector_base_[h]->add(i,value);}
00028 double get(int h, int i) {return(vector_base_[h]->get(i));}
00029
00030 VectorBase* getVectorBase(int h) {return(vector_base_[h]);}
00031
00032
00033 unsigned int ref () const { return ref_;}
00034 void add_reference () { ref_++;}
00035 void subtract_reference () { if (--ref_ == 0) delete this;}
00036
00037 unsigned int ref_;
00038 private:
00039
00040 std::string label_;
00041 VectorBase** vector_base_;
00042
00043
00044 size_t* rows_size_;
00045 size_t* rows_offset_;
00046 int nirreps_;
00047
00048 void startup(std::string label, int nirreps, size_t*& rows_size);
00049 void startup(std::string label, int nirreps, int*& rows_size);
00050 void startup(std::string label, int nirreps, vecint& rows_size);
00051 void cleanup();
00052 };
00053
00054 }}
00055
00056 #endif // _psi_src_lib_libmemtrix_block_vector_h_