60template <
typename _ExpansionScalar,
typename _Shell>
62 public SimpleSpinorBasis<_ExpansionScalar, GSpinorBasis<_ExpansionScalar, _Shell>> {
101 scalar_bases {scalar_bases} {
104 const auto K_alpha = scalar_bases.
alpha().numberOfBasisFunctions();
105 const auto K_beta = scalar_bases.
beta().numberOfBasisFunctions();
108 throw std::invalid_argument(
"GSpinorBasis(const SpinResolved<ScalarBasis<Shell>>&, const Transformation&): The given dimensions of the scalar bases and coefficient matrix are incompatible.");
141 Transformation::Identity(alpha_scalar_basis.numberOfBasisFunctions(), beta_scalar_basis.numberOfBasisFunctions())) {}
186 template <
typename Z = Shell>
188 typename std::enable_if<std::is_same<Z, LondonGTOShell>::value>::type* = 0) :
215 GSpinorBasis(
const Molecule& molecule,
const std::string& basisset_name_alpha,
const std::string& basisset_name_beta) :
281 return K_alpha + K_beta;
296 template <
typename FQOneElectronOperator,
typename Z = Shell>
315 f.topLeftCorner(K_alpha, K_alpha) = F_alpha;
316 f.bottomRightCorner(K_beta, K_beta) = F_beta;
319 ResultOperator op {{f}};
332 template <
typename Z = Shell>
360 S_x.block(0, K_alpha, K_alpha, K_beta) = 0.5 * S_ab;
361 S_x.block(K_alpha, 0, K_beta, K_alpha) = 0.5 * S_ba;
364 S_y.block(0, K_alpha, K_alpha, K_beta) = -0.5 * 1_ii * S_ab;
365 S_y.block(K_alpha, 0, K_beta, K_alpha) = 0.5 * 1_ii * S_ba;
367 S_z.topLeftCorner(K_alpha, K_alpha) = 0.5 * S_aa;
368 S_z.bottomRightCorner(K_beta, K_beta) = -0.5 * S_bb;
372 ResultOperator spin_op {std::vector<SquareMatrix<ResultScalar>> {S_x, S_y, S_z}};
385 template <
typename Z = Shell>
406 S_z.topLeftCorner(K_alpha, K_alpha) = 0.5 * S_aa;
407 S_z.bottomRightCorner(K_beta, K_beta) = -0.5 * S_bb;
410 ResultOperator spin_op {{S_z}};
423 template <
typename Z = Shell>
449 for (
size_t mu_ = 0; mu_ < M; mu_++) {
450 const size_t mu = mu_ % K_alpha;
452 for (
size_t nu_ = 0; nu_ < M; nu_++) {
453 const size_t nu = nu_ % K_alpha;
455 for (
size_t rho_ = 0; rho_ < M; rho_++) {
456 const size_t rho = rho_ % K_alpha;
458 for (
size_t lambda_ = 0; lambda_ < M; lambda_++) {
459 const size_t lambda = lambda_ % K_alpha;
461 if ((mu_ < K_alpha) && (nu_ < K_alpha) && (rho_ < K_alpha) && (lambda_ < K_alpha)) {
462 g_par(mu_, nu_, rho_, lambda_) = g_aaaa(mu, nu, rho, lambda);
463 }
else if ((mu_ < K_alpha) && (nu_ < K_alpha) && (rho_ >= K_alpha) && (lambda_ >= K_alpha)) {
464 g_par(mu_, nu_, rho_, lambda_) = g_aabb(mu, nu, rho, lambda);
465 }
else if ((mu_ >= K_alpha) && (nu_ >= K_alpha) && (rho_ < K_alpha) && (lambda_ < K_alpha)) {
466 g_par(mu_, nu_, rho_, lambda_) = g_bbaa(mu, nu, rho, lambda);
467 }
else if ((mu_ >= K_alpha) && (nu_ >= K_alpha) && (rho_ >= K_alpha) && (lambda_ >= K_alpha)) {
468 g_par(mu_, nu_, rho_, lambda_) = g_bbbb(mu, nu, rho, lambda);
477 ResultOperator g_op {g_par};
494 template <
typename FQOneElectronOperator,
typename Z = Shell>
499 using Vectorizer =
typename FQOneElectronOperator::Vectorizer;
501 const auto N = FQOneElectronOperator::NumberOfComponents;
502 const auto& vectorizer = FQOneElectronOperator::vectorizer;
514 auto engine = GQCP::IntegralEngine::InHouse<GQCP::LondonGTOShell>(fq_one_op);
519 std::array<SquareMatrix<ResultScalar>, N> fs;
520 for (
size_t i = 0; i < N; i++) {
523 f.topLeftCorner(K_alpha, K_alpha) = F_aa[i];
524 f.bottomRightCorner(K_beta, K_beta) = F_bb[i];
532 ResultOperator op {array};
545 template <
typename Z = Shell>
566 auto overlap_engine = GQCP::IntegralEngine::InHouse<GQCP::LondonGTOShell>(
OverlapOperator());
574 S_x.block(0, K_alpha, K_alpha, K_beta) = 0.5 * S_ab;
575 S_x.block(K_alpha, 0, K_beta, K_alpha) = 0.5 * S_ba;
578 S_y.block(0, K_alpha, K_alpha, K_beta) = -0.5 * 1_ii * S_ab;
579 S_y.block(K_alpha, 0, K_beta, K_alpha) = 0.5 * 1_ii * S_ba;
581 S_z.topLeftCorner(K_alpha, K_alpha) = 0.5 * S_aa;
582 S_z.bottomRightCorner(K_beta, K_beta) = -0.5 * S_bb;
586 ResultOperator spin_op {std::vector<SquareMatrix<ResultScalar>> {S_x, S_y, S_z}};
599 template <
typename Z = Shell>
603 const auto L = this->
quantize(op.angularMomentum());
604 const auto& B = op.magneticField().strength();
605 return 0.5 * L.dot(B);
616 template <
typename Z = Shell>
624 const auto Q = this->
quantize(op.electronicQuadrupole()).allParameters();
625 const auto& B = op.magneticField().strength();
641 (std::pow(B_x, 2) + std::pow(B_z, 2)) * Q_yy +
642 (std::pow(B_x, 2) + std::pow(B_y, 2)) * Q_zz -
643 2 * B_x * B_y * Q_xy -
644 2 * B_x * B_z * Q_xz -
645 2 * B_y * B_z * Q_yz);
647 return ResultOperator {D_par};
658 template <
typename Z = Shell>
663 const auto& B = op.magneticField().strength();
677 template <
typename Z = Shell>
701 for (
size_t mu_ = 0; mu_ < M; mu_++) {
702 const size_t mu = mu_ % K_alpha;
704 for (
size_t nu_ = 0; nu_ < M; nu_++) {
705 const size_t nu = nu_ % K_alpha;
707 for (
size_t rho_ = 0; rho_ < M; rho_++) {
708 const size_t rho = rho_ % K_alpha;
710 for (
size_t lambda_ = 0; lambda_ < M; lambda_++) {
711 const size_t lambda = lambda_ % K_alpha;
713 if ((mu_ < K_alpha) && (nu_ < K_alpha) && (rho_ < K_alpha) && (lambda_ < K_alpha)) {
714 g_par(mu_, nu_, rho_, lambda_) = g(mu, nu, rho, lambda);
715 }
else if ((mu_ < K_alpha) && (nu_ < K_alpha) && (rho_ >= K_alpha) && (lambda_ >= K_alpha)) {
716 g_par(mu_, nu_, rho_, lambda_) = g(mu, nu, rho, lambda);
717 }
else if ((mu_ >= K_alpha) && (nu_ >= K_alpha) && (rho_ < K_alpha) && (lambda_ < K_alpha)) {
718 g_par(mu_, nu_, rho_, lambda_) = g(mu, nu, rho, lambda);
719 }
else if ((mu_ >= K_alpha) && (nu_ >= K_alpha) && (rho_ >= K_alpha) && (lambda_ >= K_alpha)) {
720 g_par(mu_, nu_, rho_, lambda_) = g(mu, nu, rho, lambda);
729 ResultOperator g_op {g_par};
742 template <
typename Z = Shell>
764 template <
typename Z = Shell>
812 template <
typename S = ExpansionScalar>
823 const auto S_x_2 = S_x_op * S_x_op;
824 const auto S_y_2 = S_y_op * S_y_op;
825 const auto S_z_2 = S_z_op * S_z_op;
827 return S_x_2 + S_y_2 + S_z_2;
838 template <
typename S = ExpansionScalar>
856 S_plus.topRightCorner(K, K) = S_aa;
857 S_minus.bottomLeftCorner(K, K) = S_aa;
858 S_plus_minus.bottomRightCorner(K, K) = S_aa;
860 S_z_squared.topLeftCorner(K, K) = 0.25 * S_aa;
861 S_z_squared.bottomRightCorner(K, K) = 0.25 * S_aa;
869 for (
size_t p = 0; p < M; p++) {
870 for (
size_t q = 0; q < M; q++) {
871 for (
size_t r = 0; r < M; r++) {
872 for (
size_t s = 0; s < M; s++) {
873 T_S_z(p, q, r, s) = 2.0 * S_z(p, q) * S_z(r, s);
874 T_S_minus_plus(p, q, r, s) = 2.0 * S_minus(p, q) * S_plus(r, s);
912 const auto ao_indices = this->
scalarBases().alpha().basisFunctionIndices(selector);
929 const auto ao_indices = this->
scalarBases().alpha().basisFunctionIndices(selector);
942template <
typename _ExpansionScalar,
typename _Shell>
962template <
typename _ExpansionScalar,
typename _Shell>
977template <
typename _ExpansionScalar,
typename _Shell>
_Vectorizer Vectorizer
Definition: BaseFQOperator.hpp:48
Definition: CoulombRepulsionOperator.hpp:31
Definition: DenseVectorizer.hpp:49
Definition: DiamagneticOperator.hpp:35
Definition: ElectronicSpin_zOperator.hpp:31
Definition: ElectronicSpinOperator.hpp:32
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: GMullikenDomain.hpp:35
Definition: GSQOneElectronOperator.hpp:42
Definition: GSQTwoElectronOperator.hpp:43
Definition: GSpinorBasis.hpp:62
GSpinorBasis(const Molecule &molecule, const std::string &basisset_name_alpha, const std::string &basisset_name_beta)
Definition: GSpinorBasis.hpp:215
enable_if_t< std::is_same< Z, LondonGTOShell >::value, GSQHamiltonian< ExpansionScalar > > quantize(const FQMolecularMagneticHamiltonian &fq_hamiltonian) const
Definition: GSpinorBasis.hpp:743
GSpinorBasis(const NuclearFramework &nuclear_framework, const std::string &basisset_name_alpha, const std::string &basisset_name_beta)
Definition: GSpinorBasis.hpp:201
typename Shell::BasisFunction BasisFunction
Definition: GSpinorBasis.hpp:80
auto quantize(const FQOneElectronOperator &fq_one_op) const -> enable_if_t< std::is_same< Z, GTOShell >::value, GSQOneElectronOperator< product_t< typename FQOneElectronOperator::Scalar, ExpansionScalar >, typename FQOneElectronOperator::Vectorizer > >
Definition: GSpinorBasis.hpp:297
enable_if_t< std::is_same< S, double >::value, ScalarGSQOneElectronOperatorProduct< double > > quantize(const ElectronicSpinSquaredOperator &fq_S2_op) const
Definition: GSpinorBasis.hpp:839
static GSpinorBasis< ExpansionScalar, Shell > FromUnrestricted(const USpinOrbitalBasis< ExpansionScalar, Shell > &u_spinor_basis)
Definition: GSpinorBasis.hpp:249
_Shell Shell
Definition: GSpinorBasis.hpp:68
GMullikenDomain< ExpansionScalar > mullikenDomain(const std::function< bool(const Shell &)> &selector) const
Definition: GSpinorBasis.hpp:926
enable_if_t< std::is_same< Z, LondonGTOShell >::value, GSQHamiltonian< ExpansionScalar > > quantize(const FQMolecularPauliHamiltonian &fq_hamiltonian) const
Definition: GSpinorBasis.hpp:765
auto quantize(const ElectronicSpinOperator &fq_one_op) const -> enable_if_t< std::is_same< Z, GTOShell >::value, GSQOneElectronOperator< product_t< ElectronicSpinOperator::Scalar, ExpansionScalar >, ElectronicSpinOperator::Vectorizer > >
Definition: GSpinorBasis.hpp:333
auto quantize(const SpinZeemanOperator &op) const -> enable_if_t< std::is_same< Z, LondonGTOShell >::value, GSQOneElectronOperator< product_t< SpinZeemanOperator::Scalar, ExpansionScalar >, SpinZeemanOperator::Vectorizer > >
Definition: GSpinorBasis.hpp:659
GSpinorBasis(const Molecule &molecule, const std::string &basisset_name)
Definition: GSpinorBasis.hpp:173
GSpinorBasis(const ScalarBasis< Shell > &scalar_basis)
Definition: GSpinorBasis.hpp:149
auto quantize(const FQOneElectronOperator &fq_one_op) const -> enable_if_t< std::is_same< Z, LondonGTOShell >::value, GSQOneElectronOperator< product_t< typename FQOneElectronOperator::Scalar, ExpansionScalar >, typename FQOneElectronOperator::Vectorizer > >
Definition: GSpinorBasis.hpp:495
GSpinorBasis(const ScalarBasis< Shell > &scalar_basis, const Transformation &C)
Definition: GSpinorBasis.hpp:129
const SpinResolved< ScalarBasis< Shell > > & scalarBases() const
Definition: GSpinorBasis.hpp:893
size_t numberOfCoefficients(const Spin &sigma) const
Definition: GSpinorBasis.hpp:266
GSpinorBasis(const Molecule &molecule, const std::string &basisset_name, const HomogeneousMagneticField &B, typename std::enable_if< std::is_same< Z, LondonGTOShell >::value >::type *=0)
Definition: GSpinorBasis.hpp:187
GSpinorBasis(const SpinResolved< ScalarBasis< Shell > > &scalar_bases, const Transformation &C)
Definition: GSpinorBasis.hpp:99
GMullikenDomain< ExpansionScalar > mullikenDomain(const std::function< bool(const BasisFunction &)> &selector) const
Definition: GSpinorBasis.hpp:909
auto quantize(const DiamagneticOperator &op) const -> enable_if_t< std::is_same< Z, LondonGTOShell >::value, GSQOneElectronOperator< product_t< DiamagneticOperator::Scalar, ExpansionScalar >, DiamagneticOperator::Vectorizer > >
Definition: GSpinorBasis.hpp:617
enable_if_t< std::is_same< S, complex >::value, ScalarGSQOneElectronOperatorProduct< complex > > quantize(const ElectronicSpinSquaredOperator &fq_S2_op) const
Definition: GSpinorBasis.hpp:813
auto quantize(const CoulombRepulsionOperator &coulomb_op) const -> enable_if_t< std::is_same< Z, GTOShell >::value, GSQTwoElectronOperator< product_t< CoulombRepulsionOperator::Scalar, ExpansionScalar >, CoulombRepulsionOperator::Vectorizer > >
Definition: GSpinorBasis.hpp:424
auto quantize(const ElectronicSpinOperator &fq_one_op) const -> enable_if_t< std::is_same< Z, LondonGTOShell >::value, GSQOneElectronOperator< product_t< ElectronicSpinOperator::Scalar, ExpansionScalar >, ElectronicSpinOperator::Vectorizer > >
Definition: GSpinorBasis.hpp:546
auto quantize(const OrbitalZeemanOperator &op) const -> enable_if_t< std::is_same< Z, LondonGTOShell >::value, GSQOneElectronOperator< product_t< OrbitalZeemanOperator::Scalar, ExpansionScalar >, OrbitalZeemanOperator::Vectorizer > >
Definition: GSpinorBasis.hpp:600
typename Shell::Primitive Primitive
Definition: GSpinorBasis.hpp:77
_ExpansionScalar ExpansionScalar
Definition: GSpinorBasis.hpp:65
size_t numberOfSpinors() const
Definition: GSpinorBasis.hpp:276
GSpinorBasis(const ScalarBasis< Shell > &alpha_scalar_basis, const ScalarBasis< Shell > &beta_scalar_basis)
Definition: GSpinorBasis.hpp:139
GSQHamiltonian< ExpansionScalar > quantize(const FQMolecularHamiltonian &fq_hamiltonian) const
Definition: GSpinorBasis.hpp:792
static GSpinorBasis< ExpansionScalar, Shell > FromRestricted(const RSpinOrbitalBasis< ExpansionScalar, Shell > &r_spinor_basis)
Definition: GSpinorBasis.hpp:231
GSpinorBasis(const NuclearFramework &nuclear_framework, const std::string &basisset_name)
Definition: GSpinorBasis.hpp:161
auto quantize(const CoulombRepulsionOperator &coulomb_op) const -> enable_if_t< std::is_same< Z, LondonGTOShell >::value, GSQTwoElectronOperator< product_t< CoulombRepulsionOperator::Scalar, ExpansionScalar >, CoulombRepulsionOperator::Vectorizer > >
Definition: GSpinorBasis.hpp:678
GSpinorBasis(const ScalarBasis< Shell > &alpha_scalar_basis, const ScalarBasis< Shell > &beta_scalar_basis, const Transformation &C)
Definition: GSpinorBasis.hpp:119
auto quantize(const ElectronicSpin_zOperator &fq_one_op) const -> enable_if_t< std::is_same< Z, GTOShell >::value, GSQOneElectronOperator< product_t< ElectronicSpin_zOperator::Scalar, ExpansionScalar >, ElectronicSpin_zOperator::Vectorizer > >
Definition: GSpinorBasis.hpp:386
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: JacobiRotation.hpp:33
Definition: Molecule.hpp:34
Definition: NuclearFramework.hpp:35
Definition: OrbitalZeemanOperator.hpp:35
Definition: OverlapOperator.hpp:31
Definition: RSpinOrbitalBasis.hpp:63
Definition: SQHamiltonian.hpp:54
Definition: ScalarBasis.hpp:41
Definition: GSQTwoElectronOperator.hpp:179
const ScalarBasis< Shell > & scalarBasis() const
Definition: SimpleSpinOrbitalBasis.hpp:133
Definition: SimpleSpinorBasis.hpp:55
const Transformation & expansion() const
Definition: SimpleSpinorBasis.hpp:98
Transformation C
Definition: SimpleSpinorBasis.hpp:76
const Of & beta() const
Definition: SpinResolvedBase.hpp:140
const Of & alpha() const
Definition: SpinResolvedBase.hpp:130
Definition: SpinResolved.hpp:34
Definition: SpinZeemanOperator.hpp:30
Definition: SquareMatrix.hpp:39
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: StorageArray.hpp:38
Definition: USpinOrbitalBasis.hpp:60
static USpinOrbitalBasis< ExpansionScalar, Shell > FromRestricted(const RSpinOrbitalBasis< ExpansionScalar, Shell > &r_spinor_basis)
Definition: USpinOrbitalBasis.hpp:222
UTransformation< ExpansionScalar > expansion() const
Definition: USpinOrbitalBasis.hpp:238
Definition: complex.hpp:57
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
@ xz
Definition: DyadicCartesianDirection.hpp:30
@ yy
Definition: DyadicCartesianDirection.hpp:32
@ xy
Definition: DyadicCartesianDirection.hpp:29
@ xx
Definition: DyadicCartesianDirection.hpp:28
@ yz
Definition: DyadicCartesianDirection.hpp:33
@ zz
Definition: DyadicCartesianDirection.hpp:36
@ z
Definition: CartesianDirection.hpp:30
@ x
Definition: CartesianDirection.hpp:28
@ y
Definition: CartesianDirection.hpp:29
Spin
Definition: Spin.hpp:27
@ beta
Definition: Spin.hpp:29
@ alpha
Definition: Spin.hpp:28
Definition: JacobiRotatable.hpp:37
_ExpansionScalar ExpansionScalar
Definition: GSpinorBasis.hpp:945
Definition: SimpleSpinorBasis.hpp:38