4#ifndef OILAB_LATTICEFUNCTIONIMPLEMENTATION_H
5#define OILAB_LATTICEFUNCTIONIMPLEMENTATION_H
11 template<
typename Scalar,
int dim>
13 const Eigen::Matrix<double,Eigen::Dynamic,dim>& _basisVectors) :
14 values(n), basisVectors(_basisVectors)
19 template<
typename Scalar,
int dim>
20 template<
typename T,
typename,
typename,
int dm,
typename>
22 const Eigen::Matrix<double, Eigen::Dynamic, dim> &_basisVectors,
24 values(n), basisVectors(_basisVectors) {
25 for (
int i = 0; i < n[0]; i++) {
26 int in= i > n[0]/2 ? i-n[0] : i;
31 template<
typename Scalar,
int dim>
32 template<
typename T,
typename,
int dm,
typename>
34 const Eigen::Matrix<double,Eigen::Dynamic,dim>& _basisVectors,
36 values(n), basisVectors(_basisVectors) {
37 for (
int i = 0; i < n[0]; i++) {
38 for (
int j = 0; j < n[1]; j++) {
40 int in= i > n[0]/2 ? i-n[0] : i;
41 int jn= j > n[1]/2 ? j-n[1] : j;
47 template<
typename Scalar,
int dim>
48 template<
typename T,
int dm,
typename>
50 const Eigen::Matrix<double, Eigen::Dynamic, dim> &_basisVectors,
52 values(n), basisVectors(_basisVectors) {
53 for (
int i = 0; i < n[0]; i++) {
54 for (
int j = 0; j < n[1]; j++) {
55 for (
int k = 0; k < n[2]; k++) {
57 int in= i>n[0]/2 ? i-n[0] : i;
58 int jn= j>n[1]/2 ? j-n[1] : j;
59 int kn= k>n[2]/2 ? k-n[2] : k;
68 template<
typename Scalar,
int dim>
71 Eigen::Tensor<std::complex<double>,0> sum((this->values * other.values.conjugate()).sum());
72 Eigen::Matrix<double,dim,dim> gramMatrix;
73 for(
int i=0; i<dim; ++i)
74 for(
int j=0; j<dim; ++j)
75 gramMatrix(i,j)= basisVectors.col(i).dot(basisVectors.col(j));
76 return sum(0) * sqrt(gramMatrix.determinant());
80 template<
typename Scalar,
int dim>
83 Eigen::Matrix<double,Eigen::Dynamic,dim> unitCell(basisVectors.transpose().completeOrthogonalDecomposition().pseudoInverse());
88 Eigen::Matrix<double,dim,dim> unitCellGramMatrix;
89 for(
int i=0; i<dim; ++i)
90 for(
int j=0; j<dim; ++j)
91 unitCellGramMatrix(i,j)= unitCell.col(i).dot(unitCell.col(j));
93 Eigen::array<Eigen::Index,dim> n= this->values.dimensions();
94 int prod= std::accumulate(std::begin(n),
102 template<
typename Scalar,
int dim>
106 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)