3 #include "SparseMatrix_CRS.h"
5 #ifdef __INTEL_COMPILER
10 #define HDF5_STATUS_CHECK(status) if(status < 0) std::cerr << __FILE__ << ":" << __LINE__ << ": Problem with writing to file. Status code=" << status << std::endl;
34 for(
unsigned int k=row[i];k<row[i+1];k++)
55 assert(dense.
getm() == dense.
getn());
56 this->n = dense.
getn();
64 for(
unsigned int i=0;i<n;i++)
66 for(
unsigned int j=0;j<n;j++)
67 if( fabs(dense(i,j)) > 1e-14 )
69 data.push_back(dense(i,j));
73 row[i+1] = col.size();
76 row.back() = col.size();
85 assert(dense.
getm() == dense.
getn() && dense.
getn() == n);
88 for(
unsigned int i=0;i<row.size()-1;i++)
89 for(
unsigned int k=row[i];k<row[i+1];k++)
90 dense(i,col[k]) = dense(col[k],i) = data[k];
98 std::cout <<
"Data(" << data.size() <<
"):" << std::endl;
99 for(
unsigned int i=0;i<data.size();i++)
100 std::cout << data[i] <<
" ";
101 std::cout << std::endl;
103 std::cout <<
"Col indices:" << std::endl;
104 for(
unsigned int i=0;i<col.size();i++)
105 std::cout << col[i] <<
" ";
106 std::cout << std::endl;
108 std::cout <<
"Row indices:" << std::endl;
109 for(
unsigned int i=0;i<row.size();i++)
110 std::cout << row[i] <<
" ";
111 std::cout << std::endl;
122 for(
unsigned int i=0;i<matrix_p.row.size()-1;i++)
123 for(
unsigned int k=matrix_p.row[i];k<matrix_p.row[i+1];k++)
124 output << i <<
"\t" << matrix_p.col[k] <<
"\t" << matrix_p.data[k] << std::endl;
139 if(col.empty() || row.back() == col.size() || col.back() < j)
141 data.push_back(value);
146 unsigned int begin = row.back();
147 for(
unsigned int i=begin;i<col.size();i++)
151 col.insert(col.begin() + i,j);
152 data.insert(data.begin() + i,value);
154 }
else if (col[i] == j)
158 if(fabs(data[i])<1e-14)
160 data.erase(data.begin() + i);
161 col.erase(col.begin() + i);
184 assert(col.empty() || row.back() == col.size() || col.back() < j);
186 data.push_back(value);
195 if(row.size() == (n+1))
198 row.push_back(data.size());
221 #ifdef __INTEL_COMPILER
224 mkl_cspblas_dcsrsymv(&uplo, (
const int *) &n, data.data(), (
const int *) row.data(), (
const int *) col.data(), x, y);
228 for(
unsigned int i=0;i<n;i++)
233 for(
unsigned int k=row[i];k<row[i+1];k++)
235 y[i] += data[k] * x[col[k]];
239 for(
unsigned int j=0;j<i;j++)
240 for(
unsigned int k=row[j]+1;k<row[j+1];k++)
244 y[i] += data[k] * x[j];
261 for(
unsigned int i=0;i<n;i++)
266 for(
unsigned int k=row[i];k<row[i+1];k++)
268 y[i] += data[k] * x[col[k]];
272 for(
unsigned int j=0;j<i;j++)
273 for(
unsigned int k=row[j]+1;k<row[j+1];k++)
277 y[i] += data[k] * x[j];
292 hid_t file_id, group_id, dataset_id, attribute_id, dataspace_id, scalar_id;
296 file_id = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT);
298 file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
300 group_id = H5Gcreate(file_id, name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
302 hsize_t dimblock = data.size();
304 scalar_id = H5Screate(H5S_SCALAR);
306 dataspace_id = H5Screate_simple(1, &dimblock, NULL);
308 dataset_id = H5Dcreate(group_id,
"data", H5T_IEEE_F64LE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
310 status = H5Dwrite(dataset_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, data.data() );
313 unsigned int size = data.size();
314 attribute_id = H5Acreate (dataset_id,
"size", H5T_STD_U64LE, scalar_id, H5P_DEFAULT, H5P_DEFAULT);
316 status = H5Awrite (attribute_id, H5T_NATIVE_UINT, &size );
319 status = H5Aclose(attribute_id);
322 status = H5Dclose(dataset_id);
325 dataset_id = H5Dcreate(group_id,
"col", H5T_STD_U64LE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
327 status = H5Dwrite(dataset_id, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, col.data() );
331 attribute_id = H5Acreate (dataset_id,
"size", H5T_STD_U64LE, scalar_id, H5P_DEFAULT, H5P_DEFAULT);
332 status = H5Awrite (attribute_id, H5T_NATIVE_UINT, &size );
335 status = H5Aclose(attribute_id);
338 status = H5Dclose(dataset_id);
341 status = H5Sclose(dataspace_id);
344 dimblock = row.size();
346 dataspace_id = H5Screate_simple(1, &dimblock, NULL);
348 dataset_id = H5Dcreate(group_id,
"row", H5T_STD_U64LE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
350 status = H5Dwrite(dataset_id, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, row.data() );
353 status = H5Dclose(dataset_id);
356 status = H5Sclose(dataspace_id);
359 dataset_id = H5Dcreate(group_id,
"n", H5T_STD_U64LE, scalar_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
361 status = H5Dwrite(dataset_id, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &n );
364 status = H5Dclose(dataset_id);
367 status = H5Sclose(scalar_id);
370 status = H5Gclose(group_id);
373 status = H5Fclose(file_id);
386 hid_t file_id, group_id, dataset_id, attribute_id;
389 file_id = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT);
392 group_id = H5Gopen(file_id, name, H5P_DEFAULT);
395 dataset_id = H5Dopen(group_id,
"n", H5P_DEFAULT);
398 status = H5Dread(dataset_id, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &n);
401 status = H5Dclose(dataset_id);
408 dataset_id = H5Dopen(group_id,
"data", H5P_DEFAULT);
411 attribute_id = H5Aopen(dataset_id,
"size", H5P_DEFAULT);
414 status = H5Aread(attribute_id, H5T_NATIVE_UINT, &size);
418 status = H5Aclose(attribute_id);
423 status = H5Dread(dataset_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, data.data());
426 status = H5Dclose(dataset_id);
430 dataset_id = H5Dopen(group_id,
"col", H5P_DEFAULT);
433 attribute_id = H5Aopen(dataset_id,
"size", H5P_DEFAULT);
436 status = H5Aread(attribute_id, H5T_NATIVE_UINT, &size);
439 status = H5Aclose(attribute_id);
444 status = H5Dread(dataset_id, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, col.data());
447 status = H5Dclose(dataset_id);
451 dataset_id = H5Dopen(group_id,
"row", H5P_DEFAULT);
454 status = H5Dread(dataset_id, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, row.data());
457 status = H5Dclose(dataset_id);
460 status = H5Gclose(group_id);
463 status = H5Fclose(file_id);
476 return (row[idx+1]-row[idx]);
487 return data[row[row_index]+element_index];
498 return col[row[row_index]+element_index];
526 unsigned int total_size = 0;
528 for(
auto& smat : list)
529 total_size += smat->data.size();
531 data.reserve(total_size);
532 col.reserve(total_size);
540 for(
auto &smat: list)
542 auto prev_start = data.size();
544 data.insert(data.end(), smat->data.begin(), smat->data.end());
545 col.insert(col.end(), smat->col.begin(), smat->col.end());
547 for(
unsigned int i=0;i<smat->row.size();++i)
548 row.push_back(prev_start + smat->row[i]);
553 assert(data.size() == total_size);
554 assert(col.size() == total_size);
555 assert(row.size() == n);
557 row.push_back(data.size());
#define HDF5_STATUS_CHECK(status)
std::ostream & operator<<(std::ostream &output, helpers::SparseMatrix_CRS &matrix_p)
void ConvertFromMatrix(const helpers::matrix &dense)
SparseMatrix_CRS(unsigned int n)
double operator()(unsigned int i, unsigned int j) const
unsigned int NumOfElInRow(unsigned int idx) const
void SetGuess(unsigned int)
void ConvertToMatrix(helpers::matrix &dense) const
unsigned int GetElementColIndexInRow(unsigned int row_index, unsigned int element_index) const
double GetElementInRow(unsigned int row_index, unsigned int element_index) const
void PushToRow(unsigned int j, double value)
void PushToRowNext(unsigned int j, double value)
void AddList(std::vector< std::unique_ptr< SparseMatrix_CRS > > &)
int ReadFromFile(const char *, const char *)
int WriteToFile(const char *, const char *, bool=false) const
void mvprod(const double *, double *) const