Source code for procedures.proc_util

#
# @BEGIN LICENSE
#
# PSI4: an ab initio quantum chemistry software package
#
# 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 2 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, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# @END LICENSE
#

from __future__ import print_function
from __future__ import absolute_import
# Relative hack for now
import os, sys, inspect
path_dir = os.path.realpath(os.path.abspath(os.path.join(os.path.split(inspect.getfile( inspect.currentframe() ))[0],"../")))
sys.path.append(path_dir)
from p4util.exceptions import *
import p4util
import psi4

[docs]def scf_set_reference_local(name): """ Figures out the correct SCF reference to set locally """ optstash = p4util.OptionsState( ['SCF', 'DFT_FUNCTIONAL'], ['SCF', 'SCF_TYPE'], ['SCF', 'REFERENCE']) # Alter default algorithm if not psi4.has_option_changed('SCF', 'SCF_TYPE'): psi4.set_local_option('SCF', 'SCF_TYPE', 'DF') if name == 'hf': if psi4.get_option('SCF','REFERENCE') == 'RKS': psi4.set_local_option('SCF','REFERENCE','RHF') elif psi4.get_option('SCF','REFERENCE') == 'UKS': psi4.set_local_option('SCF','REFERENCE','UHF') elif name == 'scf': if psi4.get_option('SCF','REFERENCE') == 'RKS': if (len(psi4.get_option('SCF', 'DFT_FUNCTIONAL')) > 0) or psi4.get_option('SCF', 'DFT_CUSTOM_FUNCTIONAL') is not None: pass else: psi4.set_local_option('SCF','REFERENCE','RHF') elif psi4.get_option('SCF','REFERENCE') == 'UKS': if (len(psi4.get_option('SCF', 'DFT_FUNCTIONAL')) > 0) or psi4.get_option('SCF', 'DFT_CUSTOM_FUNCTIONAL') is not None: pass else: psi4.set_local_option('SCF','REFERENCE','UHF') return optstash
[docs]def dft_set_reference_local(name): """ Figures out the correct DFT reference to set locally """ optstash = p4util.OptionsState( ['SCF', 'DFT_FUNCTIONAL'], ['SCF', 'REFERENCE'], ['SCF', 'SCF_TYPE'], ['DF_BASIS_MP2'], ['DFMP2', 'MP2_OS_SCALE'], ['DFMP2', 'MP2_SS_SCALE']) # Alter default algorithm if not psi4.has_option_changed('SCF', 'SCF_TYPE'): psi4.set_local_option('SCF', 'SCF_TYPE', 'DF') psi4.set_local_option('SCF', 'DFT_FUNCTIONAL', name) user_ref = psi4.get_option('SCF', 'REFERENCE') if (user_ref == 'RHF'): psi4.set_local_option('SCF', 'REFERENCE', 'RKS') elif (user_ref == 'UHF'): psi4.set_local_option('SCF', 'REFERENCE', 'UKS') elif (user_ref == 'ROHF'): raise ValidationError('ROHF reference for DFT is not available.') elif (user_ref == 'CUHF'): raise ValidationError('CUHF reference for DFT is not available.') return optstash
[docs]def oeprop_validator(prop_list): """ Validations a list of OEProp computations. Throws if not found """ oeprop_methods = ['DIPOLE', 'QUADRUPOLE', 'MULLIKEN_CHARGES', 'LOWDIN_CHARGES', 'WIBERG_LOWDIN_INDICES', 'MAYER_INDICES', 'MAYER_INDICES', 'MO_EXTENTS', 'GRID_FIELD', 'GRID_ESP', 'ESP_AT_NUCLEI', 'NO_OCCUPATIONS'] if not len(prop_list): raise ValidationnError("OEProp: No properties specified!") for prop in prop_list: prop = prop.upper() if 'MULTIPOLE(' in prop: continue if prop not in oeprop_methods: alt_method_name = p4util.text.find_approximate_string_matches(prop, oeprop_methods, 2) alternatives = "" if len(alt_method_name) > 0: alternatives = " Did you mean? %s" % (" ".join(alt_method_name)) raise ValidationError("OEProp: Feature '%s' is not recognized. %s" % (prop, alternatives))
[docs]def check_iwl_file_from_scf_type(scf_type, wfn): """ Ensures that a IWL file has been written based on input SCF type. """ if scf_type in ['DF', 'CD', 'PK', 'DIRECT']: mints = psi4.MintsHelper(wfn.basisset()) mints.set_print(1) mints.integrals()
[docs]def check_non_symmetric_jk_density(name): """ Ensure non-symmetric density matrices are supported for the selected JK routine. """ scf_type = psi4.get_option('SCF', 'SCF_TYPE') supp_jk_type = ['DF', 'CD', 'PK', 'DIRECT', 'OUT_OF_CORE'] supp_string = ', '.join(supp_jk_type[:-1]) + ', or ' + supp_jk_type[-1] + '.' if scf_type not in supp_jk_type: raise ValidationError("Method %s: Requires support for non-symmetric density matrices.\n" " Please set SCF_TYPE to %s" % (name, supp_string))