GQCP
Loading...
Searching...
No Matches
USpinOrbitalBasis.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
44
45
46namespace GQCP {
47
48
56template <typename _ExpansionScalar, typename _Shell>
58 public SpinResolvedBase<USpinOrbitalBasisComponent<_ExpansionScalar, _Shell>, USpinOrbitalBasis<_ExpansionScalar, _Shell>>,
59 public SpinResolvedBasisTransformable<USpinOrbitalBasis<_ExpansionScalar, _Shell>>,
60 public SpinResolvedJacobiRotatable<USpinOrbitalBasis<_ExpansionScalar, _Shell>> {
61public:
62 // The scalar type used to represent an expansion coefficient of the spinors in the underlying scalar orbitals: real or complex.
63 using ExpansionScalar = _ExpansionScalar;
64
65 // The type of shell the underlying scalar bases contain.
66 using Shell = _Shell;
67
68 // The type of 'this'.
70
71 // The type that is used for representing the primitive for a basis function of this spin-orbital basis' underlying AO basis.
72 using Primitive = typename Shell::Primitive;
73
74 // The type that is used for representing the underlying basis functions of this spin-orbital basis.
75 using BasisFunction = typename Shell::BasisFunction;
76
77 // The type component this spin resolved object is made of.
79
80
81public:
82 /*
83 * MARK: Constructors
84 */
85
86 // Inherit `SpinResolvedBase`'s constructors.
88
89
97 USpinOrbitalBasis(const ScalarBasis<Shell>& alpha_scalar_basis, const ScalarBasis<Shell>& beta_scalar_basis, const UTransformation<ExpansionScalar>& C) :
99 USpinOrbitalBasisComponent<ExpansionScalar, Shell> {beta_scalar_basis, C.beta()}) {
100
101 // Check if the dimensions of the given objects are compatible.
102 if (C.alpha().numberOfOrbitals() != alpha_scalar_basis.numberOfBasisFunctions()) {
103 throw std::invalid_argument("USpinOrbitalBasis(const ScalarBasis<Shell>&, const ScalarBasis<Shell>&, const UTransformation<ExpansionScalar>&): The given dimensions of the scalar basis and coefficient matrix for the alpha spin-orbitals are incompatible.");
104 }
105
106 if (C.beta().numberOfOrbitals() != beta_scalar_basis.numberOfBasisFunctions()) {
107 throw std::invalid_argument("USpinOrbitalBasis(const ScalarBasis<Shell>&, const ScalarBasis<Shell>&, const UTransformation<ExpansionScalar>&): The given dimensions of the scalar basis and coefficient matrix for the beta spin-orbitals are incompatible.");
108 }
109 }
110
111
119 USpinOrbitalBasis(scalar_basis, scalar_basis, UTransformation<ExpansionScalar>::FromEqual(C)) {}
120
121
128 USpinOrbitalBasis(const ScalarBasis<Shell>& alpha_scalar_basis, const ScalarBasis<Shell>& beta_scalar_basis) :
129 USpinOrbitalBasis(alpha_scalar_basis, beta_scalar_basis,
131 UTransformationComponent<ExpansionScalar>::Identity(alpha_scalar_basis.numberOfBasisFunctions()),
132 UTransformationComponent<ExpansionScalar>::Identity(beta_scalar_basis.numberOfBasisFunctions()))) {}
133
134
141 USpinOrbitalBasis(scalar_basis, scalar_basis) {}
142
143
152 USpinOrbitalBasis(const NuclearFramework& nuclear_framework, const std::string& basisset_name) :
153 USpinOrbitalBasis(ScalarBasis<Shell>(nuclear_framework, basisset_name)) {}
154
155
164 USpinOrbitalBasis(const Molecule& molecule, const std::string& basisset_name) :
165 USpinOrbitalBasis(ScalarBasis<Shell>(molecule.nuclearFramework(), basisset_name)) {}
166
167
177 USpinOrbitalBasis(const NuclearFramework& nuclear_framework, const std::string& basisset_name_alpha, const std::string& basisset_name_beta) :
178 USpinOrbitalBasis(ScalarBasis<Shell>(nuclear_framework, basisset_name_alpha),
179 ScalarBasis<Shell>(nuclear_framework, basisset_name_beta)) {}
180
181
191 USpinOrbitalBasis(const Molecule& molecule, const std::string& basisset_name_alpha, const std::string& basisset_name_beta) :
192 USpinOrbitalBasis(ScalarBasis<Shell>(molecule.nuclearFramework(), basisset_name_alpha),
193 ScalarBasis<Shell>(molecule.nuclearFramework(), basisset_name_beta)) {}
194
195
205 template <typename Z = Shell>
206 USpinOrbitalBasis(const Molecule& molecule, const std::string& basisset_name, const HomogeneousMagneticField& B,
207 typename std::enable_if<std::is_same<Z, LondonGTOShell>::value>::type* = 0) :
208 USpinOrbitalBasis(ScalarBasis<Shell>(molecule.nuclearFramework(), basisset_name, B)) {}
209
210
211 /*
212 * MARK: Named constructors
213 */
214
223
224 const auto& scalar_basis = r_spinor_basis.scalarBasis();
225 const auto& C = r_spinor_basis.expansion();
226
228 }
229
230
231 /*
232 * MARK: General information
233 */
234
239 return UTransformation<ExpansionScalar> {this->alpha().expansion(), this->beta().expansion()};
240 }
241
242
246 size_t numberOfSpinors() const {
247
248 const auto K_alpha = this->alpha().simpleDimension();
249 const auto K_beta = this->beta().simpleDimension();
250
251 return K_alpha + K_beta;
252 }
253
254
258 size_t numberOfSpinOrbitals() const { return this->numberOfSpinors(); }
259
260
261 /*
262 * MARK: Orthonormality
263 */
264
272 bool isOrthonormal(const double precision = 1.0e-08) const { return this->alpha().isOrthonormal(precision) && this->beta().isOrthonormal(precision); }
273
274
279
280 const auto T_a = this->alpha().lowdinOrthonormalization();
281 const auto T_b = this->beta().lowdinOrthonormalization();
282
283 return UTransformation<ExpansionScalar> {T_a, T_b};
284 }
285
286
291 this->alpha().lowdinOrthonormalize();
292 this->beta().lowdinOrthonormalize();
293 }
294
295
296 /*
297 * MARK: Quantization of first-quantized operators (GTOShell)
298 */
299
308
311
312 // We can use the quantization of the overlap operator for the quantization of S_z.
313 const auto S_a = this->alpha().overlap(); // In the current orbital basis.
314 const auto S_b = this->beta().overlap(); // In the current orbital basis.
315
316 const auto S_z_a = 0.5 * S_a;
317 const auto S_z_b = -0.5 * S_b;
318
319 return ResultOperator {S_z_a, S_z_b};
320 }
321
322
331
332 // Dimension.
333 const auto dim = this->numberOfSpinOrbitals() / 2;
334
335 // We can use the quantization of the overlap operator for the quantization of S_z.
336 const auto S_a = this->alpha().overlap(); // In the current orbital basis.
337 const auto S_b = this->beta().overlap(); // In the current orbital basis.
338
339 // We also need S_minus_plus for the one electron contribution.
340 const auto S_mp_a_parameters = SquareMatrix<ExpansionScalar>::Zero(dim);
341 const auto S_mp_a = ScalarUSQOneElectronOperatorComponent<ExpansionScalar>(S_mp_a_parameters);
342 const auto S_mp_b = this->alpha().overlap();
343
344 // We need Sz^2 as well.
345 const auto S_z2_a = 0.25 * S_a;
346 const auto S_z2_b = -0.25 * S_b;
347
348 // Create the one electron component.
349 const ScalarUSQOneElectronOperator<ExpansionScalar> S_mp {S_mp_a, S_mp_b};
350 const ScalarUSQOneElectronOperator<ExpansionScalar> S_z2 {S_z2_a, S_z2_b};
351 const auto S_z = this->quantize(ElectronicSpin_zOperator());
352
353 const auto one_electron = S_z + S_mp + S_z2;
354
355 // Create the two electron component.
358
361
362 for (size_t p = 0; p < dim; p++) {
363 for (size_t q = 0; q < dim; q++) {
364 for (size_t r = 0; r < dim; r++) {
365 for (size_t s = 0; s < dim; s++) {
366 g_ab_par(p, q, r, s) = -1.0 * S_a.parameters()(p, r) * S_b.parameters()(q, s);
367 g_ba_par(p, q, r, s) = -1.0 * S_b.parameters()(p, r) * S_a.parameters()(q, s);
368 }
369 }
370 }
371 }
372
375
376 const auto two_electron = ScalarUSQTwoElectronOperator<ExpansionScalar>(g_aa, g_ab, g_ba, g_bb);
377
378 return ScalarUSQOneElectronOperatorProduct<ExpansionScalar> {one_electron, two_electron};
379 }
380
381
389 template <typename Z = Shell>
391
392 const auto& B = fq_op.magneticField().strength();
393 if ((std::abs(B(CartesianDirection::x)) > 1.0e-12) || (std::abs(B(CartesianDirection::y)) > 1.0e-12)) {
394 throw std::invalid_argument("USpinOrbitalBasis::quantize(const FQMolecularPauliHamiltonian&): Only the spin Zeeman operator for a magnetic field along the z-axis can be quantized in an USpinOrbitalBasis.");
395 }
396
398 }
399
400
407
408
416 template <typename Z = Shell>
418
420 using ResultOperator = ScalarUSQTwoElectronOperator<ResultScalar>;
421
422 // Determine the matrix representation of the four spin-components of the second-quantized Coulomb operator.
423 const auto g_aa_par = IntegralCalculator::calculateLibintIntegrals(coulomb_op, this->alpha().scalarBasis(), this->alpha().scalarBasis()); // 'par' for 'parameters'
424 const auto g_ab_par = IntegralCalculator::calculateLibintIntegrals(coulomb_op, this->alpha().scalarBasis(), this->beta().scalarBasis()); // 'par' for 'parameters'
425 const auto g_ba_par = IntegralCalculator::calculateLibintIntegrals(coulomb_op, this->beta().scalarBasis(), this->alpha().scalarBasis()); // 'par' for 'parameters'
426 const auto g_bb_par = IntegralCalculator::calculateLibintIntegrals(coulomb_op, this->beta().scalarBasis(), this->beta().scalarBasis()); // 'par' for 'parameters'
427
428 auto g_aa = SquareRankFourTensor<ResultScalar>::Zero(g_aa_par.dimension(0));
429 auto g_ab = SquareRankFourTensor<ResultScalar>::Zero(g_ab_par.dimension(0));
430 auto g_ba = SquareRankFourTensor<ResultScalar>::Zero(g_ba_par.dimension(0));
431 auto g_bb = SquareRankFourTensor<ResultScalar>::Zero(g_bb_par.dimension(0));
432
433 for (size_t i = 0; i < g_aa_par.dimension(0); i++) {
434 for (size_t j = 0; j < g_aa_par.dimension(1); j++) {
435 for (size_t k = 0; k < g_aa_par.dimension(2); k++) {
436 for (size_t l = 0; l < g_aa_par.dimension(3); l++) {
437 g_aa(i, j, k, l) = g_aa_par(i, j, k, l);
438 g_ab(i, j, k, l) = g_ab_par(i, j, k, l);
439 g_ba(i, j, k, l) = g_ba_par(i, j, k, l);
440 g_bb(i, j, k, l) = g_bb_par(i, j, k, l);
441 }
442 }
443 }
444 }
445
446 // We have previously calculated the representations in the AO basis, so we'll still have to transform these representations to the current spin-orbitals.
447 ResultOperator g {g_aa, g_ab, g_ba, g_bb};
448 g.transform(this->expansion()); // Now, g is expressed in the current spin-orbital basis.
449
450 return g;
451 }
452
453
454 /*
455 * MARK: Quantization of first-quantized operators (LondonGTOShell)
456 */
457
465 template <typename Z = Shell>
467
469 using ResultOperator = ScalarUSQTwoElectronOperator<ResultScalar>;
470
471 // Determine the matrix representation of the four spin-components of the second-quantized Coulomb operator.
472 auto coulomb_engine = GQCP::IntegralEngine::InHouse<GQCP::LondonGTOShell>(CoulombRepulsionOperator());
473
474 const auto g_aa_par = GQCP::IntegralCalculator::calculate(coulomb_engine, this->alpha().scalarBasis().shellSet(), this->alpha().scalarBasis().shellSet())[0]; // In AO basis, 'par' for 'parameters'.
475 const auto g_ab_par = GQCP::IntegralCalculator::calculate(coulomb_engine, this->alpha().scalarBasis().shellSet(), this->beta().scalarBasis().shellSet())[0]; // In AO basis, 'par' for 'parameters'.
476 const auto g_ba_par = GQCP::IntegralCalculator::calculate(coulomb_engine, this->beta().scalarBasis().shellSet(), this->alpha().scalarBasis().shellSet())[0]; // In AO basis, 'par' for 'parameters'.
477 const auto g_bb_par = GQCP::IntegralCalculator::calculate(coulomb_engine, this->beta().scalarBasis().shellSet(), this->beta().scalarBasis().shellSet())[0]; // In AO basis, 'par' for 'parameters'.
478
479
480 auto g_aa = SquareRankFourTensor<ResultScalar>::Zero(g_aa_par.dimension(0));
481 auto g_ab = SquareRankFourTensor<ResultScalar>::Zero(g_ab_par.dimension(0));
482 auto g_ba = SquareRankFourTensor<ResultScalar>::Zero(g_ba_par.dimension(0));
483 auto g_bb = SquareRankFourTensor<ResultScalar>::Zero(g_bb_par.dimension(0));
484
485 for (size_t i = 0; i < g_aa_par.dimension(0); i++) {
486 for (size_t j = 0; j < g_aa_par.dimension(1); j++) {
487 for (size_t k = 0; k < g_aa_par.dimension(2); k++) {
488 for (size_t l = 0; l < g_aa_par.dimension(3); l++) {
489 g_aa(i, j, k, l) = g_aa_par(i, j, k, l);
490 g_ab(i, j, k, l) = g_ab_par(i, j, k, l);
491 g_ba(i, j, k, l) = g_ba_par(i, j, k, l);
492 g_bb(i, j, k, l) = g_bb_par(i, j, k, l);
493 }
494 }
495 }
496 }
497
498 // We have previously calculated the representations in the AO basis, so we'll still have to transform these representations to the current spin-orbitals.
499 ResultOperator g {g_aa, g_ab, g_ba, g_bb};
500 g.transform(this->expansion()); // Now, g is expressed in the current spin-orbital basis.
501
502 return g;
503 }
504
505
513 template <typename Z = Shell>
515
516 const auto T = this->quantize(fq_hamiltonian.kinetic());
517 const auto OZ = this->quantize(fq_hamiltonian.orbitalZeeman());
518 const auto D = this->quantize(fq_hamiltonian.diamagnetic());
519
520 const auto V = this->quantize(fq_hamiltonian.nuclearAttraction());
521
522 const auto g = this->quantize(fq_hamiltonian.coulombRepulsion());
523
524 return USQHamiltonian<ExpansionScalar> {{T, OZ, D, V}, {g}};
525 }
526
527
535 template <typename Z = Shell>
537
538 const auto T = this->quantize(fq_hamiltonian.kinetic());
539 const auto OZ = this->quantize(fq_hamiltonian.orbitalZeeman());
540 const auto D = this->quantize(fq_hamiltonian.diamagnetic());
541
542 const auto SZ = this->quantize(fq_hamiltonian.spinZeeman());
543
544 const auto V = this->quantize(fq_hamiltonian.nuclearAttraction());
545
546 const auto g = this->quantize(fq_hamiltonian.coulombRepulsion());
547
548 return USQHamiltonian<ExpansionScalar> {{T, OZ, D, V, SZ}, {g}};
549 }
550
551
552 /*
553 * MARK: Quantization of first-quantized operators
554 */
555
565 template <typename FQOneElectronOperator>
566 auto quantize(const FQOneElectronOperator& fq_op) const -> USQOneElectronOperator<product_t<typename FQOneElectronOperator::Scalar, ExpansionScalar>, typename FQOneElectronOperator::Vectorizer> {
567
570
571 // Quantize the one-electron operator in the alpha- and beta- bases and return the wrapped result.
572 const auto f_a = this->alpha().quantize(fq_op);
573 const auto f_b = this->beta().quantize(fq_op);
574
575 return ResultOperator {f_a, f_b};
576 }
577
578
587
588 const auto T = this->quantize(fq_hamiltonian.kinetic());
589 const auto V = this->quantize(fq_hamiltonian.nuclearAttraction());
590
591 const auto g = this->quantize(fq_hamiltonian.coulombRepulsion());
592
593 return USQHamiltonian<ExpansionScalar> {T + V, g};
594 }
595
596
608 UMullikenDomain<ExpansionScalar> mullikenDomain(const std::function<bool(const BasisFunction&)>& selector) const {
609
610 return UMullikenDomain<ExpansionScalar> {this->alpha().mullikenDomain(selector), this->beta().mullikenDomain(selector)};
611 }
612
613
621 UMullikenDomain<ExpansionScalar> mullikenDomain(const std::function<bool(const Shell&)>& selector) const {
622
623 return UMullikenDomain<ExpansionScalar> {this->alpha().mullikenDomain(selector), this->beta().mullikenDomain(selector)};
624 }
625
626
631 // Since `rotate` and `rotated` are both defined in `SpinResolvedBasisTransformable` and `SpinResolvedJacobiRotatable`, we have to explicitly enable these methods here.
632
633 // Allow the `rotate` method from `SpinResolvedBasisTransformable`, since there's also a `rotate` from `SpinResolvedJacobiRotatable`.
635
636 // Allow the `rotated` method from `SpinResolvedBasisTransformable`, since there's also a `rotated` from `SpinResolvedJacobiRotatable`.
638
639 // Allow the `rotate` method from `SpinResolvedJacobiRotatable`, since there's also a `rotate` from `SpinResolvedBasisTransformable`.
641
642 // Allow the `rotated` method from `SpinResolvedJacobiRotatable`, since there's also a `rotated` from `SpinResolvedBasisTransformable`.
644};
645
646/*
647 * MARK: Convenience aliases
648 */
649template <typename ExpansionScalar, typename Shell>
651
652
653/*
654 * MARK: BasisTransformableTraits
655 */
656
660template <typename _ExpansionScalar, typename _Shell>
661struct BasisTransformableTraits<USpinOrbitalBasis<_ExpansionScalar, _Shell>> {
662
663 // The type of transformation that is naturally related to a `USpinOrbitalBasis`.
665};
666
667
668/*
669 * MARK: JacobiRotatableTraits
670 */
671
675template <typename _ExpansionScalar, typename _Shell>
676struct JacobiRotatableTraits<USpinOrbitalBasis<_ExpansionScalar, _Shell>> {
677
678 // The type of Jacobi rotation for which the Jacobi rotation should be defined.
680};
681
682
683} // namespace GQCP
void rotate(const Transformation &U)
Definition: BasisTransformable.hpp:107
Definition: CoulombRepulsionOperator.hpp:31
Definition: DenseVectorizer.hpp:49
Definition: ElectronicSpin_zOperator.hpp:31
Definition: ElectronicSpinSquaredOperator.hpp:32
Definition: FQMolecularHamiltonian.hpp:33
const KineticOperator & kinetic() const
Definition: FQMolecularHamiltonian.hpp:73
const NuclearAttractionOperator & nuclearAttraction() const
Definition: FQMolecularHamiltonian.hpp:78
const CoulombRepulsionOperator & coulombRepulsion() const
Definition: FQMolecularHamiltonian.hpp:83
Definition: FQMolecularMagneticHamiltonian.hpp:35
const DiamagneticOperator & diamagnetic() const
Definition: FQMolecularMagneticHamiltonian.hpp:80
const OrbitalZeemanOperator & orbitalZeeman() const
Definition: FQMolecularMagneticHamiltonian.hpp:75
Definition: FQMolecularPauliHamiltonian.hpp:32
const SpinZeemanOperator & spinZeeman() const
Definition: FQMolecularPauliHamiltonian.hpp:70
Definition: HomogeneousMagneticField.hpp:30
static Matrix< double > calculateLibintIntegrals(const FQOneElectronOperator &fq_one_op, const ScalarBasis< GTOShell > &left_scalar_basis, const ScalarBasis< GTOShell > &right_scalar_basis)
Definition: IntegralCalculator.hpp:181
static auto calculate(BaseOneElectronIntegralEngine< Shell, N, IntegralScalar > &engine, const ShellSet< Shell > &left_shell_set, const ShellSet< Shell > &right_shell_set) -> std::array< MatrixX< IntegralScalar >, N >
Definition: IntegralCalculator.hpp:61
Definition: MixedUSQTwoElectronOperatorComponent.hpp:40
Definition: Molecule.hpp:34
Definition: NuclearFramework.hpp:35
Definition: OverlapOperator.hpp:31
Definition: PureUSQTwoElectronOperatorComponent.hpp:39
Definition: RSpinOrbitalBasis.hpp:63
Definition: SQHamiltonian.hpp:54
Definition: ScalarBasis.hpp:41
Definition: USQTwoElectronOperator.hpp:380
const ScalarBasis< Shell > & scalarBasis() const
Definition: SimpleSpinOrbitalBasis.hpp:133
SQOverlapOperator overlap() const
Definition: SimpleSpinorBasis.hpp:118
void lowdinOrthonormalize()
Definition: SimpleSpinorBasis.hpp:149
const Transformation & expansion() const
Definition: SimpleSpinorBasis.hpp:98
Transformation lowdinOrthonormalization() const
Definition: SimpleSpinorBasis.hpp:138
bool isOrthonormal(const double precision=1.0e-08) const
Definition: SimpleSpinorBasis.hpp:127
size_t simpleDimension() const
Definition: SimpleSpinorBasis.hpp:108
Definition: SpinResolvedBase.hpp:39
USpinOrbitalBasisComponent< _ExpansionScalar, _Shell > Of
Definition: SpinResolvedBase.hpp:42
const Of & alpha() const
Definition: SpinResolvedBase.hpp:130
Definition: SpinResolvedBasisTransformable.hpp:34
Definition: SpinResolvedJacobiRotatable.hpp:35
USpinOrbitalBasis< _ExpansionScalar, _Shell > rotated(const JacobiRotationType &jacobi_rotation) const override
Definition: SpinResolvedJacobiRotatable.hpp:54
Definition: SpinZeemanOperator.hpp:30
static Self Zero(const size_t dim)
Definition: SquareMatrix.hpp:289
Definition: SquareRankFourTensor.hpp:36
static Self Zero(const size_t dim)
Definition: SquareRankFourTensor.hpp:147
Definition: UJacobiRotation.hpp:32
Definition: UMullikenDomain.hpp:37
Definition: USQOneElectronOperatorComponent.hpp:40
Definition: USQOneElectronOperator.hpp:48
Definition: USQTwoElectronOperator.hpp:50
Definition: USpinOrbitalBasisComponent.hpp:42
UMullikenDomainComponent< ExpansionScalar > mullikenDomain(const std::function< bool(const BasisFunction &)> &selector) const
Definition: USpinOrbitalBasisComponent.hpp:214
auto quantize(const FQOneElectronOperator &fq_one_op) const -> enable_if_t< std::is_same< Z, GTOShell >::value, USQOneElectronOperatorComponent< product_t< typename FQOneElectronOperator::Scalar, ExpansionScalar >, typename FQOneElectronOperator::Vectorizer > >
Definition: USpinOrbitalBasisComponent.hpp:80
Definition: USpinOrbitalBasis.hpp:60
static USpinOrbitalBasis< ExpansionScalar, Shell > FromRestricted(const RSpinOrbitalBasis< ExpansionScalar, Shell > &r_spinor_basis)
Definition: USpinOrbitalBasis.hpp:222
typename Shell::BasisFunction BasisFunction
Definition: USpinOrbitalBasis.hpp:75
auto quantize(const FQOneElectronOperator &fq_op) const -> USQOneElectronOperator< product_t< typename FQOneElectronOperator::Scalar, ExpansionScalar >, typename FQOneElectronOperator::Vectorizer >
Definition: USpinOrbitalBasis.hpp:566
typename Shell::Primitive Primitive
Definition: USpinOrbitalBasis.hpp:72
ScalarUSQOneElectronOperator< ExpansionScalar > overlap() const
Definition: USpinOrbitalBasis.hpp:406
_Shell Shell
Definition: USpinOrbitalBasis.hpp:66
USpinOrbitalBasis(const ScalarBasis< Shell > &scalar_basis, const UTransformationComponent< ExpansionScalar > &C)
Definition: USpinOrbitalBasis.hpp:118
UTransformation< ExpansionScalar > lowdinOrthonormalization() const
Definition: USpinOrbitalBasis.hpp:278
USpinOrbitalBasis(const NuclearFramework &nuclear_framework, const std::string &basisset_name)
Definition: USpinOrbitalBasis.hpp:152
typename SpinResolvedBase< USpinOrbitalBasisComponent< ExpansionScalar, Shell >, Self >::Of ComponentType
Definition: USpinOrbitalBasis.hpp:78
size_t numberOfSpinors() const
Definition: USpinOrbitalBasis.hpp:246
void lowdinOrthonormalize()
Definition: USpinOrbitalBasis.hpp:290
auto quantize(const CoulombRepulsionOperator &coulomb_op) const -> enable_if_t< std::is_same< Z, LondonGTOShell >::value, ScalarUSQTwoElectronOperator< product_t< typename CoulombRepulsionOperator::Scalar, ExpansionScalar > > >
Definition: USpinOrbitalBasis.hpp:466
UMullikenDomain< ExpansionScalar > mullikenDomain(const std::function< bool(const BasisFunction &)> &selector) const
Definition: USpinOrbitalBasis.hpp:608
USpinOrbitalBasis(const NuclearFramework &nuclear_framework, const std::string &basisset_name_alpha, const std::string &basisset_name_beta)
Definition: USpinOrbitalBasis.hpp:177
ScalarUSQOneElectronOperatorProduct< ExpansionScalar > quantize(const ElectronicSpinSquaredOperator &fq_op) const
Definition: USpinOrbitalBasis.hpp:330
USQHamiltonian< ExpansionScalar > quantize(const FQMolecularHamiltonian &fq_hamiltonian) const
Definition: USpinOrbitalBasis.hpp:586
size_t numberOfSpinOrbitals() const
Definition: USpinOrbitalBasis.hpp:258
UMullikenDomain< ExpansionScalar > mullikenDomain(const std::function< bool(const Shell &)> &selector) const
Definition: USpinOrbitalBasis.hpp:621
enable_if_t< std::is_same< Z, LondonGTOShell >::value, USQHamiltonian< ExpansionScalar > > quantize(const FQMolecularPauliHamiltonian &fq_hamiltonian) const
Definition: USpinOrbitalBasis.hpp:536
USpinOrbitalBasis(const Molecule &molecule, const std::string &basisset_name_alpha, const std::string &basisset_name_beta)
Definition: USpinOrbitalBasis.hpp:191
auto quantize(const CoulombRepulsionOperator &coulomb_op) const -> enable_if_t< std::is_same< Z, GTOShell >::value, ScalarUSQTwoElectronOperator< product_t< typename CoulombRepulsionOperator::Scalar, ExpansionScalar > > >
Definition: USpinOrbitalBasis.hpp:417
USpinOrbitalBasis(const Molecule &molecule, const std::string &basisset_name, const HomogeneousMagneticField &B, typename std::enable_if< std::is_same< Z, LondonGTOShell >::value >::type *=0)
Definition: USpinOrbitalBasis.hpp:206
USpinOrbitalBasis(const Molecule &molecule, const std::string &basisset_name)
Definition: USpinOrbitalBasis.hpp:164
USpinOrbitalBasis(const ScalarBasis< Shell > &scalar_basis)
Definition: USpinOrbitalBasis.hpp:140
bool isOrthonormal(const double precision=1.0e-08) const
Definition: USpinOrbitalBasis.hpp:272
UTransformation< ExpansionScalar > expansion() const
Definition: USpinOrbitalBasis.hpp:238
_ExpansionScalar ExpansionScalar
Definition: USpinOrbitalBasis.hpp:63
USQOneElectronOperator< product_t< ElectronicSpin_zOperator::Scalar, ExpansionScalar >, ElectronicSpin_zOperator::Vectorizer > quantize(const ElectronicSpin_zOperator &fq_op) const
Definition: USpinOrbitalBasis.hpp:307
USpinOrbitalBasis(const ScalarBasis< Shell > &alpha_scalar_basis, const ScalarBasis< Shell > &beta_scalar_basis, const UTransformation< ExpansionScalar > &C)
Definition: USpinOrbitalBasis.hpp:97
auto quantize(const SpinZeemanOperator &fq_op) const -> enable_if_t< std::is_same< Z, LondonGTOShell >::value, USQOneElectronOperator< product_t< SpinZeemanOperator::Scalar, ExpansionScalar >, SpinZeemanOperator::Vectorizer > >
Definition: USpinOrbitalBasis.hpp:390
USpinOrbitalBasis< ExpansionScalar, Shell > Self
Definition: USpinOrbitalBasis.hpp:69
enable_if_t< std::is_same< Z, LondonGTOShell >::value, USQHamiltonian< ExpansionScalar > > quantize(const FQMolecularMagneticHamiltonian &fq_hamiltonian) const
Definition: USpinOrbitalBasis.hpp:514
USpinOrbitalBasis(const ScalarBasis< Shell > &alpha_scalar_basis, const ScalarBasis< Shell > &beta_scalar_basis)
Definition: USpinOrbitalBasis.hpp:128
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
decltype(std::declval< T >() *std::declval< U >()) product_t
Definition: aliases.hpp:35
std::complex< double > complex
Definition: complex.hpp:31
@ z
Definition: CartesianDirection.hpp:30
@ x
Definition: CartesianDirection.hpp:28
@ y
Definition: CartesianDirection.hpp:29
Definition: BasisTransformable.hpp:37
Definition: JacobiRotatable.hpp:37