You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

运行后子胞错位情况如下:
视角1
视角2


问题根源

代码中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 04:07:12