Skip to content

Commit 2b69fdb

Browse files
authored
correction to iteration procedure (#27)
1 parent e314c80 commit 2b69fdb

File tree

1 file changed

+22
-27
lines changed

1 file changed

+22
-27
lines changed

src/scf/driver/scf_loop.cpp

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,13 @@ using simde::type::electronic_hamiltonian;
4141
using simde::type::hamiltonian;
4242
using simde::type::op_base_type;
4343

44+
using density_t = simde::type::decomposable_e_density;
45+
using fock_pt = simde::FockOperator<density_t>;
46+
using density_pt = simde::aos_rho_e_aos<simde::type::cmos>;
47+
using v_nn_pt = simde::charge_charge_interaction;
48+
using fock_matrix_pt = simde::aos_f_e_aos;
49+
using s_pt = simde::aos_s_e_aos;
50+
4451
template<typename WfType>
4552
using egy_pt = simde::eval_braket<WfType, hamiltonian, WfType>;
4653

@@ -53,17 +60,6 @@ using pt = simde::Optimize<egy_pt<WfType>, WfType>;
5360
template<typename WfType>
5461
using update_pt = simde::UpdateGuess<WfType>;
5562

56-
using density_t = simde::type::decomposable_e_density;
57-
58-
using fock_pt = simde::FockOperator<density_t>;
59-
60-
using density_pt = simde::aos_rho_e_aos<simde::type::cmos>;
61-
62-
using v_nn_pt = simde::charge_charge_interaction;
63-
64-
using fock_matrix_pt = simde::aos_f_e_aos;
65-
using s_pt = simde::aos_s_e_aos;
66-
6763
struct GrabNuclear : chemist::qm_operator::OperatorVisitor {
6864
using V_nn_type = simde::type::V_nn_type;
6965

@@ -100,18 +96,21 @@ MODULE_RUN(SCFLoop) {
10096
using density_op_type = simde::type::rho_e<simde::type::cmos>;
10197
const auto&& [braket, psi0] = pt<wf_type>::unwrap_inputs(inputs);
10298
// TODO: Assert bra == ket == psi0
103-
const auto& H = braket.op();
104-
const auto& H_elec = H.electronic_hamiltonian();
105-
const auto& H_core = H_elec.core_hamiltonian();
106-
const auto& aos = psi0.orbitals().from_space();
99+
const auto& H = braket.op();
100+
const auto& H_elec = H.electronic_hamiltonian();
101+
const auto& H_core = H_elec.core_hamiltonian();
102+
const auto& aos = psi0.orbitals().from_space();
103+
const auto max_iter = inputs.at("max iterations").value<unsigned int>();
104+
const auto e_tol = inputs.at("energy tolerance").value<double>();
105+
const auto dp_tol = inputs.at("density tolerance").value<double>();
106+
const auto g_tol = inputs.at("gradient tolerance").value<double>();
107107

108108
auto& egy_mod = submods.at("Electronic energy");
109109
auto& density_mod = submods.at("Density matrix");
110110
auto& update_mod = submods.at("Guess update");
111111
auto& fock_mod = submods.at("One-electron Fock operator");
112112
auto& Fock_mod = submods.at("Fock operator");
113113
auto& V_nn_mod = submods.at("Charge-charge");
114-
115114
// TODO: should be split off into orbital gradient module
116115
auto& F_mod = submods.at("Fock matrix builder");
117116
auto& S_mod = submods.at("Overlap matrix builder");
@@ -152,24 +151,18 @@ MODULE_RUN(SCFLoop) {
152151
const auto& P = density_mod.run_as<density_pt>(P_mn);
153152
density_t rho_old(P, psi_old.orbitals());
154153

155-
const auto max_iter = inputs.at("max iterations").value<unsigned int>();
156-
const auto e_tol = inputs.at("energy tolerance").value<double>();
157-
const auto dp_tol = inputs.at("density tolerance").value<double>();
158-
const auto g_tol = inputs.at("gradient tolerance").value<double>();
159-
unsigned int iter = 0;
160-
161154
auto& logger = get_runtime().logger();
162155

156+
unsigned int iter = 0;
163157
while(iter < max_iter) {
164-
// Step 2: Old density is used to create the new Fock operator
158+
// Step 2: Old density is used to create the corresponding Fock operator
165159
// TODO: Make easier to go from many-electron to one-electron
166160
// TODO: template fock_pt on Hamiltonian type and only pass H_elec
167-
const auto& f_new = fock_mod.run_as<fock_pt>(H, rho_old);
168-
const auto& F_new = Fock_mod.run_as<fock_pt>(H, rho_old);
161+
const auto& f_old = fock_mod.run_as<fock_pt>(H, rho_old);
169162

170-
// Step 3: New Fock operator used to compute new wavefunction/density
163+
// Step 3: Fock operator used to compute new wavefunction/density
171164
const auto& psi_new =
172-
update_mod.run_as<update_pt<wf_type>>(f_new, psi_old);
165+
update_mod.run_as<update_pt<wf_type>>(f_old, psi_old);
173166

174167
density_op_type rho_hat_new(psi_new.orbitals(), psi_new.occupations());
175168
chemist::braket::BraKet P_mn_new(aos, rho_hat_new, aos);
@@ -180,6 +173,7 @@ MODULE_RUN(SCFLoop) {
180173
// Step 4: New electronic energy
181174
// Step 4a: New Fock operator to new electronic Hamiltonian
182175
// TODO: Should just be H_core + F;
176+
const auto& F_new = Fock_mod.run_as<fock_pt>(H, rho_new);
183177
electronic_hamiltonian H_new;
184178
for(std::size_t i = 0; i < H_core.size(); ++i)
185179
H_new.emplace_back(H_core.coefficient(i),
@@ -211,6 +205,7 @@ MODULE_RUN(SCFLoop) {
211205

212206
// Orbital gradient: FPS-SPF
213207
// TODO: module satisfying BraKet(aos, Commutator(F,P), aos)
208+
const auto& f_new = fock_mod.run_as<fock_pt>(H, rho_new);
214209
chemist::braket::BraKet F_mn(aos, f_new, aos);
215210
const auto& F_matrix = F_mod.run_as<fock_matrix_pt>(F_mn);
216211

0 commit comments

Comments
 (0)