SuperCell¶
-
class
sisl.SuperCell(cell, nsc=None)[source]¶ Object to retain a super-cell and its nested values.
This supercell object handles cell vectors and its supercell mirrors.
Attributes
cellisc_offInternal indexed supercell [ia, ib, ic] == in_snscrcellReturns the reciprocal cell for the SuperCellwithout2*np.pisc_offInteger supercell offsets volMethods
__init__(cell[, nsc])Initialize a SuperCellobject from initial quantitiesadd_vacuum(vacuum, axis)Add vacuum along the axis lattice vector angle(i, j[, rad])The angle between two of the cell vectors append(other, axis)Appends other SuperCellto this grid along axiscenter([axis])Returns center of the SuperCell, possibly with respect to an axiscopy([cell])Returns a copy of the object. cut(seps, axis)Cuts the cell into several different sections. fit(xyz[, axis, tol])Fit the supercell to xyz such that the unit-cell becomes periodic in the specified directions is_orthogonal()Returns true if the cell vectors are orthogonal move(v)Appends additional space in the SuperCell object offset([isc])Returns the supercell offset of the supercell index parallel(other[, axis])Returns true if the cell vectors are parallel to other plane(ax1, ax2[, origo])Query point and plane-normal for the plane spanning ax1 and ax2 prepend(other, axis)Prepends other SuperCellto this grid along axisread(sile, *args, **kwargs)Reads SuperCell from the Sileusing Sile.read_supercellrepeat(reps, axis)Extend the unit-cell reps times along the axis lattice vector rotate(angle, v[, only, rad])Rotates the supercell, in-place by the angle around the vector rotatea(angle[, only, rad])rotateb(angle[, only, rad])rotatec(angle[, only, rad])sc_index(sc_off)Returns the integer index in the sc_off list that corresponds to sc_offscale(scale)Scale lattice vectors set_nsc([nsc, a, b, c])Sets the number of supercells in the 3 different cell directions set_supercell([nsc, a, b, c])Sets the number of supercells in the 3 different cell directions swapaxes(a, b)Returns SuperCellwith swapped axistile(reps, axis)Extend the unit-cell reps times along the axis lattice vector tocell(*args)Returns a 3x3 unit-cell dependent on the input translate(v)Appends additional space in the SuperCell object -
add_vacuum(vacuum, axis)[source]¶ Add vacuum along the axis lattice vector
Parameters: vacuum : float
amount of vacuum added, in Ang
axis : int
the lattice vector to add vacuum along
-
angle(i, j, rad=False)[source]¶ The angle between two of the cell vectors
Parameters: i : int
the first cell vector
j : int
the second cell vector
rad : bool, optional
whether the returned value is in radians
-
cell¶
-
fit(xyz, axis=None, tol=0.05)[source]¶ Fit the supercell to xyz such that the unit-cell becomes periodic in the specified directions
The fitted supercell tries to determine the unit-cell parameters by solving a set of linear equations corresponding to the current supercell vectors.
>>> numpy.linalg.solve(self.cell.T, xyz.T)
Parameters: xyz : array_like
shape(*, 3)the coordinates that we will wish to encompass and analyze.
axis : None or array_like
if
Noneequivalent to[0, 1, 2], else only the cell-vectors along the provided axis will be usedtol : float
tolerance (in Angstrom) of the positions. I.e. we neglect coordinates which are not within the radius of this magnitude
-
isc_off¶ Internal indexed supercell
[ia, ib, ic] == i
-
n_s¶
-
nsc¶
-
parallel(other, axis=(0, 1, 2))[source]¶ Returns true if the cell vectors are parallel to other
Parameters: other : SuperCell
the other object to check whether the axis are parallel
axis : int or array_like
only check the specified axis (default to all)
-
plane(ax1, ax2, origo=True)[source]¶ Query point and plane-normal for the plane spanning ax1 and ax2
Parameters: ax1 : int
the first axis vector
ax2 : int
the second axis vector
origo : bool, optional
whether the plane intersects the origo or the opposite corner of the unit-cell.
Returns: n : array_like
planes normal vector (pointing outwards with regards to the cell)
p : array_like
a point on the plane
Examples
All 6 faces of the supercell can be retrieved like this:
>>> n1, p1 = self.plane(0, 1, True) >>> n2, p2 = self.plane(0, 1, False) >>> n3, p3 = self.plane(0, 2, True) >>> n4, p4 = self.plane(0, 2, False) >>> n5, p5 = self.plane(1, 2, True) >>> n6, p6 = self.plane(1, 2, False)
However, for performance critical calculations it may be advantageous to do this:
>>> uc = self.cell.sum(0) >>> n1, p1 = self.sc.plane(0, 1) >>> n2 = -n1 >>> p2 = p1 + uc >>> n3, p3 = self.sc.plane(0, 2) >>> n4 = -n3 >>> p4 = p3 + uc >>> n5, p5 = self.sc.plane(1, 2) >>> n6 = -n5 >>> p6 = p5 + uc
Secondly, the variables
p1,p3andp5are always[0, 0, 0]andp2,p4andp6are alwaysuc. Hence this may be used to further reduce certain computations.
-
rcell¶ Returns the reciprocal cell for the
SuperCellwithout2*np.piNote: The returned vectors are still in [0, :] format and not as returned by an inverse LAPACK algorithm.
-
static
read(sile, *args, **kwargs)[source]¶ Reads SuperCell from the
Sileusing Sile.read_supercellParameters: sile :
Sileor stra
Sileobject which will be used to read the supercell if it is a string it will create a new sile usingsisl.io.get_sile.
-
repeat(reps, axis)[source]¶ Extend the unit-cell reps times along the axis lattice vector
Parameters: reps : int
number of times the unit-cell is repeated along the specified lattice vector
axis : int
the lattice vector along which the repetition is performed
Notes
This is exactly equivalent to the
tileroutine.
-
rotate(angle, v, only='abc', rad=False)[source]¶ Rotates the supercell, in-place by the angle around the vector
One can control which cell vectors are rotated by designating them individually with
only='[abc]'.Parameters: angle : float
the angle of which the geometry should be rotated
v : array_like [3]
the vector around the rotation is going to happen v = [1,0,0] will rotate in the
yzplanerad : bool, optional
Whether the angle is in radians (True) or in degrees (False)
only : (‘abc’), str, optional
only rotate the designated cell vectors.
-
sc_index(sc_off)[source]¶ Returns the integer index in the sc_off list that corresponds to
sc_offReturns the integer for the supercell
-
sc_off¶ Integer supercell offsets
-
scale(scale)[source]¶ Scale lattice vectors
Parameters: scale :
floatthe scale factor for the new lattice vectors
-
set_nsc(nsc=None, a=None, b=None, c=None)[source]¶ Sets the number of supercells in the 3 different cell directions
- nsc: list of int, optional
- number of supercells in each direction
- a: integer, optional
- number of supercells in the first unit-cell vector direction
- b: integer, optional
- number of supercells in the second unit-cell vector direction
- c: integer, optional
- number of supercells in the third unit-cell vector direction
-
set_supercell(nsc=None, a=None, b=None, c=None)¶ Sets the number of supercells in the 3 different cell directions
- nsc: list of int, optional
- number of supercells in each direction
- a: integer, optional
- number of supercells in the first unit-cell vector direction
- b: integer, optional
- number of supercells in the second unit-cell vector direction
- c: integer, optional
- number of supercells in the third unit-cell vector direction
-
swapaxes(a, b)[source]¶ Returns
SuperCellwith swapped axisIf
swapaxes(0,1)it returns the 0 in the 1 values.
-
tile(reps, axis)[source]¶ Extend the unit-cell reps times along the axis lattice vector
Parameters: reps : int
number of times the unit-cell is repeated along the specified lattice vector
axis : int
the lattice vector along which the repetition is performed
Notes
This is exactly equivalent to the
repeatroutine.
-
classmethod
tocell(*args)[source]¶ Returns a 3x3 unit-cell dependent on the input
If you supply a single argument it is regarded as either a) a proper unit-cell b) the diagonal elements in the unit-cell
If you supply 3 arguments it will be the same as the diagonal elements of the unit-cell
If you supply 6 arguments it will be the same as the cell parameters, a, b, c, alpha, beta, gamma. The angles should be provided in degree (not radians).
-
translate(v)¶ Appends additional space in the SuperCell object
-
vol¶
-