cgns编译使用

cgns是通用cfd输入输出格式。官网没有编译好的库文件提供,需要自行编译。网上很少有关于cgns库编译的介绍。只能靠自己摸索。

cgns 3.3.1提供了cmake文件,可以使用cmake进行配置。然后由vs c++进行编译。此处记录配置和编译过程。

1 配置

下载解压cgns xxx.zip;

tcl/tk:active tcl(这个是cgns tools需要的文件,cgns tools其中包含显示cgns文件等带有gui的一些程序,使用了tcl/tk库完成gui功能)

如果要求cgns使用hdf5格式储存数据,则需要hdf5预先安装调试好。设置环境变量hdf5_dir。

2 编译

cmake_gui使用很方便。定位到cgns目录下,包含cmakelists.txt的地方,然后configure。cmake会自动列出一些编译选项:

是否使用hdf5:

是否编译shared:是否生成动态链接库;

是否编译cgnstools:

是否支持64位:

选择一些选项后,点击generate。生成vs的解决方案文件。然后用vs打开解决方案文件,即可开始生成解决方案。

3 注意事项

vs编译出现最多的是link找不到库文件。由于我不会配置cmake,只能手动为cmake生成的vs项目文件进行设置。

需要在vs项目属性-链接-附加库目录和附加输入文件中设置tcl/tk的lib目录和tck86t.lib和tk86t.lib。86是版本。

如果和hdf5相关,需要加入libhdf5xxx.lib。经过试验加入hdf5xx.lib编译仍然报错。

另外,adf_internal.c这个文件有一个open64的宏定义,意义未知,导致编译错误。直接把它注释掉了。

4 使用

编译出的cgns库版本,在编译读写cgns文件的程序时,相应的vs项目要设置与cgns库相同的版本,比如x64+debug。

如果版本不对,比如库是x64,程序采用x86/win32,会出现lnk2019错误。

另外项目->链接设置中要包含hdf5库目录。

CGNS

4.1 概述

CFD通用标记系统,既是一种文件格式规范,也表示相应的开源软件库,用于读写这种文件格式。使用cgns格式,可方便cfd数据交换,存储及应用,避免现有不同cfd软件交换数据时可能会出现的歧义。cgns格式描述了一个或多个cfd算例,其内容包括:

网格

流场

边界条件;

拓扑链接信息

辅助数据(如无量纲参数,参考状态)

通过任意的cfd软件工具,如解算器、网格生成器、流场显示、后处理,可存储上述格式文件对应部分,编辑相应数据。cgns的重要特点是数据可包含解释性注释或描述信息。此外,数据是分层结构化存储的。

数据格式是干嘛的?为了存储CFD数据,开发了这个数据格式。主要的特点在于单从文件本身就可以知道文件内数据的意义,(自描述的定义?),而且,它的结构是分层的,这天然就是CFD数据的结构。

 

4.2 ADF

CGNS只是一个规范,它使用ADF(高级数据格式)存储数据,ADF文件由node组成,每个node可以带有数据,也可以不带数据。node组成一种tree结构,这样非常便于检索数据。标准接口数据结构SIDS定义了节点类型,给出文件组成结构上的定义。也就是说,SIDS定义了ADF文件的节点代表的意义、格式。

每个节点可带有任意数量的子节点,除根节点外,每个节点有唯一的母节点。每个节点数据包括:

节点ID

名称(字符串)

标识

数据类型

量纲

量纲值

数据

子节点列表

cgns的根节点标识为CGNSBase_t,名称由用户定义。一个ADF文件可含有多个CGNSBase_t。

CGNSBase_t下面是Zone_t。Zone_t是cgns文件的主要内容。我们关心的是Zone_t的子节点Element_t,对于非结构性网格,它包含连结性表,单元类型,父单元等等。每个zone的单元编号从1开始,包括单元、面片、变,统一连续编号。

ElementConnnectivity是节点编号的数组,格式为:

ElementConnectivity = Node11, Node21, ... NodeN1,

                      Node12, Node22, ... NodeN2,

                      ...

                      Node1M, Node2M, ... NodeNM

非结构网格的node编号从1开始。

详细介绍参考SIDS第三章:约定conventions。

但是,目前出现了一个更好的数据格式HDF5,后者比前者多了并行I/O和压缩的功能,而且受到科学界更广泛的支持。但是HDF5目前的缺点在于节点数目较多时文件读写较慢,文件大小一般比ADF大。因此,CGNS委员会不会强制使用HDF5,并且,提供两种格式的自由转换。

 

4.3 API

一般读写文件的顺序如下:(实际上文件可能很复杂,所以,需要有一些判断的语句,以决定下一步如何操作。)

1、打开CGNS文件:
call cg_open_f('grid.cgns',MODE_WRITE,index_file,ier)
每个函数调用后都会返回一个index,这个index是后面引用这个实体的指针。例如,调用cg_open_f,返回index_file用于索引文件实体。调用cg_zone_write,返回index_zone用于索引zone。
2、建立基节点。
call cg_base_write_f(index_file,basename,icelldim,iphysdim, index base,ier)
3、数据或者网格被分为多个zone,每个zone是一个节点。写入zone的基本信息,诸如网格数目、节点数目等。
call cg zone write f(index file,index base,zonename,isize, Structured,index zone,ier)
4、写入节点坐标
c write grid coordinates (user must use SIDS-standard names here)
call cg coord write f(index file,index base,index zone,RealDouble,
+ ’CoordinateX’,x,index coord,ier)
call cg coord write f(index file,index base,index zone,RealDouble,
+ ’CoordinateY’,y,index coord,ier)
call cg coord write f(index file,index base,index zone,RealDouble,
+ ’CoordinateZ’,z,index coord,ier)
c close CGNS file
5、关闭文件
call cg close f(index file,ier)

对于非结构网格,还需要写入连接性列表。cg_elements_write。

 

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页