]> SALOME platform Git repositories - tools/eficas.git/blob - Aster/Cata/cataSTA74/Macro/macr_recal_ops.py
Salome HOME
Modif V6_4_°
[tools/eficas.git] / Aster / Cata / cataSTA74 / Macro / macr_recal_ops.py
1 #@ MODIF macr_recal_ops Macro  DATE 14/09/2004   AUTEUR MCOURTOI M.COURTOIS 
2 # -*- coding: iso-8859-1 -*-
3 #            CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2002  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.                                                  
10 #                                                                       
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.                              
15 #                                                                       
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 # ======================================================================
20
21
22
23 def macr_recal_ops(self,UNITE_ESCL, RESU_EXP, POIDS, LIST_PARA, RESU_CALC, 
24                         ITER_MAXI, RESI_GLOB_RELA,UNITE_RESU,PARA_DIFF_FINI,
25                         GRAPHIQUE, **args ):
26    """Macro commande réalisant le recalage de modèles Aster""",
27    # Initialisation du compteur d'erreurs
28    ier=0
29    # On essaie d'importer Numeric -> ERREUR FATALE
30    try:
31      import Numeric
32    except ImportError:
33      ier=ier+1
34      self.cr.fatal("<F> <MACR_RECAL> Le module Numeric de Python n'a pu etre chargé")
35      return ier
36    # On essaie d'importer Gnuplot -> PAS DE GRAPHIQUE
37    try:
38      import Gnuplot
39      gnuplot=1
40    except ImportError:
41      gnuplot=0
42    import string
43    import copy
44    import types
45    import Macro
46    from Cata import cata
47    from Cata.cata import DEFI_LIST_REEL
48    from Macro.recal import gestion,transforme_list_Num,EXTRACT,calcul_F,graphique
49    from Macro import reca_message
50    from Macro import reca_algo
51    from Macro import reca_interp
52    # La macro compte pour 1 dans l'execution des commandes
53    #self.icmd=1
54    self.set_icmd(1)
55
56    self.DeclareOut('nomres',self.sd)
57
58    #_______________________________________________
59    #
60    # GESTION DE L'OPTION FACULTATIVE POUR LES POIDS
61    #_______________________________________________
62    if( POIDS == None):
63       POIDS=Numeric.ones(len(RESU_EXP))
64       
65    #_____________________________________________
66    #
67    # GESTION DES ERREURS DE SYNTAXE
68    #_____________________________________________
69    texte_erreur = gestion(UNITE_ESCL,LIST_PARA,RESU_CALC,RESU_EXP,POIDS,GRAPHIQUE,UNITE_RESU)
70    if (texte_erreur != ""):
71       ier=ier+1
72       texte_erreur='<F> <MACR_RECAL>'+texte_erreur
73       self.cr.fatal(texte_erreur)
74       return ier
75
76    #_____________________________________________
77    #
78    # DECLARATION DE TOUTES LES COMMANDES ASTER
79    #_____________________________________________
80    for k,v in cata.__dict__.items() :
81      if type(v)==types.InstanceType:
82         if v.__class__.__name__ in ('OPER','MACRO'):
83            self.current_context[k]= v
84    self.current_context['_F']=cata.__dict__['_F']
85    self.g_context['EXTRACT']=EXTRACT
86
87    #_____________________________________________
88    #
89    # INITIALISATIONS
90    #_____________________________________________
91    iter = 0
92    restant,temps_iter=0.,0.
93    restant,temps_iter,err=reca_algo.temps_CPU(self,restant,temps_iter)
94    para,val,borne_inf,borne_sup = transforme_list_Num(LIST_PARA,RESU_EXP)
95    val_init = copy.copy(val)
96    L_init = calcul_F(self,UNITE_ESCL,para,val,RESU_CALC)
97    #instance de la classe gérant l'affichage des resultats du calcul de l'optimisation
98    Mess = reca_message.Message(para,RESU_EXP,copy.copy(val_init),UNITE_RESU) 
99    #instances des classes pour le calcul de l'erreur et le dimensionnemnt/adim
100    Simul = reca_interp.Sim_exp(RESU_EXP,POIDS)
101    Dim = reca_algo.Dimension(copy.copy(val_init),para)
102    L_J_init,erreur = Simul.multi_interpole(L_init, RESU_CALC)
103    J_init = Simul.norme_J(copy.copy(L_J_init),copy.copy(L_J_init),UNITE_RESU)
104    J = J_init
105    A = Simul.sensibilite(self,UNITE_ESCL,L_init,val,para,RESU_CALC,PARA_DIFF_FINI,UNITE_RESU)
106    A = Dim.adim_sensi(A)
107    l = reca_algo.lambda_init(Numeric.matrixmultiply(Numeric.transpose(A),A))
108    gradient_init =reca_algo.calcul_gradient(A,erreur)  #utile pour le test de convergence, on prend les valeurs dimensionnées
109    residu = reca_algo.test_convergence(gradient_init,erreur,A,Numeric.zeros(len(gradient_init),Numeric.Float))
110    Mess.affiche_result_iter(iter,J,val,residu,Numeric.array([]),UNITE_RESU)
111    # On teste un manque de temps CPU
112    restant,temps_iter,err=reca_algo.temps_CPU(self,restant,temps_iter)
113    if (err==1):
114       ier=ier+1
115       return ier
116    
117    #_____________________________________________
118    #
119    # BOUCLE PRINCIPALE DE L'ALGORITHME
120    #_____________________________________________
121    epsilon = 10.*RESI_GLOB_RELA
122    while((residu > RESI_GLOB_RELA) & (iter<ITER_MAXI)):  
123       iter = iter +1
124       new_val, s, l, Act = reca_algo.Levenberg_bornes(self,val,Dim,val_init,borne_inf,borne_sup,A,erreur,l,UNITE_RESU) 
125       L_F = calcul_F(self,UNITE_ESCL,para,new_val,RESU_CALC)
126       new_L_J,new_erreur = Simul.multi_interpole(L_F, RESU_CALC)
127       new_J = Simul.norme_J(L_J_init,new_L_J,UNITE_RESU)
128       l = reca_algo.actualise_lambda(l,Dim.adim(val),Dim.adim(new_val),A,erreur,new_J,J)
129       val = copy.copy(new_val)
130       erreur = copy.copy(new_erreur)
131       J = new_J
132       A = Simul.sensibilite(self,UNITE_ESCL,L_F,val,para,RESU_CALC,PARA_DIFF_FINI,UNITE_RESU)
133       A = Dim.adim_sensi(A)
134       residu = reca_algo.test_convergence(gradient_init,erreur,A,s)
135       Mess.affiche_result_iter(iter,J,val,residu,Act,UNITE_RESU)
136       if (gnuplot):
137          if (GRAPHIQUE):
138             GRAPHE_UL_OUT=GRAPHIQUE['UNITE']
139             interactif=(GRAPHIQUE['INTERACTIF']=='OUI')
140             graphique(L_F,RESU_EXP,RESU_CALC,iter,GRAPHE_UL_OUT,interactif)
141       # On teste un manque de temps CPU
142       restant,temps_iter,err=reca_algo.temps_CPU(self,restant,temps_iter)
143       if (err==1):
144          ier=ier+1
145          return ier
146    #_____________________________________________
147    #
148    # FIN DES ITERATIONS
149    # CONVERGENCE OU ECHEC
150    #_____________________________________________
151    Mess.affiche_etat_final_convergence(iter,ITER_MAXI,RESI_GLOB_RELA,residu,Act,UNITE_RESU)
152    reca_algo.calcul_etat_final(para,A,iter,ITER_MAXI,RESI_GLOB_RELA,residu,Mess,UNITE_RESU)
153    #_____________________________________________
154    #
155    # CREATIONS DE LA LISTE DE REELS CONTENANT 
156    # LES VALEURS DES PARAMETRES A CONVERGENCE
157    #_____________________________________________
158    lival=[]
159    for i in range(len(val)):
160        lival.append(val[i])
161    nomres=DEFI_LIST_REEL(VALE=lival)
162    return