diff --git a/README.rst b/README.rst index 5519597..758d9a9 100644 --- a/README.rst +++ b/README.rst @@ -3,6 +3,21 @@ FermiLib plugin to interface with Psi4 This repository contains a plugin which allows `FermiLib `__ (licensed under Apache 2) to interface with the open-source quantum chemistry package `Psi4 `__ (licensed under GNU Lesser General Public License version 3). +Installation +------------ + +To install this plugin, clone this git repo and then change directory to the top level folder. Then, run + +.. code-block:: bash + + python -m pip install -e . + +Alternatively, one can install using pip with the command + +.. code-block:: bash + + python -m pip install fermilibpluginpsi4 + License ------- Copyright (C) 2017 FermiLib Developers diff --git a/examples/generate_data.py b/examples/generate_data.py new file mode 100644 index 0000000..e54058f --- /dev/null +++ b/examples/generate_data.py @@ -0,0 +1,82 @@ +# FermiLib plugin to interface with Psi4 +# Copyright (C) 2017 FermiLib Developers +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +"""This is a simple script for generating data.""" +import os + +from fermilib.utils import (make_atomic_ring, + make_atom, + MolecularData, + periodic_table) + +from fermilibpluginpsi4 import run_psi4 + + +if __name__ == '__main__': + + # Set chemical parameters. + basis = 'sto-3g' + max_electrons = 10 + spacing = 0.7414 + compute_elements = 0 + + # Select calculations. + force_recompute = 1 + run_scf = 1 + run_mp2 = 1 + run_cisd = 1 + run_ccsd = 1 + run_fci = 1 + verbose = 1 + tolerate_error = 1 + + # Generate data. + for n_electrons in range(2, max_electrons + 1): + + # Initialize. + if compute_elements: + atomic_symbol = periodic_table[n_electrons] + molecule = make_atom(atomic_symbol, basis) + else: + molecule = make_atomic_ring(n_electrons, spacing, basis) + if os.path.exists(molecule.filename + '.hdf5'): + molecule.load() + + # To run or not to run. + if run_scf and not molecule.hf_energy: + run_job = 1 + elif run_mp2 and not molecule.mp2_energy: + run_job = 1 + elif run_cisd and not molecule.cisd_energy: + run_job = 1 + elif run_ccsd and not molecule.ccsd_energy: + run_job = 1 + elif run_fci and not molecule.fci_energy: + run_job = 1 + else: + run_job = force_recompute + + # Run. + if run_job: + molecule = run_psi4(molecule, + run_scf=run_scf, + run_mp2=run_mp2, + run_cisd=run_cisd, + run_ccsd=run_ccsd, + run_fci=run_fci, + verbose=verbose, + tolerate_error=tolerate_error) + molecule.save() diff --git a/examples/generate_diatomic.py b/examples/generate_diatomic.py new file mode 100644 index 0000000..9fdf95f --- /dev/null +++ b/examples/generate_diatomic.py @@ -0,0 +1,86 @@ +# FermiLib plugin to interface with Psi4 +# Copyright (C) 2017 FermiLib Developers +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +"""This is a simple script for generating data.""" +import os + +from fermilib.utils import MolecularData + +from fermilibpluginpsi4 import run_psi4 + +if __name__ == '__main__': + + # Set chemical parameters. + element_names = ['H', 'H'] + basis = 'sto-3g' + charge = 0 + multiplicity = 1 + + # Single point at equilibrium for testing + spacings = [0.7414] + + # Add points for a full dissociation curve from 0.1 to 3.0 angstroms + spacings += [0.1 * r for r in range(1, 31)] + + # Set run options + run_scf = 1 + run_mp2 = 1 + run_cisd = 1 + run_ccsd = 1 + run_fci = 1 + verbose = 1 + tolerate_error = 1 + + # Run Diatomic Curve + for spacing in spacings: + description = "{}".format(spacing) + geometry = [[element_names[0], [0, 0, 0]], + [element_names[1], [0, 0, spacing]]] + molecule = MolecularData(geometry, + basis, + multiplicity, + charge, + description) + + molecule = run_psi4(molecule, + run_scf=run_scf, + run_mp2=run_mp2, + run_cisd=run_cisd, + run_ccsd=run_ccsd, + run_fci=run_fci, + verbose=verbose, + tolerate_error=tolerate_error) + molecule.save() + + # Run Li H single point + description = "1.45" + geometry = [['Li', [0, 0, 0]], + ['H', [0, 0, 1.45]]] + molecule = MolecularData(geometry, + basis, + multiplicity, + charge, + description) + + molecule = run_psi4(molecule, + run_scf=run_scf, + run_mp2=run_mp2, + run_cisd=run_cisd, + run_ccsd=run_ccsd, + run_fci=run_fci, + verbose=verbose, + tolerate_error=tolerate_error) + molecule.save() \ No newline at end of file diff --git a/examples/plotter.py b/examples/plotter.py new file mode 100644 index 0000000..1c71a33 --- /dev/null +++ b/examples/plotter.py @@ -0,0 +1,113 @@ +# FermiLib plugin to interface with Psi4 +# Copyright (C) 2017 FermiLib Developers +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +"""These functions compare properties of different molecules.""" +import numpy +import warnings + +from fermilib.utils import (make_atom, make_atomic_ring, + MolecularData, periodic_table) + +with warnings.catch_warnings(): + warnings.simplefilter('ignore') + import pylab + + +def latex_name(molecule): + """Write the name of the molecule in LaTeX. + + Returns: + name: A string giving the name in LaTeX. + """ + # Get sorted atom vector. + atoms = [item[0] for item in molecule.geometry] + atom_charge_info = [(atom, atoms.count(atom)) for atom in set(atoms)] + sorted_info = sorted(atom_charge_info, + key=lambda atom: molecular_data. + _PERIODIC_HASH_TABLE[atom[0]]) + + # Name molecule and return. + name = '{}$_{}$'.format(sorted_info[0][0], sorted_info[0][1]) + for info in sorted_info[1::]: + name += '{}$_{}$'.format(info[0], info[1]) + return name + + +# Run. +if __name__ == '__main__': + + # Set plot parameters. + pylab.rcParams['text.usetex'] = True + pylab.rcParams['text.latex.unicode'] = True + pylab.rc('text', usetex=True) + pylab.rc('font', family='sans=serif') + marker_size = 6 + line_width = 2 + axis_size = 12 + font_size = 16 + x_log = 0 + y_log = 0 + + # Set chemical series parameters. + plot_elements = 0 + max_electrons = 10 + spacing = 0.7414 + basis = 'sto-3g' + + # Get chemical series. + molecular_series = [] + for n_electrons in range(2, max_electrons + 1): + if plot_elements: + atomic_symbol = periodic_table[n_electrons] + molecule = make_atom(atomic_symbol, basis) + else: + molecule = make_atomic_ring(n_electrons, spacing, basis) + molecule.load() + molecular_series += [molecule] + + # Get plot data. + x_values = [] + y_values = [] + for molecule in molecular_series: + + # x-axis. + x_label = 'Number of Electrons' + x_values += [molecule.n_electrons] + + # y-axis. + y_label = 'MP2 Energy' + y_values += [molecule.mp2_energy] + + # Print. + print('\n{} for {} = {}.'.format(x_label, molecule.name, x_values[-1])) + print('{} for {} = {}.'.format(y_label, molecule.name, y_values[-1])) + + # Plot. + pylab.figure(0) + pylab.plot(x_values, y_values, lw=0, marker='o') + + # Set log scales. + if y_log: + pylab.yscale('log') + if x_log: + pylab.xscale('log') + + # Finish making the plot. + pylab.xticks(size=axis_size) + pylab.yticks(size=axis_size) + pylab.xlabel(r'%s' % x_label, fontsize=font_size) + pylab.ylabel(r'%s' % y_label, fontsize=font_size) + pylab.show() diff --git a/examples/psi4_demo.ipynb b/examples/psi4_demo.ipynb index 491c52e..f2d6617 100755 --- a/examples/psi4_demo.ipynb +++ b/examples/psi4_demo.ipynb @@ -11,14 +11,12 @@ "\n", "To use this plugin, you will need to personally download psi4. Python code in psi4_template instructs psi4 (not python) to load the MolecularData object, populate it with information from calculations and then save the MolecularData object as an HDF5. The module run_psi4 uses subprocess to actually run_psi4 and then loads the pickled MolecularData. Let us look at a simple example where we compute the energy of H$_2$ at various bond lengths.\n", "\n", - "Warnings: electronic structure calculations are finicky. They sometimes fail for surprising reasons. If a particular calculation is not converging it is probably necessary to change some of the SCF options set in psi4_template. See the Psi4 documentation for more information or consult and electronic structure theory expert.\n", - "\n", - "Note finally that there is also a script to use pyscf in this repo. Integration with pyscf is not complete so use at your own risk." + "Warnings: electronic structure calculations are finicky. They sometimes fail for surprising reasons. If a particular calculation is not converging it is probably necessary to change some of the SCF options set in psi4_template. See the Psi4 documentation for more information or consult and electronic structure theory expert." ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -26,92 +24,92 @@ "output_type": "stream", "text": [ "\n", - "At bond length of 0.2 Bohr, molecular hydrogen has:\n", - "Hartree-Fock energy of 0.1641558779392942 Hartree.\n", - "MP2 energy of 0.15902385897340335 Hartree.\n", - "FCI energy of 0.1574821241424691 Hartree.\n", + "At bond length of 0.2 angstrom, molecular hydrogen has:\n", + "Hartree-Fock energy of 0.164175001415 Hartree.\n", + "MP2 energy of 0.159042663261 Hartree.\n", + "FCI energy of 0.157482124142 Hartree.\n", "Nuclear repulsion energy between protons is 2.64588604295 Hartree.\n", - "Spatial orbital 0 has energy of -0.85884365079039 Hartree.\n", - "Spatial orbital 1 has energy of 1.572449495506951 Hartree.\n", + "Spatial orbital 0 has energy of -0.858824527315 Hartree.\n", + "Spatial orbital 1 has energy of 1.57236203029 Hartree.\n", "\n", - "At bond length of 0.4 Bohr, molecular hydrogen has:\n", - "Hartree-Fock energy of -0.9043953123281971 Hartree.\n", - "MP2 energy of -0.911467754694884 Hartree.\n", - "FCI energy of -0.9141497082141274 Hartree.\n", - "Nuclear repulsion energy between protons is 1.322943021475 Hartree.\n", - "Spatial orbital 0 has energy of -0.7452464479052874 Hartree.\n", - "Spatial orbital 1 has energy of 1.167776648029189 Hartree.\n", + "At bond length of 0.4 angstrom, molecular hydrogen has:\n", + "Hartree-Fock energy of -0.904361397714 Hartree.\n", + "MP2 energy of -0.9114367297 Hartree.\n", + "FCI energy of -0.914149708214 Hartree.\n", + "Nuclear repulsion energy between protons is 1.32294302147 Hartree.\n", + "Spatial orbital 0 has energy of -0.745212533291 Hartree.\n", + "Spatial orbital 1 has energy of 1.16741639504 Hartree.\n", "\n", - "At bond length of 0.6000000000000001 Bohr, molecular hydrogen has:\n", - "Hartree-Fock energy of -1.1011793445775693 Hartree.\n", - "MP2 energy of -1.1113798775246235 Hartree.\n", - "FCI energy of -1.1162860078265324 Hartree.\n", - "Nuclear repulsion energy between protons is 0.8819620143166668 Hartree.\n", - "Spatial orbital 0 has energy of -0.640927365839849 Hartree.\n", - "Spatial orbital 1 has energy of 0.8382934397898524 Hartree.\n", + "At bond length of 0.6 angstrom, molecular hydrogen has:\n", + "Hartree-Fock energy of -1.10112824314 Hartree.\n", + "MP2 energy of -1.11133176748 Hartree.\n", + "FCI energy of -1.11628600783 Hartree.\n", + "Nuclear repulsion energy between protons is 0.881962014317 Hartree.\n", + "Spatial orbital 0 has energy of -0.640876264399 Hartree.\n", + "Spatial orbital 1 has energy of 0.838084978149 Hartree.\n", "\n", - "At bond length of 0.8 Bohr, molecular hydrogen has:\n", - "Hartree-Fock energy of -1.110918875412235 Hartree.\n", - "MP2 energy of -1.125517302745064 Hartree.\n", - "FCI energy of -1.1341476663578607 Hartree.\n", - "Nuclear repulsion energy between protons is 0.6614715107375 Hartree.\n", - "Spatial orbital 0 has energy of -0.5545643581907187 Hartree.\n", - "Spatial orbital 1 has energy of 0.612776410591467 Hartree.\n", + "At bond length of 0.8 angstrom, molecular hydrogen has:\n", + "Hartree-Fock energy of -1.11085039699 Hartree.\n", + "MP2 energy of -1.12545309198 Hartree.\n", + "FCI energy of -1.13414766636 Hartree.\n", + "Nuclear repulsion energy between protons is 0.661471510737 Hartree.\n", + "Spatial orbital 0 has energy of -0.554495879764 Hartree.\n", + "Spatial orbital 1 has energy of 0.612618083493 Hartree.\n", "\n", - "At bond length of 1.0 Bohr, molecular hydrogen has:\n", - "Hartree-Fock energy of -1.0661936970704187 Hartree.\n", - "MP2 energy of -1.086742793881516 Hartree.\n", - "FCI energy of -1.1011503293035885 Hartree.\n", + "At bond length of 1.0 angstrom, molecular hydrogen has:\n", + "Hartree-Fock energy of -1.06610864808 Hartree.\n", + "MP2 energy of -1.08666480357 Hartree.\n", + "FCI energy of -1.1011503293 Hartree.\n", "Nuclear repulsion energy between protons is 0.52917720859 Hartree.\n", - "Spatial orbital 0 has energy of -0.4845267279502007 Hartree.\n", - "Spatial orbital 1 has energy of 0.45764406664496715 Hartree.\n", + "Spatial orbital 0 has energy of -0.484441678962 Hartree.\n", + "Spatial orbital 1 has energy of 0.457501936164 Hartree.\n", "\n", - "At bond length of 1.2000000000000002 Bohr, molecular hydrogen has:\n", - "Hartree-Fock energy of -1.005201854187592 Hartree.\n", - "MP2 energy of -1.0337457589181585 Hartree.\n", - "FCI energy of -1.0567407451325903 Hartree.\n", - "Nuclear repulsion energy between protons is 0.4409810071583334 Hartree.\n", - "Spatial orbital 0 has energy of -0.4265977900276036 Hartree.\n", - "Spatial orbital 1 has energy of 0.34424909086732186 Hartree.\n", + "At bond length of 1.2 angstrom, molecular hydrogen has:\n", + "Hartree-Fock energy of -1.00510670488 Hartree.\n", + "MP2 energy of -1.03366209661 Hartree.\n", + "FCI energy of -1.05674074513 Hartree.\n", + "Nuclear repulsion energy between protons is 0.440981007158 Hartree.\n", + "Spatial orbital 0 has energy of -0.426502640723 Hartree.\n", + "Spatial orbital 1 has energy of 0.344126878784 Hartree.\n", "\n", - "At bond length of 1.4000000000000001 Bohr, molecular hydrogen has:\n", - "Hartree-Fock energy of -0.9415807727061606 Hartree.\n", - "MP2 energy of -0.980650948280493 Hartree.\n", - "FCI energy of -1.0154682481426915 Hartree.\n", - "Nuclear repulsion energy between protons is 0.3779837204214286 Hartree.\n", - "Spatial orbital 0 has energy of -0.3774229438915012 Hartree.\n", - "Spatial orbital 1 has energy of 0.25900471560908955 Hartree.\n", + "At bond length of 1.4 angstrom, molecular hydrogen has:\n", + "Hartree-Fock energy of -0.941480652784 Hartree.\n", + "MP2 energy of -0.980568732859 Hartree.\n", + "FCI energy of -1.01546824814 Hartree.\n", + "Nuclear repulsion energy between protons is 0.377983720421 Hartree.\n", + "Spatial orbital 0 has energy of -0.377322823969 Hartree.\n", + "Spatial orbital 1 has energy of 0.258901972313 Hartree.\n", "\n", - "At bond length of 1.6 Bohr, molecular hydrogen has:\n", - "Hartree-Fock energy of -0.8818353849537497 Hartree.\n", - "MP2 energy of -0.9343173778082237 Hartree.\n", - "FCI energy of -0.9834727280932716 Hartree.\n", - "Nuclear repulsion energy between protons is 0.33073575536875 Hartree.\n", - "Spatial orbital 0 has energy of -0.3353992875908116 Hartree.\n", - "Spatial orbital 1 has energy of 0.19468565861959788 Hartree.\n", + "At bond length of 1.6 angstrom, molecular hydrogen has:\n", + "Hartree-Fock energy of -0.881732447952 Hartree.\n", + "MP2 energy of -0.934241169572 Hartree.\n", + "FCI energy of -0.983472728093 Hartree.\n", + "Nuclear repulsion energy between protons is 0.330735755369 Hartree.\n", + "Spatial orbital 0 has energy of -0.335296350589 Hartree.\n", + "Spatial orbital 1 has energy of 0.1945979554 Hartree.\n", "\n", - "At bond length of 1.8 Bohr, molecular hydrogen has:\n", - "Hartree-Fock energy of -0.8289518481024154 Hartree.\n", - "MP2 energy of -0.8979454626073924 Hartree.\n", - "FCI energy of -0.961816952119916 Hartree.\n", - "Nuclear repulsion energy between protons is 0.29398733810555555 Hartree.\n", - "Spatial orbital 0 has energy of -0.2996669223412511 Hartree.\n", - "Spatial orbital 1 has energy of 0.14603876496061327 Hartree.\n", + "At bond length of 1.8 angstrom, molecular hydrogen has:\n", + "Hartree-Fock energy of -0.828848145985 Hartree.\n", + "MP2 energy of -0.897880538041 Hartree.\n", + "FCI energy of -0.96181695212 Hartree.\n", + "Nuclear repulsion energy between protons is 0.293987338106 Hartree.\n", + "Spatial orbital 0 has energy of -0.299563220223 Hartree.\n", + "Spatial orbital 1 has energy of 0.145960296625 Hartree.\n", "\n", - "At bond length of 2.0 Bohr, molecular hydrogen has:\n", - "Hartree-Fock energy of -0.7838924536817647 Hartree.\n", - "MP2 energy of -0.8725561380421281 Hartree.\n", - "FCI energy of -0.9486411117424073 Hartree.\n", + "At bond length of 2.0 angstrom, molecular hydrogen has:\n", + "Hartree-Fock energy of -0.783792652466 Hartree.\n", + "MP2 energy of -0.872510060481 Hartree.\n", + "FCI energy of -0.948641111742 Hartree.\n", "Nuclear repulsion energy between protons is 0.264588604295 Hartree.\n", - "Spatial orbital 0 has energy of -0.2695590236598946 Hartree.\n", - "Spatial orbital 1 has energy of 0.10906868098620753 Hartree.\n" + "Spatial orbital 0 has energy of -0.269459222444 Hartree.\n", + "Spatial orbital 1 has energy of 0.108997368132 Hartree.\n" ] }, { "data": { - "image/png": "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\nlP8PNn8Mh+m1n+QAAAAASUVORK5CYII=\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -120,7 +118,7 @@ ], "source": [ "from fermilib.utils import MolecularData\n", - "from fermilibpluginpsi4.run_psi4 import run_psi4\n", + "from fermilibpluginpsi4 import run_psi4\n", "\n", "# Set molecule parameters.\n", "basis = 'sto-3g'\n", @@ -158,7 +156,7 @@ " run_fci=run_fci)\n", "\n", " # Print out some results of calculation.\n", - " print('\\nAt bond length of {} Bohr, molecular hydrogen has:'.format(\n", + " print('\\nAt bond length of {} angstrom, molecular hydrogen has:'.format(\n", " bond_length))\n", " print('Hartree-Fock energy of {} Hartree.'.format(molecule.hf_energy))\n", " print('MP2 energy of {} Hartree.'.format(molecule.mp2_energy))\n", @@ -179,7 +177,7 @@ "plt.plot(bond_lengths, fci_energies, 'x-')\n", "plt.plot(bond_lengths, hf_energies, 'o-')\n", "plt.ylabel('Energy in Hartree')\n", - "plt.xlabel('Bond length in Bohr')\n", + "plt.xlabel('Bond length in angstrom')\n", "plt.show()" ] } @@ -204,5 +202,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 1 } diff --git a/fermilibpluginpsi4/__init__.py b/fermilibpluginpsi4/__init__.py index 2403ef8..40d36a1 100644 --- a/fermilibpluginpsi4/__init__.py +++ b/fermilibpluginpsi4/__init__.py @@ -17,5 +17,5 @@ """ FermiLib plugin to interface with Psi4 """ - +from ._run_psi4 import run_psi4 from ._version import __version__ diff --git a/fermilibpluginpsi4/_psi4_conversion_functions.py b/fermilibpluginpsi4/_psi4_conversion_functions.py index 9059e30..bfed61e 100755 --- a/fermilibpluginpsi4/_psi4_conversion_functions.py +++ b/fermilibpluginpsi4/_psi4_conversion_functions.py @@ -209,52 +209,48 @@ def beta_unoccupied(i): # Store singles for entry in T1IA_Amps: i, a, value = entry - single_amplitudes[alpha_occupied(i), - alpha_unoccupied(a)] = value + single_amplitudes[alpha_unoccupied(a), + alpha_occupied(i)] = value if (restricted): - single_amplitudes[beta_occupied(i), - beta_unoccupied(a)] = value + single_amplitudes[beta_unoccupied(a), + beta_occupied(i)] = value for entry in T1ia_Amps: i, a, value = entry - single_amplitudes[beta_occupied(i), - beta_unoccupied(a)] = value + single_amplitudes[beta_unoccupied(a), + beta_occupied(i)] = value # Store doubles, include factor of 1/2 for convention for entry in T2IJAB_Amps: i, j, a, b, value = entry - double_amplitudes[alpha_occupied(i), - alpha_unoccupied(a), - alpha_occupied(j), - alpha_unoccupied(b)] = -value / 2. + double_amplitudes[alpha_unoccupied(a), + alpha_occupied(i), + alpha_unoccupied(b), + alpha_occupied(j)] = value / 2. if (restricted): - double_amplitudes[beta_occupied(i), - beta_unoccupied(a), - beta_occupied(j), - beta_unoccupied(b)] = -value / 2. + double_amplitudes[beta_unoccupied(a), + beta_occupied(i), + beta_unoccupied(b), + beta_occupied(j)] = value / 2. for entry in T2ijab_Amps: i, j, a, b, value = entry - double_amplitudes[beta_occupied(i), - beta_unoccupied(a), - beta_occupied(j), - beta_unoccupied(b)] = -value / 2. + double_amplitudes[beta_unoccupied(a), + beta_occupied(i), + beta_unoccupied(b), + beta_occupied(j)] = value / 2. for entry in T2IjAb_Amps: i, j, a, b, value = entry - double_amplitudes[alpha_occupied(i), - alpha_unoccupied(a), - beta_occupied(j), - beta_unoccupied(b)] = -value / 2. + double_amplitudes[alpha_unoccupied(a), + alpha_occupied(i), + beta_unoccupied(b), + beta_occupied(j)] = value / 2. if (restricted): - double_amplitudes[beta_occupied(i), - beta_unoccupied(a), - alpha_occupied(j), - alpha_unoccupied(b)] = -value / 2. - - # Package into InteractionOperator. - molecule = InteractionOperator(0.0, - single_amplitudes, - double_amplitudes) - return molecule + double_amplitudes[beta_unoccupied(a), + beta_occupied(i), + alpha_unoccupied(b), + alpha_occupied(j)] = value / 2. + + return single_amplitudes, double_amplitudes diff --git a/fermilibpluginpsi4/_psi4_template b/fermilibpluginpsi4/_psi4_template index 55cb60a..e58dd0c 100755 --- a/fermilibpluginpsi4/_psi4_template +++ b/fermilibpluginpsi4/_psi4_template @@ -6,6 +6,7 @@ from fermilib.config import * from fermilib.ops._interaction_tensor import (one_body_basis_change, two_body_basis_change) from fermilib.utils import MolecularData +from numpy import array sys.path.append('&THIS_DIRECTORY') from _psi4_conversion_functions import * @@ -22,7 +23,8 @@ molecule = MolecularData(&geometry, '&basis', &multiplicity, &charge, - _description) + _description, + filename='&mol_filename') # Set molecular geometry and symmetry. molecule mol { @@ -45,11 +47,11 @@ set globals { basis &basis freeze_core false fail_on_maxiter true - df_scf_guess true + df_scf_guess false opdm true tpdm true soscf false - scf_type df + scf_type pk maxiter 1e6 num_amps_print 1e6 r_convergence 1e-6 @@ -93,8 +95,7 @@ if &run_scf: two_body_integrals = numpy.einsum('psqr', two_body_integrals) two_body_integrals = two_body_basis_change( two_body_integrals, molecule.canonical_orbitals) - integrals_name = molecule.filename + '_eri' - numpy.save(integrals_name, two_body_integrals) + molecule.two_body_integrals = two_body_integrals molecule.save() @@ -157,8 +158,7 @@ if &run_cisd: # Store 1-RDM in molecule file, 2-RDM separately in other file. molecule.cisd_one_rdm = cisd_one_rdm - cisd_rdm_name = molecule.filename + '_cisd_rdm' - numpy.save(cisd_rdm_name, cisd_two_rdm) + molecule.cisd_two_rdm = cisd_two_rdm molecule.save() @@ -203,8 +203,7 @@ if &run_fci: # Store 1-RDM in molecule file, 2-RDM separately in other file. molecule.fci_one_rdm = fci_one_rdm - fci_rdm_name = molecule.filename + '_fci_rdm' - numpy.save(fci_rdm_name, fci_two_rdm) + molecule.fci_two_rdm = fci_two_rdm molecule.save() @@ -226,10 +225,13 @@ if &run_ccsd: # Merge CC amplitudes into molecule by parsing psi_filename = outfile_name() - ccsd_amplitudes = parse_psi4_ccsd_amplitudes( - 2 * molecule.n_orbitals, - molecule.get_n_alpha_electrons(), - molecule.get_n_beta_electrons(), - psi_filename) - molecule.ccsd_amplitudes = ccsd_amplitudes + single_cc_amplitudes, double_cc_amplitudes = ( + parse_psi4_ccsd_amplitudes( + 2 * molecule.n_orbitals, + molecule.get_n_alpha_electrons(), + molecule.get_n_beta_electrons(), + psi_filename)) + + molecule.ccsd_single_amps = single_cc_amplitudes + molecule.ccsd_double_amps = double_cc_amplitudes molecule.save() diff --git a/fermilibpluginpsi4/run_psi4.py b/fermilibpluginpsi4/_run_psi4.py similarity index 92% rename from fermilibpluginpsi4/run_psi4.py rename to fermilibpluginpsi4/_run_psi4.py index a5963a3..f27b67e 100755 --- a/fermilibpluginpsi4/run_psi4.py +++ b/fermilibpluginpsi4/_run_psi4.py @@ -28,7 +28,7 @@ def create_geometry_string(geometry): Args: geometry: A list of tuples giving the coordinates of each atom. example is [('H', (0, 0, 0)), ('H', (0, 0, 0.7414))]. Distances in - atomic units. Use atomic symbols to specify atoms. + angstrom. Use atomic symbols to specify atoms. Returns: geo_string: A string giving the geometry for each atom on a line, e.g.: @@ -57,7 +57,8 @@ def generate_psi4_input(molecule, run_fci, verbose, tolerate_error, - memory): + memory, + template_file): """This function creates and saves a psi4 input file. Args: @@ -70,6 +71,7 @@ def generate_psi4_input(molecule, verbose: Boolean whether to print calculation results to screen. tolerate_error: Whether to fail or merely warn when Psi4 fails. memory: Int giving amount of memory to allocate in MB. + template_file(str): Specify the filename of a Psi4 template Returns: input_file: A string giving the name of the saved input file. @@ -81,7 +83,8 @@ def generate_psi4_input(molecule, psi4_directory = os.path.dirname(os.path.realpath(__file__)) # Parse input template. - template_file = psi4_directory + '/_psi4_template' + if template_file is None: + template_file = psi4_directory + '/_psi4_template' input_template = [] with open(template_file, 'r') as stream: for line in stream: @@ -103,6 +106,8 @@ def generate_psi4_input(molecule, for line in input_content] input_content = [re.sub('&description', str(molecule.description), line) for line in input_content] + input_content = [re.sub('&mol_filename', str(molecule.filename), line) + for line in input_content] input_content = [re.sub('&geo_string', geo_string, line) for line in input_content] @@ -158,7 +163,8 @@ def run_psi4(molecule, tolerate_error=False, delete_input=True, delete_output=False, - memory=8000): + memory=8000, + template_file=None): """This function runs a Psi4 calculation. Args: @@ -173,6 +179,7 @@ def run_psi4(molecule, delete_input: Optional boolean to delete psi4 input file. delete_output: Optional boolean to delete psi4 output file. memory: Optional int giving amount of memory to allocate in MB. + template_file(str): Path to Psi4 template file Returns: molecule: The updated MolecularData object. @@ -189,7 +196,8 @@ def run_psi4(molecule, run_fci, verbose, tolerate_error, - memory) + memory, + template_file) # Run psi4. output_file = molecule.filename + '.out' diff --git a/fermilibpluginpsi4/_version.py b/fermilibpluginpsi4/_version.py index 1ccb4f7..2bf21cb 100644 --- a/fermilibpluginpsi4/_version.py +++ b/fermilibpluginpsi4/_version.py @@ -15,4 +15,4 @@ # along with this program. If not, see . """Define version number here and read it from setup.py automatically""" -__version__ = "0.1a0" +__version__ = "0.1a1" diff --git a/setup.py b/setup.py index 017170a..3c4c472 100755 --- a/setup.py +++ b/setup.py @@ -14,10 +14,8 @@ setup( name='fermilibpluginpsi4', version=__version__, - author='Ryan Babbush, Jarrod McClean, Damian Steiger, Ian Kivlichan, ' - 'Thomas Haener, Vojtech Havlicek, Matthew Neeley, Wei Sun', - author_email='ryanbabbush@gmail.com, jarrod.mcc@gmail.com, ' - 'fermilib@projectq.ch', + author='FermiLib plugin Psi4 developers', + author_email='fermilib@projectq.ch', url='http://www.projectq.ch', description='A plugin allowing FermiLib to interface with Psi4.', long_description=long_description,