1

.vtkC を使用して VisIt に読み込まれるレガシー ファイルを書き込もうとしています。残念ながら、インストールした VisIt プログラムは、書き込んだ VTK ファイルのレンダリングを拒否し、「ローカル ホストに失敗しました」と表示されます。

以下は、1 つのファイルからデータを読み取り、それを従来の VTK ファイルに変換するために使用されるコードです。マクロXPIXYPIX、およびを使用してZPIX、ピクセル グリッドの寸法を記述します。各ピクセルには、スカラー密度値が含まれています。行優先順序を使用して「グリッドファイル」にピクセルをリストしました:つまり

int list_index(x,y,z) = YPIX * ZPIX * x + ZPIX * y + z;

grid[]このピクセル リストのすべてのエントリはdouble 型の配列に読み込まれoutfile、従来の VTK ヘッダー データの下に書き込まれます。

/*Write vtk header */                                                           
fprintf(outfile,"# vtk DataFile Version 3.0\n");                                
fprintf(outfile,"Galaxy density grid\nASCII\nDATASET STRUCTURED_POINTS\n");     
fprintf(outfile,"DIMENSIONS %d %d %d \n", (XPIX+1), (YPIX+1), (ZPIX+1));        
fprintf(outfile,"ORIGIN 0 0 0\n");                                              
fprintf(outfile,"SPACING 1 1 1\n");//or ASPECT_RATIO                            
fprintf(outfile,"CELL_DATA %d\n", totalpix);                                    
fprintf(outfile,"SCALARS cell_density float 1\n");                              
fprintf(outfile, "LOOKUP_TABLE default\n");                                     

/*Create Memory Space to store Pixel Grid*/                                     
double *grid;                                                                   
grid = malloc(XPIX * YPIX * ZPIX * sizeof(double));                             
if (grid == NULL ){                                                             
  fprintf(stderr, "Pixel grid of type double failed to initialize\n");          
  exit(EXIT_FAILURE);                                                           
}                                                                               
fprintf(stderr,"Pixel grid has been initialized.\n Now reading infile\n");      

/*Read infile contents into double grid[], using Row-Major Indexing*/           
double rho;                                                                     
char newline;                                                                   
int i, j, k;                                                                    
for(i = 0; i < XPIX; i++){                                                      
  for(j = 0; j < YPIX; j++){                                                    
    for(k = 0; k < ZPIX; k++){                                                  
      fscanf(infile, "%lf", &rho);                                              
      grid[getindex(i,j,k)] = rho;                                              
    }                                                                           
  }                                                                             
  fprintf(stderr,"%d\n", i);                                                    
}                                                                               
fprintf(stderr,"Finished reading\n");                                           

#if !DEBUG                                                                      
/*Write out grid contents in Row major order*/                                  
fprintf(stderr,"Now writing vtk file");                                         
for(i = 0; i < XPIX; i++){                                                      
  for(j = 0; j < YPIX; j++){                                                    
    for(k = 0; k < ZPIX; k++){                                                  
      fprintf(outfile, "%lf ", grid[getindex(i,j,k)]);                          
    }                                                                           
    fprintf(outfile,"\n");                                                      
  }                                                                             
}                                                                               
fprintf(stderr,"Finished Writing to outfile\n");                                
#endif  

このルーチンでグリッド データ リストを実行するXPIX*YPIXと、lookup_table に行があり、それぞれにZPIXエントリがあります。これは間違ったフォーマットですか?VisIt は引き続き入力ファイルの読み取りに失敗します。が列メジャー インデックスを使用している可能性があることは承知していstructured_pointsますが、もちろん私の最初の目標は、VisIt から何らかの結果を取得することです。最終的には、スカラー cell_density を使用して輪郭を描画したいと思います。私のデータセットは単に大きすぎますか?

4

1 に答える 1

2

質問vtk data format errorに対する受け入れられた回答を見ましたか? 問題は、C++ で VTK ライターをデバッグすることですが、コードと非常によく似ています (もちろん、同じ結果が得られるはずです)。

受け入れられた回答の重要なポイントは、データが行の優先順ではなく、列の優先順で書き込まれることです(質問でこれを示唆しているようです:「structured_pointsが列の優先インデックスを使用する可能性があるという事実を認識しています」)。

また、(可能であれば) 動作することがわかっているコードと比較することも常に役に立ちます。たとえば、VisIt は VisItWriterLib と呼ばれる従来の VTK ファイル形式を書き込むための小さな C ライブラリを提供します。コードからの出力と VisItWriterLib を比較して、データ ファイルの違いを確認します。独自のルーチンを作成するのではなく、VTK IO に VisItWriterLib を使用することをお勧めします。車輪を再発明する必要はありません。

編集:他のいくつかの質問に答えるには:

このルーチンでグリッド データ リストを実行すると、lookup_table に XPIX*YPIX 行があり、それぞれに ZPIX エントリがあります。これは間違ったフォーマットですか?

これは正しい形式ではありません。LOOKUP_TABLE行ごとに 1 つの要素を持つ行のリストでなければなりませんXPIX*YPIX*ZPIX(または、VisIt はXPIX*YPIX*ZPIX要素を持つ 1 つの行を受け入れます)。VTK ファイル形式ドキュメント (www.vtk.org/VTK/img/file-formats.pdf)のセクションデータセット属性形式を参照してください。

私のデータセットは単に大きすぎますか?

疑わしい。VisIt は巨大なデータセットを処理するように設計されており、私の知る限り、ペタバイトのデータセットをレンダリングできます。あなたのデータがそれほど大きい場合、私は非常に驚かれることでしょう。

ただし、ファイルが大きいことに懸念がある場合は、データを複数のファイルに分割し、これらのファイルを並行して読み取るように VisIt に指示できます。domain1.vtkこれを行うには、データを個別のファイル (例: 、domain2.vtk、...など)に少し書き込みますdomainN.vtk。次に.visit、構造を持つマスター ファイルを書き込みます。

!NBLOCKS N
domain1.vtk
domain2.vtk
...
domainN.vtk

たとえば、これを名前を付けて保存し、ファイルではなくmydata.visitこのファイルを VisIt で開きます。.visit.vtk

于 2012-01-09T16:25:07.677 に答える