13#include <Math/SpecFunc.h>
46 for (
int ik = 0; ik < 2 * j + 1; ++ik) {
47 double k = (double)ik;
50 for (
int im = 0; im < 2 * j + 1; ++im) {
51 double m = (double)im - j;
54 ROOT::Math::wigner_3j((
int)(2 * j), (
int)(2 * j), (
int)(2 * k), (
int)(2 * m), (
int)(2 * -m), 0) *
64 this->rho[k][k] = std::complex<double>(sum * sqrt(2 * j + 1), 0);
74 this->rho.reserve((
int)(2*this->j+1));
75 for (
int ik = 0; ik < 2 * this->j + 1; ++ik) {
76 double k = (double)ik;
77 this->rho.emplace_back();
78 for (
int iq = 0; iq < 2 * ik + 1; ++iq) {
79 this->rho.at(this->rho.size()-1).emplace_back(0,0);
86 int ik = std::round(k);
87 int iq = std::round(q);
88 return this->rho[ik][iq + ik];
91 std::complex<double>
StatTensor::Set(
double k,
double q, std::complex<double> value)
93 int ik = std::round(k);
94 int iq = std::round(q);
95 this->rho[ik][iq + ik] = value;
96 return this->rho[ik][iq+ik];
107 return sqrt(2 * k + 1) * this->rho[(int)k][(
int)k];
130 for (
int ik2 = 0; ik2 < 2 * jf + 1; ++ik2) {
131 double k2 = (double)ik2;
132 for (
int iq2 = 0; iq2 < 2 * ik2 + 1; ++iq2) {
133 double q2 = (double)iq2 - k2;
134 std::complex<double> sum = 0;
135 int Lmax = (int)std::max(lambda, lambdaPrime);
136 for (
int ik = 0; ik < 2 * Lmax + 1; ++ik) {
137 double k = (double)ik;
138 for (
int ik1 = 0; ik1 < 2 * this->j + 1; ++ik1) {
139 double k1 = (double)ik1;
140 for (
int iq = 0; iq < 2 * ik + 1; ++iq) {
141 double q = (double)iq - k;
142 for (
int iq1 = 0; iq1 < 2 * ik1 + 1; ++iq1) {
143 double q1 = (double)iq1 - k1;
144 sum = sum +
Get(k1, q1) * pow(-1, k1 + q1) * sqrt((2 * k + 1) * (2 * k1 + 1) / (2 * k2 + 1)) *
145 ROOT::Math::wigner_3j((
int)2*k1, (
int)2*k, (
int)2*k2, -(
int)2*q1, (
int)2*q, (
int)2*q2) *
146 Agen(k, k1, k2, jf, lambda, lambdaPrime, ji, delta) * Qk->
Get(k) *
152 rhoAfter->
Set(k2, q2, sum);
177 for (
int ik2 = 0; ik2 < 2 * jf + 1; ++ik2) {
178 double k2 = (double)ik2;
179 for (
int iq2 = 0; iq2 < 2 * ik2 + 1; ++iq2) {
180 double q2 = (double)iq2 - k2;
181 std::complex<double> sum = 0;
184 for (
int ik1 = 0; ik1 < 2 * this->j + 1; ++ik1) {
185 double k1 = (double)ik1;
186 for (
int iq1 = 0; iq1 < 2 * ik1 + 1; ++iq1) {
187 double q1 = (double)iq1 - k1;
188 sum = sum +
Get(k1, q1) * pow(-1, k1 + q1) * sqrt((2 * k + 1) * (2 * k1 + 1) / (2 * k2 + 1)) *
189 ROOT::Math::wigner_3j((
int)2*k1, (
int)2*k, (
int)2*k2, -(
int)2*q1, (
int)2*q, (
int)2*q2) *
190 Agen(k, k1, k2, jf, lambda, lambdaPrime, ji, delta) * Qk->
Get(k);
193 rhoAfter->
Set(k2, q2, sum);
211 for (
int ik2 = 0; ik2 < 2*j + 1; ik2 = ik2 + 2) {
212 double k2 = (double)ik2;
213 for (
int iq2 = 0; iq2 < 2*ik2 + 1; ++iq2) {
214 double q2 = (double)iq2 - k2;
217 std::complex<double> sum = 0;
218 for (
int ik1 = 0; ik1 < 2*j + 1; ik1 = ik1 + 2) {
219 double k1 = (double)ik1;
220 for (
int iq1 = 0; iq1<2*ik1 + 1; ++iq1) {
221 double q1 = (double)iq1 - k1;
222 std::complex<double> rhokq =
Get(k1, q1);
223 std::complex<double> Gkk = std::conj(Gk(q1, q2, k1, k2, t));
224 sum = sum + rhokq * sqrt((2*k1 + 1)/(2*k2 + 1)) * Gkk;
233 rhoAfter->
Set(k2, q2, sum);
255 double theta,
double phi)
257 std::complex<double>
W = 0;
258 for (
int ik2 = 0; ik2 < 2 * (this->j) + 1; ik2 = ik2 + 2) {
259 double k2 = (double)ik2;
260 for (
int iq2 = 0; iq2 < 2 * ik2 + 1; ++iq2) {
261 double q2 = (double)iq2 - k2;
264 W =
W +
Get(k2, q2) * sqrt(2 * k2 + 1) *
Ak(k2, ji, lambda, lambdaPrime, jf, delta) * Qk->
Get(k2) *
274 if (abs(
W.imag()) >= 1e-15) {
275 std::cout <<
"Warning: imaginary parts of statistical tensor do not cancel! " << std::endl;
276 std::cout <<
W.real() <<
" " <<
W.imag() << std::endl;
283 printf(
" k q rho_k (real) rho_k (imaginary)\n");
284 for (
int ik = 0; ik < (int)this->rho.size(); ++ik) {
285 for (
int iq = 0; iq < (int)this->rho[ik].size(); ++iq) {
286 printf(
"%3d %3d %16.15f %16.15f\n", ik, iq - ik, this->rho[ik][iq].real(), this->rho[ik][iq].imag());
std::vector< double > Get()
StatTensor * Perturbation(std::function< std::complex< double >(double, double, double, double, double) > const &Gk, double t)
StatTensor * UnobservedProp(double ji, double lambda, double lambdaPrime, double jf, double delta, SolidAttenuation *Qk)
void Set(std::vector< double > Pm)
std::complex< double > GetBk(double k)
double W(double ji, double lambda, double lambdaPrime, double jf, double delta, SolidAttenuation *Qk, double theta, double phi)
std::complex< double > Get(double k, double q)
StatTensor * ObservedProp(double ji, double lambda, double lambdaPrime, double jf, double delta, SolidAttenuation *Qk, double theta, double phi)
std::complex< double > BigD(double j, double m, double mprime, double alpha, double beta, double gamma)
double Ak(double k, double ji, double lambda, double lambdaPrime, double jf, double delta)
double Agen(double k, double k1, double k2, double jf, double lambda, double lambdaPrime, double ji, double delta)