벌집 격자를 Julia + PyPlot으로 그리기
서
첫 투고입니다.
거의 메모입니다.
벌집 격자는 물성 물리학에서 유행하는 그래핀의 결정 구조이다.
헬리컬 엣지 상태 등 토폴로지컬한 물성이 예언되거나, 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 사이트로의 이동 등 아직 개선점은 있을 것 같습니다.
Reference
이 문제에 관하여(벌집 격자를 Julia + PyPlot으로 그리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/SOI_Phys/items/e442ece8788ca4cc39bd
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
선택 방법에는 무작위가 있다.
여기에
\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 사이트로의 이동 등 아직 개선점은 있을 것 같습니다.
Reference
이 문제에 관하여(벌집 격자를 Julia + PyPlot으로 그리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/SOI_Phys/items/e442ece8788ca4cc39bd
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
두 점 사이의 거리가 원자간 거리와 일치할 때 선을 그립니다.
또한, 격자를 쓰는 것만으로는 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 사이트로의 이동 등 아직 개선점은 있을 것 같습니다.
Reference
이 문제에 관하여(벌집 격자를 Julia + PyPlot으로 그리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/SOI_Phys/items/e442ece8788ca4cc39bd
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
@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 사이트로의 이동 등 아직 개선점은 있을 것 같습니다.
Reference
이 문제에 관하여(벌집 격자를 Julia + PyPlot으로 그리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/SOI_Phys/items/e442ece8788ca4cc39bd텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)