00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef _IFP_BLOCKVEC_H_
00031 #define _IFP_BLOCKVEC_H_
00032
00033 #include <stdlib.h>
00034 #ifndef NULL
00035 #define NULL 0
00036 #endif
00037 #ifdef DEBUG
00038 #include <assert.h>
00039 #endif
00040
00041 class ifp_BlockVec
00042 {
00043 private:
00044 double *base;
00045 const int *partit;
00046 int owndata;
00047
00048 public:
00049 double *v;
00050 int dim0;
00051 int dim1;
00052 int ld;
00053 int size0;
00054
00055 ifp_BlockVec& operator()(int i)
00056 {
00057 #ifdef DEBUG
00058 assert(partit != NULL);
00059 assert(partit[i] < partit[i+1]);
00060 assert(partit[i+1] <= dim0);
00061 #endif
00062 v = base + partit[i];
00063 size0 = partit[i+1] - partit[i];
00064 return *this;
00065 }
00066
00067 ifp_BlockVec(int nr, int nc, const double *a, int lda,
00068 const int *partitioning)
00069 {
00070 dim0 = nr;
00071 dim1 = nc;
00072 ld = lda;
00073 size0 = nr;
00074 base = (double *)a;
00075 v = (double *)a;
00076 partit = partitioning;
00077 owndata = 0;
00078 }
00079
00080 ifp_BlockVec(const ifp_BlockVec& A);
00081 ifp_BlockVec(const ifp_BlockVec& A, int i);
00082
00083 ~ifp_BlockVec()
00084 {
00085 if (owndata)
00086 delete [] base;
00087 base = NULL;
00088 }
00089
00090 void VecCopy(const ifp_BlockVec& A);
00091 void VecSetToZero();
00092
00093 void BlockCopy(const ifp_BlockVec& A);
00094 void BlockSetToZero();
00095 };
00096
00097 #endif // _IFP_BLOCKVEC_H_