17 #ifndef QMCPLUSPLUS_SPHERICAL_CARTESIAN_TENSOR_H 18 #define QMCPLUSPLUS_SPHERICAL_CARTESIAN_TENSOR_H 89 inline int index(
int l,
int m)
const {
return (l * (l + 1)) +
m; }
112 inline int size()
const {
return Ylm.size(); }
120 std::vector<value_type>
Ylm;
140 template<
class T,
class Po
int_t,
class Tensor_t,
class GGG_t>
149 for (
int i = 0; i < ntot; i++)
184 for (
int i = 0; i < ntot; i++)
194 for (
int l = 0; l <=
Lmax; l++)
197 for (
int m = 1;
m <= l;
m++)
206 for (
int l = 0; l <=
Lmax; l++)
208 for (
int m = 1;
m <= l;
m++)
217 for (
int l = 1; l <=
Lmax; l++)
218 FactorL[l] =
sqrt(static_cast<T>(2 * l + 1)) * omega;
220 for (
int l = 1; l <=
Lmax; l++)
221 Factor2L[l] = static_cast<T>(2 * l + 1) /
static_cast<T
>(2 * l - 1);
223 for (
int l = 1; l <=
Lmax; l++)
224 for (
int m = 1;
m <= l;
m++)
226 T fac2 = 1.0 /
sqrt(static_cast<T>((l +
m) * (l + 1 -
m)));
232 template<
class T,
class Po
int_t,
class Tensor_t,
class GGG_t>
246 if (r2xy < std::numeric_limits<T>::epsilon())
250 ctheta = (z < 0) ? -1.0 : 1.0;
267 for (
int l = 1; l <= Lmax; l++)
271 int ll = index(l, l);
272 int l1 = index(l, l - 1);
273 int l2 = index(l - 1, l - 1);
275 Ylm[l1] = j * ctheta *
Ylm[l2];
278 for (
int m = 0;
m < Lmax - 1;
m++)
281 for (
int l =
m + 2; l <= Lmax; l++)
284 int lm = index(l,
m);
285 int l1 = index(l - 1,
m);
286 int l2 = index(l - 2,
m);
287 Ylm[lm] = (ctheta * j *
Ylm[l1] - (l +
m - 1) *
Ylm[l2]) / (l -
m);
294 for (
int l = 1; l <= Lmax; l++)
299 fac = rpow * FactorL[l];
300 int l0 = index(l, 0);
304 for (
int m = 1;
m <= l;
m++)
306 temp = cphim * cphi - sphim * sphi;
307 sphim = sphim * cphi + cphim * sphi;
309 int lm = index(l,
m);
311 temp = fac *
Ylm[lm];
312 Ylm[lm] = temp * cphim;
314 Ylm[lm] = temp * sphim;
317 for (
int i = 0; i <
Ylm.size(); i++)
318 Ylm[i] *= NormFactor[i];
321 template<
class T,
class Po
int_t,
class Tensor_t,
class GGG_t>
335 if (r2xy < std::numeric_limits<T>::epsilon())
339 ctheta = (z < 0) ? -1.0 : 1.0;
356 for (
int l = 1; l <= Lmax; l++)
360 int ll = index(l, l);
361 int l1 = index(l, l - 1);
362 int l2 = index(l - 1, l - 1);
364 Ylm[l1] = j * ctheta *
Ylm[l2];
367 for (
int m = 0;
m < Lmax - 1;
m++)
370 for (
int l =
m + 2; l <= Lmax; l++)
373 int lm = index(l,
m);
374 int l1 = index(l - 1,
m);
375 int l2 = index(l - 2,
m);
376 Ylm[lm] = (ctheta * j *
Ylm[l1] - (l +
m - 1) *
Ylm[l2]) / (l -
m);
383 for (
int l = 1; l <= Lmax; l++)
388 fac = rpow * FactorL[l];
389 int l0 = index(l, 0);
393 for (
int m = 1;
m <= l;
m++)
397 temp = cphim * cphi - sphim * sphi;
398 sphim = sphim * cphi + cphim * sphi;
400 int lm = index(l,
m);
403 temp = fac *
Ylm[lm];
404 Ylm[lm] = temp * cphim;
406 Ylm[lm] = temp * sphim;
410 for (
int l = 1; l <= Lmax; l++)
414 for (
int m = -l;
m <= l;
m++)
416 int lm = index(l - 1, 0);
422 gz = (l > ma) ? c0 *
Ylm[lm +
m] : 0.0;
425 dpr = cp *
Ylm[lm + ma + 1];
426 dpi = cp *
Ylm[lm - ma - 1];
438 dmr = -cm *
Ylm[lm + 1];
439 dmi = cm *
Ylm[lm - 1];
446 dmr = cm *
Ylm[lm + ma - 1];
447 dmi = cm *
Ylm[lm - ma + 1];
459 gx = 0.5 * (dpi - dmi);
460 gy = -0.5 * (dpr + dmr);
464 gx = 0.5 * (dpr - dmr);
465 gy = 0.5 * (dpi + dmi);
469 gradYlm[lm] = NormFactor[lm] * Point_t(gx, gy, gz);
471 gradYlm[lm] = Point_t(gx, gy, gz);
474 for (
int i = 0; i <
Ylm.size(); i++)
475 Ylm[i] *= NormFactor[i];
480 template<
class T,
class Po
int_t,
class Tensor_t,
class GGG_t>
494 if (r2xy < std::numeric_limits<T>::epsilon())
498 ctheta = (z < 0) ? -1.0 : 1.0;
515 for (
int l = 1; l <= Lmax; l++)
519 int ll = index(l, l);
520 int l1 = index(l, l - 1);
521 int l2 = index(l - 1, l - 1);
523 Ylm[l1] = j * ctheta *
Ylm[l2];
526 for (
int m = 0;
m < Lmax - 1;
m++)
529 for (
int l =
m + 2; l <= Lmax; l++)
532 int lm = index(l,
m);
533 int l1 = index(l - 1,
m);
534 int l2 = index(l - 2,
m);
535 Ylm[lm] = (ctheta * j *
Ylm[l1] - (l +
m - 1) *
Ylm[l2]) / (l -
m);
542 for (
int l = 1; l <= Lmax; l++)
547 fac = rpow * FactorL[l];
548 int l0 = index(l, 0);
552 for (
int m = 1;
m <= l;
m++)
556 temp = cphim * cphi - sphim * sphi;
557 sphim = sphim * cphi + cphim * sphi;
559 int lm = index(l,
m);
562 temp = fac *
Ylm[lm];
563 Ylm[lm] = temp * cphim;
565 Ylm[lm] = temp * sphim;
569 for (
int l = 1; l <= Lmax; l++)
573 for (
int m = -l;
m <= l;
m++)
575 int lm = index(l - 1, 0);
581 gz = (l > ma) ? c0 *
Ylm[lm +
m] : 0.0;
584 dpr = cp *
Ylm[lm + ma + 1];
585 dpi = cp *
Ylm[lm - ma - 1];
597 dmr = -cm *
Ylm[lm + 1];
598 dmi = cm *
Ylm[lm - 1];
605 dmr = cm *
Ylm[lm + ma - 1];
606 dmi = cm *
Ylm[lm - ma + 1];
618 gx = 0.5 * (dpi - dmi);
619 gy = -0.5 * (dpr + dmr);
623 gx = 0.5 * (dpr - dmr);
624 gy = 0.5 * (dpi + dmi);
628 gradYlm[lm] = NormFactor[lm] * Point_t(gx, gy, gz);
630 gradYlm[lm] = Point_t(gx, gy, gz);
633 for (
int i = 0; i <
Ylm.size(); i++)
634 Ylm[i] *= NormFactor[i];
640 template<
class T,
class Po
int_t,
class Tensor_t,
class GGG_t>
645 template<
class SCT,
unsigned L>
650 static inline void apply(std::vector<value_type>&
Ylm, std::vector<pos_type>& gYlm,
const pos_type& p)
661 static inline void apply(std::vector<value_type>&
Ylm, std::vector<pos_type>& gYlm,
const pos_type& p)
678 static inline void apply(std::vector<value_type>&
Ylm, std::vector<pos_type>& gYlm,
const pos_type& p)
682 value_type x2 = x * x, y2 = y * y, z2 = z * z;
683 value_type xy = x * y, xz = x * z, yz = y * z;
689 Ylm[6] = L0 * (2.0 * z2 - x2 - y2);
691 Ylm[8] = L2 * (x2 - y2);
692 gYlm[4] =
pos_type(L1 * y, L1 * x, 0.0);
693 gYlm[5] =
pos_type(0.0, L1 * z, L1 * y);
694 gYlm[6] =
pos_type(-2.0 * L0 * x, -2.0 * L0 * y, 4.0 * L0 * z);
695 gYlm[7] =
pos_type(L1 * z, 0.0, L1 * x);
696 gYlm[8] =
pos_type(2.0 * L2 * x, -2.0 * L2 * y, 0.0);
705 static inline void apply(std::vector<value_type>&
Ylm, std::vector<pos_type>& gYlm,
const pos_type& p)
712 template<
class T,
class Po
int_t,
class Tensor_t,
class GGG_t>
733 std::cerr <<
"Lmax>2 is not valid." << std::endl;
736 for (
int i = 0; i <
Ylm.size(); i++)
738 for (
int i = 0; i <
Ylm.size(); i++)
Point_t getGradYlm(int l, int m) const
returns the gradient of given
std::vector< value_type > Ylm
values Ylm
void evaluateThirdDerivOnly(const Point_t &p)
makes a table of and their gradients and hessians and third derivatives up to Lmax.
Tensor_t getHessYlm(int l, int m) const
returns the hessian of given
value_type getYlm(int lm) const
returns the value of given
std::vector< ggg_type > gggYlm
static void apply(std::vector< value_type > &Ylm, std::vector< pos_type > &gYlm, const pos_type &p)
MakeReturn< UnaryNode< FnFabs, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t abs(const Vector< T1, C1 > &l)
GGG_t getGGGYlm(int lm) const
returns the matrix of third derivatives of given
std::vector< value_type > FactorLM
pre-evaluated factor
std::vector< Point_t > gradYlm
gradients gradYlm
static void apply(std::vector< value_type > &Ylm, std::vector< pos_type > &gYlm, const pos_type &p)
typename SCT::pos_type pos_type
static void apply(std::vector< value_type > &Ylm, std::vector< pos_type > &gYlm, const pos_type &p)
typename SCT::value_type value_type
int Lmax
maximum angular momentum for the center
typename SCT::pos_type pos_type
int index(int l, int m) const
returns the index/locator for ( ) combo,
std::vector< value_type > FactorL
pre-evaluated factor
MakeReturn< BinaryNode< FnPow, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t, typename CreateLeaf< Vector< T2, C2 > >::Leaf_t > >::Expression_t pow(const Vector< T1, C1 > &l, const Vector< T2, C2 > &r)
value_type getYlm(int l, int m) const
returns the value of given
Tensor_t getHessYlm(int lm) const
returns the hessian of given
typename SCT::pos_type pos_type
double norm(const zVec &c)
Tensor<T,D> class for D by D tensor.
static void apply(std::vector< value_type > &Ylm, std::vector< pos_type > &gYlm, const pos_type &p)
typename SCT::value_type value_type
void evaluate(const Point_t &p)
makes a table of and their gradients up to Lmax.
MakeReturn< UnaryNode< FnArcTan, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t atan(const Vector< T1, C1 > &l)
typename SCT::pos_type pos_type
std::vector< hess_type > hessYlm
hessian hessYlm
std::complex< double > Ylm(int l, int m, const std::vector< double > &sph)
void evaluateTest(const Point_t &p)
makes a table of and their gradients up to Lmax.
SphericalTensor(const int l_max, bool addsign=false)
constructor
typename SCT::value_type value_type
MakeReturn< UnaryNode< FnSqrt, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t sqrt(const Vector< T1, C1 > &l)
void evaluateWithHessian(const Point_t &p)
makes a table of and their gradients and hessians up to Lmax.
Point_t getGradYlm(int lm) const
returns the gradient of given
std::vector< value_type > Factor2L
pre-evaluated factor
std::vector< value_type > laplYlm
mmorales: HACK HACK HACK, to avoid having to rewrite QMCWaveFunctions/SphericalBasisSet.h
void evaluateAll(const Point_t &p)
makes a table of and their gradients up to Lmax.
QMCTraits::FullPrecRealType value_type
std::vector< value_type > NormFactor
Normalization factors.
typename SCT::value_type value_type
SphericalTensor that evaluates the Real Spherical Harmonics.