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.
la source
Réponses:
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:
Dans ce cas, le champ Phi se trouve être des données de cellule. Si votre champ est des données ponctuelles, remplacez-les
CellData
partout dans le script parPointData
. Voir http://public.kitware.com/pipermail/paraview/2010-April/016667.html pour plus de détails.la source
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.
la source
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.
la source
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):
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
la source