1
/***************************************************************************
2
* PSIMRCC : Copyright (C) 2007 by Francesco Evangelista and Andrew Simmonett
3
* frank@ccc.uga.edu andysim@ccc.uga.edu
4
* A multireference coupled cluster code
5
***************************************************************************/
6
#include <libmoinfo/libmoinfo.h>
10
#include "debugging.h"
11
#include <libutil/libutil.h>
15
namespace psi{ namespace psimrcc{
19
void CCMRCC::update_amps_bwccsd_wrapper()
21
ptr->update_amps_bwccsd();
24
void CCMRCC::update_amps_bwccsd()
26
update_t1_amps_bwccsd();
27
update_t2_amps_bwccsd();
29
zero_internal_delta_amps();
31
blas->solve("||Delta_t1||{u} = t1_delta[o][v]{u} . t1_delta[o][v]{u}");
32
blas->solve("||Delta_t1||{u} += t1_delta[O][V]{u} . t1_delta[O][V]{u}");
34
blas->solve("||Delta_t2||{u} = t2_delta[oo][vv]{u} . t2_delta[oo][vv]{u}");
35
blas->solve("||Delta_t2||{u} += t2_delta[oO][vV]{u} . t2_delta[oO][vV]{u}");
36
blas->solve("||Delta_t2||{u} += t2_delta[OO][VV]{u} . t2_delta[OO][VV]{u}");
38
// Compute the T-AMPS difference
41
for(int n=0;n<moinfo->get_ref_size("a");n++){
42
delta_t1_amps+=blas->get_scalar("||Delta_t1||",moinfo->get_ref_number("a",n));
43
delta_t2_amps+=blas->get_scalar("||Delta_t2||",moinfo->get_ref_number("a",n));
45
delta_t1_amps=pow(delta_t1_amps,0.5)/((double)moinfo->get_nrefs());
46
delta_t2_amps=pow(delta_t2_amps,0.5)/((double)moinfo->get_nrefs());
49
void CCMRCC::update_t1_amps_bwccsd()
51
blas->solve("d'1[o][v]{u} = d1[o][v]{u}");
52
blas->solve("d'1[O][V]{u} = d1[O][V]{u}");
54
for(int n=0;n<moinfo->get_ref_size("u");n++){
55
double shift = current_energy-Heff[moinfo->get_ref_number("u",n)][moinfo->get_ref_number("u",n)];
56
string n_str = to_string(moinfo->get_ref_number("u",n));
57
blas->solve("d'1[o][v]{" + n_str + "} += " + to_string(shift));
58
blas->solve("d'1[O][V]{" + n_str + "} += " + to_string(shift));
61
blas->solve("t1_delta[o][v]{u} = t1_eqns[o][v]{u} / d'1[o][v]{u} - t1[o][v]{u}");
62
blas->solve("t1_delta[O][V]{u} = t1_eqns[O][V]{u} / d'1[O][V]{u} - t1[O][V]{u}");
64
blas->solve("t1[o][v]{u} = t1_eqns[o][v]{u} / d'1[o][v]{u}");
65
blas->solve("t1[O][V]{u} = t1_eqns[O][V]{u} / d'1[O][V]{u}");
67
blas->solve("t1_norm{u} = t1[o][v]{u} . t1[o][v]{u}");
68
blas->solve("t1_norm{u} += t1[O][V]{u} . t1[O][V]{u}");
70
zero_t1_internal_amps();
73
blas->print("t1[o][v]{u}");
74
blas->print("t1[O][V]{u}");
78
void CCMRCC::update_t2_amps_bwccsd()
80
blas->solve("d'2[oo][vv]{u} = d2[oo][vv]{u}");
81
blas->solve("d'2[oO][vV]{u} = d2[oO][vV]{u}");
82
blas->solve("d'2[OO][VV]{u} = d2[OO][VV]{u}");
84
for(int n=0;n<moinfo->get_ref_size("u");n++){
85
string shift = to_string(current_energy-Heff[moinfo->get_ref_number("u",n)][moinfo->get_ref_number("u",n)]);
86
string n_str = to_string(moinfo->get_ref_number("u",n));
87
blas->solve("d'2[oo][vv]{" + n_str + "} += " + shift);
88
blas->solve("d'2[oO][vV]{" + n_str + "} += " + shift);
89
blas->solve("d'2[OO][VV]{" + n_str + "} += " + shift);
94
// (a) Compute eq. (20) of J. Chem. Phys. 110, 10275 (1999)
95
// Comment : Look at eq. (21) of J. Chem. Phys. 110, 10275 (1999)
96
blas->solve("t1_eqns[o][v]{u} += - d1[o][v]{u} * t1[o][v]{u}");
97
blas->solve("t1_eqns[O][V]{u} += - d1[O][V]{u} * t1[O][V]{u}");
100
// (b) Add PijPab (term from a) to the T2 equations
101
blas->solve("t2_eqns[oo][vv]{u} += #1324# t1[o][v]{u} X t1_eqns[o][v]{u}");
102
blas->solve("t2_eqns[oo][vv]{u} += #2314# - t1[o][v]{u} X t1_eqns[o][v]{u}");
103
blas->solve("t2_eqns[oo][vv]{u} += #1423# - t1[o][v]{u} X t1_eqns[o][v]{u}");
104
blas->solve("t2_eqns[oo][vv]{u} += #2413# t1[o][v]{u} X t1_eqns[o][v]{u}");
105
// (c) Subtract (term from c) from the T2 equations
106
for(int n=0;n<moinfo->get_ref_size("u");n++){
107
int ref = moinfo->get_ref_number("u",n);
108
string neg_shift = to_string(-current_energy+Heff[ref][ref]);
109
string shift = to_string(current_energy-Heff[ref][ref]);
110
string n_str = to_string(ref);
111
blas->solve("t2_eqns[oo][vv]{" + n_str + "} += #1324# " + neg_shift + " t1[o][v]{" + n_str + "} X t1[o][v]{" + n_str + "}");
112
blas->solve("t2_eqns[oo][vv]{" + n_str + "} += #2314# " + shift + " t1[o][v]{" + n_str + "} X t1[o][v]{" + n_str + "}");
116
// (b) Add PijPab (term from a) to the T2 equations
117
blas->solve("t2_eqns[oO][vV]{u} += #1324# t1[o][v]{u} X t1_eqns[O][V]{u}");
118
blas->solve("t2_eqns[oO][vV]{u} += #2413# t1[O][V]{u} X t1_eqns[o][v]{u}");
119
// (c) Subtract (term from c) from the T2 equations
120
for(int n=0;n<moinfo->get_ref_size("u");n++){
121
int ref = moinfo->get_ref_number("u",n);
122
string n_str = to_string(ref);
123
string neg_shift = to_string(-current_energy+Heff[ref][ref]);
124
blas->solve("t2_eqns[oO][vV]{" + n_str + "} += #1324# " + neg_shift + " t1[o][v]{" + n_str + "} X t1[O][V]{" + n_str + "}");
128
// (b) Add PijPab (term from a) to the T2 equations
129
blas->solve("t2_eqns[OO][VV]{u} += #1324# t1[O][V]{u} X t1_eqns[O][V]{u}");
130
blas->solve("t2_eqns[OO][VV]{u} += #2314# - t1[O][V]{u} X t1_eqns[O][V]{u}");
131
blas->solve("t2_eqns[OO][VV]{u} += #1423# - t1[O][V]{u} X t1_eqns[O][V]{u}");
132
blas->solve("t2_eqns[OO][VV]{u} += #2413# t1[O][V]{u} X t1_eqns[O][V]{u}");
133
// (c) Subtract (term from c) from the T2 equations
134
for(int n=0;n<moinfo->get_nunique();n++){
135
int ref = moinfo->get_ref_number("u",n);
136
string neg_shift = to_string(-current_energy+Heff[ref][ref]);
137
string shift = to_string(current_energy-Heff[ref][ref]);
138
string n_str = to_string(ref);
139
blas->solve("t2_eqns[OO][VV]{" + n_str + "} += #1324# " + neg_shift + " t1[O][V]{" + n_str + "} X t1[O][V]{" + n_str + "}");
140
blas->solve("t2_eqns[OO][VV]{" + n_str + "} += #2314# " + shift + " t1[O][V]{" + n_str + "} X t1[O][V]{" + n_str + "}");
143
blas->solve("t2_delta[oo][vv]{u} = t2_eqns[oo][vv]{u} / d'2[oo][vv]{u} - t2[oo][vv]{u}");
144
blas->solve("t2_delta[oO][vV]{u} = t2_eqns[oO][vV]{u} / d'2[oO][vV]{u} - t2[oO][vV]{u}");
145
blas->solve("t2_delta[OO][VV]{u} = t2_eqns[OO][VV]{u} / d'2[OO][VV]{u} - t2[OO][VV]{u}");
147
blas->solve("t2[oo][vv]{u} = t2_eqns[oo][vv]{u} / d'2[oo][vv]{u}");
148
blas->solve("t2[oO][vV]{u} = t2_eqns[oO][vV]{u} / d'2[oO][vV]{u}");
149
blas->solve("t2[OO][VV]{u} = t2_eqns[OO][VV]{u} / d'2[OO][VV]{u}");
152
blas->print("t2_eqns[oo][vv]{u}");
153
blas->print("t2[oo][vv]{u}");
154
blas->print("t2_eqns[oO][vV]{u}");
155
blas->print("t2[oO][vV]{u}");
156
blas->print("t2_eqns[OO][VV]{u}");
157
blas->print("t2[OO][VV]{u}");
161
}} /* End Namespaces */