def get_interpolated_gap(self, tol=0.001, abs_tol=False, spin=None): """ Expects a DOS object and finds the gap Args: tol: tolerance in occupations for determining the gap abs_tol: Set to True for an absolute tolerance and False for a relative one. spin: Possible values are: None - finds the ap in the summed densities Up - finds the gap in the up spin channel Down - finds the gap in teh down spin channel Returns: (gap, cbm, vbm): Tuple of floats in eV corresponding to the gap, cbm and vbm. """ tdos = self.get_densities(spin) if not abs_tol: tol = tol * tdos.sum() / tdos.shape[0] energies = self.energies below_fermi = [ i for i in xrange(len(energies)) if energies[i] < self.efermi and tdos[i] > tol ] above_fermi = [ i for i in xrange(len(energies)) if energies[i] > self.efermi and tdos[i] > tol ] vbm_start = max(below_fermi) cbm_start = min(above_fermi) if vbm_start == cbm_start: return 0.0, self.efermi, self.efermi else: # Interpolate between adjacent values terminal_dens = tdos[vbm_start:vbm_start + 2][::-1] terminal_energies = energies[vbm_start:vbm_start + 2][::-1] start = get_linear_interpolated_value(terminal_dens, terminal_energies, tol) terminal_dens = tdos[cbm_start - 1:cbm_start + 1] terminal_energies = energies[cbm_start - 1:cbm_start + 1] end = get_linear_interpolated_value(terminal_dens, terminal_energies, tol) return end - start, end, start
def get_interpolated_value(self, x): """ Returns an interpolated y value for a particular x value. Args: x: x value to return the y value for Returns: Value of y at x """ if len(self.ydim) == 1: return get_linear_interpolated_value(self.x, self.y, x) else: return [ get_linear_interpolated_value(self.x, self.y[:, k], x) for k in range(self.ydim[1]) ]
def get_interpolated_value(self, energy, integrated=False): """ Returns the COHP for a particular energy. Args: energy: Energy to return the COHP value for. """ inter = {} for spin in self.cohp: if not integrated: inter[spin] = get_linear_interpolated_value( self.energies, self.cohp[spin], energy) elif self.icohp is not None: inter[spin] = get_linear_interpolated_value( self.energies, self.icohp[spin], energy) else: raise ValueError("ICOHP is empty.") return inter
def get_interpolated_value(self, frequency): """ Returns interpolated density for a particular frequency. Args: frequency: frequency to return the density for. """ return get_linear_interpolated_value(self.frequencies, self.densities, frequency)
def get_interpolated_gap(self, tol=0.001, abs_tol=False, spin=None): """ Expects a DOS object and finds the gap Args: tol: tolerance in occupations for determining the gap abs_tol: Set to True for an absolute tolerance and False for a relative one. spin: Possible values are: None - finds the ap in the summed densities Up - finds the gap in the up spin channel Down - finds the gap in teh down spin channel Returns: (gap, cbm, vbm): Tuple of floats in eV corresponding to the gap, cbm and vbm. """ tdos = self.get_densities(spin) if not abs_tol: tol = tol * tdos.sum() / tdos.shape[0] energies = self.energies below_fermi = [i for i in xrange(len(energies)) if energies[i] < self.efermi and tdos[i] > tol] above_fermi = [i for i in xrange(len(energies)) if energies[i] > self.efermi and tdos[i] > tol] vbm_start = max(below_fermi) cbm_start = min(above_fermi) if vbm_start == cbm_start: return 0.0, self.efermi, self.efermi else: # Interpolate between adjacent values terminal_dens = tdos[vbm_start:vbm_start + 2][::-1] terminal_energies = energies[vbm_start:vbm_start + 2][::-1] start = get_linear_interpolated_value(terminal_dens, terminal_energies, tol) terminal_dens = tdos[cbm_start - 1:cbm_start + 1] terminal_energies = energies[cbm_start - 1:cbm_start + 1] end = get_linear_interpolated_value(terminal_dens, terminal_energies, tol) return end - start, end, start
def get_interpolated_value(self, energy): """ Returns interpolated density for a particular energy. Args: energy: Energy to return the density for. """ f = {} for spin in self._dos.keys(): f[spin] = get_linear_interpolated_value(self._energies, self._dos[spin], energy) return f
def get_interpolated_value(self, energy): """ Returns interpolated density for a particular energy. Args: energy: Energy to return the density for. """ f = {} for spin in self.densities.keys(): f[spin] = get_linear_interpolated_value(self.energies, self.densities[spin], energy) return f
def test_get_linear_interpolated_value(self): xvals = [0, 1, 2, 3, 4, 5] yvals = [3, 6, 7, 8, 10, 12] self.assertEqual(get_linear_interpolated_value(xvals, yvals, 3.6), 9.2) self.assertRaises(ValueError, get_linear_interpolated_value, xvals, yvals, 6)