Aynı yapıya sahip iki farklı VTK dosyasında depolanan iki alan arasındaki sayısal farkı nasıl hesaplayabilirim?


15

Her ikisi de yapılandırılmış ızgara biçiminde iki VTK dosyam olduğunu varsayalım. Yapısal ızgaralar aynıdır (aynı sırayla aynı nokta listesine sahiptirler) ve her VTK dosyasında "Phi" olarak adlandırılan bir alan vardır. Yine aynı yapılandırılmış ızgara ile üçüncü bir VTK dosyası oluşturmak ve ilk VTK dosyasındaki Phi ile ikinci VTK dosyasındaki Phi arasındaki fark olan bir alan çizmek istiyorum.

Bunu manuel olarak nasıl yapacağımı biliyorum; İki VTK dosyasındaki ham metni ayrıştırabilir, verileri dizilere kopyalayabilir, bir diziyi diğerinden çıkarabilir ve sonra doğru biçimde yeni bir dosyaya veri dökebilirim. Bu farkı hesaplamanın ve VTK'ya aktarmanın daha iyi bir yolu var mı? Python'da veya VisIt veya Paraview gibi görselleştirme yazılımlarında bir çözüm, C ++ gibi derlenmiş bir dil kullanmak için tercih edilir.

Bu farkı hesaplamanın amacı, bir PDE'nin çözümünü hesaplamak için farklı sayısal yöntemleri karşılaştırmaktır; çözümleri oluşturmak için aynı yazılımı kullandığım için, Phi alanı dışındaki tüm verilerin oluşturduğum her dosyada aynı olacağını garanti edebilirim.


Bu soruyu gönderdim çünkü cevabı bulmam bir buçuk günümü aldı; dün bulamamış olsaydım, yine de burada bu soruyu sorardım. Aynı görevi yerine getirmenin başka hızlı yolları olup olmadığını görmekle ilgileniyorum.
Geoff Oxberry

"Ham metni ayrıştır" dediğinizde, kelimenin tam anlamıyla dosyaya mı giriyorsunuz yoksa bir python ayrıştırıcı mı kullanıyorsunuz?
SAAD

O zaman, elle bir Python ayrıştırıcısı yazmak istedim.
Geoff Oxberry

Yanıtlar:


16

Aynı yapılandırılmış ızgaraya sahip farklı VTK dosyalarından iki alanı çıkarmanın en kolay yolu Paraview'de Python komut dosyalarını kullanarak verileri değiştirmenize izin veren programlanabilir bir filtre kullanmaktır.

Programlanabilir filtre iletişim kutusunda, iki diziyi çıkarabilir ve kodla çıktıya yazabilirsiniz:

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

Bu durumda, Phi alanı hücre verisi olur. Alanınız nokta verileriyse, CellDatakomut dosyasının her yerini değiştirin PointData. Daha fazla bilgi için http://public.kitware.com/pipermail/paraview/2010-April/016667.html adresine bakın.


4
İki girişe (girişler [0] ve girişler [1]) sahip olduğunu hatırlatmak asla çok fazla değildir, Programlanabilir Filtreyi seçmeden önce her iki veri setini de vurgulamak gerekir (bu, atıf yapılan bağlantıdan bahsedilir).
toliveira

3

ParaView'da bunun için kullanılabilen Nitelikleri Ekle filtresi vardır. Nokta verilerinin düzgün bir şekilde eklenmesi için veri kümesinde aynı sayıda noktanın ve hücre verilerinin düzgün bir şekilde eklenmesi için veri kümesinde aynı sayıda noktanın bulunmasını gerektirir. Aynı ada sahip dizilerle ilgili sorunlar yaşayacaktır (örneğin, örneğinizdeki Phi). Öznitelik Ekle filtresini kullanmadan önce bu diziyi Hesap Makinesi filtresiyle kolayca kopyalayabilirsiniz. Sonra çıkarma yapmak için başka bir Hesap Makinesi filtresi kullanabilirsiniz. Bu muhtemelen ParaView'in Python programlanabilir filtresini kullanmaktan daha az verimlidir. Bunun yanı sıra, hem ızgaralara hem de özniteliklerine doğrudan erişiminiz olacağından, vtkpython yürütülebilir dosyasını elle yapmak için kullanabilirsiniz.


1

Özellikle iyi bir yaklaşımım yok, ama 'phi' alanını bir VTK dosyasından diğerine kopyalar ve buna 'phiprime' falan adını veririm. Hem Paraview hem de Visit öğelerinde, yeni alanları diğer alanların değerlerini kullanan bir formülle tanımlama seçeneğiniz vardır. Daha sonra bir alan "hatası" nı alan düzenleyicide "hata = phi-phiprime" olarak tanımlayabilir ve bu alan "hatasını" bir yüzey, kontur çizimi veya ilgilendiğiniz şey olarak çizebilirsiniz.

Veri bloğunu bir dosyadan diğerine kopyalama adımı açıkça gariptir, ancak gelebileceğim en iyisi.


1

Bunun biraz daha eski olduğunu fark ettim, ancak VisIt çözümüyle ilgileniyor olabilirsiniz:

Bunu VisIt'de Bağlayıcı Tabanlı Çapraz Mesh Alanı İfadesi denilen bir şeyle yapabilirsiniz. Bu bir ağız dolusu, ancak temelde veritabanları arasındaki alanları eşleştirmek için kullanılan bir makinedir (sizin durumunuzda VTK dosyalarınız).

"Bağlantı tabanlı" (conn_cmfe), topoloji dosyalar arasında olduğu gibi - durumunuzda olduğu gibi kullanılır.

Farklı topolojilere sahip ağlar arasında örnek oluşturan bir "Konum tabanlı" (pos_cmfe) vardır.

Durumunuz için ilk dosyayı açın ve bir ifade (MyPhi_Diff) tanımlamak için İfadeler penceresini kullanın:

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

Sonra "MyPhi_Diff" Pseudocolor çizim ile çizim yapabilirsiniz.

İfadeyi tanımlamak için kullanabileceğiniz bir sihirbaz da vardır

(Seçenekler Menüsü -> "Veri Seviyesi Karşılaştırmaları")

İşte biraz daha bilgi:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.