Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • kwant/kwant
  • jbweston/kwant
  • anton-akhmerov/kwant
  • cwg/kwant
  • Mathieu/kwant
  • slavoutich/kwant
  • pacome/kwant
  • behrmann/kwant
  • michaelwimmer/kwant
  • albeercik/kwant
  • eunjongkim/kwant
  • basnijholt/kwant
  • r-j-skolasinski/kwant
  • sahmed95/kwant
  • pablopiskunow/kwant
  • mare/kwant
  • dvarjas/kwant
  • Paul/kwant
  • bbuijtendorp/kwant
  • tkloss/kwant
  • torosdahl/kwant
  • kel85uk/kwant
  • kpoyhonen/kwant
  • Fromeworld/kwant
  • quaeritis/kwant
  • marwahaha/kwant
  • fernandodfufrpe/kwant
  • oly/kwant
  • jiamingh/kwant
  • mehdi2369/kwant
  • ValFadeev/kwant
  • Kostas/kwant
  • chelseabaptiste03/kwant
33 results
Show changes
Commits on Source (14)
...@@ -166,6 +166,14 @@ check for dependencies installed: ...@@ -166,6 +166,14 @@ check for dependencies installed:
.test: &test .test: &test
stage: test
script:
- py.test -r w --flakes kwant --junitxml=tests.xml --durations=10
artifacts:
reports:
junit: tests.xml
.coverage: &coverage
stage: test stage: test
script: script:
- py.test -r w --cov=kwant --cov-report term --cov-report html --flakes kwant --junitxml=tests.xml --durations=10 - py.test -r w --cov=kwant --cov-report term --cov-report html --flakes kwant --junitxml=tests.xml --durations=10
...@@ -215,6 +223,14 @@ test:bleeding-edge: ...@@ -215,6 +223,14 @@ test:bleeding-edge:
- schedules - schedules
allow_failure: true allow_failure: true
coverage:latest:
<<: *coverage
<<: *latest_env
dependencies:
- build:latest
only:
- schedules
## Documentation building ## Documentation building
build documentation: build documentation:
...@@ -223,7 +239,9 @@ build documentation: ...@@ -223,7 +239,9 @@ build documentation:
- build:latest - build:latest
stage: test stage: test
script: script:
- make -C doc realclean; make -C doc html SPHINXOPTS='-A website_deploy=True -n -W' SOURCE_LINK_TEMPLATE="$CI_PROJECT_URL"/blob/\$\$r/\$\$f - pip install git+https://github.com/jupyter-widgets/jupyter-sphinx
- python -m ipykernel install --user --name kwant-latest
- make -C doc realclean; make -C doc html SPHINXOPTS='-A website_deploy=True -n -W -D jupyter_execute_default_kernel=kwant-latest' SOURCE_LINK_TEMPLATE="$CI_PROJECT_URL"/blob/\$\$r/\$\$f
artifacts: artifacts:
paths: paths:
- doc/build/html/ - doc/build/html/
...@@ -235,7 +253,9 @@ build PDF documentation: ...@@ -235,7 +253,9 @@ build PDF documentation:
- build:latest - build:latest
stage: test stage: test
script: script:
- make -C doc latex SPHINXOPTS='-n -W' - pip install git+https://github.com/jupyter-widgets/jupyter-sphinx
- python -m ipykernel install --user --name kwant-latest
- make -C doc latex SPHINXOPTS='-n -W -D jupyter_execute_default_kernel=kwant-latest'
- cd doc/build/latex - cd doc/build/latex
- make all-pdf - make all-pdf
artifacts: artifacts:
...@@ -258,7 +278,9 @@ check for broken links in doc: ...@@ -258,7 +278,9 @@ check for broken links in doc:
upload coverage: upload coverage:
stage: deploy stage: deploy
only: only:
- branches@kwant/kwant - schedules
dependencies:
- coverage:latest
environment: environment:
name: coverage/$CI_BUILD_REF_NAME name: coverage/$CI_BUILD_REF_NAME
url: https://kwant-project.org/coverage/$CI_BUILD_REF_SLUG url: https://kwant-project.org/coverage/$CI_BUILD_REF_SLUG
......
# Release %vX.Y.Z **UPDATE THIS**
This is a checklist based on the [release document](RELEASE.rst); consult it for more details.
## Preflight checks
- [ ] All the issues from this milestone are resolved
- [ ] Ensure that tests pass (either on [stable](https://gitlab.kwant-project.org/kwant/kwant/tree/stable) or on [master](https://gitlab.kwant-project.org/kwant/kwant/tree/master) branch)
- [ ] Documentation looks correct https://test.kwant-project.org/doc/<branch name>
- [ ] [Whatnew](doc/source/pre/whatsnew) is up to date
- [ ] `AUTHORS.rst` and `.mailmap` are up to date (run `git shortlog -s | sed -e "s/^ *[0-9\t ]*//"| xargs -i sh -c 'grep -q "{}" AUTHORS.rst || echo "{}"'`)
## Make a release, but do not publish it yet
- [ ] Tag the release
- [ ] Build the source tarball and inspect it
- [ ] Build the documentation
## Test packaging
These steps may be done in parallel
### Debian
- [ ] Follow the steps for building the Debian packages from [RELEASE.rst](RELEASE.rst)
### Conda
- [ ] Publish the release candidate source tarball "somewhere on the internet" (SOTI)
- [ ] open a PR to the [conda-forge/kwant-feedstock](https://github.com/conda-forge/kwant-feedstock/) repo on Github. Make sure to mark the PR as WIP so that it doesn't get merged in accidentally
- [ ] set the upstream tarball URL (in meta.yaml) to SOTI
- [ ] update the tarball hash in meta.yaml
- [ ] See if the package builds
## Publish the release
- [ ] push the tag
- [ ] upload the source tarball to PyPI
- [ ] upload the source tarball to the Kwant website
- [ ] publish the debian packages
- [ ] publish the ubuntu packages
- [ ] create a new version of the Kwant conda-forge feedstock, and open a pull request to upstream
- [ ] upload the documentation to the Kwant website
- [ ] update the Kwant website to say that Conda is the preferred way to install Kwant on Windows
## Announce the release
- [ ] Write a short post summarizing the highlights on the Kwant website
- [ ] post to the Kwant mailing list
## Working towards next release
- [ ] add a whatsnew file for the next release
- [ ] tag this release with an `a0` suffix
- [ ] push this tag to the official Kwant repository
- [ ] create a milestone for the next release
...@@ -3,6 +3,10 @@ Making a Kwant release ...@@ -3,6 +3,10 @@ Making a Kwant release
This document guides a contributor through creating a release of Kwant. This document guides a contributor through creating a release of Kwant.
Create a release issue
######################
Use the correct `issue template <gitlab.kwant-project.org/kwant/kwant/issues/new?issuable_template=release>`_, adjust it if necessary.
Preflight checks Preflight checks
################ ################
...@@ -114,21 +118,23 @@ Building the documentation requires 'sphinx' and a Latex installation. ...@@ -114,21 +118,23 @@ Building the documentation requires 'sphinx' and a Latex installation.
First build the HTML and PDF documentation:: First build the HTML and PDF documentation::
./setup.py build ./setup.py build
cd doc make -C doc realclean
make realclean make -C doc html latex
make html latex SPHINXOPTS='-A website_deploy=True -n -W' make -C doc/build/latex all-pdf
cd doc/build/latex
make all-pdf
Then create a zipped version of the HTML documentation and name the PDF Then create a zipped version of the HTML documentation and name the PDF
consistently, storing them, for example, in the "dist" directory along with the consistently, storing them, for example, in the "dist" directory along with the
source tarballs:: source tarballs::
ln -s `pwd`/doc/build/html /tmp/kwant-doc-<version> version=$(git describe | sed 's/^v//') # Assumes that we are on a tag.
(cd /tmp/; zip -r kwant-doc-<version>.zip kwant-doc-<version>) ln -s `pwd`/doc/build/html /tmp/kwant-doc-$version
mv /tmp/kwant-doc-<version>.zip dist (cd /tmp/; zip -r kwant-doc-$version.zip kwant-doc-$version)
mv /tmp/kwant-doc-$version.zip dist
mv doc/build/latex/kwant.pdf dist/kwant-doc-$version.pdf
Finally, rebuild the documentation for the website (including the web analysis javascript code)::
mv doc/build/latex/kwant.pdf dist/kwant-doc-<version>.pdf make -C doc html SPHINXOPTS='-A website_deploy=True -n -W'
Clone the repository of the Kwant Debian package Clone the repository of the Kwant Debian package
...@@ -514,23 +520,20 @@ Ask Christoph Groth if you need to be granted access. ...@@ -514,23 +520,20 @@ Ask Christoph Groth if you need to be granted access.
Upload the zipped HTML and PDF documentation:: Upload the zipped HTML and PDF documentation::
scp dist/kwant-doc-<version>.zip kwant-project.org:webapps/downloads/doc scp dist/kwant-doc-<version>.{zip,pdf} kwant-project.org:webapps/downloads/doc
scp dist/kwant-doc-<version>.pdf kwant-project.org:webapps/downloads/doc
Point the symbolic links ``latest.zip`` and ``latest.pdf`` to these new files::
ssh kwant-project.org "cd webapps/downloads/doc; ln -s kwant-doc-<version>.zip latest.zip"
ssh kwant-project.org "cd webapps/downloads/doc; ln -s kwant-doc-<version>.pdf latest.pdf"
Then upload the HTML documentation for the main website:: Upload the HTML documentation for the website::
rsync -rlv --delete doc/build/html/* kwant-project.org:webapps/kwant/doc/<short-version> rsync -rlv --delete doc/build/html/* kwant-project.org:webapps/kwant/doc/<short-version>
where in the above ``<short-version>`` is just the major and minor version numbers. where in the above ``<short-version>`` is just the major and minor version numbers.
Finally point the symbolic link ``<major-version>`` to ``<short-version>``:: Finally, create symbolic links for the website::
ssh kwant-project.org "cd webapps/kwant/doc; ln -s <major> <short-version>" ssh kwant-project.org
for e in zip pdf; do ln -sf kwant-doc-<version>.$e webapps/downloads/doc/latest.$e; done
ln -nsf <short-version> webapps/kwant/doc/<major>
exit
Announce the release Announce the release
......
...@@ -15,8 +15,15 @@ import sys ...@@ -15,8 +15,15 @@ import sys
import os import os
import string import string
from distutils.util import get_platform from distutils.util import get_platform
sys.path.insert(0, "../../build/lib.{0}-{1}.{2}".format(
get_platform(), *sys.version_info[:2])) package_path = os.path.abspath(
"../../build/lib.{0}-{1}.{2}"
.format(get_platform(), *sys.version_info[:2]))
# Insert into sys.path so that we can import kwant here
sys.path.insert(0, package_path)
# Insert into PYTHONPATH so that jupyter-sphinx will pick it up
os.environ['PYTHONPATH'] = ':'.join((package_path, os.environ.get('PYTHONPATH','')))
import kwant import kwant
import kwant.qsymm import kwant.qsymm
...@@ -31,7 +38,7 @@ sys.path.insert(0, os.path.abspath('../sphinxext')) ...@@ -31,7 +38,7 @@ sys.path.insert(0, os.path.abspath('../sphinxext'))
extensions = ['sphinx.ext.autodoc', 'sphinx.ext.autosummary', extensions = ['sphinx.ext.autodoc', 'sphinx.ext.autosummary',
'sphinx.ext.todo', 'sphinx.ext.mathjax', 'numpydoc', 'sphinx.ext.todo', 'sphinx.ext.mathjax', 'numpydoc',
'kwantdoc', 'sphinx.ext.linkcode'] 'kwantdoc', 'sphinx.ext.linkcode', 'jupyter_sphinx.execute']
# Add any paths that contain templates here, relative to this directory. # Add any paths that contain templates here, relative to this directory.
templates_path = ['../templates'] templates_path = ['../templates']
...@@ -239,7 +246,6 @@ autosummary_generate = True ...@@ -239,7 +246,6 @@ autosummary_generate = True
autoclass_content = "both" autoclass_content = "both"
autodoc_default_flags = ['show-inheritance'] autodoc_default_flags = ['show-inheritance']
# -- Teach Sphinx to document bound methods like functions --------------------- # -- Teach Sphinx to document bound methods like functions ---------------------
import types import types
from sphinx.ext import autodoc from sphinx.ext import autodoc
......
What's new in Kwant 1.5
=======================
This article explains the user-visible changes in Kwant 1.5.0.
...@@ -2,6 +2,7 @@ What's new in Kwant ...@@ -2,6 +2,7 @@ What's new in Kwant
=================== ===================
.. toctree:: .. toctree::
1.5
1.4 1.4
1.3 1.3
1.2 1.2
......
...@@ -62,13 +62,35 @@ Transport through a quantum wire ...@@ -62,13 +62,35 @@ Transport through a quantum wire
.. seealso:: .. seealso::
The complete source code of this example can be found in The complete source code of this example can be found in
:download:`quantum_wire.py </code/download/quantum_wire.py>` :jupyter-download:script:`quantum_wire`
In order to use Kwant, we need to import it: In order to use Kwant, we need to import it:
.. literalinclude:: /code/include/quantum_wire.py .. jupyter-kernel::
:start-after: #HIDDEN_BEGIN_dwhx :id: quantum_wire
:end-before: #HIDDEN_END_dwhx
.. jupyter-execute::
:hide-code:
# Tutorial 2.2.2. Transport through a quantum wire
# ================================================
#
# Physics background
# ------------------
# Conductance of a quantum wire; subbands
#
# Kwant features highlighted
# --------------------------
# - Builder for setting up transport systems easily
# - Making scattering region and leads
# - Using the simple sparse solver for computing Landauer conductance
# For plotting
from matplotlib import pyplot
.. jupyter-execute::
import kwant
Enabling Kwant is as easy as this [#]_ ! Enabling Kwant is as easy as this [#]_ !
...@@ -76,9 +98,11 @@ The first step is now the definition of the system with scattering region and ...@@ -76,9 +98,11 @@ The first step is now the definition of the system with scattering region and
leads. For this we make use of the `~kwant.builder.Builder` type that allows to leads. For this we make use of the `~kwant.builder.Builder` type that allows to
define a system in a convenient way. We need to create an instance of it: define a system in a convenient way. We need to create an instance of it:
.. literalinclude:: /code/include/quantum_wire.py .. jupyter-execute::
:start-after: #HIDDEN_BEGIN_goiq
:end-before: #HIDDEN_END_goiq # First define the tight-binding system
syst = kwant.Builder()
Observe that we just accessed `~kwant.builder.Builder` by the name Observe that we just accessed `~kwant.builder.Builder` by the name
``kwant.Builder``. We could have just as well written ``kwant.Builder``. We could have just as well written
...@@ -92,9 +116,10 @@ Apart from `~kwant.builder.Builder` we also need to specify ...@@ -92,9 +116,10 @@ Apart from `~kwant.builder.Builder` we also need to specify
what kind of sites we want to add to the system. Here we work with what kind of sites we want to add to the system. Here we work with
a square lattice. For simplicity, we set the lattice constant to unity: a square lattice. For simplicity, we set the lattice constant to unity:
.. literalinclude:: /code/include/quantum_wire.py .. jupyter-execute::
:start-after: #HIDDEN_BEGIN_suwo
:end-before: #HIDDEN_END_suwo a = 1
lat = kwant.lattice.square(a)
Since we work with a square lattice, we label the points with two Since we work with a square lattice, we label the points with two
integer coordinates `(i, j)`. `~kwant.builder.Builder` then integer coordinates `(i, j)`. `~kwant.builder.Builder` then
...@@ -111,9 +136,25 @@ needed in Builder (more about that in the technical details below). ...@@ -111,9 +136,25 @@ needed in Builder (more about that in the technical details below).
We now build a rectangular scattering region that is `W` We now build a rectangular scattering region that is `W`
lattice points wide and `L` lattice points long: lattice points wide and `L` lattice points long:
.. literalinclude:: /code/include/quantum_wire.py .. jupyter-execute::
:start-after: #HIDDEN_BEGIN_zfvr
:end-before: #HIDDEN_END_zfvr t = 1.0
W, L = 10, 30
# Define the scattering region
for i in range(L):
for j in range(W):
# On-site Hamiltonian
syst[lat(i, j)] = 4 * t
# Hopping in y-direction
if j > 0:
syst[lat(i, j), lat(i, j - 1)] = -t
# Hopping in x-direction
if i > 0:
syst[lat(i, j), lat(i - 1, j)] = -t
Observe how the above code corresponds directly to the terms of the discretized Observe how the above code corresponds directly to the terms of the discretized
Hamiltonian: Hamiltonian:
...@@ -140,9 +181,14 @@ Next, we define the leads. Leads are also constructed using ...@@ -140,9 +181,14 @@ Next, we define the leads. Leads are also constructed using
`~kwant.builder.Builder`, but in this case, the `~kwant.builder.Builder`, but in this case, the
system must have a translational symmetry: system must have a translational symmetry:
.. literalinclude:: /code/include/quantum_wire.py .. jupyter-execute::
:start-after: #HIDDEN_BEGIN_xcmc
:end-before: #HIDDEN_END_xcmc # Then, define and attach the leads:
# First the lead to the left
# (Note: TranslationalSymmetry takes a real-space vector)
sym_left_lead = kwant.TranslationalSymmetry((-a, 0))
left_lead = kwant.Builder(sym_left_lead)
Here, the `~kwant.builder.Builder` takes a Here, the `~kwant.builder.Builder` takes a
`~kwant.lattice.TranslationalSymmetry` as the optional parameter. Note that the `~kwant.lattice.TranslationalSymmetry` as the optional parameter. Note that the
...@@ -155,17 +201,22 @@ as the hoppings inside one unit cell and to the next unit cell of the lead. ...@@ -155,17 +201,22 @@ as the hoppings inside one unit cell and to the next unit cell of the lead.
For a square lattice, and a lead in y-direction the unit cell is For a square lattice, and a lead in y-direction the unit cell is
simply a vertical line of points: simply a vertical line of points:
.. literalinclude:: /code/include/quantum_wire.py .. jupyter-execute::
:start-after: #HIDDEN_BEGIN_ndez
:end-before: #HIDDEN_END_ndez for j in range(W):
left_lead[lat(0, j)] = 4 * t
if j > 0:
left_lead[lat(0, j), lat(0, j - 1)] = -t
left_lead[lat(1, j), lat(0, j)] = -t
Note that here it doesn't matter if you add the hoppings to the next or the Note that here it doesn't matter if you add the hoppings to the next or the
previous unit cell -- the translational symmetry takes care of that. The previous unit cell -- the translational symmetry takes care of that. The
isolated, infinite is attached at the correct position using isolated, infinite is attached at the correct position using
.. literalinclude:: /code/include/quantum_wire.py .. jupyter-execute::
:start-after: #HIDDEN_BEGIN_fskr :hide-output:
:end-before: #HIDDEN_END_fskr
syst.attach_lead(left_lead)
This call returns the lead number which will be used to refer to the lead when This call returns the lead number which will be used to refer to the lead when
computing transmissions (further down in this tutorial). More details about computing transmissions (further down in this tutorial). More details about
...@@ -175,9 +226,21 @@ We also want to add a lead on the right side. The only difference to ...@@ -175,9 +226,21 @@ We also want to add a lead on the right side. The only difference to
the left lead is that the vector of the translational the left lead is that the vector of the translational
symmetry must point to the right, the remaining code is the same: symmetry must point to the right, the remaining code is the same:
.. literalinclude:: /code/include/quantum_wire.py .. jupyter-execute::
:start-after: #HIDDEN_BEGIN_xhqc :hide-output:
:end-before: #HIDDEN_END_xhqc
# Then the lead to the right
sym_right_lead = kwant.TranslationalSymmetry((a, 0))
right_lead = kwant.Builder(sym_right_lead)
for j in range(W):
right_lead[lat(0, j)] = 4 * t
if j > 0:
right_lead[lat(0, j), lat(0, j - 1)] = -t
right_lead[lat(1, j), lat(0, j)] = -t
syst.attach_lead(right_lead)
Note that here we added points with x-coordinate 0, just as for the left lead. Note that here we added points with x-coordinate 0, just as for the left lead.
You might object that the right lead should be placed `L` You might object that the right lead should be placed `L`
...@@ -187,13 +250,9 @@ you do not need to worry about that. ...@@ -187,13 +250,9 @@ you do not need to worry about that.
Now we have finished building our system! We plot it, to make sure we didn't Now we have finished building our system! We plot it, to make sure we didn't
make any mistakes: make any mistakes:
.. literalinclude:: /code/include/quantum_wire.py .. jupyter-execute::
:start-after: #HIDDEN_BEGIN_wsgh
:end-before: #HIDDEN_END_wsgh
This should bring up this picture: kwant.plot(syst);
.. image:: /code/figure/quantum_wire_syst.*
The system is represented in the usual way for tight-binding systems: The system is represented in the usual way for tight-binding systems:
dots represent the lattice points `(i, j)`, and for every dots represent the lattice points `(i, j)`, and for every
...@@ -203,16 +262,29 @@ fading color. ...@@ -203,16 +262,29 @@ fading color.
In order to use our system for a transport calculation, we need to finalize it In order to use our system for a transport calculation, we need to finalize it
.. literalinclude:: /code/include/quantum_wire.py .. jupyter-execute::
:start-after: #HIDDEN_BEGIN_dngj
:end-before: #HIDDEN_END_dngj # Finalize the system
syst = syst.finalized()
Having successfully created a system, we now can immediately start to compute Having successfully created a system, we now can immediately start to compute
its conductance as a function of energy: its conductance as a function of energy:
.. literalinclude:: /code/include/quantum_wire.py .. jupyter-execute::
:start-after: #HIDDEN_BEGIN_buzn
:end-before: #HIDDEN_END_buzn # Now that we have the system, we can compute conductance
energies = []
data = []
for ie in range(100):
energy = ie * 0.01
# compute the scattering matrix at a given energy
smatrix = kwant.smatrix(syst, energy)
# compute the transmission probability from lead 0 to
# lead 1
energies.append(energy)
data.append(smatrix.transmission(1, 0))
We use ``kwant.smatrix`` which is a short name for We use ``kwant.smatrix`` which is a short name for
`kwant.solvers.default.smatrix` of the default solver module `kwant.solvers.default.smatrix` of the default solver module
...@@ -227,13 +299,15 @@ Finally we can use ``matplotlib`` to make a plot of the computed data ...@@ -227,13 +299,15 @@ Finally we can use ``matplotlib`` to make a plot of the computed data
(although writing to file and using an external viewer such as (although writing to file and using an external viewer such as
gnuplot or xmgrace is just as viable) gnuplot or xmgrace is just as viable)
.. literalinclude:: /code/include/quantum_wire.py .. jupyter-execute::
:start-after: #HIDDEN_BEGIN_lliv
:end-before: #HIDDEN_END_lliv
This should yield the result
.. image:: /code/figure/quantum_wire_result.* # Use matplotlib to write output
# We should see conductance steps
pyplot.figure()
pyplot.plot(energies, data)
pyplot.xlabel("energy [t]")
pyplot.ylabel("conductance [e^2/h]")
pyplot.show()
We see a conductance quantized in units of :math:`e^2/h`, We see a conductance quantized in units of :math:`e^2/h`,
increasing in steps as the energy is increased. The increasing in steps as the energy is increased. The
...@@ -333,7 +407,12 @@ Building the same system with less code ...@@ -333,7 +407,12 @@ Building the same system with less code
.. seealso:: .. seealso::
The complete source code of this example can be found in The complete source code of this example can be found in
:download:`quantum_wire_revisited.py </code/download/quantum_wire_revisited.py>` :jupyter-download:script:`quantum_wire_revisited`
.. jupyter-kernel::
:id: quantum_wire_revisited
Kwant allows for more than one way to build a system. The reason is that Kwant allows for more than one way to build a system. The reason is that
`~kwant.builder.Builder` is essentially just a container that can be filled in `~kwant.builder.Builder` is essentially just a container that can be filled in
...@@ -347,19 +426,51 @@ the code into separate entities. In this example we therefore also aim at more ...@@ -347,19 +426,51 @@ the code into separate entities. In this example we therefore also aim at more
structure. structure.
We begin the program collecting all imports in the beginning of the We begin the program collecting all imports in the beginning of the
file and put the build-up of the system into a separate function file and defining the a square lattice and empty scattering region.
`make_system`:
.. jupyter-execute::
:hide-code:
# Tutorial 2.2.3. Building the same system with less code
# =======================================================
#
# Physics background
# ------------------
# Conductance of a quantum wire; subbands
#
# Kwant features highlighted
# --------------------------
# - Using iterables and builder.HoppingKind for making systems
# - introducing `reversed()` for the leads
#
# Note: Does the same as tutorial1a.py, but using other features of Kwant.
.. jupyter-execute::
import kwant
# For plotting
from matplotlib import pyplot
a = 1
t = 1.0
W, L = 10, 30
# Start with an empty tight-binding system and a single square lattice.
# `a` is the lattice constant (by default set to 1 for simplicity).
lat = kwant.lattice.square(a)
syst = kwant.Builder()
.. literalinclude:: /code/include/quantum_wire_revisited.py
:start-after: #HIDDEN_BEGIN_xkzy
:end-before: #HIDDEN_END_xkzy
Previously, the scattering region was build using two ``for``-loops. Previously, the scattering region was build using two ``for``-loops.
Instead, we now write: Instead, we now write:
.. literalinclude:: /code/include/quantum_wire_revisited.py
:start-after: #HIDDEN_BEGIN_vvjt .. jupyter-execute::
:end-before: #HIDDEN_END_vvjt
syst[(lat(x, y) for x in range(L) for y in range(W))] = 4 * t
Here, all lattice points are added at once in the first line. The Here, all lattice points are added at once in the first line. The
construct ``((i, j) for i in range(L) for j in range(W))`` is a construct ``((i, j) for i in range(L) for j in range(W))`` is a
...@@ -375,9 +486,9 @@ hoppings. In this case, an iterable like for the lattice ...@@ -375,9 +486,9 @@ hoppings. In this case, an iterable like for the lattice
points becomes a bit cumbersome, and we use instead another points becomes a bit cumbersome, and we use instead another
feature of Kwant: feature of Kwant:
.. literalinclude:: /code/include/quantum_wire_revisited.py .. jupyter-execute::
:start-after: #HIDDEN_BEGIN_nooi
:end-before: #HIDDEN_END_nooi syst[lat.neighbors()] = -t
In regular lattices, hoppings form large groups such that hoppings within a In regular lattices, hoppings form large groups such that hoppings within a
group can be transformed into one another by lattice translations. In order to group can be transformed into one another by lattice translations. In order to
...@@ -397,9 +508,11 @@ values for all the nth-nearest neighbors at once, one can similarly use ...@@ -397,9 +508,11 @@ values for all the nth-nearest neighbors at once, one can similarly use
The left lead is constructed in an analogous way: The left lead is constructed in an analogous way:
.. literalinclude:: /code/include/quantum_wire_revisited.py .. jupyter-execute::
:start-after: #HIDDEN_BEGIN_iepx
:end-before: #HIDDEN_END_iepx lead = kwant.Builder(kwant.TranslationalSymmetry((-a, 0)))
lead[(lat(0, j) for j in range(W))] = 4 * t
lead[lat.neighbors()] = -t
The previous example duplicated almost identical code for the left and The previous example duplicated almost identical code for the left and
the right lead. The only difference was the direction of the translational the right lead. The only difference was the direction of the translational
...@@ -408,30 +521,59 @@ symmetry vector. Here, we only construct the left lead, and use the method ...@@ -408,30 +521,59 @@ symmetry vector. Here, we only construct the left lead, and use the method
of a lead pointing in the opposite direction. Both leads are attached as of a lead pointing in the opposite direction. Both leads are attached as
before and the finished system returned: before and the finished system returned:
.. literalinclude:: /code/include/quantum_wire_revisited.py .. jupyter-execute::
:start-after: #HIDDEN_BEGIN_yxot :hide-output:
:end-before: #HIDDEN_END_yxot
syst.attach_lead(lead)
syst.attach_lead(lead.reversed())
The remainder of the script has been organized into two functions. One for the The remainder of the script has been organized into two functions. One for the
plotting of the conductance. plotting of the conductance.
.. literalinclude:: /code/include/quantum_wire_revisited.py
:start-after: #HIDDEN_BEGIN_ayuk .. jupyter-execute::
:end-before: #HIDDEN_END_ayuk
def plot_conductance(syst, energies):
# Compute conductance
data = []
for energy in energies:
smatrix = kwant.smatrix(syst, energy)
data.append(smatrix.transmission(1, 0))
pyplot.figure()
pyplot.plot(energies, data)
pyplot.xlabel("energy [t]")
pyplot.ylabel("conductance [e^2/h]")
pyplot.show()
And one ``main`` function. And one ``main`` function.
.. literalinclude:: /code/include/quantum_wire_revisited.py .. jupyter-execute::
:start-after: #HIDDEN_BEGIN_cjel
:end-before: #HIDDEN_END_cjel def main():
# Check that the system looks as intended.
kwant.plot(syst)
# Finalize the system.
fsyst = syst.finalized()
# We should see conductance steps.
plot_conductance(fsyst, energies=[0.01 * i for i in range(100)])
Finally, we use the following standard Python construct [#]_ to execute Finally, we use the following standard Python construct [#]_ to execute
``main`` if the program is used as a script (i.e. executed as ``main`` if the program is used as a script (i.e. executed as
``python quantum_wire_revisited.py``): ``python quantum_wire_revisited.py``):
.. literalinclude:: /code/include/quantum_wire_revisited.py
:start-after: #HIDDEN_BEGIN_ypbj .. jupyter-execute::
:end-before: #HIDDEN_END_ypbj
# Call the main function if the script gets executed (as opposed to imported).
# See <http://docs.python.org/library/__main__.html>.
if __name__ == '__main__':
main()
If the example, however, is imported inside Python using ``import If the example, however, is imported inside Python using ``import
quantum_wire_revisted as qw``, ``main`` is not executed automatically. quantum_wire_revisted as qw``, ``main`` is not executed automatically.
...@@ -453,11 +595,9 @@ The result of the example should be identical to the previous one. ...@@ -453,11 +595,9 @@ The result of the example should be identical to the previous one.
For technical reasons it is not possible to add several points For technical reasons it is not possible to add several points
using a tuple of sites. Hence it is worth noting using a tuple of sites. Hence it is worth noting
a subtle detail in a subtle detail in:
.. literalinclude:: /code/include/quantum_wire_revisited.py >>> syst[(lat(x, y) for x in range(L) for y in range(W))] = 4 * t
:start-after: #HIDDEN_BEGIN_vvjt
:end-before: #HIDDEN_END_vvjt
Note that ``(lat(x, y) for x in range(L) for y in range(W))`` is not Note that ``(lat(x, y) for x in range(L) for y in range(W))`` is not
a tuple, but a generator. a tuple, but a generator.
......
...@@ -29,22 +29,29 @@ except ImportError: ...@@ -29,22 +29,29 @@ except ImportError:
raise raise
from ._common import KwantDeprecationWarning, UserCodeError from ._common import KwantDeprecationWarning, UserCodeError
__all__.extend(['KwantDeprecationWarning', 'UserCodeError']) __all__.extend(['KwantDeprecationWarning', 'UserCodeError'])
for module in ['system', 'builder', 'lattice', 'solvers', 'digest', 'rmt', # Pre-import most submodules. (We make exceptions for submodules that have
'operator', 'kpm', 'wraparound']: # special dependencies or where that would take too long.)
exec('from . import {0}'.format(module)) from . import system
__all__.append(module) from . import builder
from . import lattice
from . import solvers
from . import digest
from . import rmt
from . import operator
from . import kpm
from . import wraparound
__all__.extend(['system', 'builder', 'lattice', 'solvers', 'digest', 'rmt',
'operator', 'kpm', 'wraparound'])
# Make selected functionality available directly in the root namespace. # Make selected functionality available directly in the root namespace.
available = [('builder', ['Builder', 'HoppingKind']), from .builder import Builder, HoppingKind
('lattice', ['TranslationalSymmetry']), __all__.extend(['Builder', 'HoppingKind'])
('solvers.default', from .lattice import TranslationalSymmetry
['smatrix', 'greens_function', 'ldos', 'wave_function'])] __all__.extend(['TranslationalSymmetry'])
for module, names in available: from .solvers.default import smatrix, greens_function, ldos, wave_function
exec('from .{0} import {1}'.format(module, ', '.join(names))) __all__.extend(['smatrix', 'greens_function', 'ldos', 'wave_function'])
__all__.extend(names)
# Importing plotter might not work, but this does not have to be a problem -- # Importing plotter might not work, but this does not have to be a problem --
# only no plotting will be available. # only no plotting will be available.
......
...@@ -15,6 +15,5 @@ except ImportError as error: ...@@ -15,6 +15,5 @@ except ImportError as error:
"dependencies is not installed.") "dependencies is not installed.")
raise ImportError(msg) from error raise ImportError(msg) from error
__all__ = ['discretize', 'discretize_symbolic', 'build_discretized', __all__ = ['discretize', 'discretize_symbolic', 'build_discretized',
'sympify', 'lambdify', 'momentum_operators', 'position_operators'] 'sympify', 'lambdify', 'momentum_operators', 'position_operators']
...@@ -9,8 +9,7 @@ ...@@ -9,8 +9,7 @@
"""Functionality for graphs""" """Functionality for graphs"""
# Merge the public interface of all submodules. # Merge the public interface of all submodules.
__all__ = [] from .core import *
for module in ['core', 'defs']: from .defs import *
exec('from . import {0}'.format(module))
exec('from .{0} import *'.format(module)) __all__ = [core.__all__ + defs.__all__]
exec('__all__.extend({0}.__all__)'.format(module))
...@@ -10,7 +10,10 @@ __all__ = ['lapack'] ...@@ -10,7 +10,10 @@ __all__ = ['lapack']
from . import lapack from . import lapack
# Merge the public interface of the other submodules. # Merge the public interface of the other submodules.
for module in ['decomp_lu', 'decomp_ev', 'decomp_schur']: from .decomp_lu import *
exec('from . import {0}'.format(module)) from .decomp_schur import *
exec('from .{0} import *'.format(module)) from .decomp_ev import *
exec('__all__.extend({0}.__all__)'.format(module))
__all__.extend([decomp_lu.__all__,
decomp_ev.__all__,
decomp_schur.__all__])
...@@ -8,8 +8,14 @@ ...@@ -8,8 +8,14 @@
"""Physics-related algorithms""" """Physics-related algorithms"""
# Merge the public interface of all submodules. # Merge the public interface of all submodules.
__all__ = [] from .leads import *
for module in ['leads', 'dispersion', 'noise', 'symmetry', 'gauge']: from .dispersion import *
exec('from . import {0}'.format(module)) from .noise import *
exec('from .{0} import *'.format(module)) from .symmetry import *
exec('__all__.extend({0}.__all__)'.format(module)) from .gauge import *
__all__ = [leads.__all__
+ dispersion.__all__
+ noise.__all__
+ symmetry.__all__
+ gauge.__all__]
[pytest] [pytest]
testpaths = kwant testpaths = kwant
flakes-ignore = flakes-ignore =
__init__.py UnusedImport __init__.py UnusedImport ImportStarUsed ImportStarUsage
kwant/_plotter.py UnusedImport kwant/_plotter.py UnusedImport
graph/tests/test_scotch.py UndefinedName graph/tests/test_scotch.py UndefinedName
graph/tests/test_dissection.py UndefinedName