Julia 并行计算Wilson loop
这里使用julia并行计算Wilson loop。{:.info} 前言这里还是使用BHZ模型为例来做计算,其实主要也就是稍微将代码进行了一些改动,使得其能进行并行计算,提高计算效率。 代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141using DelimitedFilesusing ProgressMeter@everywhere using SharedArrays, LinearAlgebra,Distributed,DelimitedFiles@everywhere function pauli() hn::Int64 = 2 g0 = zeros(ComplexF64,hn,hn) gx = zeros(ComplexF64,hn,hn) gy = zeros(ComplexF64,hn,hn) gz = zeros(ComplexF64,hn,hn) #--------------- g0[1,1] = 1 g0[2,2] = 1 gx[1,2] = 1 gx[2,1] = 1 gy[1,2] = -im gy[2,1] = im gz[1,1] = 1 gz[2,2] = -1 return g0,gx,gy,gzend#---------------------------------------------------------------@everywhere function...
BBH Nested Wilson loop计算(Julia 并行)
这里就使用Julia写了一下Nested Wilson loop的并行程序,因为前面考虑的体系其实就是一个$4\times 4$的哈密顿量,如果体系变大以及计算撒点数量变大的时候,julia还是会有点慢,这里就给一个并行的版本,并顺便看一下julia是怎么并行的。{:.info} Nested Wilson Loop关于Nested Wilson loop的计算可以参考Electric multipole moments, topological multipole moment pumping, and chiral hinge states in crystalline insulators 这篇文章,这里主要说一下自己在学习计算的时候踩过的坑。 与计算Wilson loop相同,这里最主要的仍然是找到一个Wannier band basis,也就是文章的中的公式 \rvert w_{x,\mathbf{k}}^j\rangle=\sum_{n=1}^\text{Nocc}\rvert u^n_\mathbf{k}\rangle[v_{x,\mathbf{k}}^j]^n其实在做计算的时候,最让人困扰的不过是公式中的一大堆符号对应的到底是什么,这里就来讲这个公式拆解开,一步一步的讲清楚里面的含义。这里假设你已经知道为什么要计算Nested Wilson loop,我在这里就简单的阐述一下。首先要是体系的Wilson loop计算对应的Wannier哈密顿量的能带是有能隙的,也就是说你的体系是4带模型,那么当占据态是2条能带的时候,每个占据态能带会对应着一个Wannier center,比如BHZ模型的两条占据态能带对应的Wannier band就是相互交叉的,而且因为Wilson loop与边界态之间的拓扑等价性,TI是有边界态的,所以其对应的Wilson loop在形状上就与边界态类似。而对于高阶拓扑相,首先就是要使得边界态打开能隙,那么相对应的就是其Wilson loop计算得到的Wannier center随着某个动量参数的演化是不会相互交叉的,这一点在上面BBH模型中已经计算过了,所以此时就可以对某一个单独的Wannier band计算它的Nested Wilson...
MPI+Fortran 并行编程笔记
这篇博客整理一下自己使用MPI对Fortran进行并行化的时候记录的笔记。{:.info} 前言之前虽然也整理过Fortran并行的一些东西,但是没有对MPI和Fortran并行有一个很好的理解,这里就整理一下自己在对Fortran程序进行并行化的时候,并顺便学习MPI时候的一些笔记。 MPIMPI其实就是一个管理通信结构的一个语言,在很多地方也都有使用到,我自己现在了解到的就是和Fortran还有C语言几何,来编写并行的程序。而且我自己经常使用的Python还有Julia其实也都有相关的MPI通信的库,所以这个还是很有用的,尤其是在计算有些东西的时候,速度太慢就使得每周的组会内容很少,因为算不出来结果来让自己看起来一周都在摸鱼。费话不多少,这里先来简单的介绍几个MPI最基本的函数。 MPI_INIT() :这个函数就是用来出事化MPI环境的,它有一个参数返回值,通过这个返回值就可以判断出是否初始化好了MPI的环境,毕竟只有初始化完成了,才能开始进行后面的过程。 123456PROGRAM hello_world_mpiinclude 'mpif.h'integer process_Rank, size_Of_Cluster, ierrorcall MPI_INIT(ierror) MPI_COMM_SIZE说到并行,那么必然就要提到你是多少个核在并行,那么程序如何知道你一共分配了多少个核来执行计算呢,就是通过MPI_COMM_SIZE这个函数,我们就可以在程序中获取到我们所提供的核数。作为并行化的程序,自然是你给我多少个核我就开多少个线程,所以这里其实也就是让程序知道一共可以有多少个线程。 MPI_COMM_RANK知道了一共有多少个线程之后,也就是知道了可以将自己的任务分裂成多少份,此时就需要将每一份分配到一个线程上进行计算。但是我们还是需要知道到底哪一份任务分类到了哪一个线程上。也就是说每一个线程都会有自己的一个线程id,通过这个id来判断到底是哪一份程序在哪一个线程上执行。如下面的程序所示 12345678910PROGRAM hello_world_mpiinclude 'mpif.h'integer process_Rank, size_Of_Cluster, ierrorcall...
BBH Nested Wilson loop计算(Julia Version)
Python在执行一些操作的时候有点慢,这里就使用Julia写了一下Nested Wilson loop以及Wilson loop的计算程序。{:.info} Wilson loop这个计算没有什么好说的,在其他模型里面也已经做过很多次了,比如BHZ模型Wilson loop计算这篇博客,废话不多说直接上代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114using LinearAlgebra,DelimitedFiles#--------------------------------------------------------------function hamset(kx::Float64,ky::Float64) hn::Int64 = 4 gamx::Float64 = 0.5 lamx::Float64 = 1.0 gamy::Float64 = gamx lamy::Float64 = lamx xsyb1::Float64 = 0.0000000000000 xsyb2::Float64 = 1.0000000000001 ysyb1::Float64 = 0.0000000000000 ysyb2::Float64 = 1.000000000000 ham = zeros(ComplexF64, hn, hn) ham[1, 1] = xsyb1 ham[2, 2] = ysyb1 ham[3, 3] = ysyb1 ham[4, 4] = xsyb1 ham[1, 3] = (gamx + lamx * exp(im * kx)) * ysyb2 ham[2, 4] = gamx + lamx *...
哈密顿量降维的方法
这里整理一下如何将一个$4\times 4$或者更大的哈密顿量分解成$2\times 2$的维度更低的哈密顿量来对哈密顿量的一些性质进行研究,这个方法在文献中是比较常见的一种处理方式.{:.info} 问题说明在研究有些问题的时候, 碰到的哈密顿量假如是$4\times 4$的形式, 比如下面的哈密顿量 \begin{equation} H=v_fk\sigma_3\tau_3+h\sigma_1+\Delta\tau_1\label{q1} \end{equation}简单的描述一下,这其实就是实现拓扑超导的一个模型,$h$表示磁场,$\Delta$表示电子配对,这个哈密顿量就是$4\times 4$的,而且从对易关系上来看,这两项之间满足对易关系,也就说对于边界态$v_fk\sigma_3\tau_3$而言,这里的两个质量项$h\sigma_1$和$\Delta\tau_1$之间是竞争关系,即满足 [\sigma_1\otimes\tau_0,\sigma_0\otimes...
绘制VASP能带和Wannier插值能带进行比较
通常利用Wannier对VASP计算的能带进行拟合的时候,最终总是要看一下到底拟合程度有多好,这里就用Python写个脚本,将二者放在一起进行比较。{:.info} 数据准备首先VASP计算的能带结果可以通过vaspkit来获得,最终可以得到一个BAND.dat的数据,使用Wannier90最终也可以得到一个wannier90_band.dat的数据,有了这两个文件之后,就可以进行能带绘制的,下面就是代码。 代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849# 通过读取Wannier90给出的能带数据wannier90_band.dat,与VASP结合vaspkit得到的数据BAND.dat# 来绘制 wannier插值后的能带与VASP计算的能带之间的差距#-----------------------------------------------------------------from cProfile import labelimport osimport numpy as npimport matplotlib.pyplot as plt#-----------------------------------------------------------------def dataread(): da1 = "wannier90_band.dat" x0 = [] y0 = [] with open(da1) as file: da = file.readlines() for f1 in da: temp = f1.strip().split() # 移除字符串头尾指定的字符(默认为空格),并以空格将这些字符串分开 if len(temp) != 0: x0.append(float(temp[0])) y0.append(float(temp[1])) #...