CGNS快速入门到实战(三):编写CGNS文件及案例展示


笔者:陈远航
坐标:南京航空航天大学–航空学院–MAV527
时间:2023年2月1日



3. 编写CGNS文件及案例展示

  第一篇文章介绍CGNS库文件的编译过程,第二篇文章重点讲了VS配置调用CGNS静态链接库,通过前面两篇文章的学习,读者可以使用已有源码进行CGNS文件的创建了。但想要更深层次的学习CGNS,必须要对代码的编写非常熟悉。

  这是“CGNS快速入门到实战”的第三篇文章,主要讨论编写CGNS文件及案例展示。首先展示一个最基本的CGNS文件所需要的构架,然后在此基础上不断向CGNS文件中加入其他信息,这也是本系列的最后一篇文章。

3.1 CGNS文件内部基本架构

  在前面我们已经成功调用CGNS静态库生成了一个CGNS文件,为了更加形象的展示,我们需要一个后处理软件,笔者使用的Tecplot。将生成的CGNS文件导入tecplot中,具体如图3.1.1所示。

在这里插入图片描述

图3.1.1

  图3.1.1展示了一个21×17×9的非结构网格块。图3.1.2展示了这个CGNS文件包含的数据,只有X、Y、Z三个轴的数据,即只包含每个点的坐标。图3.1.3展示了该文件包含的区域信息,其中包含一个内部区域(Elem)和三个边界区域(InflowElem、OutflowElem、SidewallElem)。

在这里插入图片描述

图3.1.2

在这里插入图片描述

图3.1.3

  文件已经展示过了,相信读者对于这个CGNS存储的数据已经有了大概的了解,下面将要从代码层面对它进行深层次剖析。CGNS文件内部有着严格的规范,整体呈树状分布,最顶层是根节点,然后是Base—Zone—Coordinate等等,如图3.1.4所示。

在这里插入图片描述

图3.1.4

  回到VS界面,我们仔细地学习一下CGNS文件的构建代码,这里会挑一些主要的指令解释,完整的代码会留在文末,这个代码也可以在源码里面找到src—Test_UserGuideCode—C_code—write_grid_unst.c。注:笔者使用的C++语言)
  在创建每个CGNS文件的时候都需要都这两条语句,第一条是创建一个CGNS文件,第二条是关闭该CGNS文件。创建CGNS文件时需要给定文件名和创建模式,创建模式有WRITE、READ、MODIFY,同时会返回一个文件索引

if (cg_open("grid_c.cgns",CG_MODE_WRITE,&index_file)) cg_error_exit();
cg_close(index_file);

  一个完整的CGNS文件,basezone也是必须要有的。下面第一条是写入base信息,需要给定文件索引号,库名称,单元维度(二维为2、三维为3),物理维度(一般为3),同时也会返回一个库的索引号。第二条是写入zone信息,需要给定文件索引好,库索引号,区域名称,维度数组,数据类型,同时返回一个区域索引号。这里需要强调的是,维度数组是一个长度为3的向量,分别存储vertex size、cell size及boundary vertex size。

cg_base_write(index_file,basename,icelldim,iphysdim,&index_base);
cg_zone_write(index_file,index_base,zonename,isize[0],CGNS_ENUMV(Unstructured),&index_zone);

3.2 内部拓扑、边界条件及流场解数据

  首先需要写入坐标节点,如下面三条语句所示,分别写入xyz轴的数据。需要给定文件索引、库索引、区域索引、坐标名称、坐标数组。

cg_coord_write(index_file,index_base,index_zone,CGNS_ENUMV(RealDouble),"CoordinateX",x,&index_coord);
cg_coord_write(index_file,index_base,index_zone,CGNS_ENUMV(RealDouble),"CoordinateY",y,&index_coord);
cg_coord_write(index_file,index_base,index_zone,CGNS_ENUMV(RealDouble),"CoordinateZ",z,&index_coord);

  然后写入内部拓扑关系,给定文件索引、库索引、区域索引、拓扑关系名称、拓扑类型、开始/结束单元编号、拓扑关系二维数组ielem[0],同时返回拓扑关系索引。值得注意的是,CGNS提供很多拓扑类型:BAR_2、TRI_3、QUAD_4、TETRA_4、PYRA_5、PENTA_6、HEXA_8等等。

cg_section_write(index_file,index_base,index_zone,"Elem",CGNS_ENUMV(HEXA_8),nelem_start,nelem_end,nbdyelem,ielem[0],&index_section);

  内部拓扑关系搞定之后,CGNS文件就可以被tecplot打开了,但一个完整的文件应该包含边界条件。边界条件的写入如代码所示,使用的仍是section命令,给定的条件和内部拓扑关系相同。

cg_section_write(index_file,index_base,index_zone,"InflowElem",CGNS_ENUMV(QUAD_4),nelem_start,nelem_end,nbdyelem,jelem[0],&index_section);
cg_section_write(index_file,index_base,index_zone,"OutflowElem",CGNS_ENUMV(QUAD_4),nelem_start,nelem_end,nbdyelem,jelem[0],&index_section);
cg_section_write(index_file,index_base,index_zone,"SidewallElem",CGNS_ENUMV(QUAD_4),nelem_start,nelem_end,nbdyelem,jelem[0],&index_section);

  一个完整的网格系统已经被写入CGNS文件中了,进一步的,需要将求解器得到的流场结果存入CGNS文件中。具体的流场解存入指令如下所示,首先创建sol节点,接着创建一系列流场解信息节点,比如:压力场、密度场。代码路径:src—Test_UserGuideCode—C_code—write_flowvert_unst.c。

cg_sol_write(index_file,index_base,index_zone,solname,CGNS_ENUMV(Vertex),&index_flow);
cg_field_write(index_file,index_base,index_zone,index_flow,CGNS_ENUMV(RealDouble),"Pressure",p,&index_field);
cg_field_write(index_file,index_base,index_zone,index_flow,CGNS_ENUMV(RealDouble),"Density",r,&index_field);

  本节开头展示的图片中的颜色分布是按照Z轴坐标分布的,现在我们已经成功加入密度和压力信息,图3.2.1为压力场信息。
在这里插入图片描述

图3.2.1

3.3 描述性文本、量纲单位、时间值

  本系列第二篇文章的末尾有提到,CGNS文件可以加入的信息有很多,并不局限于“内部拓扑、边界条件及流场解数据”。为了方便阅读和理解CGNS文件,通常需要在“Base”加入描述性文本。首先通过cg_goto索引到需要添加文本的地址,如第一条语句;然后通过cg_descriptor_write将信息写入文件,其中Information是文本的标题,textstring包含文本信息,如第二条语句。

cg_goto(index_file,index_base,"end");
cg_descriptor_write("Information",textstring);

  CGNS文件内部的数据是有单位的,所以需要把量纲单位写入文件中。首先通过cg_goto索引到需要添加文本的地址,如第一条语句;然后写入量纲数组,如第二条语句;最后写入单位,包括有:Kilogram、Meter、Second、Kelvin、Degree,如第三条语句。

cg_goto(index_file,index_base,"end");
cg_dataclass_write(CGNS_ENUMV(Dimensional));
cg_units_write(CGNS_ENUMV(Kilogram),CGNS_ENUMV(Meter),CGNS_ENUMV(Second),CGNS_ENUMV(Kelvin),CGNS_ENUMV(Degree));

  当我们处理瞬态问题时,CGNS文件内部一般包含时间值变量,用来记录仿真的时间。首先需要写入该文件共用几个时刻,如第一条语句,其中nsteps为时刻数;然后通过cg_goto索引到需要添加文本的地址,如第二条语句;接着天界时间刻度数组;最后给出写入类型(TimeAccurate)。

cg_biter_write(index_file,index_base,"TimeIterValues",nsteps);
cg_goto(index_file,index_base,"end");
cg_array_write("TimeValues",CGNS_ENUMV(RealDouble),1,&nuse,&time);
cg_simulation_type_write(index_file,index_base,CGNS_ENUMV(TimeAccurate));

3.4 复杂案例展示

  3.1、3.2和3.3三节展示了简单的案例,这一小节会展示更多复杂的案例。详细的代码就不在这里展示了,主要想呈现CGNS对于各种网格类型的兼容性
  案例文件来自CGNS官网(cgns.github.io/CGNSFiles.html)。图3.4.1、3.4.2是一个二维翼型的重叠网格,CGNS文件是兼容重叠网格的。背景网格和前景网格都是四边形结构网格,同时它们也可以是三角形非机构网格。

图3.4.1
图3.4.2

  图3.4.3、3.4.4展示了飞机标模DLR F6歼击机YF-17的表面网格(半模)。F6的网格是标准的结构网格,表面由四边形组成,空间上以六面体形成呈现;YF-17表面网格是三角形非结构网格,在空间上以四面体、五面体形式呈现。

图3.4.3
图3.4.4

  图3.4.5、3.4.6展示了机翼的前缘襟翼尾缘襟翼。它们都是由四边形、六面体结构网格组成。

图3.4.5
图3.4.6

  图3.4.7、3.4.8展示了一个传热管的网格构成,表面由非机构三角形网格和结构四边形网格混合而成,即混合网格,CGNS文件也可以对这种形式兼容。图3.4.9、3.4.10展示了涡轮叶片气流混合器的网格。

图3.4.7
图3.4.8
图3.4.9
图3.4.10

4. 系列总结

  CGNS格式在很多软件中都已经应用了,比如:ANSYS ICEM CFD、Pointwise、Fluent、CFX、Tecplot、Plot3D,它在创立之初就以树立行业标准严格要求。CGNS努力使CFD的输入和输出标准化,旨在消除机器之间和CFD程序之间时所需的大部分翻译过程,可以节约大量的时间和资金。它的更多的功用有待更多学者去挖掘。
  关于CGNS的前前后后到这里就结束了,整个系列分成三篇文章呈现。从库的编译到简单应用,最后是复杂案例的展示,由浅到深,逐步深入。笔者认为,想要掌握好CGNS,重要的代码素养和CFD知识是必不可少的。这里需要提一点,在第二篇文章CGNS库的简单调用中,如果无法正确得到CGNS文件,可以尝试修正VS中的Windows SDK版本号、平台工具集、代码运行库种类。
  能够成功把CGNS输出格式加入到求解器DUBHE中,支豪林师兄帮助了我很多,在这里表示非常感谢支总。朱震浩师兄、吴轲师兄也给予了我很多帮助,非常感谢。


参考文献

[1]《A User’s Guide to CGNS》

[2]《SIDS File Mapping Manual》

[3] 肖天航. 低雷诺数非定常流场的数值方法及其在微型飞行器上的应用[D].南京航空航天大学,2009.

[4] Zhi, H, Deng, S, Xiao, T, Chen, Z. Enhancement on parallel wall distance calculation methodology for partitioned unstructured grid. Int J Numer Meth Fluids. 2022; 1- 22. doi:10.1002/fld.5161

[5] Haolin ZHI, Zhenhao ZHU, Yujin LU, Shuanghou DENG, Tianhang XIAO. Aerodynamic performance enhancement of co-flow jet airfoil with simple high-lift device, Chinese Journal of Aeronautics. 2021, 143-155, https://doi.org/10.1016/j.cja.2021.01.011.

[6] Tianhang XIAO, Haolin ZHI, Shuanghou DENG, Zhaolin CHEN, Xinying LI. Enhancement on parallel unstructured overset grid method for complex aerospace engineering applications, Chinese Journal of Aeronautics, 2023, 115-138, https://doi.org/10.1016/j.cja.2022.07.015.

[7] Zhenhao ZHU, Tianhang XIAO, Haolin ZHI, Shuanghou DENG, Yujin LU. Aerodynamic characteristics of co-flow jet wing with simple high-lift devices, Chinese Journal of Aeronautics. 2022, 67-83, https://doi.org/10.1016/j.cja.2022.03.008.

[8] Tianhang Xiao, Zhenhao Zhu, Shuanghou Deng, Feng Gui, Zhengzhou Li, Zheng Zhou. Effects of nozzle geometry and active blowing on lift enhancement for upper surface blowing configuration, Aerospace Science and Technology. 2021, 106536, https://doi.org/10.1016/j.ast.2021.106536.

[9] Xiao, Tianhang & Lu, Yujin & Deng, Shuanghou & Haolin, Zhi & Zhu, Zhenhao & Chen, Jichang. (2021). Hydrodynamic Characteristics of a Helicopter Ditching on Different Positions of Wavy Water. Journal of Aircraft. 58. 1-12. 10.2514/1.C036186.


❤️希望对您有帮助,您的支持是我创作最大的动力!

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值