4
\brief Check the SCF energy
9
namespace psi { namespace detci {
11
#define INDEX(i,j) ((i>j) ? (ioff[(i)]+(j)) : (ioff[(j)]+(i)))
15
void scf_energy(double *H, double *TE, double *energy_1, double *energy_2,
16
double *energy_e, int *docc, int *frozen_docc, int fzc_flag,
17
int nirreps, int *reorder, int *opi);
20
** check_energy(): check the SCF energy by calculating it from the two-electr.
21
** integrals in the MO basis
23
** \param H = lwr tri of one-electron integrals matrix (MO basis)
24
** \param twoel_ints = two electron integrals (lexically indexed, MO basis)
25
** \param nocc = num occupied orbitals (assume closed shell case) and
26
** exclude frozen core
27
** \param escf = scf energy to compare to
28
** \param enuc = nuclear repulsion energy
29
** \param efzc = frozen core energy
30
** \param nirreps = number of irreps
31
** \param reorder = reordering array for Pitzer->CI ordering
32
** \param opi = orbs per irrep in Pitzer ordering
33
** \param outfile = file to write output to
35
** Returns: the computed SCF energy
38
double check_energy(double *H, double *twoel_ints, int *docc, int *frozen_docc,
39
int fzc_flag, double escf, double enuc, double efzc,
40
int nirreps, int *reorder, int *opi, int print_lvl, FILE *outfile)
42
double energy_1 ; /* one-electron energy */
43
double energy_2 ; /* two-electron energy */
44
double energy_e ; /* total electronic energy */
46
scf_energy(H, twoel_ints, &energy_1, &energy_2, &energy_e, docc,
47
frozen_docc, fzc_flag, nirreps, reorder, opi);
50
fprintf(outfile,"\nCheck SCF Energy from 1- and 2-electron integrals\n\n");
51
fprintf(outfile,"SCF Energy (ref): %16.10lf\n", escf) ;
52
fprintf(outfile,"Nuclear repulsion energy: %16.10lf\n", enuc) ;
53
fprintf(outfile,"One-electron energy: %16.10lf\n", energy_1) ;
54
fprintf(outfile,"Two-electron energy: %16.10lf\n", energy_2) ;
55
fprintf(outfile,"Frozen core energy: %16.10lf\n", efzc) ;
56
fprintf(outfile,"Total electronic energy: %16.10lf\n", energy_e+efzc) ;
57
fprintf(outfile,"Total SCF energy: %16.10lf\n", enuc +
60
if (fabs(enuc + efzc + energy_e - escf) > 0.00000001) {
62
"\n*** Calculated Energy Differs from SCF Energy in CHKPT ! ***\n") ;
66
return(enuc+efzc+energy_e);
71
** scf_energy(): Function calculates the SCF energy from the one- and
72
** two-electron integrals in MO form (closed-shell case).
74
** David Sherrill, Sept 1993
76
** \param H = Matrix of one-electron integrals in MO basis (lwr triangle)
77
** \param TE = Two-electron integrals in MO basis, stored in
79
** \param energy_1 = pointer to hold one-electron energy
80
** \param energy_2 = pointer to hold two-electron energy
81
** \param energy_e = pointer to hold total electronic energy (sum of two
83
** \param docc = array of doubly-occupied orbitals per irrep
84
** \param frozen_docc = array of frozen doubly-occupied orbitals per irrep
85
** \param fzc_flag = remove explicit consideration of frozen core orbitals ?
86
** \param nirreps = number of irreps
87
** \param reorder = reordering array Pitzer->CI order
88
** \param opi = orbitals per irrep
95
void scf_energy(double *H, double *TE, double *energy_1, double *energy_2,
96
double *energy_e, int *docc, int *frozen_docc, int fzc_flag,
97
int nirreps, int *reorder, int *opi)
99
int irrep, irrep2, d, d2, offset, offset2, ndoc, ndoc2, nfzc, nfzc2, totfzc;
101
int ii, jj, iijj, ij, ijij, iiii;
103
*energy_1 = *energy_2 = *energy_e = 0.0;
107
for (irrep=0; irrep<nirreps; irrep++) {
108
totfzc += frozen_docc[irrep];
112
for (irrep=0,offset=0; irrep<nirreps; irrep++) {
113
if (irrep>0) offset += opi[irrep-1];
116
nfzc = frozen_docc[irrep];
120
for (d=offset+nfzc; d<ndoc+offset+nfzc; d++) {
121
i = reorder[d]-totfzc;
123
iiii = ioff[ii] + ii;
124
*energy_1 += 2.0 * H[ii];
125
*energy_2 += TE[iiii];
127
for (irrep2=0,offset2=0; irrep2<=irrep; irrep2++) {
128
if (irrep2>0) offset2 += opi[irrep2-1];
129
ndoc2 = docc[irrep2];
131
nfzc2 = frozen_docc[irrep2];
136
for (d2=offset2+nfzc2; d2<ndoc2+offset2+nfzc2 && d2<d; d2++) {
137
j = reorder[d2]-totfzc;
141
ijij = ioff[ij] + ij;
142
*energy_2 += 4.0 * TE[iijj] - 2.0 * TE[ijij];
148
*energy_e = *energy_1 + *energy_2;
151
}} // namespace psi::detci