16 #ifndef QMCPLUSPLUS_QMCDRIFTOPERATORS_H 17 #define QMCPLUSPLUS_QMCDRIFTOPERATORS_H 23 template<
class T,
class TG,
unsigned D>
27 return (vsq < std::numeric_limits<T>::epsilon()) ? tau : ((-1.0 +
std::sqrt(1.0 + 2.0 * tau * vsq)) / vsq);
35 template<
class Tt,
class TG,
class T,
unsigned D>
40 T vsq =
dot(drift, drift);
41 T sc = (vsq < std::numeric_limits<T>::epsilon()) ? tau : ((-1.0 +
std::sqrt(1.0 + 2.0 * tau * vsq)) / vsq);
51 template<
class Tt,
class TG,
class T,
unsigned D>
57 drift =
dot(Dmat, drift) - Kvec;
58 T vsq =
dot(drift, drift);
59 T sc = (vsq < std::numeric_limits<T>::epsilon()) ? tau : ((-1.0 +
std::sqrt(1.0 + 2.0 * tau * vsq)) / vsq);
69 template<
class Tt,
class TG,
class T,
unsigned D>
85 template<
class T,
class T1,
unsigned D>
90 T
norm = 0.0, norm_scaled = 0.0, tau2 = tau * tau;
91 for (
int iat = 0; iat < qf.size(); ++iat)
94 T vsq =
dot(drift[iat], drift[iat]);
95 T sc = (vsq < std::numeric_limits<T>::epsilon()) ? tau : ((-1.0 +
std::sqrt(1.0 + 2.0 * tau * vsq)) / vsq);
96 norm_scaled += vsq * sc * sc;
130 template<
class T,
class T1,
unsigned D>
132 const std::vector<T>& massinv,
137 T
norm = 0.0, norm_scaled = 0.0;
138 for (
int iat = 0; iat < massinv.size(); ++iat)
141 T tau_over_mass = tau_au * massinv[iat];
144 T vsq =
dot(drift[iat], drift[iat]);
147 T sc = (vsq < std::numeric_limits<T>::epsilon()) ? tau_over_mass
148 : (-1.0 +
std::sqrt(1.0 + 2.0 * tau_over_mass * vsq)) / vsq;
151 norm_scaled += vsq * sc * sc;
152 norm += vsq * tau_over_mass * tau_over_mass;
165 template<
class T,
class TG,
unsigned D>
177 template<
class T,
unsigned D>
190 template<
class T,
class TG,
unsigned D>
195 for (
int iat = 0; iat < qf.size(); ++iat)
202 template<
class T,
class TG,
unsigned D>
208 template<
class T,
class TG,
unsigned D>
218 template<
class T,
class T1,
unsigned D>
220 const std::vector<T>& massinv,
224 for (
int iat = 0; iat < massinv.size(); ++iat)
226 T tau_over_mass = tau_au * massinv[iat];
helper functions for EinsplineSetBuilder
void convertToReal(const T1 &in, T2 &out)
generic conversion from type T1 to type T2 using implicit conversion
void assignDrift(T s, const ParticleAttrib< TinyVector< TG, D >> &ga, ParticleAttrib< TinyVector< T, D >> &da)
Attaches a unit to a Vector for IO.
T Dot(const ParticleAttrib< TinyVector< T, D >> &pa, const ParticleAttrib< TinyVector< T, D >> &pb)
T getDriftScale(T tau, const ParticleAttrib< TinyVector< TG, D >> &ga)
T setScaledDriftPbyPandNodeCorr(T tau, const ParticleAttrib< TinyVector< T1, D >> &qf, ParticleAttrib< TinyVector< T, D >> &drift)
scale drift
double norm(const zVec &c)
Tensor<T,D> class for D by D tensor.
void getScaledDriftL2(Tt tau, const TinyVector< TG, D > &qf, const Tensor< T, D > &Dmat, TinyVector< T, D > &Kvec, TinyVector< T, D > &drift)
evaluate a drift with a real force with rescaling for an L2 potential
MakeReturn< UnaryNode< FnSqrt, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t sqrt(const Vector< T1, C1 > &l)
Declaraton of ParticleAttrib<T>
Tensor< typename BinaryReturn< T1, T2, OpMultiply >::Type_t, D > dot(const AntiSymTensor< T1, D > &lhs, const AntiSymTensor< T2, D > &rhs)
void getScaledDrift(Tt tau, const TinyVector< TG, D > &qf, TinyVector< T, D > &drift)
evaluate a drift with a real force
void getUnscaledDrift(Tt tau, const TinyVector< TG, D > &qf, TinyVector< T, D > &drift)
evaluate a drift with a real force and no rescaling
void setScaledDrift(T tau, const ParticleAttrib< TinyVector< TG, D >> &qf, ParticleAttrib< TinyVector< T, D >> &drift)
da = scaled(tau)*ga