]> SALOME platform Git repositories - modules/homard.git/blob - src/tests/Test/test_util.py
Salome HOME
Mutualisation de recherche de répertoire
[modules/homard.git] / src / tests / Test / test_util.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2011-2017  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 Utilitaires pour les tests
23 """
24 __revision__ = "V4.01"
25
26 import os
27 import tempfile
28 import MEDLoader as ml
29 import shutil
30 #========================================================================
31 #========================================================================
32 def get_dir(path_homard, test_name, debug=False) :
33   """
34 Get directories for the test.
35 Copyright EDF 2018
36   """
37 #
38 # Répertoire des données du test
39   rep_data = os.path.join(path_homard, "share", "salome", "homardsamples")
40   rep_data = os.path.normpath(rep_data)
41 #
42 # Répertoire des résultats
43   if debug :
44     dircase = os.path.join("/tmp", test_name)
45     if ( os.path.isdir(dircase) ) :
46       remove_dir(dircase)
47     os.mkdir(dircase)
48   else :
49     dircase = tempfile.mkdtemp(prefix=test_name)
50 #
51 # Répertoire des données du tutorial
52   data_tutorial = os.path.join(path_homard, "share", "doc", "salome", "gui", "HOMARD", "fr", "_downloads")
53   data_tutorial = os.path.normpath(data_tutorial)
54 #
55   return rep_data, dircase, data_tutorial
56 #
57 #========================================================================
58 #========================================================================
59 def remove_dir(directory) :
60   """
61 Empties, then removes a directory.
62 Copyright EDF-R&D 2013
63   """
64 #
65   l_aux = os.listdir(directory)
66   for fic in l_aux :
67     fic_a = os.path.join(directory, fic)
68     if os.path.isdir(fic_a) :
69       remove_dir(fic_a)
70     else :
71       os.remove(fic_a)
72   os.rmdir(directory)
73 #
74   return
75 #
76 #========================================================================
77 #========================================================================
78 def test_results(rep_test, test_name, dircase, n_iter_test_file, n_rep_test_file, destroy_dir = True) :
79   """
80 Test of the result
81 rep_test: repertoire des tests
82 test_name: nom du test
83 dircase: repertoire des resultats du test
84 n_iter_test_file: numero de l'iteration a tester
85 n_rep_test_file: numero du repertoire de l'iteration a tester
86 destroy_dir: destruction du repertoire de calcul
87 Copyright EDF-R&D 2014
88   """
89   #
90   test_file_suff = "apad.%02d.bilan" % n_iter_test_file
91   rep_test_file = "I%02d" % n_rep_test_file
92 #
93 # Existence du fichier de référence
94   #
95   test_file = os.path.join(rep_test, test_name + "." + test_file_suff)
96   mess_error_ref = "\nReference file: " + test_file
97   #print ("test_file = %s" % test_file)
98   try :
99     with open (test_file, "r") as fichier :
100       les_lignes_ref = fichier.readlines()
101   except :
102     mess_error = mess_error_ref + "\nThis file does not exist.\n"
103     destroy_dir = False
104     raise Exception(mess_error)
105 #
106 # Existence du fichier de l'exécution courante
107 #
108   test_file = os.path.join(dircase, rep_test_file, test_file_suff)
109   if os.path.isfile (test_file) :
110     with open (test_file, "r") as fichier :
111       les_lignes = fichier.readlines()
112   else :
113     mess_error  = "\nResult file: " + test_file
114     mess_error += "\nThis file does not exist.\n"
115     destroy_dir = False
116     raise Exception(mess_error)
117 #
118 # Nombre de lignes identiques
119 #
120   nblign = len(les_lignes_ref)
121   if ( len(les_lignes) != nblign ):
122     mess_error = mess_error_ref +  "\nResult file: " + test_file
123     mess_error += "\nThe number of lines of the files are not the same.\n"
124     destroy_dir = False
125     raise Exception(mess_error)
126 #
127 # Comparaison des lignes, à l'esception de la date
128 #
129   for num in range(nblign) :
130     if ( "creation" not in les_lignes_ref[num] ) :
131       if ( les_lignes_ref[num] != les_lignes[num] ) :
132         message_erreur = "\nRefe : " + les_lignes_ref[num]
133         message_erreur += "Test : " + les_lignes[num][:-1]
134         message_erreur += "\nThe test is different from the reference."
135         destroy_dir = False
136         raise Exception(message_erreur)
137 #
138 # Destruction éventuelle du répertoire du calcul
139 #
140   if destroy_dir:
141     remove_dir(dircase)
142 #
143   return
144 #
145 #========================================================================
146 #========================================================================
147 #
148 def saveGeometry( xao_file, name, author="" ):
149   """
150   Save the geometry in a XAO file
151   """
152   import salome
153   from salome.geom import geomBuilder
154   geompy = geomBuilder.New(salome.myStudy)
155   error = 0
156
157   # find an object having groups in GEOM component
158   component = salome.myStudy.FindObjectByPath("/Geometry")
159   it = salome.myStudy.NewChildIterator( component )
160   geomObj = None
161   l_groups = list()
162   while it.More():
163     so = it.Value()
164     it.Next()
165     go = so.GetObject()
166     #
167     if go:
168       if ( go.GetName() == name ) :
169         subIt = salome.myStudy.NewChildIterator( so )
170         while subIt.More():
171           subSO = subIt.Value()
172           subIt.Next()
173           if not subSO.GetName(): continue # a reference
174           gr = subSO.GetObject()
175           if gr and geompy.ShapeIdToType( gr.GetType() ) == "GROUP":
176             l_groups.append( gr )
177         geomObj = go
178         break
179
180   if not geomObj:
181     raise RuntimeError("Cant find a geometry object in the SALOME study with name = '%s'" % name)
182
183   # save the geom object in a XAO file
184   l_fields = list()
185   ok = geompy.ExportXAO( geomObj, l_groups, l_fields, author, xao_file, "" )
186   error = not ok
187
188   return error
189 #
190 #========================================================================
191 #========================================================================
192 #
193 def repositionnement (rep_calc, fic_med_brut, fic_med_new, xao_file, menage=True, verbose=False) :
194 #
195   """
196 Pilote le repositionnement des noeuds qui ont bougé
197 Entrées :
198   rep_calc : répertoire du calcul HOMARD qui est à traiter
199   fic_med_brut : fichier MED du calcul avec les coordonnées avant projection
200   fic_med_new  : fichier MED du calcul avec les coordonnées après projection
201   xao_file : fichier XAO de la géométrie
202   menage : Suppression du fichier fic_med_brut
203   """
204   if verbose :
205     ligne =    "rep_calc     = %s" % rep_calc
206     ligne += "\nfic_med_brut = %s" % fic_med_brut
207     ligne += "\nfic_med_new  = %s" % fic_med_new
208     ligne += "\nxao_file     = %s" % xao_file
209     ligne += "\nmenage       = %d" % menage
210     print(ligne)
211
212   message = ""
213   erreur = 0
214   while not erreur :
215 #
216 # 1. l_fr = liste des fichiers des lignes/surfaces a suivre
217 #
218     fic_hom_med = None
219     laux = os.listdir(rep_calc)
220     #print laux
221     l_fr = list()
222     icpt_1D = 0
223     icpt_2D = 0
224     for fic in laux :
225       #print "\t" + fic
226       if ( fic[:2] == 'fr' ) :
227         l_fr.append(os.path.join(rep_calc, fic))
228       elif ( fic[-4:] == '.med' ) :
229         fic_hom_med = os.path.join(rep_calc, fic)
230         #print "\t\treperage de fic_hom_med =", fic_hom_med
231 #
232 # 2. Lancement du post-traitement si des noeuds sont concernés
233 #
234     if l_fr :
235 #
236       if verbose :
237         print("l_fr =", l_fr)
238         print("fic_hom_med =", fic_hom_med)
239 #
240 # 2.1.  La fonction :
241 #    . prend le maillage brut dans le fichier fic_med_brut
242 #    . prend la liste des noeuds à bouger pour chaque groupe concerné
243 #    . prend la géométrie dans le fichier xao_file
244 #    . retourne le maillage transformé dans le fichier fic_med_new
245 #
246       from FrontTrack import FrontTrack
247       ft = FrontTrack()
248       ft.track( fic_med_brut, fic_med_new, l_fr, xao_file )
249 #
250 # 2.2. Transfert des coordonnées dans le fichier HOMARD MED
251 #
252       #if not fic_hom_med :
253         #message = "Impossible de trouver le fichier HOMARD MED dans %s" % rep_calc
254         #erreur = 12
255         #break
256 ##
257       #fic_coords = os.path.join(rep_calc, "coords")
258       #erreur, message = change_coords (fic_med_new, fic_coords, verbose)
259       ##erreur, message = change_coords_0 (fic_med_new, fic_hom_med, verbose)
260       #if erreur :
261         #break
262 #
263 # 2.3. Ménage éventuel de l'ancien fichier MED
264 #
265       if menage :
266 #
267         if ( fic_med_brut != fic_med_new ) :
268           if verbose :
269             print("Suppression du fichier %s" % fic_med_brut)
270           os.remove(fic_med_brut)
271 #
272 # 3. Renommage du fichier si aucun noeud n'est concerné
273 #
274     else :
275 #
276       if ( fic_med_brut != fic_med_new ) :
277         os.rename(fic_med_brut, fic_med_new)
278 #
279 # 4. Mise à jour des coordonnées dans le fichier historique HOMARD/MED si des noeuds sont concernés
280 #
281     if l_fr :
282 #
283       erreur, message = maj_coords (rep_calc, fic_med_new, verbose)
284 #
285     break
286 #
287   return erreur, message
288 #
289 #========================================================================
290 #========================================================================
291 #
292 def maj_coords (rep_calc, fic_med_calc, verbose=False) :
293 #
294   """
295 Met à jour les coordonnées du fichier de calcul vers le fichier HOMARD
296 Entrées :
297   rep_calc : répertoire du calcul HOMARD qui est à traiter
298   fic_med_calc  : fichier MED du calcul avec les coordonnées après projection
299   xao_file : fichier XAO de la géométrie
300   """
301   if verbose :
302     ligne =    "rep_calc     = %s" % rep_calc
303     ligne += "\nfic_med_calc = %s" % fic_med_calc
304     print(ligne)
305
306   message = ""
307   erreur = 0
308   while not erreur :
309 #
310 # 1. Recherche des inforamtions permanentes dans le fichier de configuration
311 #
312     fic_conf = os.path.join(rep_calc, "HOMARD.Configuration")
313     with open (fic_conf, "r") as fichier :
314       les_lignes = fichier.readlines()
315 #
316     ligne0 = ""
317     icpt = 0
318     for ligne in les_lignes :
319       #print "\t" + ligne
320       for saux in ( "HOMai", "CCNoM" ) :
321         if ( saux+"NP1" in ligne ) :
322           iaux = ligne.index(saux)
323           ligne0 += saux + "N__" + ligne[iaux+8:]
324           icpt += 1
325       if ( "NumeIter" in ligne ) :
326         iaux = ligne.index("NumeIter")
327         saux = ligne[iaux+8:-1]
328         iaux = int(saux) + 1
329         s_iter = "%02d" % iaux
330         ligne0 += "NumeIter %s\n" % s_iter
331         icpt += 1
332 #
333     if ( icpt != 3 ) :
334       message = "Erreur dans le décodage de %s\n" % fic_conf
335       message+= ligne0
336       erreur = 1
337       break
338 #
339 # 2. Création du fichier de configuration
340 #
341     fic_conf_sv = os.path.join(rep_calc, "HOMARD.Configuration.majc")
342 #
343     with open (fic_conf_sv, "w") as fichier :
344 #
345       ligne = ligne0
346       ligne += "ModeHOMA 5\n"
347       fic = os.path.join(rep_calc, "Liste.%s.maj_coords.log" % s_iter)
348       ligne += "ListeStd %s\n" % fic
349       ligne += "CCMaiN__ %s\n" % fic_med_calc
350       ligne += "RepeTrav %s\n" % rep_calc
351       ligne += "RepeInfo %s\n" % rep_calc
352       ligne += "Action   homa\n"
353       ligne += "CCAssoci med\n"
354       ligne += "EcriFiHO N_SANS_FRONTIERE\n"
355       ligne += "MessInfo 10\n"
356 #
357       fichier.write(ligne)
358 #
359 # 3. Mise à jour
360 # 3.1. Détermination de l'exécutable
361 #
362     if "HOMARD_REP_EXE_PRIVATE" in os.environ :
363       HOMARD_REP_EXE  = os.environ["HOMARD_REP_EXE_PRIVATE"]
364     else :
365       HOMARD_REP_EXE  = os.environ["HOMARD_REP_EXE"]
366 #
367     if "HOMARD_EXE_PRIVATE" in os.environ :
368       HOMARD_EXE  = os.environ["HOMARD_EXE_PRIVATE"]
369     else :
370       HOMARD_EXE  = os.environ["HOMARD_EXE"]
371 #
372     homard_exe = os.path.join(HOMARD_REP_EXE, HOMARD_EXE)
373     if verbose :
374       ligne = "homard_exe = %s" % homard_exe
375       print(ligne)
376 #
377     if not os.path.isfile(homard_exe) :
378       message = "homard_exe = %s" % homard_exe
379       message += "\nCe fichier executable n'existe pas."
380       erreur = 31
381       break
382 #
383 # 3.2. Lancement
384 #
385     fic_conf = os.path.join(rep_calc, "HOMARD.Configuration")
386     shutil.copyfile(fic_conf_sv, fic_conf)
387 #
388     os.chdir(rep_calc)
389     erreur = os.system (homard_exe)
390 #
391     break
392 #
393   return erreur, message
394 #
395 #========================================================================
396 #========================================================================
397 #