42 double inline real(
double x)
47 double inline imag(
double x)
52 double inline real(std::complex<double> x)
57 double inline imag(std::complex<double> x)
62 template<
typename Scalar>
67 template<
typename Scalar>
72 template<
typename Scalar>
75 assert(this->get_size() == vec->
get_size());
76 for (
unsigned int i = 0; i < this->get_size(); i++)
77 this->set(i, vec->
get(i));
81 template<
typename Scalar>
84 for (
unsigned int i = 0; i < this->get_size(); i++)
89 template<
typename Scalar>
92 assert(this->get_size() == vec->
get_size());
93 for (
unsigned int i = 0; i < this->get_size(); i++)
94 this->add(i, vec->
get(i));
98 template<
typename Scalar>
101 for (
unsigned int i = 0; i < this->get_size(); i++)
102 this->add(i, vec[i]);
106 template<
typename Scalar>
109 assert(this->get_size() == vec->
get_size());
110 for (
unsigned int i = 0; i < this->get_size(); i++)
111 this->add(i, -vec->
get(i));
115 template<
typename Scalar>
118 for (
unsigned int i = 0; i < this->get_size(); i++)
119 this->add(i, -vec[i]);
123 template<
typename Scalar>
133 FILE* file = fopen(filename,
"w");
137 fprintf(file,
"%%%%MatrixMarket matrix coordinate real general\n");
139 fprintf(file,
"%%%%MatrixMarket matrix coordinate complex general\n");
141 fprintf(file,
"%d 1 %d\n", this->size, this->size);
143 for (
unsigned int j = 0; j < this->size; j++)
145 Hermes::Helpers::fprint_coordinate_num(file, j + 1, 1, v[j], number_format);
157 dims[0] = this->size;
160 mat_t *mat = Mat_CreateVer(filename,
"", MAT_FT_MAT5);
164 double* v_re =
nullptr;
165 double* v_im =
nullptr;
171 matvar = Mat_VarCreate(var_name, MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, data, MAT_F_DONT_COPY_DATA);
175 v_re = malloc_with_check<SimpleVector<Scalar>,
double>(this->size,
this);
176 v_im = malloc_with_check<SimpleVector<Scalar>,
double>(this->size,
this);
177 struct mat_complex_split_t z = { v_re, v_im };
179 for (
int i = 0; i < this->size; i++)
181 v_re[i] = ((std::complex<double>)(this->v[i])).real();
182 v_im[i] = ((std::complex<double>)(this->v[i])).imag();
185 matvar = Mat_VarCreate(var_name, MAT_C_DOUBLE, MAT_T_DOUBLE, 2, dims, data, MAT_F_DONT_COPY_DATA | MAT_F_COMPLEX);
190 Mat_VarWrite(mat, matvar, MAT_COMPRESSION_ZLIB);
194 free_with_check(v_re);
195 free_with_check(v_im);
207 case EXPORT_FORMAT_MATLAB_SIMPLE:
209 FILE* file = fopen(filename,
"w");
212 for (
unsigned int i = 0; i < this->size; i++)
214 Hermes::Helpers::fprint_num(file, v[i], number_format);
222 case EXPORT_FORMAT_BSON:
229 bson_append_int(&bw,
"size", this->size);
231 bson_append_start_array(&bw,
"v");
232 for (
unsigned int i = 0; i < this->size; i++)
233 bson_append_double(&bw,
"v_i", real(this->v[i]));
234 bson_append_finish_array(&bw);
238 bson_append_start_array(&bw,
"v-imag");
239 for (
unsigned int i = 0; i < this->size; i++)
240 bson_append_double(&bw,
"v_i", imag(this->v[i]));
241 bson_append_finish_array(&bw);
249 fpw = fopen(filename,
"wb");
250 const char *dataw = (
const char *)bson_data(&bw);
251 fwrite(dataw, bson_size(&bw), 1, fpw);
260 template<
typename Scalar>
267 std::vector<Scalar> data;
268 std::ifstream input(filename);
271 std::string lineData;
273 while (getline(input, lineData))
276 std::stringstream lineStream(lineData);
281 this->alloc(data.size());
282 memcpy(this->v, &data[0],
sizeof(Scalar)*data.size());
290 matfp = Mat_Open(filename, MAT_ACC_RDONLY);
298 matvar = Mat_VarRead(matfp, var_name);
301 this->alloc(matvar->dims[0]);
303 memcpy(this->v, matvar->data,
sizeof(Scalar)*this->size);
306 std::complex<double>* complex_data = malloc_with_check<SimpleVector<Scalar>, std::complex<double> >(this->size,
this);
307 double* real_array = (
double*)((mat_complex_split_t*)matvar->data)->Re;
308 double* imag_array = (
double*)((mat_complex_split_t*)matvar->data)->Im;
309 for (
int i = 0; i < this->size; i++)
310 complex_data[i] = std::complex<double>(real_array[i], imag_array[i]);
311 memcpy(this->v, complex_data,
sizeof(Scalar)*this->size);
312 free_with_check(complex_data);
327 case EXPORT_FORMAT_BSON:
330 fpr = fopen(filename,
"rb");
333 fseek(fpr, 0, SEEK_END);
334 int size = ftell(fpr);
338 char *datar = malloc_with_check<char>(size);
339 fread(datar, size, 1, fpr);
343 bson_init_finished_data(&br, datar, 0);
347 bson_find(&it, &br,
"size");
348 this->size = bson_iterator_int(&it);
350 this->v = malloc_with_check<SimpleVector<Scalar>, Scalar>(this->size,
this);
352 bson_iterator it_coeffs;
353 bson_find(&it_coeffs, &br,
"v");
354 bson_iterator_subobject_init(&it_coeffs, &sub, 0);
355 bson_iterator_init(&it, &sub);
357 while (bson_iterator_next(&it))
358 this->v[index_coeff++] = bson_iterator_double(&it);
362 bson_find(&it_coeffs, &br,
"v-imag");
363 bson_iterator_subobject_init(&it_coeffs, &sub, 0);
364 bson_iterator_init(&it, &sub);
366 while (bson_iterator_next(&it))
367 ((std::complex<double>)this->v[index_coeff++]).imag(bson_iterator_double(&it));
371 free_with_check(datar);
378 template<
typename Scalar>
383 template<
typename Scalar>
388 this->
alloc(this->size);
391 template<
typename Scalar>
397 template<
typename Scalar>
400 assert(this->get_size() == vec->
get_size());
403 memcpy(this->v, simple_vec->v,
sizeof(Scalar)*this->size);
409 template<
typename Scalar>
412 memcpy(this->v, vec,
sizeof(Scalar)*this->size);
416 template<
typename Scalar>
421 this->v = malloc_with_check<SimpleVector<Scalar>, Scalar>(n,
this);
425 template<
typename Scalar>
428 for (
unsigned int i = 0; i < this->size; i++)
433 template<
typename Scalar>
436 memset(this->v, 0, this->size *
sizeof(Scalar));
439 template<
typename Scalar>
442 free_with_check(this->v);
446 template<
typename Scalar>
464 #pragma omp critical (SimpleVector_add)
468 template<
typename Scalar>
471 for (
unsigned int i = 0; i < n; i++)
472 this->v[idx[i]] += y[i];
475 template<
typename Scalar>
481 template<
typename Scalar>
489 template<
typename Scalar>
492 memcpy(v, this->v, this->size *
sizeof(Scalar));
495 template<
typename Scalar>
498 assert(this->get_size() == vec->
get_size());
499 for (
unsigned int i = 0; i < this->size; i++)
500 this->v[i] -= vec->
get(i);
504 template<
typename Scalar>
507 for (
unsigned int i = 0; i < this->size; i++)
508 this->v[i] -= vec[i];
512 template<
typename Scalar>
515 assert(this->get_size() == vec->
get_size());
516 for (
unsigned int i = 0; i < this->size; i++)
517 this->v[i] += vec->
get(i);
521 template<
typename Scalar>
524 for (
unsigned int i = 0; i < this->get_size(); i++)
525 this->v[i] += vec[i];
534 case Hermes::SOLVER_EXTERNAL:
538 case Hermes::SOLVER_AMESOS:
540 #if defined HAVE_AMESOS && defined HAVE_EPETRA
547 case Hermes::SOLVER_AZTECOO:
549 if (use_direct_solver)
551 #if defined HAVE_AZTECOO && defined HAVE_EPETRA
558 case Hermes::SOLVER_MUMPS:
567 case Hermes::SOLVER_PETSC:
569 if (use_direct_solver)
572 return new PetscVector < double > ;
578 case Hermes::SOLVER_UMFPACK:
587 case Hermes::SOLVER_PARALUTION_ITERATIVE:
588 case Hermes::SOLVER_PARALUTION_AMG:
590 if (use_direct_solver)
592 #ifdef WITH_PARALUTION
599 case Hermes::SOLVER_SUPERLU:
619 case Hermes::SOLVER_EXTERNAL:
624 case Hermes::SOLVER_AMESOS:
626 #if defined HAVE_AMESOS && defined HAVE_EPETRA
633 case Hermes::SOLVER_AZTECOO:
635 if (use_direct_solver)
638 #if defined HAVE_AZTECOO && defined HAVE_EPETRA
645 case Hermes::SOLVER_MUMPS:
654 case Hermes::SOLVER_PETSC:
656 if (use_direct_solver)
659 return new PetscVector < std::complex<double> > ;
665 case Hermes::SOLVER_UMFPACK:
674 case Hermes::SOLVER_PARALUTION_ITERATIVE:
675 case Hermes::SOLVER_PARALUTION_AMG:
677 if (use_direct_solver)
679 #ifdef WITH_PARALUTION
686 case Hermes::SOLVER_SUPERLU:
AmesosSolver class as an interface to Amesos.
General namespace for the Hermes library.
Linear matrix solver functionality.
Exception interface Basically a std::exception, but with a constructor with string and with print_msg...
General (abstract) vector representation in Hermes.
virtual Scalar get(unsigned int idx) const =0
PARALUTION solver interface.
virtual void alloc(unsigned int ndofs)
virtual void add(unsigned int idx, Scalar y)
File containing common definitions, and basic global enums etc. for HermesCommon. ...
virtual void set(unsigned int idx, Scalar y)
virtual Vector< Scalar > * add_vector(Vector< Scalar > *vec)
Add a vector.
virtual void zero()
Zero the vector.
MatrixExportFormat
Format of file matrix and vector output.
virtual void extract(Scalar *v) const
Plain ascii file lines contains row column and value.
Vector used with MUMPS solver.
Vector()
Default constructor.
virtual Vector< Scalar > * set_vector(Vector< Scalar > *vec)
Set values from a user-provided vector.
AztecOOSolver class as an interface to AztecOO.
HERMES_COMMON_API Hermes::Api HermesCommonApi
Global instance used inside Hermes which is also accessible to users.
IO exception. Internal. Exception occurs when something fails to be written to / read from the disk...
virtual void free()
free the memory
File containing functionality for investigating call stack.
virtual Vector< Scalar > * set_vector(Vector< Scalar > *vec)
Set values from a user-provided vector.
HERMES_API Vector< Scalar > * create_vector(bool use_direct_solver=false)
Function returning a vector according to the users's choice.
virtual Vector< Scalar > * subtract_vector(Vector< Scalar > *vec)
Subtract a vector.
Basic matrix classes and operations.
UMFPACK solver interface.
Vector< Scalar > * duplicate() const
Duplicates a matrix (including allocation).
unsigned int get_size() const
Get vector length.
virtual Vector< Scalar > * add_vector(Vector< Scalar > *vec)
Add a vector.
virtual Vector< Scalar > * subtract_vector(Vector< Scalar > *vec)
Subtract a vector.
virtual Vector< Scalar > * change_sign()
Multiply by minus one.
The QuickSort routine from glibc-2.5 modified for sorting int arrays.
virtual Scalar get(unsigned int idx) const
virtual void export_to_file(const char *filename, const char *var_name, MatrixExportFormat fmt, char *number_format="%lf")
Method is not overriden and should be.
File containing common definitions, and basic global enums etc. for HermesCommon. ...
SuperLU solver interface.
Numeric value is out of allowed range.
virtual void import_from_file(const char *filename, const char *var_name, MatrixExportFormat fmt)
Class representing the vector for UMFPACK.
Matrix Market which can be read by pysparse library.
Method is not overriden and should be.