Salome HOME
Mise à jour de la documentation
[modules/homard.git] / doc / fr / yacs.rst
1 .. _yacs:
2
3 YACS
4 ####
5 .. index:: single: yacs
6
7 Introduction
8 ************
9
10 L'utilisation de schémas YACS va permettre de coupler un calcul et une adaptation comme il est décrit dans :ref:`intro`. Ce couplage peut être répété au sein d'une boucle jusqu'à l'obtention d'un critère de convergence par exemple. Il existe de nombreuses façons de programmer un schéma YACS. La solution proposée ici fonctionne mais on peut très bien faire autrement !
11
12 On va décrire ici un schéma s'appliquant à un calcul pour lequel on cherche à stabiliser une valeur. Le calcul démarre sur un maillage initial puis HOMARD enchaîne avec une adaptation. On refait un calcul sur ce nouveau maillage et son résultat est analysé. En fonction de cette analyse, le couplage continue ou non. L'allure générale du schéma est la suivante :
13
14 .. image:: ../images/yacs_01.png
15    :align: center
16    :alt: yacs - allure générale
17    :width: 512
18    :height: 306
19
20 .. note::
21   Parmi l'ensemble des données manipulées, certaines sont immuables : le nom du répertoire de calcul, le nom du cas, le nom de l'hypothèse d'adaptation, etc. Il a été choisi de les imposer 'en dur' dans les différents paramètres de service ou au sein des scripts python. On pourrait également les définir a priori dans un noeud PresetNode et ensuite les transmettre par des liens. Nous n'avons pas retenu cette solution car elle augmente fortement le nombre de paramètres et de liens attachés à chaque noeud. Cela est très pénalisant pour la lisibilité du schéma. Les seules données qui vont circuler sont celles imposées par la description du service et celles qui évoluent au cours de l'exécution du schéma.
22
23 Les boîtes
24 **********
25
26 Les boîtes principales sont :
27
28 - DataInit : initialisation du maillage initial
29 - Etude_Initialisation : lancement du module HOMARD dans SALOME
30 - Boucle_de_convergence : gestion de la boucle d'alternance calcul/adaptation
31 - Bilan : affichage final
32
33 DataInit
34 ========
35 .. image:: ../images/yacs_a_01.png
36    :align: center
37    :alt: DataInit
38    :width: 158
39    :height: 61
40
41 Cette boîte est un noeud élémentaire de type PresetNode. Sa seule fonction est d'initialiser la variable MeshFile qui contient le nom du fichier du maillage initial.
42
43 .. literalinclude:: ../files/yacs_01.xml
44    :lines: 38-42
45
46 Etude_Initialisation
47 ====================
48 La boîte Etude_Initialisation lance le composant HOMARD dans SALOME. C'est un bloc composé de deux parties, qui sont invariables quelle que soit l'application envisagée :
49
50 - StudyCreation : noeud python
51 - SetCurrentStudy : service du composant HOMARD
52
53 .. image:: ../images/yacs_b_01.png
54    :align: center
55    :alt: Etude_Initialisation
56    :width: 323
57    :height: 97
58
59 Le noeud python StudyCreation sert à initialiser l'étude SALOME qui est fournie en sortie :
60
61 .. literalinclude:: ../files/yacs_01.xml
62    :lines: 44-62
63
64 Le service SetCurrentStudy affecte cette étude à une instance de HOMARD.
65
66 .. literalinclude:: ../files/yacs_01.xml
67    :lines: 63-68
68
69
70 Boucle_de_convergence
71 ===================================
72 La boîte Boucle_de_convergence est une boucle de type WhileLoop. La condition est initialisée à 1 : le bloc interne Alternance_Calcul_HOMARD est exécuté. Au sein de ce bloc, on calcule et on adapte le maillage ; quand le processus doit s'arrêter soit par suite d'erreur, soit par convergence, la condition passe à 0. La boucle s'achève et on passe à la boîte suivante, Bilan.
73
74 .. image:: ../images/yacs_c_01.png
75    :align: center
76    :alt: Boucle
77    :width: 163
78    :height: 93
79
80 Bilan
81 =====
82 .. image:: ../images/yacs_d_01.png
83    :align: center
84    :alt: Bilan
85    :width: 158
86    :height: 63
87
88 Cette boîte est un noeud python qui prend en entrée une chaîne de caractères, MessInfo. Si tout s'est bien passé, ce message est vide. Une fenêtre QT apparaît pour confirmer la convergence. S'il y a eu un problème, le message contient les messages émis au cours des calculs. La fenêtre QT affiche ce message.
89
90 .. literalinclude:: ../files/yacs_01.xml
91    :lines: 406-419
92
93
94 La boucle de calculs
95 ********************
96 .. image:: ../images/yacs_c_02.png
97    :align: center
98    :alt: Boucle
99    :width: 338
100    :height: 152
101
102 Cette boîte est un bloc qui gère le calcul, l'adaptation et l'analyse.
103
104 Calcul
105 ======
106 .. image:: ../images/yacs_c_03.png
107    :align: center
108    :alt: Calcul
109    :width: 155
110    :height: 87
111
112 Cette boîte est un noeud python qui va piloter le calcul. En entrée, on trouve le numéro du calcul (0 au départ) et le nom du fichier qui contient le maillage sur lequel calculer. En sortie, on trouve un entier qui représente l'erreur sur ce calcul (0 si tout va bien) et un dictionnaire python rassemblant les résultats du calcul. Le corps du noeud est constitué par le lancement d'un script python qui active le calcul.
113
114 .. literalinclude:: ../files/yacs_01.xml
115    :lines: 77-103
116
117 Dans cet exemple, il faut définir :
118
119 - rep_calc : le répertoire dans lequel sera exécuté le calcul.
120 - rep_script : le répertoire dans lequel se trouve le python qui lancera le calcul. Ce répertoire est à ajouter au PATH. Depuis ce répertoire, on importera 'Script' depuis le fichier ScriptAster.py
121
122 Le python Script est programmé comme l'utilisateur le souhaite pour que le calcul puisse être effectué sur le maillage courant. Selon le mode de lancement du code de calcul, on peut avoir besoin d'autres informations, comme le numéro du calcul ou le répertoire du calcul par exemple. La liberté est totale. Dans notre cas, les arguments d'entrée sont le nom du fichier de maillage, le numéro du calcul et le répertoire de calcul sous la forme de la liste python ["--rep_calc=rep_calc", "--num=numCalc", "--mesh_file=MeshFile"]
123 ].
124
125 En revanche la sortie du script doit obéir à la règle suivante. On récupère un code d'erreur, un message d'erreur et un dictionnaire. Ce dictionnaire contient obligatoirement les clés suivantes :
126
127 - "FileName" : le nom du fichier qui contient les résultats du calcul
128 - "V_TEST" : la valeur dont on veut tester la convergence
129
130 Adaptation
131 ==========
132 .. image:: ../images/yacs_c_04.png
133    :align: center
134    :alt: Adaptation
135    :width: 661
136    :height: 566
137
138 La boîte Adaptation est un noeud Switch piloté par le code d'erreur du calcul précédent. Si ce code est nul, YACS activera la boîte Adaptation_HOMARD qui lancera l'adaptation. Si le code n'est pas nul, on passe directement dans la boîte Arret_boucle.
139
140 Adaptation_HOMARD
141 -----------------
142 La première tâche à exécuter concerne l'initialisation des données nécessaires à HOMARD dans la boîte HOMARD_Initialisation. Cette boîte est un noeud switch piloté par le numéro du calcul. Au démarrage, le numéro est nul et YACS active la boîte Iter_1.
143
144 Iter_1
145 ^^^^^^
146 .. image:: ../images/yacs_c_06.png
147    :align: center
148    :alt: Iter_1
149    :width: 481
150    :height: 151
151
152 Cette boîte commence par créer le cas HOMARD en appelant le service CreateCase.
153
154 .. literalinclude:: ../files/yacs_01.xml
155    :lines: 208-215
156
157 Le nom du cas CaseName est imposé à "Calcul". Le paramètre d'entrée MeshName est imposé à "BOX". Le paramètre d'entrée FileName est issu de la sortie du calcul précédent. Le paramètre de sortie est une instance de cas.
158
159 .. literalinclude:: ../files/yacs_01.xml
160    :lines: 443-446
161
162 .. literalinclude:: ../files/yacs_01.xml
163    :lines: 483-486
164
165 Les options de ce cas doivent maintenant être renseignées. C'est fait par le noeud python CaseOptions. Il est impératif de renseigner le répertoire de calcul. On regardera la description des fonctions dans :ref:`tui_create_case`. En sortie, on récupère l'instance de l'itération correspondant à l'état initial du cas.
166
167 .. literalinclude:: ../files/yacs_01.xml
168    :lines: 216-228
169
170 Enfin, une hypothèse est créée en appelant le service CreateHypothèse. Le paramètre de sortie est une instance d'hypothèse.
171
172 Homard_Exec
173 ^^^^^^^^^^^
174 Une fois initialisée, l'adaptation peut être calculée. C'est le but de la boîte Homard_Exec, sous forme d'un script python.
175
176 .. image:: ../images/yacs_c_09.png
177    :align: center
178    :alt: Homard_Exec
179    :width: 153
180    :height: 141
181
182 Le répertoire de calcul est récupéré. Le nom du maillage est rappelé.
183
184 .. literalinclude:: ../files/yacs_01.xml
185    :lines: 245-250
186
187 ../..
188
189 .. literalinclude:: ../files/yacs_01.xml
190    :lines: 325-333
191
192 L'hypothèse transmise en paramètre d'entrée est caractérisée (voir :ref:`tui_create_hypothese`) :
193
194 .. literalinclude:: ../files/yacs_01.xml
195    :lines: 254-278
196
197 Il faut établir un nom pour la future itération. Pour s'assurer que le nom n'a jamais été utilisé, on met en place un mécanisme de nommage incrémental à partir du nom de l'itération initiale. Comme ce nom initial est le nom du maillage initial, on obtient une succession de noms sous la forme : M_001, M_002, M_003, etc.
198
199 .. literalinclude:: ../files/yacs_01.xml
200    :lines: 280-290
201
202 L'itération est complétée : hypothèse, futur maillage, champ (voir :ref:`tui_create_iteration`) :
203
204 .. literalinclude:: ../files/yacs_01.xml
205    :lines: 292-311
206
207 L'itération est calculée. Si tout s'est bien passé, la variable OK vaut 1 : on pourra continuer l'exécution du schéma. S'il y a eu un problème, la variable OK vaut 0 pour signifier que le calcul doit s'arrêter ; on donne alors un message d'erreur.
208
209 .. literalinclude:: ../files/yacs_01.xml
210    :lines: 313-324
211
212 Après cette exécution, le processus sort du noeud Adaptation_HOMARD, puis du noeud Adaptation. On arrive alors au noeud d'analyse.
213
214 Iter_n
215 ^^^^^^
216 .. image:: ../images/yacs_c_07.png
217    :align: center
218    :alt: Iter_n
219    :width: 323
220    :height: 92
221
222 Aux passages suivants dans le bloc d'adaptation, il faut récupérer :
223
224 - la dernière itération créée pour la poursuivre : service LastIteration (voir :ref:`tui_create_iteration`)
225 - l'hypothèse créée : service GetHypothesis (voir :ref:`tui_create_hypothese`)
226
227 On passe ensuite dans le noeud Homard_Exec pour calculer le nouveau maillage.
228
229 Arret_boucle
230 ------------
231 .. image:: ../images/yacs_c_08.png
232    :align: center
233    :alt: Arret_boucle
234    :width: 163
235    :height: 152
236
237 Le bloc Arret_boucle n'est présent que pour faire transiter des variables car les paramètres d'entrée des noeuds doivent toujours être remplis. C'est un python très simple :
238
239 .. literalinclude:: ../files/yacs_01.xml
240    :lines: 173-184
241
242 Analyse
243 =======
244 .. image:: ../images/yacs_c_05.png
245    :align: center
246    :alt: Analyse
247    :width: 156
248    :height: 139
249
250 Le bloc Analyse est un script python qui assure le contrôle complet du processus en examinant successivement les causes d'erreur possible.
251
252 .. literalinclude:: ../files/yacs_01.xml
253    :lines: 104-116
254
255 ../..
256
257 .. literalinclude:: ../files/yacs_01.xml
258    :lines: 162-170
259
260 On commence par analyser le retour du code de calcul :
261
262 .. literalinclude:: ../files/yacs_01.xml
263    :lines: 118-123
264
265 Vérification de la présence du nom du fichier de résultats dans le dictionnaire des résultats :
266
267 .. literalinclude:: ../files/yacs_01.xml
268    :lines: 125-132
269
270 Vérification de la convergence. Cela suppose que la valeur à tester est présente dans le dictionnaire sous la clé 'V_TEST'. Ici, on a mis en place un test sur la variation de la valeur d'un calcul à l'autre. Au premier passage, on ne teste rien. Aux passages suivants, on teste si la variation relative est inférieure à 1 millième. On aurait pu mettre en place un test absolu si on avait récupéré un niveau global d'erreur par exemple.
271
272 .. literalinclude:: ../files/yacs_01.xml
273    :lines: 134-152
274
275 Enfin, on vérifie que l'on ne dépasse pas un nombre maximal d'adaptations :
276
277 .. literalinclude:: ../files/yacs_01.xml
278    :lines: 154-159
279
280
281 Utiliser ce schéma
282 ******************
283 Pour reproduire cet exemple, on pourra télécharger :
284   * :download:`le schéma <../files/yacs_01.xml>`
285   * :download:`un exemple de script python <../files/yacs_script.py>`
286
287 Il faut l'adapter à la simulation envisagée. En particulier, il faut :
288
289 - ajuster les noms des fichiers et des répertoires
290 - fournir un script de lancement du calcul respectant les consignes évoquées ci-avant
291 - choisir les hypothèses de pilotage de l'adaptation
292 - mettre en place le test d'arrêt
293
294
295