2017-01-13 41 views
1

我保持a little Python package是用於網格表示點菜讀格式的數據(GMSH網格格式)

enter image description here

這些文件可以增長相當大的不同格式之間進行轉換,所以讀取時他們與Python一起高效地執行它很重要。

最常用的格式之一是mshGmsh。不幸的是,它的數據佈局可能不是最好的。一個例子的文件:

$MeshFormat 
2.2 0 8 
$EndMeshFormat 
$Nodes 
8 
1 -0.5 -0.5 -0.5 
2 0.5 -0.5 -0.5 
3 -0.5 0.5 -0.5 
4 0.5 0.5 -0.5 
5 -0.5 -0.5 0.5 
6 0.5 -0.5 0.5 
7 -0.5 0.5 0.5 
8 0.5 0.5 0.5 
$EndNodes 
$Elements 
2 
1 4 2 1 11 1 2 3 5 
2 4 2 1 11 2 5 6 8 
$EndElements 
  • 對於$Nodes

    第一個數字(8)是節點遵循的數目。

    在每個節點線,所述第一數量是索引(實際上不是由格式的靜止部分需要,啊),然後按照三個空間座標

    到目前爲止,在for循環中我還沒有拿出比islice更好的東西,這個循環非常慢。

# The first line is the number of nodes 
line = next(islice(f, 1)) 
num_nodes = int(line) 
# 
points = numpy.empty((num_nodes, 3)) 
for k, line in enumerate(islice(f, num_nodes)): 
    points[k, :] = numpy.array(line.split(), dtype=float)[1:] 
    line = next(islice(f, 1)) 
assert line.strip() == '$EndNodes' 
  • 對於$Elements

    第一個數字(2)是元素遵循的數量。

    在各元件列中,第一個數字是索引,然後遵循爲元素類型4爲四面體)的枚舉。然後,針對該元素(在此分別爲2,即111)的個數的整數標記。對應於元素類型,此行中的最後幾個條目對應於$Node索引,其形成元素 - 在四面體的情況下,最後四個條目。由於標籤的數量可以隨着元素的不同而不同(即線到線),就像元素類型和節點索引的數量一樣,每一行可以有不同數量的整數。

對於$Nodes$Elements,對於快速閱讀此數據的任何幫助表示讚賞。

回答

3

下面是基於NumPy的一個有些怪異的實現:

f = open('foo.msh') 
f.readline() # '$MeshFormat\n' 
f.readline() # '2.2 0 8\n' 
f.readline() # '$EndMeshFormat\n' 
f.readline() # '$Nodes\n' 
n_nodes = int(f.readline()) # '8\n' 
nodes = numpy.fromfile(f,count=n_nodes*4, sep=" ").reshape((n_nodes,4)) 
# array([[ 1. , -0.5, -0.5, -0.5], 
# [ 2. , 0.5, -0.5, -0.5], 
# [ 3. , -0.5, 0.5, -0.5], 
# [ 4. , 0.5, 0.5, -0.5], 
# [ 5. , -0.5, -0.5, 0.5], 
# [ 6. , 0.5, -0.5, 0.5], 
# [ 7. , -0.5, 0.5, 0.5], 
# [ 8. , 0.5, 0.5, 0.5]]) 
f.readline() # '$EndNodes\n' 
f.readline() # '$Elements\n' 
n_elems = int(f.readline()) # '2\n' 
elems = numpy.fromfile(f,sep=" ")[:-1] # $EndElements read as -1 
# This array must be reshaped based on the element type(s) 
# array([ 1., 4., 2., 1., 11., 1., 2., 3., 5., 2., 4., 
# 2., 1., 11., 2., 5., 6., 8.])