17 #ifndef OPTIMIZED_BREAKUP_H 18 #define OPTIMIZED_BREAKUP_H 20 #include "blitz/array.h" 32 virtual void Set_rc(
double rc) = 0;
39 virtual double h(
int n,
double r) = 0;
41 virtual double c(
int n,
double k) = 0;
42 virtual double dc_dk(
int n,
double k) = 0;
61 void Addk(
double k,
double degeneracy = 1.0);
66 void SetkVecs(
double kc,
double kcont,
double kMax);
84 Omega = box[0] * box[1] * box[2];
101 inline std::complex<double>
Eplus(
int i,
double k,
int n);
102 inline std::complex<double>
Eminus(
int i,
double k,
int n);
103 inline double Dplus(
int i,
double k,
int n);
104 inline double Dminus(
int i,
double k,
int n);
105 inline std::complex<double>
dEplus_dk(
int i,
double k,
int n);
106 inline std::complex<double>
dEminus_dk(
int i,
double k,
int n);
107 inline double dDplus_dk(
int i,
double k,
int n);
117 double h(
int n,
double r);
118 double c(
int n,
double k);
119 double dc_dk(
int n,
double k);
122 S = 1.0, 0.0, 0.0, -10.0, 15.0, -6.0, 0.0, 1.0, 0.0, -6.0, 8.0, -3.0, 0.0, 0.0, 0.5, -1.5, 1.5, -0.5;
128 std::complex<double> eye(0.0, 1.0);
134 return (-(eye / k) * e1 * e2);
138 std::complex<double> t1, t2;
140 t1 = std::complex<double>(
cos(k *
delta * (i + 1)),
sin(k *
delta * (i + 1)));
143 return (-(eye / k) * (t1 + t2));
149 std::complex<double> eye(0.0, 1.0);
157 return ((eye / (k * k)) * e1 * e2 - (eye / k) * (de1 * e2 + e1 * de2));
161 std::complex<double> t1, t2, dt1, dt2;
163 t1 = std::complex<double>(
cos(k *
delta * (i + 1)),
sin(k *
delta * (i + 1)));
167 return ((eye / (k * k)) * (t1 + t2) - (eye / k) * (dt1 + dt2));
173 std::complex<double> eye(0.0, 1.0);
179 return (-(eye / k) * e1 * e2);
183 std::complex<double> t1, t2;
184 double sign = (
n & 1) ? -1.0 : 1.0;
187 return (-(eye / k) * (t1 + t2));
193 std::complex<double> eye(0.0, 1.0);
201 return ((eye / (k * k)) * e1 * e2 - (eye / k) * (de1 * e2 + e1 * de2));
205 std::complex<double> t1, t2, dt1, dt2;
206 double sign = (
n & 1) ? -1.0 : 1.0;
212 return ((eye / (k * k)) * (t1 + t2) - (eye / k) * (dt1 + dt2));
219 std::complex<double> eye(0.0, 1.0);
220 std::complex<double> Z1 =
Eplus(i, k,
n + 1);
221 std::complex<double> Z2 =
Eplus(i, k,
n);
222 return 4.0 * M_PI / (k *
Omega) * (
delta * Z1.imag() + i *
delta * Z2.imag());
227 std::complex<double> eye(0.0, 1.0);
228 std::complex<double> Z1 =
Eplus(i, k,
n + 1);
229 std::complex<double> Z2 =
Eplus(i, k,
n);
230 std::complex<double> dZ1 =
dEplus_dk(i, k,
n + 1);
231 std::complex<double> dZ2 =
dEplus_dk(i, k,
n);
232 return -4.0 * M_PI / (k * k *
Omega) * (
delta * Z1.imag() + i *
delta * Z2.imag()) +
233 4.0 * M_PI / (k *
Omega) * (
delta * dZ1.imag() + i *
delta * dZ2.imag());
238 std::complex<double> eye(0.0, 1.0);
239 std::complex<double> Z1 =
Eminus(i, k,
n + 1);
240 std::complex<double> Z2 =
Eminus(i, k,
n);
241 return -4.0 * M_PI / (k *
Omega) * (
delta * Z1.imag() + i *
delta * Z2.imag());
246 std::complex<double> eye(0.0, 1.0);
247 std::complex<double> Z1 =
Eminus(i, k,
n + 1);
248 std::complex<double> dZ1 =
dEminus_dk(i, k,
n + 1);
249 std::complex<double> Z2 =
Eminus(i, k,
n);
251 return 4.0 * M_PI / (k * k *
Omega) * (
delta * Z1.imag() + i *
delta * Z2.imag()) -
252 4.0 * M_PI / (k *
Omega) * (
delta * dZ1.imag() + i *
delta * dZ2.imag());
BasisClass()
This returns the coefficient of the nth basis function.
virtual int NumElements()=0
Returns the number of basis elements.
virtual double h(int n, double r)=0
Returns the basis element n evaluated in real space at r.
double dDplus_dk(int i, double k, int n)
void Addk(double k, double degeneracy=1.0)
MakeReturn< UnaryNode< FnSin, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t sin(const Vector< T1, C1 > &l)
virtual void Set_rc(double rc)=0
Set the cutoff radius.
std::complex< double > dEplus_dk(int i, double k, int n)
int NumElements()
Returns the number of basis elements.
void SetkVecs(double kc, double kcont, double kMax)
double h(int n, double r)
Returns the basis element n evaluated in real space at r.
TinyMatrix< double, 3, 6 > S
std::complex< double > Eminus(int i, double k, int n)
MakeReturn< UnaryNode< FnCos, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t cos(const Vector< T1, C1 > &l)
double c(int n, double k)
Returns the basis element n evaluated in k space at k.
double c_numerical(int n, double k)
double DoBreakup(const Array< double, 1 > &Vk, Array< double, 1 > &t, const Array< bool, 1 > &adjust)
kc is the k-space cutoff for the Ewald sum.
void Set_rc(double rc)
Set the cutoff radius.
virtual double dc_dk(int n, double k)=0
TinyVector< double, 3 > Box
double Dplus(int i, double k, int n)
OptimizedBreakupClass(BasisClass &basis)
Locally Piecewise Quintic Hermite Interpolant.
double dc_dk(int n, double k)
double dDminus_dk(int i, double k, int n)
Array< TinyVector< double, 2 >, 1 > kpoints
double Dminus(int i, double k, int n)
std::complex< double > dEminus_dk(int i, double k, int n)
void SetBox(TinyVector< double, 3 > box)
virtual double c(int n, double k)=0
Returns the basis element n evaluated in k space at k.
A D-dimensional Array class based on PETE.
TinyVector< double, 3 > GetBox()
int NumKnots
public is HACK
std::complex< double > Eplus(int i, double k, int n)
The following are helpers to calculate the Fourier transform of the basis functions.