BandStructure¶
-
class
sisl.physics.brillouinzone.
BandStructure
(parent, point, division, name=None)[source]¶ Create a path in the Brillouin zone for plotting band-structures etc.
- Parameters
- parentobject or array_like
An object with associated parentcell and parent.rcell or an array of floats which may be turned into a
SuperCell
- pointarray_like of float
a list of points that are the corners of the path
- divisionint or array_like of int
number of divisions in each segment. If a single integer is passed it is the total number of points on the path (equally separated). If it is an array_like input it must have length one less than point.
- namearray_like of str
the associated names of the points on the Brillouin Zone path
Examples
>>> sc = SuperCell(10) >>> bs = BandStructure(sc, [[0] * 3, [0.5] * 3], 200) >>> bs = BandStructure(sc, [[0] * 3, [0.5] * 3, [1.] * 3], 200) >>> bs = BandStructure(sc, [[0] * 3, [0.5] * 3, [1.] * 3], 200, ['Gamma', 'M', 'Gamma'])
Attributes
A list of all k-points (if available)
Weight of the k-points in the
BrillouinZone
objectMethods
__init__
(self, parent, point, division[, name])Initialize self.
asarray
(self)Return self with
numpy.ndarray
returned quantitiesasaverage
(self)Return self with k-averaged quantities
aslist
(self)Return self with list returned quantities
asnone
(self)Return self with None, this may be done for instance when wrapping the function calls.
assum
(self)Return self with summed quantities
asyield
(self)Return self with yielded quantities
call
(self, func, \*args, \*\*kwargs)Call the function func and run as though the function has been called
copy
(self)Create a copy of this object
in_primitive
(k)Move the k-point into the primitive point(s) ]-0.5 ; 0.5]
iter
(self[, ret_weight])An iterator for the k-points and (possibly) the weights
lineark
(self[, ticks])A 1D array which corresponds to the delta-k values of the path
lineartick
(self)The tick-marks corresponding to the linear-k values
param_circle
(sc, N_or_dk, kR, normal, origo)Create a parameterized k-point list where the k-points are generated on a circle around an origo
parametrize
(sc, func, N, \*args, \*\*kwargs)Generate a new
BrillouinZone
object with k-points parameterized via the function func in N separationsset_parent
(self, parent)Update the parent associated to this object
tocartesian
(self, k)Transfer a k-point in reduced coordinates to the Cartesian coordinates
toreduced
(self, k)Transfer a k-point in Cartesian coordinates to the reduced coordinates
write
(self, sile, \*args, \*\*kwargs)Writes k-points to a
tableSile
.-
asarray
(self)¶ Return self with
numpy.ndarray
returned quantitiesThis forces the
__call__
routine to return a single array.See also
Notes
All invocations of sub-methods are added these keyword-only arguments:
- etabool, optional
if true a progress-bar is created, default false.
- wrapcallable, optional
a function that accepts the output of the given routine and post-process it. Defaults to
lambda x: x
.
Examples
>>> obj = BrillouinZone(...) >>> obj.asarray().eigh(eta=True)
To compute multiple things in one go one should use wrappers to contain the calculation
>>> E = np.linspace(-2, 2, 100) >>> dist = get_distribution('gaussian', smearing=0.1) >>> def wrap(es, parent, k, weight): ... DOS = es.DOS(E, distribution=dist) ... PDOS = es.PDOS(E, distribution=dist) ... occ = es.occupation() ... spin_moment = (es.spin_moment(E, distribution=dist) * occ.reshape(-1, 1)).sum(0) ... return oplist([DOS, PDOS, spin_moment]) >>> bz = BrillouinZone(hamiltonian) >>> DOS, PDOS, spin_moment = bz.asaverage().eigenstate(wrap=wrap)
-
asaverage
(self)¶ Return self with k-averaged quantities
This forces the
__call__
routine to return a single k-averaged value.See also
Notes
All invocations of sub-methods are added these keyword-only arguments:
- etabool, optional
if true a progress-bar is created, default false.
- wrapcallable, optional
a function that accepts the output of the given routine and post-process it. Defaults to
lambda x: x
.
Examples
>>> obj = BrillouinZone(Hamiltonian) >>> obj.asaverage().DOS(np.linspace(-2, 2, 100))
>>> obj = BrillouinZone(Hamiltonian) >>> obj.asaverage() >>> obj.DOS(np.linspace(-2, 2, 100)) >>> obj.PDOS(np.linspace(-2, 2, 100), eta=True)
>>> obj = BrillouinZone(Hamiltonian) >>> obj.asaverage() >>> E = np.linspace(-2, 2, 100) >>> def wrap(es): ... return es.DOS(E), es.PDOS(E) >>> DOS, PDOS = obj.eigenstate(wrap=wrap)
-
aslist
(self)¶ Return self with list returned quantities
This forces the
__call__
routine to return a list with returned values.See also
Notes
All invocations of sub-methods are added these keyword-only arguments:
- etabool, optional
if true a progress-bar is created, default false.
- wrapcallable, optional
a function that accepts the output of the given routine and post-process it. Defaults to
lambda x: x
.
Examples
>>> obj = BrillouinZone(...) >>> def first_ten(es): ... return es.sub(range(10)) >>> obj.aslist().eigenstate(eta=True, wrap=first_ten)
-
asnone
(self)¶ Return self with None, this may be done for instance when wrapping the function calls.
This forces the
__call__
routine to returnNone
. This usage is mainly intended when creating custom wrap function calls.See also
Notes
All invocations of sub-methods are added these keyword-only arguments:
- etabool, optional
if true a progress-bar is created, default false.
- wrapcallable, optional
a function that accepts the output of the given routine and post-process it. Defaults to
lambda x: x
.
Examples
>>> obj = BrillouinZone(...) >>> obj.asnone().eigh(eta=True)
-
assum
(self)¶ Return self with summed quantities
This forces the
__call__
routine to return all k-point values summed.See also
Notes
All invocations of sub-methods are added these keyword-only arguments:
- etabool, optional
if true a progress-bar is created, default false.
- wrapcallable, optional
a function that accepts the output of the given routine and post-process it. Defaults to
lambda x: x
.
Examples
>>> obj = BrillouinZone(Hamiltonian) >>> obj.assum().DOS(np.linspace(-2, 2, 100))
>>> obj = BrillouinZone(Hamiltonian) >>> obj.assum() >>> obj.DOS(np.linspace(-2, 2, 100)) >>> obj.PDOS(np.linspace(-2, 2, 100), eta=True)
>>> E = np.linspace(-2, 2, 100) >>> dist = get_distribution('gaussian', smearing=0.1) >>> def wrap(es, parent, k, weight): ... DOS = es.DOS(E, distribution=dist) * weight ... PDOS = es.PDOS(E, distribution=dist) * weight ... occ = es.occupation() ... spin_moment = (es.spin_moment(E, distribution=dist) * occ.reshape(-1, 1)).sum(0) * weight ... return oplist([DOS, PDOS, spin_moment]) >>> bz = BrillouinZone(hamiltonian) >>> DOS, PDOS, spin_moment = bz.assum().eigenstate(wrap=wrap)
-
asyield
(self)¶ Return self with yielded quantities
This forces the
__call__
routine to return a an iterator which may yield the quantities calculated.See also
Notes
All invocations of sub-methods are added these keyword-only arguments:
- etabool, optional
if true a progress-bar is created, default false.
- wrapcallable, optional
a function that accepts the output of the given routine and post-process it. Defaults to
lambda x: x
.
Examples
>>> obj = BrillouinZone(Hamiltonian) >>> obj.asyield().eigh(eta=True)
-
call
(self, func, *args, **kwargs)¶ Call the function func and run as though the function has been called
This is a wrapper to call user-defined functions not attached to the parent object.
The below example shows that the equivalence of the call.
- Parameters
- funccallable
method used
- *args :
arguments passed to func in the call sequence
- **kwargs :
keyword arguments passed to func in the call sequence
Examples
>>> H = Hamiltonian(...) >>> bz = BrillouinZone(H) >>> bz.eigh() == bz.call(H.eigh)
-
property
cell
¶
-
copy
(self)¶ Create a copy of this object
-
static
in_primitive
(k)¶ Move the k-point into the primitive point(s) ]-0.5 ; 0.5]
- Parameters
- karray_like
k-point(s) to move into the primitive cell
- Returns
- kall k-points moved into the primitive cell
-
iter
(self, ret_weight=False)¶ An iterator for the k-points and (possibly) the weights
- Parameters
- ret_weightbool, optional
if true, also yield the weight for the respective k-point
- Yields
- kptk-point
- weightweight of k-point, only if ret_weight is true.
-
property
k
¶ A list of all k-points (if available)
-
lineark
(self, ticks=False)[source]¶ A 1D array which corresponds to the delta-k values of the path
This is meant for plotting
- Parameters
- ticksbool, optional
if True the ticks for the points are also returned
lk, xticks, label_ticks, lk = BandStructure.lineark(True)
- Returns
- linear_kThe positions in reciprocal space determined by the distance between points
- k_tickLinear k-positions of the points, only returned if ticks is
True
- k_labelLabels at k_tick, only returned if ticks is
True
Examples
>>> p = BandStructure(...) >>> eigs = Hamiltonian.eigh(p) >>> for i in range(len(Hamiltonian)): ... plt.plot(p.lineark(), eigs[:, i])
>>> p = BandStructure(...) >>> eigs = Hamiltonian.eigh(p) >>> lk, kt, kl = p.lineark(True) >>> plt.xticks(kt, kl) >>> for i in range(len(Hamiltonian)): ... plt.plot(lk, eigs[:, i])
-
lineartick
(self)[source]¶ The tick-marks corresponding to the linear-k values
- Returns
- linear_kThe positions in reciprocal space determined by the distance between points
See also
lineark
Routine used to calculate the tick-marks.
-
classmethod
param_circle
(sc, N_or_dk, kR, normal, origo, loop=False)¶ Create a parameterized k-point list where the k-points are generated on a circle around an origo
The generated circle is a perfect circle in the reciprocal space (Cartesian coordinates). To generate a perfect circle in units of the reciprocal lattice vectors one can generate the circle for a diagonal supercell with side-length \(2\pi\), see example below.
- Parameters
- scSuperCell, or SuperCellChild
the supercell used to construct the k-points
- N_or_dkint
number of k-points generated using the parameterization (if an integer), otherwise it specifies the discretization length on the circle (in 1/Ang), If the latter case will use less than 4 points a warning will be raised and the number of points increased to 4.
- kRfloat
radius of the k-point. In 1/Ang
- normalarray_like of float
normal vector to determine the circle plane
- origoarray_like of float
origo of the circle used to generate the circular parameterization
- loopbool, optional
whether the first and last point are equal
- Returns
- BrillouinZonewith the parameterized k-points.
Examples
>>> sc = SuperCell([1, 1, 10, 90, 90, 60]) >>> bz = BrillouinZone.param_circle(sc, 10, 0.05, [0, 0, 1], [1./3, 2./3, 0])
To generate a circular set of k-points in reduced coordinates (reciprocal
>>> sc = SuperCell([1, 1, 10, 90, 90, 60]) >>> bz = BrillouinZone.param_circle(sc, 10, 0.05, [0, 0, 1], [1./3, 2./3, 0]) >>> bz_rec = BrillouinZone.param_circle(2*np.pi, 10, 0.05, [0, 0, 1], [1./3, 2./3, 0]) >>> bz.k[:, :] = bz_rec.k[:, :]
-
classmethod
parametrize
(sc, func, N, *args, **kwargs)¶ Generate a new
BrillouinZone
object with k-points parameterized via the function func in N separationsGenerator of a parameterized Brillouin zone object that contains a parameterized k-point list.
Basically this generates a new BrillouinZone object as:
>>> def func(sc, frac): ... return [frac, 0, 0] >>> bz = BrillouinZone.parametrize(1, func, 10) >>> len(bz) == 10 True >>> np.allclose(bz.k[-1, :], [9./10, 0, 0]) True
- Parameters
- scSuperCell, or SuperCellChild
the supercell used to construct the k-points
- funccallable
method that parameterizes the k-points, must at least accept two arguments,
sc
(super-cell object containing the unit-cell and reciprocal cell) andfrac
(current parametrization fraction, between 0 and(N-1)/N
. It must return a k-point in 3 dimensions.- Nint
number of k-points generated using the parameterization
- argslist of arguments
arguments passed directly to func
- kwargsdictionary of arguments
keyword arguments passed directly to func
-
property
rcell
¶
-
set_parent
(self, parent)¶ Update the parent associated to this object
- Parameters
- parentobject or array_like
an object containing cell vectors
-
tocartesian
(self, k)¶ Transfer a k-point in reduced coordinates to the Cartesian coordinates
- Parameters
- klist of float
k-point in reduced coordinates
- Returns
- kin units of 1/Ang
-
toreduced
(self, k)¶ Transfer a k-point in Cartesian coordinates to the reduced coordinates
- Parameters
- klist of float
k-point in Cartesian coordinates
- Returns
- kin units of reciprocal lattice vectors ]-0.5 ; 0.5] (if k is in the primitive cell)
-
property
weight
¶ Weight of the k-points in the
BrillouinZone
object
-
write
(self, sile, *args, **kwargs)¶ Writes k-points to a
tableSile
.This allows one to pass a tableSile or a file-name.