如何在FiPy中为具有P6mm对称性的二维系统定义非笛卡尔网格
适配P6mm对称性的网格实现方案
你当前使用的Grid2D是笛卡尔正交网格类,天生不支持六方对称结构的原生适配,最优实现方案如下:
- 改用FiPy自带的
TriangularMesh生成三角网格,可完美适配P6mm六方对称性的基本单元,示例代码参考:
import fipy as fp import numpy as np # 六方晶格基矢参数,dy为dx的√3倍匹配六方对称性 dx = 1. dy = dx * np.sqrt(3) nx = 10 ny = 10 # 生成六方三角网格,可通过xOfCell, yOfCell调整坐标匹配你的原胞范围 mesh = fp.TriangularMesh(nx=nx, ny=ny, dx=dx, dy=dy, # 开启周期性边界适配无限大六方体系 periodicity=(True, True))
- 不同扩散系数的区域赋值可以通过
CellVariable实现,不需要修改FaceVariable:FaceVariable主要用于定义面相关的物理量(比如面通量、边界条件掩码),你之前遇到的仅支持布尔值的情况是用于边界掩码的特定场景,实际CellVariable可以任意赋值,你只需要根据每个单元的中心坐标判断所属区域,给扩散系数变量赋值即可。

笛卡尔坐标系替代实现的问题
你提到的等价笛卡尔坐标系模拟方案存在以下明确缺陷:
- 计算资源浪费:P6mm的最小原胞面积仅为等效笛卡尔重复单元的1/2~2/3,使用笛卡尔网格会引入大量冗余计算节点,求解PDE的时间、内存开销会提升30%以上
- 边界条件易出错:六方对称的周期性边界在笛卡尔网格上需要设置非正交的周期映射,配置逻辑复杂,很容易出现边界条件不匹配的问题
- 后处理成本高:输出的场数据默认在笛卡尔坐标下,后续做对称性分析、结构表征时需要额外做坐标转换,操作繁琐且容易引入误差

内容的提问来源于stack exchange,提问作者HcN
相关产品推荐
相关产品推荐

