Angular_Distribution/Racah.h
2022-07-18 13:48:11 -04:00

294 lines
4.4 KiB
C++

#include "global.h"
//To compile : g++ AD.cxx -o {Input Executable Name} -lX11
//#include "Coeff.h"
using namespace std;
//this program doesnt work and it is not used, I spent so much time transcribing it that maybe, one day some poor soul will come and try to fix it to match the table in rose and brinks.
double RACAH(double A[6]){
double Racah = 0.;
double ii[6],ix[6],kk[8];
double nn[4], nx[12],ny[8];
double K1,K2,K3,K4,K5,K6,K7,K8 = 0.;
double NZMIN, NZMAX = .0;
for(int i = 0;i<6;i++){
ii[i] = 2.0*A[i];
}
double IA = ii[0];
double IB = ii[1];
double IC = ii[2];
double ID = ii[3];
double IE = ii[4];
double IF = ii[5];
K1 = IA + IB -IE;
K3 = IC + ID -IE;
K5 = IA + IC -IF;
K7 = IB + ID -IF;
K2 = IE - abs(IA-IB);
K4 = IE - abs(IC-ID);
K6 = IF - abs(IA-IC);
K8 = IF - abs(IB-ID);
double karr[8] = {K1,K2,K3,K4,K5,K6,K7,K8};
double kmn=karr[0];
double kmx=karr[0];
for(int i=0;i<8;i++)
{
if(kmn>karr[i])
{
kmn=karr[i];
}
else if(kmx<karr[i])
{
kmx = karr[i];
}
}
double K0 = kmn;
if(K0 < 0) return 0;
double nkk, n2kk,nkk2 = 0.;
kk[0] = K1;
kk[1] = K2;
kk[2] = K3;
kk[3] = K4;
kk[4] = K5;
kk[5] = K6;
kk[6] = K7;
kk[7] = K8;
for(int i = 0; i < 7; i = i + 2){
nkk = kk[i];
n2kk = kk[i]/2;
nkk2 = n2kk*2.;
if(nkk != nkk2){return 0;}
}
ix[0] = IA;
ix[1] = ID;
ix[2] = IB;
ix[3] = IC;
ix[4] = IF;
ix[5] = IE;
double Lmin = ix[0];
int Kmin = 1;
for( int i = 1; i < 6; i++){
if(ix[i] - Lmin < 0){
Lmin=ix[i];
}
if(ix[i] - Lmin == 0){
Kmin=i;
}
if(ix[i] - Lmin > 0){
break;
}
}
double sgn1 = 1.;
double KQ,IP,IQ,IT = 0.;
if(Kmin == 1){
KQ = 7 - Kmin;
IA = ix[(int)KQ-1];
ID = ix[Kmin+4-1];
IE = ix[Kmin-1];
IF = ix[(int)KQ-4-1];
if(((int)(IA+ID-IE-IF)/2 %2) != 0) {sgn1 = -1.;}
}else if(Kmin == 2){
KQ = 7 - Kmin;
IA = ix[(int)KQ-1];
ID = ix[Kmin+4-1];
IE = ix[Kmin-1];
IF = ix[(int)KQ-4-1];
if(((int)(IA+ID-IE-IF)/2 %2) != 0) {sgn1 = -1.;}
}else if(Kmin == 3){
KQ = 9 - Kmin;
IB = ix[(int)KQ-1];
IC = ix[Kmin+2-1];
IE = ix[Kmin-1];
IF = ix[(int)KQ -2-1];
if(((int)(IB+IC-IE-IF)/2)%2 !=0) {sgn1 = -1.;}
}else if(Kmin == 4){
KQ = 9 - Kmin;
IB = ix[(int)KQ-1];
IC = ix[Kmin+2-1];
IE = ix[Kmin-1];
IF = ix[(int)KQ -2-1];
if(((int)(IB+IC-IE-IF)/2)%2 !=0) {sgn1 = -1.;}
}else if(Kmin == 5){
IE = ix[4];
IF = ix[5];
IB = ix[3];
IC = ix[2];
}else if(Kmin == 6){
}
IP = IA-IB;
IQ = IC-ID;
if(abs(IP) >= abs(IQ)){
if(IP >= 0){
IQ = IC-ID;
}else{
IT = IB;
IB = IA;
IA = IT;
IT = ID;
ID = IC;
IC = IT;
IP = -IP;
}
}else{
IT = IC;
IC = IA;
IA = IT;
IT = ID;
ID = IB;
IB = IT;
IP = IQ;
if(IP >= 0){
IQ = IC - ID;
}else{
IT = IB;
IB = IA;
IA = IT;
IT = ID;
ID = IC;
IC = IT;
IP = -IP;
}
}
double sgn2 = 1.;
if((int)(IB+ID-IF)/2 %2 != 0) sgn2 = -1.;
if(IE >= 0){
double BI = IB;
double DI = ID;
Racah = sgn1 * sgn2 / sqrt((BI+1.)*(DI+1.));
}else{
nn[0] = (IA+IB+IE)/2 +1;
nn[1] = (IC+ID+IE)/2 +1;
nn[2] = (IA+IC+IF)/2 +1;
nn[3] = (IB+ID+IF)/2 +1;
nx[0] = nn[0] -IE;
nx[1] = nn[0] -IB;
nx[2] = nn[0] -IA;
nx[3] = nn[1] -IE;
nx[4] = nn[1] -ID;
nx[5] = nn[1] -IC;
nx[6] = nn[2] -IF;
nx[7] = nn[2] -IC;
nx[8] = nn[2] -IA;
nx[9] = nn[3] -IF;
nx[10] = nn[3] -ID;
nx[11] = nn[3] -IB;
IP = (IA+IB+IC+ID+4)/2;
IQ = (IE+IF-IA-ID)/2;
IT = (IE+IF-IB-IC)/2;
double a = 1;
double b = -IQ+1;
if(a > b) {
NZMIN = a;
}else{
NZMIN = b;
}
double kzar[3] = {nx[1],nx[4],nx[10]};
double kzmn=kzar[0];
double kzmx=kzar[0];
for(int i=0;i<3;i++)
{
if(kzmn>kzar[i])
{
kzmn=kzar[i];
}
else if(kzmx<kzar[i])
{
kzmx = kzar[i];
}
}
NZMAX = kzmn;
if(NZMAX < NZMIN){return 0;}
double sqlog = 0;
double I1 = 0.;
for(int i = 0; i <4; i++){
I1 = nn[i]+1;
sqlog = sqlog -lgamma(I1);
}
for(int i = 0; i <12; i++){
I1 = nx[i];
sqlog = sqlog - lgamma(I1);
}
sqlog = 0.5*sqlog;
double sss = 0.;
double NZM1 = 0.;
double sslog = 0.;
for(int nz = NZMIN; nz <= NZMAX; nz++){
NZM1 = nz - 1;
ny[0] = IP - NZM1;
ny[1] = nx[0] -NZM1;
ny[2] = nx[3] -NZM1;
ny[3] = nx[6] -NZM1;
ny[4] = nx[9]-NZM1;
ny[5] = nz;
ny[6] = IQ+nz;
ny[7] = IT+nz;
I1 = ny[0];
sslog = sqlog + lgamma(I1);
for(int i = 1; i<8; i++){
I1 = ny[i];
}sslog = sslog - lgamma(I1);
sss = sss + (pow(-1.,NZM1)*exp(sslog));
}
Racah = sgn1*sss;
}
return Racah;
}