PolyDiM
C++ library for POLYtopal DIscretization Methods
Loading...
Searching...
No Matches
PETSc_Array.hpp
Go to the documentation of this file.
1// _LICENSE_HEADER_
2//
3// Copyright (C) 2019 - 2025.
4// Terms register on the GPL-3.0 license.
5//
6// This file can be redistributed and/or modified under the license terms.
7//
8// See top level LICENSE file for more details.
9//
10// This file can be used citing references in CITATION.cff file.
11
12#ifndef __PETSc_Array_HPP
13#define __PETSc_Array_HPP
14
15#include "Gedim_Macro.hpp"
16
17#if ENABLE_PETSC == 1
18
19#include "petscmat.h"
20#include "petscvec.h"
21
22#include "IArray.hpp"
23
24namespace Gedim
25{
27template <typename PETSc_ArrayType = Vec, typename PETSc_SparseArrayType = Mat> class PETSc_Array final : public IArray
28{
29 private:
30 PETSc_ArrayType _vector;
31
32 public:
34 {
35 }
37 {
38 _vector = vector;
39 }
41 {
42 _vector = std::move(vector);
43 }
45 {
46 }
47
48 operator PETSc_ArrayType &()
49 {
50 return _vector;
51 }
52 operator const PETSc_ArrayType &() const
53 {
54 return _vector;
55 }
56 inline PETSc_ArrayType &Cast(IArray &v)
57 {
59 }
60 inline const PETSc_ArrayType &Cast(const IArray &v) const
61 {
62 return (const PETSc_ArrayType &)static_cast<const PETSc_Array<PETSc_ArrayType, PETSc_SparseArrayType> &>(v);
63 }
64
65 void Create();
66 inline void Destroy()
67 {
68 VecDestroy(&_vector);
69 }
70 inline void SetSize(const unsigned int &numCols)
71 {
72 SetSizes(numCols, 0);
73 }
74 void SetSizes(const unsigned int &numCols, const unsigned int &numLocalCols = 0);
75
76 unsigned int Size() const;
77 const double *Data() const
78 {
79 throw std::runtime_error("unimplemented method");
80 }
81 double *Data()
82 {
83 throw std::runtime_error("unimplemented method");
84 }
85
86 void SetValue(const int &i, const double &val);
87 void SetValues(const std::vector<int> &indices, const std::vector<double> &values);
88 void AddValue(const int &i, const double &val);
89 void AddValues(const std::vector<int> &indices, const std::vector<double> &values);
90 std::vector<double> GetValues(const std::vector<int> &indices = {}) const;
91
92 inline void Zeros()
93 {
94 VecSet(_vector, 0.0);
95 }
96 inline void Ones()
97 {
98 VecSet(_vector, 1.0);
99 }
100 inline void Constant(const double &c)
101 {
102 VecSet(_vector, c);
103 }
104
105 void SumMultiplication(const ISparseArray &A, const IArray &w);
106 void SubtractionMultiplication(const ISparseArray &A, const IArray &w);
107
108 double &operator[](const int &)
109 {
110 throw std::runtime_error("unimplemented method");
111 }
112
113 const PetscScalar &operator[](const int &) const
114 {
115 throw std::runtime_error("unimplemented method");
116 }
117
118 inline void Concatenate(const IArray &, const IArray &)
119 {
120 throw std::runtime_error("unimplemented method");
121 }
122
123 inline double GetValue(const int &i) const
124 {
125 PetscScalar value;
126 VecGetValues(_vector, 1, &i, &value);
127 return static_cast<double>(value);
128 }
129
130 std::ostream &Print(std::ostream &output) const;
131
132 inline IArray &operator+=(const IArray &v)
133 {
134 VecAXPY(_vector, 1.0, Cast(v));
135 return *this;
136 }
137 inline IArray &operator-=(const IArray &v)
138 {
139 VecAXPY(_vector, -1.0, Cast(v));
140 return *this;
141 }
142 inline IArray &operator*=(const double &c)
143 {
144 VecScale(_vector, c);
145 return *this;
146 }
147 inline IArray &operator/=(const double &c)
148 {
149 VecScale(_vector, 1.0 / c);
150 return *this;
151 }
152
154 {
155 throw std::runtime_error("unimplemented method");
156 }
157
159 {
160 throw std::runtime_error("unimplemented method");
161 }
162
164 {
165 throw std::runtime_error("unimplemented method");
166 }
167
169 {
170 throw std::runtime_error("unimplemented method");
171 }
172
173 void ToBinaryFile(const std::string &, const unsigned int & = 0, const unsigned int & = 0, const bool & = false) const
174 {
175 throw std::runtime_error("unimplemented method");
176 }
177
178 double Norm() const;
179
180 double Dot(const IArray &v) const;
181
182 inline void Copy(const IArray &v)
183 {
184 VecDuplicate(Cast(v), &_vector);
185 }
186};
187} // namespace Gedim
188
189#endif // ENABLE_PETSC
190
191#endif // __PETSc_Array_HPP
Eigen_Array< Eigen_ArrayType, Eigen_SparseArrayType > operator*(const double &other) const
Definition Eigen_Array.hpp:175
void SetSizes(const unsigned int &numCols, const unsigned int &=0)
Set the size the Array. Resize a Array for Eigen application.
Definition Eigen_Array.hpp:70
void Zeros()
Put zero-values in the Array.
Definition Eigen_Array.hpp:105
std::ostream & Print(std::ostream &output) const
Print the array.
Definition Eigen_Array.hpp:135
const double * Data() const
Definition Eigen_Array.hpp:79
void SubtractionMultiplication(const ISparseArray &A, const IArray &w)
Multiplication of matrix and vector and sum to local vector, equivalent to v -= A * w.
Definition Eigen_Array.cpp:88
double Norm() const
Definition Eigen_Array.hpp:193
double Dot(const IArray &v) const
Definition Eigen_Array.hpp:198
Eigen_ArrayType & Cast(IArray &v)
Definition Eigen_Array.hpp:51
void AddValue(const int &i, const double &val)
Add value to the Array.
Definition Eigen_Array.hpp:93
double GetValue(const int &i) const
Definition Eigen_Array.hpp:100
void SetSize(const unsigned int &numCols)
Set the size the Array. Resize a Array for Eigen application.
Definition Eigen_Array.hpp:66
void SetValue(const int &i, const double &val)
Set the Array Value.
Definition Eigen_Array.hpp:88
IArray & operator+=(const IArray &v)
Definition Eigen_Array.hpp:140
std::vector< double > GetValues(const std::vector< int > &indices={}) const
Definition Eigen_Array.cpp:44
unsigned int Size() const
Definition Eigen_Array.hpp:75
IArray & operator-=(const IArray &v)
Definition Eigen_Array.hpp:145
void Destroy()
Definition Eigen_Array.hpp:63
void ToBinaryFile(const std::string &filePath, const unsigned int &dataSizeToWrite=0, const unsigned int &dataStartingPositionToWrite=0, const bool &append=false) const
Write array to binary file.
Definition Eigen_Array.cpp:111
void Create()
Matrix create call. Last call to complete the matrix structure.
Definition Eigen_Array.hpp:60
void Constant(const double &c)
Definition Eigen_Array.hpp:113
IArray & operator*=(const double &c)
Definition Eigen_Array.hpp:150
void AddValues(const std::vector< int > &indices, const std::vector< double > &values)
Add values in the indices to the Array.
Definition Eigen_Array.cpp:35
void SetValues(const std::vector< int > &indices, const std::vector< double > &values)
Set the Array Values.
Definition Eigen_Array.cpp:26
Eigen_Array()
Definition Eigen_Array.hpp:28
void Concatenate(const IArray &v, const IArray &w)
Concatenate vectors, equivalent u<< v, w.
Definition Eigen_Array.hpp:130
void SumMultiplication(const ISparseArray &A, const IArray &w)
Multiplication of matrix and vector, equivalent to v += A * w.
Definition Eigen_Array.cpp:66
double & operator[](const int &i)
operator []
Definition Eigen_Array.hpp:121
IArray & operator/=(const double &c)
Definition Eigen_Array.hpp:155
void Copy(const IArray &v)
Copy the content of vector v inside this.
Definition Eigen_Array.hpp:203
Eigen_Array< Eigen_ArrayType, Eigen_SparseArrayType > operator+(const Eigen_Array< Eigen_ArrayType, Eigen_SparseArrayType > &other) const
Definition Eigen_Array.hpp:161
void Ones()
Put one-values in the Array.
Definition Eigen_Array.hpp:109
Eigen_Array< Eigen_ArrayType, Eigen_SparseArrayType > & operator=(Eigen_ArrayType &&vector)
Definition Eigen_Array.hpp:182
Eigen_Array< Eigen_ArrayType, Eigen_SparseArrayType > operator-(const Eigen_Array< Eigen_ArrayType, Eigen_SparseArrayType > &other) const
Definition Eigen_Array.hpp:168
Definition Eigen_Array.cpp:22