Salome HOME
e549db9f53118f6827d38786cce896878b785022
[modules/smesh.git] / doc / salome / examples / MGAdaptTests.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 """Tests des adaptations par MGAdapt en TUI
4
5 Copyright 2021 EDF
6 Gérald NICOLAS
7 +33.1.78.19.43.52
8 """
9
10 __revision__ = "V04.01"
11
12 #========================= Les imports - Début ===================================
13
14 import os
15 import sys
16
17 import salome
18
19 import SMESH
20 from salome.smesh import smeshBuilder
21 smesh = smeshBuilder.New()
22
23 #========================== Les imports - Fin ====================================
24
25 #========================= Paramétrage - Début ===================================
26 # 1. REPDATA = répertoire du cas
27 HOME = os.environ["HOME"]
28 REPDATA = os.path.join(HOME, "MAILLAGE", "TEST_REMAILLAGE", "MGAdapt_med_files")
29 PATH_SMESH = os.getenv("SMESH_ROOT_DIR")
30 print (PATH_SMESH)
31 PATH_SMESH = os.getenv("TEST_INSTALL_DIRECTORY")
32 print (PATH_SMESH)
33 REPDATA = os.path.join(PATH_SMESH, "MGAdapt_med_files")
34 print (REPDATA)
35 #
36 # 2. Repérage des données
37 D_DATA = dict()
38 D_DATA["01"] = "01"
39 D_DATA["02"] = "02"
40 D_DATA["03"] = "01"
41 D_DATA["04"] = "04"
42 D_DATA["05"] = "04"
43 D_DATA["06"] = "06"
44 D_DATA["07"] = "07"
45 D_DATA["08"] = "08"
46 D_DATA["10"] = "10"
47 D_DATA["11"] = "11"
48 #========================== Paramétrage - Fin ====================================
49
50 class MGAdaptTest (object):
51
52   """Test de l'adaptation par MGAdapt
53
54 Options facultatives
55 ********************
56 Le(s) nom du/des tests à passer. Si aucun n'est donné, tous les cas sont passés.
57   """
58
59 # A. La base
60
61   message_info = ""
62   _verbose = 0
63   _verbose_max = 0
64   affiche_aide_globale = 0
65
66 # B. Les variables
67
68   l_cas = None
69   rep_test = None
70   nro_cas = None
71   cas = None
72
73 #=========================== Début de la méthode =================================
74
75   def __init__ ( self, liste_option ):
76
77     """Le constructeur de la classe MGAdaptTest"""
78
79     self.l_cas = list()
80
81     for option in liste_option :
82
83       #print (option)
84       saux = option.upper()
85       #print (saux)
86       if saux in ( "-H", "-HELP" ):
87         self.affiche_aide_globale = 1
88       elif saux == "-V" :
89         self._verbose = 1
90       elif saux == "-VMAX" :
91         self._verbose = 1
92         self._verbose_max = 1
93       else :
94         self.l_cas.append(option)
95
96     if not self.l_cas:
97       for cle in D_DATA.keys():
98         self.l_cas.append(cle)
99     self.l_cas.sort()
100
101     if self._verbose_max:
102       print ("Liste des cas : {}".format(self.l_cas))
103
104 #===========================  Fin de la méthode ==================================
105
106 #=========================== Début de la méthode =================================
107
108   def __del__(self):
109     """A la suppression de l'instance de classe"""
110     if self._verbose_max:
111       print ("Suppression de l'instance de la classe.")
112
113 #===========================  Fin de la méthode ==================================
114
115 #=========================== Début de la méthode =================================
116
117   def _add_file_in (self, objet_adapt):
118     """Ajout du fichier med d'entrée
119
120 Entrées/Sorties :
121   :objet_adapt: l'objet du module
122     """
123     if self._verbose_max:
124       print ("_add_file_in pour {}".format(self.nro_cas))
125
126     ficmed = os.path.join (REPDATA, "test_{}.med".format(D_DATA[self.nro_cas]))
127     if self._verbose_max:
128       print ("Fichier {}".format(ficmed))
129     if not os.path.isfile(ficmed):
130       erreur = 1
131       message = "Le fichier {} est inconnu.".format(ficmed)
132     else:
133       objet_adapt.setMEDFileIn(ficmed)
134       erreur = 0
135       message = ""
136
137     return erreur, message
138
139 #===========================  Fin de la méthode ==================================
140
141 #=========================== Début de la méthode =================================
142
143   def _add_file_out (self, objet_adapt):
144     """Ajout du fichier de sortie
145
146 Entrées/Sorties :
147   :objet_adapt: l'objet du module
148     """
149     if self._verbose_max:
150       print ("_add_file_out pour {}".format(self.nro_cas))
151
152     ficmed = os.path.join (REPDATA, "test_{}.adapt.tui.med".format(self.nro_cas))
153     if os.path.isfile(ficmed):
154       os.remove(ficmed)
155
156     objet_adapt.setMEDFileOut(ficmed)
157
158     if self._verbose:
159       print (". Maillage adapté dans le fichier {}".format(ficmed))
160
161     return
162
163 #===========================  Fin de la méthode ==================================
164
165 #=========================== Début de la méthode =================================
166
167   def  _add_file_bkg (self, objet_adapt):
168     """Ajout du fichier med de fond
169
170 Entrées/Sorties :
171   :objet_adapt: l'objet du module
172     """
173     if self._verbose_max:
174       print ("_add_file_bkg pour {}".format(self.nro_cas))
175
176     ficmed = os.path.join (REPDATA, "test_{}_bg.med".format(D_DATA[self.nro_cas]))
177     if self._verbose_max:
178       print ("Fichier {}".format(ficmed))
179     if not os.path.isfile(ficmed):
180       erreur = 1
181       message = "Le fichier {} est inconnu.".format(ficmed)
182     else:
183       objet_adapt.setMEDFileBackground(ficmed)
184       erreur = 0
185       message = ""
186
187     return erreur, message
188
189 #===========================  Fin de la méthode ==================================
190
191 #=========================== Début de la méthode =================================
192
193   def _hypo_creation (self, maptype, option, niveau=3):
194     """Création d'une hypothèse
195
196 Entrées :
197   :maptype: type de carte : "Local", "Background", "Constant"
198   :option: nom du champ si "Local" ou "Background", valeur si "Constant"
199   :niveau: niveau de verbosité
200
201 Sortie :
202   :hypo: l'objet hypothèse
203     """
204     if self._verbose_max:
205       print ("_hypo_creation pour {} avec {}".format(maptype,option))
206
207     erreur = 0
208     message = ""
209
210     while not erreur :
211
212       #--- Création de l'hypothèse ---
213       hypo = smesh.CreateAdaptationHypothesis()
214
215       # Type de données
216       if ( maptype in ("Local", "Background", "Constant") ):
217         hypo.setSizeMapType(maptype)
218       else:
219         message = "Le type de carte {} est inconnu.".format(maptype)
220         erreur = 2
221         break
222
223       # Valeur
224       if ( maptype in ("Local", "Background") ):
225         hypo.setSizeMapFieldName(option)
226       else:
227         hypo.setConstantSize(option)
228
229       # Verbosité
230       self._hypo_verbose (hypo, niveau)
231
232       break
233
234     return erreur, message, hypo
235 #===========================  Fin de la méthode ==================================
236
237 #=========================== Début de la méthode =================================
238
239   def _hypo_verbose (self, hypo, niveau=10):
240     """Débogage des hypothèses
241
242 Entrées :
243   :niveau: niveau de verbosité
244
245 Entrées/Sorties :
246   :hypo: l'objet hypothèse
247     """
248
249     hypo.setVerbosityLevel(niveau)
250
251     if self._verbose_max:
252
253       hypo.setPrintLogInFile(True)
254       hypo.setKeepWorkingFiles(True)
255       hypo.setRemoveOnSuccess(False)
256
257     return
258 #===========================  Fin de la méthode ==================================
259
260 #=========================== Début de la méthode =================================
261
262   def _calcul (self, objet_adapt, hypo):
263     """Calcul
264
265 Entrées :
266   :objet_adapt: l'objet du module
267   :hypo: l'objet hypothèse
268     """
269
270     #--- association de l'hypothese à l'objet de l'adaptation
271     objet_adapt.AddHypothesis(hypo)
272
273     #-- Calcul
274     if self._verbose_max:
275       print (hypo.getCommandToRun())
276     erreur = objet_adapt.Compute(False)
277     if erreur:
278       message = "Echec dans l'adaptation."
279     else:
280       message = ""
281
282     return erreur, message
283
284 #===========================  Fin de la méthode ==================================
285
286 #=========================== Début de la méthode =================================
287
288   def _test_00 (self, objet_adapt):
289     """Test générique
290
291 Entrées/Sorties :
292   :objet_adapt: l'objet du module
293     """
294
295     erreur = 0
296     message = ""
297
298     while not erreur :
299
300       #--- les fichiers MED ---#
301       erreur, message = self._add_file_in (objet_adapt)
302       if erreur:
303         break
304       self._add_file_out (objet_adapt)
305       if self.nro_cas in ("02", "08"):
306         erreur, message = self._add_file_bkg (objet_adapt)
307         if erreur:
308           break
309
310       #--- Création de l'hypothèse ---
311       if self.nro_cas in ("01", "04", "05", "06", "07", "10"):
312         maptype = "Local"
313         option = "TAILLE"
314       elif self.nro_cas in ("02", "08"):
315         maptype = "Background"
316         option = "TAILLE"
317       elif self.nro_cas in ("03",):
318         maptype = "Constant"
319         option = 0.5
320       if self.nro_cas in ("11",):
321         maptype = "Local"
322         option = "Taille de maille"
323       if self._verbose:
324         niveau = 3
325       elif self._verbose_max:
326         niveau = 10
327       else:
328         niveau = 0
329       erreur, message, hypo = self._hypo_creation(maptype, option, niveau)
330       if erreur:
331         break
332
333       #-- Ajout des options
334       if self.nro_cas in ("04", "06", "07", "08", "10", "11"):
335         hypo.setTimeStepRankLast()
336       elif self.nro_cas in ("05",):
337         hypo.setTimeStepRank(1,1)
338
339       # options facultatives
340       if self.nro_cas in ("03",):
341         hypo.setOptionValue("adaptation", "surface")
342
343       #-- Calcul
344       try :
345         erreur, message = self._calcul (objet_adapt, hypo)
346       except :
347         erreur = 1871
348         message = "Erreur dans le calcul par SMESH"
349
350       break
351
352     return erreur, message
353
354 #===========================  Fin de la méthode ==================================
355
356 #=========================== Début de la méthode =================================
357
358   def _traitement_cas (self ):
359     """Traitement d'un cas
360
361
362 Sorties :
363   :erreur: code d'erreur
364   :message: message d'erreur
365     """
366
367     nom_fonction = __name__ + "/_traitement_cas"
368     blabla = "\nDans {} :".format(nom_fonction)
369
370     if self._verbose_max:
371       print (blabla)
372
373 # 1. Préalables
374
375     erreur = 0
376     message = ""
377     if self._verbose:
378       print ("Passage du cas '{}'".format(self.nro_cas))
379
380     if ( self.nro_cas in ("01", "02", "03", "04", "05", "06", "07", "08", "10" , "11") ):
381       objet_adapt = smesh.Adaptation('MG_Adapt')
382       erreur, message = self._test_00 (objet_adapt)
383       del objet_adapt
384
385     else:
386       erreur = 1
387       message = "Le cas '{}' est inconnu.".format(self.nro_cas)
388
389     return erreur, message
390
391 #===========================  Fin de la méthode ==================================
392
393 #=========================== Début de la méthode =================================
394
395   def lancement (self):
396
397     """Lancement
398
399 Sorties :
400   :erreur: code d'erreur
401   :message: message d'erreur
402     """
403
404     nom_fonction = __name__ + "/lancement"
405     blabla = "\nDans {} :".format(nom_fonction)
406
407     erreur = 0
408     message = ""
409
410     if self._verbose_max:
411       print (blabla)
412
413     for nom_cas in self.l_cas:
414       self.nro_cas = nom_cas
415       erreur_t, message_t = self._traitement_cas ()
416       if erreur_t:
417         erreur += 1
418         message += "\nErreur n°{} pour le cas {} :\n".format(erreur_t,nom_cas)
419         message += message_t
420
421     if ( erreur and self._verbose_max ):
422       print (blabla, message)
423
424     return erreur, message
425
426 #===========================  Fin de la méthode ==================================
427
428 #==========================  Fin de la classe ====================================
429
430 #==================================================================================
431 # Lancement
432 #==================================================================================
433
434 if __name__ == "__main__" :
435
436 # 1. Options
437
438   L_OPTIONS = list()
439   #L_OPTIONS.append("-h")
440   #L_OPTIONS.append("-v")
441   #L_OPTIONS.append("-vmax")
442   #L_OPTIONS.append("01")
443   #L_OPTIONS.append("02")
444   #L_OPTIONS.append("03")
445   #L_OPTIONS.append("07")
446   #L_OPTIONS.append("10")
447   #L_OPTIONS.append("11")
448   #L_OPTIONS.append("04")
449   #L_OPTIONS.append("05")
450   #L_OPTIONS.append("06")
451   #L_OPTIONS.append("08")
452
453 # 2. Lancement de la classe
454
455   #print ("L_OPTIONS :", L_OPTIONS)
456   MGADAPT_TEST = MGAdaptTest(L_OPTIONS)
457   if MGADAPT_TEST.affiche_aide_globale:
458     sys.stdout.write(MGADAPT_TEST.__doc__+"\n")
459   else:
460     ERREUR, MESSAGE_ERREUR = MGADAPT_TEST.lancement()
461     if ERREUR:
462       sys.stdout.write(MGADAPT_TEST.__doc__+"\n")
463       MESSAGE_ERREUR += "\n {} erreur(s)\n".format(ERREUR)
464       sys.stderr.write(MESSAGE_ERREUR)
465       assert(False)
466
467   del MGADAPT_TEST
468
469   #sys.exit(0)