4#ifndef OILAB_PERIODICFUNCTIONIMPLEMENTATION_H
5#define OILAB_PERIODICFUNCTIONIMPLEMENTATION_H
10template <
typename Scalar,
int dim>
12 const Eigen::array<Eigen::Index, dim> &n,
13 const Eigen::Matrix<double, Eigen::Dynamic, dim> &_unitCell)
14 : values(n), unitCell(_unitCell) {
18 template<
typename Scalar,
int dim>
19 template<
typename T,
typename,
typename,
int dm,
typename>
21 const Eigen::Matrix<double,Eigen::Dynamic,dim>& _unitCell,
23 values(n), unitCell(_unitCell)
26 Eigen::Vector<double,Eigen::Dynamic> center=
unitCell.col(0)/2;
27 for (
int i = 0; i < n[0]; i++)
29 Eigen::Vector<double,Eigen::Dynamic> x=i*
unitCell.col(0)/n[0];
35 template<
typename Scalar,
int dim>
36 template<
typename T,
typename,
int dm,
typename>
38 const Eigen::Matrix<double,Eigen::Dynamic,dim>& _unitCell,
40 values(n), unitCell(_unitCell)
43 for (
int i = 0; i < n[0]; i++)
45 for (
int j = 0; j < n[1]; j++)
47 Eigen::Vector<double,Eigen::Dynamic> x=i*
unitCell.col(0)/n[0] + j*
unitCell.col(1)/n[1];
54 template<
typename Scalar,
int dim>
55 template<
typename T,
int dm,
typename>
57 const Eigen::Matrix<double,Eigen::Dynamic,dim>& _unitCell,
59 values(n), unitCell(_unitCell)
62 for (
int i = 0; i < n[0]; i++) {
63 for (
int j = 0; j < n[1]; j++) {
64 for (
int k = 0; k < n[2]; k++) {
65 Eigen::Vector<double,Eigen::Dynamic> x= i*
unitCell.col(0)/n[0] +
77 template<
typename Scalar,
int dim>
80 Eigen::Matrix<double,Eigen::Dynamic,dim> basisVectors(unitCell.transpose().completeOrthogonalDecomposition().pseudoInverse());
85 Eigen::Matrix<double,dim,dim> unitCellGramMatrix;
86 for(
int i=0; i<dim; ++i)
87 for(
int j=0; j<dim; ++j)
88 unitCellGramMatrix(i,j)= unitCell.col(i).dot(unitCell.col(j));
89 Eigen::array<Eigen::Index,dim> n= this->values.dimensions();
90 int prod= std::accumulate(std::begin(n),
94 pfhat.
values*= (sqrt(unitCellGramMatrix.determinant())/prod);
98 template<
typename Scalar,
int dim>
101 Eigen::Tensor<double,0> sum((this->values * other.
values).sum());
102 Eigen::Matrix<double,dim,dim> unitCellGramMatrix;
103 for(
int i=0; i<dim; ++i)
104 for(
int j=0; j<dim; ++j)
105 unitCellGramMatrix(i,j)= unitCell.col(i).dot(unitCell.col(j));
106 Eigen::array<Eigen::Index,dim> n= this->values.dimensions();
107 int prod= std::accumulate(std::begin(n),
110 std::multiplies<>{});
111 return sum(0)*sqrt(unitCellGramMatrix.determinant())/prod;
115 template<
typename Scalar,
int dim>
template <
typename T>
119 const auto pfhat(fft());
120 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)
Eigen::Tensor< Scalar, dim > values
PeriodicFunction(const Eigen::array< Eigen::Index, dim > &n, const Eigen::Matrix< double, Eigen::Dynamic, dim > &_unitCell)
const Eigen::Matrix< double, Eigen::Dynamic, dim > unitCell
double dot(const PeriodicFunction< Scalar, dim > &other) const
LatticeFunction< dcomplex, dim > fft() const