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