C ++:如何从格式化的文本文件中读取大量数据到程序中?

KOF*_*KOF 9 c++ parsing config mesh configuration-files

我正在为特定的流体问题编写CFD解算器。到目前为止,每次运行模拟时都会生成网格,并且当更改几何形状和流体属性时,需要重新编译程序。

对于单元数较少的小型问题,它工作得很好。但是对于细胞数超过一百万的情况,需要非常频繁地更改流体性质,效率很低。

显然,我们需要将模拟设置数据存储在配置文件中,并将几何信息存储在格式化的网格文件中。

  1. Simulation.config文件
% Dimension: 2D or 3D
N_Dimension= 2
% Number of fluid phases
N_Phases=  1
% Fluid density (kg/m3)
Density_Phase1= 1000.0
Density_Phase2= 1.0
% Kinematic viscosity (m^2/s)
Viscosity_Phase1=  1e-6
Viscosity_Phase2=  1.48e-05
...
Run Code Online (Sandbox Code Playgroud)
  1. Geometry.mesh文件
% Dimension: 2D or 3D
N_Dimension= 2
% Points (index: x, y, z)
N_Points= 100
x0 y0
x1 y1
...
x99 y99
% Faces (Lines in 2D: P1->p2)
N_Faces= 55
0 2
3 4
...
% Cells (polygons in 2D: Cell-Type and Points clock-wise). 6: triangle; 9: quad
N_Cells= 20
9 0 1 6 20
9 1 3 4 7
...
% Boundary Faces (index)
Left_Faces= 4
0
1
2
3
Bottom_Faces= 6
7
8
9
10
11
12
...
Run Code Online (Sandbox Code Playgroud)

将配置和网格信息写入格式化的文本文件很容易。问题是,如何将这些数据有效地读入程序?我想知道是否有任何易于使用的c ++库来完成此工作。

小智 5

好吧,好吧,您可以基于有限元素集合,字典,一些正则表达式来实现自己的API,并且毕竟可以根据一些国际标准进行投注实践。

或者您可以看一下:

GMSH_IO

OpenMesh:

我刚刚在C ++ OpenGL项目的上一个实现中使用了OpenMesh。


ein*_*ica 5

作为仅获得可容忍的东西的第一个迭代解决方案-接受@JosmarBarbosa的建议,并为您的数据类型使用已建立的格式-可能还会有免费的开源库供您使用。一个例子是亚琛工业大学开发的OpenMesh。它支持:

  • 表示任意多边形(一般情况)和纯三角形网格(提供更有效的专用算法)
  • 顶点,半边,边缘和面的显式表示。
  • 快速邻居访问,尤其是单环邻居(请参见下文)。
  • [定制]

但是,如果您确实需要加快网格数据的读取速度,请考虑执行以下操作:

  1. 将有限大小的元数据与较大的,无限大小的网格数据分开;
  2. 将有限大小的元数据放在一个单独的文件中,然后按照您喜欢的方式进行读取,没关系。
  3. 将网格数据排列为固定大小的元素或固定大小的结构(例如,单元,面,点等)的多个数组。
  4. 将每个固定宽度的网格数据数组存储在其自己的文件中-无需在任何地方使用流式传输单个值:只需直接按原样读取或写入数组即可。这是读取内容的示例。通过查看文件大小或元数据,您将知道读取的适当大小。

最后,您可以避免完全显式读取,而对每个数据文件使用内存映射。看到

将文件读入内存的最快技术?

注意事项:

  • 如果在具有某些值(例如,little-endian与big-endian)的不同内存布局的系统上写入和读取二进制数据,则需要重新整理内存中的字节。另请参阅有关字节顺序的此SO问题
  • 尽可能优化读取速度可能不值得。您应该考虑阿姆达尔定律,并且仅将其优化到不再占整个执行时间的大部分的程度。最好减少执行时间的几个百分点,但是要获得可以与支持已建立格式的其他工具一起使用的人类可读数据文件。