51template <
typename _ScalarSQOneElectronOperator,
typename _ScalarSQTwoElectronOperator>
53 public BasisTransformable<SQHamiltonian<_ScalarSQOneElectronOperator, _ScalarSQTwoElectronOperator>>,
54 public JacobiRotatable<SQHamiltonian<_ScalarSQOneElectronOperator, _ScalarSQTwoElectronOperator>> {
63 static_assert(std::is_same<typename ScalarSQOneElectronOperator::SpinorTag, typename ScalarSQTwoElectronOperator::SpinorTag>::value,
"The spinor tags of the one- and two-electron operators do not match.");
66 using SpinorTag =
typename ScalarSQOneElectronOperator::SpinorTag;
69 static_assert(std::is_same<typename ScalarSQOneElectronOperator::Scalar, typename ScalarSQTwoElectronOperator::Scalar>::value,
"The scalar type of the one- and two-electron parameters/matrix elements do not match.");
72 using Scalar =
typename ScalarSQOneElectronOperator::Scalar;
98 std::vector<ScalarSQOneElectronOperator> h_contributions;
101 std::vector<ScalarSQTwoElectronOperator> g_contributions;
115 SQHamiltonian(
const std::vector<ScalarSQOneElectronOperator>& h_contributions,
const std::vector<ScalarSQTwoElectronOperator>& g_contributions) :
116 h_contributions {h_contributions},
117 g_contributions {g_contributions} {
120 const std::invalid_argument dimension_error {
"SQHamiltonian::SQHamiltonian(const std::vector<ScalarSQOneElectronOperator<Scalar>& h_contributions, const std::vector<ScalarSQTwoElectronOperator<Scalar>& g_contributions: The dimensions of the contributing operators are incompatible"};
122 const auto dim = h_contributions[0].numberOfOrbitals();
123 for (
const auto& h : this->h_contributions) {
124 if (h.numberOfOrbitals() != dim) {
125 throw dimension_error;
129 for (
const auto& g : this->g_contributions) {
130 if (g.numberOfOrbitals() != dim) {
131 throw dimension_error;
137 this->h = std::accumulate(h_contributions.begin(), h_contributions.end(), ScalarSQOneElectronOperator::Zero(dim));
138 this->g = std::accumulate(g_contributions.begin(), g_contributions.end(), ScalarSQTwoElectronOperator::Zero(dim));
150 std::vector<ScalarSQTwoElectronOperator> {g}) {}
166 template <
typename Z1 = Scalar,
typename Z2 = SpinorTag>
169 const auto h = hubbard_hamiltonian.
core();
183 template <
typename Z = SpinorTag>
189 return Self {h_u, g_u};
202 template <
typename Z = Scalar>
205 const auto h = ScalarSQOneElectronOperator::Random(dim);
206 const auto g = ScalarSQTwoElectronOperator::Random(dim);
221 template <
typename Z1 = Scalar,
typename Z2 = SpinorTag>
224 std::ifstream input_file_stream =
validateAndOpen(fcidump_filename,
"FCIDUMP");
230 std::string start_line;
231 std::getline(input_file_stream, start_line);
232 std::stringstream linestream {start_line};
237 while (linestream >> iter) {
245 throw std::invalid_argument(
"SQHamiltonian::FromFCIDUMP(std::string): The .FCIDUMP-file is invalid: could not read a number of orbitals.");
254 for (
size_t counter = 0; counter < 3; counter++) {
255 std::getline(input_file_stream, start_line);
264 while (std::getline(input_file_stream, line)) {
265 std::istringstream iss {line};
270 iss >>
x >> i >> a >> j >> b;
273 if ((a == 0) && (j == 0) && (b == 0)) {
277 else if ((j == 0) && (b == 0)) {
287 else if ((i > 0) && (a > 0) && (j > 0) && (b > 0)) {
328 const std::vector<ScalarSQOneElectronOperator>&
coreContributions()
const {
return this->h_contributions; }
379 template <
typename Z = SpinorTag>
382 const auto& g_total_par = this->
twoElectron().parameters();
385 double localization_index = 0.0;
387 localization_index += g_total_par(i, i, i, i);
390 return localization_index;
401 template <
typename Z = SpinorTag>
404 return this->
core() + this->
twoElectron().effectiveOneElectronPartition();
419 return this->
core().calculateExpectationValue(D)() + this->
twoElectron().calculateExpectationValue(d)();
433 template <
typename Z = SpinorTag>
437 return this->
core().calculateFockianMatrix(D, d)() + this->
twoElectron().calculateFockianMatrix(D, d)();
449 template <
typename Z = SpinorTag>
453 return this->
core().calculateSuperFockianMatrix(D, d)().
Eigen() + this->
twoElectron().calculateSuperFockianMatrix(D, d)().
Eigen();
464 template <
typename Z = SpinorTag>
467 const auto& h_par = this->
core().parameters();
468 const auto& g_par = this->
twoElectron().parameters();
474 for (
const auto& p : orbital_space.
indices()) {
475 for (
const auto& q : orbital_space.
indices()) {
478 F_par(p, q) += g_par(p, q, i, i) - g_par(p, i, i, q);
494 template <
typename Z = SpinorTag>
496 const auto& h_par = this->
core().parameters();
497 const auto& g_par = this->
twoElectron().parameters();
504 for (
const auto& p : orbital_space.
indices()) {
505 for (
const auto& q : orbital_space.
indices()) {
508 F_par(p, q) += 2 * g_par(p, q, i, i) - g_par(p, i, i, q);
533 for (
auto& h : result.coreContributions()) {
537 for (
auto& g : result.twoElectronContributions()) {
542 result.core().transform(T);
543 result.twoElectron().transform(T);
572 for (
auto& h : result.coreContributions()) {
573 h.
rotate(jacobi_rotation);
576 for (
auto& g : result.twoElectronContributions()) {
577 g.rotate(jacobi_rotation);
581 result.core().rotate(jacobi_rotation);
582 result.twoElectron().rotate(jacobi_rotation);
601 this->h_contributions.push_back(sq_one_op);
602 this->h += sq_one_op;
654 this->g_contributions.push_back(sq_two_op);
655 this->g += sq_two_op;
705template <
typename ScalarSQOneElectronOperator,
typename ScalarSQTwoElectronOperator>
726template <
typename ScalarSQOneElectronOperator,
typename ScalarSQTwoElectronOperator>
741template <
typename ScalarSQOneElectronOperator,
typename ScalarSQTwoElectronOperator>
755template <
typename Scalar>
760template <
typename Scalar>
765template <
typename Scalar>
Definition: GSQTwoElectronOperator.hpp:43
Definition: HubbardHamiltonian.hpp:36
enable_if_t< std::is_same< Z, double >::value, ScalarRSQTwoElectronOperator< double > > twoElectron() const
Definition: HubbardHamiltonian.hpp:189
enable_if_t< std::is_same< Z, double >::value, ScalarRSQOneElectronOperator< double > > core() const
Definition: HubbardHamiltonian.hpp:164
Definition: JacobiRotatable.hpp:50
Definition: OrbitalSpace.hpp:40
const std::vector< size_t > & indices() const
Definition: OrbitalSpace.hpp:150
Definition: RSQOneElectronOperator.hpp:42
Definition: RSQTwoElectronOperator.hpp:43
Definition: SQHamiltonian.hpp:54
SQHamiltonian< ScalarSQOneElectronOperator, ScalarSQTwoElectronOperator > Self
Definition: SQHamiltonian.hpp:75
typename ScalarSQOneElectronOperator::SpinorTag SpinorTag
Definition: SQHamiltonian.hpp:66
static enable_if_t< std::is_same< Z, double >::value, Self > Random(const size_t dim)
Definition: SQHamiltonian.hpp:203
const std::vector< ScalarSQTwoElectronOperator > & twoElectronContributions() const
Definition: SQHamiltonian.hpp:348
enable_if_t< std::is_same< Z, GeneralSpinorTag >::value, ScalarSQOneElectronOperator > calculateInactiveFockian(const OrbitalSpace orbital_space) const
Definition: SQHamiltonian.hpp:465
enable_if_t< std::is_same< Z, RestrictedSpinOrbitalTag >::value, ScalarSQOneElectronOperator > calculateInactiveFockian(const OrbitalSpace orbital_space) const
Definition: SQHamiltonian.hpp:495
Scalar calculateExpectationValue(const OneDM &D, const TwoDM &d) const
Definition: SQHamiltonian.hpp:416
enable_if_t< std::is_same< Z, RestrictedSpinOrbitalTag >::value||std::is_same< Z, GeneralSpinorTag >::value, double > calculateEdmistonRuedenbergLocalizationIndex(const OrbitalSpace orbital_space) const
Definition: SQHamiltonian.hpp:380
const ScalarSQTwoElectronOperator & twoElectron() const
Definition: SQHamiltonian.hpp:338
Self & operator+=(const ScalarSQTwoElectronOperator &sq_two_op)
Definition: SQHamiltonian.hpp:651
ScalarSQTwoElectronOperator & twoElectron()
Definition: SQHamiltonian.hpp:343
static enable_if_t< std::is_same< Z, UnrestrictedSpinorTag >::value, SQHamiltonian< ScalarSQOneElectronOperator, ScalarSQTwoElectronOperator > > FromRestricted(const SQHamiltonian< ScalarRSQOneElectronOperator< Scalar >, ScalarRSQTwoElectronOperator< Scalar > > &r_hamiltonian)
Definition: SQHamiltonian.hpp:184
Self & operator-=(const ScalarSQTwoElectronOperator &sq_two_op)
Definition: SQHamiltonian.hpp:681
const std::vector< ScalarSQOneElectronOperator > & coreContributions() const
Definition: SQHamiltonian.hpp:328
typename OperatorTraits< ScalarSQOneElectronOperator >::OneDM OneDM
Definition: SQHamiltonian.hpp:78
Self transformed(const Transformation &T) const override
Definition: SQHamiltonian.hpp:528
_ScalarSQOneElectronOperator ScalarSQOneElectronOperator
Definition: SQHamiltonian.hpp:57
static enable_if_t< std::is_same< Z1, double >::value &&std::is_same< Z2, RestrictedSpinorTag >::value, SQHamiltonian< ScalarSQOneElectronOperator, ScalarSQTwoElectronOperator > > FromHubbard(const HubbardHamiltonian< double > &hubbard_hamiltonian)
Definition: SQHamiltonian.hpp:167
ScalarSQOneElectronOperator & core()
Definition: SQHamiltonian.hpp:323
const ScalarSQOneElectronOperator & core() const
Definition: SQHamiltonian.hpp:318
enable_if_t< std::is_same< Z, RestrictedSpinOrbitalTag >::value||std::is_same< Z, GeneralSpinorTag >::value, SquareMatrix< Scalar > > calculateFockianMatrix(const OneDM &D, const TwoDM &d) const
Definition: SQHamiltonian.hpp:434
typename ScalarSQOneElectronOperator::Scalar Scalar
Definition: SQHamiltonian.hpp:72
std::vector< ScalarSQOneElectronOperator > & coreContributions()
Definition: SQHamiltonian.hpp:333
typename JacobiRotatableTraits< ScalarSQOneElectronOperator >::JacobiRotationType JacobiRotationType
Definition: SQHamiltonian.hpp:87
enable_if_t< std::is_same< Z, RestrictedSpinOrbitalTag >::value||std::is_same< Z, GeneralSpinorTag >::value, ScalarSQOneElectronOperator > calculateEffectiveOneElectronIntegrals() const
Definition: SQHamiltonian.hpp:402
friend Self operator-(Self lhs, const ScalarSQTwoElectronOperator &rhs)
Definition: SQHamiltonian.hpp:691
enable_if_t< std::is_same< Z, RestrictedSpinOrbitalTag >::value||std::is_same< Z, GeneralSpinorTag >::value, SquareRankFourTensor< Scalar > > calculateSuperFockianMatrix(const OneDM &D, const TwoDM &d) const
Definition: SQHamiltonian.hpp:450
friend Self operator+(const ScalarSQOneElectronOperator &lhs, Self rhs)
Definition: SQHamiltonian.hpp:620
size_t numberOfOrbitals() const
Definition: SQHamiltonian.hpp:363
friend Self operator+(Self lhs, const ScalarSQOneElectronOperator &rhs)
Definition: SQHamiltonian.hpp:611
Self & operator+=(const ScalarSQOneElectronOperator &sq_one_op)
Definition: SQHamiltonian.hpp:598
typename OperatorTraits< ScalarSQOneElectronOperator >::Transformation Transformation
Definition: SQHamiltonian.hpp:84
friend Self operator-(Self lhs, const ScalarSQOneElectronOperator &rhs)
Definition: SQHamiltonian.hpp:638
std::vector< ScalarSQTwoElectronOperator > & twoElectronContributions()
Definition: SQHamiltonian.hpp:353
Self rotated(const JacobiRotationType &jacobi_rotation) const override
Definition: SQHamiltonian.hpp:567
friend Self operator+(Self lhs, const ScalarSQTwoElectronOperator &rhs)
Definition: SQHamiltonian.hpp:664
SQHamiltonian(const std::vector< ScalarSQOneElectronOperator > &h_contributions, const std::vector< ScalarSQTwoElectronOperator > &g_contributions)
Definition: SQHamiltonian.hpp:115
_ScalarSQTwoElectronOperator ScalarSQTwoElectronOperator
Definition: SQHamiltonian.hpp:60
friend Self operator+(const ScalarSQTwoElectronOperator &lhs, Self rhs)
Definition: SQHamiltonian.hpp:673
static enable_if_t< std::is_same< Z1, double >::value &&std::is_same< Z2, RestrictedSpinOrbitalTag >::value, SQHamiltonian< ScalarSQOneElectronOperator, ScalarSQTwoElectronOperator > > FromFCIDUMP(const std::string &fcidump_filename)
Definition: SQHamiltonian.hpp:222
typename OperatorTraits< ScalarSQOneElectronOperator >::TwoDM TwoDM
Definition: SQHamiltonian.hpp:81
SQHamiltonian(const ScalarSQOneElectronOperator &h, const ScalarSQTwoElectronOperator &g)
Definition: SQHamiltonian.hpp:148
Self & operator-=(const ScalarSQOneElectronOperator &sq_one_op)
Definition: SQHamiltonian.hpp:628
Definition: SquareMatrix.hpp:39
static Self Zero(const size_t dim)
Definition: SquareMatrix.hpp:289
Definition: SquareRankFourTensor.hpp:36
static USQOneElectronOperator< Scalar, Vectorizer > FromRestricted(const RSQOneElectronOperator< Scalar, Vectorizer > &f_restricted)
Definition: USQOneElectronOperator.hpp:151
Definition: USQTwoElectronOperator.hpp:50
static USQTwoElectronOperator< Scalar, Vectorizer > FromRestricted(const RSQTwoElectronOperator< Scalar, Vectorizer > &g_restricted)
Definition: USQTwoElectronOperator.hpp:171
Definition: EvaluableLinearCombination.hpp:330
Definition: BaseOneElectronIntegralBuffer.hpp:25
typename std::enable_if< B, T >::type enable_if_t
Definition: type_traits.hpp:37
@ x
Definition: CartesianDirection.hpp:28
std::ifstream validateAndOpen(const std::string &filename, const std::string &extension)
Definition: miscellaneous.cpp:266
typename JacobiRotatableTraits< ScalarSQOneElectronOperator >::JacobiRotationType JacobiRotationType
Definition: SQHamiltonian.hpp:745
Definition: JacobiRotatable.hpp:37
typename OperatorTraits< ScalarSQOneElectronOperator >::Transformation Transformation
Definition: SQHamiltonian.hpp:709
typename OperatorTraits< ScalarSQOneElectronOperator >::OneDM OneDM
Definition: SQHamiltonian.hpp:712
typename OperatorTraits< ScalarSQOneElectronOperator >::TwoDM TwoDM
Definition: SQHamiltonian.hpp:715
Definition: OperatorTraits.hpp:28