votca 2026-dev
Loading...
Searching...
No Matches
orbitals.h
Go to the documentation of this file.
1
2/*
3 * Copyright 2009-2023 The VOTCA Development Team
4 * (http://www.votca.org)
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License")
7 *
8 * You may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 */
20
21#pragma once
22#ifndef VOTCA_XTP_ORBITALS_H
23#define VOTCA_XTP_ORBITALS_H
24
25// VOTCA includes
26#include <votca/tools/globals.h>
28
29// Local VOTCA includes
30#include "aobasis.h"
31#include "checkpoint.h"
32#include "classicalsegment.h"
33#include "eigen.h"
34#include "qmmolecule.h"
35#include "qmstate.h"
36
37namespace votca {
38namespace xtp {
39
47class Orbitals {
48 public:
50 Orbitals();
51
53 bool hasBasisSetSize() const {
54 return (dftbasis_.AOBasisSize() > 0) ? true : false;
55 }
56
59
62
64 void setTruncMOsFullBasis(const Eigen::MatrixXd &expandedMOs) {
65 expandedMOs_ = expandedMOs;
66 }
67
69 const Eigen::MatrixXd getTruncMOsFullBasis() const { return expandedMOs_; }
70
72 Index getBasisSetSize() const { return dftbasis_.AOBasisSize(); }
73
78 }
79 return occupied_levels_;
80 }
81
83 Index getHomoAlpha() const { return getLumoAlpha() - 1; }
84
88 if (number_beta_electrons_ > 0) {
90 }
91
92 // Legacy restricted closed-shell fallback
93 if (!hasUnrestrictedOrbitals() && total_spin_ == 1) {
94 return occupied_levels_;
95 }
96
98 }
99
101 Index getHomoBeta() const { return getLumoBeta() - 1; }
102
103 // Current generic convention: use alpha frontier orbitals
105 Index getLumo() const { return getLumoAlpha(); }
107 Index getHomo() const { return getHomoAlpha(); }
108
109 // access to DFT number of levels, new, tested
111 bool hasNumberOfLevels() const {
112 return ((occupied_levels_ > 0) ? true : false);
113 }
114
117 return ((occupied_levels_beta_ > 0) ? true : false);
118 }
119
122 void setNumberOfOccupiedLevels(Index occupied_levels) {
123 occupied_levels_ = occupied_levels;
124
125 // Backward compatibility for legacy restricted/singlet workflows:
126 // many callers only set occupied_levels_ and expect a closed-shell density.
127 if (!hasUnrestrictedOrbitals() && total_spin_ == 1) {
128 number_alpha_electrons_ = occupied_levels;
129 number_beta_electrons_ = occupied_levels;
130 }
131 }
132
134 void setNumberOfOccupiedLevelsBeta(Index occupied_levels_beta) {
135 occupied_levels_beta_ = occupied_levels_beta;
136 }
137
140 number_alpha_electrons_ = electrons;
141 }
142
145 number_beta_electrons_ = electrons;
146 }
147
148 // access to DFT number of electrons, new, tested
151 return (number_alpha_electrons_ > 0) ? true : false;
152 }
153
155 return (number_beta_electrons_ > 0) ? true : false;
156 }
157
162
164 bool hasECPName() const { return (ECP_ != "") ? true : false; }
165
167 const std::string &getECPName() const { return ECP_; };
168
170 void setECPName(const std::string &ECP) { ECP_ = ECP; };
171
172 // access to QM package name, new, tested
173
175 bool hasQMpackage() const { return (!qm_package_.empty()); }
176
178 const std::string &getQMpackage() const { return qm_package_; }
179
181 void setQMpackage(const std::string &qmpackage) { qm_package_ = qmpackage; }
182
183 // access to DFT molecular orbital energies, new, tested
185 bool hasMOs() const { return (mos_.eigenvalues().size() > 0) ? true : false; }
187 bool hasBetaMOs() const {
188 return (mos_beta_.eigenvalues().size() > 0) ? true : false;
189 }
190
192 const tools::EigenSystem &MOs() const { return mos_; }
195
197 const Eigen::MatrixXd &Occupations() const { return occupations_; }
199 Eigen::MatrixXd &Occupations() { return occupations_; }
200
202 const tools::EigenSystem &MOs_beta() const { return mos_beta_; }
205
206 // determine (pseudo-)degeneracy of a DFT molecular orbital
209 std::vector<Index> CheckDegeneracy(Index level,
210 double energy_difference) const;
211
214 switch (type.Type()) {
216 return Index(BSE_singlet_.eigenvalues().size());
217 break;
219 return Index(BSE_triplet_.eigenvalues().size());
220 break;
222 return Index(mos_.eigenvalues().size());
223 break;
225 return Index(QPpert_energies_.size());
226 break;
228 return Index(QPdiag_.eigenvalues().size());
229 break;
231 return Index(BSE_uks_.eigenvalues().size());
232 break;
233 default:
234 return 1;
235 break;
236 }
237 }
238
240 void setCalculationType(std::string CalcType) { CalcType_ = CalcType; }
242 std::string getCalculationType() const { return CalcType_; }
243
246 void setChargeAndSpin(Index charge, Index spin) {
247 total_charge_ = charge;
248 total_spin_ = spin;
249 }
250
252 Index getSpin() const { return total_spin_; }
254 Index getCharge() const { return total_charge_; }
256 bool isOpenShell() const { return (total_spin_ > 1) ? true : false; }
257
259 bool hasQMAtoms() const { return (atoms_.size() > 0) ? true : false; }
260
262 const QMMolecule &QMAtoms() const { return atoms_; }
263
265 QMMolecule &QMAtoms() { return atoms_; }
266
268 void updateAtomPostion(Index atom_index, Eigen::Vector3d new_position) {
269 this->QMAtoms()[atom_index].setPos(new_position);
270 dftbasis_.UpdateShellPositions(this->QMAtoms());
271 auxbasis_.UpdateShellPositions(this->QMAtoms());
272 }
273
276 void setXCFunctionalName(std::string functionalname) {
277 functionalname_ = functionalname;
278 }
279
280 const std::string &getXCFunctionalName() const { return functionalname_; }
281
283 void setXCGrid(std::string grid) { grid_quality_ = grid; }
285 const std::string &getXCGrid() const { return grid_quality_; }
286
287 // access to QM total energy, new, tested
289 bool hasQMEnergy() const { return (qm_energy_ != 0.0) ? true : false; }
290
292 double getDFTTotalEnergy() const { return qm_energy_; }
293
295 void setQMEnergy(double qmenergy) { qm_energy_ = qmenergy; }
296
297 // access to nuclear forces (gradient of total energy w.r.t. nuclear
298 // coordinates), Natoms x 3, atomic units (Hartree/Bohr), consistent
299 // with QMAtom::pos_ being stored in Bohr.
301 bool hasForces() const { return forces_.rows() > 0; }
302
305 bool hasPolarizability() const { return polarizability_.size() == 9; }
306 Eigen::Matrix3d getPolarizability() const {
307 if (!hasPolarizability()) {
308 throw std::runtime_error("Orbitals: no polarizability stored");
309 }
310 return polarizability_;
311 }
312 void setPolarizability(const Eigen::Matrix3d &alpha) {
313 polarizability_ = alpha;
314 }
315 void clearPolarizability() { polarizability_.resize(0, 0); }
316
318 const Eigen::MatrixXd &getForces() const { return forces_; }
319
323 void setForces(const Eigen::MatrixXd &forces) { forces_ = forces; }
324
325 // access to DFT basis set name
327 bool hasDFTbasisName() const {
328 return (!dftbasis_.Name().empty()) ? true : false;
329 }
330
332 const std::string &getDFTbasisName() const { return dftbasis_.Name(); }
333
335 void SetupDftBasis(std::string basis_name);
336
339 void SetupAuxBasis(std::string aux_basis_name);
340
342 const AOBasis &getDftBasis() const {
343 if (dftbasis_.AOBasisSize() == 0) {
344 throw std::runtime_error(
345 "Requested the DFT basis, but no basis is present. Make sure "
346 "SetupDftBasis is called.");
347 } else {
348 return dftbasis_;
349 }
350 }
351
353 const AOBasis &getAuxBasis() const {
354 if (auxbasis_.AOBasisSize() == 0) {
355 throw std::runtime_error(
356 "Requested the Aux basis, but no basis is present. Make sure "
357 "SetupAuxBasis is called.");
358 } else {
359 return auxbasis_;
360 }
361 }
362
363 /*
364 * ======= GW-BSE related functions =======
365 */
366
367 // access to auxiliary basis set name
368
370 bool hasAuxbasisName() const {
371 return (!auxbasis_.Name().empty()) ? true : false;
372 }
373
375 const std::string getAuxbasisName() const { return auxbasis_.Name(); }
376
377 // access to list of indices used in GWA
378
380 bool hasGWAindices() const { return (qpmax_ > 0) ? true : false; }
381
383 void setGWindices(Index qpmin, Index qpmax) {
384 qpmin_ = qpmin;
385 qpmax_ = qpmax;
386 }
387
389 Index getGWAmin() const { return qpmin_; }
390
392 Index getGWAmax() const { return qpmax_; }
393
394 // access to list of indices used in RPA
395
397 bool hasRPAindices() const { return (rpamax_ > 0) ? true : false; }
398
400 void setRPAindices(Index rpamin, Index rpamax) {
401 rpamin_ = rpamin;
402 rpamax_ = rpamax;
403 }
404
406 Index getRPAmin() const { return rpamin_; }
407
409 Index getRPAmax() const { return rpamax_; }
410
411 // access to list of indices used in BSE
412
414 void setTDAApprox(bool usedTDA) { useTDA_ = usedTDA; }
416 bool getTDAApprox() const { return useTDA_; }
417
419 bool hasBSEindices() const { return (bse_cmax_ > 0) ? true : false; }
420
423 void setBSEindices(Index vmin, Index cmax) {
424 bse_vmin_ = vmin;
425 bse_vmax_ = getHomo();
426 bse_cmin_ = getLumo();
427 bse_cmax_ = cmax;
431 return;
432 }
433
435 Index getBSEvmin() const { return bse_vmin_; }
436
438 Index getBSEvmax() const { return bse_vmax_; }
439
441 Index getBSEcmin() const { return bse_cmin_; }
442
444 Index getBSEcmax() const { return bse_cmax_; }
445
447 double getScaHFX() const { return ScaHFX_; }
448
450 void setScaHFX(double ScaHFX) { ScaHFX_ = ScaHFX; }
451
452 // access to perturbative QP energies
454 bool hasRPAInputEnergies() const { return (rpa_inputenergies_.size() > 0); }
455
457 const Eigen::VectorXd &RPAInputEnergies() const { return rpa_inputenergies_; }
458
460 Eigen::VectorXd &RPAInputEnergies() { return rpa_inputenergies_; }
461
462 // access to RPA input energies energies
464 bool hasQPpert() const {
465 return (QPpert_energies_.size() > 0) ? true : false;
466 }
467
469 const Eigen::VectorXd &QPpertEnergies() const { return QPpert_energies_; }
470
472 Eigen::VectorXd &QPpertEnergies() { return QPpert_energies_; }
473
474 // access to diagonalized QP energies and wavefunctions
475
478 bool hasQPdiag() const {
479 return (QPdiag_.eigenvalues().size() > 0) ? true : false;
480 }
481
482 const tools::EigenSystem &QPdiag() const { return QPdiag_; }
485
489 Eigen::MatrixXd BSEOrbitals() const;
490
492 bool hasBSETriplets() const {
493 return (BSE_triplet_.eigenvectors().cols() > 0) ? true : false;
494 }
495
497 const tools::EigenSystem &BSETriplets() const { return BSE_triplet_; }
498
501
502 // access to singlet energies and wave function coefficients
503
505 bool hasBSESinglets() const {
506 return (BSE_singlet_.eigenvectors().cols() > 0) ? true : false;
507 }
508
510 const tools::EigenSystem &BSESinglets() const { return BSE_singlet_; }
511
514
515 // access to BSE energies with dynamical screening
518 return (BSE_singlet_energies_dynamic_.size() > 0) ? true : false;
519 }
520
522 const Eigen::VectorXd &BSESinglets_dynamic() const {
524 }
525
527 Eigen::VectorXd &BSESinglets_dynamic() {
529 }
530
533 return (BSE_triplet_energies_dynamic_.size() > 0) ? true : false;
534 }
535
537 const Eigen::VectorXd &BSETriplets_dynamic() const {
539 }
540
542 Eigen::VectorXd &BSETriplets_dynamic() {
544 }
545
549 Eigen::VectorXd &BSESinglets_dynamic_change() {
551 }
552 const Eigen::VectorXd &BSESinglets_dynamic_change() const {
554 }
555 Eigen::VectorXd &BSETriplets_dynamic_change() {
557 }
558 const Eigen::VectorXd &BSETriplets_dynamic_change() const {
560 }
564 const Eigen::VectorXd &BSESinglets_dynamic_iterations() const {
566 }
570 const Eigen::VectorXd &BSETriplets_dynamic_iterations() const {
572 }
573
574 // access to transition dipole moments
575
577 bool hasTransitionDipoles() const {
578 return (transition_dipoles_.size() > 0) ? true : false;
579 }
580
582 const std::vector<Eigen::Vector3d> &TransitionDipoles() const {
583 return transition_dipoles_;
584 }
585
588 Eigen::VectorXd Oscillatorstrengths() const;
589
591 Eigen::VectorXd Oscillatorstrengths(const QMStateType &type) const;
592
594 Eigen::Vector3d CalcElDipole(const QMState &state) const;
595
596 // Calculates full electron density for state or transition density, if you
597 // want to calculate only the density contribution of hole or electron use
598 // DensityMatrixExcitedState
601 Eigen::MatrixXd DensityMatrixFull(const QMState &state) const;
604 Eigen::MatrixXd DensityMatrixWithoutGS(const QMState &state) const;
605
606 // functions for calculating density matrices
608 Eigen::MatrixXd DensityMatrixGroundState() const;
610 std::array<Eigen::MatrixXd, 2> DensityMatrixExcitedState(
611 const QMState &state) const;
613 Eigen::MatrixXd DensityMatrixQuasiParticle(const QMState &state) const;
615 Eigen::MatrixXd DensityMatrixKSstate(const QMState &state) const;
617 Eigen::MatrixXd CalculateQParticleAORepresentation() const;
619 double getTotalStateEnergy(const QMState &state) const; // Hartree
621 double getExcitedStateEnergy(const QMState &state) const; // Hartree
622
625 void OrderMOsbyEnergy();
626
635
638
641 void PrepareDimerGuess(const Orbitals &orbitalsA, const Orbitals &orbitalsB);
642
668 void PrepareDimerGuessMixedSpin(const Orbitals &orbitalsA,
669 const Orbitals &orbitalsB);
670
674
677
679 void WriteToCpt(const std::string &filename) const;
680
682 void ReadFromCpt(const std::string &filename);
683
685 void WriteToCpt(CheckpointWriter &w) const;
693
696 bool GetFlagUseHqpOffdiag() const { return use_Hqp_offdiag_; };
699 void SetFlagUseHqpOffdiag(bool flag) { use_Hqp_offdiag_ = flag; };
700
704 bool isQSGW() const { return is_qsgw_; };
705 void setQSGW(bool flag) { is_qsgw_ = flag; };
706
708 const Eigen::MatrixXd &getLMOs() const { return lmos_; };
710 void setLMOs(const Eigen::MatrixXd &matrix) { lmos_ = matrix; }
711
713 const Eigen::VectorXd &getLMOs_energies() const { return lmos_energies_; };
715 void setLMOs_energies(const Eigen::VectorXd &energies) {
716 lmos_energies_ = energies;
717 }
718
722 void setNumofActiveElectrons(const Index active_electrons) {
723 active_electrons_ = active_electrons;
724 }
725
727 const Eigen::MatrixXd &getInactiveDensity() const { return inactivedensity_; }
729 void setInactiveDensity(Eigen::MatrixXd inactivedensity) {
730 inactivedensity_ = inactivedensity;
731 }
732
733 /************************************
734 * Extensions spin DFT
735 *************************************/
737 bool hasUnrestrictedOrbitals() const { return hasBetaMOs(); }
738
741 return total_spin_ > 1 && !hasUnrestrictedOrbitals();
742 }
743
747 return total_spin_ > 1 && hasUnrestrictedOrbitals();
748 }
749
751 std::array<Eigen::MatrixXd, 2> DensityMatrixGroundStateSpinResolved() const;
752
753 /************************************
754 * Extensions spin GW
755 *************************************/
757 return (rpa_inputenergies_alpha_.size() > 0);
758 }
760 return (rpa_inputenergies_beta_.size() > 0);
761 }
762 const Eigen::VectorXd &RPAInputEnergiesAlpha() const {
764 }
765 const Eigen::VectorXd &RPAInputEnergiesBeta() const {
767 }
768 Eigen::VectorXd &RPAInputEnergiesAlpha() { return rpa_inputenergies_alpha_; }
769 Eigen::VectorXd &RPAInputEnergiesBeta() { return rpa_inputenergies_beta_; }
770
771 bool hasQPpertAlpha() const { return (QPpert_energies_alpha_.size() > 0); }
772 bool hasQPpertBeta() const { return (QPpert_energies_beta_.size() > 0); }
773 const Eigen::MatrixXd &QPpertEnergiesAlpha() const {
775 }
776 const Eigen::MatrixXd &QPpertEnergiesBeta() const {
778 }
779 Eigen::MatrixXd &QPpertEnergiesAlpha() { return QPpert_energies_alpha_; }
780 Eigen::MatrixXd &QPpertEnergiesBeta() { return QPpert_energies_beta_; }
781
782 bool hasQPdiagAlpha() const {
783 return (QPdiag_alpha_.eigenvalues().size() > 0);
784 }
785 bool hasQPdiagBeta() const { return (QPdiag_beta_.eigenvalues().size() > 0); }
787 const tools::EigenSystem &QPdiagBeta() const { return QPdiag_beta_; }
790
794 bool hasBSEUKS() const {
795 return (BSE_uks_.eigenvectors().cols() > 0) ? true : false;
796 }
797 const tools::EigenSystem &BSEUKS() const { return BSE_uks_; }
799
800 bool hasBSEUKS_dynamic() const {
801 return (BSE_uks_energies_dynamic_.size() > 0) ? true : false;
802 }
803 const Eigen::VectorXd &BSEUKS_dynamic() const {
805 }
806 Eigen::VectorXd &BSEUKS_dynamic() { return BSE_uks_energies_dynamic_; }
807
808 private:
809 std::array<Eigen::MatrixXd, 3> CalcFreeTransition_Dipoles() const;
810
811 // returns indeces of a re-sorted vector of energies from lowest to highest
812 std::vector<Index> SortEnergies();
813
814 // Same as SortEnergies, but for the ALPHA channel specifically -- unlike
815 // SortEnergies (which throws for hasUnrestrictedOrbitals()==true), this
816 // and SortEnergiesBeta below are meant to be called ON an unrestricted
817 // system, one channel at a time. Used by OrderMOsbyEnergyAlpha.
818 std::vector<Index> SortEnergiesAlpha();
819
820 // Same as SortEnergiesAlpha, but sorting mos_beta_.eigenvalues() instead.
821 // Used by OrderMOsbyEnergyBeta.
822 std::vector<Index> SortEnergiesBeta();
823
824 void WriteToCpt(CheckpointFile &f) const;
825
827 Eigen::MatrixXd TransitionDensityMatrix(const QMState &state) const;
828 std::array<Eigen::MatrixXd, 2> DensityMatrixExcitedState_R(
829 const QMState &state) const;
830 std::array<Eigen::MatrixXd, 2> DensityMatrixExcitedState_AR(
831 const QMState &state) const;
832 Eigen::MatrixXd CalcAuxMat_cc(const Eigen::VectorXd &coeffs) const;
833 Eigen::MatrixXd CalcAuxMat_vv(const Eigen::VectorXd &coeffs) const;
834
839 std::string ECP_ = "";
841
842 std::string CalcType_ = "NoEmbedding";
843
846 Eigen::MatrixXd occupations_;
847
849
850 Eigen::MatrixXd lmos_;
851 Eigen::VectorXd lmos_energies_;
853 Eigen::MatrixXd inactivedensity_;
854 Eigen::MatrixXd expandedMOs_;
855
857
860
861 double qm_energy_ = 0;
862 // Natoms x 3, Hartree/Bohr; empty (rows()==0) means "not computed",
863 // matching the pattern of qm_energy_'s hasQMEnergy() check above but
864 // via emptiness rather than a sentinel value, since 0.0 is a
865 // legitimate force value on any individual component in a way it isn't
866 // for a total energy.
867 Eigen::MatrixXd forces_;
868 Eigen::MatrixXd polarizability_; // 3x3 if set
869
872
873 // new variables for GW-BSE storage
876
886
887 double ScaHFX_ = 0;
888
889 std::string functionalname_ = "";
890 std::string grid_quality_ = "";
891 std::string qm_package_ = "";
892
893 Eigen::VectorXd rpa_inputenergies_;
894 // perturbative quasiparticle energies
895 Eigen::VectorXd QPpert_energies_;
896
897 // quasiparticle energies and coefficients after diagonalization
899
901 std::vector<Eigen::Vector3d> transition_dipoles_;
903
904 // singlet and triplet energies after perturbative dynamical screening
911
912 bool use_Hqp_offdiag_ = false;
913 bool is_qsgw_ = false; // true if QP data comes from a QSGW calculation
914
915 // Spin-GW additions
917 Eigen::VectorXd rpa_inputenergies_beta_;
918
919 Eigen::MatrixXd QPpert_energies_alpha_;
920 Eigen::MatrixXd QPpert_energies_beta_;
921
924
927
928 // Version 2: adds BSE energies after perturbative dynamical screening
929 // Version 3: changed shell ordering
930 // Version 4: added vxc grid quality
931 // Version 5: added the dft and aux basisset
932 // Version 6: added spin in dft
933 // Version 9: added is_qsgw flag
934 static constexpr int orbitals_version() { return 9; }
935};
936
937} // namespace xtp
938} // namespace votca
939
940#endif // VOTCA_XTP_ORBITALS_H
Container to hold Basisfunctions for all atoms.
Definition aobasis.h:42
Container for molecular orbitals and derived one-particle data.
Definition orbitals.h:47
tools::EigenSystem QPdiag_alpha_
Definition orbitals.h:922
Index getBSEvmax() const
Return the highest valence orbital included in BSE.
Definition orbitals.h:438
const Eigen::MatrixXd getTruncMOsFullBasis() const
Return truncated active-region orbitals represented in the full AO basis.
Definition orbitals.h:69
void setScaHFX(double ScaHFX)
Store the fraction of exact exchange associated with the functional.
Definition orbitals.h:450
const Eigen::VectorXd & BSEUKS_dynamic() const
Definition orbitals.h:803
const Eigen::VectorXd & BSESinglets_dynamic_iterations() const
Definition orbitals.h:564
void setCalculationType(std::string CalcType)
Store the calculation-type tag used by downstream workflows.
Definition orbitals.h:240
Eigen::VectorXd & RPAInputEnergiesBeta()
Definition orbitals.h:769
const tools::EigenSystem & BSETriplets() const
Return read-only access to triplet BSE eigenpairs.
Definition orbitals.h:497
bool GetFlagUseHqpOffdiag() const
Definition orbitals.h:696
Index getNumOfActiveElectrons()
Return the number of electrons assigned to the active region.
Definition orbitals.h:720
Index number_beta_electrons_
Definition orbitals.h:838
void CalcCoupledTransition_Dipoles()
Definition orbitals.cc:774
bool hasQPdiag() const
Definition orbitals.h:478
Index getCharge() const
Return the stored total charge.
Definition orbitals.h:254
bool hasPolarizability() const
Definition orbitals.h:305
Eigen::MatrixXd occupations_
Definition orbitals.h:846
bool hasQPpertAlpha() const
Definition orbitals.h:771
Index getBSEcmin() const
Return the lowest conduction orbital included in BSE.
Definition orbitals.h:441
bool hasRPAindices() const
Report whether the RPA window has been defined.
Definition orbitals.h:397
Eigen::VectorXd rpa_inputenergies_
Definition orbitals.h:893
const tools::EigenSystem & QPdiag() const
Return read-only access to the diagonalized quasiparticle representation.
Definition orbitals.h:482
Index getHomo() const
Return the default HOMO index used by spin-agnostic callers.
Definition orbitals.h:107
Eigen::MatrixXd & QPpertEnergiesBeta()
Definition orbitals.h:780
void clearPolarizability()
Definition orbitals.h:315
Eigen::VectorXd BSE_uks_energies_dynamic_
Definition orbitals.h:926
Eigen::MatrixXd TransitionDensityMatrix(const QMState &state) const
Definition orbitals.cc:331
double getDFTTotalEnergy() const
Return the stored total DFT energy.
Definition orbitals.h:292
bool hasBSESinglets_dynamic() const
Report whether dynamically screened singlet BSE energies are available.
Definition orbitals.h:517
void setInactiveDensity(Eigen::MatrixXd inactivedensity)
Store the inactive-region density matrix used in embedding workflows.
Definition orbitals.h:729
Eigen::VectorXd & BSEUKS_dynamic()
Definition orbitals.h:806
bool hasBSEindices() const
Report whether the BSE valence/conduction window has been defined.
Definition orbitals.h:419
bool hasAuxbasisName() const
Report whether an auxiliary basis-set name has been stored.
Definition orbitals.h:370
Index getSpin() const
Return the stored spin multiplicity.
Definition orbitals.h:252
Eigen::MatrixXd CalculateQParticleAORepresentation() const
Transform quasiparticle amplitudes into the AO representation.
Definition orbitals.cc:265
bool hasForces() const
Report whether nuclear forces have been stored.
Definition orbitals.h:301
Eigen::MatrixXd & QPpertEnergiesAlpha()
Definition orbitals.h:779
std::array< Eigen::MatrixXd, 2 > DensityMatrixExcitedState_R(const QMState &state) const
Definition orbitals.cc:551
const tools::EigenSystem & MOs_beta() const
Return read-only access to beta-spin molecular orbitals.
Definition orbitals.h:202
void setNumofActiveElectrons(const Index active_electrons)
Store the number of electrons assigned to the active region.
Definition orbitals.h:722
bool hasUnrestrictedOrbitals() const
Report whether separate beta-spin orbitals are present.
Definition orbitals.h:737
Eigen::VectorXd lmos_energies_
Definition orbitals.h:851
const tools::EigenSystem & BSESinglets() const
Return read-only access to singlet BSE eigenpairs.
Definition orbitals.h:510
Index getBSEcmax() const
Return the highest conduction orbital included in BSE.
Definition orbitals.h:444
Eigen::VectorXd & BSESinglets_dynamic()
Return writable access to dynamically screened singlet BSE energies.
Definition orbitals.h:527
const Eigen::VectorXd & QPpertEnergies() const
Return read-only access to perturbative quasiparticle energies.
Definition orbitals.h:469
bool getTDAApprox() const
Return whether the Tamm-Dancoff approximation is enabled.
Definition orbitals.h:416
tools::EigenSystem BSE_singlet_
Definition orbitals.h:900
tools::EigenSystem QPdiag_beta_
Definition orbitals.h:923
void OrderMOsbyEnergyBeta()
Same as OrderMOsbyEnergyAlpha, but for the BETA channel (mos_beta_).
Definition orbitals.cc:947
void PrepareDimerGuess(const Orbitals &orbitalsA, const Orbitals &orbitalsB)
Guess for a dimer based on monomer orbitals.
Definition orbitals.cc:966
bool hasNumberOfLevelsBeta() const
Definition orbitals.h:116
tools::EigenSystem mos_beta_
Definition orbitals.h:845
tools::EigenSystem & QPdiagAlpha()
Definition orbitals.h:788
std::string grid_quality_
Definition orbitals.h:890
bool hasMOs() const
Report whether alpha/restricted molecular orbitals are available.
Definition orbitals.h:185
Eigen::VectorXd & BSESinglets_dynamic_iterations()
Definition orbitals.h:561
void setTruncMOsFullBasis(const Eigen::MatrixXd &expandedMOs)
Store truncated active-region orbitals expanded back to the full AO basis.
Definition orbitals.h:64
bool hasBSESinglets() const
Report whether singlet BSE eigenpairs are available.
Definition orbitals.h:505
double getTotalStateEnergy(const QMState &state) const
Return the absolute total energy of the requested state in Hartree.
Definition orbitals.cc:690
Eigen::VectorXd BSE_triplet_energies_dynamic_
Definition orbitals.h:906
bool hasQPpertBeta() const
Definition orbitals.h:772
const Eigen::MatrixXd & Occupations() const
Return the stored fractional occupation matrix.
Definition orbitals.h:197
void ReadBasisSetsFromCpt(CheckpointReader &r)
Deserialize attached AO basis sets from an already-open checkpoint reader.
Definition orbitals.cc:1239
std::array< Eigen::MatrixXd, 2 > DensityMatrixGroundStateSpinResolved() const
Definition orbitals.cc:1410
Eigen::MatrixXd QPpert_energies_beta_
Definition orbitals.h:920
void WriteBasisSetsToCpt(CheckpointWriter &w) const
Definition orbitals.cc:1132
tools::EigenSystem & QPdiagBeta()
Definition orbitals.h:789
bool hasRPAInputEnergies() const
Report whether RPA input energies are available.
Definition orbitals.h:454
bool isRestrictedOpenShell() const
Report whether the orbitals represent a restricted open-shell reference.
Definition orbitals.h:740
std::vector< Index > CheckDegeneracy(Index level, double energy_difference) const
Definition orbitals.cc:56
Eigen::VectorXd BSE_singlet_dynamic_iterations_
Definition orbitals.h:909
tools::EigenSystem & BSETriplets()
Return writable access to triplet BSE eigenpairs.
Definition orbitals.h:500
const AOBasis & getAuxBasis() const
Return the auxiliary AO basis, throwing if it has not been initialized.
Definition orbitals.h:353
Eigen::MatrixXd inactivedensity_
Definition orbitals.h:853
Index getNumberOfAlphaElectrons() const
Return the stored number of alpha electrons.
Definition orbitals.h:159
void setLMOs_energies(const Eigen::VectorXd &energies)
Store the energies associated with localized molecular orbitals.
Definition orbitals.h:715
std::string getCalculationType() const
Return the stored calculation-type tag.
Definition orbitals.h:242
Eigen::Matrix3d getPolarizability() const
Definition orbitals.h:306
bool hasQMAtoms() const
Report whether a molecular geometry has been stored.
Definition orbitals.h:259
std::array< Eigen::MatrixXd, 3 > CalcFreeTransition_Dipoles() const
Definition orbitals.cc:756
void setLMOs(const Eigen::MatrixXd &matrix)
Store localized molecular orbitals.
Definition orbitals.h:710
bool hasNumberOfBetaElectrons() const
Report whether the beta-electron count has been set explicitly.
Definition orbitals.h:154
const std::string & getQMpackage() const
Return the stored QM package name.
Definition orbitals.h:178
QMMolecule & QMAtoms()
Return writable access to the molecular geometry.
Definition orbitals.h:265
Eigen::MatrixXd forces_
Definition orbitals.h:867
const Eigen::MatrixXd & QPpertEnergiesBeta() const
Definition orbitals.h:776
Eigen::MatrixXd CalcAuxMat_cc(const Eigen::VectorXd &coeffs) const
Definition orbitals.cc:599
void setRPAindices(Index rpamin, Index rpamax)
Store the orbital window used in RPA calculations.
Definition orbitals.h:400
bool hasNumberOfLevels() const
Report whether the number of occupied spatial orbitals has been set.
Definition orbitals.h:111
Eigen::VectorXd BSE_triplet_dynamic_change_
Definition orbitals.h:908
Eigen::MatrixXd polarizability_
Definition orbitals.h:868
Eigen::MatrixXd expandedMOs_
Definition orbitals.h:854
void setNumberOfAlphaElectrons(Index electrons)
Store the total number of alpha electrons.
Definition orbitals.h:139
Index getBSEvmin() const
Return the lowest valence orbital included in BSE.
Definition orbitals.h:435
bool isQSGW() const
Definition orbitals.h:704
void updateAtomPostion(Index atom_index, Eigen::Vector3d new_position)
Update one atomic position and keep attached AO basis shells synchronized.
Definition orbitals.h:268
const tools::EigenSystem & BSEUKS() const
Definition orbitals.h:797
Eigen::VectorXd & RPAInputEnergies()
Return writable access to the RPA input energies.
Definition orbitals.h:460
Eigen::VectorXd Oscillatorstrengths() const
Definition orbitals.cc:657
std::vector< Eigen::Vector3d > transition_dipoles_
Definition orbitals.h:901
const tools::EigenSystem & QPdiagAlpha() const
Definition orbitals.h:786
static constexpr int orbitals_version()
Definition orbitals.h:934
std::string functionalname_
Definition orbitals.h:889
Eigen::MatrixXd lmos_
Definition orbitals.h:850
Eigen::MatrixXd & Occupations()
Return writable access to the fractional occupation matrix.
Definition orbitals.h:199
Eigen::MatrixXd DensityMatrixWithoutGS(const QMState &state) const
Definition orbitals.cc:121
bool hasGWAindices() const
Report whether the GW quasiparticle window has been defined.
Definition orbitals.h:380
tools::EigenSystem & MOs()
Return writable access to alpha/restricted molecular orbitals.
Definition orbitals.h:194
bool hasQMEnergy() const
Report whether a total electronic energy has been stored.
Definition orbitals.h:289
Eigen::MatrixXd DensityMatrixFull(const QMState &state) const
Definition orbitals.cc:150
bool hasTransitionDipoles() const
Report whether transition dipole moments have been computed.
Definition orbitals.h:577
const Eigen::MatrixXd & getLMOs() const
Return localized molecular orbitals, if available.
Definition orbitals.h:708
Eigen::MatrixXd CalcAuxMat_vv(const Eigen::VectorXd &coeffs) const
Definition orbitals.cc:593
tools::EigenSystem & MOs_beta()
Return writable access to beta-spin molecular orbitals.
Definition orbitals.h:204
tools::EigenSystem & QPdiag()
Return writable access to the diagonalized quasiparticle representation.
Definition orbitals.h:484
void PrepareDimerGuessMixedSpin(const Orbitals &orbitalsA, const Orbitals &orbitalsB)
Guess for a dimer of two monomers with independently ARBITRARY charge and spin, built by combining ea...
Definition orbitals.cc:1046
void SetupAuxBasis(std::string aux_basis_name)
Definition orbitals.cc:108
std::string qm_package_
Definition orbitals.h:891
Index getLumoAlpha() const
Return the alpha-spin LUMO index inferred from the stored electron counts.
Definition orbitals.h:75
void setNumberOfBetaElectrons(Index electrons)
Store the total number of beta electrons.
Definition orbitals.h:144
tools::EigenSystem BSE_triplet_
Definition orbitals.h:902
Index getRPAmax() const
Return the upper RPA orbital index.
Definition orbitals.h:409
bool hasBSEUKS() const
Definition orbitals.h:794
void setBSEindices(Index vmin, Index cmax)
Definition orbitals.h:423
bool hasBasisSetSize() const
Report whether a DFT AO basis has already been attached.
Definition orbitals.h:53
const Eigen::MatrixXd & getInactiveDensity() const
Return the inactive-region density matrix used in embedding workflows.
Definition orbitals.h:727
void setGWindices(Index qpmin, Index qpmax)
Store the orbital window used in GW calculations.
Definition orbitals.h:383
std::vector< Index > SortEnergies()
Definition orbitals.cc:81
Index getHomoBeta() const
Return the beta-spin HOMO index.
Definition orbitals.h:101
std::array< Eigen::MatrixXd, 2 > DensityMatrixExcitedState_AR(const QMState &state) const
Definition orbitals.cc:605
bool hasQMpackage() const
Report whether the originating QM package name has been stored.
Definition orbitals.h:175
double getExcitedStateEnergy(const QMState &state) const
Return the excitation energy of the requested state in Hartree.
Definition orbitals.cc:699
bool isUnrestrictedOpenShell() const
Definition orbitals.h:746
tools::EigenSystem & BSESinglets()
Return writable access to singlet BSE eigenpairs.
Definition orbitals.h:513
void setForces(const Eigen::MatrixXd &forces)
Definition orbitals.h:323
bool hasRPAInputEnergiesBeta() const
Definition orbitals.h:759
void setECPName(const std::string &ECP)
Store the effective core potential label.
Definition orbitals.h:170
void setXCGrid(std::string grid)
Store the numerical XC grid quality label.
Definition orbitals.h:283
void setNumberOfOccupiedLevels(Index occupied_levels)
Definition orbitals.h:122
const std::vector< Eigen::Vector3d > & TransitionDipoles() const
Return the stored transition dipole moments.
Definition orbitals.h:582
Index occupied_levels_beta_
Definition orbitals.h:836
Orbitals()
Construct an empty orbital container with default metadata.
Definition orbitals.cc:46
tools::EigenSystem mos_
Definition orbitals.h:844
const Eigen::VectorXd & BSETriplets_dynamic_iterations() const
Definition orbitals.h:570
void OrderMOsbyEnergyAlpha()
Definition orbitals.cc:935
tools::EigenSystem QPdiag_
Definition orbitals.h:898
Eigen::VectorXd rpa_inputenergies_beta_
Definition orbitals.h:917
const Eigen::MatrixXd & QPpertEnergiesAlpha() const
Definition orbitals.h:773
bool hasBSETriplets() const
Report whether triplet BSE eigenpairs are available.
Definition orbitals.h:492
void setQSGW(bool flag)
Definition orbitals.h:705
Eigen::MatrixXd DensityMatrixKSstate(const QMState &state) const
Build the AO density matrix for a single KS orbital state.
Definition orbitals.cc:232
bool hasBSETriplets_dynamic() const
Report whether dynamically screened triplet BSE energies are available.
Definition orbitals.h:532
const std::string getAuxbasisName() const
Return the auxiliary basis-set name.
Definition orbitals.h:375
Eigen::MatrixXd DensityMatrixQuasiParticle(const QMState &state) const
Build the AO density matrix for a quasiparticle state.
Definition orbitals.cc:280
const Eigen::VectorXd & BSETriplets_dynamic_change() const
Definition orbitals.h:558
bool hasQPpert() const
Report whether perturbative quasiparticle energies are available.
Definition orbitals.h:464
double getScaHFX() const
Return the fraction of exact exchange associated with the functional.
Definition orbitals.h:447
Index getBasisSetSize() const
Return the number of AO basis functions in the DFT basis.
Definition orbitals.h:72
void setQMEnergy(double qmenergy)
Store the total DFT energy.
Definition orbitals.h:295
std::vector< Index > SortEnergiesBeta()
Definition orbitals.cc:925
Eigen::VectorXd & BSETriplets_dynamic_iterations()
Definition orbitals.h:567
Eigen::VectorXd BSE_singlet_dynamic_change_
Definition orbitals.h:907
const Eigen::VectorXd & RPAInputEnergies() const
Return read-only access to the RPA input energies.
Definition orbitals.h:457
Eigen::VectorXd & RPAInputEnergiesAlpha()
Definition orbitals.h:768
Eigen::MatrixXd QPpert_energies_alpha_
Definition orbitals.h:919
Eigen::MatrixXd BSEOrbitals() const
Definition orbitals.cc:250
const std::string & getXCGrid() const
Return the numerical XC grid quality label.
Definition orbitals.h:285
Eigen::VectorXd BSE_singlet_energies_dynamic_
Definition orbitals.h:905
Index getGWAmin() const
Return the lower GW orbital index.
Definition orbitals.h:389
bool hasRPAInputEnergiesAlpha() const
Definition orbitals.h:756
Eigen::VectorXd & QPpertEnergies()
Return writable access to perturbative quasiparticle energies.
Definition orbitals.h:472
bool hasECPName() const
Report whether an effective core potential label has been stored.
Definition orbitals.h:164
const Eigen::VectorXd & BSETriplets_dynamic() const
Return dynamically screened triplet BSE energies.
Definition orbitals.h:537
const tools::EigenSystem & MOs() const
Return read-only access to alpha/restricted molecular orbitals.
Definition orbitals.h:192
void setQMpackage(const std::string &qmpackage)
Store the name of the QM package that produced these orbitals.
Definition orbitals.h:181
Eigen::VectorXd & BSETriplets_dynamic()
Return writable access to dynamically screened triplet BSE energies.
Definition orbitals.h:542
Eigen::MatrixXd DensityMatrixGroundState() const
Build the ground-state AO density matrix from the stored orbitals.
Definition orbitals.cc:220
std::string CalcType_
Definition orbitals.h:842
Index getLumoBeta() const
Definition orbitals.h:87
const QMMolecule & QMAtoms() const
Return read-only access to the molecular geometry.
Definition orbitals.h:262
tools::EigenSystem mos_embedding_
Definition orbitals.h:848
const std::string & getXCFunctionalName() const
Return the exchange-correlation functional label.
Definition orbitals.h:280
Eigen::VectorXd rpa_inputenergies_alpha_
Definition orbitals.h:916
bool hasQPdiagBeta() const
Definition orbitals.h:785
std::vector< Index > SortEnergiesAlpha()
Definition orbitals.cc:913
Index getGWAmax() const
Return the upper GW orbital index.
Definition orbitals.h:392
void SetFlagUseHqpOffdiag(bool flag)
Definition orbitals.h:699
void ReadFromCpt(const std::string &filename)
Read the orbital container from a checkpoint file on disk.
Definition orbitals.cc:1226
void setEmbeddedMOs(tools::EigenSystem &system)
Store molecular orbitals obtained from an embedding calculation.
Definition orbitals.h:58
tools::EigenSystem BSE_uks_
Definition orbitals.h:925
void setNumberOfOccupiedLevelsBeta(Index occupied_levels_beta)
Store the number of occupied beta-spin orbitals.
Definition orbitals.h:134
const tools::EigenSystem & QPdiagBeta() const
Definition orbitals.h:787
void setChargeAndSpin(Index charge, Index spin)
Definition orbitals.h:246
Eigen::VectorXd & BSESinglets_dynamic_change()
Definition orbitals.h:549
const Eigen::VectorXd & RPAInputEnergiesBeta() const
Definition orbitals.h:765
Eigen::VectorXd QPpert_energies_
Definition orbitals.h:895
void WriteToCpt(const std::string &filename) const
Write the orbital container to a checkpoint file on disk.
Definition orbitals.cc:1119
bool hasDFTbasisName() const
Report whether a DFT basis-set name has been stored.
Definition orbitals.h:327
const std::string & getECPName() const
Return the effective core potential label.
Definition orbitals.h:167
const std::string & getDFTbasisName() const
Return the DFT basis-set name.
Definition orbitals.h:332
bool hasBetaMOs() const
Report whether beta-spin molecular orbitals are available.
Definition orbitals.h:187
void SetupDftBasis(std::string basis_name)
Build and attach the DFT AO basis from the stored molecular geometry.
Definition orbitals.cc:99
void setTDAApprox(bool usedTDA)
Enable or disable the Tamm-Dancoff approximation flag.
Definition orbitals.h:414
const Eigen::VectorXd & RPAInputEnergiesAlpha() const
Definition orbitals.h:762
tools::EigenSystem & BSEUKS()
Definition orbitals.h:798
std::array< Eigen::MatrixXd, 2 > DensityMatrixExcitedState(const QMState &state) const
Build separate hole and electron AO densities for an excited state.
Definition orbitals.cc:429
bool isOpenShell() const
Report whether the stored state corresponds to an open-shell system.
Definition orbitals.h:256
void setPolarizability(const Eigen::Matrix3d &alpha)
Definition orbitals.h:312
const Eigen::VectorXd & BSESinglets_dynamic() const
Return dynamically screened singlet BSE energies.
Definition orbitals.h:522
Eigen::VectorXd & BSETriplets_dynamic_change()
Definition orbitals.h:555
std::string ECP_
Definition orbitals.h:839
Index number_alpha_electrons_
Definition orbitals.h:837
const tools::EigenSystem & getEmbeddedMOs() const
Return molecular orbitals obtained from an embedding calculation.
Definition orbitals.h:61
Index NumberofStates(QMStateType type) const
Return the number of states available for the requested state family.
Definition orbitals.h:213
Index getRPAmin() const
Return the lower RPA orbital index.
Definition orbitals.h:406
const Eigen::MatrixXd & getForces() const
Return the stored nuclear forces (Natoms x 3, Hartree/Bohr).
Definition orbitals.h:318
Eigen::Vector3d CalcElDipole(const QMState &state) const
Compute the electronic dipole moment associated with a state density.
Definition orbitals.cc:303
Index getNumberOfBetaElectrons() const
Return the stored number of beta electrons.
Definition orbitals.h:161
Eigen::VectorXd BSE_triplet_dynamic_iterations_
Definition orbitals.h:910
Index getHomoAlpha() const
Return the alpha-spin HOMO index.
Definition orbitals.h:83
const AOBasis & getDftBasis() const
Return the DFT AO basis, throwing if it has not been initialized.
Definition orbitals.h:342
const Eigen::VectorXd & getLMOs_energies() const
Return the energies associated with localized molecular orbitals.
Definition orbitals.h:713
QMMolecule atoms_
Definition orbitals.h:856
bool hasQPdiagAlpha() const
Definition orbitals.h:782
const Eigen::VectorXd & BSESinglets_dynamic_change() const
Definition orbitals.h:552
bool hasNumberOfAlphaElectrons() const
Report whether the alpha-electron count has been set explicitly.
Definition orbitals.h:150
Index getLumo() const
Return the default LUMO index used by spin-agnostic callers.
Definition orbitals.h:105
bool hasBSEUKS_dynamic() const
Definition orbitals.h:800
void setXCFunctionalName(std::string functionalname)
Definition orbitals.h:276
statetype Type() const
Definition qmstate.h:53
Identifier for QMstates. Strings like S1 are converted into enum +zero indexed int.
Definition qmstate.h:135
Provides a means for comparing floating point numbers.
Definition basebead.h:33
Eigen::Index Index
Definition types.h:26