10#include <unsupported/Eigen/CXX11/Tensor>
21 const Eigen::array<Eigen::Index,dim>
d;
23 explicit Diff(
const Eigen::array<Eigen::Index,dim>& d_,
24 const Eigen::Matrix<double,dim,dim>& A,
25 const Eigen::array<Eigen::Index,dim>& n_) :
29 for(
const auto& order :
d)
35 typename std::enable_if<dm==1,void>::type
38 Eigen::TensorMap<const Eigen::Tensor<double,dm>> xReal(x_in,
n);
39 const Eigen::Tensor<dcomplex,dm> x=xReal.template cast<dcomplex>();
40 Eigen::TensorMap<Eigen::Tensor<double,dm>> y(y_out,
n);
44 for(
const auto& order :
d)
46 totalOrder= totalOrder + order;
48 if (totalOrder == 0) {
54 Eigen::Tensor<dcomplex,dm> xhat(
n);
58 Eigen::Tensor<dcomplex,dm> d2fhat(
n);
62 for (
int i = 0; i <
n[0]; ++i) {
65 for (
int k= 0; k<dim; ++k) {
66 if (
d[k] == 0)
continue;
67 else if (
d[k] % 2 == 0)
68 r << (i <=
n[0] / 2 ? i : i -
n[0]);
70 r << (i ==
n[0] / 2 ? 0 : -
n[0] * (i / (
n[0] / 2)) + i);
71 factor = factor * std::pow(-2.0 * M_PI *
76 d2fhat(i)= xhat(i) * factor;
80 Eigen::Tensor<dcomplex,dm> Lf(
n);
87 typename std::enable_if<dm==2,void>::type
90 Eigen::TensorMap<const Eigen::Tensor<double,2>> xReal(x_in,
n);
91 const Eigen::Tensor<dcomplex,2> x=xReal.cast<
dcomplex>();
92 Eigen::TensorMap<Eigen::Tensor<double,2>> y(y_out,
n);
96 for(
const auto& order :
d)
98 totalOrder= totalOrder + order;
100 if (totalOrder == 0) {
106 Eigen::Tensor<dcomplex,2> xhat(
n);
110 Eigen::Tensor<dcomplex,2> d2fhat(
n);
114 for (
int i = 0; i <
n[0]; ++i) {
115 for (
int j = 0; j <
n[1]; ++j) {
118 for (
int k= 0; k<dim; ++k) {
119 if (
d[k] == 0)
continue;
120 else if (
d[k] % 2 == 0)
121 r << (i <=
n[0] / 2 ? i : i -
n[0]),
122 (j <=
n[1] / 2 ? j : j -
n[1]);
124 r << (i ==
n[0] / 2 ? 0 : -
n[0] * (i / (
n[0] / 2)) + i),
125 (j ==
n[1] / 2 ? 0 : -
n[1] * (j / (
n[1] / 2)) + j);
126 factor = factor * std::pow(-2.0 * M_PI *
131 d2fhat(i,j)= xhat(i,j) * factor;
136 Eigen::Tensor<dcomplex,2> Lf(
n);
143 typename std::enable_if<dm==3,void>::type
146 Eigen::TensorMap<const Eigen::Tensor<double,dm>> xReal(x_in,
n);
147 const Eigen::Tensor<dcomplex,dm> x=xReal.template cast<dcomplex>();
148 Eigen::TensorMap<Eigen::Tensor<double,dm>> y(y_out,
n);
152 for(
const auto& order :
d)
154 totalOrder= totalOrder + order;
156 if (totalOrder == 0) {
162 Eigen::Tensor<dcomplex,dm> xhat(
n);
166 Eigen::Tensor<dcomplex,dm> d2fhat(
n);
170 for (
int i = 0; i <
n[0]; ++i) {
171 for (
int j = 0; j <
n[1]; ++j) {
172 for (
int k = 0; k <
n[2]; ++k) {
175 for (
int l = 0; l < dm; ++l) {
176 if (
d[l] == 0)
continue;
177 else if (
d[l] % 2 == 0)
178 r << (i <=
n[0] / 2 ? i : i -
n[0]),
179 (j <=
n[1] / 2 ? j : j -
n[1]),
180 (k <=
n[2] / 2 ? k : k -
n[2]);
182 r << (i ==
n[0] / 2 ? 0 : -
n[0] * (i / (
n[0] / 2)) + i),
183 (j ==
n[1] / 2 ? 0 : -
n[1] * (j / (
n[1] / 2)) + j),
184 (k ==
n[2] / 2 ? 0 : -
n[2] * (k / (
n[2] / 2)) + k);
185 factor = factor * std::pow(-2.0 * M_PI *
190 d2fhat(i,j,k) = xhat(i,j,k) * factor;
196 Eigen::Tensor<dcomplex,dm> Lf(
n);
static void ifft(const Eigen::Tensor< dcomplex, 3 > &in, Eigen::Tensor< dcomplex, 3 > &out)
static void fft(const Eigen::Tensor< dcomplex, 3 > &in, Eigen::Tensor< dcomplex, 3 > &out)
std::enable_if< dm==1, void >::type perform_op(const double *x_in, double *y_out) const
std::enable_if< dm==2, void >::type perform_op(const double *x_in, double *y_out) const
const Eigen::array< Eigen::Index, dim > d
std::complex< double > dcomplex
Diff(const Eigen::array< Eigen::Index, dim > &d_, const Eigen::Matrix< double, dim, dim > &A, const Eigen::array< Eigen::Index, dim > &n_)
std::enable_if< dm==3, void >::type perform_op(const double *x_in, double *y_out) const
const Eigen::array< Eigen::Index, dim > n
VectorDimD cartesian() const