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.
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 # ======================================================================
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,
26 """Macro commande réalisant le recalage de modèles Aster""",
27 # Initialisation du compteur d'erreurs
29 # On essaie d'importer Numeric -> ERREUR FATALE
34 self.cr.fatal("<F> <MACR_RECAL> Le module Numeric de Python n'a pu etre chargé")
36 # On essaie d'importer Gnuplot -> PAS DE GRAPHIQUE
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
56 self.DeclareOut('nomres',self.sd)
58 #_______________________________________________
60 # GESTION DE L'OPTION FACULTATIVE POUR LES POIDS
61 #_______________________________________________
63 POIDS=Numeric.ones(len(RESU_EXP))
65 #_____________________________________________
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 != ""):
72 texte_erreur='<F> <MACR_RECAL>'+texte_erreur
73 self.cr.fatal(texte_erreur)
76 #_____________________________________________
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
87 #_____________________________________________
90 #_____________________________________________
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)
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)
117 #_____________________________________________
119 # BOUCLE PRINCIPALE DE L'ALGORITHME
120 #_____________________________________________
121 epsilon = 10.*RESI_GLOB_RELA
122 while((residu > RESI_GLOB_RELA) & (iter<ITER_MAXI)):
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)
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)
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)
146 #_____________________________________________
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 #_____________________________________________
155 # CREATIONS DE LA LISTE DE REELS CONTENANT
156 # LES VALEURS DES PARAMETRES A CONVERGENCE
157 #_____________________________________________
159 for i in range(len(val)):
161 nomres=DEFI_LIST_REEL(VALE=lival)