Source code for cosymlib.molecule.electronic_structure

from cosymlib.molecule.electronic_structure.protoelectronic_structure import ProtoElectronicDensity
from cosymlib.molecule.electronic_structure.protoelectronic_structure import ProtoElectronicStructure
HARTREE_TO_EV = 27.21139563180092


[docs]class ElectronicStructure: """ This class contains basically the access to electronic structure data :param basis: The basis set :type basis: dict :param orbital_coefficients: Molecular orbital coefficients :type orbital_coefficients: list :param multiplicity: The multiplicity :type multiplicity: int :param alpha_energies: Alpha molecular orbital energies in Hartree :type alpha_energies: list :param beta_energies: Beta molecular orbital energies in Hartree :type beta_energies: list :param alpha_occupancy: Occupancy of alpha orbitals :type alpha_occupancy: list :param beta_occupancy: Occupancy of beta orbitals :type beta_occupancy: list """ def __init__(self, basis, orbital_coefficients, multiplicity=None, alpha_energies=None, beta_energies=None, alpha_occupancy=None, beta_occupancy=None): self._multiplicity = multiplicity self._basis = basis self._Ca = orbital_coefficients[0] if len(orbital_coefficients[1]) == 0: self._Cb = orbital_coefficients[0] else: self._Cb = orbital_coefficients[1] self._alpha_energies = [energy * HARTREE_TO_EV for energy in alpha_energies] if len(beta_energies) == 0: self._beta_energies = [energy * HARTREE_TO_EV for energy in alpha_energies] else: self._beta_energies = [energy * HARTREE_TO_EV for energy in beta_energies] self._alpha_occupancy = alpha_occupancy self._beta_occupancy = beta_occupancy self._occupancy_consistency() self._total_electrons = sum(self._alpha_occupancy) + sum(self._beta_occupancy) s = abs(sum([a_electron - self._beta_occupancy[ida] for ida, a_electron in enumerate(self._alpha_occupancy)])) self._s2 = s * (s + 1) if self._multiplicity is None: self._recalculate_spin() def set_occupancy(self, occupancy): self.set_alpha_occupancy(occupancy) self.set_beta_occupancy(occupancy) def set_alpha_occupancy(self, occupancy): if len(occupancy) > len(self._Ca): raise IndexError('Alpha occupancy list do not match with molecular orbitals') self._alpha_occupancy = occupancy self._occupancy_consistency() self._recalculate_spin() def set_beta_occupancy(self, occupancy): if len(occupancy) > len(self._Cb): raise IndexError('Beta occupancy list do not match with molecular orbitals') self._beta_occupancy = occupancy self._occupancy_consistency() self._recalculate_spin() def _recalculate_spin(self): s = abs(sum([a_electron - self._beta_occupancy[ida] for ida, a_electron in enumerate(self._alpha_occupancy)])) self._multiplicity = s + 1 self._s2 = s * (s + 1) def _occupancy_consistency(self): if len(self._alpha_occupancy) < len(self._Ca): for i in range(len(self._Ca) - len(self._alpha_occupancy)): self._alpha_occupancy.append(0) if len(self._beta_occupancy) < len(self._Cb): for i in range(len(self._Cb) - len(self._beta_occupancy)): self._beta_occupancy.append(0) @property def multiplicity(self): """ get the multiplicity :return: the multiplicity """ return self._multiplicity @property def s2(self): """ get the expected value of spin square operator S2 = (s * (s + 1)) :return: S2 """ return self._s2 @property def basis(self): """ get the basis set name :return: basis set """ return self._basis @property def coefficients_a(self): """ get the alpha molecular orbitals coefficients :return: the alpha molecular orbitals """ return self._Ca @property def coefficients_b(self): """ get the beta molecular orbitals coefficients :return: the beta molecular orbitals """ return self._Cb @property def alpha_energies(self): """ get the energies of the alpha molecular orbitals :return: the energies """ return self._alpha_energies @property def beta_energies(self): """ get the energies of the beta molecular orbitals :return: the energies """ return self._beta_energies @property def alpha_occupancy(self): return self._alpha_occupancy @property def beta_occupancy(self): return self._beta_occupancy @property def alpha_electrons(self): """ get the number of alpha electrons :return: alpha electrons """ return sum(self._alpha_occupancy) @property def beta_electrons(self): """ get the number of beta electrons :return: beta electrons """ return sum(self._beta_occupancy)