Salome HOME
0182563b83abb78cf9d2b7c4a461788abb9dc6f6
[modules/homard.git] / src / tests / Test / test_6.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2011-2016  CEA/DEN, 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 """
21 Python script for HOMARD
22 Test test_6
23 """
24 __revision__ = "V1.03"
25
26 #========================================================================
27 TEST_NAME = "test_6"
28 DEBUG = False
29 N_ITER_TEST_FILE = 3
30 #
31 TAILLE = 10.
32 LG_ARETE = TAILLE*2.5
33 #========================================================================
34 import os
35 import sys
36 import HOMARD
37 import salome
38 #
39 # ==================================
40 PATH_HOMARD = os.getenv('HOMARD_ROOT_DIR')
41 # Repertoire des scripts utilitaires
42 REP_PYTHON = os.path.join(PATH_HOMARD, "bin", "salome", "test", "HOMARD")
43 REP_PYTHON = os.path.normpath(REP_PYTHON)
44 sys.path.append(REP_PYTHON)
45 from test_util import saveGeometry
46 from test_util import get_dir
47 from test_util import test_results
48 # ==================================
49 # Répertoires pour ce test
50 REP_DATA, DIRCASE, DATA_TUTORIAL = get_dir(PATH_HOMARD, TEST_NAME, DEBUG)
51
52 salome.salome_init()
53 import iparameters
54 IPAR = iparameters.IParameters(salome.myStudy.GetCommonParameters("Interface Applicative", 1))
55 IPAR.append("AP_MODULES_LIST", "Homard")
56 #
57 #========================= Debut de la fonction ==================================
58 #
59 def create_geom(nom_obj, taille, verbose=False) :
60   """
61 Création de la géométrie
62   """
63 #
64   erreur = 0
65 #
66   if verbose :
67     texte = "Geometrie '%s'\n" % nom_obj
68     texte += "Taille de base = %f" % taille
69     print (texte)
70 #
71   import GEOM
72   from salome.geom import geomBuilder
73   geompy = geomBuilder.New(salome.myStudy)
74 #
75 # 1. Les sommets et la première ligne
76 #
77   vertex_1 = geompy.MakeVertex( 0.*taille,  0.*taille, 0.*taille, theName = "V1")
78   vertex_2 = geompy.MakeVertex( 5.*taille,  2.*taille, 0.*taille, theName = "V2")
79   vertex_3 = geompy.MakeVertex(10.*taille,  1.*taille, 0.*taille, theName = "V3")
80   vertex_4 = geompy.MakeVertex(16.*taille,  4.*taille, 0.*taille, theName = "V4")
81   vertex_5 = geompy.MakeVertex(16.*taille, 10.*taille, 0.*taille, theName = "V5")
82 #
83   courbe_0 = geompy.MakeInterpol([vertex_1, vertex_2, vertex_3, vertex_4, vertex_5], False, False, theName="courbe_0")
84 #
85 # 2. Les sommets et la seconde ligne
86 #
87   sommet_1 = geompy.MakeVertex( 0.*taille,  0.*taille, 20.*taille, theName = "S1")
88   sommet_2 = geompy.MakeVertex( 6.*taille, -5.*taille, 20.*taille, theName = "S2")
89   sommet_3 = geompy.MakeVertex(11.*taille, -2.*taille, 20.*taille, theName = "S3")
90   sommet_4 = geompy.MakeVertex(12.*taille,  3.*taille, 20.*taille, theName = "S4")
91   sommet_5 = geompy.MakeVertex(16.*taille, 10.*taille, 20.*taille, theName = "S5")
92 #
93   courbe_1 = geompy.MakeInterpol([sommet_1, sommet_2, sommet_3, sommet_4, sommet_5], False, False, theName="courbe_1")
94 #
95 # 3. La face de base
96 #
97   structure_g = geompy.MakeFilling([courbe_0, courbe_1], theName=nom_obj)
98 #
99 # 4. Groupes : on cherche les entites par des proximités avec des shapes bien choisies
100 #
101   l_groupes_g = list()
102 #
103   shape = geompy.GetFaceNearPoint (structure_g, vertex_2)
104   nom = "Voile"
105   groupe_g = geompy.CreateGroup(structure_g, geompy.ShapeType["FACE"], nom)
106   geompy.UnionList ( groupe_g, [shape] )
107   l_groupes_g.append( (nom, groupe_g, 2) )
108 #
109   shape = geompy.GetEdgeNearPoint (structure_g, vertex_2)
110   nom = "C_0"
111   groupe_g = geompy.CreateGroup(structure_g, geompy.ShapeType["EDGE"], nom)
112   geompy.UnionList ( groupe_g, [shape] )
113   l_groupes_g.append( (nom, groupe_g, 1) )
114 #
115   shape = geompy.GetEdgeNearPoint (structure_g, sommet_2)
116   nom = "C_1"
117   groupe_g = geompy.CreateGroup(structure_g, geompy.ShapeType["EDGE"], nom)
118   geompy.UnionList ( groupe_g, [shape] )
119   l_groupes_g.append( (nom, groupe_g, 1) )
120 #
121   shape = geompy.GetEdge (structure_g, vertex_1, sommet_1)
122   nom = "D_0"
123   groupe_g = geompy.CreateGroup(structure_g, geompy.ShapeType["EDGE"], nom)
124   geompy.UnionList ( groupe_g, [shape] )
125   l_groupes_g.append( (nom, groupe_g, 1) )
126 #
127   shape = geompy.GetEdge (structure_g, vertex_5, sommet_5)
128   nom = "D_1"
129   groupe_g = geompy.CreateGroup(structure_g, geompy.ShapeType["EDGE"], nom)
130   geompy.UnionList ( groupe_g, [shape] )
131   l_groupes_g.append( (nom, groupe_g, 1) )
132 #
133   return erreur, structure_g, l_groupes_g
134 #
135 #==========================  Fin de la fonction ==================================
136 #
137 #========================= Debut de la fonction ==================================
138 #
139 def create_mail(lg_arete, structure_g, l_groupes_g, rep_mail, verbose=False) :
140   """
141 Création du maillage
142   """
143 #
144   erreur = 0
145   message = ""
146   ficmed = ""
147 #
148   while not erreur :
149 #
150     nom = structure_g.GetName()
151     if verbose :
152       texte = "Maillage de '%s'\n" % nom
153       texte += "lg_arete = %f\n" % lg_arete
154       texte += "rep_mail = '%s'" % rep_mail
155       print (texte)
156 #
157     import SMESH
158     from salome.smesh import smeshBuilder
159     smesh = smeshBuilder.New(salome.myStudy)
160 #
161 # 2. Maillage de calcul
162 #
163     maill_00 = smesh.Mesh(structure_g)
164     smesh.SetName(maill_00.GetMesh(), nom)
165 #
166     MG_CADSurf = maill_00.Triangle(algo=smeshBuilder.MG_CADSurf)
167     smesh.SetName(MG_CADSurf.GetAlgorithm(), 'MG_CADSurf')
168 #
169     MG_CADSurf_Parameters = MG_CADSurf.Parameters()
170     smesh.SetName(MG_CADSurf_Parameters, 'MG_CADSurf Triangles')
171     MG_CADSurf_Parameters.SetPhySize( lg_arete )
172     MG_CADSurf_Parameters.SetMinSize( lg_arete/20. )
173     MG_CADSurf_Parameters.SetMaxSize( lg_arete*5. )
174     MG_CADSurf_Parameters.SetChordalError( lg_arete )
175     MG_CADSurf_Parameters.SetAngleMesh( 12. )
176 #
177 # 3. Les groupes issus de la géométrie
178 #
179     for taux in l_groupes_g :
180       groupe_m = maill_00.Group(taux[1])
181       smesh.SetName(groupe_m, taux[0])
182 #
183 # 4. Calcul
184 #
185     isDone = maill_00.Compute()
186     if not isDone :
187       message += "Probleme dans le maillage de la surface."
188       erreur = 13
189       break
190 #
191 # 5. Export MED
192 #
193     ficmed = os.path.join(rep_mail,'maill.00.med')
194     texte = "Ecriture du fichier '%s'" % ficmed
195     if verbose :
196       print (texte)
197     maill_00.ExportMED( ficmed, 0, SMESH.MED_V2_2, 1 )
198 #
199     break
200 #
201   return erreur, message, ficmed
202 #
203 #==========================  Fin de la fonction ==================================
204 #
205 #========================= Debut de la fonction ==================================
206 #
207 def homard_exec(nom, ficmed, xao_file, verbose=False):
208   """
209 Python script for HOMARD
210   """
211   erreur = 0
212   message = ""
213 #
214   while not erreur :
215     #
216     HOMARD.SetCurrentStudy(salome.myStudy)
217     #
218     # Frontière
219     # =========
220     if verbose :
221       print(". Frontière")
222     cao_name = "CAO_" + nom
223     la_frontiere = HOMARD.CreateBoundaryCAO(cao_name, xao_file)
224     #
225     # Hypotheses
226     # ==========
227     if verbose :
228       print(". Hypothèses")
229     hyponame = "hypo_" + nom
230     l_hypothese = HOMARD.CreateHypothesis(hyponame)
231     l_hypothese.SetUnifRefinUnRef(1)
232     #
233     # Cas
234     # ===
235     if verbose :
236       print(". Cas")
237     le_cas = HOMARD.CreateCase('case_'+nom, nom, ficmed)
238     le_cas.SetDirName(DIRCASE)
239     le_cas.AddBoundary(cao_name)
240     #
241     # Creation of the iterations
242     # ==========================
243     if verbose :
244       option = 2
245     else :
246       option = 1
247     #
248     for niter in range(1, N_ITER_TEST_FILE+1):
249       if verbose :
250         print(". Itération numéro %d" % niter)
251       iter_name = "I_" + nom + "_%02d" % niter
252       if ( niter == 1 ) :
253         l_iteration = le_cas.NextIteration(iter_name)
254       else :
255         l_iteration = l_iteration.NextIteration(iter_name)
256       l_iteration.SetMeshName(nom)
257       mesh_file = os.path.join(DIRCASE, "maill.%02d.med" % niter)
258       l_iteration.SetMeshFile(mesh_file)
259       l_iteration.AssociateHypo(hyponame)
260       erreur = l_iteration.Compute(1, option)
261       if erreur :
262         erreur = niter
263         break
264     #
265     break
266   #
267   if erreur :
268     message += "Erreur au calcul de l'itération %d" % erreur
269   #
270   return erreur, message
271 #
272 #==========================  Fin de la fonction ==================================
273 #
274 #
275 ERREUR = 0
276 MESSAGE = ""
277 while not ERREUR :
278   #
279   VERBOSE = DEBUG
280   #
281   # A. Geometry
282   #
283   ERREUR, STRUCTURE_G, L_GROUPES_G = create_geom(TEST_NAME, TAILLE, VERBOSE)
284   if ERREUR :
285     MESSAGE = "The construction of the geometry failed."
286     break
287   #
288   # B. Save the geometry
289   #
290   XAO_FILE = os.path.join(DIRCASE, TEST_NAME+".xao")
291   try :
292     ERREUR = saveGeometry(XAO_FILE, TEST_NAME, "test_salome_"+TEST_NAME)
293   except IOError as eee:
294     ERREUR = os.error
295     MESSAGE = str(eee.message)
296   #
297   if ERREUR :
298     MESSAGE += "Pb in saveGeometry"
299     break
300   #
301   # C. Mesh
302   #
303   ERREUR, MESSAGE, FICMED = create_mail(LG_ARETE, STRUCTURE_G, L_GROUPES_G, DIRCASE, VERBOSE)
304   if ERREUR :
305     break
306   #
307   # D. Exec of HOMARD-SALOME
308   #
309   HOMARD = salome.lcc.FindOrLoadComponent('FactoryServer', 'HOMARD')
310   assert HOMARD is not None, "Impossible to load homard engine"
311   HOMARD.SetLanguageShort("fr")
312 #
313   try:
314     ERREUR, MESSAGE = homard_exec(TEST_NAME, FICMED, XAO_FILE, VERBOSE)
315   except RuntimeError as eee:
316     ERREUR = os.error
317     MESSAGE = str(eee.message)
318   #
319   if ERREUR :
320     MESSAGE += "Pb in homard_exec"
321     break
322   #
323   # E. Test of the results
324   #
325   N_REP_TEST_FILE = N_ITER_TEST_FILE
326   DESTROY_DIR = not DEBUG
327   test_results(REP_DATA, TEST_NAME, DIRCASE, N_ITER_TEST_FILE, N_REP_TEST_FILE, DESTROY_DIR)
328   #
329   break
330 #
331 if ERREUR:
332   MESSAGE = "\nErreur numéro %d\n" % ERREUR + MESSAGE
333   raise Exception(MESSAGE)
334 #
335 if salome.sg.hasDesktop():
336   salome.sg.updateObjBrowser(True)
337   iparameters.getSession().restoreVisualState(1)
338