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 H-I2C-2009-03595-FR: Manipulation de champs dans SALOME - Orientations générales.
Sommaire
Plusieurs cas d’applications métier sont identifiés pour piloter le développement du module de manipulation de champs:
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.
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:
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:
Note
Il s’agit là d’une représentation conceptuelle standard dont le Modèle MED 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:
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.
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. 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. H-I2C-2009-03595-FR: Manipulation de champs dans SALOME - Orientations générales §5.4.1).
On formalise donc le concept d’opération par les propriétés suivantes:
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:
On note également les particularités suivantes pour certaines opérations:
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:
Avertissement
Version 2010: D pourra correspondre au maillage complet et dans la mesure du possible à un groupe d’éléments du maillage
Ce domaine d’application peut être différent du domaine de définition des champs mais il doit être compatible (recouvrement spatial partiel au moins et même support d’entité de maillage). Ainsi, sans précision particulière, une opération s’applique à l’ensemble du domaine de définition des champs en argument (qui dans la pratique MED est spécifié par le support et correspond en général au maillage complet).
Plusieurs situations doivent être examinées pour poser les limites d’utilisation:
Avertissement
A faire: spécifier les modalités de prise en compte de ces différentes situations (au moins sur le plan conceptuel).
Au delà de ces limites conceptuelles, il faut avoir en tête les limites techniques liées à l’usage de MED mémoire (paquet MEDCoupling). Par exemple, MEDCoupling impose que les champs opérandes soient définis sur le même maillage support (on parle ici de l’objet informatique correspondant au maillage). Deux champs construits sur le même maillage (du point de vue conceptuel) mais issus de deux fichiers med différents sont considérés comme des champs définis sur des maillages support différents, c’est-à-dire que les objects informatiques correspondant aux maillages sont différents (chargés de deux fichiers différents). En l’état, il est donc impossible par exemple de faire la comparaison de champs résultats d’une étude paramétriques. MEDCoupling fournit une solution qu’il faudra mettre en oeuvre de manière ergonomique au niveau du module MED. Il est possible de changer le maillage support M1 d’un champs par un maillage M2 à partir du moment où les maillages M1 et M2 sont identiques géométriquement à une erreur près qu’il est possible de spécifier.
Note
D’autres situations limites peuvent être évoquées sous l’angle informatique. Ce sont des situations qui a priori n’ont pas de raison d’exister sur le plan conceptuel mais qui peuvent très bien survenir au niveau du module informatique compte-tenu des particularités du modèle MED. Par exemple:
Le diagramme ci-dessous représente un découpage fonctionnel qui rend compte de l’expression des besoins:
On peut identifier les fonctionnalités suivantes:
Ces fonctions s’articulent autour d’un conteneur qui héberge les champs manipulés et les supports de ces champs (représenté par le cylindre central).
Un scénario d’utilisation type est:
Le cahier des charges définit trois catégories d’opérations mathématiques:
Auxquelles, on peut ajouter à des fins de gestion des données:
La suite de la section décrit les spécifications prévues pour chaque type d’opération unitaire. Un dernier paragraphe concerne les modalités de combinaison des opérations et spécifie la définition d’un domaine d’application sur une opération, qui permet de restreindre la portée de l’opération en terme spatial, temporelle ou nature des composantes impliquées.
Les opérations arithmétiques regroupent:
Pour les besoins des spécifications informatiques, il est plus commode de classer ces opérations en deux catégories:
A partir de cette classification, il convient de distinguer trois formes d’usage selon la nature des opérandes:
les opérandes sont exclusivement des scalaires (typiquement des valeurs de composantes des champs et des paramètres numériques). Par exemple:
W(:,:4) = 1+2xU(:,:,2)+V(:,:,3)
les opérandes sont exclusivement des champs. Par exemple:
W = U + V (addition)
W = U ^ V (produit vectoriel)
les opérandes sont des champs et des paramètres numériques. Par exemple:
W = 3xU - 2xV
W = U + 2
Le premier cas de figure (opérandes scalaires) est trivial car les règles mathématiques conventionnelles s’appliquent et sont implémentées dans tous les langages (Python et C++ en particulier). Les cas 2 et 3 par contre doivent être précisés car (i) les règles de comportement ne peuvent pas être simplement déduites des règles mathématiques (quel est le résultat de W = U + 2 ?) et (ii) certaines écritures ne peuvent avoir aucun sens (par exemple W = 2 / U). Il convient donc de préciser les conventions et les limites sur ces deux cas de figure.
Dans le cas des opérations unaires où l’opérande est un champ, on doit distinguer deux cas d’usage:
Dans le cas des opérations binaires, on recense les combinaisons d’opérandes suivantes (les lettres capitales représentent des champs, et les lettres minuscules une valeur scalaire qui peut être un paramètre numérique ou la composante d’un champ):
Note
Pour ce qui concerne les opérations vectorielles, un convention implicite est appliquée par laquelle on suppose que les composantes sont rangées dans l’ordre des dimensions spatiales U1=Ux, U2=Uy, U3=Uz. Sur le plan informatique au niveau du modèle MEDMEM, ceci n’est pas garanti et aucun élément du modèle ne permet de contraindre l’application de cette convention. Il convient donc de prévoir des fonctions techniques qui permettront de mettre en correspondance les indices de composantes et les dimensions spatiales (par exemple par la données d’une carte de correspondance applicable à un ensemble de champs).
Avertissement
A développer:
Avertissement
Non prévues au programme 2010.
Avertissement
Non prévues au programme 2010.
Avertissement
EN TRAVAUX
Les opérations de génération sont des fonctions qui permettent de créer un champ sur un domaine du maillage où il n’est pas défini initialement. Deux cas de figure peuvent se présenter:
On peut envisager plusieurs modalités de mise en oeuvre:
Avertissement
EN TRAVAUX
Concerne:
Avertissement
EN TRAVAUX. A faire en fonction des besoins des cas d’application
On peut identifier plusieurs types d’opérations:
Avertissement
EN TRAVAUX. Indiquer les règles de combinaison (associativité, commutativité, ...)
Pour rappel, un domaine d’application peut être associé à une opération pour restreindre la portée de l’opération en terme spatial, temporelle ou nature des composantes impliquées.
Avertissement
Todo: spécifier comment on le définit et les modalités d’applications.
L’ergonomie générale d’utilisation du module de manipulation de champs est inspirée des logiciels comme octave ou scilab. Elle associe une interface graphique, pour sélectionner et préparer les données, avec une interface texte (la console python) pour le travail effectif sur les données:
Sur le plan de l’ergonomie, cela se traduit par un processus de travail dans lequel on peut distinguer différentes phases:
Dans ce cadre, l’utilisation type des fonctions de manipulation de champs est un processus de la forme suivante:
Sur le plan conceptuel, on est amené à définir deux espaces de données utilisateur:
La figure ci-dessous en donne une représentation imagée avec le support de l’interface graphique du module (interface non définitive affichée ici pour illustration des spécifications):
Note
Techniquement, les données sources sont rangées dans l’étude SALOME et peuvent être explorées au moyen de l’object browser. Les données de travail sont rangées dans un arbre complémentaire et manipulable dans la console python.
Le principe général est que les données sources ne sont jamais modifiées. Le dataspace est un espace de chargement qui permet d’explorer puis de sélectionner les données à manipuler. L’utilisateur travaille à partir de maillages et de champs chargés préalablement dans cet espace, mais ne peut en aucun cas les modifier directement. Pour cela, il doit d’abord les sélectionner pour utilisation dans l’espace de travail. Ce choix garantie l’intégrité des sources de données et permet de rejouer la séquence de travail à partir de zéro en cas de besoin (on efface le tableau noir et on recommence). Par ailleurs, il permet d’assister graphiquement la définition du champs à manipuler effectivement, en particulier pour affecter un nom de variable de manipulation.
Les captures d’écrans suivantes montrent le principe d’utilisation sur le cas de la sélection d’un pas de temps à utiliser dans l’espace de travail. Les données à manoeuvrer (maillage et/ou champs) sont sélectionnées pour utilisation dans l’espace de travail, où elles peuvent être modifiées et/ou utilisées dans les opérations de champs. Ici, le champ est désigné par la varibale f4 dans l’interface textuelle:
Avertissement
cette section est à nettoyer car elle contient des informations redondantes avec d’autres sections précédentes ou pire qui contredisent des sections précédentes.
Dans le cadre défini ci-dessus, une session d’utilisation type est:
Sélectionner les sources de données puis définir le domaine d’application (espace, temps, composantes), avec éventuellement l’assistance d’une interface graphique;
Charger les champs en conséquence dans l’espace de travail. Cette opération propose de définir une variable python pour manipulation dans l’interface textuelle.
Effectuer les opérations dans l’espace de travail, c’est-à-dire en ligne de commandes python (ce qui demandera sans doute un travail conséquent de simplification et d’assistance en ligne). Par exemple, si fa et fb désignent deux champs définis dans l’espace de travail, alors on peut en faire la somme par la commande:
>>> r=fa+fb
Effectuer les contrôles visuel et les diagnostics en ligne de commandes python (cf. 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:
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:
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.
On adopte le principe de fonctionnement suivant:
Ainsi donc, l’utilisateur aura une fonction (probablement graphique) pour définir la sélection des champs de l’espace de travail à sauvegarder.
Avertissement
EN TRAVAUX.
Plusieurs export peuvent être proposés:
Il s’agit d’exprimer ici les contraintes techniques applicables à la conception et au développement du nouveau module MED.
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:
L’implantation technique des développements est représentée sur la figure ci-dessous:
Le schéma représente les packages logiciels qui composent le module MED (cf. MEDMEM user’s guide):
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:
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.