1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2011-2023 CEA/DEN, EDF R&D
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.
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.
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
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 """Python script for HOMARD
22 Utilitaires pour les tests
24 __revision__ = "V4.06"
28 import MEDLoader as ml
30 #========================================================================
31 #========================================================================
32 def get_dir(path_homard, test_name, debug=False) :
34 Get directories for the test.
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)
42 # Répertoire des résultats
44 dircase = os.path.join("/tmp", test_name)
45 if ( os.path.isdir(dircase) ) :
49 dircase = tempfile.mkdtemp(prefix=test_name+"_")
51 return rep_data, dircase
53 #========================================================================
54 #========================================================================
55 def remove_dir(directory) :
57 Empties, then removes a directory.
58 Copyright EDF-R&D 2013
61 l_aux = os.listdir(directory)
63 fic_a = os.path.join(directory, fic)
64 if os.path.isdir(fic_a) :
72 #========================================================================
73 #========================================================================
74 def test_results(rep_test, test_name, dircase, n_iter_test_file, n_rep_test_file, destroy_dir = True) :
77 rep_test: repertoire des tests
78 test_name: nom du test
79 dircase: repertoire des resultats du test
80 n_iter_test_file: numero de l'iteration a tester
81 n_rep_test_file: numero du repertoire de l'iteration a tester
82 destroy_dir: destruction du repertoire de calcul
83 Copyright EDF-R&D 2014
86 test_file_suff = "apad.%02d.bilan" % n_iter_test_file
87 rep_test_file = "I%02d" % n_rep_test_file
89 # Existence du fichier de référence
91 test_file = os.path.join(rep_test, test_name + "." + test_file_suff)
92 mess_error_ref = "\nReference file: " + test_file
93 #print ("test_file = %s" % test_file)
95 with open (test_file, "r") as fichier :
96 les_lignes_ref = fichier.readlines()
98 mess_error = mess_error_ref + "\nThis file does not exist.\n"
100 raise Exception(mess_error)
102 # Existence du fichier de l'exécution courante
104 test_file = os.path.join(dircase, rep_test_file, test_file_suff)
105 if os.path.isfile (test_file) :
106 with open (test_file, "r") as fichier :
107 les_lignes = fichier.readlines()
109 mess_error = "\nResult file: " + test_file
110 mess_error += "\nThis file does not exist.\n"
112 raise Exception(mess_error)
114 # Nombre de lignes identiques
116 nblign = len(les_lignes_ref)
117 if ( len(les_lignes) != nblign ):
118 mess_error = mess_error_ref + "\nResult file: " + test_file
119 mess_error += "\nThe number of lines of the files are not the same.\n"
121 raise Exception(mess_error)
123 # Comparaison des lignes, à l'esception de la date
125 for num in range(nblign) :
126 if ( "creation" not in les_lignes_ref[num] ) :
127 if ( les_lignes_ref[num] != les_lignes[num] ) :
128 message_erreur = "\nRefe : " + les_lignes_ref[num]
129 message_erreur += "Test : " + les_lignes[num][:-1]
130 message_erreur += "\nThe test is different from the reference."
132 raise Exception(message_erreur)
134 # Destruction éventuelle du répertoire du calcul
141 #========================================================================
142 #========================================================================
144 def saveGeometry( xao_file, name, author="" ):
146 Save the geometry in a XAO file
149 from salome.geom import geomBuilder
150 geompy = geomBuilder.New()
153 # find an object having groups in GEOM component
154 component = salome.myStudy.FindObjectByPath("/Geometry")
155 it = salome.myStudy.NewChildIterator( component )
164 if ( go.GetName() == name ) :
165 subIt = salome.myStudy.NewChildIterator( so )
167 subSO = subIt.Value()
169 if not subSO.GetName(): continue # a reference
170 gr = subSO.GetObject()
171 if gr and geompy.ShapeIdToType( gr.GetType() ) == "GROUP":
172 l_groups.append( gr )
177 raise RuntimeError("Cant find a geometry object in the SALOME study with name = '%s'" % name)
179 # save the geom object in a XAO file
181 ok = geompy.ExportXAO( geomObj, l_groups, l_fields, author, xao_file, "" )
186 #========================================================================
187 #========================================================================
189 def repositionnement (rep_calc, fic_med_brut, fic_med_new, xao_file, menage=True, verbose=False) :
192 Pilote le repositionnement des noeuds qui ont bougé
194 rep_calc : répertoire du calcul HOMARD qui est à traiter
195 fic_med_brut : fichier MED du calcul avec les coordonnées avant projection
196 fic_med_new : fichier MED du calcul avec les coordonnées après projection
197 xao_file : fichier XAO de la géométrie
198 menage : Suppression du fichier fic_med_brut
201 ligne = "rep_calc = %s" % rep_calc
202 ligne += "\nfic_med_brut = %s" % fic_med_brut
203 ligne += "\nfic_med_new = %s" % fic_med_new
204 ligne += "\nxao_file = %s" % xao_file
205 ligne += "\nmenage = %d" % menage
212 # 1. l_fr = liste des fichiers des lignes/surfaces a suivre
215 laux = os.listdir(rep_calc)
222 if ( fic[:2] == 'fr' ) :
223 l_fr.append(os.path.join(rep_calc, fic))
224 elif ( fic[-4:] == '.med' ) :
225 fic_hom_med = os.path.join(rep_calc, fic)
226 #print "\t\treperage de fic_hom_med =", fic_hom_med
228 # 2. Lancement du post-traitement si des noeuds sont concernés
233 print("l_fr =", l_fr)
234 print("fic_hom_med =", fic_hom_med)
237 # . prend le maillage brut dans le fichier fic_med_brut
238 # . prend la liste des noeuds à bouger pour chaque groupe concerné
239 # . prend la géométrie dans le fichier xao_file
240 # . retourne le maillage transformé dans le fichier fic_med_new
242 from FrontTrack import FrontTrack
244 ft.track( fic_med_brut, fic_med_new, l_fr, xao_file )
246 # 2.2. Transfert des coordonnées dans le fichier HOMARD MED
248 #if not fic_hom_med :
249 #message = "Impossible de trouver le fichier HOMARD MED dans %s" % rep_calc
253 #fic_coords = os.path.join(rep_calc, "coords")
254 #erreur, message = change_coords (fic_med_new, fic_coords, verbose)
255 ##erreur, message = change_coords_0 (fic_med_new, fic_hom_med, verbose)
259 # 2.3. Ménage éventuel de l'ancien fichier MED
263 if ( fic_med_brut != fic_med_new ) :
265 print("Suppression du fichier %s" % fic_med_brut)
266 os.remove(fic_med_brut)
268 # 3. Renommage du fichier si aucun noeud n'est concerné
272 if ( fic_med_brut != fic_med_new ) :
273 os.rename(fic_med_brut, fic_med_new)
275 # 4. Mise à jour des coordonnées dans le fichier historique HOMARD/MED si des noeuds sont concernés
279 erreur, message = maj_coords (rep_calc, fic_med_new, verbose)
283 return erreur, message
285 #========================================================================
286 #========================================================================
288 def maj_coords (rep_calc, fic_med_calc, verbose=False) :
291 Met à jour les coordonnées du fichier de calcul vers le fichier HOMARD
293 rep_calc : répertoire du calcul HOMARD qui est à traiter
294 fic_med_calc : fichier MED du calcul avec les coordonnées après projection
295 xao_file : fichier XAO de la géométrie
298 ligne = "rep_calc = %s" % rep_calc
299 ligne += "\nfic_med_calc = %s" % fic_med_calc
306 # 1. Recherche des inforamtions permanentes dans le fichier de configuration
308 fic_conf = os.path.join(rep_calc, "HOMARD.Configuration")
309 with open (fic_conf, "r") as fichier :
310 les_lignes = fichier.readlines()
314 for ligne in les_lignes :
316 for saux in ( "HOMai", "CCNoM" ) :
317 if ( saux+"NP1" in ligne ) :
318 iaux = ligne.index(saux)
319 ligne0 += saux + "N__" + ligne[iaux+8:]
321 if ( "NumeIter" in ligne ) :
322 iaux = ligne.index("NumeIter")
323 saux = ligne[iaux+8:-1]
325 s_iter = "%02d" % iaux
326 ligne0 += "NumeIter %s\n" % s_iter
330 message = "Erreur dans le décodage de %s\n" % fic_conf
335 # 2. Création du fichier de configuration
337 fic_conf_sv = os.path.join(rep_calc, "HOMARD.Configuration.majc")
339 with open (fic_conf_sv, "w") as fichier :
342 ligne += "ModeHOMA 5\n"
343 fic = os.path.join(rep_calc, "Liste.%s.maj_coords.log" % s_iter)
344 ligne += "ListeStd %s\n" % fic
345 ligne += "CCMaiN__ %s\n" % fic_med_calc
346 ligne += "RepeTrav %s\n" % rep_calc
347 ligne += "RepeInfo %s\n" % rep_calc
348 ligne += "Action homa\n"
349 ligne += "CCAssoci med\n"
350 ligne += "EcriFiHO N_SANS_FRONTIERE\n"
351 ligne += "MessInfo 10\n"
356 # 3.1. Détermination de l'exécutable
358 if "HOMARD_REP_EXE_PRIVATE" in os.environ :
359 HOMARD_REP_EXE = os.environ["HOMARD_REP_EXE_PRIVATE"]
361 HOMARD_REP_EXE = os.environ["HOMARD_REP_EXE"]
363 if "HOMARD_EXE_PRIVATE" in os.environ :
364 HOMARD_EXE = os.environ["HOMARD_EXE_PRIVATE"]
366 HOMARD_EXE = os.environ["HOMARD_EXE"]
368 homard_exe = os.path.join(HOMARD_REP_EXE, HOMARD_EXE)
370 ligne = "homard_exe = %s" % homard_exe
373 if not os.path.isfile(homard_exe) :
374 message = "homard_exe = %s" % homard_exe
375 message += "\nCe fichier executable n'existe pas."
381 fic_conf = os.path.join(rep_calc, "HOMARD.Configuration")
382 shutil.copyfile(fic_conf_sv, fic_conf)
385 erreur = os.system (homard_exe)
389 return erreur, message
391 #========================================================================
392 #========================================================================