Gmsh结构化六面体网格导入Itasca PFC7-3D变为四面体问题求助
问题:Gmsh六面体网格导入PFC3D后变为畸变四面体
环境:Fipy 3.4.3、Gmsh 4.11.1、Itasca PFC7-3D(配套Python3.6专属ipython环境)
将Gmsh创建的3D圆柱结构化六面体CFD网格通过Fipy导入PFC3D后,网格变为四面体且形态畸变。已尝试删除.msh文件中的非六面体元素、手动调整节点排序,均未解决问题。
使用的Python代码片段:
import fipy as fp import numpy as np from itasca import cfdarray as ca class DarcyFlowSolution(object): def __init__(self): # 读取Gmsh网格文件 self.mesh = fp.meshes.gmshMesh.Gmsh3D(r"C:\Users\lenovo\Documents\Itasca\pfc3d700\My Projects\c6") # 导入PFC3D,手动调整了节点顺序 ca.create_mesh(self.mesh.vertexCoords.T, self.mesh._cellVertexIDs.T[:,(0,2,3,1,4,6,7,5)].astype(np.int64)) # itasca.cfdarray.create_mesh参数说明: # nodes: float数组,维度{nnodes, 3},存储节点坐标 # elements: int数组,维度{nelem, 8},存储每个六面体单元的节点索引,索引从0开始
PFC3D六面体单元节点排序规则:
遵循右手定则,底面四个节点需按顺时针方向(从顶面俯视)排列,顶面四个节点与底面节点一一对应(如底面节点顺序为0-1-2-3,顶面对应为4-5-6-7)。
解决方法
1. 确保Gmsh输出纯六面体网格且格式兼容
- 打开Gmsh验证单元类型,仅保留HEXAHEDRON(单元类型4),删除所有四面体、棱锥等非六面体单元后重新导出
- 导出时选择Gmsh MSH格式版本2(Fipy对版本2的解析兼容性优于版本4)
2. 修正节点顺序映射逻辑
Fipy读取Gmsh网格后,_cellVertexIDs的节点顺序可能与Gmsh原始输出、PFC要求均不一致,需先确认顺序再调整:
import fipy as fp import numpy as np from itasca import cfdarray as ca class DarcyFlowSolution(object): def __init__(self): self.mesh = fp.meshes.gmshMesh.Gmsh3D(r"C:\Users\lenovo\Documents\Itasca\pfc3d700\My Projects\c6") # 打印第一个单元的节点顺序,确认Gmsh的排列方式 print("Gmsh单单元节点顺序:", self.mesh._cellVertexIDs[0]) # 根据PFC规则调整顺序(示例:Gmsh为底面逆时针0-1-2-3,顶面逆时针4-5-6-7,转PFC顺时针) pfc_node_order = [0, 3, 2, 1, 4, 7, 6, 5] # 转换单元节点索引并导入 ca.create_mesh( self.mesh.vertexCoords.T, self.mesh._cellVertexIDs[:, pfc_node_order].astype(np.int64) )
3. 验证输入维度正确性
添加打印语句确认数据维度符合create_mesh要求:
print("节点坐标维度:", self.mesh.vertexCoords.T.shape) # 应为(nnodes, 3) print("单元节点索引维度:", self.mesh._cellVertexIDs[:, pfc_node_order].shape) # 应为(nelem, 8)
4. 绕过Fipy,直接用meshio读取网格
如果Fipy的Gmsh解析存在固有问题,可使用兼容Python3.6的meshio库直接读取:
- 在PFC的Python环境中安装兼容版本:
pip install meshio==4.4.6(适配Python3.6) - 替换代码:
import meshio import numpy as np from itasca import cfdarray as ca class DarcyFlowSolution(object): def __init__(self): # 直接读取Gmsh文件 mesh = meshio.read(r"C:\Users\lenovo\Documents\Itasca\pfc3d700\My Projects\c6.msh") # 提取六面体单元(meshio中单元类型标识为"hexahedron") hex_elements = mesh.cells_dict["hexahedron"] # 提取节点坐标 nodes = mesh.points # 调整节点顺序适配PFC规则 pfc_node_order = [0, 3, 2, 1, 4, 7, 6, 5] ca.create_mesh(nodes, hex_elements[:, pfc_node_order].astype(np.int64))
内容的提问来源于stack exchange,提问作者Hadi_Morovvatju
相关产品推荐
相关产品推荐

