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

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库直接读取:

  1. 在PFC的Python环境中安装兼容版本:pip install meshio==4.4.6(适配Python3.6)
  2. 替换代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:55:38