Làm cách nào để tính toán sự khác biệt về số giữa hai trường được lưu trữ trong hai tệp VTK khác nhau có cùng cấu trúc?


13

Giả sử tôi có hai tệp VTK, cả hai đều ở định dạng lưới có cấu trúc. Các lưới có cấu trúc là như nhau (chúng có cùng một danh sách các điểm, theo cùng một thứ tự) và có một trường, gọi nó là "Phi", trong mỗi tệp VTK. Tôi muốn tạo tệp VTK thứ ba, một lần nữa với cùng một lưới có cấu trúc và vẽ một trường khác biệt giữa Phi trong tệp VTK đầu tiên và Phi trong tệp VTK thứ hai.

Tôi biết làm thế nào để làm điều này bằng tay; Tôi có thể phân tích văn bản thô trong hai tệp VTK, sao chép dữ liệu thành mảng, trừ đi một mảng từ mảng kia và sau đó chuyển dữ liệu theo đúng định dạng vào một tệp mới. Có cách nào tốt hơn để tính toán sự khác biệt này và xuất nó sang VTK không? Một giải pháp trong Python hoặc trong phần mềm trực quan hóa như VisIt hoặc Paraview sẽ thích hợp hơn là sử dụng ngôn ngữ được biên dịch như C ++.

Mục đích của việc tính toán sự khác biệt này là so sánh các phương pháp số khác nhau để tính toán giải pháp của PDE; vì tôi đang sử dụng cùng một phần mềm để tạo các giải pháp, tôi có thể đảm bảo rằng tất cả dữ liệu nhưng trường Phi sẽ giống nhau trong mỗi tệp tôi tạo.


Tôi đã đăng câu hỏi này vì tôi mất khoảng một ngày rưỡi để tìm ra câu trả lời; nếu tôi không tìm thấy nó ngày hôm qua, tôi sẽ hỏi câu hỏi này ở đây. Tôi quan tâm xem liệu có những cách nhanh chóng khác để hoàn thành cùng một nhiệm vụ.
Geoff Oxberry

Khi bạn nói "phân tích văn bản thô", bạn có nghĩa là đi vào tệp hoặc sử dụng trình phân tích cú pháp python?
SAAD

Vào lúc đó, tôi có nghĩa là viết một trình phân tích cú pháp Python bằng tay.
Geoff Oxberry

Câu trả lời:


15

Cách dễ nhất tôi có thể tìm để trừ hai trường từ các tệp VTK khác nhau có cùng cấu trúc lưới là sử dụng bộ lọc lập trình trong Paraview, cho phép bạn thao tác dữ liệu bằng các tập lệnh Python.

Trong hộp thoại bộ lọc lập trình, bạn có thể trừ hai mảng và ghi vào đầu ra với mã:

   phi_0 = inputs[0].CellData['Phi']
   phi_1 = inputs[1].CellData['Phi']
   output.CellData.append(phi_1 - phi_0, 'difference')

Trong trường hợp này, trường Phi xảy ra là dữ liệu di động. Nếu trường của bạn là dữ liệu điểm, hãy thay thế CellDatamọi nơi trong tập lệnh bằng PointData. Xem http://public.kitware.com/pipermail/paraview/2010-April/016667.html để biết thêm chi tiết.


3
Không bao giờ là quá nhiều để nhắc nhở rằng để có hai đầu vào (đầu vào [0] và đầu vào [1]), người ta phải làm nổi bật cả hai bộ dữ liệu trước khi chọn Bộ lọc lập trình (điều này được đề cập đến một liên kết được đề cập).
toliveira

3

Trong ParaView có bộ lọc Thuộc tính chắp thêm có thể được sử dụng cho việc này. Nó yêu cầu cùng một số điểm trong tập dữ liệu để nối thêm dữ liệu điểm đúng và cùng một số ô nằm trong tập dữ liệu để nối thêm dữ liệu ô đúng cách. Nó sẽ có vấn đề mặc dù với các mảng cùng tên (ví dụ Phi trong ví dụ của bạn). Bạn có thể sao chép mảng đó một cách dễ dàng bằng bộ lọc Máy tính mặc dù trước khi sử dụng bộ lọc Thuộc tính chắp thêm. Sau đó, bạn có thể sử dụng bộ lọc Máy tính khác để thực hiện phép trừ. Điều này có lẽ kém hiệu quả hơn so với sử dụng bộ lọc lập trình Python của ParaView. Ngoài ra, bạn có thể sử dụng tệp thực thi vtkpython để thực hiện thủ công vì bạn có quyền truy cập trực tiếp vào cả lưới và thuộc tính của chúng.


1

Tôi không có cách tiếp cận đặc biệt tốt, nhưng tôi sẽ sao chép trường 'phi' từ tệp VTK này sang tệp khác và đặt tên là 'phiprime' hoặc một cái gì đó. Trong cả Paraview và Visit, bạn có tùy chọn xác định các trường mới theo công thức sử dụng các giá trị của các trường khác. Sau đó, bạn có thể xác định trường "lỗi" là "error = phi-phiprime" trong trình chỉnh sửa trường và vẽ trường "lỗi" này là một bề mặt, một đường viền hoặc bất cứ điều gì bạn quan tâm.

Bước sao chép khối dữ liệu từ tệp này sang tệp khác rõ ràng rất khó xử, nhưng đó là cách tốt nhất tôi có thể nghĩ ra.


1

Tôi nhận ra điều này hơi cũ, nhưng tôi mặc dù bạn có thể quan tâm đến giải pháp VisIt:

Bạn có thể thực hiện điều này trong VisIt với một thứ gọi là Biểu thức trường chéo lưới dựa trên kết nối. Đó là một câu cửa miệng, nhưng về cơ bản là máy móc để ánh xạ các trường giữa các cơ sở dữ liệu (trong trường hợp tệp VTK của bạn).

"Dựa trên kết nối" (Conn_cmfe) được sử dụng khi cấu trúc liên kết giống nhau giữa các tệp - như trong trường hợp của bạn.

Ngoài ra còn có một "Dựa trên vị trí" (pos_cmfe) lấy mẫu giữa các lưới với các cấu trúc liên kết khác nhau.

Đối với trường hợp của bạn, hãy mở tệp đầu tiên và sử dụng cửa sổ Biểu thức để xác định biểu thức (MyPhi_Diff):

Phi - conn_cmfe(<file2.vtk:Phi>, mesh)

Sau đó, bạn có thể vẽ "MyPhi_Diff" với một âm mưu Pseudocolor.

Ngoài ra còn có trình hướng dẫn mà bạn có thể sử dụng để giúp xác định biểu thức

(Menu tùy chọn -> "So sánh mức dữ liệu")

Dưới đây là một số thông tin nhiều hơn nữa:

http://visitusers.org/index.php?title=Cmfe

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.