6
#include <libciomr/libciomr.h>
11
#include "mo_overlap.h"
17
// Wrap a,b indices into one composite index assuming S2 symmetry
18
#define INDEX2(a,b) ((a) > (b)) ? ( (((a)*(a+1)) >> 1) + (b) ) : ( (((b)*(b+1)) >> 1) + (a) )
19
// Wrap a>=b indices into one composite index assuming S2 symmetry
20
#define INDEX2_ORD(a,b) ( (((a)*(a+1))/2) + (b) )
21
// Wrap a>=b>=c indices into one composite index assuming S3 symmetry
22
#define INDEX3_ORD(a,b,c) ( ((a)*(((a)+4)*((a)-1)+6)/6) + (((b)*(b+1))/2) + (c) )
24
extern MOInfo_t MOInfo;
26
extern void done(const char *);
28
double eval_rccsd_derwfn_overlap()
30
int ndocc = MOInfo.ndocc;
31
int nvirt = MOInfo.num_mo - MOInfo.ndocc;
32
FLOAT **CSC_full = eval_S_alpha();
33
FLOAT **CSC = create_matrix(ndocc,ndocc);
34
int *tmpintvec = new int[ndocc];
36
FLOAT **RmSp = create_matrix(ndocc,nvirt);
37
FLOAT **RmDp = create_matrix(INDEX2_ORD(ndocc,0),INDEX2_ORD(nvirt,0));
38
FLOAT **RmTp = create_matrix(INDEX3_ORD(ndocc,0,0),INDEX3_ORD(nvirt,0,0));
41
// Evaluate reference-reference overlap <Ref(-)|Ref(+)>
43
for(int i=0;i<ndocc;i++)
44
for(int j=0;j<ndocc;j++)
45
CSC[i][j] = CSC_full[i][j];
46
// C_DGETRF(ndocc,ndocc,&(CSC[0][0]),ndocc,tmpintvec);
48
lu_decom(CSC, ndocc, tmpintvec, &sign);
49
FLOAT deter_ref = 1.0;
50
for(int i=0;i<ndocc;i++)
51
deter_ref *= CSC[i][i];
54
// Evaluate all overlaps <Ref(-)|Singles(+)>
56
fprintf(outfile,"\n -Overlap of Ref(-) with Singles(-):\n");
57
for(int mo_i=0; mo_i<ndocc; mo_i++) {
58
for(int mo_a=ndocc; mo_a<MOInfo.num_mo; mo_a++) {
60
// Before generating the single restore the original (<Ref(-)|Ref(+)>) overlap matrix
61
for(int i=0;i<ndocc;i++)
62
for(int j=0;j<ndocc;j++)
63
CSC[i][j] = CSC_full[i][j];
65
// Replace ith column with ath column
66
for(int p=0; p<ndocc; p++)
67
CSC[p][mo_i] = CSC_full[p][mo_a];
69
// Compute the determinant
70
// C_DGETRF(ndocc,ndocc,&(CSC[0][0]),ndocc,tmpintvec);
71
lu_decom(CSC, ndocc, tmpintvec, &sign);
73
for(int i=0;i<ndocc;i++)
76
RmSp[mo_i][mo_a-ndocc] = deter_ref * deter1;
77
fprintf(outfile," %d %d %20.15lf\n",mo_i,mo_a,RmSp[mo_i][mo_a-ndocc]);
83
// Evaluate all overlaps <Ref(-)|IJABDoubles(+)>
85
fprintf(outfile,"\n -Overlap of Ref(-) with IJABDoubles(-):\n");
86
for(int mo_i=0; mo_i<ndocc; mo_i++) {
87
for(int mo_j=0; mo_j<mo_i; mo_j++) {
88
for(int mo_a=ndocc, a=0; mo_a<MOInfo.num_mo; mo_a++,a++) {
89
for(int mo_b=ndocc, b=0; mo_b<mo_a; mo_b++,b++) {
91
// Before generating the single restore the original (<Ref(-)|Ref(+)>) overlap matrix
92
for(int i=0;i<ndocc;i++)
93
for(int j=0;j<ndocc;j++)
94
CSC[i][j] = CSC_full[i][j];
96
// Replace ith column with ath column
97
for(int p=0; p<ndocc; p++)
98
CSC[p][mo_i] = CSC_full[p][mo_a];
99
// Replace jth column with bth column
100
for(int p=0; p<ndocc; p++)
101
CSC[p][mo_j] = CSC_full[p][mo_b];
103
// Compute the determinant
104
// C_DGETRF(ndocc,ndocc,&(CSC[0][0]),ndocc,tmpintvec);
105
lu_decom(CSC, ndocc, tmpintvec, &sign);
107
for(int i=0;i<ndocc;i++)
110
int ij = INDEX2_ORD(mo_i,mo_j);
111
int ab = INDEX2_ORD(a,b);
112
RmDp[ij][ab] = deter_ref * deter1;
113
fprintf(outfile," %d %d %d %d %20.15lf\n",mo_i,mo_j,mo_a,mo_b,RmDp[ij][ab]);
121
// Evaluate all overlaps <Ref(-)|IJKABCTriples(+)>
123
fprintf(outfile,"\n -Overlap of Ref(-) with IJKABCTriples(-):\n");
124
for(int mo_i=0; mo_i<ndocc; mo_i++) {
125
for(int mo_j=0; mo_j<mo_i; mo_j++) {
126
for(int mo_k=0; mo_k<mo_j; mo_k++) {
127
for(int mo_a=ndocc, a=0; mo_a<MOInfo.num_mo; mo_a++,a++) {
128
for(int mo_b=ndocc, b=0; mo_b<mo_a; mo_b++,b++) {
129
for(int mo_c=ndocc, c=0; mo_c<mo_b; mo_c++,c++) {
131
// Before generating the single restore the original (<Ref(-)|Ref(+)>) overlap matrix
132
for(int i=0;i<ndocc;i++)
133
for(int j=0;j<ndocc;j++)
134
CSC[i][j] = CSC_full[i][j];
136
// Replace ith column with ath column
137
for(int p=0; p<ndocc; p++)
138
CSC[p][mo_i] = CSC_full[p][mo_a];
139
// Replace jth column with bth column
140
for(int p=0; p<ndocc; p++)
141
CSC[p][mo_j] = CSC_full[p][mo_b];
142
// Replace jth column with bth column
143
for(int p=0; p<ndocc; p++)
144
CSC[p][mo_k] = CSC_full[p][mo_c];
146
// Compute the determinant
147
// C_DGETRF(ndocc,ndocc,&(CSC[0][0]),ndocc,tmpintvec);
148
lu_decom(CSC, ndocc, tmpintvec, &sign);
150
for(int i=0;i<ndocc;i++)
153
int ijk = INDEX3_ORD(mo_i,mo_j,mo_k);
154
int abc = INDEX3_ORD(a,b,c);
155
RmTp[ijk][abc] = deter_ref * deter1;
156
fprintf(outfile," %d %d %d %d %d %d %20.15lf\n",mo_i,mo_j,mo_k,mo_a,mo_b,mo_c,RmTp[ijk][abc]);
167
delete_matrix(CSC_full);
171
return (double)deter_ref*deter_ref;