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