]> SALOME platform Git repositories - tools/eficas.git/blob - Aster/Cata/cataSTA7/Macro/macr_recal_ops.py
Salome HOME
Modif V6_4_°
[tools/eficas.git] / Aster / Cata / cataSTA7 / Macro / macr_recal_ops.py
1 #@ MODIF macr_recal_ops Macro  DATE 05/07/2005   AUTEUR DURAND C.DURAND 
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.set_icmd(1)
54
55    self.DeclareOut('nomres',self.sd)
56
57    #_______________________________________________
58    #
59    # GESTION DE L'OPTION FACULTATIVE POUR LES POIDS
60    #_______________________________________________
61    if( POIDS == None):
62       POIDS=Numeric.ones(len(RESU_EXP))
63       
64    #_____________________________________________
65    #
66    # GESTION DES ERREURS DE SYNTAXE
67    #_____________________________________________
68    texte_erreur = gestion(UNITE_ESCL,LIST_PARA,RESU_CALC,RESU_EXP,POIDS,GRAPHIQUE,UNITE_RESU)
69    if (texte_erreur != ""):
70       ier=ier+1
71       texte_erreur='<F> <MACR_RECAL>'+texte_erreur
72       self.cr.fatal(texte_erreur)
73       return ier
74
75    #_____________________________________________
76    #
77    # DECLARATION DE TOUTES LES COMMANDES ASTER
78    #_____________________________________________
79    for k,v in cata.__dict__.items() :
80      if type(v)==types.InstanceType:
81         if v.__class__.__name__ in ('OPER','MACRO'):
82            self.current_context[k]= v
83    self.current_context['_F']=cata.__dict__['_F']
84    self.g_context['EXTRACT']=EXTRACT
85
86    #_____________________________________________
87    #
88    # INITIALISATIONS
89    #_____________________________________________
90    iter = 0
91    restant,temps_iter=0.,0.
92    restant,temps_iter,err=reca_algo.temps_CPU(self,restant,temps_iter)
93    para,val,borne_inf,borne_sup = transforme_list_Num(LIST_PARA,RESU_EXP)
94    val_init = copy.copy(val)
95    L_init = calcul_F(self,UNITE_ESCL,para,val,RESU_CALC)
96    #instance de la classe gérant l'affichage des resultats du calcul de l'optimisation
97    Mess = reca_message.Message(para,RESU_EXP,copy.copy(val_init),UNITE_RESU) 
98    #instances des classes pour le calcul de l'erreur et le dimensionnemnt/adim
99    Simul = reca_interp.Sim_exp(RESU_EXP,POIDS)
100    Dim = reca_algo.Dimension(copy.copy(val_init),para)
101    L_J_init,erreur = Simul.multi_interpole(L_init, RESU_CALC)
102    J_init = Simul.norme_J(copy.copy(L_J_init),copy.copy(L_J_init),UNITE_RESU)
103    J = J_init
104    A = Simul.sensibilite(self,UNITE_ESCL,L_init,val,para,RESU_CALC,PARA_DIFF_FINI,UNITE_RESU)
105    A = Dim.adim_sensi(A)
106    l = reca_algo.lambda_init(Numeric.matrixmultiply(Numeric.transpose(A),A))
107    gradient_init =reca_algo.calcul_gradient(A,erreur)  #utile pour le test de convergence, on prend les valeurs dimensionnées
108    residu = reca_algo.test_convergence(gradient_init,erreur,A,Numeric.zeros(len(gradient_init),Numeric.Float))
109    Mess.affiche_result_iter(iter,J,val,residu,Numeric.array([]),UNITE_RESU)
110    # On teste un manque de temps CPU
111    restant,temps_iter,err=reca_algo.temps_CPU(self,restant,temps_iter)
112    if (err==1):
113       ier=ier+1
114       return ier
115    
116    #_____________________________________________
117    #
118    # BOUCLE PRINCIPALE DE L'ALGORITHME
119    #_____________________________________________
120    epsilon = 10.*RESI_GLOB_RELA
121    while((residu > RESI_GLOB_RELA) & (iter<ITER_MAXI)):  
122       iter = iter +1
123       new_val, s, l, Act = reca_algo.Levenberg_bornes(self,val,Dim,val_init,borne_inf,borne_sup,A,erreur,l,UNITE_RESU) 
124       L_F = calcul_F(self,UNITE_ESCL,para,new_val,RESU_CALC)
125       new_L_J,new_erreur = Simul.multi_interpole(L_F, RESU_CALC)
126       new_J = Simul.norme_J(L_J_init,new_L_J,UNITE_RESU)
127       l = reca_algo.actualise_lambda(l,Dim.adim(val),Dim.adim(new_val),A,erreur,new_J,J)
128       val = copy.copy(new_val)
129       erreur = copy.copy(new_erreur)
130       J = new_J
131       A = Simul.sensibilite(self,UNITE_ESCL,L_F,val,para,RESU_CALC,PARA_DIFF_FINI,UNITE_RESU)
132       A = Dim.adim_sensi(A)
133       residu = reca_algo.test_convergence(gradient_init,erreur,A,s)
134       Mess.affiche_result_iter(iter,J,val,residu,Act,UNITE_RESU)
135       if (gnuplot):
136          if (GRAPHIQUE):
137             GRAPHE_UL_OUT=GRAPHIQUE['UNITE']
138             interactif=(GRAPHIQUE['INTERACTIF']=='OUI')
139             graphique(L_F,RESU_EXP,RESU_CALC,iter,GRAPHE_UL_OUT,interactif)
140       # On teste un manque de temps CPU
141       restant,temps_iter,err=reca_algo.temps_CPU(self,restant,temps_iter)
142       if (err==1):
143          ier=ier+1
144          return ier
145    #_____________________________________________
146    #
147    # FIN DES ITERATIONS
148    # CONVERGENCE OU ECHEC
149    #_____________________________________________
150    Mess.affiche_etat_final_convergence(iter,ITER_MAXI,RESI_GLOB_RELA,residu,Act,UNITE_RESU)
151    reca_algo.calcul_etat_final(para,A,iter,ITER_MAXI,RESI_GLOB_RELA,residu,Mess,UNITE_RESU)
152    #_____________________________________________
153    #
154    # CREATIONS DE LA LISTE DE REELS CONTENANT 
155    # LES VALEURS DES PARAMETRES A CONVERGENCE
156    #_____________________________________________
157    lival=[]
158    for i in range(len(val)):
159        lival.append(val[i])
160    nomres=DEFI_LIST_REEL(VALE=lival)
161    return