QMCPACK
FreeOrbital.cpp
Go to the documentation of this file.
1 #include "FreeOrbital.h"
2 #include "CPU/math.hpp"
3 
4 namespace qmcplusplus
5 {
6 FreeOrbital::FreeOrbital(const std::string& my_name, const std::vector<PosType>& kpts_cart)
7  : SPOSet(my_name),
8  kvecs(kpts_cart),
9 #ifdef QMC_COMPLEX
10  mink(0), // first k at twist may not be 0
11 #else
12  mink(1), // treat k=0 as special case
13 #endif
14  maxk(kpts_cart.size())
15 {
16 #ifdef QMC_COMPLEX
18 #else
19  OrbitalSetSize = 2 * maxk - 1; // k=0 has no (cos, sin) split
20 #endif
21  k2neg.resize(maxk);
22  for (int ik = 0; ik < maxk; ik++)
23  k2neg[ik] = -dot(kvecs[ik], kvecs[ik]);
24 }
25 
27 
28 void FreeOrbital::evaluateVGL(const ParticleSet& P, int iat, ValueVector& pvec, GradVector& dpvec, ValueVector& d2pvec)
29 {
30  const PosType& r = P.activeR(iat);
31  RealType sinkr, coskr;
32  for (int ik = mink; ik < maxk; ik++)
33  {
34  sincos(dot(kvecs[ik], r), &sinkr, &coskr);
35 #ifdef QMC_COMPLEX
36  pvec[ik] = ValueType(coskr, sinkr);
37  dpvec[ik] = ValueType(-sinkr, coskr) * kvecs[ik];
38  d2pvec[ik] = ValueType(k2neg[ik] * coskr, k2neg[ik] * sinkr);
39 #else
40  const int j2 = 2 * ik;
41  const int j1 = j2 - 1;
42  pvec[j1] = coskr;
43  pvec[j2] = sinkr;
44  dpvec[j1] = -sinkr * kvecs[ik];
45  dpvec[j2] = coskr * kvecs[ik];
46  d2pvec[j1] = k2neg[ik] * coskr;
47  d2pvec[j2] = k2neg[ik] * sinkr;
48 #endif
49  }
50 #ifndef QMC_COMPLEX
51  pvec[0] = 1.0;
52  dpvec[0] = 0.0;
53  d2pvec[0] = 0.0;
54 #endif
55 }
56 
57 void FreeOrbital::evaluateValue(const ParticleSet& P, int iat, ValueVector& pvec)
58 {
59  const PosType& r = P.activeR(iat);
60  RealType sinkr, coskr;
61  for (int ik = mink; ik < maxk; ik++)
62  {
63  sincos(dot(kvecs[ik], r), &sinkr, &coskr);
64 #ifdef QMC_COMPLEX
65  pvec[ik] = ValueType(coskr, sinkr);
66 #else
67  const int j2 = 2 * ik;
68  const int j1 = j2 - 1;
69  pvec[j1] = coskr;
70  pvec[j2] = sinkr;
71 #endif
72  }
73 #ifndef QMC_COMPLEX
74  pvec[0] = 1.0;
75 #endif
76 }
77 
79  int first,
80  int last,
81  ValueMatrix& phi,
82  GradMatrix& dphi,
83  ValueMatrix& d2phi)
84 {
85  for (int iat = first, i = 0; iat < last; iat++, i++)
86  {
87  ValueVector p(phi[i], OrbitalSetSize);
88  GradVector dp(dphi[i], OrbitalSetSize);
89  ValueVector d2p(d2phi[i], OrbitalSetSize);
90  evaluateVGL(P, iat, p, dp, d2p);
91  }
92 }
93 
95  int first,
96  int last,
97  ValueMatrix& phi,
98  GradMatrix& dphi,
99  HessMatrix& d2phi_mat)
100 {
101  RealType sinkr, coskr;
102  ValueType phi_of_r;
103  for (int iat = first, i = 0; iat < last; iat++, i++)
104  {
105  ValueVector p(phi[i], OrbitalSetSize);
106  GradVector dp(dphi[i], OrbitalSetSize);
107  HessVector hess(d2phi_mat[i], OrbitalSetSize);
108 
109  const PosType& r = P.activeR(iat);
110  for (int ik = mink; ik < maxk; ik++)
111  {
112  sincos(dot(kvecs[ik], r), &sinkr, &coskr);
113 #ifdef QMC_COMPLEX
114  // phi(r) = cos(kr)+i*sin(kr)
115  phi_of_r = ValueType(coskr, sinkr);
116  p[ik] = phi_of_r;
117  // i*phi(r) = -sin(kr) + i*cos(kr)
118  dp[ik] = ValueType(-sinkr, coskr) * kvecs[ik];
119  for (int la = 0; la < OHMMS_DIM; la++)
120  {
121  hess[ik](la, la) = -phi_of_r * (kvecs[ik])[la] * (kvecs[ik])[la];
122  for (int lb = la + 1; lb < OHMMS_DIM; lb++)
123  {
124  hess[ik](la, lb) = -phi_of_r * (kvecs[ik])[la] * (kvecs[ik])[lb];
125  hess[ik](lb, la) = hess[ik](la, lb);
126  }
127  }
128 #else
129  const int j2 = 2 * ik;
130  const int j1 = j2 - 1;
131  p[j1] = coskr;
132  p[j2] = sinkr;
133  dp[j1] = -sinkr * kvecs[ik];
134  dp[j2] = coskr * kvecs[ik];
135  for (int la = 0; la < OHMMS_DIM; la++)
136  {
137  hess[j1](la, la) = -coskr * (kvecs[ik])[la] * (kvecs[ik])[la];
138  hess[j2](la, la) = -sinkr * (kvecs[ik])[la] * (kvecs[ik])[la];
139  for (int lb = la + 1; lb < OHMMS_DIM; lb++)
140  {
141  hess[j1](la, lb) = -coskr * (kvecs[ik])[la] * (kvecs[ik])[lb];
142  hess[j2](la, lb) = -sinkr * (kvecs[ik])[la] * (kvecs[ik])[lb];
143  hess[j1](lb, la) = hess[j1](la, lb);
144  hess[j2](lb, la) = hess[j2](la, lb);
145  }
146  }
147 #endif
148  }
149 #ifndef QMC_COMPLEX
150  p[0] = 1.0;
151  dp[0] = 0.0;
152  hess[0] = 0.0;
153 #endif
154  }
155 }
156 
158  int first,
159  int last,
160  ValueMatrix& phi,
161  GradMatrix& dphi,
162  HessMatrix& d2phi_mat,
163  GGGMatrix& d3phi_mat)
164 {
165  RealType sinkr, coskr;
166  ValueType phi_of_r;
167  for (int iat = first, i = 0; iat < last; iat++, i++)
168  {
169  ValueVector p(phi[i], OrbitalSetSize);
170  GradVector dp(dphi[i], OrbitalSetSize);
171  HessVector hess(d2phi_mat[i], OrbitalSetSize);
172  GGGVector ggg(d3phi_mat[i], OrbitalSetSize);
173 
174  const PosType& r = P.activeR(iat);
175  for (int ik = mink; ik < maxk; ik++)
176  {
177  sincos(dot(kvecs[ik], r), &sinkr, &coskr);
178 #ifdef QMC_COMPLEX
179  const ValueType compi(0, 1);
180  phi_of_r = ValueType(coskr, sinkr);
181  p[ik] = phi_of_r;
182  dp[ik] = compi * phi_of_r * kvecs[ik];
183  for (int la = 0; la < OHMMS_DIM; la++)
184  {
185  hess[ik](la, la) = -phi_of_r * (kvecs[ik])[la] * (kvecs[ik])[la];
186  for (int lb = la + 1; lb < OHMMS_DIM; lb++)
187  {
188  hess[ik](la, lb) = -phi_of_r * (kvecs[ik])[la] * (kvecs[ik])[lb];
189  hess[ik](lb, la) = hess[ik](la, lb);
190  }
191  }
192  for (int la = 0; la < OHMMS_DIM; la++)
193  {
194  ggg[ik][la] = compi * (kvecs[ik])[la] * hess[ik];
195  }
196 #else
197  const int j2 = 2 * ik;
198  const int j1 = j2 - 1;
199  p[j1] = coskr;
200  p[j2] = sinkr;
201  dp[j1] = -sinkr * kvecs[ik];
202  dp[j2] = coskr * kvecs[ik];
203  for (int la = 0; la < OHMMS_DIM; la++)
204  {
205  hess[j1](la, la) = -coskr * (kvecs[ik])[la] * (kvecs[ik])[la];
206  hess[j2](la, la) = -sinkr * (kvecs[ik])[la] * (kvecs[ik])[la];
207  ggg[j1][la](la, la) = sinkr * (kvecs[ik])[la] * (kvecs[ik])[la] * (kvecs[ik])[la];
208  ggg[j2][la](la, la) = -coskr * (kvecs[ik])[la] * (kvecs[ik])[la] * (kvecs[ik])[la];
209  for (int lb = la + 1; lb < OHMMS_DIM; lb++)
210  {
211  hess[j1](la, lb) = -coskr * (kvecs[ik])[la] * (kvecs[ik])[lb];
212  hess[j2](la, lb) = -sinkr * (kvecs[ik])[la] * (kvecs[ik])[lb];
213  hess[j1](lb, la) = hess[j1](la, lb);
214  hess[j2](lb, la) = hess[j2](la, lb);
215  ggg[j1][la](lb, la) = sinkr * (kvecs[ik])[la] * (kvecs[ik])[lb] * (kvecs[ik])[la];
216  ggg[j2][la](lb, la) = -coskr * (kvecs[ik])[la] * (kvecs[ik])[lb] * (kvecs[ik])[la];
217  ggg[j1][la](la, lb) = ggg[j1][la](lb, la);
218  ggg[j2][la](la, lb) = ggg[j2][la](lb, la);
219  ggg[j1][lb](la, la) = ggg[j1][la](lb, la);
220  ggg[j2][lb](la, la) = ggg[j2][la](lb, la);
221  ggg[j1][la](lb, lb) = sinkr * (kvecs[ik])[la] * (kvecs[ik])[lb] * (kvecs[ik])[lb];
222  ggg[j2][la](lb, lb) = -coskr * (kvecs[ik])[la] * (kvecs[ik])[lb] * (kvecs[ik])[lb];
223  ggg[j1][lb](la, lb) = ggg[j1][la](lb, lb);
224  ggg[j2][lb](la, lb) = ggg[j2][la](lb, lb);
225  ggg[j1][lb](lb, la) = ggg[j1][la](lb, lb);
226  ggg[j2][lb](lb, la) = ggg[j2][la](lb, lb);
227  for (int lc = lb + 1; lc < OHMMS_DIM; lc++)
228  {
229  ggg[j1][la](lb, lc) = sinkr * (kvecs[ik])[la] * (kvecs[ik])[lb] * (kvecs[ik])[lc];
230  ggg[j2][la](lb, lc) = -coskr * (kvecs[ik])[la] * (kvecs[ik])[lb] * (kvecs[ik])[lc];
231  ggg[j1][la](lc, lb) = ggg[j1][la](lb, lc);
232  ggg[j2][la](lc, lb) = ggg[j2][la](lb, lc);
233  ggg[j1][lb](la, lc) = ggg[j1][la](lb, lc);
234  ggg[j2][lb](la, lc) = ggg[j2][la](lb, lc);
235  ggg[j1][lb](lc, la) = ggg[j1][la](lb, lc);
236  ggg[j2][lb](lc, la) = ggg[j2][la](lb, lc);
237  ggg[j1][lc](la, lb) = ggg[j1][la](lb, lc);
238  ggg[j2][lc](la, lb) = ggg[j2][la](lb, lc);
239  ggg[j1][lc](lb, la) = ggg[j1][la](lb, lc);
240  ggg[j2][lc](lb, la) = ggg[j2][la](lb, lc);
241  }
242  }
243  }
244 #endif
245  }
246 #ifndef QMC_COMPLEX
247  p[0] = 1.0;
248  dp[0] = 0.0;
249  hess[0] = 0.0;
250  ggg[0] = 0.0;
251 #endif
252  }
253 }
254 
255 void FreeOrbital::report(const std::string& pad) const
256 {
257  app_log() << pad << "FreeOrbital report" << std::endl;
258  for (int ik = 0; ik < kvecs.size(); ik++)
259  {
260  app_log() << pad << ik << " " << kvecs[ik] << std::endl;
261  }
262  app_log() << pad << "end FreeOrbital report" << std::endl;
263  app_log().flush();
264 }
265 } // namespace qmcplusplus
base class for Single-particle orbital sets
Definition: SPOSet.h:46
OrbitalSetTraits< ValueType >::HessVector HessVector
Definition: SPOSet.h:53
helper functions for EinsplineSetBuilder
Definition: Configuration.h:43
std::vector< RealType > k2neg
Definition: FreeOrbital.h:71
std::ostream & app_log()
Definition: OutputManager.h:65
FreeOrbital(const std::string &my_name, const std::vector< PosType > &kpts_cart)
Definition: FreeOrbital.cpp:6
OrbitalSetTraits< ValueType >::ValueMatrix ValueMatrix
Definition: SPOSet.h:50
void evaluate_notranspose(const ParticleSet &P, int first, int last, ValueMatrix &phi, GradMatrix &dphi, ValueMatrix &d2phi) override
evaluate the values, gradients and laplacians of this single-particle orbital for [first...
Definition: FreeOrbital.cpp:78
const std::vector< PosType > kvecs
Definition: FreeOrbital.h:68
void evaluateValue(const ParticleSet &P, int iat, ValueVector &pvec) override
evaluate the values of this single-particle orbital set
Definition: FreeOrbital.cpp:57
#define OHMMS_DIM
Definition: config.h:64
OrbitalSetTraits< ValueType >::GradMatrix GradMatrix
Definition: SPOSet.h:52
Specialized paritlce class for atomistic simulations.
Definition: ParticleSet.h:55
QTBase::ValueType ValueType
Definition: Configuration.h:60
void report(const std::string &pad) const override
print SPOSet information
OrbitalSetTraits< ValueType >::ValueVector ValueVector
Definition: SPOSet.h:49
void evaluateVGL(const ParticleSet &P, int i, ValueVector &pvec, GradVector &dpvec, ValueVector &d2pvec) override
evaluate the values, gradients and laplacians of this single-particle orbital set ...
Definition: FreeOrbital.cpp:28
IndexType OrbitalSetSize
number of Single-particle orbitals
Definition: SPOSet.h:566
const PosType & activeR(int iat) const
return the active position if the particle is active or the return current position if not ...
Definition: ParticleSet.h:265
OrbitalSetTraits< ValueType >::GradHessVector GGGVector
Definition: SPOSet.h:55
OrbitalSetTraits< ValueType >::GradVector GradVector
Definition: SPOSet.h:51
void sincos(T a, T *restrict s, T *restrict c)
sincos function wrapper
Definition: math.hpp:62
Tensor< typename BinaryReturn< T1, T2, OpMultiply >::Type_t, D > dot(const AntiSymTensor< T1, D > &lhs, const AntiSymTensor< T2, D > &rhs)
OrbitalSetTraits< ValueType >::GradHessMatrix GGGMatrix
Definition: SPOSet.h:56
OrbitalSetTraits< ValueType >::HessMatrix HessMatrix
Definition: SPOSet.h:54