Bagaimana cara menghitung perbedaan angka antara dua bidang yang disimpan dalam dua file VTK yang berbeda dengan struktur yang sama?

14

Misalkan saya memiliki dua file VTK, keduanya dalam format grid terstruktur. Grid terstruktur adalah sama (mereka memiliki daftar titik yang sama, dalam urutan yang sama), dan ada bidang, sebut saja "Phi", di setiap file VTK. Saya ingin membuat file VTK ketiga, sekali lagi dengan grid terstruktur yang sama, dan plot bidang yang merupakan perbedaan antara Phi di file VTK pertama dan Phi di file VTK kedua.

Saya tahu bagaimana melakukan ini secara manual; Saya dapat mem-parsing teks mentah dalam dua file VTK, menyalin data ke dalam array, mengurangi satu array dari yang lain, dan kemudian membuang data dalam format yang benar ke dalam file baru. Apakah ada cara yang lebih baik untuk menghitung perbedaan ini dan mengekspornya ke VTK? Solusi dengan Python, atau dalam perangkat lunak visualisasi seperti VisIt atau Paraview akan lebih disukai daripada menggunakan bahasa yang dikompilasi seperti C ++.

Tujuan menghitung perbedaan ini adalah untuk membandingkan metode numerik yang berbeda untuk menghitung solusi PDE; karena saya menggunakan perangkat lunak yang sama untuk menghasilkan solusi, saya dapat menjamin bahwa semua data tetapi bidang Phi akan sama di setiap file yang saya hasilkan.

Geoff Oxberry
sumber
Saya memposting pertanyaan ini karena butuh sekitar satu setengah hari untuk mencari tahu jawabannya; seandainya saya tidak menemukannya kemarin, saya pasti sudah menanyakan pertanyaan ini di sini. Saya tertarik melihat apakah ada cara cepat lain untuk menyelesaikan tugas yang sama.
Geoff Oxberry
Ketika Anda mengatakan "parsing teks mentah" yang Anda maksud benar-benar masuk ke file atau menggunakan parser python?
SAAD
Pada saat itu, saya bermaksud menulis parser Python dengan tangan.
Geoff Oxberry

Jawaban:

15

Cara termudah yang saya temukan untuk mengurangi dua bidang dari file VTK yang berbeda dengan grid terstruktur yang sama adalah dengan menggunakan filter yang dapat diprogram di Paraview, yang memungkinkan Anda memanipulasi data menggunakan skrip Python.

Di kotak dialog filter yang dapat diprogram, Anda dapat mengurangi dua array dan menulis ke output dengan kode:

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

Dalam hal ini, bidang Phi adalah data sel. Jika bidang Anda adalah data titik, ganti CellDatadengan skrip mana saja PointData. Lihat http://public.kitware.com/pipermail/paraview/2010-April/016667.html untuk rincian lebih lanjut.

Geoff Oxberry
sumber
4
Tidak pernah terlalu banyak untuk mengingatkan bahwa untuk memiliki dua input (input [0] dan input [1]), seseorang harus menyoroti kedua set data sebelum memilih Filter yang Dapat Diprogram (ini disebut salah satu tautan yang dirujuk).
toliveira
3

Di ParaView ada filter Tambah atribut yang dapat digunakan untuk ini. Ini membutuhkan jumlah titik yang sama dalam kumpulan data untuk menambahkan data titik dengan benar dan jumlah sel yang sama dalam kumpulan data untuk menambahkan data sel dengan benar. Ini akan memiliki masalah dengan array dengan nama yang sama (yaitu Phi dalam contoh Anda). Anda dapat menyalin array itu dengan mudah menggunakan filter Kalkulator sebelum menggunakan filter Tambah atribut. Kemudian Anda dapat menggunakan filter Kalkulator lain untuk melakukan pengurangan. Ini mungkin kurang efisien daripada menggunakan filter Python yang diprogram ParaView. Selain itu, Anda bisa menggunakan vtkpython yang dapat dieksekusi untuk melakukannya secara manual karena Anda akan memiliki akses langsung ke kedua kisi dan atributnya.

andybauer
sumber
1

Saya tidak memiliki pendekatan yang sangat bagus, tapi saya akan menyalin bidang 'phi' dari satu file VTK ke yang lain dan beri nama 'phiprime' atau sesuatu. Dalam Paraview dan Kunjungan, Anda memiliki opsi untuk menentukan bidang baru dengan rumus yang menggunakan nilai bidang lainnya. Anda kemudian dapat mendefinisikan "kesalahan" bidang sebagai "kesalahan = phi-phiprime" di editor bidang, dan plot "kesalahan" bidang ini sebagai permukaan, plot kontur, atau apa pun yang Anda tertarik.

Langkah menyalin blok data dari satu file ke yang lain jelas canggung, tapi itu yang terbaik yang bisa saya lakukan.

Wolfgang Bangerth
sumber
1

Saya menyadari ini sedikit lebih tua, tetapi saya pikir Anda mungkin tertarik dengan solusi VisIt:

Anda dapat melakukan ini di VisIt dengan sesuatu yang disebut Ekspresi Bidang Cross Mesh Berbasis Konektif. Itu adalah suap, tetapi pada dasarnya adalah mesin untuk memetakan bidang antara database (dalam kasus Anda file VTK).

"Konektivitas berbasis" (conn_cmfe) digunakan ketika topologi sama antara file - seperti dalam kasus Anda.

Ada juga "Posisi berbasis" (pos_cmfe) yang sampel antara jerat dengan topologi yang berbeda.

Untuk kasus Anda, buka file pertama & gunakan jendela Ekspresi untuk menentukan ekspresi (MyPhi_Diff):

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

Kemudian Anda dapat memplot "MyPhi_Diff" dengan plot Pseudocolor.

Ada juga wizard yang bisa Anda gunakan untuk membantu mendefinisikan ekspresi

(Menu Opsi -> "Perbandingan Tingkat Data")

Berikut ini beberapa info lebih lanjut:

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

Cyrus
sumber