def calculate(self, tda=False): electron_energy, orbital_energies, orbital_coefficients = self.hartree_fock.begin_scf() repulsion = spin_basis_set(molecular_orbitals(self.hartree_fock.repulsion, orbital_coefficients)) orbital_energies = spin_orbital_energies(orbital_energies) occupied_orbitals = self.hartree_fock.electrons unoccupied_orbitals = len(orbital_energies) - occupied_orbitals tdhf = TDHFMatrixSymmetryRestricted(repulsion, orbital_energies, occupied_orbitals, unoccupied_orbitals) singlet_a_matrix, singlet_b_matrix = tdhf.create_matrices_singlet() triplet_a_matrix, triplet_b_matrix = tdhf.create_matrices_triplet() if not tda: print('BEGIN TDHF EXCITED STATE CALCULATION\n') singlet_tdhf_matrix = (singlet_a_matrix + singlet_b_matrix) * (singlet_a_matrix - singlet_b_matrix) singlet_excitation_energies = np.linalg.eig(singlet_tdhf_matrix)[0] singlet_excitation_energies = [sqrt(x) for x in singlet_excitation_energies] singlet_excitation_energies.sort() triplet_tdhf_matrix = (triplet_a_matrix + triplet_b_matrix) * (triplet_a_matrix - triplet_b_matrix) triplet_excitation_energies = np.linalg.eig(triplet_tdhf_matrix)[0] triplet_excitation_energies = [sqrt(x) for x in triplet_excitation_energies] triplet_excitation_energies.sort() else: print('BEGIN CIS EXCITED STATE CALCULATION\n') singlet_excitation_energies = np.linalg.eigh(singlet_a_matrix)[0] triplet_excitation_energies = np.linalg.eigh(triplet_a_matrix)[0] print('SINGLET EXCITATION ENERGIES\n{}\n'.format(singlet_excitation_energies)) print('TRIPLET EXCITATION ENERGIES\n{}\n\n'.format(triplet_excitation_energies)) return electron_energy
def __init__(self, hartree_fock, threshold): self.hartree_fock_energy, orbital_energies, orbital_coefficients = hartree_fock.begin_scf() self.repulsion = spin_basis_anti_physicist(molecular_orbitals(hartree_fock.repulsion, orbital_coefficients)) self.orbital_energies = spin_orbital_energies(orbital_energies) self.occupied_orbitals = hartree_fock.electrons self.unoccupied_orbitals = len(self.orbital_energies) - hartree_fock.electrons super().__init__(self.occupied_orbitals, self.unoccupied_orbitals) self.threshold = threshold