벌집 격자를 Julia + PyPlot으로 그리기

17789 단어 Julia물리



첫 투고입니다.
거의 메모입니다.



벌집 격자는 물성 물리학에서 유행하는 그래핀의 결정 구조이다.
헬리컬 엣지 상태 등 토폴로지컬한 물성이 예언되거나, 2층 어긋나 겹쳐서 초전도가 발현하거나 해서 매우 즐거운 물질이다.

그런 벌집 격자의 화상을 좌표의 정보로부터 작성해, 벡터 형식으로 보존하고 싶었다.
(사실은 탄소 나노튜브를 쓰고 싶다. 본 기사는 그 준비이다.)

기본 병진 벡터와 격자 벡터



선택 방법에는 무작위가 있다.
여기에
\vec{a}_1 = \left(\frac{\sqrt{3}}{2}a,\frac{1}{2}a\right) \\
\vec{a}_2 = \left(0,a\right) 

로 둔다. $a$는 격자 상수로 원자간 거리 $d$와 $a=\sqrt{3}d$의 관계에 있다.
기본 병진 벡터로 격자 벡터는
\vec{R} = m\vec{a}_{1} + n\vec{a}_{2} \quad (m,n \in \mathbb{Z})

로 표현할 수 있다.
그런데 벌집 격자는 인접한 사이트로 격자 벡터로 이동할 수 없다.
따라서 격자 벡터 위에는 두 개의 사이트를 얹는다.



환경



Windows 10 Home
julia 1.4.0
vscode
Shift+Enter로 실행 가능 라는 것을 최근에 알았습니다.

구현



두 점 사이의 거리가 원자간 거리와 일치할 때 선을 그립니다.
또한, 격자를 쓰는 것만으로는 Inkscape 등을 사용하는 것이 훨씬 간단하게 쓸 수 있다.

HoneycombLattice.jl

using PyPlot
pygui(true)#画像をポップアップで表示

d = 1.4 #隣接原子間の距離
a = sqrt(3) * d #格子定数

#基本並進ベクトル
a1 = [sqrt(3) * a / 2,a / 2] 
a2 = [0.0,a]

#格子ベクトル
function graphane_lattice(m, n)
    return m * a1 + n * a2
end

#適当に座標を作成
N = 12
M = 12
Avec = [graphane_lattice(m, n) for n = -N:N,m = 0:M ] #Aサイトの座標
Bvec = [([d,0] + graphane_lattice(m, n)) for n = -N:N,m = 0:M ] #Bサイトの座標
posvec = vcat(Avec, Bvec) #全サイトの座標
num = length(posvec) #サイトの総数

#格子をプロットする
function LatticePlot()
    fig = figure(figsize=(2, 2))
    ax = fig.add_axes((0.05, 0.05, 0.9, 0.9))
    ax.set_xlim(0, 25)
    ax.set_ylim(0, 25)
    ax.set_xticks([])
    ax.set_yticks([])

    for i = 1:num
        for j = 1:num
            if i < j #重複なく数える
                r = posvec[i] - posvec[j] #2点間のベクトル
                x = [posvec[i][1],posvec[j][1]]
                y = [posvec[i][2],posvec[j][2]]
                if sqrt(r[1]^2 + r[2]^2) < d + 1e-2 #2点間の距離が隣接原子間距離(+少し)に一致するときにプロット
                    ax.plot(x, y, color="black", lw=1)
                end
            end
        end
    end
    savefig("HoneycombLattice.svg") #保存,pdfやpngでも保存できる
end

LatticePlot() #実行

참고문헌



VSCode에서 Julia-1.4를 움직일 때까지

추가



@tenfu2tea 님으로부터 지적해 주셔서, 코드의 개선을 도모했습니다.

HoneycombLatticev2.jl

using PyPlot
pygui(true)#画像をポップアップで表示

d = 1.4 #隣接原子間の距離
a = sqrt(3) * d #格子定数


a1 = [sqrt(3) * a / 2,a / 2] 
a2 = [0.0,a]

#格子ベクトル
function graphane_lattice(m, n)
    return m * a1 + n * a2
end

#格子をプロットする
function LatticePlot()
    N = 12
    M = 12
    #座標の生成方法を改善
    Avec = hcat((graphane_lattice(m, n) for n = -N:N,m = 0:M )...) #Aサイトの座標
    Bvec = Avec .+ [d,0] #Bサイトの座標
    posvec = hcat(Avec, Bvec) #全サイトの座標
    num = size(posvec, 2) #サイトの総数


    fig = figure(figsize=(3, 3))
    ax = fig.add_axes((0.1, 0.1, 0.8, 0.8))
    ax.set_aspect("equal")
    ax.set_xlim(0, 20)
    ax.set_ylim(0, 20)
    ax.set_xticks([])
    ax.set_yticks([])

    for i = 1:num
        for j =  i + 1:num
            r = posvec[:,i] - posvec[:,j] #2点間のベクトル
            x = [posvec[1,i],posvec[1,j]]
            y = [posvec[2,i],posvec[2,j]]
            if sqrt(r'r) < d + 1e-2      #2点間の距離が隣接原子間距離(+少し)に一致するときにプロット
                ax.plot(x, y, color="black", lw=1)
            end

        end
    end
    savefig("HoneycombLattice.png", dpi=720)
end

LatticePlot() #実行

기본 병진 벡터를 선택하는 방법이거나 A 사이트에서 B 사이트로의 이동 등 아직 개선점은 있을 것 같습니다.

좋은 웹페이지 즐겨찾기