2012-01-09 58 views
1

我正在嘗試使用C編寫一個傳統的.vtk文件來讀入VisIt。不幸的是,我安裝的VisIt程序拒絕呈現我寫的VTK文件,內容如下: '本地主機失敗'編寫一個VTK ASCII傳統文件在VisIt中繪製輪廓

下面是用於從一個文件中讀取數據並將其轉換爲傳統VTK文件的代碼。我使用宏XPIXYPIXZPIX來描述像素網格的尺寸。每個像素都包含一個標量密度值。我列出的像素在「網格文件」使用行主要順序:即

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

在這個像素列表中的每個條目被讀取到一個數組叫類型的grid[]雙,並寫入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繪製輪廓。我的數據集是否太大?

回答

2

你見過vtk data format error這個問題的答案嗎?問題是在C++中調試VTK編寫器,但它與代碼很相似(當然應該產生相同的結果)。

從接受的答案,關鍵的一點是,數據被寫入列重大秩序,行優先順序(你似乎在這個在你的問題暗示:「我所知道的一個事實,即structured_points可能使用列主要索引「)。

此外,它總是有幫助的(如果可以的話)比較你的代碼和你知道的東西。例如,VisIt提供了一個用於編寫傳統VTK文件格式(稱爲VisItWriterLib)的小型C庫。比較代碼和VisItWriterLib的輸出以查看數據文件的不同位置。我建議使用VisItWriterLib來完成VTK IO,而不是編寫自己的例程 - 不需要重新發明輪子。

編輯:要回答幾個您的其他問題:

After running the grid data list through this routine, I have XPIX*YPIX lines in the lookup_table, each with ZPIX entries. Is this an incorrect format?

這是正確的格式。 LOOKUP_TABLE應該是XPIX*YPIX*ZPIX行的列表,每行一個元素(或者,VisIt將接受一行XPIX*YPIX*ZPIX元素)。參見VTK文件格式文檔(www.vtk.org/VTK/img/file-formats.pdf)中的數據集屬性格式

Is my data set simply too large?

我對此表示懷疑。 VisIt旨在處理巨大的數據集,並且AFAIK可以呈現PB級數據集。如果你的數據很大,我會非常驚訝。

但是,如果您擔心有大文件,可以將數據拆分爲多個文件,並告訴VisIt讀取這些文件是平行的。爲此,請將您的數據寫入單獨的文件中,例如domain1.vtkdomain2.vtk,... domainN.vtk等,然後寫一個.visit主文件,它具有結構

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

保存此,例如,mydata.visit然後打開這個文件.visit,而不是.vtk文件,在訪問。

+0

謝謝你的第一個答覆。我現在改變了輸入格式,以便DEFAULT LOOKUP_TABLE每行列出一個條目。 reoformatting vtk的文件,並試圖獲得一個輪廓,我收到以下錯誤消息後: engine_ser(1582年)的malloc:*** MMAP(大小= 1549684736)失敗(錯誤碼= 12) ***錯誤:無法分配區域 ***在malloc_error_break中設置斷點以便調試 無法在本地主機上計算... 這導致我相信我的數據集實際上可能太大。 – rspeare 2012-01-09 19:26:18

+0

@ user1139057你的數據有多大? 「XPIX」,「YPIX」和「ZPIX」的典型值是什麼?當你說你得到一個錯誤時,你的意思是當你嘗試在VisIt中打開你的文件?嘗試使用更高級別的調試來運行VisIt(例如,使用'/ path_to_visit/visit/-debug 5'命令啓動VisIt。請參見[本FAQ](https://wci.llnl.gov/codes/visit/FAQ) .html#4)瞭解更多信息 – Chris 2012-01-09 19:40:56

+0

XPIX,YPIX和ZPIX的典型值是500,每種類型都是double類型的,這意味着我試圖分配大約1.4GB的內存(我的macbook只有2GB )。我目前在調試模式下運行VisIt,希望調試文件會顯示一些新的信息 – rspeare 2012-01-10 02:00:07