.. 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