Comment calculer la différence numérique entre deux champs stockés dans deux fichiers VTK différents avec la même structure?


14

Supposons que j'ai deux fichiers VTK, tous deux au format de grille structurée. Les grilles structurées sont les mêmes (elles ont la même liste de points, dans le même ordre), et il y a un champ, appelez-le "Phi", dans chaque fichier VTK. Je veux créer un troisième fichier VTK, toujours avec la même grille structurée, et tracer un champ qui fait la différence entre Phi dans le premier fichier VTK et Phi dans le deuxième fichier VTK.

Je sais comment faire cela manuellement; Je peux analyser le texte brut dans les deux fichiers VTK, copier les données dans des tableaux, soustraire un tableau de l'autre, puis vider les données au bon format dans un nouveau fichier. Existe-t-il un meilleur moyen de calculer cette différence et de l'exporter vers VTK? Une solution en Python ou dans un logiciel de visualisation comme VisIt ou Paraview serait préférable à l'utilisation d'un langage compilé comme C ++.

Le calcul de cette différence a pour but de comparer différentes méthodes numériques de calcul de la solution d'un PDE; puisque j'utilise le même logiciel pour générer les solutions, je peux garantir que toutes les données sauf le champ Phi seront les mêmes dans chaque fichier que je génère.


J'ai posté cette question parce qu'il m'a fallu environ un jour et demi pour trouver la réponse; si je ne l'avais pas trouvé hier, j'aurais quand même posé cette question ici. J'aimerais savoir s'il existe d'autres moyens rapides d'accomplir la même tâche.
Geoff Oxberry

Lorsque vous dites "analyser le texte brut", vous voulez dire littéralement aller dans le fichier ou utiliser un analyseur python?
SAAD

À l'époque, je voulais écrire un analyseur Python à la main.
Geoff Oxberry

Réponses:


15

La manière la plus simple que j'ai pu trouver pour soustraire deux champs de différents fichiers VTK avec la même grille structurée est d'utiliser un filtre programmable dans Paraview, qui vous permet de manipuler des données à l'aide de scripts Python.

Dans la boîte de dialogue de filtre programmable, vous pouvez soustraire les deux tableaux et écrire sur la sortie avec le code:

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

Dans ce cas, le champ Phi se trouve être des données de cellule. Si votre champ est des données ponctuelles, remplacez-les CellDatapartout dans le script par PointData. Voir http://public.kitware.com/pipermail/paraview/2010-April/016667.html pour plus de détails.


4
Il n'est jamais trop de rappeler que pour avoir deux entrées (entrées [0] et entrées [1]), il faut mettre en surbrillance les deux ensembles de données avant de sélectionner le filtre programmable (ceci est mentionné sur le lien référencé).
toliveira

3

Dans ParaView, il y a le filtre Append Attributes qui peut être utilisé pour cela. Cela nécessite que le même nombre de points soit dans l'ensemble de données pour ajouter correctement les données de point et que le même nombre de cellules soit dans l'ensemble de données pour ajouter correctement les données de cellule. Il aura cependant des problèmes avec les tableaux du même nom (c'est-à-dire Phi dans votre exemple). Vous pouvez copier ce tableau facilement avec le filtre Calculatrice avant d'utiliser le filtre Ajouter des attributs. Ensuite, vous pouvez utiliser un autre filtre de calculatrice pour effectuer la soustraction. C'est probablement moins efficace que d'utiliser le filtre programmable Python de ParaView. En plus de cela, vous pouvez utiliser l'exécutable vtkpython pour le faire manuellement car vous auriez un accès direct aux grilles et à leurs attributs.


1

Je n'ai pas une approche particulièrement bonne, mais je copierais le champ 'phi' d'un fichier VTK dans l'autre et le nommerais 'phiprime' ou quelque chose. Dans Paraview et Visit, vous avez la possibilité de définir de nouveaux champs par une formule qui utilise les valeurs des autres champs. Vous pouvez ensuite définir un champ "error" comme "error = phi-phiprime" dans l'éditeur de champs, et tracer ce champ "error" comme une surface, un tracé de contour ou tout ce qui vous intéresse.

L'étape de copie du bloc de données d'un fichier à l'autre est clairement maladroite, mais c'est la meilleure que je puisse trouver.


1

J'ai réalisé que c'était un peu plus ancien, mais je pensais que vous pourriez être intéressé par la solution VisIt:

Vous pouvez le faire dans VisIt avec quelque chose appelé une expression de champ de maillage croisé basé sur la connexion. C'est une bouchée, mais c'est essentiellement une machine à mapper les champs entre les bases de données (dans votre cas, les fichiers VTK).

Le "basé sur la connectivité" (conn_cmfe) est utilisé lorsque la topologie est la même entre les fichiers - comme dans votre cas.

Il existe également un "Position based" (pos_cmfe) qui échantillonne entre les maillages avec différentes topologies.

Pour votre cas, ouvrez le premier fichier et utilisez la fenêtre Expressions pour définir une expression (MyPhi_Diff):

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

Ensuite, vous pouvez tracer "MyPhi_Diff" avec un tracé Pseudocolor.

Il existe également un assistant que vous pouvez utiliser pour aider à définir l'expression

(Menu Options -> "Comparaisons de niveau de données")

Voici quelques informations supplémentaires:

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.