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