GQCP
Loading...
Searching...
No Matches
UHFSCFEnvironment.hpp
Go to the documentation of this file.
1// This file is part of GQCG-GQCP.
2//
3// Copyright (C) 2017-2020 the GQCG developers
4//
5// GQCG-GQCP is free software: you can redistribute it and/or modify
6// it under the terms of the GNU Lesser General Public License as published by
7// the Free Software Foundation, either version 3 of the License, or
8// (at your option) any later version.
9//
10// GQCG-GQCP is distributed in the hope that it will be useful,
11// but WITHOUT ANY WARRANTY; without even the implied warranty of
12// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13// GNU Lesser General Public License for more details.
14//
15// You should have received a copy of the GNU Lesser General Public License
16// along with GQCG-GQCP. If not, see <http://www.gnu.org/licenses/>.
17
18#pragma once
19
20
27#include "QCModel/HF/RHF.hpp"
28
29#include <Eigen/Dense>
30
31#include <deque>
32
33
34namespace GQCP {
35
36
44template <typename _Scalar>
46public:
47 using Scalar = _Scalar;
48
49
50public:
51 SpinResolved<size_t> N; // The number of alpha and beta electrons (the number of occupied alpha-spin-orbitals).
52
53 std::deque<Scalar> electronic_energies;
54
55 std::deque<SpinResolved<VectorX<Scalar>>> orbital_energies; // The alpha and beta MO energies.
56
57 ScalarUSQOneElectronOperator<Scalar> S; // The overlap operator (of the scalar (AO) basis).
58
59 std::deque<UTransformation<Scalar>> coefficient_matrices; // The alpha and beta coefficient matrices.
60
61 std::deque<SpinResolved1DM<Scalar>> density_matrices; // Expressed in the scalar (AO) basis.
62
63 std::deque<ScalarUSQOneElectronOperator<Scalar>> fock_matrices; // Expressed in the scalar (AO) basis.
64
65 std::deque<SpinResolved<VectorX<Scalar>>> error_vectors; // Expressed in the scalar (AO) basis, used when doing DIIS calculations: the real error matrices should be converted to column-major error vectors for the DIIS algorithm to be used correctly.
66
67 USQHamiltonian<Scalar> sq_hamiltonian; // The Hamiltonian expressed in the scalar (AO) basis.
68
69
70public:
71 /*
72 * CONSTRUCTORS
73 */
74
85 UHFSCFEnvironment(const size_t N_alpha, const size_t N_beta, const USQHamiltonian<Scalar>& sq_hamiltonian, const ScalarUSQOneElectronOperator<Scalar>& S, const UTransformation<Scalar>& C_initial) :
86 N {N_alpha, N_beta},
87 S {S},
89 coefficient_matrices {C_initial} {}
90
91
100 UHFSCFEnvironment(rhf_parameters.numberOfElectrons(Spin::alpha), rhf_parameters.numberOfElectrons(Spin::beta),
102 UTransformation<Scalar>::FromEqual(rhf_parameters.expansion().matrix())) {}
103
104
105 /*
106 * NAMED CONSTRUCTORS
107 */
108
120
121 const auto& H_core = sq_hamiltonian.core(); // In AO basis.
122
123 using MatrixType = Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>;
124 Eigen::GeneralizedSelfAdjointEigenSolver<MatrixType> generalized_eigensolver_a {H_core.alpha().parameters(), S.alpha().parameters()};
125 Eigen::GeneralizedSelfAdjointEigenSolver<MatrixType> generalized_eigensolver_b {H_core.beta().parameters(), S.beta().parameters()};
126 const UTransformationComponent<Scalar> C_initial_a {generalized_eigensolver_a.eigenvectors()};
127 const UTransformationComponent<Scalar> C_initial_b {generalized_eigensolver_b.eigenvectors()};
128 const UTransformation<Scalar> C_initial {C_initial_a, C_initial_b};
129
130 return UHFSCFEnvironment<Scalar>(N_alpha, N_beta, sq_hamiltonian, S, C_initial);
131 }
132
133
144 template <typename Z = Scalar>
146
147 // Set up the lambda function used to transform the coefficient matrix.
148 const auto transformation_function = [](SquareMatrix<complex> C_initial) {
149 // Define the complex constant used to transform the initial coefficient matrix.
150 const complex x {0, 0.1};
151
152 // Add/subtract the small complex value from the off-diagonal elements of the initial coefficient matrix.
153 for (size_t i = 0; i < C_initial.cols(); i++) {
154 C_initial(0, i) += x;
155 }
156 for (size_t j = 0; j < C_initial.rows(); j++) {
157 C_initial(j, 0) -= x;
158 }
159
160 // Return the updated coefficient matrix.
161 return C_initial;
162 };
163
164 return UHFSCFEnvironment<complex>::WithTransformedCoreGuess(N_alpha, N_beta, sq_hamiltonian, S, transformation_function);
165 }
166
167
179 template <typename Z = Scalar>
180 static UHFSCFEnvironment<Scalar> WithTransformedCoreGuess(const size_t N_alpha, const size_t N_beta, const USQHamiltonian<Scalar>& sq_hamiltonian, const ScalarUSQOneElectronOperator<Scalar>& S, const std::function<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>(const Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>&)>& transformation_function) {
181
182 const auto& H_core = sq_hamiltonian.core(); // In AO basis.
183
184 using MatrixType = Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>;
185 Eigen::GeneralizedSelfAdjointEigenSolver<MatrixType> generalized_eigensolver_a {H_core.alpha().parameters(), S.alpha().parameters()};
186 Eigen::GeneralizedSelfAdjointEigenSolver<MatrixType> generalized_eigensolver_b {H_core.beta().parameters(), S.beta().parameters()};
187 auto C_initial_a {generalized_eigensolver_a.eigenvectors()};
188 auto C_initial_b {generalized_eigensolver_b.eigenvectors()};
189
190 const UTransformation<Scalar> C_initial_complex {UTransformationComponent<Scalar> {transformation_function(C_initial_a)}, UTransformationComponent<Scalar> {transformation_function(C_initial_b)}};
191
192 return UHFSCFEnvironment<Scalar>(N_alpha, N_beta, sq_hamiltonian, S, C_initial_complex);
193 }
194};
195
196
197} // namespace GQCP
Definition: RHF.hpp:49
Definition: SQHamiltonian.hpp:54
Definition: SpinResolved.hpp:34
Definition: SquareMatrix.hpp:39
Definition: UHFSCFEnvironment.hpp:45
std::deque< ScalarUSQOneElectronOperator< Scalar > > fock_matrices
Definition: UHFSCFEnvironment.hpp:63
ScalarUSQOneElectronOperator< Scalar > S
Definition: UHFSCFEnvironment.hpp:57
static UHFSCFEnvironment< Scalar > WithCoreGuess(const size_t N_alpha, const size_t N_beta, const USQHamiltonian< Scalar > &sq_hamiltonian, const ScalarUSQOneElectronOperator< Scalar > &S)
Definition: UHFSCFEnvironment.hpp:119
std::deque< SpinResolved< VectorX< Scalar > > > orbital_energies
Definition: UHFSCFEnvironment.hpp:55
std::deque< SpinResolved1DM< Scalar > > density_matrices
Definition: UHFSCFEnvironment.hpp:61
std::deque< Scalar > electronic_energies
Definition: UHFSCFEnvironment.hpp:53
SpinResolved< size_t > N
Definition: UHFSCFEnvironment.hpp:51
static enable_if_t< std::is_same< Z, complex >::value, UHFSCFEnvironment< complex > > WithComplexlyTransformedCoreGuess(const size_t N_alpha, const size_t N_beta, const USQHamiltonian< Scalar > &sq_hamiltonian, const ScalarUSQOneElectronOperator< Scalar > &S)
Definition: UHFSCFEnvironment.hpp:145
UHFSCFEnvironment(const QCModel::RHF< Scalar > &rhf_parameters, const USQHamiltonian< Scalar > &sq_hamiltonian, const ScalarUSQOneElectronOperator< Scalar > &S)
Definition: UHFSCFEnvironment.hpp:99
std::deque< UTransformation< Scalar > > coefficient_matrices
Definition: UHFSCFEnvironment.hpp:59
std::deque< SpinResolved< VectorX< Scalar > > > error_vectors
Definition: UHFSCFEnvironment.hpp:65
static UHFSCFEnvironment< Scalar > WithTransformedCoreGuess(const size_t N_alpha, const size_t N_beta, const USQHamiltonian< Scalar > &sq_hamiltonian, const ScalarUSQOneElectronOperator< Scalar > &S, const std::function< Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic >(const Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > &)> &transformation_function)
Definition: UHFSCFEnvironment.hpp:180
USQHamiltonian< Scalar > sq_hamiltonian
Definition: UHFSCFEnvironment.hpp:67
UHFSCFEnvironment(const size_t N_alpha, const size_t N_beta, const USQHamiltonian< Scalar > &sq_hamiltonian, const ScalarUSQOneElectronOperator< Scalar > &S, const UTransformation< Scalar > &C_initial)
Definition: UHFSCFEnvironment.hpp:85
_Scalar Scalar
Definition: UHFSCFEnvironment.hpp:47
Definition: USQOneElectronOperator.hpp:48
Definition: UTransformationComponent.hpp:41
Definition: UTransformation.hpp:46
Definition: BaseOneElectronIntegralBuffer.hpp:25
typename std::enable_if< B, T >::type enable_if_t
Definition: type_traits.hpp:37
std::complex< double > complex
Definition: complex.hpp:31
@ x
Definition: CartesianDirection.hpp:28
Spin
Definition: Spin.hpp:27
@ beta
Definition: Spin.hpp:29
@ alpha
Definition: Spin.hpp:28