트랜지스터 변환 벡터의 좌표 계산(Calculate xyz coordinates of translation vectors from cif format)

이 원고는 계산화학 등에서 주기적 경계 조건을 사용해 계산하는 사람을 대상으로 한 필기다.
변환 벡터(Translation Vectors:TV)의 길이와 각도가 알려진 단원 단원에 대해 격자점의 3차원 좌표(TV의 성분)를 계산하는 계산을 설명한다.크리스털 구조 데이터베이스에서 얻은 CIF 파일에 기재된 크리스털 구조를 xyz 등으로 변환할 때 참고하십시오.

결정 단위 격자


AO계 결정 결정체의 예를 표시합니다.

이런 단위 결정은 보통 $a축, $b축, $c$c축 3차원 벡터로 설명됩니다.

축의 각도는 $\alpha$축과 $a$축의 각도는 $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$a축의 각도는 $\gamma달러입니다.
축의 길이와 각도를 알고 있으면 3D Cartesian 좌표계(직교 좌표계)로 변환할 수 있습니다.

카드시안으로 전환


크리스털을 변환한 후의 좌표는 유일하지 않다.
여기서 $a$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
결과만 나오면.
\vec{a}=\left[\begin{array}{c}
|\vec{a}| \\
0 \\
0
\end{array}\right]
\vec{b}=\left[\begin{array}{c}
|\vec{b}| \cos \gamma \\
|\vec{b}| \sin \gamma \\
0
\end{array}\right]
\vec{c}=\left[\begin{array}{c} 
|\vec{c}| \cos \beta \\
\dfrac{|\vec{c}|(\cos \alpha -\cos \beta \cos \gamma )}{\sin\gamma } \\
|\vec{c}|\sqrt{1-\cos^2 \beta-\left(\dfrac{\cos \alpha -\cos \beta \cos \gamma}{\sin\gamma }\right)^2}
\end{array}\right]
.축은 모두 원점을 시작점으로 합니다.
참고로 셀의 부피는 $V=|\vec{a}|||||\vec{b}|\vec{c}|\sqrt{sin^2\beta\sin^2\gamma-\left(\cos\alpha-\cos\beta\cos\gamma\right)^2}달러입니다V=\left|\vec{a}\cdot\vec{b}\times\vec{c}\right|$도 요청되었지만, 현재 TV
\small \left[\begin{array}{ccc} 
|\vec{a}| & 0 & 0 \\
|\vec{b}| \cos \gamma & |\vec{b}| \sin \gamma & 0 \\
|\vec{c}| \cos \beta & \dfrac{|\vec{c}|(\cos \alpha -\cos \beta \cos \gamma )}{\sin\gamma } & |\vec{c}|\sqrt{1-\cos^2 \beta-\left(\dfrac{\cos \alpha -\cos \beta \cos \gamma}{\sin\gamma }\right)^2}
\end{array}\right]
의 하삼각형 행렬이기 때문에 단원격의 부피는 대각분량의 적으로 표시할 수 있다.

변환 코드


python을 변환하는 스크립트를 보여 줍니다.목록의 수치를 적절하게 바꾸십시오.
또한python에서 삼각함수의 내용은 호도 단위로 해야 하기 때문에 $\pi/180달러를 곱해서 환산해야 한다.
cartesian.py
import math

length = [6.18704,  2.91581,  7.28313] # a, b, c
degree_angle = [81.6066,  99.4557,  76.4221] # alpha, beta, gamma
angle = [i * math.pi/180.0 for i in degree_angle] # degree --> rad

a_axis = [0.0] * 3
b_axis = [0.0] * 3
c_axis = [0.0] * 3

a_axis[0] = length[0]
a_axis[1] = 0.00000
a_axis[2] = 0.00000

b_axis[0] = length[1]*math.cos(angle[2])
b_axis[1] = length[1]*math.sin(angle[2])
b_axis[2] = 0.00000

c_axis[0] = length[2]*math.cos(angle[1])
c_axis[1] = length[2]*(math.cos(angle[0])-math.cos(angle[1])*math.cos(angle[2]))/math.sin(angle[2])
c_axis[2] = length[2]*math.sqrt(1-(math.cos(angle[1])**2-(math.cos(angle[0])-math.cos(angle[1])*math.cos(angle[2]))/math.sin(angle[2]))**2)

print("TV",'{:>14.10f}'.format(a_axis[0]),'{:>14.10f}'.format(a_axis[1]),'{:>14.10f}'.format(a_axis[2]))
print("TV",'{:>14.10f}'.format(b_axis[0]),'{:>14.10f}'.format(b_axis[1]),'{:>14.10f}'.format(b_axis[2]))
print("TV",'{:>14.10f}'.format(c_axis[0]),'{:>14.10f}'.format(c_axis[1]),'{:>14.10f}'.format(c_axis[2]))

좋은 웹페이지 즐겨찾기