From e0db03172f9b33b1c3ef08a58a33a09d7027b90d Mon Sep 17 00:00:00 2001 From: Gerald NICOLAS Date: Tue, 26 Sep 2017 17:42:04 +0200 Subject: [PATCH] =?utf8?q?Suivi=20de=20fronti=C3=A8res?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/tests/Test/test_util.py | 280 +++++++++++++++++++++++++++++++++++- 1 file changed, 278 insertions(+), 2 deletions(-) diff --git a/src/tests/Test/test_util.py b/src/tests/Test/test_util.py index ad382273..ed11e1f8 100755 --- a/src/tests/Test/test_util.py +++ b/src/tests/Test/test_util.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Copyright (C) 2011-2016 CEA/DEN, EDF R&D +# Copyright (C) 2011-2017 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -21,9 +21,11 @@ Python script for HOMARD Utilitaires pour les tests """ -__revision__ = "V1.4" +__revision__ = "V2.1" import os +import MEDLoader as ml +import shutil #======================================================================== #======================================================================== def remove_dir(directory) : @@ -116,3 +118,277 @@ Copyright EDF-R&D 2014 # #======================================================================== #======================================================================== +# +def saveGeometry( xao_file, name, author="" ): + """ + Save the geometry in a XAO file + """ + import salome + from salome.geom import geomBuilder + geompy = geomBuilder.New(salome.myStudy) + error = 0 + + # find an object having groups in GEOM component + component = salome.myStudy.FindObjectByPath("/Geometry") + it = salome.myStudy.NewChildIterator( component ) + geomObj = None + l_groups = list() + while it.More(): + so = it.Value() + it.Next() + go = so.GetObject() + # + if go: + if ( go.GetName() == name ) : + subIt = salome.myStudy.NewChildIterator( so ) + while subIt.More(): + subSO = subIt.Value() + subIt.Next() + if not subSO.GetName(): continue # a reference + gr = subSO.GetObject() + if gr and geompy.ShapeIdToType( gr.GetType() ) == "GROUP": + l_groups.append( gr ) + geomObj = go + break + + if not geomObj: + raise RuntimeError, "Cant find a geometry object in the SALOME study with name = '%s'" % name + + # save the geom object in a XAO file + l_fields = list() + ok = geompy.ExportXAO( geomObj, l_groups, l_fields, author, xao_file, "" ) + error = not ok + + return error +# +#======================================================================== +#======================================================================== +# +def repositionnement (rep_calc, fic_med_brut, fic_med_new, xao_file, verbose=False) : +# + """ +Pilote le repositionnement des noeuds qui ont bougé +Entrées : + rep_calc : répertoire du calcul HOMARD qui est à traiter + fic_med_brut : fichier MED du calcul avec les coordonnées avant projection + fic_med_new : fichier MED du calcul avec les coordonnées après projection + xao_file : fichier XAO de la géométrie + """ + if verbose : + ligne = "rep_calc = %s" % rep_calc + ligne += "\nfic_med_brut = %s" % fic_med_brut + ligne += "\nfic_med_new = %s" % fic_med_new + ligne += "\nxao_file = %s" % xao_file + print ligne + + message = "" + erreur = 0 + while not erreur : +# +# 1. l_fr = liste des fichiers des lignes/surfaces a suivre +# Les fichiers des numéros de groupes par frontière sont renommés selon le support +# à condition de ne pas être vide. +# + fic_hom_med = None + laux = os.listdir(rep_calc) + #print laux + l_fr = list() + icpt_1D = 0 + icpt_2D = 0 + for fic in laux : + #print "\t" + fic + if ( fic[:5] == 'fort.' ) : + fic_fort = os.path.join(rep_calc, fic) + fichier = open (fic_fort, "r") + les_lignes = fichier.readlines() + fichier.close() + os.remove(fic_fort) + a_faire = False + for ligne in les_lignes[1:] : + laux1 = ligne.split() + if ( len(laux1) >= 3 ) : + a_faire = True + break + if a_faire : + if ( "1D" in les_lignes[0] ) : + nomfic_bis = "fr1D.%02d" % icpt_1D + icpt_1D += 1 + else : + nomfic_bis = "fr2D.%02d" % icpt_2D + icpt_2D += 1 + fic_1 = os.path.join(rep_calc, nomfic_bis) + fichier = open (fic_1, "w") + for ligne in les_lignes[1:] : + if ( ( "1D" not in ligne ) and ( "2D" not in ligne ) ) : + fichier.write(ligne) + fichier.close() + #print "\t\tajout de %s" % fic_1 + l_fr.append(fic_1) + elif ( fic[-4:] == '.med' ) : + fic_hom_med = os.path.join(rep_calc, fic) + #print "\t\treperage de fic_hom_med =", fic_hom_med +# +# 2. Lancement du post-traitement si des noeuds sont concernés +# + if l_fr : +# + if verbose : + print "l_fr =", l_fr + print "fic_hom_med =", fic_hom_med +# +# 2.1. La fonction : +# . prend le maillage brut dans le fichier fic_med_brut +# . prend la liste des noeuds à bouger pour chaque groupe concerné +# . prend la géométrie dans le fichier xao_file +# . retourne le maillage transformé dans le fichier fic_med_new +# + from FrontTrack import FrontTrack + ft = FrontTrack() + ft.track( fic_med_brut, fic_med_new, l_fr, xao_file ) +# +# 2.2. Transfert des coordonnées dans le fichier HOMARD MED +# + #if not fic_hom_med : + #message = "Impossible de trouver le fichier HOMARD MED dans %s" % rep_calc + #erreur = 12 + #break +## + #fic_coords = os.path.join(rep_calc, "coords") + #erreur, message = change_coords (fic_med_new, fic_coords, verbose) + ##erreur, message = change_coords_0 (fic_med_new, fic_hom_med, verbose) + #if erreur : + #break +# +# 2.3. Ménage de l'ancien fichier MED +# + if ( fic_med_brut != fic_med_new ) : + print "Suppression du fichier %s" % fic_med_new + os.remove(fic_med_brut) +# +# 3. Renommage du fichier si aucun noeud n'est concerné +# + else : +# + if ( fic_med_brut != fic_med_new ) : + os.rename(fic_med_brut, fic_med_new) +# +# 4. Mise à jour des coordonnées dans le fichier historique HOMARD/MED si des noeuds sont concernés +# + if l_fr : +# + erreur, message = maj_coords (rep_calc, fic_med_new, verbose) +# + break +# + return erreur, message +# +#======================================================================== +#======================================================================== +# +def maj_coords (rep_calc, fic_med_calc, verbose=False) : +# + """ +Met à jour les coordonnées du fichier de calcul vers le fichier HOMARD +Entrées : + rep_calc : répertoire du calcul HOMARD qui est à traiter + fic_med_calc : fichier MED du calcul avec les coordonnées après projection + xao_file : fichier XAO de la géométrie + """ + if verbose : + ligne = "rep_calc = %s" % rep_calc + ligne += "\nfic_med_calc = %s" % fic_med_calc + print ligne + + message = "" + erreur = 0 + while not erreur : +# +# 1. Recherche des inforamtions permanentes dans le fichier de configuration +# + fic_conf = os.path.join(rep_calc, "HOMARD.Configuration") + fichier = open (fic_conf, "r") + les_lignes = fichier.readlines() + fichier.close() +# + ligne0 = "" + icpt = 0 + for ligne in les_lignes : + #print "\t" + ligne + for saux in ( "HOMai", "CCNoM" ) : + if ( saux+"NP1" in ligne ) : + iaux = ligne.index(saux) + ligne0 += saux + "N__" + ligne[iaux+8:] + icpt += 1 + if ( "NumeIter" in ligne ) : + iaux = ligne.index("NumeIter") + saux = ligne[iaux+8:-1] + iaux = int(saux) + 1 + s_iter = "%02d" % iaux + ligne0 += "NumeIter %s\n" % s_iter + icpt += 1 +# + if ( icpt != 3 ) : + message = "Erreur dans le décodage de %s\n" % fic_conf + message+= ligne0 + erreur = 1 + break +# +# 2. Création du fichier de configuration +# + fic_conf_sv = os.path.join(rep_calc, "HOMARD.Configuration.majc") + fichier = open (fic_conf_sv, "w") +# + ligne = ligne0 + ligne += "ModeHOMA 5\n" + fic = os.path.join(rep_calc, "Liste.%s.maj_coords.log" % s_iter) + ligne += "ListeStd %s\n" % fic + ligne += "CCMaiN__ %s\n" % fic_med_calc + ligne += "RepeTrav %s\n" % rep_calc + ligne += "RepeInfo %s\n" % rep_calc + ligne += "Action homa\n" + ligne += "CCAssoci med\n" + ligne += "EcriFiHO N_SANS_FRONTIERE\n" + ligne += "MessInfo 10\n" +# + fichier.write(ligne) + fichier.close() +# +# 3. Mise à jour +# 3.1. Détermination de l'exécutable +# + if os.environ.has_key("HOMARD_REP_EXE_PRIVATE") : + HOMARD_REP_EXE = os.environ["HOMARD_REP_EXE_PRIVATE"] + else : + HOMARD_REP_EXE = os.environ["HOMARD_REP_EXE"] +# + if os.environ.has_key("HOMARD_EXE_PRIVATE") : + HOMARD_EXE = os.environ["HOMARD_EXE_PRIVATE"] + else : + HOMARD_EXE = os.environ["HOMARD_EXE"] +# + homard_exe = os.path.join(HOMARD_REP_EXE, HOMARD_EXE) + if verbose : + ligne = "homard_exe = %s" % homard_exe + print ligne +# + if not os.path.isfile(homard_exe) : + message = "homard_exe = %s" % homard_exe + message += "\nCe fichier executable n'existe pas." + erreur = 31 + break +# +# 3.2. Lancement +# + fic_conf = os.path.join(rep_calc, "HOMARD.Configuration") + shutil.copyfile(fic_conf_sv, fic_conf) +# + os.chdir(rep_calc) + erreur = os.system (homard_exe) +# + break +# + return erreur, message +# +#======================================================================== +#======================================================================== +# -- 2.39.2