.. meta:: :keywords: maillage, champ, manipulation :author: Guillaume Boulant .. include:: medcalc-definitions.rst %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ANNEXE: Note de travail concernant le chantier XMED 2011 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% .. contents:: Sommaire :local: :backlinks: none Cas d'utilisation mÊtier ======================== On illustre par un exemple (Christophe Vallet, R&D/MMC, 1/7/2011):: J'ai souvent des fichiers med de rÊsultats de calcul, et j'aimerais y ajouter de nouveaux champs issus de champs existants. J'aimerais aussi pouvoir crÊer de nouveaux meds plus petits par extraction de certaines composantes de champs, certains groupes ou certains pas de temps. On peut exprimer le besoin sous la forme des cas d'utilisation suivants (use cases): * **UC1: combiner dans un même fichier med des champs issus de plusieurs sources de donnÊes**. On peut par exemple charger un premier fichier, puis ajouter à cette base des champs issus d'autre fichiers ou gÊnÊrÊs par manipulation de champs, ou encore gÊnÊrÊs par un module de calcul qui produirait directement du MEDCoupling. * **UC2: crÊer un champ contenant certaines composantes d'un autre champ**. On pense ici aux fonctions de restriction, qui permettraient de rÊcupÊrer certaines composantes uniquement. * **UC3: crÊer un champ contenant certains pas de temps d'un autre champ**. C'est un cas particulier des fonctions de restriction ÊvoquÊes ci-dessus. * **UC4: crÊer un champ comme la limitation d'un autre champ à un groupe de mailles**. C'est un cas particulier des fonctions de restriction ÊvoquÊes ci-dessus. Notion de domaine spatial. A priori la notion de groupe est dÊfinie dans MEDLoader. On peut ajouter Êgalement les UC identifiÊs pour la maquette 2010: * **UC5: comparer des champs issus de source de donnÊes diffÊrentes**, par exemple des champs chargÊs de deux fichiers med diffÊrents et qui s'appuient sur le même maillage (au moins conceptuellement). Le problème technique ici est de pouvoir changer le maillage d'un champ, pour ramener tous les champs sur le même maillage (au sens informatique). Ceci est une contrainte de MEDCoupling, les opÊrations sur des champs A et B imposent que A et B soient dÊfinis sur le même maillage, i.e. le même objet informatique. * **UC6: crÊer un champ de toute pièce sur un maillage**, ou un groupe de mailles. Ce cas d'usage est typiquement prÊvu pour produire les conditions de chargement initial d'une structure. Il s'agit ici d'initialiser un champ à partir de zÊro sur une surface prÊdÊfinie de la gÊomÊtrie (par exemple spÊcifiÊe par un nom de groupe de mailles). Pour UC5: les sources de donnÊes sont rÊfÊrencÊes dans l'object browser. On importe explicitement les donnÊes dans l'espace de travail. On peut dÊtecter que les maillages sont identiques et on propose à l'utilisateur de transfÊrer le champ sur le maillage dÊjà prÊsent. Sinon, les champs devront être rÊfÊrencÊs sur des maillages distincts dans l'arbre de l'espace de travail. Analyses prÊliminaires pour le chantier 2011 ============================================ On fait le choix pour le chantier 2011 de travailler à partir de la bibliothèque MEDCoupling (et non plus MEDMEM comme c'Êtait le cas dans le dÊmonstrateur 2011). Analyse de MEDCoupling et MEDLoader ----------------------------------- MEDCoupling est l'implÊmentation du modèle de donnÊes MED (avec recherche de minimisation des dÊpendances logicielles) et MEDLoader fournit une ensemble de fonctions pour le chargement des structures MEDCoupling depuis un fichier ou inversement leur sauvegarde sous forme de fichiers. Dans l'implÊmentation MEDCoupling, un champ est l'ensemble des valeurs d'une grandeur physique sur un maillage pour un pas de temps donnÊ. Un champ est caractÊrisÊ par: * un support spatial, le maillage * un type de discrÊtisation spatial, dÊfini par l'emplacement des valeurs sur le maillage (sur les noeuds, sur les cellules, aux points de gauss, ...) et le mode d'interpolation spatial (P0, P1, etc) * un pas de temps, dÊfini par deux entiers (iteration, order) et un rÊel (timestamps) Dans cette implÊmentation, il existe une association 1..n entre un maillage et un champ (alors que dans MEDMEM, la structure intermÊdiaire SUPPORT est implÊmentÊe). MEDCouplingCorba fournit un ensemble de servants CORBA pour manoeuvrer des structures MEDCoupling au travers du bus CORBA. L'interface à ce jour est dÊlibÊrÊment rÊduite. Des classes dites "Cliente" sont fournies pour piloter les servants CORBA depuis un contexte client. Par exemple ``MEDCouplingFieldDoubleClient`` fournit une fonction de crÊation d'une structure MEDCoupling à partir d'un pointeur vers un servant CORBA. La structure est crÊÊe localement (dans le contexte client) avec duplication des donnÊes issue de la structure encapsulÊe par le servant CORBA (rÊcupÊration par la fonction de sÊrialisation). Aucune interface CORBA n'est dÊfini pour MEDLoader. Questions: * Voir comment sont crÊÊs les servants, et surtout comment ils sont rÊcupÊrÊs (via le lcc?) * Comment peut-on dÊfinir un champ sur un groupe de mailles (et non pas sur le maillage complet)? Comment peut-on extraire le champs circoncit à une groupe de mailles pour des opÊrations. - R: mÊthode changeUnderlyingMesh * Comment manipuler deux champs chargÊes de fichiers diffÊrents mais construit sur le même maillage (conceptuellement). On peut forcer la rÊassociation d'un champ sur un autre maillage? * Manipuler des champs de pas de temps diffÊrents? DiffÊrentes composantes d'un ou plusieurs champs? * Comment importer un MedCoupling dans PARAVIS? (dans VISU?)? * mapper sur une image Improvments: * MEDLoader::Write should raise an exception if the filepath is not writable * MEDDataManager: dÊvelopper une classe chapeau sur MEDCoupling et MEDLoader pour aider au chargement et la gestion de donnÊes MED (orientÊ manipulation de champs). Cette classe serait associÊe des structures lÊgères FieldHandler et MeshHandler et des listes correspondantes pour la navigation dans les mÊta-donnÊes. * Sur base du MEDDataManager, prÊvoir des ports med pour yacs par lesquels pourrait transiter des handler. Nouveaux concepts à prendre en compte ------------------------------------- Au dÊmarrage du chantier 2011, on observe que les concepts suivants sont introduits dans le module MED: * Le conteneur MED n'existe plus, utiliser MEDFILEBROWSER pour charger les fichiers med et obtenir les informations gÊnÊrales sur le contenu. * MEDFILEBROWSER: remplace le concept de driver et fournit les fonctions prÊcÊdemment fournies par la classe MED pour obtenir les informations de structure. * Concept d'Extractor pour une lecture sÊlective des donnÊes de champs (suivant un critère d'extraction) * Il n'est plus nÊcessaire d'appeler les mÊthodes read explicitement sur les objets (MESH et FIELD) pour charger les donnÊes. Par ailleurs, on peut dÊfinir deux fois le même champs (double chargement a priori) sans lever d'exception). Analyse de conception pour le chantier 2011 =========================================== Composants SALOME (interfaces IDL) ---------------------------------- * MEDDataManager: dÊfini une structure FIELD pour identifier un champ dans les requêtes. Il s'occupe Êgalement de la rÊcupÊration physique des donnÊes, quelqu'en soit la source (fichier avec MEDLoader, autre module SALOME comme PARAVIS avec une mÊthode à dÊfinir) * MEDCalculator: s'occupe des requêtes de calcul dont les arguments sont les structures FIELD du MEDDataManager. Reprendre l'interface de MEDOP. Use case à rÊaliser depuis un client python: * UC01: ajouter un fichier d'entrÊe et accÊder aux informations concernant les champs. Ex: rÊcupÊrer une structure champs par la donnÊe des paramètres primaires (nom identifiant, dt, it, nom du maillage). * UC02: crÊer des champs et les ajouter au MEDDataManager * UC03: mener des opÊrations basique sur les champs en console python Interface Utilisateur --------------------- L'interface utilisateur est composÊe des parties suivantes: * une partie GUI (appelÊe par la suite MEDGUI) qui s'occupe de piloter le chargement des donnÊes dans l'espace de travail, au moyen d'une interface graphique; * une partie TUI (appelÊe par la suite MEDTUI) qui s'occupe de piloter la crÊation de champs, au moyen de commandes exÊcutÊes dans la console python. Le principe est que les champs sont prÊalablement chargÊs au niveau du composant SALOME au moyen de l'interface graphique (MEDGUI), puis manoeuvrÊs depuis l'application SALOME au moyen de variables proxy dÊfinies dans la console python (MEDTUI). Au chargement, les champs sont indÊxÊs par le MEDDataManager, puis les index sont rendus accessibles au niveau du GUI au moyen d'une reprÊsentation arborescente de la structure MED. Les feuilles de l'arbre correspondent à des champs qui peuvent être sÊlectionnÊs et dont l'index peut être obtenu de la sÊlection. L'espace de travail est organisÊ autour du concept de "workspace". L'Êtude SALOME liste les datasource (les fichiers source des donnÊes med, mais peut-être aussi les rÊfÊrence vers des objets MED dÊjà existants ou chargÊ dans PARAVIZ). Une vue complÊmentaire permet de voir la structure fine d'une source de donnÊes. Concernant MEDGUI: * la reprÊsentation des donnÊes (les champs et les maillages associÊs) doit permettre de rÊcupÊrer par l'interface graphique les identifiants des champs à manipuler (a priori les structures FIELD dÊfinies par le composant MEDDataManager). Cela conduit à la mise en place des composants suivants: - MedDataModel hÊritÊ de TreeData. Il est peuplÊ avec les mÊta-donnÊes dÊcrivant la structure MED explorÊe. - MedGuiManager qui permet l'implantation du doc widget de prÊsentation TODO: * specifier le concept de workspace (qui a une entrÊe dans l'Êtude?) en bijection avec un datamanager * identifier des interlocuteur/utilisateur pour l'aspect ergonomie d'usage Concernant MEDTUI: * Il fournit les classes FieldProxy Questions: * Comment traiter le cas du travail sur des composantes ciblÊes, plus gÊnÊralement, comment introduire le concept de domaine d'application? * PrÊvoir des fonctions gÊnÊriques (initialisation d'un champ sur un maillage avec une fonction analytique de la position, sauvegarder les champs crÊÊs dans un fichier med) Tâches de dÊveloppement ======================= T20110622.1: Gestion des donnÊes internes ----------------------------------------- **Status: terminÊ.** Suite: fonction de sauvegarde au niveau graphique Êgalement On vise les cas d'utiliation suivants: * UC1: intÊgrer dans le datamodel du gui un champ crÊÊ dans la console python (et donc prÊsent dans le datamanager du composant). DÊfinir l'utilitÊ? * UC2: renommer un champ et plus gÊnÊralement changer ses mÊta-donnÊes (avec assurance de synchronisation entre toutes les donnÊes). * UC3: sauvegarder une sÊlection de champs. La sÊlection peut se faire dans l'arbre du datamodel gui. WARN: robustesse de fieldproxy T20110622.2: UC Initialisation/CrÊation de champs ------------------------------------------------- **Status: à faire** Les cas implÊmentÊs à ce jour sont la crÊation de champs à partir de champs existants et chargÊs d'un fichier med. On souhaite ici rÊaliser des cas 'utilisation autour de la crÊation de champs "from scratch", s'appuyant tout de même sur un maillage chargÊ. UC01: SÊlection d'un groupe de maille dans SMESH pour initialiser un champ (par exemple les conditions limites d'un problème de calcul). UC02: crÊer un champ avec des restrictions qui dÊfinissent le domaine d'application des opÊration de champs. UC03: crÊer un champ à partir d'une image (codes rgb utilisÊ comme les composantes du champs vectoriel ou niveaux de gris pour un champ scalaire. Attention, pour ça, il faudra a priori fiare une projection du maillage cartesien de l'image sur le maillage (quelconque) sur lequel on souhaite dÊfinir le champ. UC04: crÊer un champ à partir d'un tableau numpy De manière gÊnÊrale, ce type de crÊation sera assistÊ par le MEDGUI. Au niveau MEDTUI, les fonctions pourraient être fastidieuses pour l'utilisateur. Par exemple, prÊvoir un menu contextuel qui propose les opÊrations possibles en fonction de la sÊlection (en plus de la fonction d'import dans la console python). TODO: * dÊvelopper les fonctions d'initialisation, par exemple au moyen d'applyFunc et du mÊcanisme de callable? T20110622.3: documentation contextuel ------------------------------------- **Status: à faire** * Remettre toutes les commandes dans le même fichier (fusionner cmdtools et fieldtools) * Faire un modèle gÊnÊrique de command (classe de base * Batir la doc des commandes sur cette base (lister toutes les instances de type Command par exemple) T20110622.4: remontÊe des exception du composant MEDCalculator -------------------------------------------------------------- **Status: en cours, complÊter la couverture** Pour des messages contextuel sur les erreurs de calcul (ex: division par 0) * Poursuivre le travail fait sur getMedEventListener * ProtÊger tous les appels au composants effectuÊs depuis la console python (prendre example sur la commande save) T20110624.1: gestion des donnÊes GUI ------------------------------------ **Status: à faire** Le workspace a une entrÊe dans l'obrowser. Sur cette entrÊe on peut: * supprimer: supprime tout les champs associÊs * sauvegarder. Dans ce cas, on rappelle l'ensemble des champs pour cocher ceux qu'on veut sauvegarder. Le gui data model est rÊservÊ aux opÊrations sur les champs et à piloter leur import dans la console python. TODO: * SpÊcifier les concepts de workspace, database, et datasource, espace de gestion, ... et les associations. Simplifier avec l'appuie de use cases. * MÊcanisme de mise à jour du TreeView de XSALOME (aujourd'hui, seul l'ajout addChild est implÊmentÊ * Clic droit sur objets de l'arbre: dans la notification TreeView -> WorkspaceController, faire remonter l'Êvènement clic droit ainsi que la liste des ÊlÊments sÊlectionnÊ pour faire gÊnÊrer le menu contextuel au niveau du WorkspaceController qui peut dÊterminer le contexte mÊtier (le TreeView ne le connaÎt pas). * DÊfinir des DataObject pour les maillages, les sÊries temporelles et les champs SpÊcification des espaces de donnÊes: * MEDDataManager dÊpend de l'Êtude (pour permettre la publication d'information dans une Êtude SALOME). * crÊer "sourcid = MEDDataManager::addDataSource(filename)", suivie de requetes getFields(sourceid), getMeshes(sourceid) * les espaces de donnÊes: dataspace, workspace. Un seul workspace par Êtude, mais autand de datasources que l'on souhaite dans le dataspace. Les datasources sont rangÊs dans l'Êtude (le dataspace) et sont non modifiables après chargement (rÊfÊrence des sources de donnÊes). T20110628.1: extention à d'autres objets SALOME ----------------------------------------------- **Status: suspendu** On doit reposer la question de l'existance de l'arbre indÊpendant (DockWidget), d'une part, et l'extention aux autres objets (GEOM et SMESH en particulier) du principe de sÊlection graphique pour utilisation dans la console python, d'autre part. T20110628.2: visualisation d'un champ avec PARAVIS -------------------------------------------------- **Status: terminÊ (pour une première version)** Suite: de nombreux dÊfauts subsistent Questions/remarques: * Pb au dÊmarrage du module: VisTrails fails to start * Peux-t-on piloter la vue 3D sans charger le module? (voir myparavis.py) * Comment donner un nom au MEDReader1 dans l'arbre Pipeline? * Comment utiliser directement les objets MEDCouplingField? T20110706.1: documentation du module ------------------------------------ **Status: en cours (10%)** Documenter les commandes TUI puis l'utilisation gÊnÊrale de l'interafce graphique. Mentionner l'existance de la commande medop.sh pour travailler exclusivement en mode texte (utile pour les tests rapides). Documenter les modalitÊs d'exÊcution des tests. T20110708.1: helper python pour MEDCoupling ------------------------------------------- **Status: en attente (pas urgent)** Faire un helper python dans le package xmed qui permet de faire du medcoupling facilement (essentiellement pour simplifier le chargement, puis la sÊlection des donnÊes). Cela demanderait de faire un MedDataManager comme une class C++ pure (non CORBA). Cette classe travaillerait par exemple uniquement avec des id et des liste d'id, et fournirait des fonctions d'affichage (comme le ``ls`` et le ``la``) pour obtenir des meta-information. Le servant MedDataManager pourrait être une surcouche de cette classe c++ pure. T20110708.2: analyses et tests ------------------------------ TODO: * crÊer un fichier de test avec plusieurs pas de temps * crÊer un fichier de test avec des groupes de mailles T20110728.1: refactoring MEDDataManager --------------------------------------- Refactoring pour une meilleur association entre FieldHandler et MeshHandler: * dans la mesure du possible utiliser les id plutôt que les handler en arguments des fonctions d'appel des objets * A chaque champ (FieldHandler), on doit associer un meshid (et de manière optionnelle un fieldseriesId, si le champ peut être associÊ à une serie temporelle. A priori faisable uniquement au chargement du datasource). * Pour cela, revoir les fonctions internes newFieldHandler et addField ou prÊvoir de les complÊter à chaque fois qu'elles sont appelÊe avec les informations concernant le meshid. * addField est utilisÊe par le MEDCalculator * Attention au raffraichissement des donnÊes handler au niveau du Workspace. Peut-être le mieux est que les fieldproxy contiennent uniquement le fieldid, et qu'ils interroge le datamanager à chaque fois qu'ils ont besoin d'une donnÊe. Voir aussi les notifications via le MEDEventListener? **Le plus simple est de faire la mise à jour lors de l'appel à la mÊthode __repr__ du fieldproxy, i.e. quand on essaye d'afficher les donnÊes**. Parceque sinon il n'y a pas de problème puisque que le calculateur travaille à partir des id. Petites amÊliorations du DataspaceController: * Au OnUseInWorkspace, stocker (dans la mesure du possible) le nom de l'alias python dans un attribut du sobject. * Dans DlgChangeUnderLyingMesh, expliquer que le champs sera dupliquer est posÊ dans le WS. On peut donc proposer en option de lui associer un alias pour manipulation dans la console