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.
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
55 self.DeclareOut('nomres',self.sd)
57 #_______________________________________________
59 # GESTION DE L'OPTION FACULTATIVE POUR LES POIDS
60 #_______________________________________________
62 POIDS=Numeric.ones(len(RESU_EXP))
64 #_____________________________________________
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 != ""):
71 texte_erreur='<F> <MACR_RECAL>'+texte_erreur
72 self.cr.fatal(texte_erreur)
75 #_____________________________________________
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
86 #_____________________________________________
89 #_____________________________________________
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)
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)
116 #_____________________________________________
118 # BOUCLE PRINCIPALE DE L'ALGORITHME
119 #_____________________________________________
120 epsilon = 10.*RESI_GLOB_RELA
121 while((residu > RESI_GLOB_RELA) & (iter<ITER_MAXI)):
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)
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)
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)
145 #_____________________________________________
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 #_____________________________________________
154 # CREATIONS DE LA LISTE DE REELS CONTENANT
155 # LES VALEURS DES PARAMETRES A CONVERGENCE
156 #_____________________________________________
158 for i in range(len(val)):
160 nomres=DEFI_LIST_REEL(VALE=lival)