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 #include "ifp_BlockVec.h"
00030
00031 ifp_BlockVec::ifp_BlockVec(const ifp_BlockVec& A)
00032 {
00033 dim0 = A.dim0;
00034 dim1 = A.dim1;
00035 ld = A.dim0;
00036 size0 = A.dim0;
00037 base = new double[dim0*dim1];
00038 v = base;
00039 partit = A.partit;
00040 owndata = 1;
00041 VecCopy(A);
00042 }
00043
00044 ifp_BlockVec::ifp_BlockVec(const ifp_BlockVec& A, int index)
00045 {
00046 if (index >= 0)
00047 {
00048 dim0 = A.partit[index+1] - A.partit[index];;
00049 dim1 = A.dim1;
00050 ld = dim0;
00051 size0 = dim0;
00052 base = new double[dim0*dim1];
00053 v = base;
00054 partit = NULL;
00055 owndata = 1;
00056
00057
00058
00059 int i, j;
00060 double *p;
00061 const double *q;
00062
00063 for (i=0; i<dim1; i++)
00064 {
00065 p = v + i*ld;
00066 q = A.base + A.partit[index] + i*A.ld;
00067 for (j=0; j<size0; j++)
00068 *p++ = *q++;
00069 }
00070 }
00071 else
00072 {
00073 dim0 = A.size0;
00074 dim1 = A.dim1;
00075 ld = dim0;
00076 size0 = dim0;
00077 base = new double[dim0*dim1];
00078 v = base;
00079 partit = NULL;
00080 owndata = 1;
00081
00082
00083
00084 int i, j;
00085 double *p;
00086 const double *q;
00087
00088 for (i=0; i<dim1; i++)
00089 {
00090 p = v + i*ld;
00091 q = A.v + i*A.ld;
00092 for (j=0; j<size0; j++)
00093 *p++ = *q++;
00094 }
00095 }
00096 }
00097
00098 void ifp_BlockVec::VecCopy(const ifp_BlockVec& A)
00099 {
00100 #ifdef DEBUG
00101 assert(dim0 == A.dim0 && dim1 == A.dim1);
00102 #endif
00103 int i, j;
00104 double *p;
00105 const double *q;
00106
00107 for (i=0; i<dim1; i++)
00108 {
00109 p = v + i*ld;
00110 q = A.v + i*A.ld;
00111 for (j=0; j<dim0; j++)
00112 *p++ = *q++;
00113 }
00114 }
00115
00116 void ifp_BlockVec::VecSetToZero()
00117 {
00118 int i, j;
00119 double *p;
00120
00121 for (i=0; i<dim1; i++)
00122 {
00123 p = v + i*ld;
00124 for (j=0; j<dim0; j++)
00125 *p++ = 0.0;
00126 }
00127 }
00128
00129 void ifp_BlockVec::BlockCopy(const ifp_BlockVec& A)
00130 {
00131 #ifdef DEBUG
00132 assert(size0 == A.size0 && dim1 == A.dim1);
00133 #endif
00134 int i, j;
00135 double *p;
00136 const double *q;
00137
00138 for (i=0; i<dim1; i++)
00139 {
00140 p = v + i*ld;
00141 q = A.v + i*A.ld;
00142 for (j=0; j<size0; j++)
00143 *p++ = *q++;
00144 }
00145 }
00146
00147 void ifp_BlockVec::BlockSetToZero()
00148 {
00149 int i, j;
00150 double *p;
00151
00152 for (i=0; i<dim1; i++)
00153 {
00154 p = v + i*ld;
00155 for (j=0; j<size0; j++)
00156 *p++ = 0.0;
00157 }
00158 }