GQCP
Loading...
Searching...
No Matches
RHFSCFEnvironment.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
26#include "Utilities/aliases.hpp"
27#include "Utilities/complex.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 size_t N; // The total number of electrons.
52
53 std::deque<Scalar> electronic_energies;
54
55 std::deque<VectorX<Scalar>> orbital_energies;
56
57 ScalarRSQOneElectronOperator<Scalar> S; // The overlap matrix (of the scalar (AO) basis).
58
59 std::deque<RTransformation<Scalar>> coefficient_matrices;
60 std::deque<Orbital1DM<Scalar>> density_matrices; // Expressed in the scalar (AO) basis.
61 std::deque<ScalarRSQOneElectronOperator<Scalar>> fock_matrices; // Expressed in the scalar (AO) basis.
62 std::deque<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.
63
64 RSQHamiltonian<Scalar> sq_hamiltonian; // The Hamiltonian expressed in the scalar (AO) basis.
65
66
67public:
68 /*
69 * CONSTRUCTORS
70 */
71
81 N {N},
82 S {S},
84 coefficient_matrices {C_initial} {
85
86 if (this->N % 2 != 0) { // If the total number of electrons is odd.
87 throw std::invalid_argument("RHFSCFEnvironment::RHFSCFEnvironment(const size_t, const RSQHamiltonian<Scalar>&, const SquareMatrix<Scalar>&, const RTransformation<Scalar>&): You have given an odd number of electrons.");
88 }
89 }
90
91
92 /*
93 * NAMED CONSTRUCTORS
94 */
95
106
107 const auto& H_core = sq_hamiltonian.core().parameters(); // In AO basis.
108
109 using MatrixType = Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>;
110 Eigen::GeneralizedSelfAdjointEigenSolver<MatrixType> generalized_eigensolver {H_core, S.parameters()};
111 const RTransformation<Scalar> C_initial {generalized_eigensolver.eigenvectors()};
112
113 return RHFSCFEnvironment<Scalar>(N, sq_hamiltonian, S, C_initial);
114 }
115
116
126 template <typename Z = Scalar>
128
129 // Set up the lambda function used to transform the coefficient matrix.
130 const auto transformation_function = [](SquareMatrix<complex> C_initial) {
131 // Define the complex constant used to transform the initial coefficient matrix.
132 const complex x {0, 0.1};
133
134 // Add/subtract the small complex value from the off-diagonal elements of the initial coefficient matrix.
135 for (size_t i = 0; i < C_initial.cols(); i++) {
136 C_initial(0, i) += x;
137 }
138 for (size_t j = 0; j < C_initial.rows(); j++) {
139 C_initial(j, 0) -= x;
140 }
141
142 // Return the updated coefficient matrix.
143 return C_initial;
144 };
145
147 }
148
149
160 template <typename Z = Scalar>
161 static RHFSCFEnvironment<Scalar> WithTransformedCoreGuess(const size_t N, const RSQHamiltonian<Scalar>& sq_hamiltonian, const ScalarRSQOneElectronOperator<Scalar>& S, const std::function<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>(const Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>&)>& transformation_function) {
162
163 const auto& H_core = sq_hamiltonian.core().parameters(); // In AO basis.
164
165 using MatrixType = Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>;
166 Eigen::GeneralizedSelfAdjointEigenSolver<MatrixType> generalized_eigensolver {H_core, S.parameters()};
167 auto C_initial {generalized_eigensolver.eigenvectors()};
168
169 const RTransformation<Scalar> C_initial_complex {transformation_function(C_initial)};
170
171 return RHFSCFEnvironment<Scalar>(N, sq_hamiltonian, S, C_initial_complex);
172 }
173};
174
175
176} // namespace GQCP
Definition: RHFSCFEnvironment.hpp:45
std::deque< Orbital1DM< Scalar > > density_matrices
Definition: RHFSCFEnvironment.hpp:60
std::deque< VectorX< Scalar > > error_vectors
Definition: RHFSCFEnvironment.hpp:62
static RHFSCFEnvironment< Scalar > WithTransformedCoreGuess(const size_t N, const RSQHamiltonian< Scalar > &sq_hamiltonian, const ScalarRSQOneElectronOperator< Scalar > &S, const std::function< Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic >(const Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > &)> &transformation_function)
Definition: RHFSCFEnvironment.hpp:161
RHFSCFEnvironment(const size_t N, const RSQHamiltonian< Scalar > &sq_hamiltonian, const ScalarRSQOneElectronOperator< Scalar > &S, const RTransformation< Scalar > &C_initial)
Definition: RHFSCFEnvironment.hpp:80
static enable_if_t< std::is_same< Z, complex >::value, RHFSCFEnvironment< complex > > WithComplexlyTransformedCoreGuess(const size_t N, const RSQHamiltonian< Scalar > &sq_hamiltonian, const ScalarRSQOneElectronOperator< Scalar > &S)
Definition: RHFSCFEnvironment.hpp:127
_Scalar Scalar
Definition: RHFSCFEnvironment.hpp:47
std::deque< ScalarRSQOneElectronOperator< Scalar > > fock_matrices
Definition: RHFSCFEnvironment.hpp:61
std::deque< RTransformation< Scalar > > coefficient_matrices
Definition: RHFSCFEnvironment.hpp:59
static RHFSCFEnvironment< Scalar > WithCoreGuess(const size_t N, const RSQHamiltonian< Scalar > &sq_hamiltonian, const ScalarRSQOneElectronOperator< Scalar > &S)
Definition: RHFSCFEnvironment.hpp:105
std::deque< VectorX< Scalar > > orbital_energies
Definition: RHFSCFEnvironment.hpp:55
size_t N
Definition: RHFSCFEnvironment.hpp:51
ScalarRSQOneElectronOperator< Scalar > S
Definition: RHFSCFEnvironment.hpp:57
std::deque< Scalar > electronic_energies
Definition: RHFSCFEnvironment.hpp:53
RSQHamiltonian< Scalar > sq_hamiltonian
Definition: RHFSCFEnvironment.hpp:64
Definition: RSQOneElectronOperator.hpp:42
Definition: RTransformation.hpp:41
Definition: SQHamiltonian.hpp:54
Definition: SquareMatrix.hpp:39
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