Come calcolo la differenza numerica tra due campi memorizzati in due diversi file VTK con la stessa struttura?


14

Supponiamo che io abbia due file VTK, entrambi in formato griglia strutturato. Le griglie strutturate sono le stesse (hanno lo stesso elenco di punti, nello stesso ordine) e c'è un campo, chiamalo "Phi", in ogni file VTK. Voglio creare un terzo file VTK, sempre con la stessa griglia strutturata, e tracciare un campo che è la differenza tra Phi nel primo file VTK e Phi nel secondo file VTK.

So come farlo manualmente; Posso analizzare il testo non elaborato nei due file VTK, copiare i dati in array, sottrarre un array dall'altro e quindi scaricare i dati nel formato corretto in un nuovo file. Esiste un modo migliore per calcolare questa differenza ed esportarla in VTK? Una soluzione in Python o in software di visualizzazione come VisIt o Paraview sarebbe preferibile all'uso di un linguaggio compilato come C ++.

Lo scopo di calcolare questa differenza è di confrontare diversi metodi numerici per il calcolo della soluzione di un PDE; dal momento che sto usando lo stesso software per generare le soluzioni, posso garantire che tutti i dati tranne il campo Phi saranno gli stessi in ogni file che genererò.


Ho pubblicato questa domanda perché mi ci è voluto circa un giorno e mezzo per capire la risposta; se non l'avessi trovata ieri, avrei comunque posto questa domanda qui. Sono interessato a vedere se ci sono altri modi rapidi per svolgere lo stesso compito.
Geoff Oxberry,

Quando dici "analizza il testo non elaborato" intendi letteralmente andare nel file o usare un parser Python?
SAAD

All'epoca intendevo scrivere a mano un parser Python.
Geoff Oxberry,

Risposte:


15

Il modo più semplice che ho trovato per sottrarre due campi da diversi file VTK con la stessa griglia strutturata è utilizzare un filtro programmabile in Paraview, che consente di manipolare i dati utilizzando gli script Python.

Nella finestra di dialogo del filtro programmabile, è possibile sottrarre i due array e scrivere sull'output con il codice:

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

In questo caso, il campo Phi sembra essere un dato di cella. Se il campo contiene dati puntuali, sostituiscilo CellDataovunque con lo script PointData. Vedere http://public.kitware.com/pipermail/paraview/2010-April/016667.html per ulteriori dettagli.


4
Non è mai troppo ricordare che per avere due ingressi (ingressi [0] e ingressi [1]), è necessario evidenziare entrambi i set di dati prima di selezionare il Filtro programmabile (questo è citato come il collegamento indicato).
Toliveira,

3

In ParaView è presente il filtro Aggiungi attributi che può essere utilizzato per questo. Richiede che lo stesso numero di punti nel set di dati per aggiungere correttamente i dati dei punti e lo stesso numero di celle nel set di dati per aggiungere correttamente i dati delle celle. Avrà problemi anche se con array con lo stesso nome (cioè Phi nel tuo esempio). Tuttavia, è possibile copiare facilmente tale array con il filtro Calcolatrice prima di utilizzare il filtro Aggiungi attributi. Quindi è possibile utilizzare un altro filtro Calcolatrice per eseguire la sottrazione. Questo è probabilmente meno efficiente rispetto all'utilizzo del filtro programmabile Python di ParaView. Oltre a ciò, puoi usare l'eseguibile vtkpython per farlo manualmente poiché avresti accesso diretto sia alle griglie che ai loro attributi.


1

Non ho un approccio particolarmente valido, ma copierei il campo "phi" da un file VTK all'altro e lo chiamerei "phiprime" o qualcosa del genere. In Paraview e Visita, hai la possibilità di definire nuovi campi con una formula che utilizza i valori di altri campi. È quindi possibile definire un campo "errore" come "errore = phi-phiprime" nell'editor di campo e tracciare questo campo "errore" come una superficie, un diagramma di contorno o qualsiasi cosa ti interessi.

Il passaggio della copia del blocco di dati da un file all'altro è chiaramente imbarazzante, ma è il migliore che posso inventare.


1

Ho capito che questo è un po 'più vecchio, ma ho pensato che potresti essere interessato alla soluzione VisIt:

Puoi farlo in VisIt con qualcosa chiamato Espressione di campo a maglie incrociate basata su connessione. Questo è un boccone, ma fondamentalmente è un meccanismo per mappare i campi tra i database (nel tuo caso i file VTK).

"Connettività basata" (conn_cmfe) viene utilizzato quando la topologia è la stessa tra i file, come nel tuo caso.

Esiste anche un "Position based" (pos_cmfe) che campiona tra mesh con topologie diverse.

Nel tuo caso, apri il primo file e usa la finestra Espressioni per definire un'espressione (MyPhi_Diff):

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

Quindi puoi tracciare "MyPhi_Diff" con un diagramma Pseudocolor.

C'è anche una procedura guidata che puoi usare per aiutare a definire l'espressione

(Menu Opzioni -> "Confronti livello dati")

Ecco qualche informazione in più:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.