Python中三斜晶胞(Triclinic Cell)细分问题求助
三斜晶胞N×N×N细分时子胞错位问题解决思路
我在分析分子动力学数据时,需要将三斜晶胞(三个边长与三个夹角均不相同的平行六面体)划分为N×N×N个子单元。已成功绘制原始晶胞,但细分时遇到问题:子胞存在微小平移,和原始晶胞及彼此间都不对齐。
目前用2×2×2细分测试,目标是实现4×4×4细分,现有代码如下:
import numpy as np def subdivide_cell(origin, a, b, c, n): subdivisions = [] for i in range(n): for j in range(n): for k in range(n): sub_origin = origin + np.array([i * a / n, j * b / n, k * c / n]) sub_a = a / n sub_b = b / n sub_c = c / n subdivisions.append((sub_origin, sub_a, sub_b, sub_c)) return subdivisions
运行后子胞错位情况如下:

问题根源
代码中sub_origin的计算逻辑错误:三斜晶胞的基矢a、b、c是三维矢量,不能将各基矢的分量独立缩放后拼接数组,正确的子胞原点应该是原始原点加上三个细分基矢的线性组合,否则会破坏三斜晶胞的空间结构,导致原点偏移。
修正后的代码
import numpy as np def subdivide_cell(origin, a, b, c, n): subdivisions = [] # 预计算细分后的基矢,减少重复运算 sub_a = a / n sub_b = b / n sub_c = c / n for i in range(n): for j in range(n): for k in range(n): # 子胞原点 = 原始原点 + i*细分a + j*细分b + k*细分c sub_origin = origin + i * sub_a + j * sub_b + k * sub_c subdivisions.append((sub_origin, sub_a, sub_b, sub_c)) return subdivisions
验证建议
- 2×2×2测试时,检查最角落的子胞原点是否等于
origin + a + b + c - sub_a - sub_b - sub_c,确认与原始晶胞边界完全对齐 - 绘制时确保所有子胞的基矢方向与原始晶胞一致,仅长度为原基矢的1/n
内容的提问来源于stack exchange,提问作者Baba Booey
相关产品推荐
相关产品推荐

