|
| 1 | +Here's a code block that demonstrates how to carry out the AO to MO two-electron integral transformation using four N<sup>5</sup> steps. Note that the original AO- and transformed MO-basis integrals are stored in a one-dimensional array taking advantage of their eight-fold permutational symmetry, as described in [Project #3](../Project%2303). However, the half-transformed integrals, which lack bra-ket permutational symmetry, are stored in a two-dimensional array. |
| 2 | + |
| 3 | +A number of convenient functions [`mmult()`, `init_matrix()`, etc.] used in this code block can be found in the [diag.cc](http://sirius.chem.vt.edu/~crawdad/programming/diag.cc) discussed in [Project #1](../Project%2301). |
| 4 | + |
| 5 | +```c++ |
| 6 | + #define INDEX(i,j) ((i>j) ? (((i)*((i)+1)/2)+(j)) : (((j)*((j)+1)/2)+(i))) |
| 7 | + ... |
| 8 | + double **X, **Y, **TMP, *TEI; |
| 9 | + int i, j, k, l, ij, kl, ijkl, klij; |
| 10 | + |
| 11 | + ... |
| 12 | + X = init_matrix(nao, nao); |
| 13 | + Y = init_matrix(nao, nao); |
| 14 | + |
| 15 | + TMP = init_matrix((nao*(nao+1)/2),(nao*(nao+1)/2)); |
| 16 | + for(i=0,ij=0; i < nao; i++) |
| 17 | + for(j=0; j <= i; j++,ij++) { |
| 18 | + for(k=0,kl=0; k < nao; k++) |
| 19 | + for(l=0; l <= k; l++,kl++) { |
| 20 | + ijkl = INDEX(ij,kl); |
| 21 | + X[k][l] = X[l][k] = TEI[ijkl]; |
| 22 | + } |
| 23 | + zero_matrix(Y, nao, nao); |
| 24 | + mmult(C, 1, X, 0, Y, nao, nao, nao); |
| 25 | + zero_matrix(X, nao, nao); |
| 26 | + mmult(Y, 0, C, 0, X, nao, nao, nao); |
| 27 | + for(k=0, kl=0; k < nao; k++) |
| 28 | + for(l=0; l <= k; l++, kl++) |
| 29 | + TMP[kl][ij] = X[k][l]; |
| 30 | + } |
| 31 | + |
| 32 | + zero_array(TEI, (nao*(nao+1)/2)*((nao*(nao+1)/2)+1)/2); |
| 33 | + |
| 34 | + for(k=0,kl=0; k < nao; k++) |
| 35 | + for(l=0; l <= k; l++,kl++) { |
| 36 | + zero_matrix(X, nao, nao); |
| 37 | + zero_matrix(Y, nao, nao); |
| 38 | + for(i=0,ij=0; i < nao; i++) |
| 39 | + for(j=0; j <=i; j++,ij++) |
| 40 | + X[i][j] = X[j][i] = TMP[kl][ij]; |
| 41 | + zero_matrix(Y, nao, nao); |
| 42 | + mmult(C, 1, X, 0, Y, nao, nao, nao); |
| 43 | + zero_matrix(X, nao, nao); |
| 44 | + mmult(Y, 0, C, 0, X, nao, nao, nao); |
| 45 | + for(i=0, ij=0; i < nao; i++) |
| 46 | + for(j=0; j <= i; j++,ij++) { |
| 47 | + klij = INDEX(kl,ij); |
| 48 | + TEI[klij] = X[i][j]; |
| 49 | + } |
| 50 | + } |
| 51 | + |
| 52 | + ... |
| 53 | + |
| 54 | + free_matrix(X, nao); |
| 55 | + free_matrix(Y, nao); |
| 56 | + free_matrix(TMP, (nao*(nao+1)/2)); |
| 57 | + |
| 58 | +``` |
| 59 | +
|
0 commit comments