QMCPACK
test_kcontainer.cpp
Go to the documentation of this file.
1 //////////////////////////////////////////////////////////////////////////////////////
2 // This file is distributed under the University of Illinois/NCSA Open Source License.
3 // See LICENSE file in top directory for details.
4 //
5 // Copyright (c) 2022 QMCPACK developers.
6 //
7 // File developed by: Yubo "Paul" Yang, yubo.paul.yang@gmail.com, CCQ @ Flatiron
8 //
9 // File created by: Yubo "Paul" Yang, yubo.paul.yang@gmail.com, CCQ @ Flatiron
10 //////////////////////////////////////////////////////////////////////////////////////
11 #include "catch.hpp"
12 
14 #include "OhmmsPETE/TinyVector.h"
15 
16 namespace qmcplusplus
17 {
19 
20 TEST_CASE("kcontainer at gamma in 3D", "[longrange]")
21 {
22  const int ndim = 3;
23  const double alat = 1.0;
24  const double blat = 2 * M_PI / alat;
25 
26  // check first 3 shells of kvectors
27  const std::vector<double> kcs = {blat, std::sqrt(2) * blat, std::sqrt(3) * blat};
28  const std::vector<int> nks = {6, 18, 26};
29 
31  lattice.R.diagonal(1.0);
32  lattice.set(lattice.R); // compute Rv and Gv from R
33 
34  KContainer klists;
35  for (int ik = 0; ik < kcs.size(); ik++)
36  {
37  const double kc = kcs[ik] + 1e-6;
38  klists.updateKLists(lattice, kc, ndim);
39  CHECK(klists.kpts.size() == nks[ik]);
40  }
41  const int mxk = klists.kpts.size();
42  int gvecs[26][3] = {{-1, 0, 0}, {0, -1, 0}, {0, 0, -1}, {0, 0, 1}, {0, 1, 0}, {1, 0, 0}, {-1, -1, 0},
43  {-1, 0, -1}, {-1, 0, 1}, {-1, 1, 0}, {0, -1, -1}, {0, -1, 1}, {0, 1, -1}, {0, 1, 1},
44  {1, -1, 0}, {1, 0, -1}, {1, 0, 1}, {1, 1, 0}, {-1, -1, -1}, {-1, -1, 1}, {-1, 1, -1},
45  {-1, 1, 1}, {1, -1, -1}, {1, -1, 1}, {1, 1, -1}, {1, 1, 1}};
46 
47  for (int ik = 0; ik < mxk; ik++)
48  {
49  for (int ldim = 0; ldim < ndim; ldim++)
50  {
51  CHECK(klists.kpts[ik][ldim] == gvecs[ik][ldim]);
52  CHECK(klists.kpts[ik][ldim] * blat == Approx(klists.kpts_cart[ik][ldim]));
53  }
54  }
55 }
56 
57 TEST_CASE("kcontainer at twist in 3D", "[longrange]")
58 {
59  const int ndim = 3;
60  const double alat = 1.0;
61  const double blat = 2 * M_PI / alat;
62 
63  // twist one shell of kvectors
64  const double kc = blat + 1e-6;
65 
67  lattice.R.diagonal(1.0);
68  lattice.set(lattice.R); // compute Rv and Gv from R
69 
70  KContainer klists;
71 
72  PosType twist;
73  twist[0] = 0.1;
74  klists.updateKLists(lattice, kc, ndim, twist);
75  CHECK(klists.kpts.size() == 1);
76  CHECK(klists.kpts_cart[0][0] == Approx(blat * (twist[0] - 1)));
77 
78  twist = {-0.5, 0, 0.5};
79  klists.updateKLists(lattice, kc, ndim, twist);
80  int gvecs[3][3] = {{0, 0, -1}, {1, 0, -1}, {1, 0, 0}};
81  CHECK(klists.kpts.size() == 3);
82  for (int ik = 0; ik < klists.kpts.size(); ik++)
83  for (int ldim = 0; ldim < ndim; ldim++)
84  CHECK(klists.kpts_cart[ik][ldim] == Approx(blat * (twist[ldim] + gvecs[ik][ldim])));
85 }
86 
87 TEST_CASE("kcontainer at gamma in 2D", "[longrange]")
88 {
89  const int ndim = 2;
90  const double alat = 1.0;
91  const double blat = 2 * M_PI / alat;
92 
93  // check first 3 shells of kvectors
94  const std::vector<double> kcs = {blat, std::sqrt(2) * blat, 2 * blat};
95  const std::vector<int> nks = {4, 8, 12};
96 
98  lattice.R.diagonal(1.0);
99  lattice.set(lattice.R); // compute Rv and Gv from R
100 
101  KContainer klists;
102  for (int ik = 0; ik < kcs.size(); ik++)
103  {
104  const double kc = kcs[ik] + 1e-6;
105  klists.updateKLists(lattice, kc, ndim);
106  CHECK(klists.kpts.size() == nks[ik]);
107  }
108  const int mxk = klists.kpts.size();
109  int gvecs[12][3] = {
110  {-1, 0, 0}, {0, -1, 0}, {0, 1, 0}, {1, 0, 0}, {-1, -1, 0}, {-1, 1, 0},
111  {1, -1, 0}, {1, 1, 0}, {-2, 0, 0}, {0, -2, 0}, {0, 2, 0}, {2, 0, 0},
112  };
113 
114  for (int ik = 0; ik < mxk; ik++)
115  {
116  for (int ldim = 0; ldim < ndim; ldim++)
117  {
118  CHECK(klists.kpts[ik][ldim] == gvecs[ik][ldim]);
119  CHECK(klists.kpts[ik][ldim] * blat == Approx(klists.kpts_cart[ik][ldim]));
120  }
121  }
122 }
123 
124 TEST_CASE("kcontainer at twist in 2D", "[longrange]")
125 {
126  const int ndim = 2;
127  const double alat = 1.0;
128  const double blat = 2 * M_PI / alat;
129 
130  // twist one shell of kvectors
131  const double kc = blat + 1e-6;
132 
134  lattice.R.diagonal(1.0);
135  lattice.set(lattice.R); // compute Rv and Gv from R
136 
137  KContainer klists;
138 
139  PosType twist;
140  twist[0] = 0.1;
141  klists.updateKLists(lattice, kc, ndim, twist);
142  CHECK(klists.kpts.size() == 1);
143  CHECK(klists.kpts_cart[0][0] == Approx(blat * (twist[0] - 1)));
144 
145  twist[1] = 0.1;
146  klists.updateKLists(lattice, kc, ndim, twist);
147  CHECK(klists.kpts.size() == 2);
148  CHECK(klists.kpts_cart[0][0] == Approx(blat * (twist[0] - 1)));
149  CHECK(klists.kpts_cart[0][1] == Approx(blat * twist[1]));
150  CHECK(klists.kpts_cart[1][0] == Approx(blat * (twist[0])));
151  CHECK(klists.kpts_cart[1][1] == Approx(blat * (twist[1] - 1)));
152 
153  twist = {-0.5, 0.5, 0};
154  klists.updateKLists(lattice, kc, ndim, twist);
155  CHECK(klists.kpts.size() == 3);
156  //for (int ik=0;ik<3;ik++)
157  // app_log() << klists.kpts_cart[ik] << std::endl;
158  CHECK(klists.kpts_cart[0][0] == Approx(blat * (twist[0] - 0)));
159  CHECK(klists.kpts_cart[0][1] == Approx(blat * (twist[1] - 1)));
160  CHECK(klists.kpts_cart[1][0] == Approx(blat * (twist[0] + 1)));
161  CHECK(klists.kpts_cart[1][1] == Approx(blat * (twist[1] - 1)));
162  CHECK(klists.kpts_cart[2][0] == Approx(blat * (twist[0] + 1)));
163  CHECK(klists.kpts_cart[2][1] == Approx(blat * twist[1]));
164 }
165 
166 } // namespace qmcplusplus
a class that defines a supercell in D-dimensional Euclean space.
std::vector< PosType > kpts_cart
K-vector in Cartesian coordinates.
Definition: KContainer.h:53
helper functions for EinsplineSetBuilder
Definition: Configuration.h:43
TEST_CASE("complex_helper", "[type_traits]")
CrystalLattice< OHMMS_PRECISION, OHMMS_DIM > lattice
Container for k-points.
Definition: KContainer.h:29
MakeReturn< UnaryNode< FnSqrt, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t sqrt(const Vector< T1, C1 > &l)
CHECK(log_values[0]==ComplexApprox(std::complex< double >{ 5.603777579195571, -6.1586603331188225 }))
void updateKLists(const ParticleLayout &lattice, RealType kc, unsigned ndim, const PosType &twist=PosType(), bool useSphere=true)
k points sorted by the |k| excluding |k|=0
Definition: KContainer.cpp:24
std::vector< TinyVector< int, DIM > > kpts
K-vector in reduced coordinates.
Definition: KContainer.h:50