Giter Club home page Giter Club logo

sisl's Introduction

sisl

Build Status DOI codecov conda Donate

The API documentation can be found here.

The sisl toolbox provides a simple API for manipulating, constructing and creating tight-binding matrices in a standard and uniform way.
Secondly it provides easy interfaces for creating and calculating band-structures of simple tight-binding models as well as interfacing to more advanced DFT utilities.

sisl may also be used together with the ASE environment.

sisl provides an interface to TBtrans and thus enables the calculation of transport using the Green function method and easily allows calculation of tight-binding systems of more than 500,000 atoms.

Downloading and installation

Installing sisl using PyPi or Conda is the easiest:

pip install sisl
# or
conda install -c zerothi sisl

If performing a manual installation, these packages are required:

  • six
  • numpy
  • scipy
  • netCDF4, this module is only required if you need interface to construct the transport tight-binding model for TBtrans
  • setuptools
  • A fortran compiler

Installing sisl can be performed using this command:

python setup.py install --prefix=<prefix>

Usage

If used to produce scientific contributions, please use the DOI for citation. Press the DOI link at the top of this page and select

Cite as 

in the right side of the zenodo webpage. Select your citation style.

Scripts

sisl contain a utility to easily convert geometries from existing files to other formats. After installing the executable sgeom is available which enables the conversion between all formats accessible as Sile objects.

To convert a SIESTA FDF file to xyz and an XV file one does

sgeom siesta.fdf geom.xyz geom.XV

Try sgeom -h for additional features such as repeating the structure.

Geometry manipulation

sisl contain a class for manipulating geometries in a consistent and easy way. Without using any other feature this enables you to easily create and manipulate structures in a consistent manner.

For instance to create a huge graphene flake

sq3h  = 3.**.5 * 0.5
sc = SuperCell(np.array([[1.5, sq3h,  0.],
                         [1.5,-sq3h,  0.],
                         [ 0.,   0., 10.]],np.float64) * 1.42,
                         nsc=[3,3,1])
gr = Geometry(np.array([[ 0., 0., 0.],
                        [ 1., 0., 0.]],np.float64) * 1.42,
              atom=Atom(Z=6, R=1.42), sc=sc)
huge = gr.tile(100, axis=0).tile(100, axis=1)

Which results in a 20000 atom big graphene flake.

Several basic geometries are intrinsically available

from sisl.geom import *

# Graphene basic unit-cell
g = graphene()
# SC crystal structure
g = sc(<lattice constant>, <Atom>)
# BCC crystal structure
g = bcc(<lattice constant>, <Atom>)
# FCC crystal structure
g = fcc(<lattice constant>, <Atom>)
# HCP crystal structure
g = hcp(<lattice constant>, <Atom>)

The Graphene, BCC, FCC and HCP structures can be created in an orthogonal unit-cell by adding the flag orthogonal=True in the call:

g = graphene(orthogonal=True)

IO-manipulation

sisl employs a variety of IO interfaces for managing geometries.

The hard-coded file formats are:

  1. xyz, standard coordinate format Note that the the xyz file format does not per see contain the cell size. The XYZSile writes the cell information in the xyz file comment section (2nd line). Hence if the file was written with sisl you retain the cell information.
  2. gout, reads geometries from GULP output
  3. nc, reads/writes NetCDF4 files created by SIESTA
  4. TBT.nc/PHT.nc, reads NetCDF4 files created by TBtrans/PHtrans
  5. tb, intrinsic file format for geometry/tight-binding models
  6. fdf, SIESTA native format
  7. XV, SIESTA coordinate format with velocities
  8. POSCAR/CONTCAR, VASP coordinate format
  9. ASCII, BigDFT coordinate format
  10. win, Wannier90 Hamiltonian and Wannier centres
  11. xsf, XCrySDen file format

All text files can also be read from their gzipped file formats with transparency.

All file formats in sisl are called a Sile (sisl file). This small difference prohibits name clashes with other implementations.

To read geometries from content you may do

import sisl
geom = sisl.Geometry.read('file.xyz')

which will read the geometry in file.xyz and return a Geometry object.

If you want to read several different objects from a single file you should use the specific get_sile routine to retrieve the Sile object:

import sisl
fxyz = sisl.get_sile('file.xyz')

which returns an XYZSile file object that enables reading the geometry in file.xyz. Subsequently you may read the geometry and obtain a geometry object using

geom = fxyz.read_geom()

The above two methods are equivalent.

Even though these are hard coded you can easily extend your own file format

sisl.add_sile(<file ending>, <SileObject>)

for instance the XYZSile is hooked using:

sisl.add_sile('xyz', XYZSile, case=False)

which means that sisl.get_sile understands files *.xyz and *.XYZ files as an XYZSile object. You can put whatever file-endings here and classes to retain API compatibility. See the sisl.io package for more information. Note that a call to add_sile with an already existing file ending results in overwriting the initial meaning of that file object.

NOTE: if you know the file is in xyz file format but the ending is erroneous, you can force the XYZSile by instantiating using that class

sisl.XYZSile(<filename>)

which disregards the ending check.

Tight-binding

To create a tight-binding model you extend a geometry to a Hamiltonian class which contains the required sparse pattern.

To create the nearest neighbour tight-binding model for graphene you simply do

# Create nearest-neighbour tight-binding
# graphene lattice constant 1.42
dR = ( 0.1 , 1.5 )
on = 0. 
nn = -0.5

# Ensure that graphene has supercell connections
gr.sc.set_nsc([3,3,1])
tb = Hamiltonian(gr)
for ia in tb.geom:
    idx_a = tb.close(ia, dR=dR)
    tb[ia,idx_a[0]] = on
    tb[ia,idx_a[1]] = nn

at this point you have the tight-binding model for graphene and you can easily create the Hamiltonian using this construct:

Hk = tb.Hk(k=[0.,0.5,0])

which returns the Hamiltonian in the scipy.sparse.csr_matrix format. To calculate the dispersion you diagonalize and plot the eigenvalues

import matplotlib.pyplot as plt
klist = ... # dispersion curve
eigs = np.empty([len(klist), tb.no])
for ik, k in enumerate(klist):
    eigs[ik,:] = tb.eigh(k, eigvals_only=True)
    # Or equivalently:
    #   Hk = tb.Hk(k)
    #   eigs[ik,:] = sli.eigh(Hk.todense(), eigvals_only=True)
 for i in range(tb.no):
    plt.plot(eigs[:,i])

Very large tight-binding models are notoriously slow to create, however, sisl implement a much faster method to loop over huge geometries

for ias, idxs in tb.geom.iter_block(iR = 10):
    for ia in ias:
        idx_a = tb.geom.close(ia, dR = dR, idx = idxs)
        tb[ia,idx_a[0]] = on
        tb[ia,idx_a[1]] = nn

which accomplishes the same thing, but at much faster execution. iR should be a number such that tb.geom.close(<any index>,dR = tb.geom.dR * iR) is approximately 1000 atoms.

The above example is for the default orthogonal Hamiltonian. However, sisl is not limited to orthogonal basis functions. To construct the same example using explicit overlap matrix the following procedure is necessary:

# Create nearest-neighbour tight-binding
# graphene lattice constant 1.42
dR = ( 0.1 , 1.5 )
on = ( 0. , 1.)
nn = (-0.5, 0.) # still orthogonal (but with fake overlap)

tb = Hamiltonian(gr, orthogonal=False)
for ia in tb.geom:
    idx_a = tb.close(ia, dR=dR)
    tb[ia,idx_a[0]] = on
    tb[ia,idx_a[1]] = nn
Hk = tb.Hk(k=[0.,0.5,0])
Sk = tb.Sk(k=[0.,0.5,0])
eigs = sli.eigh(Hk.todense(), Sk.todense(), eigvals_only=True)

Contributions, issues and bugs

I would advice any users to contribute as much feedback and/or PRs to further maintain and expand this library.

Please do not hesitate to contribute!

If you find any bugs please form a bug report/issue.

If you have a fix please consider adding a pull request.

License

The sisl license is LGPL, please see the LICENSE file.

sisl's People

Contributors

iriberri avatar zerothi avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.