Salome HOME
bos #26515 [CEA 24622] Failing SMESH tests
[modules/smesh.git] / src / Tools / blocFissure / CasTests / blocFissureTest.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2014-2021  EDF R&D
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20 __revision__ = "V03.02"
21
22 """Lancement des cas-tests de blocFissure
23
24 Temps par type de matériel :
25 . cubeAngle : 24s ["cubeAngle", "cubeAngle_2"])
26 . cubeFin : 42s ["cubeCoin", "cubeMilieu", "cubeTransverse"]
27 . decoupeCylindre : 8s ["cylindre", "cylindre_2"]
28 . disquePerce (+ ellipse_disque) : 9s ["disquePerce"]
29 . fissureGauche : 26s ["faceGauche"]
30 . fissureGauche_2 (+ ellipse + ellipse_probleme): 22s ["ellipse_1", "ellipse_2", "faceGauche_2"]
31 . eprouvetteCourbe : 22s ["eprouvetteCourbe"]
32 . eprouvetteDroite : 31s ["eprouvetteDroite", "eprouvetteDroite_2"]
33 . vis : 9s ["vis"]
34 . tube : ["tube"]
35 . sans matériel : 66s ["fissureCoude_1", "fissureCoude_2", "fissureCoude_3", "fissureCoude_4", "fissureCoude_5"]
36 . sans matériel : 69s ["fissureCoude_6", "fissureCoude_7", "fissureCoude_8", "fissureCoude_9", "fissureCoude_10"]
37 . sans matériel : 28s ["fissure_Coude", "fissure_Coude_4"]
38 """
39
40 import logging
41 import os
42 import sys
43 import tempfile
44 import traceback
45
46 from blocFissure.gmu import initLog
47 from blocFissure.gmu.casStandard import casStandard
48
49 # -----------------------------------------------------------------------------------------------
50 LOGFILE = tempfile.NamedTemporaryFile().name + "_blocFissure.log"
51 #initLog.setDebug(LOGFILE)     # debug = 10
52 #initLog.setVerbose(LOGFILE)   # info = 20
53 #initLog.setRelease(LOGFILE)   # warning = 30
54 #initLog.setPerfTests(LOGFILE) # critical = 50
55 #initLog.setAlways(LOGFILE)    # critical = 50
56
57 # Les cas qui marchent ...
58 TORUNOK = [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 ] # OK 19/04/2021
59 #           0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28
60 TORUNPB = list()
61 for IAUX in TORUNOK:
62   TORUNPB.append((IAUX+1)%2)
63 print ("TORUN = {} # OK".format(TORUNOK))
64 print ("TORUN = {} # PB".format(TORUNPB))
65
66 # Numéro de référence associé à chaque problème défini par le nom de son fichier dans le répertoire CasTests
67 NREF_PB = dict()
68 NREF_PB["cubeAngle"] = 0
69 NREF_PB["cubeAngle_2"] = 1
70 NREF_PB["cubeCoin"] = 2
71 NREF_PB["cubeMilieu"] = 3
72 NREF_PB["cubeTransverse"] = 4
73 NREF_PB["cylindre"] = 5
74 NREF_PB["cylindre_2"] = 6
75 NREF_PB["disquePerce"] = 7
76 NREF_PB["ellipse_1"] = 8
77 NREF_PB["ellipse_2"] = 9
78 NREF_PB["eprouvetteCourbe"] = 10
79 NREF_PB["eprouvetteDroite"] = 11
80 NREF_PB["eprouvetteDroite_2"] = 12
81 NREF_PB["faceGauche"] = 13
82 NREF_PB["faceGauche_2"] = 14
83 NREF_PB["fissureCoude_1"] = 15
84 NREF_PB["fissureCoude_2"] = 16
85 NREF_PB["fissureCoude_3"] = 17
86 NREF_PB["fissureCoude_4"] = 18
87 NREF_PB["fissureCoude_5"] = 19
88 NREF_PB["fissureCoude_6"] = 20
89 NREF_PB["fissureCoude_7"] = 21
90 NREF_PB["fissureCoude_8"] = 22
91 NREF_PB["fissureCoude_9"] = 23
92 NREF_PB["fissureCoude_10"] = 24
93 NREF_PB["fissure_Coude"] = 25
94 NREF_PB["fissure_Coude_4"] = 26
95 NREF_PB["vis_1"] = 27
96 NREF_PB["tube"] = 28
97
98 #=========================  Début de la classe ===================================
99
100 class blocFissureTest (object):
101
102   """Test de blocFissure
103
104 Options facultatives
105 ********************
106 Le(s) numéro/nom du/des tests à passer. Si aucun n'est donné, tous les cas sont passés.
107   """
108
109 # A. La base
110
111   message_info = ""
112   _verbose = 0
113   _verbose_max = 0
114   affiche_aide_globale = 0
115
116 # B. Les variables
117
118   l_cas = None
119   l_problemes = None
120   d_nom_probleme = None
121   l_materiels = None
122
123 #=========================== Début de la méthode =================================
124
125   def __init__ ( self, liste_option ):
126
127     """Le constructeur de la classe blocFissureTest"""
128
129     self.l_cas = list()
130     erreur = False
131
132     for option in liste_option :
133
134       #print (option, type(option))
135       if isinstance(option, str):
136         saux = option.upper()
137       else:
138         saux = option
139       #print (saux)
140       # Options générales de pilotage
141       if saux in ( "-H", "-HELP" ):
142         self.affiche_aide_globale = 1
143       elif saux == "-V" :
144         self._verbose = 1
145       elif saux == "-VMAX" :
146         self._verbose = 1
147         self._verbose_max = 1
148
149       else :
150       # Options du traitement
151         if isinstance(option, int):
152           self.l_cas.append(option)
153         elif ( option in NREF_PB ):
154           self.l_cas.append(NREF_PB[option])
155         else:
156           print ("Option inconnue : {}".format(option))
157           erreur = True
158
159 # Si aucun cas n'est donné, on prend tous ceux par défaut
160     if not self.l_cas:
161       for i_aux, valeur in enumerate(TORUNOK):
162         if valeur:
163           self.l_cas.append(i_aux)
164
165     if erreur:
166       self.l_cas = list()
167
168     if self._verbose_max:
169       print ("Liste des cas : {}".format(self.l_cas))
170
171     if self._verbose_max:
172       initLog.setVerbose(LOGFILE)   # info = 20
173
174 #===========================  Fin de la méthode ==================================
175
176 #=========================== Début de la méthode =================================
177
178   def __del__(self):
179     """A la suppression de l'instance de classe"""
180     if self._verbose_max:
181       print ("Suppression de l'instance de la classe.")
182
183 #===========================  Fin de la méthode ==================================
184
185 #=========================== Début de la méthode =================================
186
187   def caract_l_problemes (self):
188     """Caractérisation des problèmes"""
189     self.d_nom_probleme = dict()
190     self.l_problemes = list()
191     self.l_materiels = list()
192
193     n_cas = 0
194     if n_cas in self.l_cas:
195       from blocFissure.CasTests.cubeAngle import cubeAngle
196       self.l_problemes.append(cubeAngle(n_cas))
197       self.l_materiels.append("cubeAngle")
198
199     n_cas = 1
200     if n_cas in self.l_cas:
201       from blocFissure.CasTests.cubeAngle_2 import cubeAngle_2
202       self.l_problemes.append(cubeAngle_2(n_cas))
203       self.l_materiels.append("cubeAngle")
204
205     n_cas = 2
206     if n_cas in self.l_cas:
207       from blocFissure.CasTests import cubeCoin
208       self.l_problemes.append(casStandard(cubeCoin.dicoParams, cubeCoin.referencesMaillageFissure, n_cas))
209       self.d_nom_probleme[n_cas] = "cubeCoin"
210       self.l_materiels.append("cubeFin")
211
212     n_cas = 3
213     if n_cas in self.l_cas:
214       from blocFissure.CasTests import cubeMilieu
215       self.l_problemes.append(casStandard(cubeMilieu.dicoParams, cubeMilieu.referencesMaillageFissure, n_cas))
216       self.d_nom_probleme[n_cas] = "cubeMilieu"
217       self.l_materiels.append("cubeFin")
218
219     n_cas = 4
220     if n_cas in self.l_cas:
221       from blocFissure.CasTests import cubeTransverse
222       self.l_problemes.append(casStandard(cubeTransverse.dicoParams, cubeTransverse.referencesMaillageFissure, n_cas))
223       self.d_nom_probleme[n_cas] = "cubeTransverse"
224       self.l_materiels.append("cubeFin")
225
226     n_cas = 5
227     if n_cas in self.l_cas:
228       from blocFissure.CasTests.cylindre import cylindre
229       self.l_problemes.append(cylindre(n_cas))
230       self.l_materiels.append("decoupeCylindre")
231
232     n_cas = 6
233     if n_cas in self.l_cas:
234       from blocFissure.CasTests.cylindre_2 import cylindre_2
235       self.l_problemes.append(cylindre_2(n_cas))
236       self.l_materiels.append("decoupeCylindre")
237
238     n_cas = 7
239     if n_cas in self.l_cas:
240       from blocFissure.CasTests import disquePerce
241       self.l_problemes.append(casStandard(disquePerce.dicoParams, disquePerce.referencesMaillageFissure, n_cas))
242       self.d_nom_probleme[n_cas] = "disquePerce"
243       self.l_materiels.append("disquePerce")
244       self.l_materiels.append("ellipse_disque")
245
246     n_cas = 8
247     if n_cas in self.l_cas:
248       from blocFissure.CasTests.ellipse_1 import ellipse_1
249       self.l_problemes.append(ellipse_1(n_cas))
250       self.l_materiels.append("ellipse")
251       self.l_materiels.append("fissureGauche_2")
252
253     n_cas = 9
254     if n_cas in self.l_cas:
255       from blocFissure.CasTests.ellipse_2 import ellipse_2
256       self.l_problemes.append(ellipse_2(n_cas))
257       self.l_materiels.append("ellipse_probleme")
258       self.l_materiels.append("fissureGauche_2")
259
260     n_cas = 10
261     if n_cas in self.l_cas:
262       from blocFissure.CasTests.eprouvetteCourbe import eprouvetteCourbe
263       self.l_problemes.append(eprouvetteCourbe(n_cas))
264       self.l_materiels.append("eprouvetteCourbe")
265
266     n_cas = 11
267     if n_cas in self.l_cas:
268       from blocFissure.CasTests.eprouvetteDroite import eprouvetteDroite
269       self.l_problemes.append(eprouvetteDroite(n_cas))
270       self.l_materiels.append("eprouvetteDroite")
271
272     n_cas = 12
273     if n_cas in self.l_cas:
274       from blocFissure.CasTests.eprouvetteDroite_2 import eprouvetteDroite_2
275       self.l_problemes.append(eprouvetteDroite_2(n_cas))
276       self.l_materiels.append("eprouvetteDroite")
277
278     n_cas = 13
279     if n_cas in self.l_cas:
280       from blocFissure.CasTests.faceGauche import faceGauche
281       self.l_problemes.append(faceGauche(n_cas))
282       self.l_materiels.append("fissureGauche")
283
284     n_cas = 14
285     if n_cas in self.l_cas:
286       from blocFissure.CasTests.faceGauche_2 import faceGauche_2
287       self.l_problemes.append(faceGauche_2(n_cas))
288       self.l_materiels.append("fissureGauche_2")
289
290     n_cas = 15
291     if n_cas in self.l_cas:
292       from blocFissure.CasTests.fissureCoude_1 import fissureCoude_1
293       self.l_problemes.append(fissureCoude_1(n_cas))
294
295     n_cas = 16
296     if n_cas in self.l_cas:
297       from blocFissure.CasTests.fissureCoude_2 import fissureCoude_2
298       self.l_problemes.append(fissureCoude_2(n_cas))
299
300     n_cas = 17
301     if n_cas in self.l_cas:
302       from blocFissure.CasTests.fissureCoude_3 import fissureCoude_3
303       self.l_problemes.append(fissureCoude_3(n_cas))
304
305     n_cas = 18
306     if n_cas in self.l_cas:
307       from blocFissure.CasTests.fissureCoude_4 import fissureCoude_4
308       self.l_problemes.append(fissureCoude_4(n_cas))
309
310     n_cas = 19
311     if n_cas in self.l_cas:
312       from blocFissure.CasTests.fissureCoude_5 import fissureCoude_5
313       self.l_problemes.append(fissureCoude_5(n_cas))
314
315     n_cas = 20
316     if n_cas in self.l_cas:
317       from blocFissure.CasTests.fissureCoude_6 import fissureCoude_6
318       self.l_problemes.append(fissureCoude_6(n_cas))
319
320     n_cas = 21
321     if n_cas in self.l_cas:
322       from blocFissure.CasTests.fissureCoude_7 import fissureCoude_7
323       self.l_problemes.append(fissureCoude_7(n_cas))
324
325     n_cas = 22
326     if n_cas in self.l_cas:
327       from blocFissure.CasTests.fissureCoude_8 import fissureCoude_8
328       self.l_problemes.append(fissureCoude_8(n_cas))
329
330     n_cas = 23
331     if n_cas in self.l_cas:
332       from blocFissure.CasTests.fissureCoude_9 import fissureCoude_9
333       self.l_problemes.append(fissureCoude_9(n_cas))
334
335     n_cas = 24
336     if n_cas in self.l_cas:
337       from blocFissure.CasTests.fissureCoude_10 import fissureCoude_10
338       self.l_problemes.append(fissureCoude_10(n_cas))
339
340     n_cas = 25
341     if n_cas in self.l_cas:
342       from blocFissure.CasTests.fissure_Coude import fissure_Coude
343       self.l_problemes.append(fissure_Coude(n_cas))
344
345     n_cas = 26
346     if n_cas in self.l_cas:
347       from blocFissure.CasTests.fissure_Coude_4 import fissure_Coude_4
348       self.l_problemes.append(fissure_Coude_4(n_cas))
349
350     n_cas = 27
351     if n_cas in self.l_cas:
352       # genereMateriel : vis
353       from blocFissure.CasTests.vis_1 import vis_1
354       self.l_problemes.append(vis_1(n_cas))
355       self.l_materiels.append("vis")
356
357     n_cas = 28
358     if n_cas in self.l_cas:
359       # genereMateriel : tube
360       from blocFissure.CasTests.tube import tube
361       self.l_problemes.append(tube(n_cas))
362       self.l_materiels.append("tube")
363       #"Mesh_13" has not been computed:
364       #-  "algo2d_facePeau_0" failed on "FACE_12 to mesh". Error: Algorithm failed. NgException at Surface meshing: Problem in Surface mesh generation
365       #-  "algo1d_cercle1_0" failed on EDGE #20. Error: Algorithm failed. Source elements don't cover totally the geometrical edge
366       #-  "algo1d_cercle1_0" failed on EDGE #17. Error: Algorithm failed. Source elements don't cover totally the geometrical edge
367       #-  "algo1d_cercle1_0" failed on EDGE #15. Error: Algorithm failed. Source elements don't cover totally the geometrical edge
368       #-  "algo1d_cercle1_0" failed on EDGE #12. Error: Algorithm failed. Source elements don't cover totally the geometrical edge
369
370     return
371
372 #===========================  Fin de la méthode ==================================
373
374 #=========================== Début de la méthode =================================
375
376   def cree_materiels (self):
377     """Création des matériels"""
378
379     if "cubeAngle" in self.l_materiels:
380       from blocFissure.materielCasTests import cubeAngle
381
382     if "cubeFin" in self.l_materiels:
383       from blocFissure.materielCasTests import cubeFin
384
385     if "decoupeCylindre" in self.l_materiels:
386       from blocFissure.materielCasTests import decoupeCylindre
387
388     if "disquePerce" in self.l_materiels:
389       from blocFissure.materielCasTests import disquePerce
390
391     if "ellipse_disque" in self.l_materiels:
392       from blocFissure.materielCasTests import ellipse_disque
393
394     if "ellipse_probleme" in self.l_materiels:
395       from blocFissure.materielCasTests import ellipse_probleme
396
397     if "ellipse" in self.l_materiels:
398       from blocFissure.materielCasTests import ellipse
399
400     if "fissureGauche" in self.l_materiels:
401       from blocFissure.materielCasTests import fissureGauche
402
403     if "fissureGauche_2" in self.l_materiels:
404       from blocFissure.materielCasTests import fissureGauche_2
405
406     if "eprouvetteCourbe" in self.l_materiels:
407       from blocFissure.materielCasTests import eprouvetteCourbe
408
409     if "eprouvetteDroite" in self.l_materiels:
410       from blocFissure.materielCasTests import eprouvetteDroite
411
412     if "vis" in self.l_materiels:
413       from blocFissure.materielCasTests import vis
414
415     if "tube" in self.l_materiels:
416       from blocFissure.materielCasTests import tube
417
418     return
419
420 #===========================  Fin de la méthode ==================================
421
422 #=========================== Début de la méthode =================================
423
424   def calcul_cas (self, n_cas, cas, ligne):
425     """Calcul d'un cas"""
426     texte = ""
427     if n_cas in self.d_nom_probleme:
428       nom = self.d_nom_probleme[n_cas]
429     else:
430       nom = cas.nomProbleme
431     texte_a = "\n=== Exécution du cas n° {}, '{}'".format(NREF_PB[nom],nom)
432     logging.critical((ligne+texte_a).encode('utf-8'))
433
434     try:
435       ok_maillage = cas.executeProbleme()
436     except:
437       traceback.print_exc()
438       ok_maillage = False
439     if not ok_maillage:
440       texte = "Problème avec le cas n° {}, '{}'\n".format(NREF_PB[nom],nom)
441     print(ligne)
442
443     return ok_maillage, texte
444
445 #===========================  Fin de la méthode ==================================
446
447 #=========================== Début de la méthode =================================
448
449   def calcul_tout (self):
450     """Calcul de tous les cas"""
451
452     ligne = "---------------------------------------------------------------------"
453     texte = "\n"
454     nb_cas_ok = 0
455     nb_cas_nook = 0
456     for n_cas, cas in enumerate(self.l_problemes):
457       #print ("Cas n° {}, '{}'".format(n_cas,cas.nomProbleme))
458       ok_maillage, texte_a = self.calcul_cas (n_cas, cas, ligne)
459       texte += texte_a
460       if ok_maillage:
461         nb_cas_ok += 1
462       else:
463         nb_cas_nook += 1
464       print(ligne)
465
466     nb_cas = nb_cas_nook + nb_cas_ok
467     if ( nb_cas > 1):
468       if nb_cas_nook:
469         texte += ". Nombre de cas_tests OK   : {}\n".format(nb_cas_ok)
470         texte += ". Nombre de cas_tests NOOK : {}\n".format(nb_cas_nook)
471       else:
472         texte += "Les {} tests se sont bien passés.\n".format(nb_cas)
473     print ((texte+ligne).encode('utf-8'))
474     logging.critical((ligne+texte).encode('utf-8'))
475
476     return texte
477
478 #===========================  Fin de la méthode ==================================
479
480 #=========================== Début de la méthode =================================
481
482   def lancement (self):
483     """Lancement général"""
484
485     # Tri des problèmes
486     self.caract_l_problemes ()
487
488     # Création des matériels
489     self.cree_materiels ()
490
491     # Calcul des fissures
492     texte = self.calcul_tout ()
493
494     return texte
495
496 #===========================  Fin de la méthode ==================================
497
498 #==========================  Fin de la classe ====================================
499
500 #==================================================================================
501 # Lancement
502 #==================================================================================
503
504 if __name__ == "__main__" :
505
506 # 1. Options
507
508   L_OPTIONS = sys.argv[1:]
509   L_OPTIONS.append("-v")
510
511 # 2. Lancement de la classe
512
513   #print ("L_OPTIONS :", L_OPTIONS)
514   BLOCFISSURE_TEST = blocFissureTest(L_OPTIONS)
515
516   if BLOCFISSURE_TEST.affiche_aide_globale:
517     sys.stdout.write(BLOCFISSURE_TEST.__doc__+"\n")
518   else:
519     TEXTE = BLOCFISSURE_TEST.lancement()
520     sys.stdout.write(TEXTE)
521
522   del BLOCFISSURE_TEST