Esempio n. 1
0
    def compute_energy(self, molecule: 'psi4.core.Molecule', wfn: 'psi4.core.Wavefunction' = None) -> float:
        """Compute dispersion energy based on engine, dispersion level, and parameters in `self`.

        Parameters
        ----------
        molecule : psi4.core.Molecule
            System for which to compute empirical dispersion correction.
        wfn :
            Location to set QCVariables

        Returns
        -------
        float
            Dispersion energy [Eh].

        Notes
        -----
        DISPERSION CORRECTION ENERGY
            Disp always set. Overridden in SCF finalization, but that only changes for "-3C" methods.
        self.fctldash + DISPERSION CORRECTION ENERGY
            Set if `fctldash` nonempty.

        """
        if self.engine in ['dftd3', 'mp2d']:
            resi = ResultInput(
                **{
                    'driver': 'energy',
                    'model': {
                        'method': self.fctldash,
                        'basis': '(auto)',
                    },
                    'keywords': {
                        'level_hint': self.dashlevel,
                        'params_tweaks': self.dashparams,
                        'dashcoeff_supplement': self.dashcoeff_supplement,
                        'verbose': 1,
                    },
                    'molecule': molecule.to_schema(dtype=2),
                    'provenance': p4util.provenance_stamp(__name__),
                })
            jobrec = qcng.compute(resi, self.engine, raise_error=True)

            dashd_part = float(jobrec.extras['qcvars']['DISPERSION CORRECTION ENERGY'])
            if wfn is not None:
                for k, qca in jobrec.extras['qcvars'].items():
                    if 'CURRENT' not in k:
                        wfn.set_variable(k, p4util.plump_qcvar(qca, k))

            if self.fctldash in ['hf3c', 'pbeh3c']:
                gcp_part = gcp.run_gcp(molecule, self.fctldash, verbose=False, dertype=0)
                dashd_part += gcp_part

            return dashd_part

        else:
            ene = self.disp.compute_energy(molecule)
            core.set_variable('DISPERSION CORRECTION ENERGY', ene)
            if self.fctldash:
                core.set_variable('{} DISPERSION CORRECTION ENERGY'.format(self.fctldash), ene)
            return ene
Esempio n. 2
0
    def compute_energy(self, molecule):
        """Compute dispersion energy based on engine, dispersion level, and parameters in `self`.

        Parameters
        ----------
        molecule : psi4.core.Molecule
            System for which to compute empirical dispersion correction.

        Returns
        -------
        float
            Dispersion energy [Eh].

        Notes
        -----
        DISPERSION CORRECTION ENERGY
            Disp always set. Overridden in SCF finalization, but that only changes for "-3C" methods.
        self.fctldash + DISPERSION CORRECTION ENERGY
            Set if `fctldash` nonempty.

        """
        if self.engine in ['dftd3', 'mp2d']:
            resinp = {
                'schema_name': 'qcschema_input',
                'schema_version': 1,
                'molecule': molecule.to_schema(dtype=2),
                'driver': 'energy',
                'model': {
                    'method': self.fctldash,
                    'basis': '(auto)',
                },
                'keywords': {
                    'level_hint': self.dashlevel,
                    'params_tweaks': self.dashparams,
                    'dashcoeff_supplement': self.dashcoeff_supplement,
                    'verbose': 1,
                },
            }
            jobrec = qcng.compute(resinp, self.engine, raise_error=True)
            jobrec = jobrec.dict()

            dashd_part = float(jobrec['extras']['qcvars']['DISPERSION CORRECTION ENERGY'])
            for k, qca in jobrec['extras']['qcvars'].items():
                if not isinstance(qca, (list, np.ndarray)):
                    core.set_variable(k, qca)

            if self.fctldash in ['hf3c', 'pbeh3c']:
                gcp_part = gcp.run_gcp(molecule, self.fctldash, verbose=False, dertype=0)
                dashd_part += gcp_part

            return dashd_part

        else:
            ene = self.disp.compute_energy(molecule)
            core.set_variable('DISPERSION CORRECTION ENERGY', ene)
            if self.fctldash:
                core.set_variable('{} DISPERSION CORRECTION ENERGY'.format(self.fctldash), ene)
            return ene
Esempio n. 3
0
    def compute_energy(self, molecule):
        """Compute dispersion energy based on engine, dispersion level, and parameters in `self`.

        Parameters
        ----------
        molecule : psi4.core.Molecule
            System for which to compute empirical dispersion correction.

        Returns
        -------
        float
            Dispersion energy [Eh].

        Notes
        -----
        DISPERSION CORRECTION ENERGY
            Disp always set. Overridden in SCF finalization, but that only changes for "-3C" methods.
        self.fctldash + DISPERSION CORRECTION ENERGY
            Set if `fctldash` nonempty.

        """
        if self.engine == 'dftd3':
            jobrec = intf_dftd3.run_dftd3_from_arrays(
                molrec=molecule.to_dict(np_out=False),
                name_hint=self.fctldash,
                level_hint=self.dashlevel,
                param_tweaks=self.dashparams,
                dashcoeff_supplement=self.dashcoeff_supplement,
                ptype='energy',
                verbose=1)

            dashd_part = float(
                jobrec['qcvars']['DISPERSION CORRECTION ENERGY'].data)
            for k, qca in jobrec['qcvars'].items():
                if not isinstance(qca.data, np.ndarray):
                    core.set_variable(k, qca.data)

            if self.fctldash in ['hf3c', 'pbeh3c']:
                gcp_part = gcp.run_gcp(molecule,
                                       self.fctldash,
                                       verbose=False,
                                       dertype=0)
                dashd_part += gcp_part

            return dashd_part
        else:
            ene = self.disp.compute_energy(molecule)
            core.set_variable('DISPERSION CORRECTION ENERGY', ene)
            if self.fctldash:
                core.set_variable(
                    '{} DISPERSION CORRECTION ENERGY'.format(self.fctldash),
                    ene)
            return ene
Esempio n. 4
0
 def compute_energy(self, molecule):
     if self.disp_type == 'gr':
         if self.alias in ['HF3C', 'PBEH3C']:
             dashd_part = dftd3.run_dftd3(molecule, dashlvl=self.dtype.lower().replace('-', ''),
                                          dashparam=self.dash_params, verbose=False, dertype=0)
             gcp_part = gcp.run_gcp(molecule, self.alias.lower(), verbose=False, dertype=0)
             return dashd_part + gcp_part
         else:
             return dftd3.run_dftd3(molecule, dashlvl=self.dtype.lower().replace('-', ''),
                                    dashparam=self.dash_params, verbose=False, dertype=0)
     else:
         return self.disp.compute_energy(molecule)
Esempio n. 5
0
    def compute_gradient(self, molecule: 'psi4.core.Molecule',
                         wfn: 'psi4.core.Wavefunction' = None) -> 'psi4.core.Matrix':
        """Compute dispersion gradient based on engine, dispersion level, and parameters in `self`.

        Parameters
        ----------
        molecule : psi4.core.Molecule
            System for which to compute empirical dispersion correction.
        wfn :
            Location to set QCVariables

        Returns
        -------
        psi4.core.Matrix
            (nat, 3) dispersion gradient [Eh/a0].

        """
        if self.engine in ['dftd3', 'mp2d']:
            resi = AtomicInput(
                **{
                    'driver': 'gradient',
                    'model': {
                        'method': self.fctldash,
                        'basis': '(auto)',
                    },
                    'keywords': {
                        'level_hint': self.dashlevel,
                        'params_tweaks': self.dashparams,
                        'dashcoeff_supplement': self.dashcoeff_supplement,
                        'verbose': 1,
                    },
                    'molecule': molecule.to_schema(dtype=2),
                    'provenance': p4util.provenance_stamp(__name__),
                })
            jobrec = qcng.compute(resi, self.engine, raise_error=True,
                                  local_options={"scratch_directory": core.IOManager.shared_object().get_default_path()})

            dashd_part = core.Matrix.from_array(
                np.array(jobrec.extras['qcvars']['DISPERSION CORRECTION GRADIENT']).reshape(-1, 3))
            if wfn is not None:
                for k, qca in jobrec.extras['qcvars'].items():
                    if 'CURRENT' not in k:
                        wfn.set_variable(k, p4util.plump_qcvar(qca, k))

            if self.fctldash in ['hf3c', 'pbeh3c']:
                gcp_part = gcp.run_gcp(molecule, self.fctldash, verbose=False, dertype=1)
                dashd_part.add(gcp_part)

            return dashd_part
        else:
            return self.disp.compute_gradient(molecule)
Esempio n. 6
0
    def compute_energy(self, molecule):
        """Compute dispersion energy based on engine, dispersion level, and parameters in `self`.

        Parameters
        ----------
        molecule : psi4.core.Molecule
            System for which to compute empirical dispersion correction.

        Returns
        -------
        float
            Dispersion energy [Eh].

        Notes
        -----
        DISPERSION CORRECTION ENERGY
            Disp always set. Overridden in SCF finalization, but that only changes for "-3C" methods.
        self.fctldash + DISPERSION CORRECTION ENERGY
            Set if `fctldash` nonempty.

        """
        if self.engine == 'dftd3':
            jobrec = intf_dftd3.run_dftd3_from_arrays(
                molrec=molecule.to_dict(np_out=False),
                name_hint=self.fctldash,
                level_hint=self.dashlevel,
                param_tweaks=self.dashparams,
                dashcoeff_supplement=self.dashcoeff_supplement,
                ptype='energy',
                verbose=1)

            dashd_part = float(jobrec['qcvars']['DISPERSION CORRECTION ENERGY'].data)
            for k, qca in jobrec['qcvars'].items():
                if not isinstance(qca.data, np.ndarray):
                    core.set_variable(k, qca.data)

            if self.fctldash in ['hf3c', 'pbeh3c']:
                gcp_part = gcp.run_gcp(molecule, self.fctldash, verbose=False, dertype=0)
                dashd_part += gcp_part

            return dashd_part
        else:
            ene = self.disp.compute_energy(molecule)
            core.set_variable('DISPERSION CORRECTION ENERGY', ene)
            if self.fctldash:
                core.set_variable('{} DISPERSION CORRECTION ENERGY'.format(self.fctldash), ene)
            return ene
Esempio n. 7
0
    def compute_gradient(self, molecule):
        """Compute dispersion gradient based on engine, dispersion level, and parameters in `self`.

        Parameters
        ----------
        molecule : psi4.core.Molecule
            System for which to compute empirical dispersion correction.

        Returns
        -------
        psi4.core.Matrix
            (nat, 3) dispersion gradient [Eh/a0].

        """
        if self.engine in ['dftd3', 'mp2d']:
            resinp = {
                'schema_name': 'qcschema_input',
                'schema_version': 1,
                'molecule': molecule.to_schema(dtype=2),
                'driver': 'gradient',
                'model': {
                    'method': self.fctldash,
                    'basis': '(auto)',
                },
                'keywords': {
                    'level_hint': self.dashlevel,
                    'params_tweaks': self.dashparams,
                    'dashcoeff_supplement': self.dashcoeff_supplement,
                    'verbose': 1,
                },
            }
            jobrec = qcng.compute(resinp, self.engine, raise_error=True)
            jobrec = jobrec.dict()

            dashd_part = core.Matrix.from_array(np.array(jobrec['extras']['qcvars']['DISPERSION CORRECTION GRADIENT']).reshape(-1, 3))
            for k, qca in jobrec['extras']['qcvars'].items():
                if not isinstance(qca, (list, np.ndarray)):
                    core.set_variable(k, qca)

            if self.fctldash in ['hf3c', 'pbeh3c']:
                gcp_part = gcp.run_gcp(molecule, self.fctldash, verbose=False, dertype=1)
                dashd_part.add(gcp_part)

            return dashd_part
        else:
            return self.disp.compute_gradient(molecule)
Esempio n. 8
0
 def compute_gradient(self, molecule):
     if self.disp_type == 'gr':
         if self.alias in ['hf3c', 'pbeh3c']:
             dashd_part = dftd3.run_dftd3(
                 molecule,
                 dashlvl=self.dtype.lower().replace('-', ''),
                 dashparam=self.dash_params,
                 verbose=False,
                 dertype=1)
             gcp_part = gcp.run_gcp(molecule, self.alias.lower(), verbose=False, dertype=1)
             dashd_part.add(gcp_part)
             return dashd_part
         else:
             return dftd3.run_dftd3(
                 molecule,
                 dashlvl=self.dtype.lower().replace('-', ''),
                 dashparam=self.dash_params,
                 verbose=False,
                 dertype=1)
     else:
         return self.disp.compute_gradient(molecule)
Esempio n. 9
0
    def compute_gradient(self, molecule):
        """Compute dispersion gradient based on engine, dispersion level, and parameters in `self`.

        Parameters
        ----------
        molecule : psi4.core.Molecule
            System for which to compute empirical dispersion correction.

        Returns
        -------
        psi4.core.Matrix
            (nat, 3) dispersion gradient [Eh/a0].

        """
        if self.engine == 'dftd3':
            jobrec = intf_dftd3.run_dftd3_from_arrays(
                molrec=molecule.to_dict(np_out=False),
                name_hint=self.fctldash,
                level_hint=self.dashlevel,
                param_tweaks=self.dashparams,
                dashcoeff_supplement=self.dashcoeff_supplement,
                ptype='gradient',
                verbose=1)

            dashd_part = core.Matrix.from_array(
                jobrec['qcvars']['DISPERSION CORRECTION GRADIENT'].data)
            for k, qca in jobrec['qcvars'].items():
                if not isinstance(qca.data, np.ndarray):
                    core.set_variable(k, qca.data)

            if self.fctldash in ['hf3c', 'pbeh3c']:
                gcp_part = gcp.run_gcp(molecule,
                                       self.fctldash,
                                       verbose=False,
                                       dertype=1)
                dashd_part.add(gcp_part)

            return dashd_part
        else:
            return self.disp.compute_gradient(molecule)
Esempio n. 10
0
 def compute_gradient(self, molecule):
     if self.disp_type == 'gr':
         if self.alias in ['hf3c', 'pbeh3c']:
             dashd_part = dftd3.run_dftd3(
                 molecule,
                 dashlvl=self.dtype.lower().replace('-', ''),
                 dashparam=self.dash_params,
                 verbose=False,
                 dertype=1)
             gcp_part = gcp.run_gcp(molecule,
                                    self.alias.lower(),
                                    verbose=False,
                                    dertype=1)
             dashd_part.add(gcp_part)
             return dashd_part
         else:
             return dftd3.run_dftd3(molecule,
                                    dashlvl=self.dtype.lower().replace(
                                        '-', ''),
                                    dashparam=self.dash_params,
                                    verbose=False,
                                    dertype=1)
     else:
         return self.disp.compute_gradient(molecule)
Esempio n. 11
0
    def compute_gradient(self, molecule):
        """Compute dispersion gradient based on engine, dispersion level, and parameters in `self`.

        Parameters
        ----------
        molecule : psi4.core.Molecule
            System for which to compute empirical dispersion correction.

        Returns
        -------
        psi4.core.Matrix
            (nat, 3) dispersion gradient [Eh/a0].

        """
        if self.engine == 'dftd3':
            jobrec = intf_dftd3.run_dftd3_from_arrays(
                molrec=molecule.to_dict(np_out=False),
                name_hint=self.fctldash,
                level_hint=self.dashlevel,
                param_tweaks=self.dashparams,
                dashcoeff_supplement=self.dashcoeff_supplement,
                ptype='gradient',
                verbose=1)

            dashd_part = core.Matrix.from_array(jobrec['qcvars']['DISPERSION CORRECTION GRADIENT'].data)
            for k, qca in jobrec['qcvars'].items():
                if not isinstance(qca.data, np.ndarray):
                    core.set_variable(k, qca.data)

            if self.fctldash in ['hf3c', 'pbeh3c']:
                gcp_part = gcp.run_gcp(molecule, self.fctldash, verbose=False, dertype=1)
                dashd_part.add(gcp_part)

            return dashd_part
        else:
            return self.disp.compute_gradient(molecule)
Esempio n. 12
0
    def compute_energy(self,
                       molecule: 'psi4.core.Molecule',
                       wfn: 'psi4.core.Wavefunction' = None) -> float:
        """Compute dispersion energy based on engine, dispersion level, and parameters in `self`.

        Parameters
        ----------
        molecule : psi4.core.Molecule
            System for which to compute empirical dispersion correction.
        wfn :
            Location to set QCVariables

        Returns
        -------
        float
            Dispersion energy [Eh].

        Notes
        -----
        DISPERSION CORRECTION ENERGY
            Disp always set. Overridden in SCF finalization, but that only changes for "-3C" methods.
        self.fctldash + DISPERSION CORRECTION ENERGY
            Set if `fctldash` nonempty.

        """
        if self.engine in ['dftd3', 'mp2d']:
            resi = AtomicInput(
                **{
                    'driver': 'energy',
                    'model': {
                        'method': self.fctldash,
                        'basis': '(auto)',
                    },
                    'keywords': {
                        'level_hint': self.dashlevel,
                        'params_tweaks': self.dashparams,
                        'dashcoeff_supplement': self.dashcoeff_supplement,
                        'save_pairwise_dispersion': self.save_pairwise_disp,
                        'verbose': 1,
                    },
                    'molecule': molecule.to_schema(dtype=2),
                    'provenance': p4util.provenance_stamp(__name__),
                })
            jobrec = qcng.compute(
                resi,
                self.engine,
                raise_error=True,
                local_options={
                    "scratch_directory":
                    core.IOManager.shared_object().get_default_path()
                })

            dashd_part = float(
                jobrec.extras['qcvars']['DISPERSION CORRECTION ENERGY'])
            if wfn is not None:
                for k, qca in jobrec.extras['qcvars'].items():
                    # The pairwise dispersion analysis is already a nparray
                    # Do we always want to save it?
                    if ('CURRENT' not in k) and ('PAIRWISE' not in k):
                        wfn.set_variable(k, p4util.plump_qcvar(qca, k))

                # Pass along the pairwise dispersion decomposition if we need it
                if self.save_pairwise_disp is True:
                    wfn.set_variable(
                        "PAIRWISE DISPERSION CORRECTION ANALYSIS",
                        jobrec.extras['qcvars']
                        ["PAIRWISE DISPERSION CORRECTION ANALYSIS"])

            if self.fctldash in ['hf3c', 'pbeh3c']:
                gcp_part = gcp.run_gcp(molecule,
                                       self.fctldash,
                                       verbose=False,
                                       dertype=0)
                dashd_part += gcp_part

            return dashd_part

        else:
            ene = self.disp.compute_energy(molecule)
            core.set_variable('DISPERSION CORRECTION ENERGY', ene)
            if self.fctldash:
                core.set_variable(
                    '{} DISPERSION CORRECTION ENERGY'.format(self.fctldash),
                    ene)
            return ene