@@ -41,6 +41,13 @@ using simde::type::electronic_hamiltonian;
4141using simde::type::hamiltonian;
4242using 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+
4451template <typename WfType>
4552using egy_pt = simde::eval_braket<WfType, hamiltonian, WfType>;
4653
@@ -53,17 +60,6 @@ using pt = simde::Optimize<egy_pt<WfType>, WfType>;
5360template <typename WfType>
5461using 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-
6763struct 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