def check_sanity(self): lib.StreamObject.check_sanity(self) cell = self.cell if (cell.dimension < 2 or (cell.dimension == 2 and cell.low_dim_ft_type == 'inf_vacuum')): raise RuntimeError( 'FFTDF method does not support 0D/1D low-dimension ' 'PBC system. DF, MDF or AFTDF methods should ' 'be used.\nSee also examples/pbc/31-low_dimensional_pbc.py') if not cell.has_ecp(): logger.warn( self, 'FFTDF integrals are found in all-electron ' 'calculation. It often causes huge error.\n' 'Recommended methods are DF or MDF. In SCF calculation, ' 'they can be initialized as\n' ' mf = mf.density_fit()\nor\n' ' mf = mf.mix_density_fit()') if cell.ke_cutoff is None: ke_cutoff = tools.mesh_to_cutoff(cell.lattice_vectors(), self.mesh).min() else: ke_cutoff = numpy.min(cell.ke_cutoff) ke_guess = estimate_ke_cutoff(cell, cell.precision) if ke_cutoff < ke_guess * KE_SCALING: mesh_guess = tools.cutoff_to_mesh(cell.lattice_vectors(), ke_guess) logger.warn( self, 'ke_cutoff/mesh (%g / %s) is not enough for FFTDF ' 'to get integral accuracy %g.\nCoulomb integral error ' 'is ~ %.2g Eh.\nRecommended ke_cutoff/mesh are %g / %s.', ke_cutoff, self.mesh, cell.precision, error_for_ke_cutoff(cell, ke_cutoff), ke_guess, mesh_guess) return self
def __init__(self, cell, kpts=numpy.zeros((1, 3))): self.cell = cell self.stdout = cell.stdout self.verbose = cell.verbose self.max_memory = cell.max_memory self.mesh = cell.mesh # For nuclear attraction integrals using Ewald-like technique. # Set to 0 to swith off Ewald tech and use the regular reciprocal space # method (solving Poisson equation of nuclear charges in reciprocal space). if cell.dimension == 0: self.eta = 0.2 else: ke_cutoff = tools.mesh_to_cutoff(cell.lattice_vectors(), self.mesh) ke_cutoff = ke_cutoff[:cell.dimension].min() self.eta = max( estimate_eta_for_ke_cutoff(cell, ke_cutoff, cell.precision), estimate_eta(cell, cell.precision)) self.kpts = kpts # to mimic molecular DF object self.blockdim = getattr(__config__, 'pbc_df_df_DF_blockdim', 240) # The following attributes are not input options. self.exxdiv = None # to mimic KRHF/KUHF object in function get_coulG self._keys = set(self.__dict__.keys())
def __init__(self, cell, kpts=numpy.zeros((1, 3))): self.cell = cell self.stdout = cell.stdout self.verbose = cell.verbose self.max_memory = cell.max_memory self.kpts = kpts # default is gamma point self.kpts_band = None self._auxbasis = None # Search for optimized eta and mesh here. if cell.dimension == 0: self.eta = 0.2 self.mesh = cell.mesh else: ke_cutoff = tools.mesh_to_cutoff(cell.lattice_vectors(), cell.mesh) ke_cutoff = ke_cutoff[:cell.dimension].min() eta_cell = aft.estimate_eta_for_ke_cutoff(cell, ke_cutoff, cell.precision) eta_guess = estimate_eta(cell, cell.precision) if eta_cell < eta_guess: self.eta = eta_cell # TODO? Round off mesh to the nearest odd numbers. # Odd number of grids is preferred because even number of # grids may break the conjugation symmetry between the # k-points k and -k. #?self.mesh = [(n//2)*2+1 for n in cell.mesh] self.mesh = cell.mesh else: self.eta = eta_guess ke_cutoff = aft.estimate_ke_cutoff_for_eta( cell, self.eta, cell.precision) self.mesh = tools.cutoff_to_mesh(cell.lattice_vectors(), ke_cutoff) if cell.dimension < 2 or cell.low_dim_ft_type == 'inf_vacuum': self.mesh[cell.dimension:] = cell.mesh[cell.dimension:] # exp_to_discard to remove diffused fitting functions. The diffused # fitting functions may cause linear dependency in DF metric. Removing # the fitting functions whose exponents are smaller than exp_to_discard # can improve the linear dependency issue. However, this parameter # affects the quality of the auxiliary basis. The default value of # this parameter was set to 0.2 in v1.5.1 or older and was changed to # 0 since v1.5.2. self.exp_to_discard = cell.exp_to_discard # The following attributes are not input options. self.exxdiv = None # to mimic KRHF/KUHF object in function get_coulG self.auxcell = None self.blockdim = getattr(__config__, 'pbc_df_df_DF_blockdim', 240) self.linear_dep_threshold = LINEAR_DEP_THR self._j_only = False # If _cderi_to_save is specified, the 3C-integral tensor will be saved in this file. self._cderi_to_save = tempfile.NamedTemporaryFile(dir=lib.param.TMPDIR) # If _cderi is specified, the 3C-integral tensor will be read from this file self._cderi = None self._keys = set(self.__dict__.keys())
def eta(self): if self._eta is not None: return self._eta else: cell = self.cell if cell.dimension == 0: return 0.2 ke_cutoff = tools.mesh_to_cutoff(cell.lattice_vectors(), self.mesh) ke_cutoff = ke_cutoff[:cell.dimension].min() return aft.estimate_eta_for_ke_cutoff(cell, ke_cutoff, cell.precision)
def _guess_omega(cell, kpts, mesh=None): nao = cell.npgto_nr() nkpts = len(kpts) nkk = nkpts**(1./3) * 2 - 1 if mesh is None: mesh = [max(5, int(cell.rcut * nao ** (1./3) / nkk + 1))] * 3 mesh = np.min([cell.mesh, mesh], axis=0) ke_cutoff = min(pbctools.mesh_to_cutoff(cell.lattice_vectors(), mesh[:cell.dimension])) omega = aft.estimate_omega_for_ke_cutoff(cell, ke_cutoff) return omega, mesh, ke_cutoff
def check_sanity(self): lib.StreamObject.check_sanity(self) cell = self.cell if not cell.has_ecp(): logger.warn( self, 'AFTDF integrals are found in all-electron ' 'calculation. It often causes huge error.\n' 'Recommended methods are DF or MDF. In SCF calculation, ' 'they can be initialized as\n' ' mf = mf.density_fit()\nor\n' ' mf = mf.mix_density_fit()') if cell.dimension > 0: if cell.ke_cutoff is None: ke_cutoff = tools.mesh_to_cutoff(cell.lattice_vectors(), self.mesh) ke_cutoff = ke_cutoff[:cell.dimension].min() else: ke_cutoff = numpy.min(cell.ke_cutoff) ke_guess = estimate_ke_cutoff(cell, cell.precision) mesh_guess = tools.cutoff_to_mesh(cell.lattice_vectors(), ke_guess) if ke_cutoff < ke_guess * KE_SCALING: logger.warn( self, 'ke_cutoff/mesh (%g / %s) is not enough for AFTDF ' 'to get integral accuracy %g.\nCoulomb integral error ' 'is ~ %.2g Eh.\nRecommended ke_cutoff/mesh are %g / %s.', ke_cutoff, self.mesh, cell.precision, error_for_ke_cutoff(cell, ke_cutoff), ke_guess, mesh_guess) else: mesh_guess = numpy.copy(self.mesh) if cell.dimension < 3: err = numpy.exp(-0.436392335 * min(self.mesh[cell.dimension:]) - 2.99944305) err *= cell.nelectron meshz = pbcgto.cell._mesh_inf_vaccum(cell) mesh_guess[cell.dimension:] = int(meshz) if err > cell.precision * 10: logger.warn( self, 'mesh %s of AFTDF may not be enough to get ' 'integral accuracy %g for %dD PBC system.\n' 'Coulomb integral error is ~ %.2g Eh.\n' 'Recommended mesh is %s.', self.mesh, cell.precision, cell.dimension, err, mesh_guess) if (cell.mesh[cell.dimension:] / (1. * meshz) > 1.1).any(): meshz = pbcgto.cell._mesh_inf_vaccum(cell) logger.warn( self, 'setting mesh %s of AFTDF too high in non-periodic direction ' '(=%s) can result in an unnecessarily slow calculation.\n' 'For coulomb integral error of ~ %.2g Eh in %dD PBC, \n' 'a recommended mesh for non-periodic direction is %s.', self.mesh, self.mesh[cell.dimension:], cell.precision, cell.dimension, mesh_guess[cell.dimension:]) return self
def __init__(self, cell, kpts=numpy.zeros((1,3))): self.cell = cell self.stdout = cell.stdout self.verbose = cell.verbose self.max_memory = cell.max_memory self.kpts = kpts # default is gamma point self.kpts_band = None self._auxbasis = None # Search for optimized eta and mesh here. if cell.dimension == 0: self.eta = 0.2 self.mesh = cell.mesh else: ke_cutoff = tools.mesh_to_cutoff(cell.lattice_vectors(), cell.mesh) ke_cutoff = ke_cutoff[:cell.dimension].min() eta_cell = aft.estimate_eta_for_ke_cutoff(cell, ke_cutoff, cell.precision) eta_guess = estimate_eta(cell, cell.precision) if eta_cell < eta_guess: self.eta = eta_cell # TODO? Round off mesh to the nearest odd numbers. # Odd number of grids is preferred because even number of # grids may break the conjugation symmetry between the # k-points k and -k. #?self.mesh = [(n//2)*2+1 for n in cell.mesh] self.mesh = cell.mesh else: self.eta = eta_guess ke_cutoff = aft.estimate_ke_cutoff_for_eta(cell, self.eta, cell.precision) self.mesh = tools.cutoff_to_mesh(cell.lattice_vectors(), ke_cutoff) if cell.dimension < 2 or cell.low_dim_ft_type == 'inf_vacuum': self.mesh[cell.dimension:] = cell.mesh[cell.dimension:] # exp_to_discard to remove diffused fitting functions. The diffused # fitting functions may cause linear dependency in DF metric. Removing # the fitting functions whose exponents are smaller than exp_to_discard # can improve the linear dependency issue. However, this parameter # affects the quality of the auxiliary basis. The default value of # this parameter was set to 0.2 in v1.5.1 or older and was changed to # 0 since v1.5.2. self.exp_to_discard = cell.exp_to_discard # The following attributes are not input options. self.exxdiv = None # to mimic KRHF/KUHF object in function get_coulG self.auxcell = None self.blockdim = getattr(__config__, 'pbc_df_df_DF_blockdim', 240) self.linear_dep_threshold = LINEAR_DEP_THR self._j_only = False # If _cderi_to_save is specified, the 3C-integral tensor will be saved in this file. self._cderi_to_save = tempfile.NamedTemporaryFile(dir=lib.param.TMPDIR) # If _cderi is specified, the 3C-integral tensor will be read from this file self._cderi = None self._keys = set(self.__dict__.keys())
def check_sanity(self): lib.StreamObject.check_sanity(self) cell = self.cell if not cell.has_ecp(): logger.warn(self, 'AFTDF integrals are found in all-electron ' 'calculation. It often causes huge error.\n' 'Recommended methods are DF or MDF. In SCF calculation, ' 'they can be initialized as\n' ' mf = mf.density_fit()\nor\n' ' mf = mf.mix_density_fit()') if cell.dimension > 0: if cell.ke_cutoff is None: ke_cutoff = tools.mesh_to_cutoff(cell.lattice_vectors(), self.mesh) ke_cutoff = ke_cutoff[:cell.dimension].min() else: ke_cutoff = numpy.min(cell.ke_cutoff) ke_guess = estimate_ke_cutoff(cell, cell.precision) mesh_guess = tools.cutoff_to_mesh(cell.lattice_vectors(), ke_guess) if ke_cutoff < ke_guess * KE_SCALING: logger.warn(self, 'ke_cutoff/mesh (%g / %s) is not enough for AFTDF ' 'to get integral accuracy %g.\nCoulomb integral error ' 'is ~ %.2g Eh.\nRecommended ke_cutoff/mesh are %g / %s.', ke_cutoff, self.mesh, cell.precision, error_for_ke_cutoff(cell, ke_cutoff), ke_guess, mesh_guess) else: mesh_guess = numpy.copy(self.mesh) if cell.dimension < 3: err = numpy.exp(-0.436392335*min(self.mesh[cell.dimension:]) - 2.99944305) err *= cell.nelectron meshz = pbcgto.cell._mesh_inf_vaccum(cell) mesh_guess[cell.dimension:] = int(meshz) if err > cell.precision*10: logger.warn(self, 'mesh %s of AFTDF may not be enough to get ' 'integral accuracy %g for %dD PBC system.\n' 'Coulomb integral error is ~ %.2g Eh.\n' 'Recommended mesh is %s.', self.mesh, cell.precision, cell.dimension, err, mesh_guess) if (cell.mesh[cell.dimension:]/(1.*meshz) > 1.1).any(): meshz = pbcgto.cell._mesh_inf_vaccum(cell) logger.warn(self, 'setting mesh %s of AFTDF too high in non-periodic direction ' '(=%s) can result in an unnecessarily slow calculation.\n' 'For coulomb integral error of ~ %.2g Eh in %dD PBC, \n' 'a recommended mesh for non-periodic direction is %s.', self.mesh, self.mesh[cell.dimension:], cell.precision, cell.dimension, mesh_guess[cell.dimension:]) return self
def __init__(self, cell, kpts=numpy.zeros((1, 3))): self.cell = cell self.stdout = cell.stdout self.verbose = cell.verbose self.max_memory = cell.max_memory self.kpts = kpts # default is gamma point self.kpts_band = None self._auxbasis = None if cell.dimension == 0: self.eta = 0.2 self.mesh = cell.mesh else: ke_cutoff = tools.mesh_to_cutoff(cell.lattice_vectors(), cell.mesh) ke_cutoff = ke_cutoff[:cell.dimension].min() eta_cell = aft.estimate_eta_for_ke_cutoff(cell, ke_cutoff, cell.precision) eta_guess = estimate_eta(cell, cell.precision) if eta_cell < eta_guess: self.eta = eta_cell self.mesh = cell.mesh else: self.eta = eta_guess ke_cutoff = aft.estimate_ke_cutoff_for_eta( cell, self.eta, cell.precision) self.mesh = tools.cutoff_to_mesh(cell.lattice_vectors(), ke_cutoff) self.mesh[cell.dimension:] = cell.mesh[cell.dimension:] # Not input options self.exxdiv = None # to mimic KRHF/KUHF object in function get_coulG self.auxcell = None self.blockdim = getattr(__config__, 'pbc_df_df_DF_blockdim', 240) self.linear_dep_threshold = LINEAR_DEP_THR self._j_only = False # If _cderi_to_save is specified, the 3C-integral tensor will be saved in this file. self._cderi_to_save = tempfile.NamedTemporaryFile(dir=lib.param.TMPDIR) # If _cderi is specified, the 3C-integral tensor will be read from this file self._cderi = None self._keys = set(self.__dict__.keys())
def __init__(self, cell, kpts=numpy.zeros((1,3))): self.cell = cell self.stdout = cell.stdout self.verbose = cell.verbose self.max_memory = cell.max_memory self.mesh = cell.mesh # For nuclear attraction integrals using Ewald-like technique. # Set to 0 to swith off Ewald tech and use the regular reciprocal space # method (solving Poisson equation of nuclear charges in reciprocal space). if cell.dimension == 0: self.eta = 0.2 else: ke_cutoff = tools.mesh_to_cutoff(cell.lattice_vectors(), self.mesh) ke_cutoff = ke_cutoff[:cell.dimension].min() self.eta = max(estimate_eta_for_ke_cutoff(cell, ke_cutoff, cell.precision), estimate_eta(cell, cell.precision)) self.kpts = kpts # to mimic molecular DF object self.blockdim = getattr(__config__, 'pbc_df_df_DF_blockdim', 240) # The following attributes are not input options. self.exxdiv = None # to mimic KRHF/KUHF object in function get_coulG self._keys = set(self.__dict__.keys())