7.1. Fixing errors in the calculations#
import psi4
import py3Dmol
import pandas as pd
import sys
sys.path.append("..")
from helpers import *
psi4.set_num_threads(2)
psi4.set_memory('2 GB')
Threads set to 2 by Python driver.
Memory set to 1.863 GiB by Python driver.
2000000000
7.1.1. Allyl radical#
Exercise 1
Fix the error in the single-point wavefunction optimization for the allyl radical using the BLYP exchange-correlation functional.
allyl_radical = psi4.geometry("""
symmetry c1
1 2
C 1.307894 -0.292412 0.050945
C 0.000000 0.443183 0.200966
C -1.307894 -0.292412 0.050945
H 2.171777 0.390984 0.102354
H 1.440837 -1.062338 0.844942
H 1.356754 -0.838161 -0.914887
H 0.000000 1.488670 0.522326
H -2.171777 0.390984 0.102354
H -1.356754 -0.838161 -0.914887
H -1.440837 -1.062338 0.844942""")
c: [1.0]
fc: [1.0]
m: [2]
fm: [2]
---------------------------------------------------------------------------
ValidationError Traceback (most recent call last)
Cell In[3], line 1
----> 1 allyl_radical = psi4.geometry("""
2 symmetry c1
3 1 2
4 C 1.307894 -0.292412 0.050945
5 C 0.000000 0.443183 0.200966
6 C -1.307894 -0.292412 0.050945
7 H 2.171777 0.390984 0.102354
8 H 1.440837 -1.062338 0.844942
9 H 1.356754 -0.838161 -0.914887
10 H 0.000000 1.488670 0.522326
11 H -2.171777 0.390984 0.102354
12 H -1.356754 -0.838161 -0.914887
13 H -1.440837 -1.062338 0.844942""")
File /opt/CompChem/psi4conda-1.7/lib/python3.10/site-packages/psi4/driver/molutil.py:259, in geometry(geom, name)
252 def geometry(geom: str, name: str = "default") -> core.Molecule:
253 """Function to create a molecule object of name *name* from the
254 geometry in string *geom*. Permitted for user use but deprecated
255 in driver in favor of explicit molecule-passing. Comments within
256 the string are filtered.
257
258 """
--> 259 molrec = qcel.molparse.from_string(
260 geom, enable_qm=True, missing_enabled_return_qm='minimal', enable_efp=True, missing_enabled_return_efp='none')
262 molecule = core.Molecule.from_dict(molrec['qm'])
263 if "geom" in molrec["qm"]:
File /opt/CompChem/psi4conda-1.7/lib/python3.10/site-packages/qcelemental/molparse/from_string.py:276, in from_string(molstr, dtype, name, fix_com, fix_orientation, fix_symmetry, return_processed, enable_qm, enable_efp, missing_enabled_return_qm, missing_enabled_return_efp, verbose)
273 print(">>>\n")
275 # << 4 >> dict-->molspec
--> 276 molrec = from_input_arrays(
277 speclabel=True,
278 enable_qm=enable_qm,
279 enable_efp=enable_efp,
280 missing_enabled_return_qm=missing_enabled_return_qm,
281 missing_enabled_return_efp=missing_enabled_return_efp,
282 **molinit,
283 )
285 # replace from_arrays stamp with from_string stamp
286 if "qm" in molrec and molrec["qm"]:
File /opt/CompChem/psi4conda-1.7/lib/python3.10/site-packages/qcelemental/molparse/from_arrays.py:97, in from_input_arrays(enable_qm, enable_efp, missing_enabled_return_qm, missing_enabled_return_efp, geom, elea, elez, elem, mass, real, elbl, name, units, input_units_to_au, fix_com, fix_orientation, fix_symmetry, fragment_separators, fragment_charges, fragment_multiplicities, molecular_charge, molecular_multiplicity, fragment_files, hint_types, geom_hints, geom_unsettled, variables, speclabel, tooclose, zero_ghost_fragments, nonphysical, mtol, copy, verbose)
95 if enable_qm:
96 dm = "qmvz" if geom_unsettled else "qm"
---> 97 processed = from_arrays(
98 domain=dm,
99 missing_enabled_return=missing_enabled_return_qm,
100 geom=geom,
101 elea=elea,
102 elez=elez,
103 elem=elem,
104 mass=mass,
105 real=real,
106 elbl=elbl,
107 name=name,
108 units=units,
109 input_units_to_au=input_units_to_au,
110 fix_com=fix_com,
111 fix_orientation=fix_orientation,
112 fix_symmetry=fix_symmetry,
113 fragment_separators=fragment_separators,
114 fragment_charges=fragment_charges,
115 fragment_multiplicities=fragment_multiplicities,
116 molecular_charge=molecular_charge,
117 molecular_multiplicity=molecular_multiplicity,
118 geom_unsettled=geom_unsettled,
119 variables=variables,
120 # processing details
121 speclabel=speclabel,
122 tooclose=tooclose,
123 zero_ghost_fragments=zero_ghost_fragments,
124 nonphysical=nonphysical,
125 mtol=mtol,
126 copy=copy,
127 verbose=1,
128 )
129 update_with_error(molinit, {"qm": processed})
130 if molinit["qm"] == {}:
File /opt/CompChem/psi4conda-1.7/lib/python3.10/site-packages/qcelemental/molparse/from_arrays.py:380, in from_arrays(geom, elea, elez, elem, mass, real, elbl, name, units, input_units_to_au, fix_com, fix_orientation, fix_symmetry, fragment_separators, fragment_charges, fragment_multiplicities, molecular_charge, molecular_multiplicity, comment, provenance, connectivity, fragment_files, hint_types, geom_hints, geom_unsettled, variables, domain, missing_enabled_return, np_out, speclabel, tooclose, zero_ghost_fragments, nonphysical, mtol, copy, verbose)
377 update_with_error(molinit, processed)
379 Z_available = molinit["elez"] * molinit["real"] * 1.0
--> 380 processed = validate_and_fill_chgmult(
381 zeff=Z_available,
382 fragment_separators=molinit["fragment_separators"],
383 molecular_charge=molecular_charge,
384 fragment_charges=molinit["fragment_charges"],
385 molecular_multiplicity=molecular_multiplicity,
386 fragment_multiplicities=molinit["fragment_multiplicities"],
387 zero_ghost_fragments=zero_ghost_fragments,
388 verbose=verbose,
389 )
390 del molinit["fragment_charges"] # sometimes safe update is too picky about overwriting v_a_f_fragments values
391 del molinit["fragment_multiplicities"]
File /opt/CompChem/psi4conda-1.7/lib/python3.10/site-packages/qcelemental/molparse/chgmult.py:501, in validate_and_fill_chgmult(zeff, fragment_separators, molecular_charge, fragment_charges, molecular_multiplicity, fragment_multiplicities, zero_ghost_fragments, verbose)
495 return fcgmp.format(final) if final == start else fcgmp.format("(" + str(int(final)) + ")")
497 # TODO could winnow down the exact_* lists a bit by ruling out
498 # independent values. do this if many-frag molecular systems take too
499 # long in the itertools.product
--> 501 c_final, fc_final, m_final, fm_final = reconcile(cgmp_exact_c, cgmp_exact_fc, cgmp_exact_m, cgmp_exact_fm)
503 c_text = stringify(molecular_charge, c_final)
504 fc_text = ", ".join((stringify(fs, ff) for fs, ff in zip(fragment_charges, fc_final)))
File /opt/CompChem/psi4conda-1.7/lib/python3.10/site-packages/qcelemental/molparse/chgmult.py:491, in validate_and_fill_chgmult.<locals>.reconcile(exact_c, exact_fc, exact_m, exact_fm)
489 if verbose > -1:
490 print("\n\n" + "\n".join(text))
--> 491 raise ValidationError(err)
ValidationError: Inconsistent or unspecified chg/mult: sys chg: None, frag chg: [1.0], sys mult: None, frag mult: [2]
psi4.core.set_output_file('allyl_radical.log', False)
psi4.set_options({'reference':'uks'})
psi4.energy('blyp/3-21G', molecule=allyl_radical)
drawXYZ(allyl_radical)
7.1.2. Copper Water complex#
Exercise 2
Fix the error in the single-point wavefunction optimisation of the \(Cu[H_{2}O]^{2+}\) aqua complex (as observed in the gas phase) using the PBE exchange-correlation functional.
cu_h2o_2plus = psi4.geometry("""
2 2
Cu 0.009000 0.015000 0.004000
O 0.043000 1.451000 -0.430000
H 0.050000 1.450000 -1.397000
H -0.798000 1.844000 -0.158000
""")
drawXYZ(cu_h2o_2plus)
You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
jupyter labextension install jupyterlab_3dmol
psi4.core.clean()
psi4.core.set_output_file('copper_water.log', False)
psi4.set_options({'reference':'uks'})
psi4.energy('pbe/3-21G', molecule=cu_h2o_2plus)
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
Cell In[15], line 3
1 psi4.core.set_output_file('copper_water.log', False)
2 psi4.set_options({'reference':'uks'})
----> 3 psi4.energy('pbe/3-21G', molecule=cu_h2o_2plus)
File /opt/CompChem/psi4conda-1.7/lib/python3.10/site-packages/psi4/driver/driver.py:526, in energy(name, **kwargs)
524 logger.info(f"Compute energy(): method={lowername}, basis={core.get_global_option('BASIS').lower()}, molecule={molecule.name()}, nre={'w/EFP' if hasattr(molecule, 'EFP') else molecule.nuclear_repulsion_energy()}")
525 logger.debug("w/EFP" if hasattr(molecule, "EFP") else pp.pformat(molecule.to_dict()))
--> 526 wfn = procedures['energy'][lowername](lowername, molecule=molecule, **kwargs)
527 logger.info(f"Return energy(): {core.variable('CURRENT ENERGY')}")
529 for postcallback in hooks['energy']['post']:
File /opt/CompChem/psi4conda-1.7/lib/python3.10/site-packages/psi4/driver/procrouting/proc.py:2571, in run_scf(name, **kwargs)
2568 if not core.has_global_option_changed('SCF_TYPE'):
2569 core.set_global_option('SCF_TYPE', 'DF')
-> 2571 scf_wfn = scf_helper(name, post_scf=False, **kwargs)
2572 returnvalue = scf_wfn.energy()
2574 ssuper = scf_wfn.functional()
File /opt/CompChem/psi4conda-1.7/lib/python3.10/site-packages/psi4/driver/procrouting/proc.py:1767, in scf_helper(name, post_scf, **kwargs)
1764 core.print_out("\n ---------------------------------------------------------\n")
1765 core.print_out(" " + banner.center(58))
-> 1767 scf_wfn = scf_wavefunction_factory(name, base_wfn, core.get_option('SCF', 'REFERENCE'), **kwargs)
1769 # The wfn from_file routine adds the npy suffix if needed, but we add it here so that
1770 # we can use os.path.isfile to query whether the file exists before attempting to read
1771 read_filename = scf_wfn.get_scratch_filename(180) + '.npy'
File /opt/CompChem/psi4conda-1.7/lib/python3.10/site-packages/psi4/driver/procrouting/proc.py:1435, in scf_wavefunction_factory(name, ref_wfn, reference, **kwargs)
1433 core.prepare_options_for_module("SCF")
1434 if reference in ["RHF", "RKS"]:
-> 1435 wfn = core.RHF(ref_wfn, superfunc)
1436 elif reference == "ROHF":
1437 wfn = core.ROHF(ref_wfn, superfunc)
RuntimeError:
Fatal Error: RHF: RHF reference is only for singlets.
Error occurred in file: /scratch/psilocaluser/conda-builds/psi4-multiout_1670993662927/work/psi4/src/psi4/libscf_solver/rhf.cc on line: 92
The most recent 5 function calls were:
7.1.3. N2 Geometry optimization#
Exercise 3
Fix the error in the geometry optimisation of \(N_2\) using the BP86 exchange-correlation functional.
n2 = psi4.geometry("""
0 1
N 0.000 0.000 0.000
N 0.000 0.000 1.098
""")
psi4.core.clean()
psi4.core.set_output_file('n2_opt.log', False)
psi4.energy('BP86/6-31+G*', molecule=n2)
7.1.4. \(^3 O\) Single point optimization#
Exercise 4
Fix the error in the single point calculation of \(^3 O\) using the B97-2 exchange-correlation functional.
psi4.core.clean()
psi4.core.clean_options()
o = psi4.geometry("""
0 3
O 0.0 0.0 0.0
""")
psi4.core.set_output_file('o3_singlept.log', False)
psi4.energy('b97-2/6-31+G*', molecule=o)
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
Cell In[11], line 2
1 psi4.core.set_output_file('o3_singlept.log', False)
----> 2 psi4.energy('b97-2/6-31+G*', molecule=o)
File /opt/CompChem/psi4conda-1.7/lib/python3.10/site-packages/psi4/driver/driver.py:526, in energy(name, **kwargs)
524 logger.info(f"Compute energy(): method={lowername}, basis={core.get_global_option('BASIS').lower()}, molecule={molecule.name()}, nre={'w/EFP' if hasattr(molecule, 'EFP') else molecule.nuclear_repulsion_energy()}")
525 logger.debug("w/EFP" if hasattr(molecule, "EFP") else pp.pformat(molecule.to_dict()))
--> 526 wfn = procedures['energy'][lowername](lowername, molecule=molecule, **kwargs)
527 logger.info(f"Return energy(): {core.variable('CURRENT ENERGY')}")
529 for postcallback in hooks['energy']['post']:
File /opt/CompChem/psi4conda-1.7/lib/python3.10/site-packages/psi4/driver/procrouting/proc.py:2571, in run_scf(name, **kwargs)
2568 if not core.has_global_option_changed('SCF_TYPE'):
2569 core.set_global_option('SCF_TYPE', 'DF')
-> 2571 scf_wfn = scf_helper(name, post_scf=False, **kwargs)
2572 returnvalue = scf_wfn.energy()
2574 ssuper = scf_wfn.functional()
File /opt/CompChem/psi4conda-1.7/lib/python3.10/site-packages/psi4/driver/procrouting/proc.py:1767, in scf_helper(name, post_scf, **kwargs)
1764 core.print_out("\n ---------------------------------------------------------\n")
1765 core.print_out(" " + banner.center(58))
-> 1767 scf_wfn = scf_wavefunction_factory(name, base_wfn, core.get_option('SCF', 'REFERENCE'), **kwargs)
1769 # The wfn from_file routine adds the npy suffix if needed, but we add it here so that
1770 # we can use os.path.isfile to query whether the file exists before attempting to read
1771 read_filename = scf_wfn.get_scratch_filename(180) + '.npy'
File /opt/CompChem/psi4conda-1.7/lib/python3.10/site-packages/psi4/driver/procrouting/proc.py:1435, in scf_wavefunction_factory(name, ref_wfn, reference, **kwargs)
1433 core.prepare_options_for_module("SCF")
1434 if reference in ["RHF", "RKS"]:
-> 1435 wfn = core.RHF(ref_wfn, superfunc)
1436 elif reference == "ROHF":
1437 wfn = core.ROHF(ref_wfn, superfunc)
RuntimeError:
Fatal Error: RHF: RHF reference is only for singlets.
Error occurred in file: /scratch/psilocaluser/conda-builds/psi4-multiout_1670993662927/work/psi4/src/psi4/libscf_solver/rhf.cc on line: 92
The most recent 5 function calls were: