Salome HOME
CCAR: merge de la version 1.14 dans la branche principale
[tools/eficas.git] / Aster / Cata / cataSTA9 / Macro / reca_controles.py
1 #@ MODIF reca_controles Macro  DATE 16/10/2007   AUTEUR REZETTE C.REZETTE 
2 # -*- coding: iso-8859-1 -*-
3 # RESPONSABLE ASSIRE A.ASSIRE
4 #            CONFIGURATION MANAGEMENT OF EDF VERSION
5 # ======================================================================
6 # COPYRIGHT (C) 1991 - 2006  EDF R&D                  WWW.CODE-ASTER.ORG
7 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY  
8 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY  
9 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR     
10 # (AT YOUR OPTION) ANY LATER VERSION.                                                  
11 #                                                                       
12 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT   
13 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF            
14 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU      
15 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.                              
16 #                                                                       
17 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE     
18 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,         
19 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.        
20 # ======================================================================
21
22 import string, copy, Numeric, types, os, sys, pprint
23 from externe_mess import UTMESS
24
25 # Nom de la routine
26 nompro = 'MACR_RECAL'
27
28
29
30 #_____________________________________________
31 #
32 # CONTROLE DES ENTREES UTILISATEUR
33 #_____________________________________________
34
35 # ------------------------------------------------------------------------------
36
37 def erreur_de_type(code_erreur,X):
38    """
39    code_erreur ==0 --> X est une liste
40    code erreur ==1 --> X est un char
41    code erreur ==2 --> X est un float
42    test est un boolean (test = 0 défaut et 1 si un test if est verifier
43    """
44
45    txt = ""
46    if(code_erreur == 0 ):
47       if type(X) is not types.ListType:
48          txt="\nCette entrée: " +str(X)+" n'est pas une liste valide"
49    if(code_erreur == 1 ):
50       if type(X) is not types.StringType:
51          txt="\nCette entrée: " +str(X)+" n'est pas une chaine de caractère valide ; Veuillez la ressaisir en lui appliquant le type char de python"
52    if(code_erreur == 2 ):
53       if type(X) is not types.FloatType:
54          txt="\nCette entrée:  " +str(X)+" n'est pas une valeur float valide ; Veuillez la ressaisir en lui appliquant le type float de python"
55    return txt
56    
57
58 # ------------------------------------------------------------------------------
59    
60 def erreur_dimension(PARAMETRES,REPONSES):
61    """
62    On verifie que la dimension de chaque sous_liste de parametre est 4
63    et que la dimension de chaque sous_liste de REPONSES est 3
64    """
65
66    txt = ""
67    for i in range(len(PARAMETRES)):
68       if (len(PARAMETRES[i]) != 4):
69          txt=txt + "\nLa sous-liste de la variable paramètre numéro " + str(i+1)+" n'est pas de longueur 4"
70    for i in range(len(REPONSES)):
71       if (len(REPONSES[i]) != 3):
72          txt=txt + "\nLa sous-liste de la variable réponse numéro " + str(i+1)+" n'est pas de longueur 3"
73    return txt
74
75
76 # ------------------------------------------------------------------------------
77
78 def compare__dim_rep__dim_RESU_EXP(REPONSES,RESU_EXP):
79    """
80    X et Y sont deux arguments qui doivent avoir la meme dimension
81    pour éviter l'arret du programme
82    """
83
84    txt = ""
85    if( len(REPONSES) != len(RESU_EXP)):
86       txt="\nVous avez entré " +str(len(REPONSES))+ " réponses et "+str(len(RESU_EXP))+ " expériences ; On doit avoir autant de réponses que de résultats expérimentaux"
87    return txt
88
89
90 # ------------------------------------------------------------------------------
91
92 def compare__dim_poids__dim_RESU_EXP(POIDS,RESU_EXP):
93    """
94    POIDS et Y sont deux arguments qui doivent avoir la meme dimension
95    pour éviter l'arret du programme
96    """
97
98    txt = ""
99    if( len(POIDS) != len(RESU_EXP)):
100       txt="\nVous avez entré " +str(len(POIDS))+ " poids et "+str(len(RESU_EXP))+ " expériences ; On doit avoir autant de poids que de résultats expérimentaux"
101    return txt
102
103
104 # ------------------------------------------------------------------------------
105
106 def verif_fichier(UL,PARAMETRES,REPONSES):
107    """
108    On verifie les occurences des noms des PARAMETRES et REPONSES 
109    dans le fichier de commande ASTER
110    """
111
112    txt = ""
113    txt_alarme = ""
114    try:
115       fichier = open('fort.'+str(UL),'r')
116       fic=fichier.read()
117    except:
118       txt += "\nImpossible d'ouvrir le fichier esclave declare avec l'unite logique " + str(UL)
119       return txt, txt_alarme
120    for i in range(len(PARAMETRES)):
121       if((string.find(fic,PARAMETRES[i][0])==-1) or ((string.find(fic,PARAMETRES[i][0]+'=')==-1) and (string.find(fic,PARAMETRES[i][0]+' ')==-1))):
122          txt += "\nLe paramètre "+PARAMETRES[i][0]+" que vous avez entré pour la phase d'optimisation n'a pas été trouvé dans votre fichier de commandes ASTER"
123    for i in range(len(REPONSES)):
124       if((string.find(fic,REPONSES[i][0])==-1) or ((string.find(fic,REPONSES[i][0]+'=')==-1) and (string.find(fic,REPONSES[i][0]+' ')==-1))):
125          txt_alarme += "\nLa réponse  "+REPONSES[i][0]+" que vous avez entrée pour la phase d'optimisation n'a pas été trouvée dans votre fichier de commandes ASTER"
126    return txt, txt_alarme
127
128
129 # ------------------------------------------------------------------------------
130
131 def verif_valeurs_des_PARAMETRES(PARAMETRES):
132    """
133    On verifie que pour chaque PARAMETRES de l'optimisation
134    les valeurs entrées par l'utilisateur sont telles que :
135               val_inf<val_sup
136               val_init appartient à [borne_inf, borne_sup] 
137               val_init!=0         
138               borne_sup!=0         
139               borne_inf!=0         
140    """
141
142    txt = ""
143    # verification des bornes
144    for i in range(len(PARAMETRES)):
145       if( PARAMETRES[i][2] >PARAMETRES[i][3]):
146          txt=txt + "\nLa borne inférieure "+str(PARAMETRES[i][2])+" de  "+PARAMETRES[i][0]+ "est plus grande que sa borne supérieure"+str(PARAMETRES[i][3])
147    # verification de l'encadrement de val_init 
148    for i in range(len(PARAMETRES)):
149       if( (PARAMETRES[i][1] < PARAMETRES[i][2]) or (PARAMETRES[i][1] > PARAMETRES[i][3])):
150          txt=txt + "\nLa valeur initiale "+str(PARAMETRES[i][1])+" de "+PARAMETRES[i][0]+ " n'est pas dans l'intervalle [borne_inf,born_inf]=["+str(PARAMETRES[i][2])+" , "+str(PARAMETRES[i][3])+"]"
151    # verification que val_init !=0
152    for  i in range(len(PARAMETRES)):
153       if (PARAMETRES[i][1] == 0. ):
154          txt=txt + "\nProblème de valeurs initiales pour le paramètre "+PARAMETRES[i][0]+" : ne pas donner de valeur initiale nulle mais un ordre de grandeur."
155    # verification que borne_sup !=0
156    for  i in range(len(PARAMETRES)):
157       if (PARAMETRES[i][3] == 0. ):
158          txt=txt + "\nProblème de borne supérieure pour le paramètre "+PARAMETRES[i][0]+" : ne pas donner de valeur strictement nulle."
159    # verification que borne_inf !=0
160    for  i in range(len(PARAMETRES)):
161       if (PARAMETRES[i][2] == 0. ):
162          txt=txt + "\nProblème de borne inférieure pour le paramètre "+PARAMETRES[i][0]+" : ne pas donner de valeur strictement nulle."
163    return txt
164
165
166 # ------------------------------------------------------------------------------
167
168 def verif_UNITE(GRAPHIQUE,UNITE_RESU):
169    """
170    On vérifie que les unités de résultat et 
171    de graphique sont différentes
172    """
173    txt=""
174    if GRAPHIQUE:
175       GRAPHE_UL_OUT=GRAPHIQUE['UNITE']
176       if (GRAPHE_UL_OUT==UNITE_RESU):
177           txt=txt + "\nLes unités logiques des fichiers de résultats graphiques et de résultats d'optimisation sont les memes."
178    return txt
179
180
181 # ------------------------------------------------------------------------------
182
183 def gestion(UL,PARAMETRES,REPONSES,RESU_EXP,POIDS,GRAPHIQUE,UNITE_RESU,METHODE):
184    """
185    Cette methode va utiliser les methodes de cette classe declarée ci-dessus
186    test  est un boolean: test=0 -> pas d'erreur
187                          test=1 -> erreur détectée
188    """
189
190    texte = ""
191    texte_alarme = ""
192
193    # On vérifie d'abord si PARAMETRES, REPONSES, RESU_EXP sont bien des listes au sens python
194    # test de PARAMETRES
195    texte = texte + erreur_de_type(0,PARAMETRES)
196    # test de REPONSES
197    texte = texte + erreur_de_type(0,REPONSES)
198    # test de RESU_EXP
199    texte = texte + erreur_de_type(0,RESU_EXP) 
200    
201    # On vérifie si chaque sous liste de PARAMETRES, REPONSES,  possède le type adéquat
202    # test des sous_listes de PARAMETRES
203    for i in range(len(PARAMETRES)):
204       texte = texte +  erreur_de_type(0,PARAMETRES[i]) 
205    # test des sous_listes de REPONSES
206    for i in range(len(REPONSES)):
207       texte = texte + erreur_de_type(0,REPONSES[i])
208
209    # On verifie si la dimension de chaque sous-liste de : PARAMETRES, REPONSES
210    # il faut que: la dimension d'une sous-liste de PARAMETRES = 4
211    # et   que     la dimension d'une sous liste de REPONSES   = 3
212    texte = texte + erreur_dimension(PARAMETRES,REPONSES)
213
214    # on verifie que l'on a autant de réponses que de résultats expérimentaux
215    texte = texte + compare__dim_rep__dim_RESU_EXP(REPONSES,RESU_EXP)
216    #on verifie que l'on a autant de poids que de résultats expérimentaux
217    texte = texte + compare__dim_poids__dim_RESU_EXP(POIDS,RESU_EXP)
218
219    # on verifie les types des arguments de chaque sous liste de PARAMETRES et REPONSES
220       # verification du type stringet type float des arguments de PARAMETRES
221    for i in range(len(PARAMETRES)):
222       texte = texte + erreur_de_type(1,PARAMETRES[i][0])
223       for k in [1,2,3]:
224          texte = texte + erreur_de_type(2,PARAMETRES[i][k])
225
226    # verification du type string pour les arguments  de REPONSES
227    for i in range(len(REPONSES)):
228       for j in range(len(REPONSES[i])):
229          texte = texte + erreur_de_type(1,REPONSES[i][j])
230    
231    # verification du fichier de commandes Esclave ASTER
232    if METHODE != 'EXTERNE': # pour celui-ci le fort.UL n'est pas l'esclave... voir comment faire
233       texte_fatal, texte_alarme = verif_fichier(UL,PARAMETRES,REPONSES)
234       texte += texte_fatal
235
236    # verification des valeurs des PARAMETRES entrées par l'utilisateur (pour fmin* les bornes ne sont pas prises en compte)
237    if METHODE == 'LEVENBERG':
238       texte = texte + verif_valeurs_des_PARAMETRES(PARAMETRES)
239
240    # verification des unités logiques renseignées par l'utilisateur
241    if METHODE != 'EXTERNE':
242       texte = texte + verif_UNITE(GRAPHIQUE,UNITE_RESU)
243
244    return texte, texte_alarme
245