4
#include <libciomr/libciomr.h>
12
double xyz2lm_Coeff(int,int,int,int,int);
16
/*-----------------------------------------------------------------------------------------------------------------
17
This function builds cartesian to pure angular momentum transformation matrix
18
-----------------------------------------------------------------------------------------------------------------*/
20
void build_cart2pureang()
24
int class,lmax,irr,ao,atom,l;
25
int shell, shell_first, shell_last;
33
/*------------------------
34
Initialize global arrays
35
-------------------------*/
37
num_so_per_irrep = init_int_array(nirreps);
38
cart2pureang = (double ***) malloc(sizeof(double **)*(max_angmom+1));
39
for(l=0;l<=max_angmom;l++)
40
cart2pureang[l] = init_matrix(2*l+1,ioff[l+1]);
41
fac = init_array(2*max_angmom+1);
43
for(i=1;i<=2*max_angmom;i++)
45
bc = init_matrix(max_angmom+1,max_angmom+1);
46
for(i=0;i<=max_angmom;i++)
48
bc[i][j] = combinations(i,j);
50
/*------------------------
51
Initialize local arrays
52
-------------------------*/
55
/*--------------------------------------------------------------------------------------------------
56
Compute number of pure angular momentum SOs in each symmetry block for each angular momentum type
57
--------------------------------------------------------------------------------------------------*/
59
num_pureang_so = init_int_matrix(max_angmom+1,nirreps);
60
num_redun_so = init_int_matrix(max_angmom+1,nirreps);
61
for(l=0;l<=max_angmom;l++)
62
for(irr=0;irr<nirreps;irr++)
63
num_pureang_so[l][irr] = num_cart_so[l][irr];
64
for(i=2;i<=max_angmom;i++)
66
for(irr=0;irr<nirreps;irr++) {
67
num_redun_so[i][irr] += num_pureang_so[l][irr];
68
num_pureang_so[i][irr] -= num_pureang_so[l][irr];
72
/*--------------------------------------------------------------------------------------------------
73
Compute cartesian to pure angular momentum transformation matrices for each angular momentum type
74
--------------------------------------------------------------------------------------------------*/
76
for(l=0;l<=max_angmom;l++) {
79
for(ao=0;ao<ao_max;ao++)
80
cart2pureang[l][m+l][ao] = xyz2lm_Coeff(l,m,xexp_ao[l][ao],yexp_ao[l][ao],zexp_ao[l][ao]);
84
/*-----------------------------
85
Remove after testing is over
86
-----------------------------*/
87
if (print_lvl >= DEBUGPRINT)
88
for(l=0;l<=max_angmom;l++) {
89
fprintf(outfile," -Cart2PureAng matrix for l=%d:\n",l);
90
print_mat(cart2pureang[l],2*l+1,ioff[l+1],outfile);
91
fprintf(outfile,"\n");
95
free_matrix(bc,max_angmom+1);
101
/*---------------------------------------------------------------------------------------------
102
Computes transformation coefficients from cartesian to real pure angular momentum functions.
103
See IJQC 54, 83 (1995), eqn (15). If m is negative, imaginary part is computed, whereas
104
a positive m indicates that the real part of spherical harmonic Ylm is requested.
105
---------------------------------------------------------------------------------------------*/
107
double xyz2lm_Coeff(int l, int m, int lx, int ly, int lz)
113
double pfac, pfac1, sum, sum1;
116
if ((lx + ly - abs(m))%2)
119
j = (lx + ly - abs(m))/2;
124
/*----------------------------------------------------------------------------------------
125
Checking whether the cartesian polynomial contributes to the requested component of Ylm
126
----------------------------------------------------------------------------------------*/
127
comp = (m >= 0) ? 1 : -1;
129
if (comp != parity(i))
132
pfac = sqrt(fac[2*lx]*fac[2*ly]*fac[2*lz]*fac[l-abs_m]/(fac[2*l]*fac[l]*fac[lx]*fac[ly]*fac[lz]*fac[l+abs_m]));
136
pfac *= parity((i-1)/2);
142
for(i=0;i<=i_max;i++) {
143
pfac1 = bc[l][i]*bc[i][j];
147
pfac1 *= (parity(i)*fac[2*(l-i)]/fac[l-abs_m-2*i]);
149
k_min = MAX((lx-abs_m)/2,0);
151
for(k=k_min;k<=k_max;k++)
152
sum1 += bc[j][k]*bc[abs_m][lx-2*k]*parity(k);
158
return M_SQRT2*pfac*sum;