2017-01-13 18 views
1

が、私はそう、これらのファイルは非常に大きな成長することができますラ読む形式のデータ(GMSH形式をメッシュ)読むとき

enter image description here

àメッシュ表現のために使用される異なるフォーマット間の変換a little Python packageを維持それらをPythonで効率よく実行することが重要です。

最もよく使用されるフォーマットの1つはmshからGmshです。残念なことに、そのデータレイアウトはおそらく最高ではありません。例ファイル:$Nodesについて

$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 
  • 最初の数(8)が従うべきノードの数です。各ノード行で

    、最初の番号がインデックス(実際形式の静止部分によって必要とされない、うーん)、次いで3つの空間座標に従ってです。

    これまでのところ、forループでは、isliceよりも優れたものはありませんでしたが、かなり遅いです。 $Elementsについて

# 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' 
  • 最初の数(2)が従うべき要素の数です。各要素行において

    、最初の数はインデックスで、次いで要素タイプ4が四面体のためのものである)のための列挙に続きます。次に、この要素のの整数タグの数に従います(それぞれ2、ここでは1および11)。要素タイプに対応して、この行の最後のいくつかのエントリは、要素を形成する$Nodeインデックスに対応します。四面体の場合、最後の4つのエントリです。

    タグの数はエレメントタイプとノードインデックスの数と同じように、エレメントごとに異なることがあるので(ラインごとに異なる)、各ラインは異なる数の整数を有することができる。 $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.]) 
関連する問題