Salome HOME
eb425424821d6dde6d90a6fc34c6ef3e0857e716
[modules/adao.git] / doc / fr / tui.rst
1 ..
2    Copyright (C) 2008-2024 EDF R&D
3
4    This file is part of SALOME ADAO module.
5
6    This library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
10
11    This library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15
16    You should have received a copy of the GNU Lesser General Public
17    License along with this library; if not, write to the Free Software
18    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19
20    See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21
22    Author: Jean-Philippe Argaud, jean-philippe.argaud@edf.fr, EDF R&D
23
24 .. index:: single: TUI
25 .. index:: single: API/TUI
26 .. index:: single: adaoBuilder
27 .. _section_tui:
28
29 ================================================================================
30 **[DocR]** Interface textuelle pour l'utilisateur (TUI/API)
31 ================================================================================
32
33 .. |eficas_totui| image:: images/eficas_totui.png
34    :align: middle
35    :scale: 50%
36
37 Cette section présente des méthodes avancées d'usage du module ADAO à l'aide de
38 son interface de programmation textuelle (API/TUI). Cette interface permet à
39 l'utilisateur de créer un objet de calcul de manière similaire à la
40 construction d'un cas par l'interface graphique (GUI). On peut d'ailleurs
41 directement obtenir une forme scriptée d'un cas construit dans l'interface
42 graphique GUI à l'aide du bouton d'export TUI |eficas_totui| intégré dans
43 l'interface, mais des cas plus compliqués ou plus intégrés peuvent uniquement
44 être construits avec la démarche TUI. Dans le cas où l'on désire réaliser
45 directement le cas de calcul TUI, on recommande de bien s'appuyer sur
46 l'ensemble de la documentation du module ADAO, et de se reporter si nécessaire
47 à l'interface graphique (GUI), pour disposer de l'ensemble des éléments
48 permettant de renseigner correctement les commandes. Les notions générales et
49 termes utilisés ici sont définis dans :ref:`section_theory`. Comme dans
50 l'interface graphique, on note que la démarche en TUI est destinée à créer et
51 gérer un unique cas de calcul.
52
53 .. _subsection_tui_creating:
54
55 Création de cas de calcul TUI ADAO et exemples
56 ----------------------------------------------
57
58 .. _subsection_tui_example:
59
60 Un exemple simple de création d'un cas de calcul TUI ADAO
61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
62
63 Pour introduire l'interface TUI, on commence par un exemple simple mais complet
64 de cas de calcul ADAO. Toutes les données sont explicitement définies dans le
65 corps du script pour faciliter la lecture. L'ensemble des commandes est le
66 suivant :
67
68 .. literalinclude:: scripts/tui_example_01.py
69     :language: python
70
71 Le résultat de l'exécution de ces commandes dans SALOME (que ce soit par la
72 commande "*shell*" de SALOME, dans une console Python SALOME de l'interface, ou
73 par le menu d'exécution d'un script) est le suivant :
74
75 .. literalinclude:: scripts/tui_example_01.res
76
77 Création détaillée d'un cas de calcul TUI ADAO
78 ++++++++++++++++++++++++++++++++++++++++++++++
79
80 On décrit ici plus en détail les différentes étapes de création d'un cas de
81 calcul TUI ADAO. Les commandes elles-mêmes sont détaillées juste après dans
82 l':ref:`subsection_tui_commands`. On maintient l'indication ``[...]`` de lignes
83 précédentes ou suivantes pour insister sur le fait que ces commandes peuvent
84 être insérées au milieu d'un flot complet de scripting Python pour une étude
85 réelle.
86
87 La création et l'initialisation d'une étude se font par les commandes
88 suivantes, le nom ``case`` de l'objet du cas de calcul TUI ADAO étant
89 quelconque, au choix de l'utilisateur :
90
91 .. code-block:: python
92
93     [...]
94     from numpy import array
95     from adao import adaoBuilder
96     case = adaoBuilder.New()
97     [...]
98
99 Il est recommandé d'importer par principe le module ``numpy`` ou ses
100 constructeurs particuliers comme celui d'``array``, pour faciliter ensuite son
101 usage dans les commandes elles-mêmes.
102
103 Ensuite, le cas doit être construit par une préparation et un enregistrement
104 des données définissant l'étude. L'ordre de ces commandes n'a pas d'importance,
105 il suffit que les concepts requis par l'algorithme utilisé soient présents. On
106 se reportera à :ref:`section_reference` et à ses sous-parties pour avoir le
107 détail des commandes par algorithme. Ici, on définit successivement
108 l'algorithme d'assimilation de données ou d'optimisation choisi et ses
109 paramètres, puis l'ébauche :math:`\mathbf{x}^b` (nommée ``Background``) et sa
110 covariance d'erreurs :math:`\mathbf{B}` (nommée ``BackgroundError``), et enfin
111 l'observation :math:`\mathbf{y}^o` (nommée ``Observation``) et sa covariance
112 d'erreurs :math:`\mathbf{R}` (nommée ``ObservationError``) :
113
114 .. code-block:: python
115
116     [...]
117     case.set( 'AlgorithmParameters', Algorithm='3DVAR' )
118     #
119     case.set( 'Background',          Vector=[0, 1, 2] )
120     case.set( 'BackgroundError',     ScalarSparseMatrix=1.0 )
121     #
122     case.set( 'Observation',         Vector=array([0.5, 1.5, 2.5]) )
123     case.set( 'ObservationError',    DiagonalSparseMatrix='1 1 1' )
124     [...]
125
126 On remarque que l'on peut donner, en entrée des quantités vectorielles ou
127 matricielles, des objets de type ``str``, ``list`` ou ``tuple`` de Python, ou
128 de type ``array`` ou ``matrix`` de Numpy. Dans ces deux derniers cas, il faut
129 simplement importer le module Numpy avant.
130
131 On doit ensuite définir les opérateurs :math:`H` d'observation et
132 éventuellement :math:`M` d'évolution. Dans tous les cas, linéaire ou
133 non-linéaire, on peut les définir comme des fonctions. Dans le cas simple d'un
134 opérateur linéaire, on peut aussi le définir à l'aide de la matrice qui
135 correspond à l'opérateur linéaire. Dans le cas présent le plus simple
136 d'opérateur linéaire, on utilise la syntaxe suivante pour un opérateur de
137 :math:`\mathbf{R}^3` sur lui-même :
138
139 .. code-block:: python
140
141     [...]
142     case.set( 'ObservationOperator', Matrix = "1 0 0;0 2 0;0 0 3")
143     [...]
144
145 Dans le cas beaucoup plus courant d'un opérateur non-linéaire de
146 :math:`\mathbf{R}^n` dans  :math:`\mathbf{R}^p`, il doit être préalablement
147 disponible sous la forme d'une fonction Python, connue dans l'espace de nommage
148 courant, qui prend en entrée un vecteur Numpy (ou une liste ordonnée) de taille
149 :math:`n` et qui restitue en sortie un vecteur Numpy de taille :math:`p`.
150 Lorsque seul l'opérateur non-linéaire est défini par l'argument
151 "*OneFunction*", son adjoint est directement établi de manière numérique et il
152 est paramétrable par l'argument "*Parameters*". L'exemple suivant montre une
153 fonction ``simulation`` (qui réalise ici le même opérateur linéaire que
154 ci-dessus) et l'enregistre dans le cas ADAO :
155
156 .. code-block:: python
157
158     [...]
159     import numpy
160     def simulation(x):
161         "Fonction de simulation H pour effectuer Y=H(X)"
162         import numpy
163         __x = numpy.ravel(x)
164         __H = numpy.diag([1.,2.,3.])
165         return numpy.dot(__H, __x)
166     #
167     case.set( 'ObservationOperator',
168         OneFunction = simulation,
169         Parameters  = {"DifferentialIncrement":0.01},
170         )
171     [...]
172
173 Pour connaître les résultats intermédiaire ou finaux du calcul du cas, on peut
174 ajouter des "*observer*", qui permettent d'associer l'exécution d'un script à
175 une variable intermédiaire ou finale du calcul. On se reportera à la
176 description de la manière d':ref:`section_advanced_observer`, et à la
177 :ref:`section_reference` pour savoir quelles sont les quantités observables.
178 Cette association d'"*observer*" avec une quantité existante se fait de manière
179 similaire à la définition des données du calcul :
180
181 .. code-block:: python
182
183     [...]
184     case.set( 'Observer', Variable="Analysis", Template="ValuePrinter" )
185     [...]
186
187 Enfin, lorsque toutes les informations requises sont disponibles dans le cas
188 ``case`` de calcul ADAO, on peut en demander l'exécution de manière très
189 simple dans l'environnement de l'interpréteur Python :
190
191 .. code-block:: python
192
193     [...]
194     case.execute()
195     [...]
196
197 Au final, on obtient le script très compact proposé précédemment dans
198 :ref:`subsection_tui_example`.
199
200 Fournir des données ou informations de calcul plus complexes
201 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
202
203 Une telle interface s'écrivant en Python, il est possible d'utiliser toute la
204 puissance du langage pour entrer des données plus complexes qu'une déclaration
205 explicite.
206
207 L'enregistrement des données d'entrées supporte différents types de variables,
208 mais surtout, ces entrées peuvent recevoir des variables courantes disponibles
209 dans l'espace de nommage du script. Il est donc aisé d'utiliser des variables
210 calculées préalablement ou obtenues par l'import de scripts "utilisateur". Si
211 par exemple les observations sont disponibles sous la forme d'une liste dans un
212 fichier Python externe nommé ``observations.py`` sous le nom ``someTable``, il
213 suffit de réaliser les opérations suivantes pour enregistrer les observations
214 dans le cas de calcul TUI ADAO :
215
216 .. code-block:: python
217
218     [...]
219     from observations import someTable
220     case.set( 'Observation', Vector=someTable )
221     [...]
222
223 La première ligne importe la variable ``someTable`` depuis le fichier externe,
224 et la seconde enregistre directement cette table comme la donnée
225 "*Observation*".
226
227 La simplicité de cet enregistrement montre bien la facilité d'obtenir les
228 données de calcul depuis des sources externes, fichiers ou flux informatiques
229 atteignables en Python. Comme d'habitude, il est recommandé à l'utilisateur de
230 vérifier ses données avant de les enregistrer dans le cas de calcul TUI ADAO
231 pour éviter les erreurs compliquées à corriger.
232
233 Obtenir et utiliser les résultats de calcul de manière plus riche
234 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
235
236 De la même manière, il est possible d'obtenir et traiter les résultats de
237 calcul de manière plus riche, pour enchaîner sur des post-traitements après le
238 calcul en TUI.
239
240 Les variables de résultats de calcul, ou les variables internes issues de
241 l'optimisation ou de l'assimilation de données, sont disponibles à travers la
242 méthode ``get`` du cas de calcul TUI ADAO, qui renvoie un objet de type liste
243 de la variable demandée. On se reportera aux
244 :ref:`section_ref_output_variables` pour une description détaillée sur ce
245 sujet.
246
247 A titre d'exemple, on donne quelques lignes de script qui permettent d'obtenir
248 le nombre d'itérations de l'optimisation et la valeur optimale ainsi que sa
249 taille :
250
251 .. code-block:: python
252
253     [...]
254     print("")
255     print("    Nombre d'iterations : %i"%len(case.get("CostFunctionJ")))
256     Xa = case.get("Analysis")
257     print("    Analyse optimale    : %s"%(Xa[-1],))
258     print("    Taille de l'analyse : %i"%len(Xa[-1]))
259     print("")
260     [...]
261
262 Ces lignes peuvent être très simplement additionnées à l'exemple initial de cas
263 de calcul TUI ADAO proposé dans :ref:`subsection_tui_example`.
264
265 De même que pour l'entrée des données, la simplicité de récupération des
266 résultats permet d'envisager aisément des post-traitements enchaînés dans
267 SALOME, pour utiliser par exemple de la visualisation avec MatPlotLib ou
268 PARAVIS [PARAVIS]_, de l'adaptation de maillage avec HOMARD [HOMARD]_, ou pour
269 d'autres calculs.
270
271 .. _subsection_tui_commands:
272
273 Ensemble des commandes disponibles en interface textuelle TUI
274 -------------------------------------------------------------
275
276 Dans l'interface TUI du module ADAO, on suit les conventions et recommandations
277 courantes en Python pour la distinction entre ce qui est public, et ce qui est
278 privé ou réservé car relevant des détails d'implémentation. De manière
279 pratique, tout nom d'objet ou de fonction commençant par au moins un signe "_"
280 est privé au sens courant de programmation ("*private*"). Néanmoins, l'absence
281 d'un tel signe au début d'un nom ne le désigne pas comme public. De manière
282 générale, en Python, et contrairement à d'autres langages, on peut accéder aux
283 objets ou aux fonctions privés. Cela peut parfois être utile, mais un tel usage
284 dans vos codes conduira à des plantages sans avertissement lors de futures
285 versions. Il est donc fortement recommandé de ne pas le faire.
286
287 Pour clarifier et faciliter l'utilisation du module pour du script, **cette
288 section définit donc l'interface de programmation (API) textuelle publique pour
289 l'utilisateur (TUI) de manière complète et limitative**. L'usage en script
290 d'objets ou fonctions ADAO autres que ceux qui sont définis ici est fortement
291 déconseillé, car cela conduira vraisemblablement à des plantages sans
292 avertissement lors de futures versions.
293
294 Syntaxes d'appel équivalentes pour les commandes TUI
295 ++++++++++++++++++++++++++++++++++++++++++++++++++++
296
297 La définition des données lors de la création de cas de calcul TUI ADAO
298 supporte **deux syntaxes entièrement équivalentes**. On peut :
299
300 - soit utiliser la commande ``set`` et comme premier argument le concept
301   ``XXXXX`` sur lequel appliquer la commande dont les arguments suivent,
302 - soit utiliser la commande ``setXXXXX`` contenant les arguments de la commande
303   à appliquer.
304
305 Pour illustrer cette équivalence, on prend l'exemple des deux commandes
306 suivantes qui conduisent au même résultat::
307
308     case.set( 'Background', Vector=[0, 1, 2] )
309
310 et::
311
312     case.setBackground( Vector=[0, 1, 2] )
313
314 Le choix de l'une ou l'autre des syntaxes est librement laissé à l'utilisateur,
315 selon son contexte d'usage. Dans la suite, par souci de clarté, on définit les
316 commandes selon la seconde syntaxe.
317
318 Création d'un cas de calcul en interface textuelle TUI
319 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
320
321 La création et l'initialisation d'un cas de calcul en interface textuelle TUI
322 se font en important le module d'interface "*adaoBuilder*" et en invoquant sa
323 méthode "*New()*" comme illustré dans les quelques lignes suivantes (le nom
324 ``case`` de l'objet étant quelconque, au choix de l'utilisateur) :
325
326 .. code-block:: python
327
328     [...]
329     from numpy import array
330     from adao import adaoBuilder
331     case = adaoBuilder.New()
332     [...]
333
334 Il est recommandé par principe de toujours importer le module ``numpy`` (ou ses
335 constructeurs particuliers, comme celui d'``array``) pour faciliter ensuite son
336 usage dans les commandes elles-mêmes.
337
338 Définir les données de calcul
339 +++++++++++++++++++++++++++++
340
341 Les commandes qui suivent permettent de définir les données d'un cas de calcul
342 TUI ADAO. Le pseudo-type des arguments est similaire et compatible avec ceux
343 des entrées en interface GUI, décrits dans la section des
344 :ref:`section_reference_entry` et en particulier par la
345 :ref:`section_ref_entry_types`. La vérification de l'adéquation des grandeurs
346 se fait soit lors de leur définition, soit lors de l'exécution.
347
348 .. index:: single: Stored
349
350 Dans chaque commande, le mot-clé booléen "*Stored*" permet d'indiquer si l'on
351 veut éventuellement stocker la grandeur définie, pour en disposer en cours de
352 calcul ou en sortie. Le choix par défaut est de ne pas stocker, et il est
353 recommandé de conserver cette valeur par défaut. En effet, pour un cas de
354 calcul TUI, on dispose déjà souvent des grandeurs données en entrées qui sont
355 présentes dans l'espace de nommage courant du cas.
356
357 Les commandes disponibles sont les suivantes :
358
359 .. index:: single: set
360
361 **set** (*Concept,...*)
362     Cette commande permet de disposer d'une syntaxe équivalente pour toutes les
363     commandes de ce paragraphe. Son premier argument est le nom du concept à
364     définir (par exemple "*Background*" ou "*ObservationOperator*"), sur lequel
365     s'applique ensuite les arguments qui suivent, qui sont les mêmes que dans
366     les commandes individuelles précédentes. Lors de l'usage de cette commande,
367     il est indispensable de nommer les arguments (par exemple "*Vector=...*").
368
369 .. index:: single: Background
370 .. index:: single: setBackground
371
372 **setBackground** (*Vector, VectorSerie, Script, DataFile, ColNames, ColMajor, Stored*)
373     Cette commande permet de définir l'ébauche :math:`\mathbf{x}^b`. Selon les
374     algorithmes, on peut la définir comme un vecteur simple par "*Vector*", ou
375     comme une liste de vecteurs par "*VectorSerie*". Si on la définit par un
376     script dans "*Script*", le vecteur est de type "*Vector*" (par défaut) ou
377     "*VectorSerie*" selon que l'une de ces variables est placée à "*True*". Si
378     on utilise un fichier de données par "*DataFile*" (en sélectionnant, en
379     colonne par défaut ou en ligne selon "*ColMajor*", toutes les variables par
380     défaut ou celles de la liste "*ColNames*"), le vecteur est de type
381     "*Vector*".
382
383 .. index:: single: BackgroundError
384 .. index:: single: setBackgroundError
385
386 **setBackgroundError** (*Matrix, ScalarSparseMatrix, DiagonalSparseMatrix, Script, Stored*)
387     Cette commande permet de définir la matrice :math:`\mathbf{B}` de
388     covariance des erreurs d'ébauche. La matrice peut être définie de manière
389     complète par le mot-clé "*Matrix*", ou de manière parcimonieuse, comme une
390     matrice diagonale dont on donne la variance unique sur la diagonale par
391     "*ScalarSparseMatrix*", ou comme une matrice diagonale dont on donne le
392     vecteur des variances situé sur la diagonale par "*DiagonalSparseMatrix*".
393     Si on la définit par un script dans "*Script*", la matrice est de type
394     "*Matrix*" (par défaut), "*ScalarSparseMatrix*" ou "*DiagonalSparseMatrix*"
395     selon que l'une de ces variables est placée à "*True*".
396
397 .. index:: single: CheckingPoint
398 .. index:: single: setCheckingPoint
399
400 **setCheckingPoint** (*Vector, VectorSerie, Script, DataFile, ColNames, ColMajor, Stored*)
401     Cette commande permet de définir un point courant :math:`\mathbf{x}`
402     utilisé pour un algorithme de vérification. Selon les algorithmes, on peut
403     le définir comme un vecteur simple par "*Vector*", ou comme une liste de
404     vecteurs par "*VectorSerie*". Si on le définit par un script dans
405     "*Script*", le vecteur est de type "*Vector*" (par défaut) ou
406     "*VectorSerie*" selon que l'une de ces variables est placée à "*True*". Si
407     on utilise un fichier de données par "*DataFile*" (en sélectionnant, en
408     colonne par défaut ou en ligne selon "*ColMajor*", toutes les variables par
409     défaut ou celles de la liste "*ColNames*"), le vecteur est de type
410     "*Vector*".
411
412 .. index:: single: ControlModel
413 .. index:: single: setControlModel
414 .. index:: single: ExtraArguments
415
416 **setControlModel** (*Matrix, OneFunction, ThreeFunctions, Parameters, Script, ExtraArguments, Stored*)
417     Cette commande permet de définir l'opérateur de contrôle :math:`O`, qui
418     décrit un contrôle d'entrée linéaire externe de l'opérateur d'évolution ou
419     d'observation. On se reportera :ref:`section_ref_operator_control`. Sa
420     valeur est définie comme un objet de type fonction ou de type "*Matrix*".
421     Dans le cas d'une fonction, différentes formes fonctionnelles peuvent être
422     utilisées, comme décrit dans la section
423     :ref:`section_ref_operator_requirements`, et entrées par les mots-clés
424     "*OneFunction*" ou "*ThreeFunctions*". Dans le cas d'une définition par
425     "*Script*", l'opérateur est de type "*Matrix*", "*OneFunction*" ou
426     "*ThreeFunctions*" selon que l'une de ces variables est placée à "*True*".
427     Les paramètres de contrôle de l'approximation numérique de l'opérateur
428     adjoint, dans le cas "*OneFunction*", peuvent être renseignés par un
429     dictionnaire à travers le mot-clé "*Parameters*". Les entrées potentielles
430     de ce dictionnaire de paramètres sont "*DifferentialIncrement*",
431     "*CenteredFiniteDifference*" (similaires à celles de l'interface
432     graphique). Si l'opérateur nécessite des arguments fixes complémentaires,
433     ils peuvent être fournis par la variable "*ExtraArguments*" sous la forme
434     d'un dictionnaire de paramètres nommés.
435
436 .. index:: single: ControlInput
437 .. index:: single: setControlInput
438
439 **setControlInput** (*Vector, VectorSerie, Script, DataFile, ColNames, ColMajor, Stored*)
440     Cette commande permet de définir le vecteur de contrôle :math:`\mathbf{u}`.
441     Selon les algorithmes, on peut le définir comme un vecteur simple par
442     "*Vector*", ou comme une liste de vecteurs par "*VectorSerie*". Si on le
443     définit par un script dans "*Script*", le vecteur est de type "*Vector*"
444     (par défaut) ou "*VectorSerie*" selon que l'une de ces variables est placée
445     à "*True*". Si on utilise un fichier de données par "*DataFile*" (en
446     sélectionnant, en colonne par défaut ou en ligne selon "*ColMajor*", toutes
447     les variables par défaut ou celles de la liste "*ColNames*"), le vecteur
448     est de type "*Vector*".
449
450 .. index:: single: EvolutionError
451 .. index:: single: setEvolutionError
452
453 **setEvolutionError** (*Matrix, ScalarSparseMatrix, DiagonalSparseMatrix, Script, Stored*)
454     Cette commande permet de définir la matrice :math:`\mathbf{Q}` de
455     covariance des erreurs d'évolution. La matrice peut être définie de manière
456     complète par le mot-clé "*Matrix*", ou de manière parcimonieuse, comme une
457     matrice diagonale dont on donne la variance unique sur la diagonale par
458     "*ScalarSparseMatrix*", ou comme une matrice diagonale dont on donne le
459     vecteur des variances situé sur la diagonale par "*DiagonalSparseMatrix*".
460     Si on la définit par un script dans "*Script*", la matrice est de type
461     "*Matrix*" (par défaut), "*ScalarSparseMatrix*" ou "*DiagonalSparseMatrix*"
462     selon que l'une de ces variables est placée à "*True*".
463
464 .. index:: single: EvolutionModel
465 .. index:: single: setEvolutionModel
466 .. index:: single: ExtraArguments
467
468 **setEvolutionModel** (*Matrix, OneFunction, ThreeFunctions, Parameters, Script, ExtraArguments, Stored*)
469     Cette commande permet de définir l'opérateur d'evolution :math:`M`, qui
470     décrit un pas élémentaire d'évolution de l'état :math:`\mathbf{x}`. Sa
471     valeur est définie comme un objet de type fonction ou de type "*Matrix*".
472     Dans le cas d'une fonction, différentes formes fonctionnelles peuvent être
473     utilisées, comme décrit dans la section
474     :ref:`section_ref_operator_requirements`, et entrées par les mots-clés
475     "*OneFunction*" ou "*ThreeFunctions*". Dans le cas d'une définition par
476     "*Script*", l'opérateur est de type "*Matrix*", "*OneFunction*" ou
477     "*ThreeFunctions*" selon que l'une de ces variables est placée à "*True*".
478     Les paramètres de contrôle de l'approximation numérique de l'opérateur
479     adjoint, dans le cas "*OneFunction*", peuvent être renseignés par un
480     dictionnaire dans "*Parameters*". Les entrées potentielles de ce
481     dictionnaire de paramètres sont "*DifferentialIncrement*",
482     "*CenteredFiniteDifference*", "*EnableMultiProcessing*",
483     "*NumberOfProcesses*" (similaires à celles de l'interface graphique). Si
484     l'opérateur nécessite des paramètres fixes complémentaires en plus de
485     l'état :math:`\mathbf{x}`, ils peuvent être fournis par la variable
486     "*ExtraArguments*" sous la forme d'un dictionnaire de paramètres nommés.
487
488 .. index:: single: Observation
489 .. index:: single: setObservation
490
491 **setObservation** (*Vector, VectorSerie, Script, DataFile, ColNames, ColMajor, Stored*)
492     Cette commande permet de définir le vecteur d'observation
493     :math:`\mathbf{y}^o`. Selon les algorithmes, on peut le définir comme un
494     vecteur simple par "*Vector*", ou comme une liste de vecteurs par
495     "*VectorSerie*". Si on le définit par un script dans "*Script*", le vecteur
496     est de type "*Vector*" (par défaut) ou "*VectorSerie*" selon que l'une de
497     ces variables est placée à "*True*". Si on utilise un fichier de données
498     par "*DataFile*" (en sélectionnant, en colonne par défaut ou en ligne selon
499     "*ColMajor*", toutes les variables par défaut ou celles de la liste
500     "*ColNames*"), le vecteur est de type "*Vector*".
501
502 .. index:: single: ObservationError
503 .. index:: single: setObservationError
504
505 **setObservationError** (*Matrix, ScalarSparseMatrix, DiagonalSparseMatrix, Script, Stored*)
506     Cette commande permet de définir la matrice :math:`\mathbf{R}` de
507     covariance des erreurs d'observation. La matrice peut être définie de
508     manière complète par le mot-clé "*Matrix*", ou de manière parcimonieuse,
509     comme une matrice diagonale dont on donne la variance unique sur la
510     diagonale par "*ScalarSparseMatrix*", ou comme une matrice diagonale dont
511     on donne le vecteur des variances situé sur la diagonale par
512     "*DiagonalSparseMatrix*". Si on la définit par un script dans "*Script*",
513     la matrice est de type "*Matrix*" (par défaut), "*ScalarSparseMatrix*" ou
514     "*DiagonalSparseMatrix*" selon que l'une de ces variables est placée à
515     "*True*".
516
517 .. index:: single: ObservationOperator
518 .. index:: single: setObservationOperator
519 .. index:: single: ExtraArguments
520
521 **setObservationOperator** (*Matrix, OneFunction, ThreeFunctions, AppliedInXb, Parameters, Script, ExtraArguments, Stored*)
522     Cette commande permet de définir l'opérateur d'observation :math:`H`, qui
523     transforme les paramètres d'entrée :math:`\mathbf{x}` en résultats
524     :math:`\mathbf{y}` qui sont à comparer aux observations
525     :math:`\mathbf{y}^o`. Sa valeur est définie comme un objet de type fonction
526     ou de type "*Matrix*". Dans le cas d'une fonction, différentes formes
527     fonctionnelles peuvent être utilisées, comme décrit dans la section
528     :ref:`section_ref_operator_requirements`, et entrées par les mots-clés
529     "*OneFunction*" ou "*ThreeFunctions*". Dans le cas d'une définition par
530     "*Script*", l'opérateur est de type "*Matrix*", "*OneFunction*" ou
531     "*ThreeFunctions*" selon que l'une de ces variables est placée à "*True*".
532     Dans le cas où l'opérateur :math:`H` évalué en :math:`\mathbf{x}^b` est
533     disponible, il peut être donné en utilisant "*AppliedInXb*" et sera
534     considéré comme un vecteur. Les paramètres de contrôle de l'approximation
535     numérique de l'opérateur adjoint, dans le cas "*OneFunction*", peuvent être
536     renseignés par un dictionnaire dans "*Parameters*". Les entrées
537     potentielles de ce dictionnaire de paramètres sont
538     "*DifferentialIncrement*", "*CenteredFiniteDifference*",
539     "*EnableMultiProcessing*", "*NumberOfProcesses*" (similaires à celles de
540     l'interface graphique). Si l'opérateur nécessite des paramètres fixes
541     complémentaires en plus de l'état :math:`\mathbf{x}`, ils peuvent être
542     fournis par la variable "*ExtraArguments*" sous la forme d'un dictionnaire
543     de paramètres nommés.
544
545 Paramétrer le calcul, les sorties, etc.
546 +++++++++++++++++++++++++++++++++++++++
547
548 .. index:: single: AlgorithmParameters
549 .. index:: single: setAlgorithmParameters
550
551 **setAlgorithmParameters** (*Algorithm, Parameters, Script*)
552     Cette commande permet de choisir l'algorithme de calcul ou de vérification
553     par l'argument "*Algorithm*" sous la forme d'un nom d'algorithme (on se
554     reportera utilement aux listes des :ref:`section_reference_assimilation` et
555     des :ref:`section_reference_checking`), et de définir les paramètres de
556     calcul par l'argument "*Parameters*". Dans le cas d'une définition par
557     "*Script*", le fichier indiqué doit contenir les deux variables
558     "*Algorithm*" et "*Parameters*" (ou "*AlgorithmParameters*" de manière
559     équivalente).
560
561 .. index:: single: setName
562
563 **setName** (*String*)
564     Cette commande permet de donner un titre court au cas de calcul.
565
566 .. index:: single: setDirectory
567
568 **setDirectory** (*String*)
569     Cette commande permet d'indiquer le répertoire courant d'exécution.
570
571 .. index:: single: setDebug
572
573 **setDebug** ()
574     Cette commande permet d'activer le mode d'information détaillé lors de
575     l'exécution.
576
577 .. index:: single: setNoDebug
578
579 **setNoDebug** ()
580     Cette commande permet de désactiver le mode d'information détaillé lors de
581     l'exécution.
582
583 .. index:: single: Observer
584 .. index:: single: Observer Template
585 .. index:: single: setObserver
586 .. index:: single: setObserver Template
587
588 **setObserver** (*Variable, Template, String, Script, Info*)
589     Cette commande permet de définir un *observer* sur une variable courante ou
590     finale du calcul. On se reportera à la description des
591     :ref:`section_ref_observers_requirements` pour avoir leur liste et leur
592     format, et à la :ref:`section_reference` pour savoir quelles sont les
593     quantités observables. On définit comme un "*String*" le corps de la
594     fonction d'un *observer*, en utilisant une chaîne de caractères incluant si
595     nécessaire des sauts de lignes. On recommande d'utiliser les patrons
596     disponibles par l'argument "*Template*". Dans le cas d'une définition par
597     "*Script*", le fichier indiqué doit contenir uniquement le corps de la
598     fonction, comme décrit dans les :ref:`section_ref_observers_requirements`.
599     La variable "*Info*" contient une chaîne de caractère d'information ou une
600     chaine vide.
601
602 .. index:: single: UserPostAnalysis
603 .. index:: single: UserPostAnalysis Template
604 .. index:: single: setUserPostAnalysis
605 .. index:: single: setUserPostAnalysis Template
606
607 **setUserPostAnalysis** (*Template, String, Script*)
608     Cette commande permet de définir le traitement des paramètres ou des
609     résultats après le déroulement de l'algorithme de calcul. Sa valeur est
610     définie soit par un nom de patron prédéfini, soit par un nom de fichier
611     script, soit par une chaîne de caractères. Cela permet de produire
612     directement du code de post-processing dans un cas ADAO. On peut d'utiliser
613     les patrons disponibles par l'argument "*Template*" (qui peut valoir
614     "*AnalysisPrinter*", "*AnalysisSaver*" et "*AnalysisPrinterAndSaver*").
615     Dans le cas d'une définition par "*Script*", le fichier indiqué doit
616     contenir uniquement les commandes que l'on aurait pu mettre à la suite de
617     l'exécution du calcul. On se reportera à la description des
618     :ref:`section_ref_userpostanalysis_requirements` pour avoir la liste des
619     modèles et leur format. Remarque importante : ce traitement n'est exécuté
620     que lorsque le cas est exécuté en TUI ou exporté en YACS.
621
622 Effectuer le calcul
623 +++++++++++++++++++
624
625 .. index:: single: execute
626 .. index:: single: Executor
627 .. index:: single: SaveCaseInFile
628 .. index:: single: nextStep
629
630 **execute** (*Executor, SaveCaseInFile, nextStep*)
631     Cette commande lance le calcul complet dans l'environnement d'exécution
632     choisi par le mot-clé *Executor*, qui est défini par défaut selon
633     l'environnement de lancement. Cet environnement peut être celui de
634     l'interpréteur Python, sans interaction avec YACS (demandé par la valeur
635     "*Python*"), ou celui de YACS (demandé par la valeur "*YACS*" [YACS]_). Si
636     un fichier est indiqué dans le mot-clé *SaveCaseInFile*, il sera utilisé
637     pour enregistrer la version associée du fichier de commande pour
638     l'environnement d'exécution requis. Le mot-clé booléen "*nextStep*" indique
639     que l'exécution repart du résultat de la précédente exécution sans la
640     stocker (valeur "*True*") ou non (valeur "*False*", par défaut). Lors de
641     l'exécution, les sorties courantes (standard et d'erreur) sont celles de
642     l'environnement choisi. On dispose si nécessaire (ou si possible) du
643     parallélisme interne des algorithmes dans ADAO, du parallélisme de YACS, et
644     du parallélisme interne du ou des codes de simulation utilisés.
645
646 Obtenir séparément les résultats de calcul
647 ++++++++++++++++++++++++++++++++++++++++++
648
649 .. index:: single: get
650
651 **get** (*Concept*)
652     Cette commande permet d'extraire explicitement les variables disponibles en
653     sortie du cas de calcul TUI ADAO pour les utiliser dans la suite du
654     scripting, par exemple en visualisation. Elle a pour argument le nom d'un
655     variable dans "*Concept*", et renvoie en retour la grandeur sous la forme
656     d'une liste (même s'il n'y en a qu'un exemplaire) de cette variable de
657     base. Pour connaître la liste des variables et les utiliser, on se
658     reportera à l':ref:`subsection_r_o_v_Inventaire`, et plus généralement à la
659     fois aux :ref:`section_ref_output_variables` et aux documentations
660     individuelles des algorithmes.
661
662 Enregistrer, charger ou convertir les commandes de cas de calcul
663 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
664
665 L'enregistrement ou le chargement d'un cas de calcul concernent les quantités
666 et les actions qui lui sont liées par les commandes précédentes, à l'exclusion
667 d'opérations externes au cas (comme par exemple le post-processing qui peut
668 être développé après le cas de calcul). Les commandes enregistrées ou chargées
669 restent néanmoins parfaitement compatibles avec ces opérations en Python
670 externes au cas.
671
672 .. index:: single: load
673 .. index:: single: FileName
674 .. index:: single: Content
675 .. index:: single: Object
676 .. index:: single: Formater
677
678 **load** (*FileName, Content, Object, Formater*)
679     Cette commande permet de lire ou charger un cas d'étude, à partir d'un
680     fichier "*FileName*" ou d'un contenu en mémoire par "*Content*" ou
681     "*Object*". Le mot-clé "*Formater*" peut désigner le format "*TUI*" pour
682     les commandes du type interface de programmation textuelle (défaut), et le
683     format "*COM*" pour les commandes du type COMM provenant de l'interface
684     ADAO de type EFICAS.
685
686 .. index:: single: dump
687
688 **dump** (*FileName, Formater*)
689     Cette commande permet d'enregistrer, dans un fichier "*FileName*", les
690     commandes du cas d'étude en cours. Le mot-clé "*Formater*" peut désigner
691     les formats "*TUI*" pour les commandes du type interface de programmation
692     textuelle (défaut), et "*YACS*" pour les commandes du type YACS.
693
694 .. index:: single: convert
695 .. index:: single: FileNameFrom
696 .. index:: single: ContentFrom
697 .. index:: single: ObjectFrom
698 .. index:: single: FormaterFrom
699 .. index:: single: FileNameTo
700 .. index:: single: FormaterTo
701
702 **convert** (*FileNameFrom, ContentFrom, ObjectFrom, FormaterFrom, FileNameTo, FormaterTo*)
703     Cette commande permet de convertir directement d'un format reconnu à un
704     autre les commandes établissant le cas de calcul en cours. Certains
705     formats ne sont disponibles qu'en entrée ou qu'en sortie.
706
707 Obtenir des informations sur le cas, le calcul ou le système
708 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
709
710 On peut obtenir de manière simple une **information agrégée sur le cas
711 d'étude** tel que défini par l'utilisateur, en utilisant directement la
712 commande "*print*" de Python sur le cas, à n'importe quelle étape lors de sa
713 construction. Par exemple :
714
715 .. literalinclude:: scripts/tui_example_07.py
716     :language: python
717
718 dont le résultat est ici :
719
720 .. literalinclude:: scripts/tui_example_07.res
721
722 .. index:: single: callinfo
723
724 Une **information synthétique sur le nombre d'appels aux calculs d'opérateurs**
725 peut être dynamiquement obtenue par la commande "**callinfo()**". Ces calculs
726 d'opérateurs sont ceux définis par l'utilisateur dans un cas ADAO, pour les
727 opérateurs d'observation et d'évolution. Elle s'utilise après l'exécution du
728 calcul dans le cas ADAO, sachant que le résultat de cette commande est
729 simplement vide lorsqu'aucun calcul n'a été effectué :
730 ::
731
732     from adao import adaoBuilder
733     case = adaoBuilder.New()
734     ...
735     case.execute()
736     print(case.callinfo())
737
738 .. index:: single: sysinfo
739
740 Une **information synthétique sur le système** peut être obtenue par la
741 commande "**sysinfo()**", présente dans chaque cas de calcul ADAO. Elle
742 retourne dynamiquement des informations système et des détails sur les modules
743 Python utiles pour ADAO. Elle s'utilise de la manière suivante :
744 ::
745
746     from adao import adaoBuilder
747     case = adaoBuilder.New()
748     print(case.sysinfo())
749
750 .. _subsection_tui_advanced:
751
752 Exemples plus avancés de cas de calcul TUI ADAO
753 -----------------------------------------------
754
755 On propose ici des exemples plus complets de cas de calcul TUI ADAO, en donnant
756 l'objectif de l'exemple et un jeu de commandes qui permet de parvenir à cet
757 objectif.
758
759 Exploitation indépendante des résultats d'un cas de calcul
760 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
761
762 L'objectif est d'effectuer en TUI la mise en données d'un cas de calcul ADAO,
763 son exécution, puis la récupération des résultats pour ensuite enchaîner sur
764 une exploitation indépendante de ces résultats (cette dernière n'étant pas
765 décrite ici, puisque dépendante de l'utilisateur).
766
767 Les hypothèses du cas utilisateur sont les suivantes. On suppose :
768
769 #. que l'on veut recaler 3 paramètres ``alpha``, ``beta`` et ``gamma`` dans un domaine borné,
770 #. que l'on dispose d'observations nommées ``observations``,
771 #. que l'utilisateur dispose en Python d'une fonction de simulation physique appelée ``simulation``, préalablement (bien) testée, qui transforme les 3 paramètres en résultats similaires aux observations,
772 #. que l'exploitation indépendante, que l'utilisateur veut faire, est représentée ici par l'affichage simple de l'état initial, de l'état optimal, de la simulation en ce point, des états intermédiaires et du nombre d'itérations d'optimisation.
773
774 Pour effectuer de manière simple cet essai de cas de calcul TUI, on se place
775 dans un cas d'expériences jumelles (pour mémoire, voir la démarche
776 :ref:`section_methodology_twin`). Pour cela, on se donne par exemple les
777 entrées suivantes, parfaitement arbitraires, en construisant les observations
778 par simulation. Puis on résout le problème de recalage par le jeu de commandes
779 qui vient ensuite. Au final, l'ensemble du problème est posé et résolu par le
780 script suivant :
781
782 .. literalinclude:: scripts/tui_example_11.py
783     :language: python
784
785 L'exécution de jeu de commandes donne les résultats suivants :
786
787 .. literalinclude:: scripts/tui_example_11.res
788
789 Comme il se doit en expériences jumelles, avec une confiance majoritairement
790 placée dans les observations, on constate que l'on retrouve bien les paramètres
791 qui ont servi à construire artificiellement les observations.
792
793 .. Réconciliation de courbes à l'aide de MedCoupling
794 .. +++++++++++++++++++++++++++++++++++++++++++++++++
795
796 .. Utilisation de fonctions de surveillance de type "observer"
797 .. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
798
799 .. Equivalences entre l'interface graphique (GUI) et l'interface textuelle (TUI)
800 .. -----------------------------------------------------------------------------
801
802 .. [HOMARD] Pour de plus amples informations sur HOMARD, voir le *module HOMARD* et son aide intégrée disponible dans le menu principal *Aide* de l'environnement SALOME.
803
804 .. [PARAVIS] Pour de plus amples informations sur PARAVIS, voir le *module PARAVIS* et son aide intégrée disponible dans le menu principal *Aide* de l'environnement SALOME.
805
806 .. [YACS] Pour de plus amples informations sur YACS, voir le *module YACS* et son aide intégrée disponible dans le menu principal *Aide* de l'environnement SALOME.