1 #ifndef flexDiagonalOperator_H 2 #define flexDiagonalOperator_H 5 #include "flexLinearOperator.h" 13 typedef thrust::device_vector<T> Tdata;
15 typedef std::vector<T> Tdata;
19 Tdata diagonalElements;
28 :
flexLinearOperator<T>(static_cast<int>(aDiagonalElements.size()), static_cast<int>(aDiagonalElements.size()), diagonalOp, aMinus)
30 this->diagonalElements.resize(aDiagonalElements.size());
33 thrust::copy(aDiagonalElements.begin(), aDiagonalElements.end(), this->diagonalElements.begin());
36 this->diagonalElements = aDiagonalElements;
46 flexDiagonalOperator(Tdata aDiagonalElements,
bool aMinus) : diagonalElements(aDiagonalElements),
flexLinearOperator<T>(static_cast<int>(aDiagonalElements.size()), static_cast<int>(aDiagonalElements.size()), diagonalOp, aMinus)
60 struct flexDiagonalOperatorFunctor
63 flexDiagonalOperatorFunctor(
const mySign _s) : s(_s){}
65 template <
typename Tuple>
67 void operator()(Tuple t)
73 thrust::get<0>(t) += thrust::get<1>(t) * thrust::get<2>(t);
78 thrust::get<0>(t) -= thrust::get<1>(t) * thrust::get<2>(t);
83 thrust::get<0>(t) = thrust::get<1>(t) * thrust::get<2>(t);
98 void times(
bool transposed,
const Tdata &input, Tdata &output)
100 this->doTimes(input,output,EQUALS);
103 void timesPlus(
bool transposed,
const Tdata &input, Tdata &output)
107 this->doTimes(input,output, MINUS);
111 this->doTimes(input,output, PLUS);
115 void timesMinus(
bool transposed,
const Tdata &input, Tdata &output)
119 this->doTimes(input,output, PLUS);
123 this->doTimes(input,output, MINUS);
131 #pragma omp parallel for 134 result[k] = std::abs(this->diagonalElements[k]);
142 Tdata diagonalElementsCopy = this->diagonalElements;
144 vectorAbs(diagonalElementsCopy);
146 return vectorMax(diagonalElementsCopy);
153 Tdata diagonalElementsCopy = this->diagonalElements;
155 vectorAbs(diagonalElementsCopy);
157 return diagonalElementsCopy;
162 void doTimesCPU(
const Tdata &input, Tdata &output,
const mySign s)
164 int numElements = (int)output.size();
166 #pragma omp parallel for 167 for (
int i = 0; i < numElements; ++i)
173 output[i] += input[i] * this->diagonalElements[i];
178 output[i] -= input[i] * this->diagonalElements[i];
183 output[i] = input[i] * this->diagonalElements[i];
190 void doTimes(
const Tdata &input, Tdata &output,
const mySign s)
194 thrust::make_zip_iterator(thrust::make_tuple(output.begin(), input.begin(), this->diagonalElements.begin())),
195 thrust::make_zip_iterator(thrust::make_tuple(output.end(), input.end(), this->diagonalElements.end())),
196 flexDiagonalOperatorFunctor(s));
198 this->doTimesCPU(input,output,s);
int getNumRows() const
returns number of rows of the linear operator
Definition: flexLinearOperator.h:57
flexDiagonalOperator< T > * copy()
copies the linear operator
Definition: flexDiagonalOperator.h:52
void timesPlus(bool transposed, const Tdata &input, Tdata &output)
applies linear operator on vector and adds its result to y
Definition: flexDiagonalOperator.h:103
bool isMinus
determines if operator is negated
Definition: flexLinearOperator.h:25
void times(bool transposed, const Tdata &input, Tdata &output)
applies linear operator on vector
Definition: flexDiagonalOperator.h:98
void timesMinus(bool transposed, const Tdata &input, Tdata &output)
applies linear operator on vector and substracts its result from y
Definition: flexDiagonalOperator.h:115
std::vector< T > getAbsRowSum(bool transposed)
returns a vector of sum of absolute values per row used for preconditioning
Definition: flexDiagonalOperator.h:127
T getMaxRowSumAbs(bool transposed)
returns the maximum sum of absolute values per row used for preconditioning
Definition: flexDiagonalOperator.h:140
flexDiagonalOperator(Tdata aDiagonalElements, bool aMinus)
initializes the concatenation operator for CUDA versions
Definition: flexDiagonalOperator.h:46
thrust::device_vector< T > getAbsRowSumCUDA(bool transposed)
same function as getAbsRowSum() but implemented in CUDA
Definition: flexDiagonalOperator.h:151
flexDiagonalOperator(std::vector< T > aDiagonalElements, bool aMinus)
initializes the concatenation operator for non-CUDA versions
Definition: flexDiagonalOperator.h:27
abstract base class for linear operators
Definition: flexLinearOperator.h:12
represents a diagonal operator
Definition: flexDiagonalOperator.h:9