oILAB
Loading...
Searching...
No Matches
FunctionImplementation.h
Go to the documentation of this file.
1//
2// Created by Nikhil Chandra Admal on 5/30/24.
3//
4
5#ifndef OILAB_FUNCTIONIMPLEMENTATION_H
6#define OILAB_FUNCTIONIMPLEMENTATION_H
7
8#include <iostream>
9#include <numbers>
10
11namespace gbLAB
12{
13 template<typename Derived, typename Scalar>
15 derivedFunction( static_cast<const Derived&>(*this)),
16 domainSize(_domainSize)
17 {}
18
19 template<typename Derived, typename Scalar>
20 Scalar Function<Derived,Scalar>::operator()(const Eigen::Vector<double,Eigen::Dynamic>& vec) const
21 {
22 return derivedFunction(vec);
23 }
24
25 /*
26 template<typename Derived, typename Scalar>
27 template<int dim>
28 LatticeFunction<typename Function<Derived,Scalar>::dcomplex,dim>
29 Function<Derived,Scalar>::fft(const std::array<Eigen::Index,dim>& n, const Eigen::Matrix<double,Eigen::Dynamic,dim>& basisVectors) const
30 {
31 // Initialize a zero periodic function and its fft
32 LatticeFunction<dcomplex,dim> pfhat(n,basisVectors);
33 PeriodicFunction<std::complex<double>,dim> pf_complex(pfhat.ifft());
34 PeriodicFunction<double,dim> pf(pf_complex.values.dimensions(),pf_complex.unitCell);
35 pf.values= pf_complex.values.real();
36
37 Eigen::Vector<double, Eigen::Dynamic> factor, inversePlaneDistances;
38 inversePlaneDistances = basisVectors.colwise().norm();
39 factor = (2.0 * domainSize * inversePlaneDistances).array().ceil();
40 //std::cout << "Scaling the lattice by factors = " << factor.transpose() << std::endl;
41 Eigen::Matrix<double, Eigen::Dynamic, dim> scaledUnitCell= pf.unitCell.array().rowwise() * factor.array().transpose();
42
43 Eigen::array<Eigen::Index, dim> nRefined = n;
44 for (int i = 0; i < dim; i++) {
45 nRefined[i] = factor(i) * n[i];
46 }
47
48 // pkf - periodic kernel function
49 PeriodicFunction<double,dim> pfRefined(nRefined, scaledUnitCell, *this);
50 LatticeFunction<dcomplex, dim> pfhatRefined(pfRefined.fft());
51
53 // LatticeFunction<dcomplex,dim> temp(nRefined, pfhatRefined.basisVectors);
54 // Eigen::Vector<double, Eigen::Dynamic> center = pfRefined.unitCell.rowwise().sum()/2;
55 // Exponential exp_function(center);
56 // LatticeFunction<dcomplex, dim> exp_factor(nRefined, pfhatRefined.basisVectors, exp_function);
57 // temp.values = exp_factor.values * pfhatRefined.values;
58 // pfhatRefined.values = temp.values;
59
60 Eigen::array<Eigen::DenseIndex, dim> strides;
61 strides.fill(1);
62 for (int i = 0; i < dim; i++)
63 strides[i] = factor(i);
64
65 pfhat.values = pfhatRefined.values.stride(strides);
66
67 return pfhat;
68
69 }
70 */
71
72 /* ******************************************** */
73
74 Exponential::Exponential(const Eigen::Vector<double,Eigen::Dynamic>& _x) : x(_x){}
75 std::complex<double> Exponential::operator()(const Eigen::Vector<double,Eigen::Dynamic>& vec) const
76 {
77 return exp(2*std::numbers::pi*std::complex<double>(0,1)*vec.dot(x));
78 }
79
80 /* ******************************************** */
81 template<typename T, typename Scalar>
82 Shift<T,Scalar>::Shift(const Eigen::Vector<double,Eigen::Dynamic>& t,
83 const Function<T,Scalar>& fun):
84 Function<Shift<T,Scalar>,Scalar>(fun.domainSize),
85 t(t),fun(fun)
86 {}
87 template<typename T, typename Scalar>
88 Scalar Shift<T,Scalar>::operator()(const Eigen::Vector<double,Eigen::Dynamic>& y) const
89 {
90 //return fun(y+t);
91 return fun(t-y);
92 }
93}
94#endif
std::complex< double > operator()(const Eigen::Vector< double, Eigen::Dynamic > &vec) const
const Eigen::Vector< double, Eigen::Dynamic > & x
Definition Function.h:42
Exponential(const Eigen::Vector< double, Eigen::Dynamic > &_x)
Scalar operator()(const Eigen::Vector< double, Eigen::Dynamic > &vec) const
Function(double _domainSize=std::numeric_limits< double >::infinity())
Scalar operator()(const Eigen::Vector< double, Eigen::Dynamic > &y) const
Shift(const Eigen::Vector< double, Eigen::Dynamic > &t, const Function< T, Scalar > &fun)