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