.. meta:: :keywords: maillage, champ, manipulation, med :author: Guillaume Boulant .. include:: medcalc-definitions.rst %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Module MED: Spécifications fonctionnelles et techniques %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Ce texte présente les spécifications informatiques pour le développement d'un module de manipulation de champs qui répond à l'expression de besoins formulée dans le cahier des charges |REF_EDF_VCA_H-I2C-2009-03595-FR|_. .. contents:: Sommaire :local: :backlinks: none Description des cas d'application de référence ============================================== Plusieurs cas d'applications métier sont identifiés pour piloter le développement du module de manipulation de champs: * **Analyser et post-traiter le résultat d'un calcul**. C'est l'usage principal qui consiste typiquement à créer des champs comme le résultat d'*opérations mathématiques* dont les opérandes sont des champs et des scalaires. On compte également dans cette catégorie les *opérations de restriction* qui permettent d'extraire puis utiliser une partie d'un champs, c'est-à-dire de créer un champ comme la restriction d'un autre champ à une partie de son domaine de définition (certaines composantes, certains pas de temps, limitation à un groupe de mailles). * **Comparer des champs issus d'un calcul paramétrique**. Il s'agit d'une variante du cas précédent qui consiste à mesurer et visualiser les variations entre des champs issues de sources de données différentes (différents fichiers med). * **Préparer les conditions aux limites d'une calcul**. Il s'agit de pouvoir initialiser un champ sur un maillage ou un groupe de mailles, c'est-à-dire créer un champ de toute pièce sur un support spatial donné, par exemple par la donnée d'une fonction mathématique qui donne les valeurs des composantes en fonction des coordonnées spatiales. * **Gérer des données de calcul**. Il s'agit typiquement de pouvoir rassembler au sein d'un même fichier med des champs et des maillages issues de différentes sources de données, et/ou créés au travers des cas d'application présentés ci-dessus. Modèle conceptuel des données ============================= On rappelle ici les concepts utilisés dans le module et les modalités d'utilisation de ces concepts. Le point de vue est celui de l'utilisateur du module de manipulation de champs. Il s'agit essentiellement pour le moment d'éclaircir l'ergonomie d'usage sur le plan conceptuel, avant d'aborder la déclinaison en spécifications techniques pour lesquelles les particularités du modèle MED devront être intégrées à la réflexion. Concept de champ ---------------- Le concept central est celui de *champ*, c'est-à-dire une grandeur physique exprimée sur un domaine spatial D. La grandeur peut être de type scalaire (une température), de type vectorielle (une vitesse) ou de type tensorielle (les contraintes). En un point de l'espace, elle se définie donc par la donnée d'une ou plusieurs valeurs numériques appelées les *composantes* (1 pour un champ scalaire, 3 pour un champ vectoriel 3D, 6 pour un champ tensoriel symétrique 3D). .. note:: Une pratique courante au niveau des codes est de stocker plusieurs grandeurs physiques différentes dans un même champs med (au sens informatique du terme). Par exemple, le champ électromagnétique à 6 composantes, plus le champ de température scalaire peuvent techniquement être stockés dans un même champs med à 7 composantes. C'est pourquoi, le module de manipulation de champs doit fournir des fonctions de restrictions qui permettent d'extraire certaines composantes pour former la grandeur physique à étudier. Dans la suite du document, on part du principe que l'on peut se ramener dans tous les cas au cas d'un champ homogène tel que défini plus haut. Dans le cadre d'un modèle numérique discret, les valeurs du champ sont exprimées pour un nombre fini de positions, qui correspondent à des lieux particuliers du maillage. Suivant la nature des modèles de calcul, les valeurs peuvent être données par cellule, par face, par noeud, aux points de gauss, ... Ainsi, un champ discret est un objet dont les valeurs peuvent être lues selon les dimensions suivantes: * *La position p dans l'espace*, caractérisée par le type de l'élément de maillage support et son numéro identifiant * *La composante c*, caractérisée par son indice (jusqu'à 6 composantes dans les modèles physiques envisagés) L'évolution d'un champ dans le temps peut être exprimée sous la forme d'une série temporelle, c'est-à-dire une séquence de champs donnés pour des instants discrets. Aussi, si l'on manipule un champ qui varie dans le temps, l'accès aux valeurs introduit une dimension supplémentaire: * *Le temps t*, caractérisé par un numéro de pas de temps (correspondant en général à une étape du calcul qui a produit le champ). .. note:: Il s'agit là d'une représentation conceptuelle standard dont le |LINK_EDF_MEDDOC|_ fait une expression détaillée. En particulier, la position p est déterminée par la donnée du type d'élément support (valeurs aux noeuds, aux mailles, aux noeuds par éléments, aux points de gauss) et de l'indice de cet élément. En général, le type d'éléments support est résolu à l'initialisation et l'indice peut suffire au repérage dans les algorithmes. Le temps t est déterminé par un numéro d'itération, qui peut éventuellement être complété par un numéro d'ordre. Le cas des points de gauss ajoute un cran de complexité dans la mesure où il faut repérer l'entité géométrique (maille, face, arrête) puis le point de gauss de cette entité. A noter que dans le modèle MED, le concept de série temporelle de champ n'est pas explicitement définie et l'accès à des valeurs à différents instants t1 et t2 nécessite le chargement des champs ``F1=F(t1)`` et ``F2=F(t2)``. Par convention, on utilisera par la suite les notations: * **U(t,p,c)** pour désigner la valeur de la composante c d'un champ U à la position p et prise à l'instant t; * **U(t,p,:)** pour signifier que l'on manipule l'ensemble de toutes les composantes; * **U(t,:,c)** pour signifier que l'on manipule le domaine de définition spatial complet. Dans une grande majorité des cas d'usage on travaille à temps t fixé et sur un domaine spatiale prédéfini. Aussi on utilisera également la notation à deux arguments ``U(:,:)`` ou tout simplement ``U`` (dès lors qu'il n'y a pas ambiguïté) pour désigner un champ complet et Uc pour désigner la composante c du champ avec c=1..6. Concept d'opération ------------------- Le deuxième concept à préciser est la notion d'*opération*. Une opération dans le présent contexte est l'application d'un opérateur sur un ou plusieurs champs pour produire une grandeur de type champ ou de type valeur numérique. Par exemple, la formule ``W=OP(U,V)`` indique que le champ W est formé à partir des champs U et V en arguments d'une fonction OP. Dans le cas d'une opération algébrique comme l'addition (cf. :ref:`Spécification des opérations`, le résultat attendu par défaut est que pour chaque instant t, chaque position p et chaque composante c, on a ``W(t,p,c)=U(t,p,c)+V(t,p,c)`` (que l'on peut noter également ``W(:,:,:)=U(:,:,:)+V(:,:,:)`` compte-tenu de la convention présentée plus haut). Ce n'est cependant pas une règle et l'utilisateur peut très bien manoeuvrer les champs en détaillant et mixant les composantes (par exemple ``W(:,:,3)=5+U(:,:,1)*V(:,:,2)``), ou encore ne travailler que sur un domaine spatial et/ou temporel particulier (cf. |REF_EDF_VCA_H-I2C-2009-03595-FR|_ §5.4.1). On formalise donc le concept d'opération par les propriétés suivantes: * L'opérateur peut produire un champ (par exemple la somme de deux champs W=sum(U,V)=U+V), une valeur numérique (par exemple la moyenne spatiale d'un champ m=smoy(U)) ou une valeur logique (par exemple le test d'égalité de deux champs b=isequal(U,V)); * L'opérateur peut être paramétré par la donnée de valeurs numériques (par exemple, le changement d'unité peut être défini comme une multiplication par un scalaire V=multiply(U,1000)=1000*U); * L'opérateur est caractérisé par un domaine d'application qui spécifie la portée de l'opération. Ce domaine comporte plusieurs dimensions: - Un domaine temporel T qui spécifie les pas de temps sur lesquels l'opération est appliquée; - Un domaine spatial D qui spécifie la limite de portée de l'opérateur et donc le domaine de définition du champ produit (qui correspond dans ce cas à une restriction du domaine de définition des champs en argument); - Un domaine de composantes C qui spécifie les composantes sur lesquelles l'opération est appliquée; .. note:: Sur le plan informatique, l'opérateur aura également un paramètre appelé *option* qui pourra indiquer par exemple dans une opération unaire V=F(U) si le résultat V est une nouvelle instance de champ ou la valeur modifiée du champ de départ U. Il pourra également être amené à manoeuvrer des paramètres de type chaîne de caractères, par exemple pour les opérations de changement de nom des champs. De manière générale, on utilisera la notation **(W|y)=OP[D,C,T](P,U,V,...)** pour désigner une opération OP: * **(V|y)**: V ou y désignent respectivement un résultat de type champ ou de type valeur numérique ou logique; * **[T,D,C]**: le domaine d'application de l'opérateur avec T le domaine temporel, D le domaine spatial et C le domaine des composantes; * **P,U,V,...**: les paramètres numériques P (liste de valeurs numériques) et les champs U,V,... en arguments de l'opérateur; On note également les particularités suivantes pour certaines opérations: * Le domaine de définition du champ produit par une opération peut être différent du domaine de définition des champs en argument. Par exemple, dans le cas d'une opération de projection de champ, le domaine spatial résultat peut être modifié par rapport au domaine de définition initial, soit par la modification de la zone géométrique, soit par modification des entités de maillage support. * En dehors des opérations de type dérivée et intégrale, les valeurs résultats sont déterminées de manière locale en chaque point du domaine d'application. Par exemple, l'addition W=U+V consiste à produire un champ W dont les valeurs en chaque point p sont la somme des valeurs des composantes de U et V en ce point p: ``W=U+V <=> W(:,p,:)=U(:,p,:)+V(:,p,:)`` pour tout point p du domaine d'application D. Concept de domaine d'application -------------------------------- Un domaine d'application est associé à une opération (et non pas à un champ). Il a pour objectif de restreindre la portée de l'opération en terme spatial, temporel, jeu des composantes. Pour ce qui concerne le domaine spatial D, plusieurs modalités de définition sont envisagées: * la donnée d'un maillage ou d'un groupe d'éléments du maillage; * un système de filtres qui peut combiner: - une zone géométrique définie indépendamment du maillage (boîte limite par exemple), - des critères conditionnant le calcul (par exemple U(t,p,c)=1 si V(t,p,c)>> r=fa+fb * Effectuer les contrôles visuel et les diagnostics en ligne de commandes python (cf. :ref:`Spécification des fonctions de visualisation`):: >>> view(r) * Enregistrer les champs produits dans l'espace de travail sous forme de fichier med. Sur cette base, on peut envisager une grande variété de cas d'utilisation: * La structure MED (champs, maillage et groupes de mailles) est chargée dans le dataspace (l'étude SALOME techniquement) et peut être explorée au niveau de l'arbre d'étude. L'arbre peut faire apparaître: - les maillages et les groupes (qui peuvent être utilisés éventuellement pour restreindre le domaine d'application) - les champs dont on peut explorer les composantes et les itérations * On sélectionne plusieurs champs, éventuellement en sélectionnant les pas de temps, les composantes et les domaines d'application spatiaux * Menu contextuel --> Modifier un champ, Créer un champ, Prolonger un champ, .... * On choisi pour la suite "Créer un champ", une fenêtre de dialogue s'affiche avec les saisies préremplies avec les données sélectionnées. Il est possible de rajouter des éléments ou préciser le domaine d'application * Une partie de la boîte de dialogue est réservée à la saisie de la ligne de commande python qui permet la création du nouveau champ. Le nom dans l'étude pour le nouveau champ, ainsi que son nom python, sont spécifié par l'utilisateur ({{H|un peu à la mode du module system}}). * L'opération est exécutée dans l'espace utilisateur (l'interface python), de sorte que les variables soient projetées dans cet espace et manipulables après l'opération au besoin. Par ailleurs, l'utilisateur peut visualiser les ligne de commandes nécessaires à taper pour exécuter sa requête. .. _specification_visualisation: Spécification des fonctions de visualisation ============================================ Dans le cadre du module MED, on appelle *fonction de visualisation* une fonction qui permet d'avoir un aperçu graphique d'un champ, par exemple au moyen d'une carte de champ construite sur une de ses composante. Il s'agit là de vue de contrôle pour avoir une idée rapide de la forme du champs. Pour créer des représentations spécifiques, on préférera passer par les fonctions d'export vers le module PARAVIS. Les modules VISU et PARAVIS offre des interface de programmation C++ et python qui permettent le pilotage depuis un module tiers comme le module MED. On peut donc envisager une fonction de visualisation intégrée au module de manipulation de champs, c'est-à-dire que l'on déclenche sans sortir du module MED, et qui exploite les fonctions de visualisation des modules VISU et/ou PARAVIS. Les captures d'écran ci-dessous illustrent la mise en oeuvre de la fonction de visualisation: * Sélection d'un champ pour faire apparaitre le menu contextuel et choisir l'option "Visualize": .. image:: images/xmed-gui-datasource-visualize_70pc.png :align: center * Cette option déclenche l'affichage d'une carte de champ sur le cadre d'affichage des viewers SALOME: .. image:: images/xmed-gui-datasource-visualize-result_70pc.png :align: center Cette fonction est également disponible en ligne de commandes de l'interface textuelle. Par exemple si ``f4`` désigne un champ de l'espace de travail (importé des données source ou construit par les opérations de champs), alors, on obtient une carte de champ par la commande:: >>> view(f4) On peut remarquer d'ailleurs sur la capture d'écran de droite ci-dessus que la demande de visualisation déclenche l'exécution de la commande ``view`` dans la console de travail sur un champ identifié par son numéro (3 dans l'exemple). .. note:: Tous les champs, qu'ils soient des champs chargés d'une source de données ou construits par des opérations de champs sont identifiés par un numéro unique et invariant tout au long de la session de travail. Spécification des fonctions de persistance ========================================== On adopte le principe de fonctionnement suivant: * Le module n’assure pas la persistence au sens SALOME du terme, c’est-à-dire qu’il ne permet pas la sauvegarde du travail dans une étude au format hdf, ni le dump sous la forme de script python SALOME. Le besoin n'est pas avéré et on peut même dire que ça n'a pas de sens compte-tenu de l'usage envisagé pour le module MED. * Par contre, le module fournit des fonctions de sauvegarde du travail sous forme de fichiers med, l’export vers les modules VISU et PARAVIZ, ou même la sauvegarde de l’historique de l’interface de commandes. Ainsi donc, l'utilisateur aura une fonction (probablement graphique) pour définir la sélection des champs de l'espace de travail à sauvegarder. Spécification des fonctions d'export ==================================== .. warning:: EN TRAVAUX. Plusieurs export peuvent être proposés: * Export des champs vers le module PARAVIZ, dans l'objectif par exemple d'en faire une analyse visuelle plus poussée qu'avec les cartes de champs disponibles par défaut dans le module MED * Export des données sous forme de tableau numpy, par exemple pour permettre un travail algorithmique sur les valeurs des champs. Spécifications techniques ========================= Il s'agit d'exprimer ici les contraintes techniques applicables à la conception et au développement du nouveau module MED. Implantation technique du module -------------------------------- Il est convenu que le module MED existant dans la plate-forme SALOME incarne le module de manipulation de champ. Dans la pratique, il s'agit d'identifier clairement les parties à conserver, d'une part, puis les parties à re-écrire, d'autre part. On peut partir sur les hypothèses techniques suivantes: * Le noyau du module en charge des opérations de manipulation de champs proprement dites est construit sur la base des paquets logiciels MEDCoupling (lui-même basé sur le INTERP_KERNEL) et MEDLoader. * L'interface graphique du module MED est complétement re-écrite et remplacée par une interface adaptée spécialement à la manipulation des champs et la gestion des données associées * Le contrôle visuel pourra être déclenché dans les visualisateurs SALOME (servis par les modules VISU et/ou PARAVIZ); * Le module n'assure pas la persistence au sens SALOME du terme, c'est-à-dire qu'il ne permet pas la sauvegarde du travail dans une étude au format hdf, ni le dump sous la forme de script python SALOME. * Par contre, il fournit des fonctions de sauvegarde du travail sous forme de fichiers med, l'export vers les modules VISU et PARAVIZ, ou même la sauvegarde de l'historique de l'interface de commandes. L'implantation technique des développements est représentée sur la figure ci-dessous: .. image:: images/xmed-implantation.png :align: center Le schéma représente les packages logiciels qui composent le module MED (cf. |REF_CEA_VBE_MEDMEM|_): * La partie MEDMEM, représentées en blanc. Cette partie est conservée pour compatibilité ascendante au niveau des applications métier qui ont fait le choix historique de s'appuyer sur MEDMEM. Cette partie du module MED aura tendance à disparaitre dans le futur au bénéfice de MEDCoupling et MEDLoader. * La partie MEDCoupling, représentée en orange et qui founrnit le modèle MED mémoire de référence (composé de maillage et de champs) et l'interface de programmation pour manipuler le modèle. Le paquet MEDLoader est une extention dédiée à la persistence au format med fichier (lecture et écriture de champs et de maillage dans des fichiers med). * La partie à développer pour la manipulation de champ, représentée en bleu. .. note:: MEDCoupling peut être vu comme une structure de donnée particulièrement adaptée à la manipulation des gros volumes de données, en particulier par l'exploitation des possibilités de parallélisation et la réduction de la tailles des structures de données. En contrepartie, elle peut présenter un périmètre fonctionnel moins large que MEDMEM. Pour cette raison, MEDMEM avait été choisi comme socle de développement du prototype en 2010: * MEDCoupling ne permet pas de gérer des maillages composés de plusieurs type de mailles et il est exclus de le faire évoluer dans ce sens (c'est un choix fait pour les objectifs de performances évoqués plus haut); * MEDCoupling ne permet pas de gérer les supports qui expriment les champs aux noeuds par élément ni aux points de gauss. Cette seconde limitation a disparu en 2011. Aujourd'hui, on fait clairement le choix de MEDCoupling pour sa qualité et sa robustesse, dans l'objectif d'une meilleure maintenance à long terme. Par ailleurs, les différences fonctionnelles avec MEDMEM, si elles existaient encore en 2012 pour les besoins de la manipulation de champs, pourront être résorbées dans un futur proche.