3
\brief Enter brief description of file here
11
/* the dot functions have not been tested for transposed cases */
13
int dpd_dot14(dpdfile2 *T, dpdbuf4 *I, dpdfile2 *Z,
14
int transt, int transz, double alpha, double beta)
16
int h, Gp, Gq, Gr, Gs, GT, GI, GZ, Tblock, Zblock;
24
nirreps = T->params->nirreps;
26
GI = I->file.my_irrep;
29
/* Get the two-index quantities from disk */
30
dpd_file2_mat_init(T);
32
dpd_file2_scm(Z, beta);
33
dpd_file2_mat_init(Z);
40
/* loop over irreps of buffer I; h = Gpq */
41
for(h=0; h < nirreps; h++) {
43
dpd_buf4_mat_irrep_init(I, h);
44
dpd_buf4_mat_irrep_rd(I, h);
46
/* Loop over irreps of the target */
47
for(Gq=0; Gq < nirreps; Gq++) {
48
/*Gr = Gq; Gp = Gs = h^Gq; */
49
Gp = h^Gq; Gr = Gq^GZ; Gs = h^Gq^GT;
50
if (!transt) Tblock = Gp; else Tblock = Gs;
51
if (!transz) Zblock = Gq; else Zblock = Gr;
53
/* Allocate space for the X buffer */
54
if(T->params->ppi[Gp] && T->params->qpi[Gs])
55
X = dpd_block_matrix(T->params->ppi[Gp],T->params->qpi[Gs]);
57
/* Loop over orbitals of the target */
58
for(q=0; q < Z->params->ppi[Gq]; q++) {
59
Q = Z->params->poff[Gq] + q;
60
for(r=0; r < Z->params->qpi[Gr]; r++) {
61
R = Z->params->qoff[Gr] + r;
63
/* Loop over orbitals of the two-index term */
64
for(p=0; p < T->params->ppi[Gp]; p++) {
65
P = T->params->poff[Gp] + p;
66
for(s=0; s < T->params->qpi[Gs]; s++) {
67
S = T->params->qoff[Gs] + s;
69
/* Calculate row and column indices in I */
70
if(!transt && !transz) {
71
row = I->params->rowidx[P][Q];
72
col = I->params->colidx[R][S];
74
else if(transt && !transz) {
75
row = I->params->rowidx[S][Q];
76
col = I->params->colidx[R][P];
78
else if(!transt && transz) {
79
row = I->params->rowidx[P][R];
80
col = I->params->colidx[Q][S];
82
else if(transt && transz) {
83
row = I->params->rowidx[S][R];
84
col = I->params->colidx[Q][P];
87
/* Build the X buffer */
88
X[p][s] = I->matrix[h][row][col];
93
value = dot_block(T->matrix[Tblock], X, T->params->ppi[Gp],
94
T->params->qpi[Gs], alpha);
96
Z->matrix[Zblock][q][r] += value;
99
if(T->params->ppi[Gp] && T->params->qpi[Gs])
100
dpd_free_block(X,T->params->ppi[Gp],T->params->qpi[Gs]);
102
dpd_buf4_mat_irrep_close(I, h);
109
/* Close the two-index quantities */
110
dpd_file2_mat_close(T);
111
dpd_file2_mat_wrt(Z);
112
dpd_file2_mat_close(Z);