Salome HOME
CCAR: merge de la version 1.14 dans la branche principale
[tools/eficas.git] / generator / DefautASTER.py
1 """
2 Ce module contient les variables
3 par defaut pour Aster
4 """
5
6 from OpenturnsSTD import STDGenerateur
7 from OpenturnsXML import XMLGenerateur
8
9 #====================================================
10 # Preparation du fichier STD
11 #====================================================
12 # C.1. Parties du texte en dur dans le fichier STD
13 #-------------------------------------------------
14
15 DecalSTD     = "  "
16 DecalSTDsaut = "\n  "
17
18 TexteSTDFIN ="\n\nexcept : \n"
19 TexteSTDFIN += DecalSTD + "error_message = sys.exc_type\n"
20 TexteSTDFIN += "\nif error_message is not None :\n"
21 TexteSTDFIN += DecalSTD + "texte  = \"\\n=================================================\""
22 TexteSTDFIN += DecalSTD + "texte += \"\\nMessage d'erreur : \" + str(error_message)"
23 TexteSTDFIN += DecalSTD + "texte += \"\\n=================================================\\n\""
24 TexteSTDFIN += DecalSTD + "print texte"
25 TexteSTDFIN += DecalSTD + "\nsys.exit(error_message)\n"
26
27 # C.2. Definition de composants dans le fichier STD
28 #--------------------------------------------------
29
30 NomFunction              = "myFunction"
31 NomPhysicalStartingPoint = "myPhysicalStartingPoint"
32 NomCollection            = "myCollection"
33 NomCopule                = "myCopula"
34 NomDistribution          = "myDistribution"
35 NomRandomVector_in       = "myRandomVector_in"
36 NomRandomVector_out      = "myRandomVector_out"
37 NomEvent                 = "myEvent"
38 NomMethod                = "myMethod"
39 NomAlgo                  = "myAlgo"
40 NomRoot                  = "myRoot"
41 NomSampling              = "mySampling"
42 NomSolverSD              = "mySolver"
43 NomResu                  = "myResu"
44
45 class Defaut :
46 # Cette classe ajoute les parametres par defaut propres au Solver Aster
47 # Elle va d abord enrichir le dictionnaire DictMCVal avec des valeurs par defaut
48 # C est la methode enrichitMCVal
49 # Elle va ensuite enrichir les variables
50 # C est la methode enrichitListeVariables
51   
52   def __init__(self, parent) :
53        self.parent=parent
54        self.enrichitMCVal()
55        self.enrichitListeVariables()
56
57
58   def enrichitMCVal(self) :
59   #=====================
60       # InformationSolver : nom du wrapper, type de fichiers d'echange, etc
61       #----------------------------------------------------------------------
62       # Ajoute les informations sur le wrapper 
63       #        nom du wrapper, type de fichiers d'echange, etc.
64        dico = { "WrapperPath" : "Code_Aster.so",
65                  "FunctionName" : "Code_Aster",
66                  "WrapCouplingMode" : "fork",
67                  "State" : "shared",
68                  "InDataTransfer" : "files",
69                  "OutDataTransfer" : "files",
70               }
71
72        self.parent.ajouteDictMCVal(dico)
73
74       #InformationSolverFile : parametres par defaut pour les fichiers d'echange
75       #--------------------------------------------------------------------------
76
77        liste = []
78        dicoIn = { "Id" : "file_in", "Type" : "in", "Name" : "StdIn", "Path" : "commandes_aster" }
79        liste.append(dicoIn)
80        dicoOut = { "Id" : "file_out", "Type" : "out", "Name" : "StdOut", "Path" : "resultats_aster", }
81        liste.append(dicoOut)
82        dicoFile={"exchange_file" : liste} 
83        self.parent.ajouteDictMCVal(dicoFile)
84
85 # D.2. InformationSolverCommande : arguments, etc
86 #-------------------------------------------------------------------------
87 # InformationSolverCommande est un dictionnaire indexe par le nom du solveur externe appele.
88 # InformationSolverCommande[solveur] est lui-meme un dictionnaire qui contient les parametres
89 # supplementaires pour la commande.
90 # Des parametres sont donnes sous forme de tuple : (ok/nok, "mot-cle") ou (ok/nok, "mot-cle", valeur)
91 # . On ajoute seulement si ok
92 # . Avec (ok/nok, "mot-cle"), on ajoute en arguments les couples ("mot-cle", nom_du_parametre)
93 # . Avec (ok/nok, "mot-cle", valeur), on ajoute en arguments les couples ("mot-cle", valeur)
94
95
96 #       dico = { "file_out"    : (1, "-fic_de_aster_vers_ot"),
97 #                "variable_in" : (1, "-variable") }
98 #       self.parent.InformationSolverCommande["Code_Aster"] = dico          
99
100
101   def enrichitListeVariables(self) :
102        # parametres par defaut pour chaque variable
103        #--------------------------------------------
104
105        dico_in = { "Regexp" : '"^" , "Name", "(.*)= *[0-9eE.+-]+([)]?;?)$"',
106                    "Format" : '"Name", "\\1=%20.13G\\2"'
107                  }
108        dico_out = { "Regexp" : '"(.*)"' }
109        self.parent.ajouteInfoVariables(dico_in,dico_out)          
110
111 class MonSTDGenerateur(STDGenerateur) :
112
113   def CreeResu (self) :
114   #------------------
115     '''
116     Le resultat :
117     . Donnees :
118       . l'algorithme choisi.
119     . Resultats :
120       . Ecriture des odres d'impression.
121     '''
122     if self.DictMCVal.has_key("Analysis"):
123        self.Analysis = str(self.DictMCVal["Analysis"])
124     else :
125        self.Analysis = None
126     self.fic_resu_OpenTURNS = "fic_resu_OpenTURNS_glop"
127     Algorithm = str (self.DictMCVal["Algorithm"])
128     texte  = "\n\n# Le resultat\n"
129     texte += DecalSTDsaut + NomResu + " = " + NomAlgo +  ".getResult()"
130     texte += DecalSTDsaut + "###" + "print " + NomResu
131     texte += DecalSTDsaut + "text_resu  = \"Resultats\\n=======\\n\""
132
133 #   Particularites des algorithmes de fiabilite
134
135     if self.Analysis in ( "Reliability", ) :
136       texte += DecalSTDsaut + "aux = " + NomResu + ".getIsStandardPointOriginInFailureSpace()"
137       texte += DecalSTDsaut + "if aux :"
138       texte += DecalSTDsaut + DecalSTD + "texte_bis = \"est\""
139       texte += DecalSTDsaut + "else :"
140       texte += DecalSTDsaut + DecalSTD + "texte_bis = \"n\'est pas\""
141       texte += DecalSTDsaut + "text_resu += \"\\nLe point initial \" + texte_bis + \" dans l\'espace de defaillance.\""
142       l_aux = [ ("Probabilite de defaillance", "EventProbability") ]
143       l_aux.append ( ("Indice de confiance generalise", "GeneralisedReliabilityIndex") )
144       l_aux.append ( ("Indice de confiance de Hasofer", "HasoferReliabilityIndex") )
145       for t_aux in l_aux :
146         texte += DecalSTDsaut + "text_resu += \"\\n" + t_aux[0] + " = \" + str(" \
147                               + NomResu + ".get" + t_aux[1] + "())"
148       l_aux = []
149       l_aux.append("StandardSpaceDesignPoint")
150       l_aux.append("PhysicalSpaceDesignPoint")
151       l_aux.append("ImportanceFactors")
152       texte += DecalSTDsaut + "l_aux_var = []"
153       for DictVariable in self.ListeVariables :
154         if ( DictVariable["Type"] == "in" ) :
155           texte += DecalSTDsaut + "l_aux_var.append(\"" + DictVariable["Name"] + "\")"
156       texte += DecalSTDsaut + "l_aux = []"
157       for type_resu in l_aux :
158         texte += DecalSTDsaut + "l_aux.append(" + NomResu + ".get" + type_resu + "())"
159       texte += DecalSTDsaut + "for resu in l_aux :"       
160       texte += DecalSTDsaut + DecalSTD + "if not resu.isEmpty() :"       
161       texte += DecalSTDsaut + DecalSTD + DecalSTD + "text_resu += \"\\n\" + resu.getName() + \" :\""       
162       texte += DecalSTDsaut + DecalSTD + DecalSTD + "size = resu.getDimension()"       
163       texte += DecalSTDsaut + DecalSTD + DecalSTD + "l_aux_1 = resu.getCollection()"       
164       texte += DecalSTDsaut + DecalSTD + DecalSTD + "for iaux in range(size) :"       
165       texte += DecalSTDsaut + DecalSTD + DecalSTD + DecalSTD + "text_resu += \"\\n. \" + l_aux_var[iaux] + \" : \" + str(l_aux_1[iaux])"       
166
167 #   Particularites des algorithmes de simulation
168
169     if self.Analysis in ( "Simulation", ) :
170       l_aux = [ ("Probabilite de defaillance", "ProbabilityEstimate") ]
171       l_aux.append ( ("Variance", "VarianceEstimate") )
172       l_aux.append ( ("Nombre d\'iterations", "OuterSampling") )
173       for t_aux in l_aux :
174         texte += DecalSTDsaut + "text_resu += \"\\n" + t_aux[0] + " = \" + str(" \
175                               + NomResu + ".get" + t_aux[1] + "())"
176       texte += DecalSTDsaut + "text_resu += \"\\nNombre d'evaluations de l'etat limite = \" + str(" \
177                                + NomResu + ".getOuterSampling()*" + NomResu + ".getBlockSize())"
178       if self.DictMCVal.has_key("ConfidenceIntervalProbability") :
179         aux = self.DictMCVal["ConfidenceIntervalProbability"]
180         texte += DecalSTDsaut + "proba = " + NomResu + ".getProbabilityEstimate()"
181         texte += DecalSTDsaut + "t_aux = "
182         if ( type(aux) is type(0.) ) :
183           texte += "(" + str(aux) + ")"
184           t_aux = [ str(aux) ]
185         else :
186           texte += str(aux)
187         texte += DecalSTDsaut + "for val in t_aux :"
188         texte += DecalSTDsaut + DecalSTD + "length = " + NomResu + ".getConfidenceLength(val)"
189         texte += DecalSTDsaut + DecalSTD + "vinf = str( proba - 0.5*length )"
190         texte += DecalSTDsaut + DecalSTD + "vsup = str( proba + 0.5*length )"
191         texte += DecalSTDsaut + DecalSTD + "text_resu += \"\\nIntervalle de confiance a \" + str(val) + \" = [ \" "
192         texte += "+ vinf + \" , \" + vsup + \" ]\""
193
194 #   Generalites
195
196     texte += DecalSTDsaut + "d_aux = {}"
197     texte += DecalSTDsaut + "d_aux[\"E\"] = ( \"de la fonction\", " + NomFunction + ".getEvaluationCallsNumber() )"
198     texte += DecalSTDsaut + "d_aux[\"G\"] = ( \"du gradient\", " + NomFunction + ".getGradientCallsNumber() )"
199     texte += DecalSTDsaut + "d_aux[\"H\"] = ( \"du hessien\", " + NomFunction + ".getHessianCallsNumber() )"
200     texte += DecalSTDsaut + "for cle in d_aux.keys() :"
201     texte += DecalSTDsaut + DecalSTD + "if d_aux[cle][1] > 0 :"
202     texte += DecalSTDsaut + DecalSTD + DecalSTD + "text_resu += \"\\nNombre d\'appels au solveur pour le calcul \"" \
203                                 + " + d_aux[cle][0] + \" = \" + str(d_aux[cle][1])"
204
205 #   Impression
206
207     texte += DecalSTDsaut + "print \"\\n\", text_resu, \"\\n\""
208     texte += DecalSTDsaut + "file_resu = open(\"" + self.fic_resu_OpenTURNS + "\", \"w\")"
209     texte += DecalSTDsaut + "file_resu.write(text_resu)"
210     texte += DecalSTDsaut + "file_resu.close()"
211     texte += DecalSTDsaut + "probability = " + NomResu + ".getEventProbability()"
212
213     return texte
214