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