4#ifndef OILAB_LATTICEFUNCTIONIMPLEMENTATION_H
5#define OILAB_LATTICEFUNCTIONIMPLEMENTATION_H
12 template<
typename Scalar,
int dim>
14 const Eigen::Matrix<double,Eigen::Dynamic,dim>& _basisVectors) :
15 values(n), basisVectors(_basisVectors)
20 template<
typename Scalar,
int dim>
21 template<
typename T,
typename,
typename,
int dm,
typename>
23 const Eigen::Matrix<double, Eigen::Dynamic, dim> &_basisVectors,
25 values(n), basisVectors(_basisVectors) {
26 for (
int i = 0; i < n[0]; i++) {
27 int in= i > n[0]/2 ? i-n[0] : i;
32 template<
typename Scalar,
int dim>
33 template<
typename T,
typename,
int dm,
typename>
35 const Eigen::Matrix<double,Eigen::Dynamic,dim>& _basisVectors,
37 values(n), basisVectors(_basisVectors) {
38 for (
int i = 0; i < n[0]; i++) {
39 for (
int j = 0; j < n[1]; j++) {
41 int in= i > n[0]/2 ? i-n[0] : i;
42 int jn= j > n[1]/2 ? j-n[1] : j;
48 template<
typename Scalar,
int dim>
49 template<
typename T,
int dm,
typename>
51 const Eigen::Matrix<double, Eigen::Dynamic, dim> &_basisVectors,
53 values(n), basisVectors(_basisVectors) {
54 for (
int i = 0; i < n[0]; i++) {
55 for (
int j = 0; j < n[1]; j++) {
56 for (
int k = 0; k < n[2]; k++) {
58 int in= i>n[0]/2 ? i-n[0] : i;
59 int jn= j>n[1]/2 ? j-n[1] : j;
60 int kn= k>n[2]/2 ? k-n[2] : k;
69 template<
typename Scalar,
int dim>
72 Eigen::Tensor<std::complex<double>,0> sum((this->values * other.values.conjugate()).sum());
73 Eigen::Matrix<double,dim,dim> gramMatrix;
74 for(
int i=0; i<dim; ++i)
75 for(
int j=0; j<dim; ++j)
76 gramMatrix(i,j)= basisVectors.col(i).dot(basisVectors.col(j));
77 return sum(0) * sqrt(gramMatrix.determinant());
81 template<
typename Scalar,
int dim>
84 Eigen::Matrix<double,Eigen::Dynamic,dim> unitCell(basisVectors.transpose().completeOrthogonalDecomposition().pseudoInverse());
89 Eigen::Matrix<double,dim,dim> unitCellGramMatrix;
90 for(
int i=0; i<dim; ++i)
91 for(
int j=0; j<dim; ++j)
92 unitCellGramMatrix(i,j)= unitCell.col(i).dot(unitCell.col(j));
94 Eigen::array<Eigen::Index,dim> n= this->values.dimensions();
95 int prod= std::accumulate(std::begin(n),
103 template<
typename Scalar,
int dim>
107 const auto n= lf1.
values.dimensions();
static void ifft(const Eigen::Tensor< dcomplex, 3 > &in, Eigen::Tensor< dcomplex, 3 > &out)
Eigen::Tensor< Scalar, dim > values
PeriodicFunction< dcomplex, dim > ifft() const
const Eigen::Matrix< double, Eigen::Dynamic, dim > basisVectors
std::complex< double > dcomplex
LatticeFunction(const Eigen::array< Eigen::Index, dim > &n, const Eigen::Matrix< double, Eigen::Dynamic, dim > &_basisVectors)
std::complex< double > dot(const LatticeFunction< std::complex< double >, dim > &other) const
Eigen::Tensor< Scalar, dim > values
LatticeVector< dim > operator*(const typename LatticeVector< dim >::IntScalarType &scalar, const LatticeVector< dim > &L)