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库目录。

4.1 概述

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

网格、流场、边界条件;拓扑链接信息;辅助数据(如无量纲参数,参考状态)

通过任意的cfd软件工具,如解算器、网格生成器、流场显示、后处理,可存储上述格式文件对应部分,编辑相应数据。

cgns的重要特点是数据可包含解释性注释或描述信息(单从文件本身就可以知道文件内数据的意义)。此外,数据是分层结构化存储的。

cgns编译使用_第1张图片

4.2 ADF

CGNS只是一个规范,它使用ADF/HDF5存储数据。

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

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。

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是一个节点。写入zone的基本信息,诸如网格数目、节点数目等。
call cg zone write f(index file,index base,zonename,isize, Structured,index zone,ier)
4、写入节点坐标
/* write grid coordinates (user must use SIDS-standard names here)*/
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、建立结果节点

c   create flow solution node
      call cg_sol_write_f(index_file,index_base,index_zone,solname,
     + Vertex,index_flow,ier)

6、写入结果数据

c   write flow solution (user must use SIDS-standard names here)
      call cg_field_write_f(index_file,index_base,index_zone,index_flow,
     + RealDouble,'Density',r,index_field,ier)
      call cg_field_write_f(index_file,index_base,index_zone,index_flow,
     + RealDouble,'Pressure',p,index_field,ier)

7、关闭文件
call cg close f(index file,ier)

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

5 函数手册

cg_goto(int fn, int B, ..., "end")

直接定位到某个节点Node。

输入参数:fn – cgns文件序号;B – 根节点编号;…表示变量对,即“节点名”,节点编号,例如”Zone_t”, 1。”end”字符串或NULL必须是最后一个参数,表示前述变量对字符串已经结束。

Descriptor_t

Descriptor_t是包含字符串的文档或注释结构。字符串中允许的字符包括换行符,制表符和其他特殊字符; 这可能允许在数据库中包含无限的文档。例如,可以使用单个Descriptor_t结构来“吞下”整个ASCII文件。在CGNS定义的层次结构中,每个允许包含多个Descriptor_t子结构。可以为常用的Descriptor_t结构实体的名称制定约定 ,例如ReadMe或 YouReallyWantToReadMeFirst。

  Descriptor_t:=

    {

    Data(char,1,string_length);

    };

其中string_length是字符串的长度。

你可能感兴趣的:(蒙特卡罗射线追踪,c和c++程序设计,蒙特卡洛射线追踪,c++,开发语言)