.. meta:: :keywords: maillage, champ, manipulation :author: Guillaume Boulant %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ANNEXE: Note de travail concernant le chantier XMED 2010 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% .. contents:: Sommaire :local: :backlinks: none Principes directeurs du dÊveloppement ===================================== En matière de dÊveloppement: * On ne cherche pas d'emblÊe à s'inscrire dans la fabrication d'un module SALOME diffusable dans la version d'exploitation 2010 (SALOME 6). La raison est double: (i) on souhaite au moins pour 2010 ne pas devoir tenir compte des contraintes de temps SALOME et (ii) le produit envisagÊ fin 2010 est une maquette qui cherche à Êprouver l'ergonomie gÊnÊrale d'utilisation et en aucun cas on ne peut garantir la rÊalisation d'un module SALOME compatible avec les exigences de mise en exploitation. * On ne cherche pas d'emblÊe à capturer tous les cas d'application, mais à concevoir un dÊveloppement qui acceptera les extensions de pÊrimètres dans des conditions raisonnables. Aussi, les fonctionnalitÊs dÊveloppÊes seront celles qui sont nÊcessaires à la rÊalisation des cas d'application de rÊfÊrence; En matière d'ergonomie: * L'interface utilisateur de rÊfÊrence (appelÊ espace de travail dans le volet de spÊcifications fonctionnelles) est l'interprÊteur python. Les fonctionnalitÊs doivent être pensÊes pour un usage adaptÊ à une interface textuelle (TUI) de ce type. * La crÊation d'une interface graphique (GUI) peut être envisagÊe en complÊment et comme un moyen de manipuler graphiquement les fonctionnalitÊs dÊveloppÊes pour l'interface textuelle et pour aider la prÊparation des variables dans l'interface python. * Le modèle d'un processus de manipulation de champs est: - PrÊparation du jeu de variables U, V, ... reprÊsentant les champs à manipuler. C'est à ce stade que l'on rÊsoud la question de sÊlection des donnÊes (dans un champ publiÊ dans l'arbre d'Êtude, par un module de calcul ou par chargement d'un fichier med) - Utilisation des variables avec une sÊmantique la plus proche possible du modèle conceptuel et des spÊcifications fonctionnelles; - CrÊation des variables qui reprÊsentent les rÊsultats des fonctions de manipulation; - Persistence (fichier med), visualisation (SALOME) ou export (vers une structure qui peut être directement utilisable en numpy) Sur le plan technique: * On souhaite spÊcifier clairement le conteneur SALOME des fonctions de manipulation de champs. Pour discussion: - Il apparaÎt que les modules SALOME MED et VISU contiennent dÊjà des fonctions qui peuvent faire partie des fonctions de manipulations de champs (en particulier pour l'exploration des structures MED, leur visualisation et la sÊlection des donnÊes à manipuler). - Dans la mesure oÚ le module MED n'est pas utilisÊ à ce jour (en tout cas pas sous sa forme de module SALOME) et compte-tenu du caractère obsolescent du module VISU (amenÊ à être remplacÊ sur le plan fonctionnel par le module PARAVIS), on pourrait examiner la crÊation d'un module dÊdiÊ à la manipulation des maillages et des champs par l'agrÊgation technique au sein d'un même module des fonctions des modules MED et VISU. Au moins dans un premier temps, on se donne les limites suivantes: * Une opÊration ne peut pas combiner des pas de temps diffÊrents. Dans l'hypothèse oÚ cette limite venait à être levÊe, on doit spÊcifier le pas de temps de la donnÊe rÊsultat; * Le domaine d'application d'une opÊration pourra être dÊfini exclusivement par la donnÊe d'un maillage ou un groupe d'ÊlÊments du maillage; * On ne traite pas le cas des champs qui prennent leurs valeurs aux points de gauss ou aux noeuds par ÊlÊment. Une particularitÊ de ces types de support est que le repÊrage de la position implique deux indices (par exemple l'indice de la maille, puis l'indice du point de gauss). ElÊments de conception ====================== Plan gÊnÊral ------------ On peut par exemple imaginer une maquette du genre: * En C++ dans MEDGUI, charger un fichier med et donner une vue de la structure des maillages et des champs dans l'arbre d'Êtude. * SÊlectionner un ÊlÊment (par exemple un pas de temps d'un champ) et le menu contextuel permet d'exporter ce champ dans la console python pour manipulation. Pour cela, s'inspirer de la fonction ``XCADGUI::OnLoadScript()`` du XCADGUI pour manoeuvrer un objet PythonConsole. * L'ÊlÊment est marquÊ comme ayant ÊtÊ exportÊ, on peut imaginer une rÊcupÊration ultÊrieure. * Exporter un deuxième champ cohÊrent avec le premier (même pas de temps et dÊfini sur le même maillage avec le même support, on s'arrange pour). * Dans la console python, faire les opÊrations sur les champs * Publication du champ rÊsultat dans l'arbre d'Êtude pour sauvegarde ultÊrieure. C'est a priori le gros morceau qui consiste à faire un objet CORBA MED à partir d'un objet MED standard, en plus dÊfini dans la console python (sous forme d'objet python). Quand ce premier cas d'utilisation est au point, on peut envisager de le complÊter par les opÊrations suivantes * exporter le rÊsultat med dans un fichier * visualiser les champs produits Plan de dÊveloppement: * Faire une maquette en MEDMEM pur d'abord, car quelque soit le choix d'architecture, l'opÊration physique se dÊroulera en dÊfinitif au niveau de MEDMEM pur. * PrÊvoir une implÊmentation des opÊrations sous forme de fonctions informatiques, même les opÊrations algÊbriques (+,-,*,/). Pour ces dernières et dans certaines conditions (quand on manipule directement les strutures MEDMEM et non pas les objets CORBA), l'utilisation des formes A+B, A-B, ... peuvent être rendues possibles. Dans ce cas, voir la possibilitÊ de combiner plusieurs opÊrations algÊbriques sur une seule ligne: A+B-C*0.3. * On peut charger la structure MED sous forme d'objet CORBA publiable dans l'Êtude, de sorte d'avoir accÊs aux mÊta-donnÊes et pouvoir par exemple sÊlectionner les champs d'intÊrêt. De cet objet CORBA, on ne rÊcupère que les informations nÊcessaires au chargement d'un champs: le nom du champs, le nom de son maillage associÊ, les identifiants du pas de temps, au besoin une structure Field non chargÊe (par exemple pour rÊcupÊrer plus facilement le maillage). * Un mÊcanisme (à dÊvelopper à partir du PyConsole par exemple) pourrait alors permettre le chargement des champs sÊlectionnÊs dans la console python et sous un nom facile à manoeuvrer. Prendre inspiration sur XCADGUI::LoadIntoPythonConsole(). * A priori, les donnÊes sont physiquement chargÊe dans le GUI. Au besoin, il semble possible (cf. MED_i::init) de fabriquer une objet CORBA field à partir d'un field standard (à tester). Une autre idÊe est de rÊcupÊrer le pointeur CORBA MED dans la console python et de tirer les donnÊes à partir de là . Ajouter une couche de wrapping python pur pour gÊrer les cas de simplification (surcharge des opÊrations arithmÊtiques par exemple). Besoins complÊmentaires: * L'interprÊteur doit contenir des ÊlÊments d'aide (par exemple un help qui liste les opÊrations possibles sur les champs chargÊs) * prÊvoir quelques fonctions de visu et de persistence. Cela commence probablement par des fonctions de publication dans l'Êtude des champs crÊÊs par les opÊrations de manipulation. Les champs sont physiquement ajoutÊ automatiquement à la structure med par le MedOp mais il n'est pas obligatoirement publiÊ => fournir un moyen de publication. Limitations actuelles (liÊes à la conception de MEDMEM): * les champs doivent être gÊrÊs par la même structure MED car ils doivent partager le même support. * les opÊrations possibles dans MEDMEM sont entre champs pris sur un pas de temps (Q: les pas de temps peuvent-ils être diffÊrents). DÊveloppements -------------- DÊveloppement de classes proxy: * FieldProxy, FieldTimeSeriesProxy * Attention pour les Êries temporelles, le SUPPORT med peut être diffÊrent en chaque pas de temps (par exemple en cas d'extension spatiale du champ au cours du temps). MEDMEM_MedDataManager: * FIX: test de l'implÊmentation C++ au travers de la fonction test() du MedOperator ==> OK. Quand on fait la même opÊration depuis python via l'interface SWIG ==> au deuxième appel de getFieldDouble, le destructeur du champ semble être appelÊ. Pb de gestion des pointeurs? Evolutions à prÊvoir ==================== Concernant MEDMEM: * FIX: SALOME_MED::MED::getField devrait pouvoir être appelÊe plusieurs fois de suite puisqu'on recycle la rÊfÊrence si elle est dÊjà chargÊe. * IMP: MEDMEM::MED faire une gestion des chargements des champs (par exemple avec un getField qui renvoie le champ s'il est dÊjà chargÊ ou le charge et le renvoie sinon). * IMP: RÊcupÊrer le nom du fichier med à partir de l'objet MED, en passant a priori par le driver associÊ. Plusieurs driver peuvent être associÊs à une structure MED car les donnÊes peuvent être chargÊes en plusieurs fois et de plusieurs fichiers. Il faut donc Êtendre la structure MED pour avoir accÊs à la liste des driver puis de cette liste dÊduire les noms des fichiers. * IMP: OpÊrations combinant des champs sur des support diffÊrents ne peuvent pas être faites par l'API (une exception est levÊe en cas de supports incompatibles), mais on peut imaginer le faire en manoeuvrant les tableaux de donnÊes directement. * INF: faire le point sur les fonctions utilitaires autour de MEDMEM et de son interface SWIG (ex: dumpMEDMEM.py, med_opfield_test.py). * IMP: dans MEDMEM::MED et SALOME_MED::MED, pouvoir enlever un champ prÊalablement ajoutÊ: une fonction removeField en complÊment de addField. Concernant l'interface SALOME_MED: * IMP: Fonctions algÊbriques, qui seront implÊmentÊes au niveau de la structure MED et requêtÊes au niveau des classes proxy en spÊcifiant les identifiants des champs impliquÊs et les paramÊtres requis (pas de temps en particulier). Concernant le module MED: * IMP: pourvoir exporter la structure med dans un fichier med (la structure ayant pu être enrichie par la publication de champs crÊÊs par les operations de champs. Historique des travaux ====================== 20100726 : mise au point du schÊma de conception ------------------------------------------------ Choix entre MEDMEM et MEDCoupling: on reste sur MEDMEM pour plusieurs raisons: * MED Coupling ne peut pas gÊrer des mailles de dimensions diffÊrentes dans un même modèle (choix faits dans un soucis de performance dans l'accès à une structure de donnÊe compact). On peut contourner le problème en dÊfinissant deux champs pour traiter chacun des type de mailles. * Un champ repose sur un maillage complet (pas de notion de profil, mais cela peut être ÊmulÊ en crÊant deux maillages) * Le concept de point de gauss n'existe pas (pas implÊmentÊ) TODO: * IdÊalement, il conviendrait de faire un Êtat des lieux du module MED, en particulier des ÊlÊments MEDMEM (le coeur), les interfaces CORBA associÊes (MED.idl implÊmentÊ dans le package source MEDMEM_I), l'engine (composant SALOME d'interface MED_Gen.idl et implÊmentÊ dans le package source MED) et le GUI (MedGUI.cxx implÊmentÊ dans le package source MEDGUI). * Ergonomie TUI et modèle CORBA associÊ: 1. Charger un objet medmem (puis les objets mÊtier mesh et field) sur un domaine d'application donnÊ. 2. En faire des variables disponibles dans l'interface TUI et que l'on peut manipuler dans des opÊrations algÊbriques. 3. Pouvoir au besoin en faire des objets CORBA pour l'interface avec les autres modules SALOME. * ComplÊter le diagramme de la structure informatique de MED (en particulier l'implÊmentation des interface IDL). * PrÊparer un module de travail XMED (organisation d'une bibliothèque) Tests à rÊaliser: * Est-il possible de faire des opÊrations algÊbriques à partir des objets SALOMEMED (objects CORBA MED)? * CrÊation d'un objet MED_i à partir d'une objet MED pur prÊalablement chargÊ en mÊmoire. A retenir: * Des opÊrations de champs sont possibles sur des champs à des pas de temps fixÊs. Si l'opÊration doit être menÊe sur plusieurs pas de temps, alors itÊrer sur chaque pas de temps. L'idÊe ici est d'introduire le concept de sÊrie temporelle de champs en temps qu'objet manipulable. * Pour deux champs diffÊrents de la même structure MED, la donnÊes des identifiants dt et it ne correspond pas forcÊment au même instant absolu (en tout cas rien ne le garanti, même si c'est tout de même une pratique courante). 20101005 : première maquette de dÊmonstration de l'ergonomie en MEDMEM pur -------------------------------------------------------------------------- XMED: svn rÊvision 16 Travailler avec le fichier de donnÊe testfield.med joint. 20101007 : Vers une maquette CORBA ---------------------------------- Le contexte d'utilisation des opÊrations de champs est l'environnement SALOME. Le support de gestion des donnÊes est donc l'Êtude SALOME. Au plus bas niveau, les champs sont des objets MEDMEM instanciÊs dans une session SALOME (soit par un code de calcul intÊgrÊ, soit par chargement des donnÊes à partir d'un fichier med). Ces objets sont en gÊnÊral rÊfÊrencÊs dans l'Êtude SALOME sous la forme d'objets CORBA de classe SALOMEMED::FIELD. Plus exactement, l'Êtude SALOME gère des SObject (Study Object) dont un attribut est une rÊfÊrence vers un objet CORBA de classe SALOMEMED::FIELD qui lui-même encapsule un objet MEDMEM::Field. On peut donc envisager une solution dans laquelle on donne à l'utilisateur des poignÊes de manipulation des objets SALOMEMED::FIELD, par exemple au moyen d'un modèle informatique de type proxy. Cela signifie que l'utilisateur ne manipule pas directement des objets MEDMEM mais des objets python qui font l'interface (à concevoir et implÊmenter, a priori avec un design pattern de type proxy). L'utilisation directe des objets MEDMEM aurait pu être une solution extremement pratique dans la mesure oÚ ces objets en l'Êtat peuvent être combinÊs dans des opÊrations de champs (c'est dÊjà implÊmentÊ). Par contre, ce procÊdÊ souffre de limitations importantes dans la gestion et la circulation des donnÊes pour les diffÊrents cas d'utilisation envisagÊs (visualisation, export, transfert à un autre module SALOME). L'avantage de la solution proposÊe est multiple: * Elle permet de travailler sur une structure MED cohÊrente pour intÊgrer les rÊsultats des opÊrations de calculs et combiner des champs cohÊrents entre eux. Tout passe par des classes proxy qui pourront s'assurer de la cohÊrence des opÊrations demandÊes et exÊcuter automatiquement les fonctions de prÊ-traitement ou post-traitement requises pour ces opÊrations. On peut imaginer par exemple que les requêtes d'opÊration soient envoyÊes par les classes proxy à la structure MED à laquelle les champs sont associÊs pour piloter l'opÊration en MEDMEM pur. * Elle permet d'automatiser un certain nombre d'opÊrations implicites. Par exemple si deux champs ne sont pas dÊfinis dans la même unitÊ, un changement d'unitÊ peut être effectuÊ automatiquement par la classe proxy avant de commander l'opÊration au niveau MEDMEM. * Elle permet de laisser les donnÊes sur le container SALOME et de rÊaliser des opÊrations sans rappatrier les donnÊes en local (qui peuvent être en trÊs grand nombre). * Elle permet d'Êtendre facilement l'ergonomie de manipulation des champs, par exemple en dÊfinissant la notion de *sÊrie temporelle de champs*, ou encore les concepts de *domaine de dÊfinition* ÊvoquÊs dans les spÊcifications fonctionnelles. * Elle rend immÊdiat la circulation des donnÊes entre modules SALOME, puisque les champs restent accessble par des objets CORBA, en particulier pour la visualisation ou l'export des champs produits par les opÊrations. Elle a cependant des inconvÊnients et/ou limitations: * Elle nÊcessite l'implÊmentation d'une classe proxy pour encapsuler tous les appels aux objets SALOME_MED (et donc MEDMEM). Cette interface se limite a priori aux opÊrations de champs (les opÊrations algÊbriques dans un premier temps). * Les champs à manipuler dans une opÊration donnÊe doivent être gÊrÊs par la même structure MED. Il est à noter Êgalement que les interfaces de programmation de SALOMEMED (interface CORBA pour MEDMEM) devront être Êtendues pour permettre des requêtes de manipulations de champs (fonctions addition, soustraction, multiplication, ...). Pas de contrainte ici sur l'ergonomie puisque la manipulation par l'utilisateur se fera au niveau des classes proxy uniquement. Hypothèses: * On tente ici une maquette qui exploite dans la mesure du possible le fonctionnement actuel du module MED, en particulier la gestion des donnÊes dans l'Êtude. * Dans une deuxième version, on pourra examiner sÊrieusement la rÊvision de la gestion des donnÊes dans le module, quitte à la spÊcifier et maquetter dans XMED pour intÊgration ultÊrieure dans MED. Exemple: - Pouvoir gÊrer plusieurs structures med dans l'Êtude. * Enfin, on exploite MEDMEM en l'Êtat. Pour les besoins de la gestion des donnÊes (gestion des chargements des champs en particulier, rÊfÊrences croisÊes pour retrouver le med à partir du champ par exemple, ...), il pourra être nÊcessaire de faire Êvoluer MEDMEM. Il faut pouvoir par ailleurs gÊrer indiffÊremment une structure med (et les champs qui y sont associÊs) qu'elle soit crÊÊe en mÊmoire from scratch ou chargÊe d'un fichier (donc attention avec les opÊrations de lecture read(), sur les maillages comme sur les champs). La structure med permet d'obtenir les mÊta donnÊes (meta-field par exemple) mais ne permet pas de savoir si les donnÊes sont physiquement chargÊes ou pas. RÊvisions: * XMED svn revision 21 + tarball MED_SRC-20101014-15h26m.tgz. Première version qui permet d'importer un champ dans la console python sous la forme d'un FieldProxy. Ne permet pas encore de faire des opÊrations. Introduction dans le module MED de l'interface MEDOP pour prendre en charge les opÊrations sur les champs. 20101019 : Maquette de dÊmonstration pour l'addition ---------------------------------------------------- Cette maquette implÊmente une solution technique de bout en bout (de l'interface python aux objets MEDMEM, en passant par le fieldproxy puis les servants CORBA pour les operations, ...) mais sur le pÊrimètre de l'addition de champs sur tout leur domaine de dÊfinition et pour un pas de temps donnÊ. Limitations: * gÊre l'addition de champs de type double uniquement (parceque le reste n'est pas implÊmentÊ) RÊvisions: * XMED: svn rÊvision 25 * MED: cvs tag BR_medop_20101019 20101020: Fonctions complÊmentaires ----------------------------------- Cette version test la faisabilitÊ des fonctions complÊmentaires pour accompagner la manipulation de champs. Cela comprend en particulier: * **la sauvegarde des champs produits** dans un fichier med (un champ ou toute la structure med). Pour cela, on dÊfinit un med proxy comme l'extention du SALOME_MED::MED (prÊvir plutôt d'implÊmenter ce type de fonction au niveau C++ pour permettre un usage au niveau du GUI C++?). * **la visualisation d'un champ** au moyen du module VISU. * **des fonctions d'aide interactives** pour assister l'utilisateur dans la console de manipulation des champs. Questions: * peut-on sauvegarder un champ unique? * peut-on faire en sorte que ce soit l'affectation à une variable qui provoque l'ajout du champ à la structure med (ou plus exactement qui supprime tous les champs intermÊdiaires). RÊvision: * XMED: svn revision 31 * MED: cvs tag BR_medop_20101025 20110606: commit avant transfert dans git ----------------------------------------- * XMED: svn revision 53 Les parties de MED utiles à MEDOP seront reversÊes dans XMED dans une première Êtape, puis le tout dans MED 6 au final.