GamR  0.0.0
GammaROOT
Loading...
Searching...
No Matches
WignerD.cc
Go to the documentation of this file.
1/* library to calculate Wiger D symbols */
2/* following the formalism in Alder and Winther - Electromagnetic Excitation, pg
3 * 311 */
4/* load libMathMore before compiling */
5/* Tim Gray - timothy.gray@anu.edu.au */
6
7#include <cmath>
8#include <iostream>
9
10#include "WignerD.hh"
11
12namespace GamR {
13namespace AngDist {
14double djmm(double j, double m, double mprime, double beta)
15/* Appendix D, equation 15 */
16/* also implimented in DCOSUBS.f90 (I think) */
17{
18 if (j < 0 || j + mprime < 0) {
19 std::cout << "Error in djmm argument" << std::endl;
20 return 0;
21 }
22 double f1 = GamR::Utils::Fac10((int)(j + mprime));
23 f1 = f1 * GamR::Utils::Fac10((int)(j - mprime));
24 f1 = f1 * GamR::Utils::Fac10((int)(j + m));
25 f1 = f1 * GamR::Utils::Fac10((int)(j - m));
26 double root = sqrt(f1);
27 double sum = 0;
28 int iSigma = 0;
29
30 double f2;
31 double cosB = cos(beta / 2.0);
32 double sinB = sin(beta / 2.0);
33 while (1) {
34 double sigma = (double)iSigma;
35 if (m + mprime + sigma >= 0) {
36 f2 = GamR::Utils::Fac10((int)(m + mprime + sigma));
37 } else {
38 iSigma = iSigma + 1;
39 continue;
40 }
41 if (j - mprime - sigma >= 0) {
42 f2 = f2 * GamR::Utils::Fac10((int)(j - mprime - sigma));
43 } else
44 break;
45 if (j - m - sigma >= 0) {
46 f2 = f2 * GamR::Utils::Fac10((int)(j - m - sigma));
47 } else
48 break;
49
50 double denom = f2 * GamR::Utils::Fac10((int)sigma);
51 double phase = pow(-1, j - mprime - sigma);
52 double top;
53 if (2 * sigma + m + mprime == 0)
54 top = phase;
55 else
56 top = phase * pow(cosB, 2 * sigma + m + mprime);
57 if (2 * j - 2 * sigma - m - mprime != 0)
58 top = top * pow(sinB, 2 * j - 2 * sigma - m - mprime);
59
60 sum = sum + top / denom;
61 iSigma = iSigma + 1;
62 }
63 return root * sum;
64}
65
66std::complex<double> BigD(double j, double m, double mprime, double alpha, double beta, double gamma)
67/* equation 12 in Alder and Winther */
68{
69 std::complex<double> Zi = std::complex<double>(0.0, 1.0);
70 std::complex<double> Z1 = std::exp(Zi * m * alpha);
71 std::complex<double> Z2 = std::exp(Zi * mprime * gamma);
72 return Z1 * djmm(j, m, mprime, beta) * Z2;
73}
74} // namespace AngDist
75} /* namespace GamR */
double djmm(double j, double m, double mprime, double beta)
Definition WignerD.cc:14
std::complex< double > BigD(double j, double m, double mprime, double alpha, double beta, double gamma)
Definition WignerD.cc:66
double Fac10(int n)
Definition Utilities.cc:18
Definition Gain.cc:19