sisl.Lattice
- class sisl.Lattice
Bases:
_DispatchsA cell class to retain lattice vectors and a supercell structure
The supercell structure is comprising the primary unit-cell and neighboring unit-cells. The number of supercells is given by the attribute
nscwhich is a vector with 3 elements, one per lattice vector. It describes how many times the primary unit-cell is extended along the i’th lattice vector. Fornsc[i] == 3the supercell is made up of 3 unit-cells. One behind, the primary unit-cell and one after.- Parameters:
cell – the lattice parameters of the unit cell (the actual cell is returned from
tocell.nsc – number of supercells along each lattice vector
origin (
(3,)offloat, optional) – the origin of the supercell.boundary_condition – the boundary conditions for each of the cell’s planes. Defaults to periodic boundary condition. See
BoundaryConditionfor valid enumerations.
Conversion
A dispatcher for classes, using __get__ it converts into ObjectDispatcher upon invocation from an object, or a TypeDispatcher when invoked from a class
to.Cuboid([center, origin, orthogonal])Convert lattice parameters to a
Cuboidto.Path(*args, **kwargs)Latticewriting to a sile.to.Sile(*args, **kwargs)Latticewriting to a sile.to.ase(**kwargs)Latticeconversion to an ase.Cell object.to.str(*args, **kwargs)Latticewriting to a sile.Methods
add(other)Add two supercell lattice vectors to each other
add_vacuum(vacuum, axis[, orthogonal_to_plane])Returns a new object with vacuum along the axis lattice vector
angle(axis1, axis2[, rad])The angle between two of the cell vectors
append(other, axis)Appends other
Latticeto this grid along axisarea(axis1, axis2)Calculate the area spanned by the two axis ax0 and ax1
cell2length(length[, axes])Calculate cell vectors such that they each have length
lengthcenter([axes])Returns center of the
Lattice, possibly with respect to axescopy([cell])A deep copy of the object
equal(other[, atol])Check whether two lattices are equivalent
fit(xyz[, axes, atol])Fit the supercell to xyz such that the unit-cell becomes periodic in the specified directions
is_cartesian([atol])Checks if cell vectors a,b,c are multiples of the cartesian axis vectors (x, y, z)
is_orthogonal([rtol])Returns true if the cell vectors are orthogonal.
lengthf([axes])Length of specific lattice vectors (as a function) :param axes: only calculate the volume based on a subset of axes
offset([isc])Returns the supercell offset of the supercell index
parallel(other[, axes])Returns true if the cell vectors are parallel to other
parameters([rad])Cell parameters of this cell in 3 lengths and 3 angles
plane(axis1, axis2[, origin])Query point and plane-normal for the plane spanning ax1 and ax2
prepend(other, axis)Prepends other
Latticeto this grid along axisread(sile, *args, **kwargs)Reads the supercell from the
SileusingSile.read_latticerepeat(reps, axis)Extend the unit-cell reps times along the axis lattice vector
rotate(rotation[, rad, what])Rotates the supercell, in-place by the angle around the vector
sc_index(sc_off)Returns the integer index in the sc_off list that corresponds to
sc_offscale(scale[, what])Scale lattice vectors
set_boundary_condition([boundary, a, b, c])Set the boundary conditions on the grid
set_nsc([nsc, a, b, c])Sets the number of supercells in the 3 different cell directions
swapaxes(axes1, axes2[, what])Swaps axes axes1 and axes2
tile(reps, axis)Extend the unit-cell reps times along the axis lattice vector
toCuboid(*args, **kwargs)A cuboid with vectors as this unit-cell and center with respect to its origin
tocell(*args)Returns a 3x3 unit-cell dependent on the input
unrepeat(reps, axis)Reverses a
Lattice.tileand returns the segmented versionuntile(reps, axis)Reverses a
Lattice.tileand returns the segmented versionvertices()Vertices of the cell
volumef([axes])Volume of cell (as a function)
write(sile, *args, **kwargs)Writes latticey to the sile using sile.write_lattice
Attributes
Boundary conditions for each lattice vector (lower/upper) sides
(3, 2)Returns the reciprocal (inverse) cell for the
Lattice.Internal indexed supercell
[ia, ib, ic] == iLength of each lattice vector
Origin for the cell
Boolean array to specify whether the boundary conditions are periodic`
Returns the reciprocal cell for the
Latticewith2*np.piInteger supercell offsets
Volume of cell
- BC
alias of
BoundaryCondition
- add(other)
Add two supercell lattice vectors to each other
- Parameters:
other (LatticeLike) – the lattice vectors of the other supercell to add
lattice (Lattice)
- Return type:
- add_vacuum(vacuum, axis, orthogonal_to_plane=False)[source]
Returns a new object with vacuum along the axis lattice vector
- Parameters:
vacuum (
float) – amount of vacuum added, in Angaxis (Literal[0, 1, 2, 'a', 'b', 'c']) – the lattice vector to add vacuum along
orthogonal_to_plane (
bool, optional) – whether the lattice vector should be elongated so that it is vacuum longer when projected onto the normal vector of the other two axis.
- Return type:
- cell2length(length, axes=(0, 1, 2))[source]
Calculate cell vectors such that they each have length
length- Parameters:
length (
floatorndarray) – length for cell vectors, if an array it corresponds to the individual vectors and it must have length equal to axesaxes (Literal[0, 1, 2] | ~typing.Literal['a', 'b', 'c'] | ~collections.abc.Sequence[~typing.Literal[0, 1, 2, 'a', 'b', 'c']]) – which axes the
lengthvariable refers too.
- Returns:
cell-vectors with prescribed length, same order as axes
- Return type:
- copy(cell=None, **kwargs)
A deep copy of the object
- fit(xyz, axes=(0, 1, 2), atol=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)
It is important to know that this routine will only work if at least some of the atoms are integer offsets of the lattice vectors. I.e. the resulting fit will depend on the translation of the coordinates.
- Parameters:
xyz (
array_like ``shape(*,3)``) – the coordinates that we will wish to encompass and analyze.axes (Literal[0, 1, 2] | ~typing.Literal['a', 'b', 'c'] | ~collections.abc.Sequence[~typing.Literal[0, 1, 2, 'a', 'b', 'c']]) – only the cell-vectors along the provided axes will be used
atol (float) – tolerance (in Angstrom) of the positions. I.e. we neglect coordinates which are not within the radius of this magnitude
- Raises:
RuntimeError : – when the cell-parameters does not fit within the given tolerance (atol).
- Return type:
- is_cartesian(atol=0.001)[source]
Checks if cell vectors a,b,c are multiples of the cartesian axis vectors (x, y, z)
- is_orthogonal(rtol=0.001)[source]
Returns true if the cell vectors are orthogonal.
Internally this will be done on the normalized lattice vectors to ensure no numerical instability.
- lengthf(axes=(0, 1, 2))[source]
Length of specific lattice vectors (as a function) :param axes: only calculate the volume based on a subset of axes
Examples
Only get lengths of two lattice vectors:
>>> lat = Lattice(1) >>> lat.lengthf([0, 1])
- new.Sile(**kwargs)
- Return type:
Any
- new.ase(**kwargs)
- Return type:
Any
- new.ndarray(**kwargs)
- Return type:
Any
- parameters(rad=False)[source]
Cell parameters of this cell in 3 lengths and 3 angles
Notes
Since we return the length and angles between vectors it may not be possible to recreate the same cell. Only in the case where the first lattice vector only has a Cartesian \(x\) component will this be the case.
- Parameters:
rad (
bool, optional) – whether the angles are returned in radians (otherwise in degree)- Returns:
length (
numpy.ndarray) – length of each lattice vectorangles (
numpy.ndarray) – angles between the lattice vectors (in Voigt notation)[0]is between 2nd and 3rd lattice vector, etc.
- Return type:
- plane(axis1, axis2, origin=True)[source]
Query point and plane-normal for the plane spanning ax1 and ax2
- Parameters:
- Returns:
normal_V (
numpy.ndarray) – planes normal vector (pointing outwards with regards to the cell)p (
numpy.ndarray) – a point on the plane
- Return type:
Examples
All 6 faces of the supercell can be retrieved like this:
>>> lattice = Lattice(4) >>> n1, p1 = lattice.plane(0, 1, True) >>> n2, p2 = lattice.plane(0, 1, False) >>> n3, p3 = lattice.plane(0, 2, True) >>> n4, p4 = lattice.plane(0, 2, False) >>> n5, p5 = lattice.plane(1, 2, True) >>> n6, p6 = lattice.plane(1, 2, False)
However, for performance critical calculations it may be advantageous to do this:
>>> lattice = Lattice(4) >>> uc = lattice.cell.sum(0) >>> n1, p1 = lattice.plane(0, 1) >>> n2 = -n1 >>> p2 = p1 + uc >>> n3, p3 = lattice.plane(0, 2) >>> n4 = -n3 >>> p4 = p3 + uc >>> n5, p5 = lattice.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.
- static read(sile, *args, **kwargs)[source]
Reads the supercell from the
SileusingSile.read_lattice- Parameters:
sile (
Sile,strorpathlib.Path) – aSileobject which will be used to read the supercell if it is a string it will create a new sile usingsisl.io.get_sile.- Return type:
- repeat(reps, axis)
Extend the unit-cell reps times along the axis lattice vector
Notes
This is exactly equivalent to the
tileroutine.
- rotate(rotation, rad=False, what='abc')
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:
rotations –
A specification of multiple rotations in a single list of arguments.
3 floats: Euler angles around Cartesian coordinates
(float, str): angle + Cartesian/lattice vector name
(float, 3 floats): angle + vector of rotation
Quaternion: direct used rotation
or a sequence of the above. The resulting rotation matrix will be constructed as
U[n] @ U[n-1] @ ... @ U[0].
rad (bool) – Whether the angle is in radians (True) or in degrees (False)
what (Literal['abc', 'a', ...]) – only rotate the designated cell vectors.
lattice (Lattice)
rotation (RotationType)
- Return type:
- sc_index(sc_off)[source]
Returns the integer index in the sc_off list that corresponds to
sc_offReturns the index for the supercell in the global offset.
- scale(scale, what='abc')
Scale lattice vectors
Does not scale
origin.- Parameters:
scale (CoordOrScalar) – the scale factor for the new lattice vectors.
what (Literal['abc', 'xyz']) – If three different scale factors are provided, whether each scaling factor is to be applied on the corresponding lattice vector (“abc”) or on the corresponding cartesian coordinate (“xyz”).
lattice (Lattice)
- Return type:
- set_boundary_condition(boundary=None, a=None, b=None, c=None)[source]
Set the boundary conditions on the grid
- Parameters:
boundary (
(3,2)or(3,)orint, optional) – boundary condition for all boundaries (or the same for all)a (
intorlistofint, optional) – boundary condition for the first unit-cell vector directionb (
intorlistofint, optional) – boundary condition for the second unit-cell vector directionc (
intorlistofint, optional) – boundary condition for the third unit-cell vector direction
- Raises:
ValueError – if specifying periodic one one boundary, so must the opposite side.
- set_nsc(nsc=None, a=None, b=None, c=None)[source]
Sets the number of supercells in the 3 different cell directions
- Parameters:
nsc (
listofint, optional) – number of supercells in each directiona (
int, optional) – number of supercells in the first unit-cell vector directionb (
int, optional) – number of supercells in the second unit-cell vector directionc (
int, optional) – number of supercells in the third unit-cell vector direction
- Return type:
- swapaxes(axes1, axes2, what='abc')
Swaps axes axes1 and axes2
Swapaxes is a versatile method for changing the order of axes elements, either lattice vector order, or Cartesian coordinate orders.
- Parameters:
axes1 (AnyAxes) – the old axis indices (or labels if str) A string will translate each character as a specific axis index. Lattice vectors are denoted by
abcwhile the Cartesian coordinates are denote byxyz. If str, then what is not used.axes2 (AnyAxes) – the new axis indices, same as axes1
what (Literal['abc', 'xyz', 'abc+xyz']) – which elements to swap, lattice vectors (
abc), or Cartesian coordinates (xyz), or both. This argument is only used if the axes arguments are ints.lattice (Lattice)
- Return type:
Examples
Swap the first two axes
>>> sc_ba = sc.swapaxes(0, 1) >>> assert np.allclose(sc_ba.cell[(1, 0, 2)], sc.cell)
Swap the Cartesian coordinates of the lattice vectors
>>> sc_yx = sc.swapaxes(0, 1, what="xyz") >>> assert np.allclose(sc_ba.cell[:, (1, 0, 2)], sc.cell)
Consecutive swapping: 1. abc -> bac 2. bac -> bca
>>> sc_bca = sc.swapaxes("ab", "bc") >>> assert np.allclose(sc_ba.cell[:, (1, 0, 2)], sc.cell)
- tile(reps, axis)
Extend the unit-cell reps times along the axis lattice vector
Notes
This is exactly equivalent to the
repeatroutine.
- to.Cuboid(center=None, origin=None, orthogonal=False)
Convert lattice parameters to a
Cuboid- Return type:
- to.Path(*args, **kwargs)
Latticewriting to a sile.Examples
>>> geom = si.geom.graphene() >>> geom.lattice.to("hello.xyz") >>> geom.lattice.to(pathlib.Path("hello.xyz"))
- Return type:
Any
- to.Sile(*args, **kwargs)
Latticewriting to a sile.Examples
>>> geom = si.geom.graphene() >>> geom.lattice.to("hello.xyz") >>> geom.lattice.to(pathlib.Path("hello.xyz"))
- Return type:
Any
- to.str(*args, **kwargs)
Latticewriting to a sile.Examples
>>> geom = si.geom.graphene() >>> geom.lattice.to("hello.xyz") >>> geom.lattice.to(pathlib.Path("hello.xyz"))
- Return type:
Any
- toCuboid(*args, **kwargs)[source]
A cuboid with vectors as this unit-cell and center with respect to its origin
- Parameters:
orthogonal (
bool, optional) – if true the cuboid has orthogonal sides such that the entire cell is contained
- classmethod tocell(*args)[source]
Returns a 3x3 unit-cell dependent on the input
- 1 argument
a unit-cell along Cartesian coordinates with side-length equal to the argument.
- 3 arguments
the diagonal components of a Cartesian unit-cell
- 6 arguments
the cell parameters given by \(a\), \(b\), \(c\), \(\alpha\), \(\beta\) and \(\gamma\) (angles in degrees).
- 9 arguments
a 3x3 unit-cell.
- Parameters:
*args (
float) – May be either, 1, 3, 6 or 9 elements. Note that the arguments will be put into an array and flattened before checking the number of arguments.- Return type:
Examples
>>> cell_1_1_1 = Lattice.tocell(1.) >>> cell_1_2_3 = Lattice.tocell(1., 2., 3.) >>> cell_1_2_3 = Lattice.tocell([1., 2., 3.]) # same as above
- unrepeat(reps, axis)
Reverses a
Lattice.tileand returns the segmented versionNotes
Untiling will not correctly re-calculate nsc since it has no knowledge of connections.
See also
Lattice.tileopposite of this method
- untile(reps, axis)
Reverses a
Lattice.tileand returns the segmented versionNotes
Untiling will not correctly re-calculate nsc since it has no knowledge of connections.
See also
Lattice.tileopposite of this method
- vertices()[source]
Vertices of the cell
- Returns:
The coordinates of the vertices of the cell. The first three dimensions correspond to each cell axis (off, on), and the last one contains the xyz coordinates.
- Return type:
arrayofshape (2,2,2,3)
- volumef(axes=(0, 1, 2))[source]
Volume of cell (as a function)
Default to the 3D volume. For axes with only 2 elements, it corresponds to an area. For axes with only 1 element, it corresponds to a length.
- Parameters:
axes (Literal[0, 1, 2] | ~typing.Literal['a', 'b', 'c'] | ~collections.abc.Sequence[~typing.Literal[0, 1, 2, 'a', 'b', 'c']]) – only calculate the volume based on a subset of axes
- Return type:
Examples
Only get the volume of the periodic directions:
>>> lat = Lattice(1) >>> lat.pbc = (True, False, True) >>> lat.volumef(lat.pbc.nonzero()[0])
- write(sile, *args, **kwargs)
Writes latticey to the sile using sile.write_lattice
- Parameters:
- Return type:
See also
Lattice.readreads a
Latticefrom a givenSile/file
- property boundary_condition: ndarray
Boundary conditions for each lattice vector (lower/upper) sides
(3, 2)
- cell
- property icell: ndarray
Returns the reciprocal (inverse) cell for the
Lattice.Note: The returned vectors are still in
[0, :]format and not as returned by an inverse LAPACK algorithm.
- n_s
- new = <TypeDispatcher{obj=<class 'sisl.Lattice'>}>
- Parameters:
obj (Any)
- Return type:
Any
- nsc
- property rcell: ndarray
Returns the reciprocal cell for the
Latticewith2*np.piNote: The returned vectors are still in [0, :] format and not as returned by an inverse LAPACK algorithm.
- to
A dispatcher for classes, using __get__ it converts into ObjectDispatcher upon invocation from an object, or a TypeDispatcher when invoked from a class
This is a class-placeholder allowing a dispatcher to be a class attribute and converted into an ObjectDispatcher when invoked from an object.
If it is called on the class, it will return a TypeDispatcher.
This class should be an attribute of a class. It heavily relies on the __get__ special method.
- Parameters:
name (
str) – name of the attribute in the classdispatchs (
dict, optional) – dictionary of dispatch methodsobj_getattr (
callable, optional) – method with 2 arguments, anobjand theattrwhich may be used to control how the attribute is called.instance_dispatcher (
AbstractDispatcher, optional) – control how instance dispatchers are handled through __get__ method. This controls the dispatcher used if called from an instance.type_dispatcher (
AbstractDispatcher, optional) – control how class dispatchers are handled through __get__ method. This controls the dispatcher used if called from a class.
Examples
>>> class A: ... new = ClassDispatcher("new", obj_getattr=lambda obj, attr: getattr(obj.sub, attr))
The above defers any attributes to the contained A.sub attribute.