]> SALOME platform Git repositories - modules/adao.git/blob - doc/fr/examples.rst
Salome HOME
Merge branch 'V7_main'
[modules/adao.git] / doc / fr / examples.rst
1 .. _section_examples:
2
3 ================================================================================
4 Tutoriaux sur l'utilisation du module ADAO
5 ================================================================================
6
7 .. |eficas_new| image:: images/eficas_new.png
8    :align: middle
9    :scale: 50%
10 .. |eficas_save| image:: images/eficas_save.png
11    :align: middle
12    :scale: 50%
13 .. |eficas_saveas| image:: images/eficas_saveas.png
14    :align: middle
15    :scale: 50%
16 .. |eficas_yacs| image:: images/eficas_yacs.png
17    :align: middle
18    :scale: 50%
19
20 Cette section présente quelques exemples d'utilisation du module ADAO dans
21 SALOME. Le premier montre comment construire un cas simple d'assimilation de
22 données définissant explicitement toutes les données d'entrée requises à travers
23 l'interface graphique d'édition (GUI). Le second montre, sur le même cas,
24 comment définir les données d'entrée à partir de sources externes à travers des
25 scripts. On présente ici toujours des scripts Python car ils sont directement
26 insérables dans les noeuds de script de YACS, mais les fichiers externes peuvent
27 utiliser d'autres langages.
28
29 Les notations mathématiques utilisées ci-dessous sont expliquées dans la section
30 :ref:`section_theory`.
31
32 Construire un cas d'estimation avec une définition explicite des données
33 ------------------------------------------------------------------------
34
35 Cet exemple simple est un cas de démonstration, et il décrit comment mettre au
36 point un environnement d'estimation par BLUE de manière à obtenir un *état
37 estimé par méthode de moindres carrés pondérés* d'un système à partir d'une
38 observation de l'état et d'une connaissance *a priori* (ou ébauche) de cet état.
39 En d'autres termes, on cherche l'intermédiaire pondéré entre les vecteurs
40 d'observation et d'ébauche. Toutes les valeurs numériques de cet exemple sont
41 arbitraires.
42
43 Conditions d'expérience
44 +++++++++++++++++++++++
45
46 On choisit d'opérer dans un espace à 3 dimensions. La 3D est choisie de manière
47 à restreindre la taille des objets numériques à entrer explicitement par
48 l'utilisateur, mais le problème n'est pas dépendant de la dimension et peut être
49 posé en dimension 10, 100, 1000... L'observation :math:`\mathbf{y}^o` vaut 1
50 dans chaque direction, donc::
51
52     Yo = [1 1 1]
53
54 L'ébauche :math:`\mathbf{x}^b` de l'état , qui représente une connaissance *a
55 priori* ou une régularisation mathématique, vaut 0 dans chaque direction, ce qui
56 donne donc::
57
58     Xb = [0 0 0]
59
60 La mise en oeuvre de l'assimilation de données requiert des informations sur les
61 covariances d'erreur :math:`\mathbf{R}` et :math:`\mathbf{B}`, respectivement
62 pour les variables d'observation et d'ébauche. On choisit ici des erreurs
63 décorrélées (c'est-à-dire des matrices diagonales) et d'avoir la même variance
64 de 1 pour toutes les variables (c'est-à-dire des matrices identité). On pose
65 donc::
66
67     B = R = [1 0 0 ; 0 1 0 ; 0 0 1]
68
69 Enfin, on a besoin d'un opérateur d'observation :math:`\mathbf{H}` pour
70 convertir l'état d'ébauche dans l'espace des observations. Ici, comme les
71 dimensions d'espace sont les mêmes, on peut choisir l'identité comme opérateur
72 d'observation::
73
74     H = [1 0 0 ; 0 1 0 ; 0 0 1]
75
76 Avec de tels choix, l'estimateur "Best Linear Unbiased Estimator" (BLUE) sera le
77 vecteur moyen entre :math:`\mathbf{y}^o` et :math:`\mathbf{x}^b`, nommé
78 *analysis*, noté :math:`\mathbf{x}^a`, et valant::
79
80
81     Xa = [0.5 0.5 0.5]
82
83 Pour étendre cet exemple, on peut modifier les variances représentées par
84 :math:`\mathbf{B}` ou :math:`\mathbf{R}` indépendamment, et l'analyse
85 :math:`\mathbf{x}^a` se déplacera vers :math:`\mathbf{y}^o` ou vers
86 :math:`\mathbf{x}^b`, en proportion inverse des variances dans
87 :math:`\mathbf{B}` et :math:`\mathbf{R}`. Comme autre extension, on peut aussi
88 dire qu'il est équivalent de rechercher l'analyse à l'aide d'un algorithme de
89 BLUE ou d'un algorithme de 3DVAR.
90
91 Utiliser l'interface graphique (GUI) pour construire le cas ADAO
92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
93
94 En premier lieu, il faut activer le module ADAO en choisissant le bouton ou le
95 menu approprié de module de SALOME, et on voit :
96
97   .. _adao_activate2:
98   .. image:: images/adao_activate.png
99     :align: center
100     :width: 100%
101   .. centered::
102     **Activation du module ADAO dans SALOME**
103
104 Choisir le bouton "*Nouveau*" dans cette fenêtre. On obtient directement
105 l'interface EFICAS pour la définition de variables, en même temps que l'"*Arbre
106 d'étude*" de SALOME. On peut alors choisir le bouton "*Nouveau*" |eficas_new|
107 pour créer un nouveau cas ADAO, et on voit :
108
109   .. _adao_viewer:
110   .. image:: images/adao_viewer.png
111     :align: center
112     :width: 100%
113   .. centered::
114     **L'éditeur EFICAS pour la définition de cas dans le module ADAO**
115
116 Ensuite, il faut remplir les variables pour construire le cas ADAO en utilisant
117 les conditions d'expérience décrites ci-dessus. L'ensemble des informations
118 techniques données au-dessus sont à insérer directement dans la définition du
119 cas ADAO, en utilisant le type *String* pour toutes les variables. Lorsque la
120 définition du cas est prête, il faut l'enregistrer comme un fichier natif de ype
121 "*JDC (\*.comm)*" à un endroit quelconque dans l'arborescence de l'utilisateur.
122 Il faut bien se rappeler que d'autres fichiers seront aussi créés à côté de ce
123 premier, donc il est judicieux de faire un répertoire spécifique pour ce cas, et
124 d'enregistrer dedans le fichier. Le nom du fichier apparaît dans la fenêtre de
125 l'"*Arbre d'étude*", sous le menu "*ADAO*". La définition finale du cas
126 ressemble à :
127
128   .. _adao_jdcexample01:
129   .. image:: images/adao_jdcexample01.png
130     :align: center
131     :width: 100%
132   .. centered::
133     **Définition des conditions d'expérience choisies pour le cas ADAO**
134
135 Pour poursuivre, on a besoin de générer le schéma YACS à partir de la définition
136 du cas ADAO. Pour faire cela, on peut activer le menu contextuel par click droit
137 sur le nom du cas dans la fenêtre de l'"*Arbre d'étude*", et choisir le
138 sous-menu "*Exporter vers YACS*" (ou le bouton "*Exporter vers YACS*"
139 |eficas_yacs|) comme ci-dessous :
140
141   .. _adao_exporttoyacs00:
142   .. image:: images/adao_exporttoyacs.png
143     :align: center
144     :scale: 75%
145   .. centered::
146     **Sous-menu contextuel "*Exporter vers YACS*" pour générer le schéma YACS à partir du cas ADAO**
147
148 Cette commande conduit à la génération d'un schéma YACS, à l'activation du module
149 YACS dans SALOME, et à ouvrir le nouveau schéma dans l'interface graphique du
150 module YACS [#]_. Après avoir éventuellement réorganisé les noeuds en utilisant
151 le sous-menu contextuel "*arranger les noeuds locaux*" de la vue graphique du
152 schéma YACS, on obtient la représentation suivante du schéma ADAO généré :
153
154   .. _yacs_generatedscheme:
155   .. image:: images/yacs_generatedscheme.png
156     :align: center
157     :width: 100%
158   .. centered::
159     **Schéma YACS généré à partir du cas ADAO**
160
161 Après ce point, toutes les modifications, exécutions et post-processing du
162 schéma d'assimilation de données seront effectués dans le module YACS. De
163 manière à vérifier les résultats d'une manière simple, on crée ici un nouveau
164 noeud YACS en utilisant le sous-menu "*Noeud de script in-line*" dans la vue
165 graphique de YACS, et on le nomme "*PostProcessing*".
166
167 Ce noeud de script va récupérer l'analyse issue de l'assimilation de données
168 depuis le port de sortie "*algoResults*" du bloc de calcul (qui donne accés à un
169 objet Python SALOME), et va l'afficher à la sortie standard.
170
171 Pour obtenir ceci, ce noeud de script doit comporter un port d'entrée de type
172 "*pyobj*", nommé "*results*" par exemple, qui doit être relié graphiquement au
173 port de sortie "*algoResults*" du bloc de calcul. Ensuite, le code pour remplir
174 le noeud de script est::
175
176     Xa = results.ADD.get("Analysis")[-1]
177
178     print
179     print "Analysis =",Xa
180     print
181
182 Le schéma YACS complété peut être enregistré (en écrasant le schéma généré si la
183 commande ou le bouton "*Enregistrer*" sont utilisés, ou sinon avec un nom
184 nouveau par la commande "*Enregistrer sous*"). De manière pratique, la mise au
185 point d'une telle procédure de post-processing peut être réalisée dans YACS pour
186 la tester, et ensuite entièrement enregistrée dans un script Python qui peut
187 être intégré au cas ADAO en utilisant le mot-clé "*UserPostAnalysis*".
188
189 Ensuite, de manière classique dans YACS, le schéma doit être compilé, et ensuite
190 être exécuté. Après la fin de l'exécution, les affichages sur la sortie standard
191 sont disponibles dans la fenêtre "*fenêtre de sortie de YACS*" (ou "*YACS
192 Container Log*"), obtenue par clic droit à l'aide du menu contextuel de la
193 fenêtre "*proc*" du schéma YACS comme montré ci-dessous:
194
195   .. _yacs_containerlog:
196   .. image:: images/yacs_containerlog.png
197     :align: center
198     :width: 100%
199   .. centered::
200     **Menu YACS de la fenêtre de sortie, et boite de dialogue montrant la sortie**
201
202 On vérifie que le résultat est correct en observant si la fenêtre de sortie
203 contient la ligne suivante::
204
205     Analysis = [0.5, 0.5, 0.5]
206
207 comme montré dans l'image précédente.
208
209 Pour étendre cet exemple, on peut remarquer que le même problème résolu par un
210 algorithme de 3DVAR donne le même résultat. Cet algorithme peut être choisi lors
211 de l'étape de construction du cas ADAO, avant d'entrer dans l'étape YACS. Le cas
212 ADAO en 3DVAR est entièrement similaire au cas algorithmique du BLUE, comme
213 montré dans la figure suivante:
214
215   .. _adao_jdcexample02:
216   .. image:: images/adao_jdcexample02.png
217     :align: center
218     :width: 100%
219   .. centered::
220     **Définir un cas ADAO en 3DVAR est entièrement similaire à un cas en BLUE**
221
222 Il n'y a qu'une seule commande qui change, avec "*3DVAR*" dans le champ
223 "*Algorithm*" à la place de "*Blue*".
224
225 Construire un cas d'estimation avec une définition de données externes par scripts
226 ----------------------------------------------------------------------------------
227
228 Il est utile d'acquérir une partie ou la totalité des données depuis une
229 définition externe, en utilisant des scripts Python pour donner accès à ces
230 données. À titre d'exemple, on construit ici un cas ADAO présentant le même
231 dispositif expérimental que dans l'exemple ci-dessus `Construire un cas
232 d'estimation avec une définition explicite des données`_, mais en utilisant des
233 données issues d'un unique fichier script Python externe.
234
235 En premier lieu, on écrit le fichier script suivant, utilisant des noms
236 conventionnels pour les variables requises. Ici toutes les variables sont
237 définies dans le même script, mais l'utilisateur peut choisir de séparer le
238 fichier en plusieurs autres, ou de mélanger une définition explicite des données
239 dans l'interface graphique ADAO et une définition implicite dans des fichiers
240 externes. Le fichier script actuel ressemble à::
241
242     import numpy
243     #
244     # Definition of the Background as a vector
245     # ----------------------------------------
246     Background = [0, 0, 0]
247     #
248     # Definition of the Observation as a vector
249     # -----------------------------------------
250     Observation = "1 1 1"
251     #
252     # Definition of the Background Error covariance as a matrix
253     # ---------------------------------------------------------
254     BackgroundError = numpy.array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])
255     #
256     # Definition of the Observation Error covariance as a matrix
257     # ----------------------------------------------------------
258     ObservationError = numpy.matrix("1 0 0 ; 0 1 0 ; 0 0 1")
259     #
260     # Definition of the Observation Operator as a matrix
261     # --------------------------------------------------
262     ObservationOperator = numpy.identity(3)
263
264 Les noms des variables Python sont obligatoires, de manière à définir les bonnes
265 variables dans le cas, mais le script Python peut être plus conséquent et
266 définir des classes, des fonctions, des accès à des fichiers ou des bases de
267 données, etc. avec des noms différents. De plus, le fichier ci-dessus présente
268 différentes manières de définir des vecteurs ou des matrices, utilisant des
269 listes, des chaînes de caractères (comme dans Numpy ou Octave), des types
270 vecteur ou matrice de Numpy, et des fonctions spéciales de Numpy. Toutes ces
271 syntaxes sont valides.
272
273 Après avoir enregistré ce script dans un fichier (nommé ici "*script.py*" pour
274 l'exemple) à un endroit quelconque dans l'arborescence de l'utilisateur, on
275 utilise l'interface graphique (GUI) pour construire le cas ADAO. La procédure
276 pour compléter le cas est similaire à celle de l'exemple précédent à part le
277 fait que, au lieu de choisir l'option "*String*" pour le mot-clé "*FROM*" de
278 chaque variable, on choisit l'option "*Script*". Cela conduit à une entrée
279 "*SCRIPT_DATA/SCRIPT_FILE*" dans l'arbre graphique, permettant de choisir un
280 fichier de la manière suivante:
281
282   .. _adao_scriptentry01:
283   .. image:: images/adao_scriptentry01.png
284     :align: center
285     :width: 100%
286   .. centered::
287     **Définir une variable d'entrée en utilisant un fichier script externe**
288
289 Les autres étapes et résultats sont exactement les mêmes que dans l'exemple
290 précédent `Construire un cas d'estimation avec une définition explicite des
291 données`_.
292
293 Dans la pratique, cette démarche par scripts est la manière la plus facile pour
294 récupérer des information depuis des calculs en ligne ou préalables, depuis des
295 fichiers statiques, depuis des bases de données ou des flux informatiques,
296 chacun pouvant être dans ou hors SALOME. Cela permet aussi de modifier aisément
297 des données d'entrée, par exemple à des fin de débogage ou pour des traitements
298 répétitifs, et c'est la méthode la plus polyvalente pour paramétrer les données
299 d'entrée. **Mais attention, la méthodologie par scripts n'est pas une procédure
300 "sûre", en ce sens que des données erronées ou des erreurs dans les calculs,
301 peuvent être directement introduites dans l'exécution du schéma YACS.**
302
303 Ajout de paramètres pour contrôler l'algorithme d'assimilation de données
304 -------------------------------------------------------------------------
305
306 On peut ajouter des paramètres optionnels pour contrôler le calcul de
307 l'algorithme d'assimilation de données. Ceci se fait en utilisant le mot-clé
308 "*AlgorithmParameters*" dans la définition du cas ADAO, qui est un mot-clé de la
309 commande générale "*ASSIMILATION_STUDY*". Ce mot-clé nécessite un dictionnaire
310 Python, contenant des paires clé/valeur. La liste des paramètres optionnels
311 possibles sont donnés dans la section :ref:`section_reference`.
312
313 Le dictionnaire doit être défini, par exemple, dans un fichiers externe de
314 script Python, en utilisant le nom obligatoire de variable
315 "*AlgorithmParameters*" pour le dictionnaire. Toutes les clés dans le
316 dictionnaire sont optionnelles, elles disposent toutes d'une valeur par défaut,
317 et elles peuvent être présentes sans être utiles. Par exemple::
318
319     AlgorithmParameters = {
320         "Minimizer" : "CG", # Choix possible : "LBFGSB", "TNC", "CG", "BFGS"
321         "MaximumNumberOfSteps" : 10,
322         }
323
324 Si aucune borne n'est requise sur les variables de contrôle, alors on peut
325 choisir les algorithmes de minimisation "*BFGS*" ou "*CG*" pour tous les
326 algorithmes variationnels d'assimilation de données ou d'optimisation. Pour
327 l'optimisation sous contraintes, le minimiseur "*LBFGSB*" est souvent plus
328 robuste, mais le "*TNC*" est parfois plus performant.
329
330 Ensuite le script peut être ajouté au cas ADAO, dans une entrée de type fichier
331 pour le mot-clé "*AlgorithmParameters*", de la manière suivante:
332
333   .. _adao_scriptentry02:
334   .. image:: images/adao_scriptentry02.png
335     :align: center
336     :width: 100%
337   .. centered::
338     **Ajouter des paramètres pour contrôler l'algorithme et les sorties**
339
340 Les autres étapes et résultats sont exactement les mêmes que dans l'exemple
341 précédent `Construire un cas d'estimation avec une définition explicite des
342 données`_. Le dictionnaire peut aussi être donné directement dans le champ
343 d'entrée de type chaîne de caractères pour le mot-clé.
344
345 Construire un cas complexe avec une définition de données externes par scripts
346 ------------------------------------------------------------------------------
347
348 Cet exemple plus complexe et complet peut être considéré comme un cadre de base
349 pour le traitement des entrées de l'utilisateur, qui doit ensuite être adapté à
350 chaque application réelle. Néanmoins, les squelettes de fichiers sont
351 suffisamment généraux pour avoir été utilisés pour des applications variées en
352 neutronique, mécanique des fluides... Ici, on ne s'intéresse pas aux résultats,
353 mais plus sur le contrôle de l'utilisateur des entrées et sorties dans un cas
354 ADAO. Comme précédemment, toutes les valeurs numériques de cet exemple sont
355 arbitraires.
356
357 L'objectif est de configurer les entrées et les sortie d'un problème physique
358 d'estimation par des scripts externes Python, en utilisant un opérateur
359 non-linéaire général, en ajoutant un contrôle sur les paramètres et ainsi de
360 suite... Les scripts complets peuvent être trouvés dans le répertoire des
361 exemples de squelettes ADAO sous le nom de
362 "*External_data_definition_by_scripts*".
363
364 Conditions d'expérience
365 +++++++++++++++++++++++
366
367 On continue à opérer dans un espace à 3 dimensions, afin de limiter la taille de
368 l'objet numérique indiqué dans les scripts, mais le problème ne dépend pas de la
369 dimension.
370
371 On choisit un contexte d'expériences jumelles, en utilisant un état vrai
372 :math:`\mathbf{x}^t` connu, mais de valeur arbitraire::
373
374     Xt = [1 2 3]
375
376 L'état d'ébauche :math:`\mathbf{x}^b`, qui représentent une connaissance *a
377 priori* de l'état vrai, est construit comme une perturbation aléatoire
378 gaussienne de 20% de l'état vrai :math:`\mathbf{x}^t` pour chaque composante,
379 qui est::
380
381     Xb = Xt + normal(0, 20%*Xt)
382
383 Pour décrire la matrice des covariances d'erreur d'ébauche math:`\mathbf{B}`, on
384 fait comme précédemment l'hypothèse d'erreurs décorrélées (c'est-à-dire, une
385 matrice diagonale, de taille 3x3 parce-que :math:`\mathbf{x}^b` est de taille 3)
386 et d'avoir la même variance de 0,1 pour toutes les variables. On obtient::
387
388     B = 0.1 * diagonal( length(Xb) )
389
390 On suppose qu'il existe un opérateur d'observation :math:`\mathbf{H}`, qui peut
391 être non linéaire. Dans une procédure réelle de recalage ou de problème inverse,
392 les codes de simulation physique sont intégrés dans l'opérateur d'observation.
393 On a également besoin de connaître son gradient par rapport à chaque variable
394 estimée, ce qui est une information rarement connu avec les codes industriels.
395 Mais on verra plus tard comment obtenir un gradient approché dans ce cas.
396
397 Étant en expériences jumelles, les observations :math:`\mathbf{y}^o` et leur
398 matrice de covariances d'erreurs :math:`\mathbf{R}` sont générées en utilisant
399 l'état vrai :math:`\mathbf{x}^t` et l'opérateur d'observation
400 :math:`\mathbf{H}`::
401
402     Yo = H( Xt )
403
404 et, avec un écart-type arbitraire de 1% sur chaque composante de l'erreur::
405
406     R = 0.0001 * diagonal( lenght(Yo) )
407
408 Toutes les informations requises pour l'estimation par assimilation de données
409 sont maintenant définies.
410
411 Squelettes des scripts décrivant les conditions d'expérience
412 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
413
414 On donne ici les éléments essentiels de chaque script utilisé par la suite pour
415 construire le cas ADAO. On rappelle que l'utilisation de ces scripts dans de
416 réels fichiers Python nécessite de définir correctement le chemin de modules ou
417 des codes importés (même si le module est dans le même répertoire que le fichier
418 Python qui l'importe. On indique le chemin à renseigner en utilisant la mention
419 ``"# INSERT PHYSICAL SCRIPT PATH"``), l'encodage si nécessaire, etc. Les noms de
420 fichiers indiqués pour les scripts qui suivent sont arbitraires. Des exemples
421 complets de fichiers scripts sont disponibles dans le répertoire standard des
422 exemples ADAO.
423
424 On définit en premier lieu l'état vrai :math:`\mathbf{x}^t` et une fonction
425 utiles à la construction de matrices, dans un fichier script Python nommé
426 ``Physical_data_and_covariance_matrices.py``::
427
428     import numpy
429     #
430     def True_state():
431         """
432         Arbitrary values and names, as a tuple of two series of same length
433         """
434         return (numpy.array([1, 2, 3]), ['Para1', 'Para2', 'Para3'])
435     #
436     def Simple_Matrix( size, diagonal=None ):
437         """
438         Diagonal matrix, with either 1 or a given vector on the diagonal
439         """
440         if diagonal is not None:
441             S = numpy.diag( diagonal )
442         else:
443             S = numpy.matrix(numpy.identity(int(size)))
444         return S
445
446 On définit ensuite l'état d'ébauche :math:`\mathbf{x}^b` comme une perturbation
447 aléatoire de l'état vrai, en ajoutant une *variable ADAO requise* à la fin du
448 script de définition, de manière à exporter la valeur définie. C'est réalisé
449 dans un fichier de script Python nommé ``Script_Background_xb.py``::
450
451     from Physical_data_and_covariance_matrices import True_state
452     import numpy
453     #
454     xt, names = True_state()
455     #
456     Standard_deviation = 0.2*xt # 20% for each variable
457     #
458     xb = xt + abs(numpy.random.normal(0.,Standard_deviation,size=(len(xt),)))
459     #
460     # Creating the required ADAO variable
461     # ------------------------------------
462     Background = list(xb)
463
464 De la même manière, on définit la matrice des covariances de l'erreur d'ébauche
465 :math:`\mathbf{B}` comme une matrice diagonale, de la même longueur de diagonale
466 que l'ébauche de la valeur vraie, en utilisant la fonction d'aide déjà définie.
467 C'est réalisé dans un fichier script Python nommé
468 ``Script_BackgroundError_B.py``::
469
470     from Physical_data_and_covariance_matrices import True_state, Simple_Matrix
471     #
472     xt, names = True_state()
473     #
474     B = 0.1 * Simple_Matrix( size = len(xt) )
475     #
476     # Creating the required ADAO variable
477     # -----------------------------------
478     BackgroundError = B
479
480 Pour poursuivre, on a besoin de l'opérateur d'observation :math:`\mathbf{H}`
481 comme une fonction de l'état. Il est ici défini dans un fichier externe nommé 
482 ``"Physical_simulation_functions.py"``, qui doit contenir une fonction appelée
483 ``"DirectOperator"``. Cette fonction est une une fonction utilisateur,
484 représentant de manière programmée l'opérateur :math:`\mathbf{H}`. On suppose
485 que cette fonction est donnée par l'utilisateur. Un squelette simple est donné
486 ici par facilité::
487
488     def DirectOperator( XX ):
489         """ Direct non-linear simulation operator """
490         #
491         # --------------------------------------> EXAMPLE TO BE REMOVED
492         if type(XX) is type(numpy.matrix([])):  # EXAMPLE TO BE REMOVED
493             HX = XX.A1.tolist()                 # EXAMPLE TO BE REMOVED
494         elif type(XX) is type(numpy.array([])): # EXAMPLE TO BE REMOVED
495             HX = numpy.matrix(XX).A1.tolist()   # EXAMPLE TO BE REMOVED
496         else:                                   # EXAMPLE TO BE REMOVED
497             HX = XX                             # EXAMPLE TO BE REMOVED
498         # --------------------------------------> EXAMPLE TO BE REMOVED
499         #
500         return numpy.array( HX )
501
502 On n'a pas besoin des opérateurs linéaires associés ``"TangentOperator"`` et
503 ``"AdjointOperator"`` car ils vont être approximés en utilisant les capacités
504 d'ADAO.
505
506 On insiste sur le fait que ces opérateurs non-linéaire ``"DirectOperator"``,
507 linéaire tangent ``"TangentOperator"`` et linéaire adjoint ``"AdjointOperator"``
508 proviennent de la connaissance de la physique, incluant le code de simulation de
509 référence physique, et doivent être soigneusement mis au point par l'utilisateur
510 de l'assimilation de données ou de l'optimisation. Les erreurs de simulation ou
511 d'usage des opérateurs ne peuvent pas être détectés ou corrigés par
512 l'environnement seul ADAO d'assimilation de données et d'optimisation.
513
514 Dans cet environnement d'expériences jumelles, l'observation
515 :math:`\mathbf{y}^o` et sa matrice des covariances d'erreur :math:`\mathbf{R}`
516 peuvent être générées. C'est réalisé dans deux fichiers de script Python, le
517 premier étant nommé ``Script_Observation_yo.py``::
518
519     from Physical_data_and_covariance_matrices import True_state
520     from Physical_simulation_functions import DirectOperator
521     #
522     xt, noms = True_state()
523     #
524     yo = DirectOperator( xt )
525     #
526     # Creating the required ADAO variable
527     # -----------------------------------
528     Observation = list(yo)
529
530 et le second nommé ``Script_ObservationError_R.py``::
531
532     from Physical_data_and_covariance_matrices import True_state, Simple_Matrix
533     from Physical_simulation_functions import DirectOperator
534     #
535     xt, names = True_state()
536     #
537     yo = DirectOperator( xt )
538     #
539     R  = 0.0001 * Simple_Matrix( size = len(yo) )
540     #
541     # Creating the required ADAO variable
542     # -----------------------------------
543     ObservationError = R
544
545 Comme dans les exemples précédents, il peut être utile de définir certains
546 paramètres pour l'algorithme d'assimilation de données. Par exemple, si on
547 utilise l'algorithme standard de "*3DVAR*", les paramètres suivants peuvent être
548 définis dans un fichier de script Python nommé
549 ``Script_AlgorithmParameters.py``::
550
551     # Creating the required ADAO variable
552     # -----------------------------------
553     AlgorithmParameters = {
554         "Minimizer" : "TNC",         # Possible : "LBFGSB", "TNC", "CG", "BFGS"
555         "MaximumNumberOfSteps" : 15, # Number of global iterative steps
556         "Bounds" : [
557             [ None, None ],          # Bound on the first parameter
558             [ 0., 4. ],              # Bound on the second parameter
559             [ 0., None ],            # Bound on the third parameter
560             ],
561     }
562
563 Enfin, il est courant de post-traiter les résultats, en les récupérant aprés la
564 phase d'assimilation de données de manière à les analyser, les afficher ou les
565 représenter. Cela nécessite d'utiliser un fichier script Python intermédiaire de
566 manière à extraire ces résultats à la fin de la procédure d'assimilation de
567 données ou d'optimisation. L'exemple suivant de fichier script Python, nommé
568 ``Script_UserPostAnalysis.py``, illustre le fait::
569
570     from Physical_data_and_covariance_matrices import True_state
571     import numpy
572     #
573     xt, names   = True_state()
574     xa          = ADD.get("Analysis")[-1]
575     x_series    = ADD.get("CurrentState")[:]
576     J           = ADD.get("CostFunctionJ")[:]
577     #
578     # Verifying the results by printing
579     # ---------------------------------
580     print
581     print "xt = %s"%xt
582     print "xa = %s"%numpy.array(xa)
583     print
584     for i in range( len(x_series) ):
585         print "Etape %2i : J = %.5e  et  X = %s"%(i, J[i], x_series[i])
586     print
587
588 Finalement, on obtient la description de l'ensemble des conditions
589 d'expériences à travers la série de fichiers listée ici:
590
591 #.      ``Physical_data_and_covariance_matrices.py``
592 #.      ``Physical_simulation_functions.py``
593 #.      ``Script_AlgorithmParameters.py``
594 #.      ``Script_BackgroundError_B.py``
595 #.      ``Script_Background_xb.py``
596 #.      ``Script_ObservationError_R.py``
597 #.      ``Script_Observation_yo.py``
598 #.      ``Script_UserPostAnalysis.py``
599
600 On insiste ici sur le fait que tous ces scripts sont écrits par l'utilisateur et
601 ne peuvent être testés automatiquement par ADAO. Ainsi, l'utilisateur est tenu
602 de vérifier les scripts (et en particulier leurs entrées/sorties) afin de
603 limiter les difficultés de débogage. On rappelle que: **la méthodologie par
604 scripts n'est pas une procédure "sûre", en ce sens que des données erronées ou
605 des erreurs dans les calculs, peuvent être directement introduites dans
606 l'exécution du schéma YACS.**
607
608 Construire la cas avec une définition de données externes par scripts
609 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
610
611 Tous ces scripts peuvent ensuite être utilisés pour définir le cas ADAO avec une
612 définition de données externes par des fichiers de script Python. Cela se
613 réalise de manière tout à fait similaire à la méthode décrite dans la partie
614 précédente `Construire un cas d'estimation avec une définition de données
615 externes par scripts`_. Pour chaque variable à définir, on sélectionne l'option
616 "*Script*"  du mot-clé "*FROM*", ce qui conduit à une entrée
617 "*SCRIPT_DATA/SCRIPT_FILE*" dans l'arbre graphique. Pour le mot-clé
618 "*ObservationOperator*", on choisit la forme "*ScriptWithOneFunction*" et on
619 conserve la valeur par défaut de l'incrément différentiel.
620
621 Les autres étapes pour construire le cas ADAO sont exactement les mêmes que dans
622 la partie précédente `Construire un cas d'estimation avec une définition
623 explicite des données`_.
624
625 En utilisant l'opérateur linéaire simple :math:`\mathbf{H}` du fichier script
626 Python ``Physical_simulation_functions.py`` disponible dans le répertoire
627 standard des exemples, les résultats ressemblent à::
628
629     xt = [1 2 3]
630     xa = [ 1.000014    2.000458  3.000390]
631
632     Etape  0 : J = 1.81750e+03  et  X = [1.014011, 2.459175, 3.390462]
633     Etape  1 : J = 1.81750e+03  et  X = [1.014011, 2.459175, 3.390462]
634     Etape  2 : J = 1.79734e+01  et  X = [1.010771, 2.040342, 2.961378]
635     Etape  3 : J = 1.79734e+01  et  X = [1.010771, 2.040342, 2.961378]
636     Etape  4 : J = 1.81909e+00  et  X = [1.000826, 2.000352, 3.000487]
637     Etape  5 : J = 1.81909e+00  et  X = [1.000826, 2.000352, 3.000487]
638     Etape  6 : J = 1.81641e+00  et  X = [1.000247, 2.000651, 3.000156]
639     Etape  7 : J = 1.81641e+00  et  X = [1.000247, 2.000651, 3.000156]
640     Etape  8 : J = 1.81569e+00  et  X = [1.000015, 2.000432, 3.000364]
641     Etape  9 : J = 1.81569e+00  et  X = [1.000015, 2.000432, 3.000364]
642     Etape 10 : J = 1.81568e+00  et  X = [1.000013, 2.000458, 3.000390]
643     ...
644
645 L'état au premier pas est l'état d'ébauche :math:`\mathbf{x}^b` généré
646 aléatoirement. Au cours du calcul, ces affichages sur la sortie standard sont
647 disponibles dans la fenêtre "*fenêtre de sortie de YACS*", que l'on obtient par
648 clic droit sur la fenêtre "*proc*" du schéma YACS exécuté.
649
650 .. [#] Pour de plus amples informations sur YACS, voir le *Guide utilisateur du module YACS* disponible dans le menu principal *Aide* de l'environnement SALOME.