15 #ifndef QMCPLUSPLUS_PARTICLE_BCONDS_3D_H 16 #define QMCPLUSPLUS_PARTICLE_BCONDS_3D_H 28 T Linv0, L0, Linv1, L1, Linv2, L2,
r2max, dummy;
31 : Linv0(lat.OneOverLength[0]),
33 Linv1(lat.OneOverLength[1]),
35 Linv2(lat.OneOverLength[2]),
37 r2max(lat.CellRadiusSq),
46 T x = displ[0] * Linv0;
47 displ[0] = L0 * (x - round(x));
48 T y = displ[1] * Linv1;
49 displ[1] = L1 * (y - round(y));
50 T z = displ[2] * Linv2;
51 displ[2] = L2 * (z - round(z));
52 return displ[0] * displ[0] + displ[1] * displ[1] + displ[2] * displ[2];
59 const int n = r.size();
61 for (
int i = 0; i <
n; ++i)
69 for (
int i = 0; i < dr.size(); ++i)
70 r[i] =
dot(dr[i], dr[i]);
75 for (
int i = 0; i <
n; ++i)
87 T r00, r10, r20, r01, r11, r21, r02, r12,
r22;
88 T g00, g10, g20, g01, g11, g21, g02, g12,
g22;
119 displ[0] * g01 + displ[1] * g11 + displ[2] * g21,
120 displ[0] * g02 + displ[1] * g12 + displ[2] * g22);
122 ar[0] -= round(ar[0]);
123 ar[1] -= round(ar[1]);
124 ar[2] -= round(ar[2]);
126 displ[0] = ar[0] * r00 + ar[1] * r10 + ar[2] * r20;
127 displ[1] = ar[0] * r01 + ar[1] * r11 + ar[2] * r21;
128 displ[2] = ar[0] * r02 + ar[1] * r12 + ar[2] * r22;
129 return displ[0] * displ[0] + displ[1] * displ[1] + displ[2] * displ[2];
134 const int n = dr.size();
135 for (
int i = 0; i <
n; ++i)
143 for (
int i = 0; i < dr.size(); ++i)
149 for (
int i = 0; i <
n; ++i)
162 T g00, g10, g20, g01, g11, g21, g02, g12,
g22;
173 for (
int i = 0; i < 3; ++i)
174 for (
int j = 0; j < 3; ++j)
175 rbt(i, j) = rb[i][j];
180 corners[1] = minusone * (rb[0]);
181 corners[2] = minusone * (rb[1]);
182 corners[3] = minusone * (rb[2]);
183 corners[4] = minusone * (rb[0] + rb[1]);
184 corners[5] = minusone * (rb[0] + rb[2]);
185 corners[6] = minusone * (rb[1] + rb[2]);
186 corners[7] = minusone * (rb[0] + rb[1] + rb[2]);
208 displ[0] * g01 + displ[1] * g11 + displ[2] * g21,
209 displ[0] * g02 + displ[1] * g12 + displ[2] * g22);
213 displ += ar[0] * rb[0] + ar[1] * rb[1] + ar[2] * rb[2];
214 T rmin2 =
dot(displ, displ);
216 for (
int i = 1; i < corners.size(); ++i)
227 displ += corners[imin];
233 const int n = dr.size();
234 for (
int i = 0; i <
n; ++i)
242 for (
int i = 0; i < dr.size(); ++i)
248 for (
int i = 0; i <
n; ++i)
275 corners[1] = minusone * (rb[0]);
276 corners[2] = minusone * (rb[1]);
277 corners[3] = minusone * (rb[0] + rb[1]);
283 TinyVector<T, 2> ar(displ[0] * g00 + displ[1] * g10, displ[0] * g01 + displ[1] * g11);
287 displ += ar[0] * rb[0] + ar[1] * rb[1];
288 T rmin2 =
dot(displ, displ);
290 for (
int i = 1; i < corners.size(); ++i)
301 displ += corners[imin];
307 const int n = dr.size();
308 for (
int i = 0; i <
n; ++i)
316 for (
int i = 0; i < dr.size(); ++i)
322 for (
int i = 0; i <
n; ++i)
335 : Linv0(lat.OneOverLength[0]), L0(lat.Length[0]), Linv1(lat.OneOverLength[1]), L1(lat.Length[1])
342 T x = displ[0] * Linv0;
343 displ[0] = L0 * (x - round(x));
344 T y = displ[1] * Linv1;
345 displ[1] = L1 * (y - round(y));
346 return displ[0] * displ[0] + displ[1] * displ[1] + displ[2] * displ[2];
353 const int n = r.size();
355 for (
int i = 0; i <
n; ++i)
363 for (
int i = 0; i < dr.size(); ++i)
364 r[i] =
dot(dr[i], dr[i]);
369 for (
int i = 0; i <
n; ++i)
398 TinyVector<T, 2> ar(displ[0] * g00 + displ[1] * g10, displ[0] * g01 + displ[1] * g11);
400 ar[0] -= round(ar[0]);
401 ar[1] -= round(ar[1]);
403 displ[0] = ar[0] * r00 + ar[1] * r10;
404 displ[1] = ar[0] * r01 + ar[1] * r11;
405 return displ[0] * displ[0] + displ[1] * displ[1] + displ[2] * displ[2];
410 const int n = dr.size();
411 for (
int i = 0; i <
n; ++i)
419 for (
int i = 0; i < dr.size(); ++i)
425 for (
int i = 0; i <
n; ++i)
447 T x = displ[0] * Linv0;
448 displ[0] = L0 * (x - round(x));
449 return displ[0] * displ[0] + displ[1] * displ[1] + displ[2] * displ[2];
456 const int n = r.size();
458 for (
int i = 0; i <
n; ++i)
466 for (
int i = 0; i < dr.size(); ++i)
467 r[i] =
dot(dr[i], dr[i]);
472 for (
int i = 0; i <
n; ++i)
484 T r00, r10, r20, r01, r11, r21, r02, r12,
r22;
485 T g00, g10, g20, g01, g11, g21, g02, g12,
g22;
508 r2max(lat.CellRadiusSq)
510 nextcells.resize(26);
512 for (
int i = -1; i <= 1; ++i)
513 for (
int j = -1; j <= 1; ++j)
514 for (
int k = -1; k <= 1; ++k)
518 nextcells[ic][0] = i * r00 + j * r10 + k * r20;
519 nextcells[ic][1] = i * r01 + j * r11 + k * r21;
520 nextcells[ic][2] = i * r02 + j * r12 + k * r22;
535 T d2 = a[0] * a[0] + a[1] * a[1] + a[2] * a[2];
542 for (
int i = 0; i < nextcells.size(); ++i)
545 d2 = c[0] * c[0] + c[1] * c[1] + c[2] * c[2];
567 displ[0] * g01 + displ[1] * g11 + displ[2] * g21,
568 displ[0] * g02 + displ[1] * g12 + displ[2] * g22);
570 ar[0] -= round(ar[0]);
571 ar[1] -= round(ar[1]);
572 ar[2] -= round(ar[2]);
574 displ[0] = ar[0] * r00 + ar[1] * r10 + ar[2] * r20;
575 displ[1] = ar[0] * r01 + ar[1] * r11 + ar[2] * r21;
576 displ[2] = ar[0] * r02 + ar[1] * r12 + ar[2] * r22;
578 return get_min_distance(displ);
587 inline void convert2Cart(
const T* restrict in, T* restrict out,
int n)
const 589 for (
int i = 0, i3 = 0; i <
n; ++i, i3 += 3)
591 out[i3] = in[i3] * r00 + in[i3 + 1] * r10 + in[i3 + 2] * r20;
592 out[i3 + 1] = in[i3] * r01 + in[i3 + 1] * r11 + in[i3 + 2] * r21;
593 out[i3 + 2] = in[i3] * r02 + in[i3 + 1] * r12 + in[i3 + 2] * r22;
597 inline void convert2Unit(
const T* restrict in, T* restrict out,
int n)
const 599 for (
int i = 0, i3 = 0; i <
n; ++i, i3 += 3)
601 out[i3] = in[i3] * g00 + in[i3 + 1] * g10 + in[i3 + 2] * g20;
602 out[i3 + 1] = in[i3] * g01 + in[i3 + 1] * g11 + in[i3 + 2] * g21;
603 out[i3 + 2] = in[i3] * g02 + in[i3 + 1] * g12 + in[i3 + 2] * g22;
609 const int n = dr.size();
610 for (
int i = 0; i <
n; ++i)
624 for (
int i = 0; i < dr.size(); ++i)
630 for (
int i = 0; i <
n; ++i)
654 r2max(lat.CellRadiusSq)
658 for (
int i = -1; i <= 1; ++i)
659 for (
int j = -1; j <= 1; ++j)
663 nextcells[ic][0] = i * r00 + j * r10;
664 nextcells[ic][1] = i * r01 + j * r11;
665 nextcells[ic][2] = 0;
680 T d2 = a[0] * a[0] + a[1] * a[1] + a[2] * a[2];
687 for (
int i = 0; i < 8; ++i)
690 d2 = c[0] * c[0] + c[1] * c[1] + c[2] * c[2];
711 TinyVector<T, 2> ar(displ[0] * g00 + displ[1] * g10, displ[0] * g01 + displ[1] * g11);
713 ar[0] -= round(ar[0]);
714 ar[1] -= round(ar[1]);
716 displ[0] = ar[0] * r00 + ar[1] * r10;
717 displ[1] = ar[0] * r01 + ar[1] * r11;
719 return get_min_distance(displ);
724 const int n = dr.size();
725 for (
int i = 0; i <
n; ++i)
733 for (
int i = 0; i < dr.size(); ++i)
739 for (
int i = 0; i <
n; ++i)
747 #endif // OHMMS_PARTICLE_BCONDS_3D_H T apply_bc(TinyVector< T, 3 > &displ) const
apply BC to a displacement vector a and return the minimum-image distance
a class that defines a supercell in D-dimensional Euclean space.
void evaluate_rsquared(TinyVector< T, 3 > *restrict dr, T *restrict rr, int n)
void evaluate_rsquared(TinyVector< T, 3 > *restrict dr, T *restrict rr, int n)
std::vector< TinyVector< T, 3 > > corners
void apply_bc(std::vector< TinyVector< T, 3 >> &dr, std::vector< T > &r, std::vector< T > &rinv) const
evaluate displacement data for a vector
helper functions for EinsplineSetBuilder
void convert2Cart(const T *restrict in, T *restrict out, int n) const
out = prod (in ,lattice)
DTD_BConds(const CrystalLattice< T, 3 > &lat)
T apply_bc(TinyVector< T, 3 > &displ) const
apply BC to a displacement vector a and return the minimum-image distance
void apply_bc(std::vector< TinyVector< T, 3 >> &dr, std::vector< T > &r, std::vector< T > &rinv) const
T apply_bc(TinyVector< T, 3 > &displ) const
apply BC to a displacement vector a and return the minimum-image distance
void evaluate_rsquared(TinyVector< T, 3 > *restrict dr, T *restrict rr, int n)
T apply_bc(TinyVector< T, 3 > &displ) const
apply BC to a displacement vector a and return the minimum-image distance
DTD_BConds(const CrystalLattice< T, 3 > &lat)
void convert2Unit(const T *restrict in, T *restrict out, int n) const
void apply_bc(std::vector< TinyVector< T, 3 >> &dr, std::vector< T > &r, std::vector< T > &rinv) const
evaluate displacement data for a vector
T apply_bc(TinyVector< T, 3 > &displ) const
apply BC to a displacement vector a and return the minimum-image distance
Tensor_t G
Reciprocal unit vectors. G(j,i) i=vector and j=x,y,z.
T apply_bc(TinyVector< T, 3 > &displ) const
evaluate |a| and apply boundary conditions on a
Declaration of CrystalLattice<T,D>
TinyVector< TinyVector< T, 3 >, 3 > rb
DTD_BConds(const CrystalLattice< T, 3 > &lat)
void evaluate_rsquared(TinyVector< T, 3 > *restrict dr, T *restrict rr, int n)
DTD_BConds(const CrystalLattice< T, 3 > &lat)
T apply_bc(TinyVector< T, D > &displ) const
apply BC on displ and return |displ|^2
void apply_bc(std::vector< TinyVector< T, 3 >> &dr, std::vector< T > &r) const
void apply_bc(std::vector< TinyVector< T, 3 >> &dr, std::vector< T > &r, std::vector< T > &rinv) const
void apply_bc(std::vector< TinyVector< T, 3 >> &dr, std::vector< T > &r) const
T apply_bc(TinyVector< T, 3 > &displ) const
apply BC on a displacement vector
DTD_BConds(const CrystalLattice< T, 3 > &lat)
void evaluate_rsquared(TinyVector< T, 3 > *restrict dr, T *restrict rr, int n)
void apply_bc(std::vector< TinyVector< T, 3 >> &dr, std::vector< T > &r, std::vector< T > &rinv) const
void apply_bc(std::vector< TinyVector< T, 3 >> &dr, std::vector< T > &r) const
T apply_bc(TinyVector< T, 3 > &displ) const
Tensor<T,D> class for D by D tensor.
void evaluate_rsquared(TinyVector< T, 3 > *restrict dr, T *restrict rr, int n)
DTD_BConds(const CrystalLattice< T, 3 > &lat)
DTD_BConds(const CrystalLattice< T, 3 > &lat)
void apply_bc(std::vector< TinyVector< T, 3 >> &dr, std::vector< T > &r, std::vector< T > &rinv) const
evaluate displacement data for a vector
std::vector< TinyVector< T, 3 > > corners
SingleParticlePos a(int i) const
Provide interfaces familiar to fotran users.
void apply_bc(std::vector< TinyVector< T, 3 >> &dr, std::vector< T > &r) const
std::vector< TinyVector< T, 3 > > nextcells
void inv(const T *restrict in, T *restrict out, int n)
void evaluate_rsquared(TinyVector< T, 3 > *restrict dr, T *restrict rr, int n)
void apply_bc(std::vector< TinyVector< T, 3 >> &dr, std::vector< T > &r) const
void find_reduced_basis(TinyVector< TinyVector< T, 3 >, 3 > &rb)
void apply_bc(std::vector< TinyVector< T, 3 >> &dr, std::vector< T > &r, std::vector< T > &rinv) const
void apply_bc(std::vector< TinyVector< T, 3 >> &dr, std::vector< T > &r) const
void evaluate_rsquared(TinyVector< T, 3 > *restrict dr, T *restrict rr, int n)
DTD_BConds(const CrystalLattice< T, 3 > &lat)
T get_min_distance(TinyVector< T, 3 > &a) const
evaluate the minimum distance
Tensor< T, D > inverse(const Tensor< T, D > &a)
std::vector< TinyVector< T, 3 > > nextcells
Tensor< typename BinaryReturn< T1, T2, OpMultiply >::Type_t, D > dot(const AntiSymTensor< T1, D > &lhs, const AntiSymTensor< T2, D > &rhs)
DTD_BConds(const CrystalLattice< T, 3 > &lat)
void apply_bc(std::vector< TinyVector< T, 3 >> &dr, std::vector< T > &r, std::vector< T > &rinv) const
void apply_bc(std::vector< TinyVector< T, 3 >> &dr, std::vector< T > &r) const
void apply_bc(std::vector< TinyVector< T, 3 >> &dr, std::vector< T > &r) const
void evaluate_rsquared(TinyVector< T, 3 > *restrict dr, T *restrict rr, int n)
void apply_bc(std::vector< TinyVector< T, 3 >> &dr, std::vector< T > &r, std::vector< T > &rinv) const
void sqrt(T *restrict inout, SIZET n)
TinyVector< TinyVector< T, 3 >, 3 > rb
T get_min_distance(TinyVector< T, 3 > &a) const
evaluate the minimum distance
MakeReturn< UnaryNode< FnFloor, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t floor(const Vector< T1, C1 > &l)
void apply_bc(std::vector< TinyVector< T, 3 >> &dr, std::vector< T > &r) const
T apply_bc(TinyVector< T, 3 > &displ) const
evaluate |a| and apply boundary conditions on a