3
\brief Enter brief description of file here
4
-------------------------------------------------------------------------------------------------
5
Functions for performing four-index transformation from cartesian to pure angular momentum basis
6
-------------------------------------------------------------------------------------------------*/
10
#include<libciomr/libciomr.h>
12
#include<libint/libint.h>
19
namespace psi { namespace CINTS {
22
void transform_i(double *data, double *puream_data, double **c2p, int am_i, int nj, int nk, int nl)
37
for(l=0;l<nl;l++,offset++)
38
for(isph=0;isph<nsph;isph++) {
39
ii = data + offset; tmp = 0.0;
40
for(i=0;i<ni;i++,ii+=step)
41
tmp += c2p[isph][i]*(*ii);
42
puream_data[step*isph+offset] = tmp;
50
void transform_j(double *data, double *puream_data, double **c2p, int am_j, int ni, int nk, int nl)
54
int offset,offset_sph;
63
for(k=0;k<nk;k++,offset+=nl) {
64
offset = (i*nj*nk + k)*nl;
65
offset_sph = (i*nsph*nk + k)*nl;
66
for(l=0;l<nl;l++,offset++,offset_sph++)
67
for(jsph=0;jsph<nsph;jsph++) {
68
jj = data + offset; tmp = 0.0;
69
for(j=0;j<nj;j++,jj+=step)
70
tmp += c2p[jsph][j]*(*jj);
71
puream_data[step*jsph+offset_sph] = tmp;
80
void transform_k(double *data, double *puream_data, double **c2p, int am_k, int ni, int nj, int nl)
84
int offset,offset_sph;
94
offset = (i*nj + j)*nk*nl;
95
offset_sph = (i*nj + j)*nsph*nl;
96
for(l=0;l<nl;l++,offset++,offset_sph++)
97
for(ksph=0;ksph<nsph;ksph++) {
98
kk = data + offset; tmp = 0.0;
99
for(k=0;k<nk;k++,kk+=step)
100
tmp += c2p[ksph][k]*(*kk);
101
puream_data[step*ksph+offset_sph] = tmp;
110
void transform_l(double *data, double *puream_data, double **c2p, int am_l, int ni, int nj, int nk)
112
register int i,j,k,l;
114
int offset,offset_sph;
124
offset = (i*nj + j)*nk*nl;
125
offset_sph = (i*nj + j)*nk*nsph;
126
for(k=0;k<nk;k++,offset+=nl,offset_sph+=nsph)
127
for(lsph=0;lsph<nsph;lsph++) {
128
ll = data + offset; tmp = 0;
129
for(l=0;l<nl;l++,ll+=step)
130
tmp += c2p[lsph][l]*(*ll);
131
puream_data[step*lsph+offset_sph] = tmp;
137
#elif USE_MM && !SPARSE_C2P
139
double *transform_ijkl(double *data, double *puream_data, double **cc2pp_ij, double **cc2pp_kl, int trans_ij,
140
int am_i, int am_j, int am_k, int am_l)
143
int n_ij, n_kl, nsph_ij, nsph_kl;
154
static double *cij_ckl[CINTS_MAX_AM*CINTS_MAX_AM*(CINTS_MAX_AM+1)*(CINTS_MAX_AM+1)/4];
155
static double *cij_pkl[CINTS_MAX_AM*(CINTS_MAX_AM+1)*(2*CINTS_MAX_AM-1)*(2*CINTS_MAX_AM-1)/2];
156
static double *pij_pkl[(2*CINTS_MAX_AM-1)*(2*CINTS_MAX_AM-1)*(2*CINTS_MAX_AM-1)*(2*CINTS_MAX_AM-1)];
159
n_ij = ioff[am_i+1]*ioff[am_j+1];
160
n_kl = ioff[am_k+1]*ioff[am_l+1];
162
for(ij=0, tmp_ptr = data; ij<n_ij; ij++, tmp_ptr += n_kl)
163
cij_ckl[ij] = tmp_ptr;
166
nsph_kl = (2*am_k+1)*(2*am_l+1);
168
for(ij=0, tmp_ptr = puream_data; ij<n_ij; ij++, tmp_ptr += nsph_kl)
169
cij_pkl[ij] = tmp_ptr;
170
/* Insert any C-based matrix multiplication routine here */
171
newmm_rking(&cij_ckl[0],0,cc2pp_kl,1,&cij_pkl[0],n_ij,n_kl,nsph_kl,1.0,0.0);
173
/* F_DGEMM(&true_c,&false_c,&nsph_kl,&n_ij,&n_kl,&one_d,&(cc2pp_kl[0][0]),&n_kl,
174
data,&n_kl,&zero_d,puream_data,&nsph_kl);*/
175
C_DGEMM('n', 't', n_ij, nsph_kl, n_kl, 1.0, data, n_kl, cc2pp_kl[0], n_kl,
176
0.0, puream_data, nsph_kl);
180
nsph_ij = (2*am_i+1)*(2*am_j+1);
182
for(ij=0, tmp_ptr = data; ij<nsph_ij; ij++, tmp_ptr += nsph_kl)
183
pij_pkl[ij] = tmp_ptr;
184
/* Insert any C-based matrix multiplication routine here */
185
newmm_rking(cc2pp_ij,0,&cij_pkl[0],0,&pij_pkl[0],nsph_ij,n_ij,nsph_kl,1.0,0.0);
187
/* F_DGEMM(&false_c,&false_c,&nsph_kl,&nsph_ij,&n_ij,&one_d,cc2pp_ij[0],&n_ij,
188
puream_data,&nsph_kl,&zero_d,data,&nsph_kl);*/
189
C_DGEMM('n', 'n', nsph_ij, nsph_kl, n_ij, 1.0, cc2pp_ij[0], n_ij,
190
puream_data, nsph_kl, 0.0, data, nsph_kl);
201
#elif USE_MM && SPARSE_C2P
203
double *transform_ijkl_sparse(double *data, double *puream_data,
204
mat_elem **pp2cc_sparse, mat_elem **cc2pp_sparse,
205
int *pp2cc_rowlength, int *cc2pp_rowlength, int trans_ij,
206
int am_i, int am_j, int am_k, int am_l)
209
int n_ij, n_kl, nsph_ij, nsph_kl;
213
/* static double *cij_ckl[CINTS_MAX_AM*CINTS_MAX_AM*(CINTS_MAX_AM+1)*(CINTS_MAX_AM+1)/4];
214
static double *cij_pkl[CINTS_MAX_AM*(CINTS_MAX_AM+1)*(2*CINTS_MAX_AM-1)*(2*CINTS_MAX_AM-1)/2];
215
static double *pij_pkl[(2*CINTS_MAX_AM-1)*(2*CINTS_MAX_AM-1)*(2*CINTS_MAX_AM-1)*(2*CINTS_MAX_AM-1)];*/
216
double *cijckl_row, *cijpkl_row, *pijpkl_row;
218
n_ij = ioff[am_i+1]*ioff[am_j+1];
219
n_kl = ioff[am_k+1]*ioff[am_l+1];
220
nsph_kl = (2*am_k+1)*(2*am_l+1);
221
for(ij=0, cijckl_row = data, cijpkl_row = puream_data; ij<n_ij;
222
ij++, cijckl_row += n_kl, cijpkl_row += nsph_kl) {
223
memset(cijpkl_row,0,sizeof(double)*nsph_kl);
224
for(pq=0; pq<n_kl; pq++) {
225
tmp = cijckl_row[pq];
226
for(kl=0; kl<cc2pp_rowlength[pq]; kl++) {
227
cijpkl_row[cc2pp_sparse[pq][kl].column] += tmp*cc2pp_sparse[pq][kl].value;
233
nsph_ij = (2*am_i+1)*(2*am_j+1);
234
for(ij=0, pijpkl_row = data; ij<nsph_ij; ij++, pijpkl_row += nsph_kl) {
235
memset(pijpkl_row,0,sizeof(double)*nsph_kl);
236
for(pq=0; pq<pp2cc_rowlength[ij]; pq++) {
237
tmp = pp2cc_sparse[ij][pq].value;
238
cijpkl_row = puream_data + nsph_kl*pp2cc_sparse[ij][pq].column;
239
for(kl=0; kl<nsph_kl; kl++) {
240
pijpkl_row[kl] += tmp*cijpkl_row[kl];