GQCP
Loading...
Searching...
No Matches
GHFSCFEnvironment.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 ScalarGSQOneElectronOperator<Scalar> S; // The overlap operator (of both scalar (AO) bases), expressed in spin-blocked notation.
58
59 std::deque<GTransformation<Scalar>> coefficient_matrices;
60 std::deque<G1DM<Scalar>> density_matrices; // Expressed in the scalar (AO) basis.
61 std::deque<ScalarGSQOneElectronOperator<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 GSQHamiltonian<Scalar> sq_hamiltonian; // The Hamiltonian expressed in the scalar (AO) basis, resulting from a quantization using a GSpinorBasis.
65
66
67public:
68 /*
69 * CONSTRUCTORS
70 */
71
81 N {N},
82 S {S},
84 coefficient_matrices {C_initial} {}
85
86
87 /*
88 * NAMED CONSTRUCTORS
89 */
90
101
102 const auto& H_core = sq_hamiltonian.core().parameters(); // Spin-blocked, in AO basis.
103
104 using MatrixType = Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>;
105 Eigen::GeneralizedSelfAdjointEigenSolver<MatrixType> generalized_eigensolver {H_core, S.parameters()};
106 const GTransformation<Scalar> C_initial {generalized_eigensolver.eigenvectors()};
107
108 return GHFSCFEnvironment<Scalar>(N, sq_hamiltonian, S, C_initial);
109 }
110
120 template <typename Z = Scalar>
122
123 // Set up the lambda function used to transform the coefficient matrix.
124 const auto transformation_function = [](SquareMatrix<complex> C_initial) {
125 // Define the complex constant used to transform the initial coefficient matrix.
126 const complex x {0, 0.1};
127
128 // Add/subtract the small complex value from the off-diagonal elements of the initial coefficient matrix.
129 for (size_t i = 0; i < C_initial.cols(); i++) {
130 C_initial(0, i) += x;
131 }
132 for (size_t j = 0; j < C_initial.rows(); j++) {
133 C_initial(j, 0) -= x;
134 }
135
136 // Return the updated coefficient matrix.
137 return C_initial;
138 };
139
141 }
142
143
154 static GHFSCFEnvironment<Scalar> WithTransformedCoreGuess(const size_t N, const GSQHamiltonian<Scalar>& sq_hamiltonian, const ScalarGSQOneElectronOperator<Scalar>& S, const std::function<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>(const Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>&)>& transformation_function) {
155
156 const auto& H_core = sq_hamiltonian.core().parameters(); // Spin-blocked, in AO basis.
157
158 using MatrixType = Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>;
159 Eigen::GeneralizedSelfAdjointEigenSolver<MatrixType> generalized_eigensolver {H_core, S.parameters()};
160 auto C_initial {generalized_eigensolver.eigenvectors()};
161
162 const GTransformation<Scalar> C_initial_complex {transformation_function(C_initial)};
163
164 return GHFSCFEnvironment<Scalar>(N, sq_hamiltonian, S, C_initial_complex);
165 }
166};
167
168
169} // namespace GQCP
Definition: GHFSCFEnvironment.hpp:45
std::deque< GTransformation< Scalar > > coefficient_matrices
Definition: GHFSCFEnvironment.hpp:59
GSQHamiltonian< Scalar > sq_hamiltonian
Definition: GHFSCFEnvironment.hpp:64
ScalarGSQOneElectronOperator< Scalar > S
Definition: GHFSCFEnvironment.hpp:57
std::deque< G1DM< Scalar > > density_matrices
Definition: GHFSCFEnvironment.hpp:60
static enable_if_t< std::is_same< Z, complex >::value, GHFSCFEnvironment< complex > > WithComplexlyTransformedCoreGuess(const size_t N, const GSQHamiltonian< Scalar > &sq_hamiltonian, const ScalarGSQOneElectronOperator< Scalar > &S)
Definition: GHFSCFEnvironment.hpp:121
std::deque< VectorX< Scalar > > orbital_energies
Definition: GHFSCFEnvironment.hpp:55
size_t N
Definition: GHFSCFEnvironment.hpp:51
std::deque< Scalar > electronic_energies
Definition: GHFSCFEnvironment.hpp:53
std::deque< ScalarGSQOneElectronOperator< Scalar > > fock_matrices
Definition: GHFSCFEnvironment.hpp:61
_Scalar Scalar
Definition: GHFSCFEnvironment.hpp:47
GHFSCFEnvironment(const size_t N, const GSQHamiltonian< Scalar > &sq_hamiltonian, const ScalarGSQOneElectronOperator< Scalar > &S, const GTransformation< Scalar > &C_initial)
Definition: GHFSCFEnvironment.hpp:80
static GHFSCFEnvironment< Scalar > WithTransformedCoreGuess(const size_t N, const GSQHamiltonian< Scalar > &sq_hamiltonian, const ScalarGSQOneElectronOperator< Scalar > &S, const std::function< Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic >(const Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > &)> &transformation_function)
Definition: GHFSCFEnvironment.hpp:154
static GHFSCFEnvironment< Scalar > WithCoreGuess(const size_t N, const GSQHamiltonian< Scalar > &sq_hamiltonian, const ScalarGSQOneElectronOperator< Scalar > &S)
Definition: GHFSCFEnvironment.hpp:100
std::deque< VectorX< Scalar > > error_vectors
Definition: GHFSCFEnvironment.hpp:62
Definition: GSQOneElectronOperator.hpp:42
Definition: GTransformation.hpp:43
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