学术, 量子输运

Kwant:一个计算紧束缚模型量子输运性质的Python包

Kwant的官网为:https://kwant-project.org/。在官网上有安装指导、API文档、例子介绍等。这里简单整理了下,学习更多可访问官网。Kwant对应的文献是这篇:Kwant: a software package for quantum transport, New J. Phys. 16, 063065 (2014)

安装方法我是采用conda(conda是最简单的安装方法,此外也可以用pip等):

conda install -c conda-forge kwant

此外,可阅读另外几篇博文:

1. 计算电导的一个例子:

"""
This code is supported by the website: https://www.guanjihuan.com
The newest version of this code is on the web page: https://www.guanjihuan.com/archives/2033
"""

import kwant
import numpy as np
from matplotlib import pyplot


def make_system():
    a = 1  # 晶格常数
    lat = kwant.lattice.square(a)  # 创建晶格,方格子

    syst = kwant.Builder()  # 建立中心体系
    t = 1.0  # hopping值
    W = 5  # 中心体系宽度
    L = 40  # 中心体系长度

    # 给中心体系赋值
    for i in range(L):
        for j in range(W):
            syst[lat(i, j)] = 0
            if j > 0:
                syst[lat(i, j), lat(i, j-1)] = -t  # hopping in y-direction
            if i > 0:
                syst[lat(i, j), lat(i-1, j)] = -t  # hopping in x-direction

    sym_left_lead = kwant.TranslationalSymmetry((-a, 0))  # 电极的平移对称性,(-a, 0)代表远离中心区的方向,向左
    left_lead = kwant.Builder(sym_left_lead)  # 建立左电极体系
    # 给电极体系赋值
    for j in range(W):
        left_lead[lat(0, j)] = 0
        if j > 0:
            left_lead[lat(0, j), lat(0, j - 1)] = -t
        left_lead[lat(1, j), lat(0, j)] = -t  # 这里写一个即可,因为平移对称性已经声明了
    syst.attach_lead(left_lead)  # 把左电极接在中心区

    sym_right_lead = kwant.TranslationalSymmetry((a, 0))
    right_lead = kwant.Builder(sym_right_lead)
    for j in range(W):
        right_lead[lat(0, j)] = 0
        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)  # 把右电极接在中心区

    kwant.plot(syst)  # 把电极-中心区-电极图画出来,通过图像可以看出有没有写错
    syst = syst.finalized()  # 结束体系的制作。这个语句不可以省。这个语句是把Builder对象转换成可计算的对象。
    return syst


def make_system_with_less_code():
    a = 1  # 晶格常数
    lat = kwant.lattice.square(a)  # 创建晶格,方格子

    syst = kwant.Builder()  # 建立中心体系
    t = 1.0  # hopping值
    W = 5  # 中心体系宽度
    L = 40  # 中心体系长度

    # 中心区
    syst[(lat(x, y) for x in range(L) for y in range(W))] = 0
    syst[lat.neighbors()] = -t  # 用neighbors()方法

    # 电极
    lead = kwant.Builder(kwant.TranslationalSymmetry((-a, 0)))
    lead[(lat(0, j) for j in range(W))] = 0
    lead[lat.neighbors()] = -t  # 用neighbors()方法
    syst.attach_lead(lead)  # 左电极
    syst.attach_lead(lead.reversed())   # 用reversed()方法得到右电极

    kwant.plot(syst)  # 把电极-中心区-电极图画出来,通过图像可以看出有没有写错
    syst = syst.finalized()  # 结束体系的制作。这个语句不可以省。这个语句是把Builder对象转换成可计算的对象。
    return syst


def main():
    syst = make_system()
    # syst = make_system_with_less_code()  # 和上面的一样,只是用更少的代码写
    energies = np.linspace(-4, 4, 200)
    data = []
    for energy in energies:
        smatrix = kwant.smatrix(syst, energy)   # compute the transmission probability from lead 0 to lead 1
        data.append(smatrix.transmission(1, 0))
    pyplot.plot(energies, data)
    pyplot.xlabel("energy [t]")
    pyplot.ylabel("conductance [e^2/h]")
    pyplot.show()
    # pyplot.savefig('conductance' + '.eps')


if __name__ == '__main__':
    main()

计算结果为:

2. 查看方格子哈密顿量

"""
This code is supported by the website: https://www.guanjihuan.com
The newest version of this code is on the web page: https://www.guanjihuan.com/archives/2033
"""

import kwant
import matplotlib.pyplot as plt


def main():
    L = 3
    W = 2

    lat = kwant.lattice.square(a=1, norbs=1)    # 定义lattice
    print('\nlat:\n', lat)

    syst = kwant.Builder()    # 定义中心区的Builder
    print('\nsyst:\n', syst)
    
    syst_finalized = syst.finalized() 
    hamiltonian = syst_finalized.hamiltonian_submatrix()   # 查看哈密顿量
    print('\nhamiltonian_1(定义):\n', hamiltonian) 
    
    syst[(lat(x, y) for x in range(L) for y in range(W))] = 0    # 晶格初始化为0

    kwant.plot(syst)  # 画出syst的示意图

    syst_finalized = syst.finalized() 
    hamiltonian = syst_finalized.hamiltonian_submatrix()  # 查看哈密顿量
    print('\nhamiltonian_2(初始化):\n', hamiltonian)  

    syst[lat.neighbors()] = 1    # 添加最近邻跃迁

    kwant.plot(syst)   # 画出syst的示意图

    syst_finalized = syst.finalized() 
    hamiltonian = syst_finalized.hamiltonian_submatrix()  # 查看哈密顿量
    print('\nhamiltonian_3(最近邻赋值):\n', hamiltonian)      
    
    lead = kwant.Builder(kwant.TranslationalSymmetry((-1, 0)))  # 定义电极的Builder
    lead[(lat(0, j) for j in range(W))] = 0  # 电极晶格初始化
    lead[lat.neighbors()] = 1 # 添加最近邻跃迁
    syst.attach_lead(lead)  # 中心区加上左电极
    syst.attach_lead(lead.reversed())   # 用reversed()方法得到右电极

    # 画出syst的示意图
    kwant.plot(syst)

    # 查看哈密顿量(加了电极后,并不影响syst哈密顿量)
    syst_finalized = syst.finalized() 
    hamiltonian = syst_finalized.hamiltonian_submatrix() 
    print('\nhamiltonian_4(加了电极后):\n', hamiltonian)


if __name__ == '__main__':
    main()

计算结果为:

6,534 次浏览

【说明:本站主要是个人的一些笔记和代码分享,内容可能会不定期修改。为了使全网显示的始终是最新版本,这里的文章未经同意请勿转载。引用请注明出处:https://www.guanjihuan.com

评论说明:
(1)在保留浏览器缓存的前提下,目前支持72小时自主修改或删除个人评论。如果自己无法修改或删除评论,可再次评论或联系我。如有发现广告留言,请勿点击链接,博主会不定期删除。
(2)评论支持Latex公式。把latexpage作为标签放在任何位置,评论中的公式可正常编译,示例:
$Latex formula$  [latexpage]

21 thoughts on “Kwant:一个计算紧束缚模型量子输运性质的Python包”

  1. 请问博主,kwant建模的时候可以建多个原子层的体系吗?还是说只支持单原子层的模型

    1. 要求不高,随便一台电脑都可以。也看计算的体系大小吧,几十到几百几千的原子,都能算得动。如果上万的话,估计内存就不够了,而且计算时间会特别长。一般都是从小开始做测试,有必要的话再增加体系大小。

  2. 安装完import kwant 出现warining
    RuntimeWarning: MUMPS is not available, SciPy built-in solver will be used as a fallback. Performance can be very poor in this case.
    不影响使用,但是conda install -c conda-forge mumps之后仍然有warning
    请问您的运行有这个warning吗?

      1. 谢谢~已经搞定了~是包与包版本依赖的问题。
        ```shell{.line-numbers}
        conda install -c conda-forge kwant
        conda pandas
        conda holoviews
        conda matplotlib==3.1.0
        conda matplotlib-base==3.1.0
        ```
        另外你最近的PRB我有关注,很不错。我也在学习topological semimetal的输运方面的计算。

  3. 话说Kwant能用来做器件仿真吗,就是说能不能给定两端电源电势差,然后通过泊松方程自洽迭代计算得到中心区的势能,以此改变中心区的哈密顿量矩阵,然后再解薛定谔方程。
    我看Kwant的手册势能V貌似需要手动给出,不知道您是否了解这方面?我之前用的是NanoTCAD但是python2.X的依赖有点太老了,而且对三维的支持也不太友好。

    1. 我对这方面不是很了解,目前用的不多。你可以多看看官方文档,甚至是kwant源码。

  4. 您好!我在anaconda promp中输入了您的安装语句,报错了:
    CondaHTTPError: HTTP 000 CONNECTION FAILED for url
    Elapsed: -

    An HTTP error occurred when trying to retrieve this URL.
    HTTP errors are often intermittent, and a simple retry will get you on your way.
    'https://conda.anaconda.org/conda-forge/noarch'

    请问这个问题怎么解决啊 搞了好半天没解决,感谢!

    1. 这个我不大了解,可以网上搜下出这个bug是什么原因。

      一个简单的办法是确认下基础python环境。要先安装一下anaconda,有一些基础包后再安装别的。

    2. 如果anaconda安装不多包,也可以卸载后重新安装试试。如果实在不行,也可以用官网上说的其他安装方法,比如用pip。可以多尝试一些方法,配置环境是稍微麻烦了些。

        1. ```shell{.line-numbers}
          conda create -n kwant python=3.6
          conda install -c conda-forge kwant
          ```
          我也遇到过,这个可能是conda-forge被屏蔽有关,网络不稳定。隔天试一下就可以了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注