Salome HOME
bos #29171 Refactor testing procedure
[modules/smesh.git] / doc / examples / MGAdaptTests_without_session.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.04"
11
12 #========================= Les imports - Début ===================================
13
14 import inspect
15 import sys
16 import os
17 import tempfile
18 import shutil
19 import salome
20
21 salome.standalone()
22 salome.salome_init_without_session()
23
24 import SMESH
25 from salome.smesh import smeshBuilder
26 smesh = smeshBuilder.New()
27
28 #========================== Les imports - Fin ====================================
29
30 #========================= Paramétrage - Début ===================================
31 # 1. REPDATA = répertoire du cas
32 REPDATA = os.path.abspath(os.path.join(os.path.dirname(inspect.getfile(lambda: None)), 'data'))
33 #
34 # 2. Repérage des données
35 D_DATA = dict()
36 D_DATA["01"] = "01" # 2D plan ; carte locale
37 D_DATA["02"] = "02" # 2D plan ; carte en arrière-plan
38 D_DATA["03"] = "01" # 2D plan ; taille constante
39 D_DATA["04"] = "04" # 3D ; carte locale et dernier pas de temps
40 D_DATA["05"] = "04" # 3D ; carte locale et pas de temps n°1
41 D_DATA["06"] = "06" # 2D non plan; carte locale
42 D_DATA["07"] = "07" # 2D plan ; carte locale anisotrope
43 D_DATA["08"] = "08" # 3D ; carte en arrière-plan anisotrope
44 D_DATA["10"] = "10" # 2D plan ; carte locale et maillage initial quadratique
45 D_DATA["11"] = "11" # 2D plan ; carte locale et maillage initial en quadrangles
46 D_DATA["13"] = "13" # 3D ; carte locale en simple précision et dernier pas de temps
47 #========================== Paramétrage - Fin ====================================
48
49 class MGAdaptTest (object):
50
51   """Test de l'adaptation par MGAdapt
52
53 Options facultatives
54 ********************
55 Le(s) nom du/des tests à passer. Si aucun n'est donné, tous les cas sont passés.
56   """
57
58 # A. La base
59
60   message_info = ""
61   _verbose = 0
62   _verbose_max = 0
63   affiche_aide_globale = 0
64
65 # B. Les variables
66
67   l_cas = None
68   rep_test = None
69   nro_cas = None
70   cas = None
71
72 #=========================== Début de la méthode =================================
73
74   def __init__ ( self, liste_option ):
75
76     """Le constructeur de la classe MGAdaptTest"""
77
78     self.l_cas = list()
79     self.repout = None
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:
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     if not self.repout:
153       self.repout = tempfile.mkdtemp()
154
155     ficmed = os.path.join (self.repout, "test_{}.adapt.tui.med".format(self.nro_cas))
156     if os.path.isfile(ficmed):
157       os.remove(ficmed)
158
159     objet_adapt.setMEDFileOut(ficmed)
160
161     if self._verbose:
162       print (". Maillage adapté dans le fichier {}".format(ficmed))
163
164     return
165
166 #===========================  Fin de la méthode ==================================
167
168 #=========================== Début de la méthode =================================
169
170   def  _add_file_bkg (self, objet_adapt):
171     """Ajout du fichier med de fond
172
173 Entrées/Sorties :
174   :objet_adapt: l'objet du module
175     """
176     if self._verbose_max:
177       print ("_add_file_bkg pour {}".format(self.nro_cas))
178
179     ficmed = os.path.join (REPDATA, "test_{}_bg.med".format(D_DATA[self.nro_cas]))
180     if self._verbose_max:
181       print ("Fichier {}".format(ficmed))
182     if not os.path.isfile(ficmed):
183       erreur = 1
184       message = "Le fichier {} est inconnu.".format(ficmed)
185     else:
186       objet_adapt.setMEDFileBackground(ficmed)
187       erreur = 0
188       message = ""
189
190     return erreur, message
191
192 #===========================  Fin de la méthode ==================================
193
194 #=========================== Début de la méthode =================================
195
196   def _hypo_creation (self, maptype, option, niveau=3):
197     """Création d'une hypothèse
198
199 Entrées :
200   :maptype: type de carte : "Local", "Background", "Constant"
201   :option: nom du champ si "Local" ou "Background", valeur si "Constant"
202   :niveau: niveau de verbosité
203
204 Sortie :
205   :hypo: l'objet hypothèse
206     """
207     if self._verbose_max:
208       print ("_hypo_creation pour {} avec {}".format(maptype,option))
209
210     erreur = 0
211     message = ""
212
213     while not erreur :
214
215       #--- Création de l'hypothèse ---
216       hypo = smesh.CreateAdaptationHypothesis()
217
218       # Type de données
219       if ( maptype in ("Local", "Background", "Constant") ):
220         hypo.setSizeMapType(maptype)
221       else:
222         message = "Le type de carte {} est inconnu.".format(maptype)
223         erreur = 2
224         break
225
226       # Valeur
227       if ( maptype in ("Local", "Background") ):
228         hypo.setSizeMapFieldName(option)
229       else:
230         hypo.setConstantSize(option)
231
232       # Verbosité
233       self._hypo_verbose (hypo, niveau)
234
235       break
236
237     return erreur, message, hypo
238 #===========================  Fin de la méthode ==================================
239
240 #=========================== Début de la méthode =================================
241
242   def _hypo_verbose (self, hypo, niveau=10):
243     """Débogage des hypothèses
244
245 Entrées :
246   :niveau: niveau de verbosité
247
248 Entrées/Sorties :
249   :hypo: l'objet hypothèse
250     """
251
252     hypo.setVerbosityLevel(niveau)
253
254     if self._verbose_max:
255
256       hypo.setPrintLogInFile(True)
257       hypo.setKeepWorkingFiles(True)
258       hypo.setRemoveOnSuccess(False)
259
260     return
261 #===========================  Fin de la méthode ==================================
262
263 #=========================== Début de la méthode =================================
264
265   def _calcul (self, objet_adapt, hypo):
266     """Calcul
267
268 Entrées :
269   :objet_adapt: l'objet du module
270   :hypo: l'objet hypothèse
271     """
272
273     #--- association de l'hypothese à l'objet de l'adaptation
274     objet_adapt.AddHypothesis(hypo)
275
276     #-- Calcul
277     if self._verbose_max:
278       print (hypo.getCommandToRun())
279     erreur = objet_adapt.Compute(False)
280     if erreur:
281       message = "Echec dans l'adaptation."
282     else:
283       message = ""
284
285     return erreur, message
286
287 #===========================  Fin de la méthode ==================================
288
289 #=========================== Début de la méthode =================================
290
291   def _test_00 (self, objet_adapt):
292     """Test générique
293
294 Entrées/Sorties :
295   :objet_adapt: l'objet du module
296     """
297
298     erreur = 0
299     message = ""
300
301     while not erreur :
302
303       #--- les fichiers MED ---#
304       erreur, message = self._add_file_in (objet_adapt)
305       if erreur:
306         break
307       self._add_file_out (objet_adapt)
308       if self.nro_cas in ("02", "08"):
309         erreur, message = self._add_file_bkg (objet_adapt)
310         if erreur:
311           break
312
313       #--- Création de l'hypothèse ---
314       if self.nro_cas in ("01", "04", "05", "06", "07", "10", "11", "13"):
315         maptype = "Local"
316         if self.nro_cas in ("01", "04", "05", "06", "07", "10"):
317           option = "TAILLE"
318         elif self.nro_cas in ("11",):
319           option = "Taille de maille"
320         elif self.nro_cas in ("13",):
321           option = "Elevation"
322       elif self.nro_cas in ("02", "08"):
323         maptype = "Background"
324         option = "TAILLE"
325       elif self.nro_cas in ("03",):
326         maptype = "Constant"
327         option = 0.5
328
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       elif self.nro_cas in ("13",):
345         hypo.setTimeStepRank(0,0)
346
347       # options facultatives
348       if self.nro_cas in ("03",):
349         hypo.setOptionValue("adaptation", "surface")
350
351       #-- Calcul
352       try :
353         erreur, message = self._calcul (objet_adapt, hypo)
354       except :
355         erreur = 1871
356         message = "Erreur dans le calcul par SMESH"
357
358       break
359
360     return erreur, message
361
362 #===========================  Fin de la méthode ==================================
363
364 #=========================== Début de la méthode =================================
365
366   def _traitement_cas (self ):
367     """Traitement d'un cas
368
369
370 Sorties :
371   :erreur: code d'erreur
372   :message: message d'erreur
373     """
374
375     nom_fonction = __name__ + "/_traitement_cas"
376     blabla = "\nDans {} :".format(nom_fonction)
377
378     if self._verbose_max:
379       print (blabla)
380
381 # 1. Préalables
382
383     erreur = 0
384     message = ""
385     if self._verbose:
386       print ("Passage du cas '{}'".format(self.nro_cas))
387
388     if ( self.nro_cas in ("01", "02", "03", "04", "05", "06", "07", "08", "10" ,"11" ,"13") ):
389       objet_adapt = smesh.Adaptation('MG_Adapt')
390       erreur, message = self._test_00 (objet_adapt)
391       del objet_adapt
392
393     else:
394       erreur = 1
395       message = "Le cas '{}' est inconnu.".format(self.nro_cas)
396
397     return erreur, message
398
399 #===========================  Fin de la méthode ==================================
400
401 #=========================== Début de la méthode =================================
402
403   def lancement (self):
404
405     """Lancement
406
407 Sorties :
408   :erreur: code d'erreur
409   :message: message d'erreur
410     """
411
412     nom_fonction = __name__ + "/lancement"
413     blabla = "\nDans {} :".format(nom_fonction)
414
415     erreur = 0
416     message = ""
417
418     if self._verbose_max:
419       print (blabla)
420
421     for nom_cas in self.l_cas:
422       self.nro_cas = nom_cas
423       erreur_t, message_t = self._traitement_cas ()
424       if erreur_t:
425         erreur += 1
426         message += "\nErreur n° {} pour le cas {} :\n".format(erreur_t,nom_cas)
427         message += message_t
428
429     if ( erreur and self._verbose_max ):
430       print (blabla, message)
431
432     if self.repout:
433       shutil.rmtree(self.repout)
434
435     return erreur, message
436
437 #===========================  Fin de la méthode ==================================
438
439 #==========================  Fin de la classe ====================================
440
441 #==================================================================================
442 # Lancement
443 #==================================================================================
444
445 if __name__ == "__main__" :
446
447 # 1. Options
448
449   L_OPTIONS = list()
450   #L_OPTIONS.append("-h")
451   #L_OPTIONS.append("-v")
452   #L_OPTIONS.append("-vmax")
453   L_OPTIONS.append("01")
454   L_OPTIONS.append("02")
455   L_OPTIONS.append("03")
456   L_OPTIONS.append("07")
457   L_OPTIONS.append("10")
458   L_OPTIONS.append("11")
459   L_OPTIONS.append("04")
460   L_OPTIONS.append("05")
461   L_OPTIONS.append("06")
462   L_OPTIONS.append("08")
463   L_OPTIONS.append("13")
464
465 # 2. Lancement de la classe
466
467   #print ("L_OPTIONS :", L_OPTIONS)
468   MGADAPT_TEST = MGAdaptTest(L_OPTIONS)
469   if MGADAPT_TEST.affiche_aide_globale:
470     sys.stdout.write(MGADAPT_TEST.__doc__+"\n")
471   else:
472     ERREUR, MESSAGE_ERREUR = MGADAPT_TEST.lancement()
473     if ERREUR:
474       sys.stdout.write(MGADAPT_TEST.__doc__+"\n")
475       MESSAGE_ERREUR += "\n {} erreur(s)\n".format(ERREUR)
476       sys.stderr.write(MESSAGE_ERREUR)
477       #raise Exception(MESSAGE_ERREUR)
478       assert(False)
479
480   del MGADAPT_TEST
481
482   #sys.exit(0)