1 #@ MODIF macr_fiabilite_ops Macro DATE 27/11/2006 AUTEUR GNICOLAS G.NICOLAS
2 # -*- coding: iso-8859-1 -*-
3 # CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2004 EDF R&D WWW.CODE-ASTER.ORG
6 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
7 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
8 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
9 # (AT YOUR OPTION) ANY LATER VERSION.
11 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
12 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
13 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
14 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
16 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
17 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
18 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
19 # ======================================================================
22 # RESPONSABLE GNICOLAS G.NICOLAS
24 def macr_fiabilite_ops(self, INFO,
26 UNITE_ESCL, MESS_ASTER,
31 # args est le dictionnaire des arguments optionnels
32 # args.keys() est la liste des mots-clés
33 # args.keys()[0] est la premiere valeur de cette liste
34 # args.keys()[1:] est la liste des valeurs suivantes dans cette liste
35 # args.keys(mot_cle) représente le contenu de la variable mot_cle dans la macro appelante.
38 ### if len (args.keys())>0 : print args.keys()[0]
40 """ Macro-commande réalisant le pilotage du logiciel de fiabilite. """
42 # On charge les modules nécessaires
44 from Macro import fiabilite_mefisto
51 #____________________________________________________________________
54 #____________________________________________________________________
56 # 1.1 ==> La macro compte pour 1 dans l'exécution des commandes
60 # 1.2 ==> On importe les définitions des commandes Aster utilisées
63 EXEC_LOGICIEL = self.get_cmd("EXEC_LOGICIEL")
64 DEFI_LIST_REEL = self.get_cmd("DEFI_LIST_REEL")
66 # 1.3 ==> Le nom du programme de fiabilite à lancer
68 repertoire_outils = aster.repout()
69 fiabilite = repertoire_outils + "fiabilite"
71 # 1.4 ==> Initialisations
75 Rep_Calc_ASTER = os.getcwd()
76 Nom_Exec_ASTER = sys.executable
78 messages_erreur = { 0 : "Tout va bien",
79 1 : "Impossible de créer le répertoire de travail pour le logiciel de fiabilité.",
80 2 : "Probleme d'ouverture du fichier.",
81 10 : "Erreur dans le choix du logiciel de fiabilité.",
82 11 : "Erreur dans la création des données pour le logiciel de fiabilité.",
87 #____________________________________________________________________
89 # 2. Répertoires et fichiers
90 #____________________________________________________________________
92 # 2.1. ==> Création du répertoire pour l'exécution du logiciel de fiabilité
94 Nom_Rep_local = "tmp_fiabilite"
95 Rep_Calc_LOGICIEL_local = os.path.join(".", Nom_Rep_local)
96 Rep_Calc_LOGICIEL_global = os.path.join(Rep_Calc_ASTER, Nom_Rep_local)
99 os.mkdir(Rep_Calc_LOGICIEL_global)
100 except os.error, erreur_partiel :
101 self.cr.warn("Code d'erreur de mkdir : " + str(erreur_partiel[0]) + " : " + erreur_partiel[1])
102 self.cr.fatal("Impossible de créer le répertoire de travail pour le logiciel de fiabilité : "+Rep_Calc_LOGICIEL_global)
106 # 2.2. ==> On définit un fichier pour les résultats du calcul de fiabilité
108 FIC_RESU_FIABILITE = os.path.join(Rep_Calc_LOGICIEL_global, "resu_fiabilite")
110 # 2.3. ==> On crée un fichier annexe pour transmettre des données à la procédure
111 # de lancement des calculs ASTER par le LOGICIEL.
112 # Ce fichier est créé dans le répertoire d'exécution du logiciel de fiabilité.
113 # On fait ainsi car les arguments passés ont du mal à transiter via l'exécutable.
115 # 1. Le niveau d'information
116 # 2. L'unité logique associée au jeu de commandes déterministes
117 # 3. La gestion des sorties ASTER
118 # 4. Le nom de l'exécutable ASTER
119 # 5. Le type de seuil du problème (maximum ou minimum)
121 fic_Info_ASTER = os.path.join(Rep_Calc_LOGICIEL_global,"InfoExecASTER")
123 f_execAster = open(fic_Info_ASTER, "w")
124 except os.error,erreur_partiel :
125 self.cr.warn("Fichier : "+fic_Info_ASTER)
126 self.cr.warn("Code d'erreur de open : " + str(erreur_partiel[0]) + " : " + erreur_partiel[1])
130 f_execAster.write(str(INFO)+"\n")
131 f_execAster.write(str(UNITE_ESCL)+"\n")
132 f_execAster.write(str(MESS_ASTER)+"\n")
133 f_execAster.write(str(Nom_Exec_ASTER)+"\n")
134 f_execAster.write(str(SEUIL_TYPE))
136 fichier = open (fic_Info_ASTER,"r")
139 print "\nContenu du fichier " + fic_Info_ASTER," :"
140 les_lignes = fichier.readlines()
142 print les_lignes, "\n"
144 #____________________________________________________________________
146 # 3. Les variables par defaut
147 #____________________________________________________________________
149 # 3.1. ==> Dictionnaire des valeurs physiques et liées à la loi
153 for la_variable in VARIABLE :
155 v_moy_physique = None
161 # 3.1.1. ==> loi uniforme : transfert des min et max
162 # on définit une moyennne comme étant la médiane des extremes.
164 if la_variable["LOI"] == "UNIFORME" :
165 v_moy_physique = 0.5 * ( la_variable["VALE_MIN"] + la_variable["VALE_MAX"] )
166 v_min_loi = la_variable["VALE_MIN"]
167 v_max_loi = la_variable["VALE_MAX"]
169 # 3.1.2. ==> loi normale : transfert des moyennne et écart-type.
171 elif la_variable["LOI"] == "NORMALE" :
172 v_moy_loi = la_variable["VALE_MOY"]
173 v_moy_physique = v_moy_loi
174 sigma_loi = la_variable["ECART_TYPE"]
176 # 3.1.3. ==> loi lognormale : identité du min, conversion pour le reste
178 elif la_variable["LOI"] == "LOGNORMALE" :
179 v_min_loi = la_variable["VALE_MIN"]
180 if la_variable["VALE_MOY_PHY"] is None :
181 v_moy_loi = la_variable["VALE_MOY"]
182 sigma_loi = la_variable["ECART_TYPE"]
183 aux = Numeric.exp(0.5*sigma_loi*sigma_loi+v_moy_loi)
184 v_moy_physique = v_min_loi + aux
186 v_moy_physique = la_variable["VALE_MOY_PHY"]
187 aux = la_variable["ECART_TYPE_PHY"]/(la_variable["VALE_MOY_PHY"]-la_variable["VALE_MIN"])
189 aux2 = Numeric.sqrt(aux1)
190 v_moy_loi = Numeric.log((la_variable["VALE_MOY_PHY"]-la_variable["VALE_MIN"])/aux2)
191 aux2 = Numeric.log(aux1)
192 sigma_loi = Numeric.sqrt(aux2)
194 # 3.1.4. ==> loi normale tronquée : transfert des moyenne, mini/maxi et écart-type
195 # on définit une moyennne comme étant la médiane des extremes.
198 v_moy_loi = la_variable["VALE_MOY"]
199 v_min_loi = la_variable["VALE_MIN"]
200 v_max_loi = la_variable["VALE_MAX"]
201 sigma_loi = la_variable["ECART_TYPE"]
202 v_moy_physique = 0.5 * ( la_variable["VALE_MIN"] + la_variable["VALE_MAX"] )
205 dico["v_moy_physique"] = v_moy_physique
206 dico["v_moy_loi"] = v_moy_loi
207 dico["v_min_loi"] = v_min_loi
208 dico["v_max_loi"] = v_max_loi
209 dico["sigma_loi"] = sigma_loi
210 valeurs_lois[la_variable] = dico
212 #____________________________________________________________________
214 # 4. Création des fichiers de donnees pour le logiciel de fiabilite
215 #____________________________________________________________________
217 if ( LOGICIEL == "MEFISTO" ) :
221 erreur = fiabilite_mefisto.fiabilite_mefisto ( self, Rep_Calc_LOGICIEL_global,
228 # 4.2. ==> Erreur si autre logiciel
232 self.cr.warn("Logiciel de fiabilité : "+LOGICIEL)
235 # 4.3. ==> Arret en cas d'erreur
240 #____________________________________________________________________
242 # 5. Ecriture de la commande d"exécution du logiciel de fiabilité
244 # Remarque : dans la donnée de la version du logiciel de fiabilité, il faut remplacer
245 # le _ de la donnée par un ., qui
246 # est interdit dans la syntaxe du langage de commandes ASTER
247 # Remarque : il faut remplacer le N majuscule de la donnee par
248 # un n minuscule, qui est interdit dans la syntaxe du langage
250 #____________________________________________________________________
253 VERSION = string.replace(VERSION, "_", ".")
254 VERSION = string.replace(VERSION, "N", "n")
256 EXEC_LOGICIEL ( ARGUMENT = (Rep_Calc_LOGICIEL_global, # nom du repertoire
257 LOGICIEL, # nom du logiciel de fiabilité
258 VERSION, # version du logiciel de fiabilité
259 FIC_RESU_FIABILITE, # fichier des résultats du logiciel de fiabilité
264 #--------------------------------------------------------------------
266 #--------------------------------------------------------------------
270 # 6.1. ==> Arret en cas d'erreur
273 if not messages_erreur.has_key(erreur) :
275 self.cr.fatal(messages_erreur[erreur])
277 # 6.2. ==> Si tout va bien, on crée une liste de réels pour le retour.
278 # Si le fichier n'a pas été rempli, on met une valeur nulle unique.
280 if os.path.isfile(FIC_RESU_FIABILITE) :
282 fic = open(FIC_RESU_FIABILITE, "r")
283 tout = fic.readlines()
286 liste_reel.append(float(ligne[:-1]))
290 self.DeclareOut("nomres", self.sd)
291 nomres = DEFI_LIST_REEL( VALE = liste_reel , INFO = 1 )
293 # 6.3. ==> Menage du répertoire créé pour le calcul fiabiliste
295 liste = os.listdir(Rep_Calc_LOGICIEL_global)
298 for nomfic in liste :
299 fic_total = os.path.join(Rep_Calc_LOGICIEL_global, nomfic)
301 if os.path.isdir(fic_total) :
302 liste_bis = os.listdir(fic_total)
303 for nomfic_bis in liste_bis :
304 fic_total_bis = os.path.join(fic_total, nomfic_bis)
305 if os.path.islink(fic_total_bis) :
306 os.unlink (fic_total_bis)
308 os.chmod (fic_total_bis, 0755)
309 os.remove (fic_total_bis)
312 elif os.path.isfile(fic_total) :
313 os.chmod (fic_total, 0755)
314 os.remove (fic_total)
316 os.rmdir (Rep_Calc_LOGICIEL_global)
320 ########################## Fin de la fonction##################################
322 ########################## Auto-test##################################
324 if __name__ == "__main__" :
330 Rep_Calc_LOGICIEL_global = tempfile.mktemp()
331 os.mkdir(Rep_Calc_LOGICIEL_global)
338 MESS_ASTER = "DERNIER"
340 SEUIL_TYPE = "MAXIMUM"
344 lr8 = macr_fiabilite_ops(classe, INFO,
346 UNITE_ESCL, MESS_ASTER,
350 ### print "lr8 = ", lr8
351 Liste = os.listdir(Rep_Calc_LOGICIEL_global)
353 for nomfic in Liste :
354 fic_total = os.path.join(Rep_Calc_LOGICIEL_global, nomfic)
355 os.chmod (fic_total, 0755)
356 os.remove (fic_total)
357 os.rmdir (Rep_Calc_LOGICIEL_global)