CGNS (CFD General Notation System) — CAE用语解释
什么是CGNS
CGNS是什么样的格式?与普通的文本文件有什么不同吗?
CGNS是"CFD General Notation System"的缩写,是用于标准存储CFD数据的格式。其基础是HDF5二进制格式,因此与文本文件完全不同。即使是数百万网格单元的大规模数据,也能高效处理,读写速度非常快,这是它的特点。
原来如此,是二进制的。那为什么要特意制定CGNS这样的规范呢?各个求解器用各自的格式保存不就行了吗…
这正是当初的问题所在。1990年代的CFD行业中,各求解器都用各自专有的格式保存数据,所以从网格生成器A创建的网格传递到求解器B,再将结果传递给后处理工具C这样常见的工作流程就变得非常复杂。NASA和波音为中心,开发了一种"与求解器无关的共同数据格式",这就是CGNS的起源。
HDF5后端
既然HDF5是后端,那普通的文本编辑器就无法查看内容了吧?调试的时候会不会很麻烦?
完全正确,用文本编辑器打不开。不过可以使用专用的GUI工具如cgnsview或HDFView,用图形方式浏览树形结构。用Python的pyCGNS或h5py可以进行读写,用脚本自动处理也很简单。比如,可以用这样的代码获取节点列表:
import CGNS.MAP as CGM
(tree, links, paths) = CGM.load("flow.cgns")
既然基础是HDF5,是否也能进行并行I/O?我听说大规模分析中文件的读写可能成为瓶颈。
问得好。CGNS可以直接利用HDF5的并行I/O功能(MPI-IO)。也就是说,即使用数千个进程进行分布式计算,各个进程也能同时写入到同一个CGNS文件的各自负责的区域。如果没有这个功能,就必须先把全部数据汇聚到rank 0,然后再写出,这样会导致内存和时间急剧增加。在数亿网格单元规模的分析中,并行CGNS实际上是必不可少的。
文件结构和数据模型
CGNS文件的内部结构是怎样的?有像文件夹那样的层次吗?
采用树形结构,各节点存储"名称""标签(类型)""数据"。大致的层次是这样的:
- CGNSBase_t — 最上层。定义空间维数(2D/3D)和单元维数
- Zone_t — 计算区域。结构化网格使用
Structured,非结构化网格使用Unstructured - GridCoordinates_t — 节点坐标(CoordinateX、Y、Z)
- Elements_t — 单元的连接信息(TRI_3、QUAD_4、TETRA_4、HEXA_8等)
- FlowSolution_t — 解数据(压力、速度、温度等)
- ZoneBC_t — 边界条件(进口、出口、壁面等)
例如,对于飞机机翼的分析,Base的PhysicalDimension为3,区域分为机翼表面、远场等,各区域内包含网格坐标和解的概念。
结构化网格和非结构化网格在CGNS中处理方式不同吗?
确实不同。对于结构化网格,只需在Zone_t中指定IJK大小(例如129×65×33),单元的连接信息就隐式确定,不需要Elements_t。而对于非结构化网格,需要在Elements_t中显式写入全部单元的顶点连接列表。在实务中,非结构化网格压倒性地更常见,所以掌握Elements_t的处理方式很重要。当有混合单元(四面体+棱柱等)时,需要按单元类型分别存储段落。
求解器间的互操作性
我听说使用CGNS可以在不同求解器之间交换数据,这真的能那么顺利吗?
这是CGNS的最大优势。例如,用Pointwise或ICEM CFD创建网格,然后传递给ANSYS Fluent、OpenFOAM、FUN3D、elsA等不同的求解器,使用CGNS可以将转换工作最小化。不仅可以传递网格,还可以一起携带边界条件和解数据,使得传递给后处理工具(ParaView或Tecplot)的过程也很顺利。
但实际上,求解器A写出的CGNS无法被求解器B读取这样的问题不会出现吗?
说实话,完全无缝兼容还是有问题的。CGNS规范(SIDS: Standard Interface Data Structures)范围很广,各求解器支持的范围略有不同。例如,某种特殊边界条件类型可能被求解器A用专有扩展节点写入,而求解器B会忽略这个节点。不过,网格坐标和基本流场数据(压力、速度、温度)的互操作性非常高,大约8~9成的情况下都能顺利处理。
网格和解数据的存储
你说FlowSolution_t存储解数据,那支持节点型和单元中心型两种方式吗?
都支持。FlowSolution_t内有一个GridLocation_t节点,可以指定为Vertex(节点)或CellCenter(单元中心)。基于有限元法的求解器多使用节点值,而有限体积法基础的Fluent、OpenFOAM、FUN3D等自然使用单元中心值。如果不检查是用哪种方式存储的,在后处理时会导致数值偏差,要特别注意。
非定常分析的各时间步的结果也能保存吗?文件会不会变得超级大?
可以的。通过BaseIterativeData_t和ZoneIterativeData_t节点,可以管理各时间步的解数据指针。可以把所有时间步放在一个CGNS文件里,也可以按步骤分别存在不同文件中。实务上,如果是数千个时间步的非定常LES,全部放在一个文件里会达到几百GB,所以分割保存或间隔采样保存比较现实。
实务中的CGNS应用
实际现场中,CGNS通常在什么场景下使用?
航空航天领域使用最多。NASA和AIAA相关的研讨会上,验证用基准测试案例的网格通常以CGNS格式发布,这已经成为标准。在涡轮机械领域,elsA、TURBO、CFX之间交换数据时CGNS也大显身手。最近,汽车CFD中CGNS的使用也在增加,很多人通过Python的meshio库与STL和VTK进行相互转换。
OpenFOAM也能使用CGNS吗?我对OpenFOAM的印象是有专有的目录结构。
OpenFOAM有标准的ccm26ToFoam和cgnsToFoam转换工具(版本差异较大)。Foundation版本可能没有,但ESI版本(OpenCFD版本)通常包含CGNS读取功能。即使没有,也可以用Python的pyCGNS读取网格,然后编写脚本转换为OpenFOAM的polyMesh格式。反过来,也可以把OpenFOAM的结果导出为CGNS,然后用Tecplot可视化,这样的工作流程在实务中也很常见。
开始使用CGNS的话,最初应该做什么?
首先安装cgnsview,查看示例CGNS文件。可以直观地理解树形结构。接下来,只需阅读CGNS官方文档(SIDS)中GridCoordinates_t、Elements_t和FlowSolution_t这三个部分,就能覆盖实务工作的8成。如果要用Python读写,只需pip install pyCGNS安装,然后用小网格试验一下,这是最快的入门方式。
相关用语
- HDF5 (Hierarchical Data Format 5) — 作为CGNS后端的二进制数据格式。支持高速I/O和并行访问
- SIDS (Standard Interface Data Structures) — CGNS的数据模型规范。定义节点类型和命名规则
- MLL (Mid-Level Library) — CGNS操作用的C/Fortran API。能够简洁地进行节点读写
- CFD — 计算流体动力学。CGNS主要面向的分析领域
- 离散化 — 将连续体分割为单元的过程。CGNS存储其结果网格
对CAE用语的准确理解是团队沟通的基础。 — Project NovaSolver也关注实务工作者的学习支持。
请告诉我们实务中CGNS遇到的课题
Project NovaSolver针对CAE工程师日常面临的课题——数据转换的复杂性、求解器间的兼容性、大规模数据的I/O——的解决而努力。您的实务经验将成为开发更好工具的原动力。
联系我们(筹备中)相关话题
价值
详细
错误