5#ifndef OILAB_OPERATOR_H
6#define OILAB_OPERATOR_H
9#include <unsupported/Eigen/CXX11/Tensor>
12 template<
typename Derived,
int dim>
18 const Eigen::array<Eigen::Index, dim>
n;
20 Operator(
const Eigen::Matrix<double,dim,dim>& A,
21 const Eigen::array<Eigen::Index,dim>& n_) :
derivedOperator(static_cast<const Derived &>(*this)),
27 auto domain()
const {
return L.latticeBasis; }
29 Eigen::Index
rows()
const {
return std::accumulate(begin(
n), end(
n), 1, std::multiplies<>()); }
30 Eigen::Index
cols()
const {
return std::accumulate(begin(
n), end(
n), 1, std::multiplies<>()); }
32 void perform_op(
const double *x_in,
double *y_out)
const {
40 template<
typename E1,
typename E2,
int dim>
50 assert(
o1.n ==
o2.n &&
o1.domain().isApprox(
o2.domain()));
53 void perform_op(
const double *x_in,
double *y_out)
const {
54 int nx = this->
rows();
55 Eigen::VectorXd y1(nx);
56 Eigen::VectorXd y2(nx);
57 o1.perform_op(x_in, y1.data());
58 o2.perform_op(x_in, y2.data());
59 Eigen::Map<Eigen::VectorXd> y(y_out, nx);
64 template<
typename E1,
typename E2,
int dim>
69 template<
typename T,
typename E,
int dim>
79 void perform_op(
const double* x_in,
double* y_out)
const {
80 int nx = this->
rows();
81 op.perform_op(x_in, y_out);
82 Eigen::Map<Eigen::VectorXd> y(y_out, nx);
87 template<
typename T,
typename E,
int dim>
const Derived & derivedOperator
Operator(const Eigen::Matrix< double, dim, dim > &A, const Eigen::array< Eigen::Index, dim > &n_)
Eigen::Index cols() const
Eigen::Index rows() const
void perform_op(const double *x_in, double *y_out) const
const Eigen::array< Eigen::Index, dim > n
void perform_op(const double *x_in, double *y_out) const
OperatorScalarProduct(const T &s_, const E &op_)
void perform_op(const double *x_in, double *y_out) const
OperatorSum(const E1 &o1_, const E2 &o2_)
OperatorSum< E1, E2, dim > operator+(const Operator< E1, dim > &u, const Operator< E2, dim > &v)
LatticeVector< dim > operator*(const typename LatticeVector< dim >::IntScalarType &scalar, const LatticeVector< dim > &L)