diff --git a/atomate/qchem/drones.py b/atomate/qchem/drones.py index 08c416b4b..a2df7ed0e 100644 --- a/atomate/qchem/drones.py +++ b/atomate/qchem/drones.py @@ -9,11 +9,14 @@ from monty.io import zopen from monty.json import jsanitize +from monty.shutil import compress_file, decompress_file + from pymatgen.apps.borg.hive import AbstractDrone from pymatgen.core import Molecule from pymatgen.io.babel import BabelMolAdaptor from pymatgen.io.qchem.inputs import QCInput from pymatgen.io.qchem.outputs import QCOutput +from pymatgen.io.multiwfn import process_multiwfn_qtaim from pymatgen.symmetry.analyzer import PointGroupAnalyzer from atomate import __version__ as atomate_version @@ -502,6 +505,28 @@ def post_process(dir_name, d): if len(filenames) >= 1: with zopen(filenames[0], "rt") as f: d["critic2"]["bonding"] = json.load(f) + filenames = glob.glob(os.path.join(fullpath, "CPprop.txt*")) + if len(filenames) >= 1: + filename = filenames[0] + recompress = False + if filename[-3:] == ".gz": + recompress = True + decompress_file(os.path.join(fullpath, filename)) + filename = filename[:-3] + + if "optimized_molecule" in d["output"]: + mol = d["output"]["optimized_molecule"] + else: + mol = d["output"]["initial_molecule"] + + if not isinstance(mol, Molecule): + mol = Molecule.from_dict(mol) + + d["output"]["qtaim"] = process_multiwfn_qtaim(mol, os.path.join(fullpath, filename)) + + if recompress: + compress_file(os.path.join(fullpath, filename)) + def validate_doc(self, d): """ diff --git a/atomate/qchem/firetasks/multiwfn.py b/atomate/qchem/firetasks/multiwfn.py new file mode 100644 index 000000000..739509a24 --- /dev/null +++ b/atomate/qchem/firetasks/multiwfn.py @@ -0,0 +1,93 @@ +# This module defines Firetask that run Multiwfn to analyze a wavefunction (*.wfn) file produced by e.g. Q-Chem. + +import os +from pathlib import Path +import subprocess + +from fireworks import FiretaskBase, explicit_serialize +from monty.serialization import dumpfn, loadfn +from monty.shutil import compress_file, decompress_file + +from atomate.utils.utils import env_chk, get_logger + +__author__ = "Evan Spotte-Smith" +__copyright__ = "Copyright 2024, The Materials Project" +__version__ = "0.1" +__maintainer__ = "Evan Spotte-Smith" +__email__ = "espottesmith@gmail.com" +__status__ = "Alpha" +__date__ = "07/17/2024" + + +logger = get_logger(__name__) + + +@explicit_serialize +class RunMultiwfn_QTAIM(FiretaskBase): + """ + Run the Multiwfn package on an electron density wavefunction (*.wfn) file produced by a Q-Chem calculation + to generate a CPprop file for quantum theory of atoms in molecules (QTAIM) analysis. + + Required params: + molecule (Molecule): Molecule object of the molecule whose electron density is being analyzed + Note that if prev_calc_molecule is set in the firework spec it will override + the molecule required param. + multiwfn_command (str): Shell command to run Multiwfn + wfn_file (str): Name of the wavefunction file being analyzed + """ + + required_params = ["molecule", "multiwfn_command", "wfn_file"] + + def run_task(self, fw_spec): + if fw_spec.get("prev_calc_molecule"): + molecule = fw_spec.get("prev_calc_molecule") + else: + molecule = self.get("molecule") + if molecule is None: + raise ValueError( + "No molecule passed and no prev_calc_molecule found in spec! Exiting..." + ) + + compress_at_end = False + + wfn = self.get("wfn_file") + + # File might be compressed + if not os.path.exists(wfn) and not wfn.endswith(".gz"): + wfn += ".gz" + + if wfn[-3:] == ".gz": + compress_at_end = True + decompress_file(wfn) + wfn = wfn[:-3] + + # This will run through an interactive Multiwfn dialogue and select the necessary options for QTAIM + input_script = """ +2 +2 +3 +4 +5 +6 +-1 +-9 +8 +7 +0 +-10 +q + """ + + with open("multiwfn_options.txt", "w") as file: + file.write(input_script) + + base_command = env_chk(self.get("multiwfn_command"), fw_spec) + + cmd = f"{base_command} {wfn} < multiwfn_options.txt" + + logger.info(f"Running command: {cmd}") + return_code = subprocess.call(cmd, shell=True) + logger.info(f"Command {cmd} finished running with return code: {return_code}") + + if compress_at_end: + compress_file(wfn) diff --git a/atomate/qchem/firetasks/tests/test_multiwfn.py b/atomate/qchem/firetasks/tests/test_multiwfn.py new file mode 100644 index 000000000..908faa453 --- /dev/null +++ b/atomate/qchem/firetasks/tests/test_multiwfn.py @@ -0,0 +1,83 @@ +import json +import os +import shutil +import unittest +from shutil import which + +from pymatgen.io.qchem.outputs import QCOutput +from pymatgen.io.multiwfn import process_multiwfn_qtaim + +from atomate.qchem.firetasks.multiwfn import RunMultiwfn_QTAIM +from atomate.utils.testing import AtomateTest + +__author__ = "Evan Spotte-Smith" +__email__ = "espottesmith@gmail.com" + +module_dir = os.path.dirname(os.path.abspath(__file__)) + + +@unittest.skipIf(not which("Multiwfn_noGUI"), "Multiwfn executable not present") +class TestRunMultiwfn_QTAIM(AtomateTest): + + def setUp(self, lpad=False): + os.chdir( + os.path.join( + module_dir, + "..", + "..", + "test_files", + "multiwfn_example", + ) + ) + out_file = "mol.qout.gz" + qc_out = QCOutput(filename=out_file) + self.mol = qc_out.data["initial_molecule"] + self.wavefunction = "WAVEFUNCTION.wfn.gz" + super().setUp(lpad=False) + + def tearDown(self): + os.remove("multiwfn_options.txt") + os.remove("CPprop.txt") + + def test_run(self): + os.chdir( + os.path.join( + module_dir, + "..", + "..", + "test_files", + "multiwfn_example" + ) + ) + firetask = RunMultiwfn_QTAIM( + molecule=self.mol, + multiwfn_command="Multiwfn_noGUI", + wfn_file="WAVEFUNCTION.wfn.gz" + ) + firetask.run_task(fw_spec={}) + + reference = process_multiwfn_qtaim( + self.mol, + "CPprop_correct.txt" + ) + + this_output = process_multiwfn_qtaim( + self.mol, + "CPprop.txt" + ) + + for root in ["atom", "bond", "ring", "cage"]: + assert len(reference[root]) == len(this_output[root]) + + for k, v in reference[root].items(): + assert k in this_output[root] + + for kk, vv in reference[root][k].items(): + output_val = this_output[root][k].get(kk) + if isinstance(vv, list): + assert isinstance(output_val, list) + assert len(vv) == len(output_val) + for index, vvelem in enumerate(vv): + self.assertAlmostEqual(vvelem, output_val[index]) + + self.assertAlmostEqual(vv, output_val) diff --git a/atomate/qchem/fireworks/core.py b/atomate/qchem/fireworks/core.py index 91f438ff0..09f322551 100644 --- a/atomate/qchem/fireworks/core.py +++ b/atomate/qchem/fireworks/core.py @@ -11,6 +11,7 @@ from atomate.qchem.firetasks.critic2 import ProcessCritic2, RunCritic2 from atomate.qchem.firetasks.fragmenter import FragmentMolecule from atomate.qchem.firetasks.geo_transformations import PerturbGeometry +from atomate.qchem.firetasks.multiwfn import RunMultiwfn_QTAIM from atomate.qchem.firetasks.parse_outputs import ProtCalcToDb, QChemToDb from atomate.qchem.firetasks.run_calc import RunQChemCustodian from atomate.qchem.firetasks.write_inputs import WriteInputFromIOSet @@ -1036,3 +1037,92 @@ def __init__( ) ) super().__init__(t, parents=parents, name=name, **kwargs) + + +class WfnAndQTAIMFW(Firework): + def __init__( + self, + molecule=None, + name="Wavefunction and QTAIM", + qchem_cmd=">>qchem_cmd<<", + multimode=">>multimode<<", + max_cores=">>max_cores<<", + multiwfn_command=">>multiwfn_command<<", + qchem_input_params=None, + db_file=None, + parents=None, + max_errors=5, + **kwargs + ): + """ + Perform a Q-Chem single point calculation in order to generate a wavefunction file of the electron density + and then analyze the electron density critical points with the Multiwfn package. + + Args: + molecule (Molecule): Input molecule. + name (str): Name for the Firework. + qchem_cmd (str): Command to run QChem. Supports env_chk. + multimode (str): Parallelization scheme, either openmp or mpi. Supports env_chk. + max_cores (int): Maximum number of cores to parallelize over. Supports env_chk. + multiwfn_command (str): Terminal command for Multiwfn. Supports env_chk. + qchem_input_params (dict): Specify kwargs for instantiating the input set parameters. + Basic uses would be to modify the default inputs of the set, such as dft_rung, + basis_set, pcm_dielectric, scf_algorithm, or max_scf_cycles. See + pymatgen/io/qchem/sets.py for default values of all input parameters. For + instance, if a user wanted to use a more advanced DFT functional, include a pcm + with a dielectric of 30, and use a larger basis, the user would set + qchem_input_params = {"dft_rung": 5, "pcm_dielectric": 30, "basis_set": + "6-311++g**"}. However, more advanced customization of the input is also + possible through the overwrite_inputs key which allows the user to directly + modify the rem, pcm, smd, and solvent dictionaries that QChemDictSet passes to + inputs.py to print an actual input file. For instance, if a user wanted to set + the sym_ignore flag in the rem section of the input file to true, then they + would set qchem_input_params = {"overwrite_inputs": "rem": {"sym_ignore": + "true"}}. Of course, overwrite_inputs could be used in conjunction with more + typical modifications, as seen in the test_double_FF_opt workflow test. + db_file (str): Path to file specifying db credentials to place output parsing. + parents ([Firework]): Parents of this particular Firework. + **kwargs: Other kwargs that are passed to Firework.__init__. + """ + + qchem_input_params = copy.deepcopy(qchem_input_params) or {} + qchem_input_params["output_wavefunction"] = True + + input_file = "mol.qin" + output_file = "mol.qout" + t = [] + t.append( + WriteInputFromIOSet( + molecule=molecule, + qchem_input_set="SinglePointSet", + input_file=input_file, + qchem_input_params=qchem_input_params, + ) + ) + t.append( + RunQChemCustodian( + qchem_cmd=qchem_cmd, + multimode=multimode, + input_file=input_file, + output_file=output_file, + max_cores=max_cores, + max_errors=max_errors, + job_type="normal", + ) + ) + t.append( + RunMultiwfn_QTAIM( + molecule=molecule, + multiwfn_command=multiwfn_command, + wfn_file="WAVEFUNCTION.wfn" + ) + ) + t.append( + QChemToDb( + db_file=db_file, + input_file=input_file, + output_file=output_file, + additional_fields={"task_label": name}, + ) + ) + super().__init__(t, parents=parents, name=name, **kwargs) diff --git a/atomate/qchem/fireworks/tests/test_core.py b/atomate/qchem/fireworks/tests/test_core.py index 7f743668c..a78ed035d 100644 --- a/atomate/qchem/fireworks/tests/test_core.py +++ b/atomate/qchem/fireworks/tests/test_core.py @@ -9,6 +9,7 @@ from atomate.qchem.firetasks.critic2 import ProcessCritic2, RunCritic2 from atomate.qchem.firetasks.fragmenter import FragmentMolecule from atomate.qchem.firetasks.geo_transformations import PerturbGeometry +from atomate.qchem.firetasks.multiwfn import RunMultiwfn_QTAIM from atomate.qchem.firetasks.parse_outputs import ProtCalcToDb, QChemToDb from atomate.qchem.firetasks.run_calc import RunQChemCustodian from atomate.qchem.firetasks.write_inputs import WriteInputFromIOSet @@ -23,6 +24,7 @@ ProtonEnergyFW, SinglePointFW, TransitionStateFW, + WfnAndQTAIMFW ) from atomate.utils.testing import AtomateTest @@ -924,3 +926,98 @@ def test_CubeAndCritic2FW_not_defaults(self): ) self.assertEqual(firework.parents, []) self.assertEqual(firework.name, "special cube and critic2") + + def test_WfnAndQTAIMFW_defaults(self): + firework = WfnAndQTAIMFW(molecule=self.act_mol) + self.assertEqual( + firework.tasks[0].as_dict(), + WriteInputFromIOSet( + molecule=self.act_mol, + qchem_input_set="SinglePointSet", + input_file="mol.qin", + qchem_input_params={"output_wavefunction": True}, + ).as_dict(), + ) + self.assertEqual( + firework.tasks[1].as_dict(), + RunQChemCustodian( + qchem_cmd=">>qchem_cmd<<", + multimode=">>multimode<<", + input_file="mol.qin", + output_file="mol.qout", + max_cores=">>max_cores<<", + max_errors=5, + job_type="normal", + ).as_dict(), + ) + self.assertEqual( + firework.tasks[2].as_dict(), + RunMultiwfn_QTAIM( + molecule=self.act_mol, + multiwfn_command=">>multiwfn_command<<", + wfn_file="WAVEFUNCTION.wfn", + ).as_dict(), + ) + self.assertEqual( + firework.tasks[3].as_dict(), + QChemToDb( + db_file=None, + input_file="mol.qin", + output_file="mol.qout", + additional_fields={"task_label": "Wavefunction and QTAIM"}, + ).as_dict(), + ) + self.assertEqual(firework.parents, []) + self.assertEqual(firework.name, "Wavefunction and QTAIM") + + def test_WfnAndQTAIMFW_not_defaults(self): + firework = WfnAndQTAIMFW( + molecule=self.act_mol, + name="special multiwfn QTAIM", + qchem_cmd="qchem -slurm", + multimode="mpi", + max_cores=12, + qchem_input_params={"pcm_dielectric": 10.0}, + db_file=db_file, + parents=None, + ) + self.assertEqual( + firework.tasks[0].as_dict(), + WriteInputFromIOSet( + molecule=self.act_mol, + qchem_input_set="SinglePointSet", + input_file="mol.qin", + qchem_input_params={"pcm_dielectric": 10.0, "output_wavefunction": True}, + ).as_dict(), + ) + self.assertEqual( + firework.tasks[1].as_dict(), + RunQChemCustodian( + qchem_cmd="qchem -slurm", + multimode="mpi", + input_file="mol.qin", + output_file="mol.qout", + max_cores=12, + max_errors=5, + job_type="normal", + ).as_dict(), + ) + self.assertEqual( + firework.tasks[2].as_dict(), + RunMultiwfn_QTAIM( + molecule=self.act_mol, + multiwfn_command=">>multiwfn_command<<", + wfn_file="WAVEFUNCTION.wfn", + ).as_dict(), + ) + self.assertEqual( + firework.tasks[3].as_dict(), + QChemToDb( + db_file=db_file, + input_file="mol.qin", + output_file="mol.qout", + additional_fields={"task_label": "special multiwfn QTAIM"}, + ).as_dict(), + ) + self.assertEqual(firework.parents, []) + self.assertEqual(firework.name, "special multiwfn QTAIM") diff --git a/atomate/qchem/test_files/multiwfn_example/CPprop_correct.txt b/atomate/qchem/test_files/multiwfn_example/CPprop_correct.txt new file mode 100644 index 000000000..29d079c6c --- /dev/null +++ b/atomate/qchem/test_files/multiwfn_example/CPprop_correct.txt @@ -0,0 +1,285 @@ + ---------------- CP 1, Type (3,-3) ---------------- + Corresponding nucleus: 3(H ) + Position (Bohr): -1.337339520632 -0.000000000000 0.775959946246 + Position (Angstrom): -0.707689597558 -0.000000000000 0.410620320127 + Density of all electrons: 0.3782607341E+00 + Density of Alpha electrons: 0.1891303670E+00 + Density of Beta electrons: 0.1891303670E+00 + Spin density of electrons: 0.0000000000E+00 + Lagrangian kinetic energy G(r): 0.3512887562E-01 + G(r) in X,Y,Z: 0.7302608021E-02 0.1630970689E-01 0.1151656070E-01 + Hamiltonian kinetic energy K(r): 0.2755647555E+01 + Potential energy density V(r): -0.2790776431E+01 + Energy density E(r) or H(r): -0.2755647555E+01 + Laplacian of electron density: -0.1088207472E+02 + Electron localization function (ELF): 0.9961880925E+00 + Localized orbital locator (LOL): 0.9417605346E+00 + Local information entropy: 0.1238711851E+00 + Interaction region indicator (IRI): 0.1227765191E-14 + Reduced density gradient (RDG): 0.1000000000E+03 + Reduced density gradient with promolecular approximation: 0.1000000000E+03 + Sign(lambda2)*rho: -0.3782607341E+00 + Sign(lambda2)*rho with promolecular approximation: -0.2725147331E+00 + Corr. hole for alpha, ref.: 0.00000 0.00000 0.00000 : -0.1644007684E-01 + Source function, ref.: 0.00000 0.00000 0.00000 : 0.5600789039E+00 + Wavefunction value for orbital 1 : 0.5188581219E-03 + Average local ionization energy (ALIE): 0.6005322342E+00 + van der Waals potential (probe atom: C ): 0.2967244083E+21 kcal/mol + Delta-g (under promolecular approximation): 0.2685216677E+00 + Delta-g (under Hirshfeld partition): 0.4848667837E+00 + User-defined real space function: 0.1000000000E+01 + ESP from nuclear charges: 0.1509528627E+02 + ESP from electrons: -0.5975126213E+01 + Total ESP: 0.9120160059E+01 a.u. ( 0.2481722E+03 eV, 0.5722992E+04 kcal/mol) + + Note: Below information are for electron density + + Components of gradient in x/y/z are: + -0.4024558464E-15 -0.2341930812E-30 -0.1249000903E-15 + Norm of gradient is: 0.4213914343E-15 + + Components of Laplacian in x/y/z are: + -0.3197448104E+01 -0.4129218918E+01 -0.3555407697E+01 + Total: -0.1088207472E+02 + + Hessian matrix: + -0.3197448104E+01 -0.4545748972E-15 -0.7528122252E+00 + -0.4545748972E-15 -0.4129218918E+01 0.3306752341E-15 + -0.7528122252E+00 0.3306752341E-15 -0.3555407697E+01 + Eigenvalues of Hessian: -0.4150223748E+01 -0.4129218918E+01 -0.2602632053E+01 + Eigenvectors (columns) of Hessian: + 0.6199592504E+00 -0.2119371817E-13 -0.7846340089E+00 + -0.3468205455E-13 -0.1000000000E+01 -0.2507157086E-15 + 0.7846340089E+00 -0.2736815302E-13 0.6199592504E+00 + Determinant of Hessian: -0.4460178024E+02 + Ellipticity of electron density: 0.005087 + eta index: -1.594626 + + ---------------- CP 2, Type (3,-3) ---------------- + Corresponding nucleus: 1(H ) + Position (Bohr): 1.337339520632 0.000000000000 0.775959946246 + Position (Angstrom): 0.707689597558 0.000000000000 0.410620320127 + Density of all electrons: 0.3782607341E+00 + Density of Alpha electrons: 0.1891303670E+00 + Density of Beta electrons: 0.1891303670E+00 + Spin density of electrons: 0.0000000000E+00 + Lagrangian kinetic energy G(r): 0.3512887562E-01 + G(r) in X,Y,Z: 0.7302608021E-02 0.1630970689E-01 0.1151656070E-01 + Hamiltonian kinetic energy K(r): 0.2755647555E+01 + Potential energy density V(r): -0.2790776431E+01 + Energy density E(r) or H(r): -0.2755647555E+01 + Laplacian of electron density: -0.1088207472E+02 + Electron localization function (ELF): 0.9961880925E+00 + Localized orbital locator (LOL): 0.9417605346E+00 + Local information entropy: 0.1238711851E+00 + Interaction region indicator (IRI): 0.5725639045E-15 + Reduced density gradient (RDG): 0.1000000000E+03 + Reduced density gradient with promolecular approximation: 0.1000000000E+03 + Sign(lambda2)*rho: -0.3782607341E+00 + Sign(lambda2)*rho with promolecular approximation: -0.2725147331E+00 + Corr. hole for alpha, ref.: 0.00000 0.00000 0.00000 : -0.1644007684E-01 + Source function, ref.: 0.00000 0.00000 0.00000 : 0.5600789039E+00 + Wavefunction value for orbital 1 : 0.5188581219E-03 + Average local ionization energy (ALIE): 0.6005322342E+00 + van der Waals potential (probe atom: C ): 0.2967244083E+21 kcal/mol + Delta-g (under promolecular approximation): 0.2685216677E+00 + Delta-g (under Hirshfeld partition): 0.4848667837E+00 + User-defined real space function: 0.1000000000E+01 + ESP from nuclear charges: 0.1509528627E+02 + ESP from electrons: -0.5975126213E+01 + Total ESP: 0.9120160059E+01 a.u. ( 0.2481722E+03 eV, 0.5722992E+04 kcal/mol) + + Note: Below information are for electron density + + Components of gradient in x/y/z are: + 0.1960237528E-15 0.5423418723E-30 -0.1387778781E-16 + Norm of gradient is: 0.1965143879E-15 + + Components of Laplacian in x/y/z are: + -0.3197448104E+01 -0.4129218918E+01 -0.3555407697E+01 + Total: -0.1088207472E+02 + + Hessian matrix: + -0.3197448104E+01 -0.4175808500E-16 0.7528122252E+00 + -0.4175808500E-16 -0.4129218918E+01 -0.7124909311E-16 + 0.7528122252E+00 -0.7124909311E-16 -0.3555407697E+01 + Eigenvalues of Hessian: -0.4150223748E+01 -0.4129218918E+01 -0.2602632053E+01 + Eigenvectors (columns) of Hessian: + -0.6199592504E+00 -0.2494513094E-13 -0.7846340089E+00 + 0.4109806020E-13 -0.1000000000E+01 -0.5390657820E-15 + 0.7846340089E+00 0.3258113455E-13 -0.6199592504E+00 + Determinant of Hessian: -0.4460178024E+02 + Ellipticity of electron density: 0.005087 + eta index: -1.594626 + + ---------------- CP 3, Type (3,-3) ---------------- + Corresponding nucleus: 2(O ) + Position (Bohr): 0.000000000000 -0.000000000000 -0.312446803730 + Position (Angstrom): 0.000000000000 -0.000000000000 -0.165339728153 + Density of all electrons: 0.2786227526E+03 + Density of Alpha electrons: 0.1393113763E+03 + Density of Beta electrons: 0.1393113763E+03 + Spin density of electrons: 0.0000000000E+00 + Lagrangian kinetic energy G(r): 0.5052394325E+02 + G(r) in X,Y,Z: 0.1377724761E+02 0.2056159587E+02 0.1618509977E+02 + Hamiltonian kinetic energy K(r): 0.2904432903E+06 + Potential energy density V(r): -0.2904938142E+06 + Energy density E(r) or H(r): -0.2904432903E+06 + Laplacian of electron density: -0.1161571065E+07 + Electron localization function (ELF): 0.9999978082E+00 + Localized orbital locator (LOL): 0.9985217138E+00 + Local information entropy: -0.9270541381E+02 + Interaction region indicator (IRI): 0.1806726223E-13 + Reduced density gradient (RDG): 0.1000000000E+03 + Reduced density gradient with promolecular approximation: 0.1000000000E+03 + Sign(lambda2)*rho: -0.2786227526E+03 + Sign(lambda2)*rho with promolecular approximation: -0.2923070389E+03 + Corr. hole for alpha, ref.: 0.00000 0.00000 0.00000 : -0.9764694622E+02 + Source function, ref.: 0.00000 0.00000 0.00000 : 0.2958420035E+06 + Wavefunction value for orbital 1 : -0.1142124610E+02 + Average local ionization energy (ALIE): 0.1782273936E+02 + van der Waals potential (probe atom: C ): 0.1561486723E+66 kcal/mol + Delta-g (under promolecular approximation): 0.5233952285E-01 + Delta-g (under Hirshfeld partition): 0.7788415015E-01 + User-defined real space function: 0.1000000000E+01 + ESP from nuclear charges: 0.3857985358E+06 + ESP from electrons: -0.2338450309E+02 + Total ESP: 0.3857751513E+06 a.u. ( 0.1049748E+08 eV, 0.2420778E+09 kcal/mol) + + Note: Below information are for electron density + + Components of gradient in x/y/z are: + -0.6605776261E-16 0.1893266173E-28 0.8839151633E-11 + Norm of gradient is: 0.8839151633E-11 + + Components of Laplacian in x/y/z are: + -0.3872033274E+06 -0.3871752762E+06 -0.3871924617E+06 + Total: -0.1161571065E+07 + + Hessian matrix: + -0.3872033274E+06 0.2232200022E-13 -0.1004592445E-12 + 0.2232200022E-13 -0.3871752762E+06 -0.6480635931E-14 + -0.1004592445E-12 -0.6480635931E-14 -0.3871924617E+06 + Eigenvalues of Hessian: -0.3872033274E+06 -0.3871924617E+06 -0.3871752762E+06 + Eigenvectors (columns) of Hessian: + -0.1000000000E+01 0.0000000000E+00 0.1716317631E-11 + 0.1716393475E-11 0.0000000000E+00 0.1000000000E+01 + 0.0000000000E+00 0.1000000000E+01 0.0000000000E+00 + Determinant of Hessian: -0.5804617289E+17 + Ellipticity of electron density: 0.000028 + eta index: -1.000072 + + ---------------- CP 4, Type (3,-1) ---------------- + Connected atoms: 3(H ) -- 2(O ) + Position (Bohr): -1.139728273109 -0.000000000000 0.619195673290 + Position (Angstrom): -0.603118228751 -0.000000000000 0.327664239395 + Density of all electrons: 0.3555268313E+00 + Density of Alpha electrons: 0.1777634156E+00 + Density of Beta electrons: 0.1777634156E+00 + Spin density of electrons: 0.0000000000E+00 + Lagrangian kinetic energy G(r): 0.7225412024E-01 + G(r) in X,Y,Z: 0.1525767948E-01 0.3373165197E-01 0.2326478879E-01 + Hamiltonian kinetic energy K(r): 0.6194515984E+00 + Potential energy density V(r): -0.6917057186E+00 + Energy density E(r) or H(r): -0.6194515984E+00 + Laplacian of electron density: -0.2188789912E+01 + Electron localization function (ELF): 0.9804906069E+00 + Localized orbital locator (LOL): 0.8763940244E+00 + Local information entropy: 0.1186300475E+00 + Interaction region indicator (IRI): 0.9246173984E-16 + Reduced density gradient (RDG): 0.1000000000E+03 + Reduced density gradient with promolecular approximation: 0.1000000000E+03 + Sign(lambda2)*rho: -0.3555268313E+00 + Sign(lambda2)*rho with promolecular approximation: -0.2179416158E+00 + Corr. hole for alpha, ref.: 0.00000 0.00000 0.00000 : -0.1521712915E-01 + Source function, ref.: 0.00000 0.00000 0.00000 : 0.1342862893E+00 + Wavefunction value for orbital 1 : -0.8709544497E-03 + Average local ionization energy (ALIE): 0.6306096902E+00 + van der Waals potential (probe atom: C ): 0.7516746618E+14 kcal/mol + Delta-g (under promolecular approximation): 0.5517191603E+00 + Delta-g (under Hirshfeld partition): 0.8206477678E+00 + User-defined real space function: 0.1000000000E+01 + ESP from nuclear charges: 0.8670885241E+01 + ESP from electrons: -0.6660434572E+01 + Total ESP: 0.2010450669E+01 a.u. ( 0.5470714E+02 eV, 0.1261578E+04 kcal/mol) + + Note: Below information are for electron density + + Components of gradient in x/y/z are: + -0.1040834086E-16 0.3081487911E-30 0.2775557562E-16 + Norm of gradient is: 0.2964296775E-16 + + Components of Laplacian in x/y/z are: + 0.1713195623E+00 -0.1802345267E+01 -0.5577642076E+00 + Total: -0.2188789912E+01 + + Hessian matrix: + 0.1713195623E+00 -0.7296900222E-15 -0.1608135921E+01 + -0.7296900222E-15 -0.1802345267E+01 0.5305490406E-15 + -0.1608135921E+01 0.5305490406E-15 -0.5577642076E+00 + Eigenvalues of Hessian: -0.1842158927E+01 -0.1802345267E+01 0.1455714282E+01 + Eigenvectors (columns) of Hessian: + 0.6240685235E+00 0.1686365420E-14 -0.7813696167E+00 + 0.3341919019E-14 -0.1000000000E+01 0.2267511291E-15 + 0.7813696167E+00 0.2752782226E-14 0.6240685235E+00 + Determinant of Hessian: 0.4833271910E+01 + Ellipticity of electron density: 0.022090 + eta index: 1.265467 + + ---------------- CP 5, Type (3,-1) ---------------- + Connected atoms: 1(H ) -- 2(O ) + Position (Bohr): 1.139728273109 0.000000000000 0.619195673290 + Position (Angstrom): 0.603118228751 0.000000000000 0.327664239395 + Density of all electrons: 0.3555268313E+00 + Density of Alpha electrons: 0.1777634156E+00 + Density of Beta electrons: 0.1777634156E+00 + Spin density of electrons: 0.0000000000E+00 + Lagrangian kinetic energy G(r): 0.7225412024E-01 + G(r) in X,Y,Z: 0.1525767948E-01 0.3373165197E-01 0.2326478879E-01 + Hamiltonian kinetic energy K(r): 0.6194515984E+00 + Potential energy density V(r): -0.6917057186E+00 + Energy density E(r) or H(r): -0.6194515984E+00 + Laplacian of electron density: -0.2188789912E+01 + Electron localization function (ELF): 0.9804906069E+00 + Localized orbital locator (LOL): 0.8763940244E+00 + Local information entropy: 0.1186300475E+00 + Interaction region indicator (IRI): 0.1092522371E-14 + Reduced density gradient (RDG): 0.1000000000E+03 + Reduced density gradient with promolecular approximation: 0.1000000000E+03 + Sign(lambda2)*rho: -0.3555268313E+00 + Sign(lambda2)*rho with promolecular approximation: -0.2179416158E+00 + Corr. hole for alpha, ref.: 0.00000 0.00000 0.00000 : -0.1521712915E-01 + Source function, ref.: 0.00000 0.00000 0.00000 : 0.1342862893E+00 + Wavefunction value for orbital 1 : -0.8709544497E-03 + Average local ionization energy (ALIE): 0.6306096902E+00 + van der Waals potential (probe atom: C ): 0.7516746618E+14 kcal/mol + Delta-g (under promolecular approximation): 0.5517191603E+00 + Delta-g (under Hirshfeld partition): 0.8206477678E+00 + User-defined real space function: 0.1000000000E+01 + ESP from nuclear charges: 0.8670885241E+01 + ESP from electrons: -0.6660434572E+01 + Total ESP: 0.2010450669E+01 a.u. ( 0.5470714E+02 eV, 0.1261578E+04 kcal/mol) + + Note: Below information are for electron density + + Components of gradient in x/y/z are: + -0.2914335440E-15 0.1956744823E-30 -0.1942890293E-15 + Norm of gradient is: 0.3502595287E-15 + + Components of Laplacian in x/y/z are: + 0.1713195623E+00 -0.1802345267E+01 -0.5577642076E+00 + Total: -0.2188789912E+01 + + Hessian matrix: + 0.1713195623E+00 0.9434550634E-16 0.1608135921E+01 + 0.9434550634E-16 -0.1802345267E+01 0.1065551374E-16 + 0.1608135921E+01 0.1065551374E-16 -0.5577642076E+00 + Eigenvalues of Hessian: -0.1842158927E+01 -0.1802345267E+01 0.1455714282E+01 + Eigenvectors (columns) of Hessian: + -0.6240685235E+00 0.0000000000E+00 0.7813696167E+00 + 0.0000000000E+00 -0.1000000000E+01 0.0000000000E+00 + 0.7813696167E+00 0.0000000000E+00 0.6240685235E+00 + Determinant of Hessian: 0.4833271910E+01 + Ellipticity of electron density: 0.022090 + eta index: 1.265467 + diff --git a/atomate/qchem/test_files/multiwfn_example/WAVEFUNCTION.wfn.gz b/atomate/qchem/test_files/multiwfn_example/WAVEFUNCTION.wfn.gz new file mode 100644 index 000000000..5dd004996 Binary files /dev/null and b/atomate/qchem/test_files/multiwfn_example/WAVEFUNCTION.wfn.gz differ diff --git a/atomate/qchem/test_files/multiwfn_example/mol.qin.gz b/atomate/qchem/test_files/multiwfn_example/mol.qin.gz new file mode 100644 index 000000000..233dce5fc Binary files /dev/null and b/atomate/qchem/test_files/multiwfn_example/mol.qin.gz differ diff --git a/atomate/qchem/test_files/multiwfn_example/mol.qin.orig.gz b/atomate/qchem/test_files/multiwfn_example/mol.qin.orig.gz new file mode 100644 index 000000000..30d8b1422 Binary files /dev/null and b/atomate/qchem/test_files/multiwfn_example/mol.qin.orig.gz differ diff --git a/atomate/qchem/test_files/multiwfn_example/mol.qout.gz b/atomate/qchem/test_files/multiwfn_example/mol.qout.gz new file mode 100644 index 000000000..5aee097b7 Binary files /dev/null and b/atomate/qchem/test_files/multiwfn_example/mol.qout.gz differ