CGNS (CFD General Notation System) — CAE用语解释

分类: 用语集 | 2026-03-28
CAE visualization for cgns - technical simulation diagram

什么是CGNS

🧑‍🎓

CGNS是什么样的格式?与普通的文本文件有什么不同吗?


🎓

CGNS是"CFD General Notation System"的缩写,是用于标准存储CFD数据的格式。其基础是HDF5二进制格式,因此与文本文件完全不同。即使是数百万网格单元的大规模数据,也能高效处理,读写速度非常快,这是它的特点。


🧑‍🎓

原来如此,是二进制的。那为什么要特意制定CGNS这样的规范呢?各个求解器用各自的格式保存不就行了吗…


🎓

这正是当初的问题所在。1990年代的CFD行业中,各求解器都用各自专有的格式保存数据,所以从网格生成器A创建的网格传递到求解器B,再将结果传递给后处理工具C这样常见的工作流程就变得非常复杂。NASA和波音为中心,开发了一种"与求解器无关的共同数据格式",这就是CGNS的起源。


HDF5后端

🧑‍🎓

既然HDF5是后端,那普通的文本编辑器就无法查看内容了吧?调试的时候会不会很麻烦?


🎓

完全正确,用文本编辑器打不开。不过可以使用专用的GUI工具如cgnsviewHDFView,用图形方式浏览树形结构。用Python的pyCGNSh5py可以进行读写,用脚本自动处理也很简单。比如,可以用这样的代码获取节点列表:

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文件的内部结构是怎样的?有像文件夹那样的层次吗?


🎓

采用树形结构,各节点存储"名称""标签(类型)""数据"。大致的层次是这样的:

例如,对于飞机机翼的分析,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_tZoneIterativeData_t节点,可以管理各时间步的解数据指针。可以把所有时间步放在一个CGNS文件里,也可以按步骤分别存在不同文件中。实务上,如果是数千个时间步的非定常LES,全部放在一个文件里会达到几百GB,所以分割保存或间隔采样保存比较现实。


实务中的CGNS应用

🧑‍🎓

实际现场中,CGNS通常在什么场景下使用?


🎓

航空航天领域使用最多。NASA和AIAA相关的研讨会上,验证用基准测试案例的网格通常以CGNS格式发布,这已经成为标准。在涡轮机械领域,elsA、TURBO、CFX之间交换数据时CGNS也大显身手。最近,汽车CFD中CGNS的使用也在增加,很多人通过Python的meshio库与STL和VTK进行相互转换。


🧑‍🎓

OpenFOAM也能使用CGNS吗?我对OpenFOAM的印象是有专有的目录结构。


🎓

OpenFOAM有标准的ccm26ToFoamcgnsToFoam转换工具(版本差异较大)。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安装,然后用小网格试验一下,这是最快的入门方式。


相关用语

对CAE用语的准确理解是团队沟通的基础。 — Project NovaSolver也关注实务工作者的学习支持。

请告诉我们实务中CGNS遇到的课题

Project NovaSolver针对CAE工程师日常面临的课题——数据转换的复杂性、求解器间的兼容性、大规模数据的I/O——的解决而努力。您的实务经验将成为开发更好工具的原动力。

联系我们(筹备中)
本文的评价
感谢您的回答!
有参考
价值
希望更
详细
报告
错误
有参考价值
0
希望更详细
0
报告错误
0
作者:NovaSolver Contributors
匿名工程师 & AI — 网站地图
查看信息