氯化钠晶体

2024-05-14 22:37:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着做这个练习:

氯化钠晶体的钠和氯原子排列在立方体上 但原子在钠和氯之间交替,所以每一个钠 被六个氯包围,每个氯被六个钠包围。 使用两种不同的颜色创建氯化钠晶格的可视化 表示两种类型的原子

我的代码是:

from vpython import *
from numpy import *

L = 5
R = 0.5
for i in range(-L,L,2):
    for j in range(-L,L,2):
        for k in range(-L,L,2):
            sphere(pos=vector(i,j,k),radius = R, color = vec(0,1,1))

for l in range(-L+1,L+1,2):
    for m in range(-L+1,L+1,2):
        for n in range(-L+1,L+1,2):
            sphere(pos=vector(l,m,n),radius = R, color = vec(1,1,0))

但我得到这个数字: enter image description here

从这个角度看,这是不正确的,因为有相同颜色的列。我做错了什么


Tags: infromposimportfor颜色range晶格
1条回答
网友
1楼 · 发布于 2024-05-14 22:37:00

首先,所提供的代码没有生成具有预期取向的氯化钠的良好排列晶格

考虑每个输出的前几个数字。

>>> for i in range(-L,L,2):
...     for j in range(-L,L,2):
...         for k in range(-L,L,2):size = 5
...             print(i, j, k)
... 
-5 -5 -5
-5 -5 -3
-5 -5 -1
...
>>> for l in range(-L+1,L+1,2):
...     for m in range(-L+1,L+1,2):
...         for n in range(-L+1,L+1,2):
...             print(l, m, n)
... 
-4 -4 -4
-4 -4 -2
-4 -4 0
...

如果前一个球体将后一个球体偏移一个单位,则每个球体将有10个相邻球体,而不是6个相邻球体。这就解释了为什么球体被渲染得相距很远,而且每个球体似乎都有10个邻居,因此所尝试的并不是紧密堆积的立方晶格,而是全部展开。实际上,您所做的错误是在您确实不应该的情况下对晶格应用偏移,在球体之间引入间隙,使其在视觉上看起来不清晰

为了正确地执行此操作,请缓慢地执行此操作,每次执行一步,迭代该层的每个单元,并一次性渲染球体。让我们先从二维棋盘模式开始

考虑以下内容:

from vpython import *
from numpy import *

size = 5
radius = 0.5
# predefine the colours
elements = [
    vec(0, 1, 1),
    vec(1, 1, 0),
]

z = 0  # pin z to just a single layer 
for y in range(-size, size):
    for x in range(-size, size):
        sphere(pos=vector(x, y, z), radius=radius, color=elements[(x + y) % 2])

通过简单地添加x和y来计算颜色,然后取结果的模2来确定使用哪种颜色,因为奇数和偶数之和将产生奇数(否则它们是偶数),渲染出来时此数学特性将具有第一层A related thread on this这里是StackOverflow

事实证明,此属性也适用于Z层

for z in range(-size, size):
    for y in range(-size, size):
        for x in range(-size, size):
            sphere(pos=vector(x, y, z), radius=radius, color=elements[(x + y + z) % 2])

这将产生你所期望的结果。现在,如果要同时修改radius参数和颜色,可能需要将元素指定为两个字典,可以通过keyword argument expansion传入:

size = 5
elements = [
    {'radius': 0.6, 'color': vec(0, 1, 0)},
    {'radius': 0.4, 'color': vec(0.6, 0.1, 1)},
]

for z in range(-size, size):
    for y in range(-size, size):
        for x in range(-size, size):
            sphere(pos=vector(x, y, z), **elements[(x + y + z) % 2])                                                                             

这将模拟crystal structure diagram for Sodium Chloride that might be found on Wikipedia(视图旋转以更清晰地显示结果)

Generated diagram

相关问题 更多 >

    热门问题