4#ifndef OILAB_PERIODICFUNCTIONIMPLEMENTATION_H
5#define OILAB_PERIODICFUNCTIONIMPLEMENTATION_H
11 template<
typename Scalar,
int dim>
13 const Eigen::Matrix<double,Eigen::Dynamic,dim>& _unitCell) :
14 values(n), unitCell(_unitCell)
19 template<
typename Scalar,
int dim>
20 template<
typename T,
typename,
typename,
int dm,
typename>
22 const Eigen::Matrix<double,Eigen::Dynamic,dim>& _unitCell,
24 values(n), unitCell(_unitCell)
27 Eigen::Vector<double,Eigen::Dynamic> center=
unitCell.col(0)/2;
28 for (
int i = 0; i < n[0]; i++)
30 Eigen::Vector<double,Eigen::Dynamic> x=i*
unitCell.col(0)/n[0];
36 template<
typename Scalar,
int dim>
37 template<
typename T,
typename,
int dm,
typename>
39 const Eigen::Matrix<double,Eigen::Dynamic,dim>& _unitCell,
41 values(n), unitCell(_unitCell)
44 for (
int i = 0; i < n[0]; i++)
46 for (
int j = 0; j < n[1]; j++)
48 Eigen::Vector<double,Eigen::Dynamic> x=i*
unitCell.col(0)/n[0] + j*
unitCell.col(1)/n[1];
55 template<
typename Scalar,
int dim>
56 template<
typename T,
int dm,
typename>
58 const Eigen::Matrix<double,Eigen::Dynamic,dim>& _unitCell,
60 values(n), unitCell(_unitCell)
63 for (
int i = 0; i < n[0]; i++) {
64 for (
int j = 0; j < n[1]; j++) {
65 for (
int k = 0; k < n[2]; k++) {
66 Eigen::Vector<double,Eigen::Dynamic> x= i*
unitCell.col(0)/n[0] +
78 template<
typename Scalar,
int dim>
81 Eigen::Matrix<double,Eigen::Dynamic,dim> basisVectors(unitCell.transpose().completeOrthogonalDecomposition().pseudoInverse());
86 Eigen::Matrix<double,dim,dim> unitCellGramMatrix;
87 for(
int i=0; i<dim; ++i)
88 for(
int j=0; j<dim; ++j)
89 unitCellGramMatrix(i,j)= unitCell.col(i).dot(unitCell.col(j));
90 Eigen::array<Eigen::Index,dim> n= this->values.dimensions();
91 int prod= std::accumulate(std::begin(n),
95 pfhat.
values*= (sqrt(unitCellGramMatrix.determinant())/prod);
99 template<
typename Scalar,
int dim>
102 Eigen::Tensor<double,0> sum((this->values * other.
values).sum());
103 Eigen::Matrix<double,dim,dim> unitCellGramMatrix;
104 for(
int i=0; i<dim; ++i)
105 for(
int j=0; j<dim; ++j)
106 unitCellGramMatrix(i,j)= unitCell.col(i).dot(unitCell.col(j));
107 Eigen::array<Eigen::Index,dim> n= this->values.dimensions();
108 int prod= std::accumulate(std::begin(n),
111 std::multiplies<>{});
112 return sum(0)*sqrt(unitCellGramMatrix.determinant())/prod;
116 template<
typename Scalar,
int dim>
template <
typename T>
120 const auto pfhat(fft());
121 Eigen::array<Eigen::Index,dim> n= values.dimensions();
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)
Eigen::Tensor< Scalar, dim > values
PeriodicFunction< Scalar, dim > kernelConvolution(const Function< T, Scalar > &kernel)
PeriodicFunction(const Eigen::array< Eigen::Index, dim > &n, const Eigen::Matrix< double, Eigen::Dynamic, dim > &_unitCell)
LatticeFunction< dcomplex, dim > fft() const
Eigen::Tensor< Scalar, dim > values
const Eigen::Matrix< double, Eigen::Dynamic, dim > unitCell
double dot(const PeriodicFunction< Scalar, dim > &other) const