def test_create_nuclei_array_returns_array_of_nuclei_with_names(self):
     nuclei_array, electron_count, multiplicity = read_mol_file('HeH+.mol')
     self.assertEquals(nuclei_array[0].element, 'HELIUM')
     self.assertEquals(nuclei_array[1].element, 'HYDROGEN')
 def test_electron_count_return_two(self):
     nuclei_array, electron_count, multiplicity = read_mol_file('HeH+.mol')
     self.assertEquals(electron_count, 2)
 def test_create_nuclei_array_returns_array_of_nuclei_with_mass(self):
     nuclei_array, electron_count, multiplicity = read_mol_file('HeH+.mol')
     self.assertEquals(nuclei_array[0].mass, 4)
     self.assertEquals(nuclei_array[1].mass, 1)
 def test_create_nuclei_array_returns_array_of_nuclei_with_coordinates(self):
     nuclei_array, electron_count, multiplicity = read_mol_file('HeH+.mol')
     testing.assert_array_equal(nuclei_array[0].coordinates, (0.0, 0.0, 0.487732042))
     testing.assert_array_equal(nuclei_array[1].coordinates, (0.0, 0.0, -0.975464083))
Пример #5
0
def start(mol, basis, method, processes, symmetry=False):
    np.set_printoptions(linewidth=100000, threshold=np.inf)
    start_time = time.clock()
    electron_energy = correlation = 0.0

    nuclei_array, electrons, multiplicity = read_mol_file(mol)

    if symmetry:
        molecule = MoleculeFactory().point_group(nuclei_array)
    else:
        molecule = Molecule(nuclei_array, PointGroup([], [], [], [], 'C_{1}'))

    basis_set_array = read_basis_set_file(basis, molecule.nuclei_array)
    symmetry_object = Symmetry(molecule.point_group, basis_set_array)

    coulomb_law_matrix = coulomb_matrix(nuclei_array)
    nuclear_repulsion = coulomb_law_matrix.sum() / 2

    print('\n*************************************************************************************************')
    print('\nA BASIC QUANTUM CHEMICAL PROGRAM IN PYTHON\n\n\n{}'.format([x.element for x in nuclei_array]))
    print('\nNUCLEAR REPULSION ARRAY\n{}'.format(coulomb_law_matrix))

    if method == 'RHF':
        electron_energy = RestrictedHF(molecule.nuclei_array, basis_set_array, electrons, symmetry_object,
        processes).begin_scf()[0]
    if method == 'UHF':
        electron_energy = UnrestrictedHF(molecule.nuclei_array, basis_set_array, electrons, multiplicity,
        symmetry_object, processes).begin_scf()[0]
    if method == 'GUHF':
        electron_energy = BlockedHartreeFock(molecule.nuclei_array, basis_set_array, electrons, multiplicity,
        symmetry_object, processes).begin_scf()[0]
    if method == 'MP2':
        mp2 = MoellerPlesset(
        RestrictedHF(molecule.nuclei_array, basis_set_array, electrons, symmetry_object, processes))
        electron_energy = mp2.hartree_fock_energy
        correlation = mp2.second_order()
    if method == 'TDHF':
        electron_energy = TimeDependentHartreeFock(
        RestrictedHF(molecule.nuclei_array, basis_set_array, electrons, symmetry_object, processes)
        ).calculate(tda=False)
    if method == 'CIS':
        electron_energy = TimeDependentHartreeFock(
        RestrictedHF(molecule.nuclei_array, basis_set_array, electrons, symmetry_object, processes)
        ).calculate(tda=True)
    if method[0] == 'DFT':
        electron_energy = RestrictedKohnSham(molecule.nuclei_array, basis_set_array, electrons,
        symmetry_object, processes, method[1], method[2]).begin_scf()[0]
    if method == 'CCSD':
        ccsd = CoupledClusterSinglesDoubles(
        RestrictedHF(molecule.nuclei_array, basis_set_array, electrons, symmetry_object, processes))
        electron_energy = ccsd.hartree_fock_energy
        correlation = ccsd.calculate_singles_doubles()[0]
    if method == 'CCSD(T)':
        ccsd = CoupledClusterPerturbativeTriples(
        RestrictedHF(molecule.nuclei_array, basis_set_array, electrons, symmetry_object, processes))
        electron_energy = ccsd.hartree_fock_energy
        correlation = ccsd.calculate_perturbative_triples()

    total_energy = electron_energy + nuclear_repulsion + correlation
    print('NUCLEAR REPULSION ENERGY:    ' + str(nuclear_repulsion) + ' a.u.')
    print('SCF ENERGY:                  ' + str(electron_energy) + ' a.u.')
    print('CORRELATION ENERGY:          ' + str(correlation) + ' a.u.')
    print('TOTAL ENERGY:                ' + str(total_energy) + ' a.u.')
    print('\n*************************************************************************************************')
    print('\nTIME TAKEN: ' + str(time.clock() - start_time) + 's')
    print("\nWhat I cannot create I cannot understand - Richard Feynman\n")

    return total_energy