2011-12-05 39 views
1

我想要使用VTK(繪製彩色等值面)在一個規則的網格上存儲一些數據。我編寫了一些代碼來轉儲vtk傳統格式的數據,該格式適用於低分辨率版本的數據。我可以使用ParaView或VTK庫提取和查看預期的等值面。當我在每個維度上將分辨率提高10倍(nx從大約100到1000,與ny,nz相同)時,使用VTK庫編寫的paraview和查看器都不正確。它們看起來像一組稍微離軸的工作表,而不是一個「斑點」。我從其他測試中知道數據本身是正確的。vtk數據格式錯誤

下面我遺留的vtk格式轉儲代碼有什麼問題嗎?我不明白查找表的作用,但它似乎適用於低分辨率的情況。

std::ofstream out(filename); 

out << "# vtk DataFile Version 3.0" << std::endl; 
out << "Signed distance/biharmonic visualizer" << std::endl; 
out << "ASCII" << std::endl; 
out << "DATASET STRUCTURED_POINTS" << std::endl; 
out << "DIMENSIONS " << nx << " " << ny << " " << nz << std::endl; 
out << "ORIGIN 0 0 0" << std::endl; 
out << "SPACING " << h << " " << h << " " << h << std::endl; 
out << "POINT_DATA " << nx*ny*nz << std::endl; 
out << "SCALARS signedDistance double" << std::endl; 
out << "LOOKUP_TABLE default" << std::endl; 
for(size_t i = 0; i < nx; ++i) 
    for(size_t j = 0; j < ny; ++j) 
    for(size_t k = 0; k < nz; ++k) 
     out << tempPhi(i,j,k) << std::endl; 
out << "SCALARS biharmonic double" << std::endl; 
out << "LOOKUP_TABLE default" << std::endl; 
for(size_t i = 0; i < nx; ++i) 
    for(size_t j = 0; j < ny; ++j) 
    for(size_t k = 0; k < nz; ++k) 
     out << biharmonic(i,j,k) << std::endl; 
out.close(); 
+0

不知道這裏有什麼問題 - 這看起來似乎是輸出一個與VTK文件格式規範相匹配的文件(儘管我並不真正瞭解C++)。如果只輸出一個標量變量(在較高分辨率下),讀者是否工作?你可以發佈一個示例VTK文件,以便我們可以看到實際的輸出嗎? – Chris

+0

同樣的問題,即使只是輸出第一個字段。完整的示例數據文件在這裏:http://www.cs.utah.edu/~benjones/gridDump000008.vtk。 此外,下面是iso表面與其應該是什麼的圖片:http://www.cs.utah.edu/~benjones/isoFail.png –

回答

2

在您提供的VTK文件中有1.79769e+308的出現次數。要真正「看到」你的數據,我必須用零代替它們。完成這一步並查看VisIt中的數據文件後,我猜測你的寫點數據的方法不正確(你的三個嵌套for循環 - 這將數據從3D平面化到一維列表)。

我建議你用VTK編寫器寫一些小的測試數據集,也用this簡單的C代碼,VisIt提供這些代碼來編寫傳統的VTK文件。確保使用兩種方法編寫的數據集完全一致(請注意,VisItWriterLib.c寫入版本2 VTK文件格式,而使用版本3--但這不應該導致問題)。

編輯:正如在評論中所討論的那樣,問題在於用於輸出點數據並將其從3D平面化到一維列表的嵌套循環的排序。該代碼

for(size_t i = 0; i < nx; ++i) 
    for(size_t j = 0; j < ny; ++j) 
    for(size_t k = 0; k < nz; ++k) 
     out << tempPhi(i,j,k) << std::endl; 

其實應該讀

for(size_t k = 0; k < nz; ++k) 
    for(size_t j = 0; j < ny; ++j) 
    for(size_t i = 0; i < nx; ++i) 
     out << tempPhi(i,j,k) << std::endl; 

即數據應主要順序書寫,而不是排大。這是VTK文件格式文件缺乏的一點。

+0

由於我只關心0等值面,爲什麼這些大的價值問題?你有什麼想法爲什麼小數據集給我有用的結果,但不是大數據集?在我看來,如果這是一個扁平化問題,它會出現在任何決議。 –

+0

@BenJones刪除大值只是查看數據,並沒有被這些值所支配。由此看來,數據正在以'錯誤'讀取 - 就像VTK文件預期的格式不一樣。因此,我建議你用你的方法和我們知道的方法寫一些測試數據,比如'VisItWriterLib.c'。這是檢查輸出文件的正確格式的簡單方法。 – Chris

+0

@BenJones事實上,你的數據在低分辨率下看起來不錯,但不是高分辨率,這表明你的VTK寫程序在所有分辨率下輸出的格式不正確。它恰好在低分辨率下正常工作。我只是通過交換嵌套循環的順序來猜測(交換'i'和'k'索引),看看這是否有所作爲。 – Chris