21#include <Math/SpecFunc.h>
32double Fk(
double k,
double jf,
double lambda,
double lambdaPrime,
double ji)
34 return pow((-1), -1 + ji + jf) * pow((2 * lambda + 1) * (2 * lambdaPrime + 1) * (2 * ji + 1) * (2 * k + 1), 0.5) *
35 ROOT::Math::wigner_3j((
int)(2 * lambda), (
int)(2 * lambdaPrime), (
int)(2 * k),
37 ROOT::Math::wigner_6j((
int)(2 * ji), (
int)(2 * ji), (
int)(2 * k),
38 (
int)(2 * lambdaPrime), (
int)(2 * lambda), (
int)(2 * jf));
52double Fgen(
double k,
double k2,
double k1,
double jf,
double lambda,
double lambdaPrime,
double ji)
54 return pow(-1, lambdaPrime + k2 + k1 + 1) *
55 sqrt((2 * ji + 1) * (2 * jf + 1) * (2 * lambda + 1) * (2 * lambdaPrime + 1) * (2 * k1 + 1) * (2 * k2 + 1) *
57 ROOT::Math::wigner_3j((
int)(2 * lambda), (
int)(2 * lambdaPrime), (
int)(2 * k), 2, -2, 0) *
58 ROOT::Math::wigner_9j((
int)(2 * jf), (
int)(2 * lambda), (
int)(2 * ji), (
int)(2 * jf), (
int)(2 * lambdaPrime),
59 (
int)(2 * ji), (
int)(2 * k2), (
int)(2 * k), (
int)(2 * k1));
66double Ak(
double k,
double ji,
double lambda,
double lambdaPrime,
double jf,
double delta)
68 return 1. / (1. + pow(delta, 2)) *
69 (
Fk(k, jf, lambda, lambda, ji) + 2 * delta *
Fk(k, jf, lambda, lambdaPrime, ji) +
70 pow(delta, 2) *
Fk(k, jf, lambdaPrime, lambdaPrime, ji));
76double Agen(
double k,
double k1,
double k2,
double jf,
double lambda,
double lambdaPrime,
double ji,
double delta)
78 return 1. / (1. + pow(delta, 2)) *
79 (
Fgen(k, k2, k1, jf, lambda, lambda, ji) + 2 * delta *
Fgen(k, k2, k1, jf, lambda, lambdaPrime, ji) +
80 pow(delta, 2) *
Fgen(k, k2, k1, jf, lambdaPrime, lambdaPrime, ji));
102double W(
double theta,
double ji,
double lambda,
double lambdaPrime,
double jf,
double delta,
StatTensor *rho,
105 std::complex<double> wtheta = 0;
106 for (
int ik = 0; ik <= int(kmax); ++ik) {
107 double k = (double)ik;
108 wtheta = wtheta +
Ak(k, ji, lambda, lambdaPrime, jf, delta) * rho->
GetBk(k) * Qk->
Get()[ik] *
109 ROOT::Math::legendre(ik, cos(theta));
111 if (abs(wtheta.imag()) >= 1e-15)
112 std::cout <<
"Warning: imaginary parts of statistical tensor have not cancelled" << std::endl;
113 return wtheta.real();
126 std::function<std::complex<double>(
double,
double,
double,
double,
double) >
127 TransFrame(std::complex<double> (&Gk)(
double,
double,
double,
double,
double),
double alpha,
double beta,
double gamma)
129 std::function<std::complex<double>(
double,
double,
double,
double,
double)> newGk;
131 newGk = [alpha, beta, gamma, &Gk](
double q,
double qprime,
double k,
double kprime,
double t) {
133 std::complex<double> sum = 0;
134 for (
int iQ = 0; iQ < 2*k + 1; ++iQ) {
135 for (
int iQprime = 0; iQprime < 2*kprime+1; ++iQprime) {
136 double Q = (double)iQ - k;
137 double Qprime = (double)iQprime - kprime;
139 std::conj(Gk(Q, Qprime, k, kprime, t))*
149 return std::conj(sum);
176std::vector<double>
W(std::vector<double> theta,
double ji,
double lambda,
double lambdaPrime,
double jf,
double delta,
180 std::vector<std::complex<double>> Aks;
181 std::vector<double>
W;
182 for (
int ik = 0; ik <= int(kmax); ++ik) {
183 double k = (double)ik;
184 Aks.push_back(
Ak(k, ji, lambda, lambdaPrime, jf, delta) * rho->
GetBk(k));
186 for (
int it = 0; it < (int)theta.size(); ++it) {
187 std::complex<double> wtheta = 0;
188 for (
int ik = 0; ik <= int(kmax); ++ik) {
189 double k = (double)ik;
190 wtheta = wtheta + Aks[ik] * Qk->
Get()[ik] * ROOT::Math::legendre(k, cos(theta[it]));
192 if (wtheta.imag() != 0)
193 std::cout <<
"Warning: imaginary parts of statistical tensor have not "
197 W.push_back(wtheta.real());
std::vector< double > Get()
std::complex< double > GetBk(double k)
std::complex< double > BigD(double j, double m, double mprime, double alpha, double beta, double gamma)
double W(double theta, double ji, double lambda, double lambdaPrime, double jf, double delta, StatTensor *rho, SolidAttenuation *Qk, double kmax)
double Ak(double k, double ji, double lambda, double lambdaPrime, double jf, double delta)
double Fgen(double k, double k2, double k1, double jf, double lambda, double lambdaPrime, double ji)
std::function< std::complex< double >(double, double, double, double, double) > TransFrame(std::complex< double >(&Gk)(double, double, double, double, double), double alpha, double beta, double gamma)
double Fk(double k, double jf, double lambda, double lambdaPrime, double ji)
double Agen(double k, double k1, double k2, double jf, double lambda, double lambdaPrime, double ji, double delta)