GQCP
Loading...
Searching...
No Matches
RSpinOrbitalBasis.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
48#include "Utilities/complex.hpp"
50
51
52namespace GQCP {
53
54
61template <typename _ExpansionScalar, typename _Shell>
63 public SimpleSpinOrbitalBasis<_ExpansionScalar, _Shell, RSpinOrbitalBasis<_ExpansionScalar, _Shell>> {
64public:
65 // The scalar type used to represent an expansion coefficient of the spinors in the underlying scalar orbitals: real or complex.
66 using ExpansionScalar = _ExpansionScalar;
67
68 // The type of shell the underlying scalar bases contain.
69 using Shell = _Shell;
70
71 // The type of the base spinor basis.
73
74 // The type of transformation that is naturally related to an `RSpinOrbitalBasis`.
76
77 // The type that is used for representing the primitive for a basis function of this spin-orbital basis' underlying AO basis.
78 using Primitive = typename Shell::Primitive;
79
80 // The type that is used for representing the underlying basis functions of this spin-orbital basis.
81 using BasisFunction = typename Shell::BasisFunction;
82
83 // The type that is used to represent a spatial orbital for this spin-orbital basis.
85
86 // The type that represents a density distribution for this spin-orbital basis.
88
89 // figure out what a single primitive actually returns:
90 // for CartesianGTO that is double, for LondonCartesianGTO that is complex<double>
91 using PrimitiveScalar = decltype(
92 std::declval<Primitive>()(std::declval<Vector<double, 3>>())
93 );
94
95 // now the primitive‐derivative lives at the primitive’s own scalar
97
98 // the basis‐function derivative uses the same contraction coefficients as the basis‐function itself
100
101 // and finally the spatial‐orbital derivative lives at the MO‐scalar level
103
104 // The type that represents a current density distribution for this spin-orbital basis.
106
107
108public:
109 /*
110 * MARK: Constructors
111 */
112
113 // Inherit `SimpleSpinOrbitalBasis`'s constructors.
114 using SimpleSpinOrbitalBasis<_ExpansionScalar, _Shell, RSpinOrbitalBasis<_ExpansionScalar, _Shell>>::SimpleSpinOrbitalBasis;
115
116
117 /*
118 * MARK: General information
119 */
120
125
129 size_t numberOfSpinors() const { return 2 * this->numberOfSpatialOrbitals(); /* alpha and beta spinors are equal*/ }
130
134 size_t numberOfSpinOrbitals() const { return this->numberOfSpinors(); }
135
136
137 /*
138 * MARK: Quantization of first-quantized operators (GTOShell)
139 */
140
150 template <typename FQOneElectronOperator, typename Z = Shell>
151 auto quantize(const FQOneElectronOperator& fq_one_op) const -> enable_if_t<std::is_same<Z, GTOShell>::value, RSQOneElectronOperator<product_t<typename FQOneElectronOperator::Scalar, ExpansionScalar>, typename FQOneElectronOperator::Vectorizer>> {
152
155
156 const auto one_op_par = IntegralCalculator::calculateLibintIntegrals(fq_one_op, this->scalarBasis()); // in AO/scalar basis
157
158 ResultOperator op {one_op_par}; // op for 'operator'
159 op.transform(this->expansion()); // now in the spatial/spin-orbital basis
160 return op;
161 }
162
163
171 template <typename Z = Shell>
173
176
177 const auto g_par = IntegralCalculator::calculateLibintIntegrals(fq_op, this->scalarBasis()); // In AO/scalar basis.
178
179 auto g = SquareRankFourTensor<ResultScalar>::Zero(g_par.dimension(0));
180 for (size_t i = 0; i < g_par.dimension(0); i++) {
181 for (size_t j = 0; j < g_par.dimension(1); j++) {
182 for (size_t k = 0; k < g_par.dimension(2); k++) {
183 for (size_t l = 0; l < g_par.dimension(3); l++) {
184 g(i, j, k, l) = g_par(i, j, k, l);
185 }
186 }
187 }
188 }
189
190 ResultOperator op {g}; // 'op' for 'operator'.
191 op.transform(this->expansion()); // Now in spatial/spin-orbital basis.
192 return op;
193 }
194
195
196 /*
197 * MARK: Quantization of first-quantized operators (GTOShell)
198 */
199
207 template <typename Z = Shell>
209
212
213 auto primitive_engine = GQCP::IntegralEngine::InHouse<GTOShell>(fq_one_op);
214 const auto one_op_par = IntegralCalculator::calculate(primitive_engine, this->scalarBasis().shellSet(), this->scalarBasis().shellSet()); // In AO/scalar basis.
215
216 std::array<SquareMatrix<ResultScalar>, 3> one_op_par_square;
217 for (size_t i = 0; i < 3; i++) {
218 one_op_par_square[i] = SquareMatrix<ResultScalar>(one_op_par[i]);
219 }
220
221 ResultOperator op {one_op_par_square}; // 'op' for 'operator'.
222 op.transform(this->expansion()); // Now in the spin-orbital basis.
223 return op;
224 }
225
226
234 template <typename Z = Shell>
236
239
240 auto primitive_engine = GQCP::IntegralEngine::InHouse<GTOShell>(fq_one_op);
241 const auto one_op_par = IntegralCalculator::calculate(primitive_engine, this->scalarBasis().shellSet(), this->scalarBasis().shellSet()); // In AO/scalar basis.
242
243 std::array<SquareMatrix<ResultScalar>, 3> one_op_par_square;
244 for (size_t i = 0; i < 3; i++) {
245 one_op_par_square[i] = SquareMatrix<ResultScalar>(one_op_par[i]);
246 }
247
248 ResultOperator op {one_op_par_square}; // 'op' for 'operator'.
249 op.transform(this->expansion()); // Now in the spatial/spin-orbital basis.
250 return op;
251 }
252
253
262
263 // There aren't any 'integrals' to be calculated for the density operator: we can just multiply every pair of spatial orbitals.
264 const auto phi = this->spatialOrbitals();
265 const auto K = this->numberOfSpatialOrbitals();
266
268 for (size_t p = 0; p < K; p++) {
269 for (size_t q = 0; q < K; q++) {
270 rho_par(p, q) = phi[p] * phi[q];
271 }
272 }
273
275 }
276
277
286
287 using namespace GQCP::literals;
288
289 // There aren't any 'integrals' to be calculated for the current density operator: we can just multiply every pair of (spatial orbital, spatial orbital derivative).
290 const auto K = this->numberOfSpatialOrbitals();
291 const auto phi = this->spatialOrbitals();
292 const auto dphi = this->spatialOrbitalGradients();
293
294 std::vector<SquareMatrix<CurrentDensityMatrixElement<ExpansionScalar, CartesianGTO>>> j_par_vector {};
295 for (size_t i = 0; i < 3; i++) {
296
298 for (size_t p = 0; p < K; p++) {
299 for (size_t q = 0; q < K; q++) {
300 j_i(p, q) = CurrentDensityMatrixElement<ExpansionScalar, CartesianGTO> {phi[p], phi[q], dphi[p](i), dphi[q](i)};
301 }
302 }
303
304 j_par_vector.push_back(j_i);
305 }
306
308 }
309
310
311 /*
312 * MARK: Quantization of first-quantized operators (LondonGTOShell)
313 */
314
322 template <typename FQOneElectronOperator, typename Z = Shell>
323 auto quantize(const FQOneElectronOperator& fq_one_op) const -> enable_if_t<std::is_same<Z, LondonGTOShell>::value, RSQOneElectronOperator<product_t<typename FQOneElectronOperator::Scalar, ExpansionScalar>, typename FQOneElectronOperator::Vectorizer>> {
324
327 using Vectorizer = typename FQOneElectronOperator::Vectorizer;
328
329 const auto N = FQOneElectronOperator::NumberOfComponents;
330 const auto& vectorizer = FQOneElectronOperator::vectorizer;
331
332
333 // The strategy for calculating the matrix representation of the one-electron operator in this spin-orbital basis is to:
334 // 1. Express the operator in the underlying scalar bases and;
335 // 2. Afterwards transform them using the current coefficient matrix.
336 const auto K = this->numberOfSpatialOrbitals();
337
338
339 // 1. Express the operator in the underlying scalar basis.
340 auto engine = GQCP::IntegralEngine::InHouse<GQCP::LondonGTOShell>(fq_one_op);
341 const auto F = GQCP::IntegralCalculator::calculate(engine, this->scalarBasis().shellSet(), this->scalarBasis().shellSet());
342
343
344 // For each of the components of the operator, place the scalar basis representations into the spinor basis representation.
345 std::array<SquareMatrix<ResultScalar>, N> fs;
346 for (size_t i = 0; i < N; i++) {
347 fs[i] = SquareMatrix<ResultScalar>(F[i]);
348 }
349
350
351 // 2. Transform using the current coefficient matrix.
352 StorageArray<SquareMatrix<ResultScalar>, Vectorizer> array {fs, vectorizer};
353 ResultOperator op {array}; // 'op' for 'operator'.
354 op.transform(this->expansion());
355 return op;
356 }
357
358
366 template <typename Z = Shell>
368
369 // Return the orbital Zeeman operator as a contraction beween the magnetic field and the angular momentum operator.
370 const auto L = this->quantize(op.angularMomentum());
371 const auto& B = op.magneticField().strength();
372 return 0.5 * L.dot(B);
373 }
374
375
383 template <typename Z = Shell>
385
388
389
390 // Return the diamagnetic operator as a contraction beween the magnetic field and the electronic quadrupole operator.
391 const auto Q = this->quantize(op.electronicQuadrupole()).allParameters();
392 const auto& B = op.magneticField().strength();
393
394 // Prepare some variables.
395 const auto& B_x = B(CartesianDirection::x);
396 const auto& B_y = B(CartesianDirection::y);
397 const auto& B_z = B(CartesianDirection::z);
398
399 const auto& Q_xx = Q[DyadicCartesianDirection::xx];
400 const auto& Q_xy = Q[DyadicCartesianDirection::xy];
401 const auto& Q_xz = Q[DyadicCartesianDirection::xz];
402 const auto& Q_yy = Q[DyadicCartesianDirection::yy];
403 const auto& Q_yz = Q[DyadicCartesianDirection::yz];
404 const auto& Q_zz = Q[DyadicCartesianDirection::zz];
405
406
407 SquareMatrix<ResultScalar> D_par = 0.125 * ((std::pow(B_y, 2) + std::pow(B_z, 2)) * Q_xx +
408 (std::pow(B_x, 2) + std::pow(B_z, 2)) * Q_yy +
409 (std::pow(B_x, 2) + std::pow(B_y, 2)) * Q_zz -
410 2 * B_x * B_y * Q_xy -
411 2 * B_x * B_z * Q_xz -
412 2 * B_y * B_z * Q_yz);
413
414 return ResultOperator {D_par};
415 }
416
417
425 template <typename Z = Shell>
427
430
431
432 auto coulomb_engine = GQCP::IntegralEngine::InHouse<GQCP::LondonGTOShell>(CoulombRepulsionOperator());
433 const auto g_par = GQCP::IntegralCalculator::calculate(coulomb_engine, this->scalarBasis().shellSet(), this->scalarBasis().shellSet())[0]; // In AO basis.
434
435 auto g = SquareRankFourTensor<ResultScalar>::Zero(g_par.dimension(0));
436
437 for (size_t i = 0; i < g_par.dimension(0); i++) {
438 for (size_t j = 0; j < g_par.dimension(1); j++) {
439 for (size_t k = 0; k < g_par.dimension(2); k++) {
440 for (size_t l = 0; l < g_par.dimension(3); l++) {
441 g(i, j, k, l) = g_par(i, j, k, l);
442 }
443 }
444 }
445 }
446
447 ResultOperator op {g}; // 'op' for 'operator'.
448 op.transform(this->expansion()); // Now in spatial/spin-orbital basis.
449 return op;
450 }
451
452
460 template <typename Z = Shell>
462
463 const auto T = this->quantize(fq_hamiltonian.kinetic());
464 const auto OZ = this->quantize(fq_hamiltonian.orbitalZeeman());
465 const auto D = this->quantize(fq_hamiltonian.diamagnetic());
466
467 const auto V = this->quantize(fq_hamiltonian.nuclearAttraction());
468
469 const auto g = this->quantize(fq_hamiltonian.coulombRepulsion());
470
471 return RSQHamiltonian<ExpansionScalar> {{T, OZ, D, V}, {g}};
472 }
473
474
475 /*
476 * MARK: Quantization of first-quantized operators
477 */
478
487
488 const auto T = this->quantize(fq_hamiltonian.kinetic());
489 const auto V = this->quantize(fq_hamiltonian.nuclearAttraction());
490
491 const auto g = this->quantize(fq_hamiltonian.coulombRepulsion());
492
493 return RSQHamiltonian<ExpansionScalar> {T + V, g};
494 }
495
496
497 /*
498 * MARK: Orbitals
499 */
500
504 std::vector<SpatialOrbital> spatialOrbitals() const {
505
506 // The spatial orbitals are a linear combination of the basis functions, where every column of the coefficient matrix describes one expansion of a spatial orbital in terms of the basis functions.
507 const auto basis_functions = this->scalar_basis.basisFunctions();
508 const auto& C = this->C;
509
510
511 // For all spatial orbitals, proceed to calculate the contraction between the associated coefficient matrix column and the basis functions.
512 std::vector<SpatialOrbital> spatial_orbitals;
513 spatial_orbitals.reserve(this->numberOfSpatialOrbitals());
514 for (size_t p = 0; p < this->numberOfSpatialOrbitals(); p++) {
515
516 // Calculate the spatial orbitals as a contraction between a column of the coefficient matrix and the basis functions.
517 SpatialOrbital spatial_orbital {};
518 for (size_t mu = 0; mu < basis_functions.size(); mu++) {
519 const auto coefficient = this->expansion().matrix().col(p)(mu);
520 const auto& function = basis_functions[mu];
521 spatial_orbital.append(coefficient, function);
522 }
523
524 spatial_orbitals.push_back(spatial_orbital);
525 }
526
527 return spatial_orbitals;
528 }
529
530
534 std::vector<Vector<SpatialOrbitalDerivative, 3>> spatialOrbitalGradients() const {
535
536 const auto K = this->numberOfSpatialOrbitals();
537 const auto spatial_orbitals = this->spatialOrbitals();
538
539 std::vector<GQCP::Vector<SpatialOrbitalDerivative, 3>> spatial_orbital_gradients {K};
540 for (size_t m = 0; m < 3; m++) {
541 for (size_t p = 0; p < K; p++) {
542 const auto& spatial_orbital = spatial_orbitals[p];
543
544 // A spatial orbital is a linear combination of basis functions (which are contracted GTOs).
545 const auto& expansion_coefficients = spatial_orbital.coefficients();
546 const auto& basis_functions = spatial_orbital.functions();
547
548 std::vector<Vector<BasisFunctionDerivative, 3>> basis_function_gradients {K};
549 for (size_t mu = 0; mu < K; mu++) {
550 const auto& expansion_coefficient = expansion_coefficients[mu];
551 const auto& basis_function = basis_functions[mu];
552 const auto contraction_length = basis_function.length();
553
554 // A basis function (a.k.a. contracted GTO) is a contraction (i.e. a linear combination) of Cartesian GTOs.
555 const auto& contraction_coefficients = basis_function.coefficients();
556 const auto& primitives = basis_function.functions();
557
558 for (size_t d = 0; d < contraction_length; d++) {
559 const auto& contraction_coefficient = contraction_coefficients[d];
560 const auto primitive_gradient = primitives[d].calculatePositionGradient();
561 basis_function_gradients[mu](m).append(contraction_coefficient, primitive_gradient(m));
562 }
563
564 spatial_orbital_gradients[p](m).append(expansion_coefficient, basis_function_gradients[mu](m));
565 }
566 }
567 }
568
569 return spatial_orbital_gradients;
570 }
571
572
576 std::vector<Spinor<ExpansionScalar, BasisFunction>> spinOrbitals() const {
577
578 // The spin-orbitals for a restricted spin-orbital basis can be easily constructed from the spatial orbitals, by assigning a zero component once for the beta component of the spin-orbital and once for the alpha component of the spin-orbital.
579 const auto spatial_orbitals = this->spatialOrbitals();
580
581 std::vector<Spinor<ExpansionScalar, BasisFunction>> spin_orbitals;
582 spin_orbitals.reserve(this->numberOfSpinors());
583 for (const auto& spatial_orbital : spatial_orbitals) {
584
585 // Add the alpha- and beta-spin-orbitals accordingly.
586 const Spinor<ExpansionScalar, BasisFunction> alpha_spin_orbital {spatial_orbital, 0}; // the '0' int literal can be converted to a zero EvaluableLinearCombination
587 spin_orbitals.push_back(alpha_spin_orbital);
588
589 const Spinor<ExpansionScalar, BasisFunction> beta_spin_orbital {0, spatial_orbital};
590 spin_orbitals.push_back(beta_spin_orbital);
591 }
592
593 return spin_orbitals;
594 }
595
596
597 /*
598 * MARK: Mulliken domain
599 */
600
608 RMullikenDomain<ExpansionScalar> mullikenDomain(const std::function<bool(const BasisFunction&)>& selector) const {
609
610 const auto ao_indices = this->scalarBasis().basisFunctionIndices(selector);
611 return RMullikenDomain<ExpansionScalar> {ao_indices, ao_indices.size()};
612 }
613
614
622 RMullikenDomain<ExpansionScalar> mullikenDomain(const std::function<bool(const Shell&)>& selector) const {
623
624 const auto ao_indices = this->scalarBasis().basisFunctionIndices(selector);
625 return RMullikenDomain<ExpansionScalar> {ao_indices, ao_indices.size()};
626 }
627
628
629 /*
630 * MARK: basis function evaluation
631 */
632
639 std::vector<ExpansionScalar> evalBasisSetAtPoint(const GQCP::Vector<double, 3>& r) const {
640 // get the contracted AOs from the scalar basis
641 const auto& AOs = this->scalarBasis().basisFunctions();
642 // init vector in which to gather each AO's value at r
643 std::vector<ExpansionScalar> AO_vals;
644 AO_vals.reserve(this->numberOfSpatialOrbitals()); //n_AO = n_MO
645
646 // loop through AOs
647 for (size_t i= 0; i < this->numberOfSpatialOrbitals(); i++) {
648 // evaluate value at r, put it in vector
649 AO_vals.push_back(AOs[i](r));
650 }
651
652 return AO_vals;
653 }
654
655
662 std::vector<std::vector<ExpansionScalar>> evalGradBasisSetAtPoint(const GQCP::Vector<double, 3>& r) const {
663 // get the contracted AOs from the scalar basis
664 const auto& AOs = this->scalarBasis().basisFunctions();
665 size_t K = AOs.size();
666
667 // prepare return container: K arrays of 3 components
668 std::vector<std::vector<ExpansionScalar>> grad_AO_vals;
669 grad_AO_vals.reserve(K);
670
671 for (size_t i = 0; i < K; ++i) {
672 const auto& basis_function = AOs[i];
673 const auto& contraction_coefficients = basis_function.coefficients();
674 const auto& primitives = basis_function.functions();
675
676 // accumulate gradient in each direction
677 std::vector<ExpansionScalar> sum(3, ExpansionScalar{0});
678 for (size_t d = 0; d < primitives.size(); ++d) {
679 auto c = contraction_coefficients[d];
680 // primitive gradients: a Vector<EvaluableLinearCombination<...>,3>
681 auto prim_grad = primitives[d].calculatePositionGradient();
682
683 for (int dir = 0; dir < 3; ++dir) {
684 // evaluate that linear combination at r
685 sum[dir] += c * prim_grad(dir)(r);
686 }
687 }
688 grad_AO_vals.push_back(sum);
689 }
690
691 return grad_AO_vals;
692 }
693
694};
695
696
697/*
698 * MARK: Convenience aliases
699 */
700template <typename ExpansionScalar, typename Shell>
702
703
704/*
705 * MARK: SpinorBasisTraits
706 */
707
711template <typename _ExpansionScalar, typename _Shell>
712struct SpinorBasisTraits<RSpinOrbitalBasis<_ExpansionScalar, _Shell>> {
713 // The scalar type used to represent an expansion coefficient of the spinors in the underlying scalar orbitals: real or complex.
714 using ExpansionScalar = _ExpansionScalar;
715
716 // The type of transformation that is naturally related to an `RSpinOrbitalBasis`.
718
719 // The second-quantized representation of the overlap operator related to an RSpinOrbitalBasis.
721};
722
723
724/*
725 * MARK: BasisTransformableTraits
726 */
727
731template <typename _ExpansionScalar, typename _Shell>
732struct BasisTransformableTraits<RSpinOrbitalBasis<_ExpansionScalar, _Shell>> {
733
734 // The type of transformation that is naturally related to an `RSpinOrbitalBasis`.
736};
737
738
739/*
740 * MARK: JacobiRotatableTraits
741 */
742
746template <typename _ExpansionScalar, typename _Shell>
747struct JacobiRotatableTraits<RSpinOrbitalBasis<_ExpansionScalar, _Shell>> {
748
749 // The type of Jacobi rotation that is naturally related to an `RSpinOrbitalBasis`.
751};
752
753
754} // namespace GQCP
Definition: AngularMomentumOperator.hpp:35
_Vectorizer Vectorizer
Definition: BaseFQOperator.hpp:48
Definition: CoulombRepulsionOperator.hpp:31
Definition: CurrentDensityMatrixElement.hpp:39
Definition: CurrentDensityOperator.hpp:32
Definition: DenseVectorizer.hpp:49
Definition: DiamagneticOperator.hpp:35
Definition: ElectronicDensityOperator.hpp:31
Definition: EvaluableLinearCombination.hpp:46
Definition: EvaluableRSQOneElectronOperator.hpp:37
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: Function.hpp:49
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: LinearMomentumOperator.hpp:33
Definition: Matrix.hpp:47
Definition: OrbitalZeemanOperator.hpp:35
Definition: RMullikenDomain.hpp:35
Definition: RSQOneElectronOperator.hpp:42
Definition: RSQTwoElectronOperator.hpp:43
Definition: RSpinOrbitalBasis.hpp:63
std::vector< std::vector< ExpansionScalar > > evalGradBasisSetAtPoint(const GQCP::Vector< double, 3 > &r) const
Definition: RSpinOrbitalBasis.hpp:662
RMullikenDomain< ExpansionScalar > mullikenDomain(const std::function< bool(const Shell &)> &selector) const
Definition: RSpinOrbitalBasis.hpp:622
auto quantize(const OrbitalZeemanOperator &op) const -> enable_if_t< std::is_same< Z, LondonGTOShell >::value, RSQOneElectronOperator< product_t< OrbitalZeemanOperator::Scalar, ExpansionScalar >, OrbitalZeemanOperator::Vectorizer > >
Definition: RSpinOrbitalBasis.hpp:367
auto quantize(const CoulombRepulsionOperator &fq_op) const -> enable_if_t< std::is_same< Z, GTOShell >::value, RSQTwoElectronOperator< product_t< CoulombRepulsionOperator::Scalar, ExpansionScalar >, CoulombRepulsionOperator::Vectorizer > >
Definition: RSpinOrbitalBasis.hpp:172
auto quantize(const DiamagneticOperator &op) const -> enable_if_t< std::is_same< Z, LondonGTOShell >::value, RSQOneElectronOperator< product_t< DiamagneticOperator::Scalar, ExpansionScalar >, DiamagneticOperator::Vectorizer > >
Definition: RSpinOrbitalBasis.hpp:384
size_t numberOfSpinors() const
Definition: RSpinOrbitalBasis.hpp:129
_Shell Shell
Definition: RSpinOrbitalBasis.hpp:69
RMullikenDomain< ExpansionScalar > mullikenDomain(const std::function< bool(const BasisFunction &)> &selector) const
Definition: RSpinOrbitalBasis.hpp:608
std::vector< Spinor< ExpansionScalar, BasisFunction > > spinOrbitals() const
Definition: RSpinOrbitalBasis.hpp:576
std::vector< SpatialOrbital > spatialOrbitals() const
Definition: RSpinOrbitalBasis.hpp:504
_ExpansionScalar ExpansionScalar
Definition: RSpinOrbitalBasis.hpp:66
size_t numberOfSpinOrbitals() const
Definition: RSpinOrbitalBasis.hpp:134
auto quantize(const LinearMomentumOperator &fq_one_op) const -> enable_if_t< std::is_same< Z, GTOShell >::value, RSQOneElectronOperator< product_t< LinearMomentumOperator::Scalar, ExpansionScalar >, typename LinearMomentumOperator::Vectorizer > >
Definition: RSpinOrbitalBasis.hpp:235
std::vector< Vector< SpatialOrbitalDerivative, 3 > > spatialOrbitalGradients() const
Definition: RSpinOrbitalBasis.hpp:534
RSQHamiltonian< ExpansionScalar > quantize(const FQMolecularHamiltonian &fq_hamiltonian) const
Definition: RSpinOrbitalBasis.hpp:486
enable_if_t< std::is_same< Z, LondonGTOShell >::value, RSQHamiltonian< ExpansionScalar > > quantize(const FQMolecularMagneticHamiltonian &fq_hamiltonian) const
Definition: RSpinOrbitalBasis.hpp:461
VectorEvaluableRSQOneElectronOperator< CurrentDensityMatrixElement< ExpansionScalar, CartesianGTO > > quantize(const CurrentDensityOperator &fq_current_density_op) const
Definition: RSpinOrbitalBasis.hpp:285
std::vector< ExpansionScalar > evalBasisSetAtPoint(const GQCP::Vector< double, 3 > &r) const
Definition: RSpinOrbitalBasis.hpp:639
size_t numberOfSpatialOrbitals() const
Definition: RSpinOrbitalBasis.hpp:124
auto quantize(const AngularMomentumOperator &fq_one_op) const -> enable_if_t< std::is_same< Z, GTOShell >::value, RSQOneElectronOperator< product_t< AngularMomentumOperator::Scalar, ExpansionScalar >, typename AngularMomentumOperator::Vectorizer > >
Definition: RSpinOrbitalBasis.hpp:208
decltype(std::declval< Primitive >()(std::declval< Vector< double, 3 > >())) PrimitiveScalar
Definition: RSpinOrbitalBasis.hpp:93
auto quantize(const FQOneElectronOperator &fq_one_op) const -> enable_if_t< std::is_same< Z, GTOShell >::value, RSQOneElectronOperator< product_t< typename FQOneElectronOperator::Scalar, ExpansionScalar >, typename FQOneElectronOperator::Vectorizer > >
Definition: RSpinOrbitalBasis.hpp:151
auto quantize(const CoulombRepulsionOperator &fq_op) const -> enable_if_t< std::is_same< Z, LondonGTOShell >::value, RSQTwoElectronOperator< product_t< CoulombRepulsionOperator::Scalar, ExpansionScalar >, CoulombRepulsionOperator::Vectorizer > >
Definition: RSpinOrbitalBasis.hpp:426
auto quantize(const FQOneElectronOperator &fq_one_op) const -> enable_if_t< std::is_same< Z, LondonGTOShell >::value, RSQOneElectronOperator< product_t< typename FQOneElectronOperator::Scalar, ExpansionScalar >, typename FQOneElectronOperator::Vectorizer > >
Definition: RSpinOrbitalBasis.hpp:323
ScalarEvaluableRSQOneElectronOperator< DensityDistribution > quantize(const ElectronicDensityOperator &fq_density_op) const
Definition: RSpinOrbitalBasis.hpp:261
typename Shell::BasisFunction BasisFunction
Definition: RSpinOrbitalBasis.hpp:81
typename Shell::Primitive Primitive
Definition: RSpinOrbitalBasis.hpp:78
Definition: RTransformation.hpp:41
Definition: SQHamiltonian.hpp:54
std::vector< BasisFunction > basisFunctions() const
Definition: ScalarBasis.hpp:150
size_t numberOfBasisFunctions() const
Definition: ScalarBasis.hpp:155
std::vector< size_t > basisFunctionIndices(const std::function< bool(const Shell &)> &selector) const
Definition: ScalarBasis.hpp:164
Definition: SimpleSpinOrbitalBasis.hpp:39
const ScalarBasis< Shell > & scalarBasis() const
Definition: SimpleSpinOrbitalBasis.hpp:133
const Transformation & expansion() const
Definition: SimpleSpinorBasis.hpp:98
Transformation C
Definition: SimpleSpinorBasis.hpp:76
const SquareMatrix< Scalar > & matrix() const
Definition: SimpleTransformation.hpp:168
Definition: Spinor.hpp:34
Definition: SquareMatrix.hpp:39
static Self Zero(const size_t dim)
Definition: SquareRankFourTensor.hpp:147
Definition: StorageArray.hpp:38
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
Definition: BasisTransformable.hpp:37
Definition: JacobiRotatable.hpp:37
_ExpansionScalar ExpansionScalar
Definition: RSpinOrbitalBasis.hpp:714
Definition: SimpleSpinorBasis.hpp:38