5
/* the non-symmetric transpose cases have not been tested */
7
int dpd_dot13(dpdfile2 *T, dpdbuf4 *I, dpdfile2 *Z,
8
int transt, int transz, double alpha, double beta)
10
int h, Gp, Gq, Gr, Gs, GT, GI, GZ, Tblock, Zblock;
18
nirreps = T->params->nirreps;
20
GI = I->file.my_irrep;
23
/* Get the two-index quantities from disk */
24
dpd_file2_mat_init(T);
27
dpd_file2_scm(Z, beta);
28
dpd_file2_mat_init(Z);
35
/* loop over row irreps of bufI; h = Gpq = Grs^GI */
36
for(h=0; h < nirreps; h++) {
38
dpd_buf4_mat_irrep_init(I, h);
39
dpd_buf4_mat_irrep_rd(I, h);
41
/* Loop over row irreps of target Z, Gz = Gqs */
42
for(Gq=0; Gq < nirreps; Gq++) {
43
/* Gs = Gq; Gp = Gr = h^Gq; */
44
Gp = h^Gq; Gr = h^Gq^GT; Gs = Gq^GZ;
45
if (!transt) Tblock = Gp; else Tblock = Gr;
46
if (!transz) Zblock = Gq; else Zblock = Gs;
48
/* Allocate space for the X buffer */
49
if(T->params->ppi[Gp] && T->params->qpi[Gr])
50
X = dpd_block_matrix(T->params->ppi[Gp],T->params->qpi[Gr]);
52
/* Loop over orbitals of the target */
53
for(q=0; q < Z->params->ppi[Gq]; q++) {
54
Q = Z->params->poff[Gq] + q;
55
for(s=0; s < Z->params->qpi[Gs]; s++) {
56
S = Z->params->qoff[Gs] + s;
58
/* Loop over orbitals of the two-index term */
59
for(p=0; p < T->params->ppi[Gp]; p++) {
60
P = T->params->poff[Gp] + p;
61
for(r=0; r < T->params->qpi[Gr]; r++) {
62
R = T->params->qoff[Gr] + r;
64
/* Calculate row and column indices in I */
65
if(!transt && !transz) {
66
row = I->params->rowidx[P][Q];
67
col = I->params->colidx[R][S];
69
else if(transt && !transz) {
70
row = I->params->rowidx[R][Q];
71
col = I->params->colidx[P][S];
73
else if(!transt && transz) {
74
row = I->params->rowidx[P][S];
75
col = I->params->colidx[R][Q];
77
else if(transt && transz) {
78
row = I->params->rowidx[R][S];
79
col = I->params->colidx[P][Q];
82
/* Build the X buffer */
83
X[p][r] = I->matrix[h][row][col];
88
value = dot_block(T->matrix[Tblock], X, T->params->ppi[Gp],
89
T->params->qpi[Gr], alpha);
91
Z->matrix[Zblock][q][s] += value;
94
if(T->params->ppi[Gp] && T->params->qpi[Gr])
95
dpd_free_block(X, T->params->ppi[Gp],T->params->qpi[Gr]);
97
dpd_buf4_mat_irrep_close(I, h);
104
/* Close the two-index quantities */
105
dpd_file2_mat_close(T);
106
dpd_file2_mat_wrt(Z);
107
dpd_file2_mat_close(Z);