1 #@ MODIF reca_calcul_aster Macro DATE 14/11/2006 AUTEUR ASSIRE A.ASSIRE
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.
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.
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 # ======================================================================
22 # mode_include = False
23 # __follow_output = False
24 # table_sensibilite = False
27 __commandes_aster__ = False
30 import copy, Numeric, types, os, sys, pprint, math
38 from Utilitai.Utmess import UTMESS
40 def UTMESS(code,sprg,texte):
41 fmt='\n <%s> <%s> %s\n\n'
42 print fmt % (code,sprg,texte)
43 if code=='F': sys.exit()
45 from Utilitai.System import ExecCommand
51 # ------------------------------------------------------------------------------
55 def __init__(self, METHODE, UNITE_RESU, INFO=1, fich_output='./REPE_OUT/output_esclave.txt', mode_include=False, follow_output=False, table_sensibilite=False, memjeveux_esclave=None, PARA_DIFF_FINI=1.E-3, ITER_MAXI=10, ITER_FONC_MAXI=100):
57 self.METHODE = METHODE
58 self.UNITE_RESU = UNITE_RESU
60 self.fich_output = fich_output
61 self.PARA_DIFF_FINI = PARA_DIFF_FINI
62 self.ITER_FONC_MAXI = ITER_FONC_MAXI
63 self.ITER_MAXI = ITER_MAXI,
67 from Cata.cata import INCLUDE, DETRUIRE, FIN, DEFI_FICHIER, IMPR_TABLE, LIRE_TABLE, INFO_EXEC_ASTER, EXTR_TABLE, CREA_TABLE
74 from Macro.lire_table_ops import lecture_table
78 sys.path.append( './Python/Macro' )
79 from Macro.lire_table_ops import lecture_table
82 UTMESS('F','MACR_RECAL',"Probleme : impossible d'importer le module de lecture des tables!")
83 self.mode_include = mode_include
84 self.follow_output = follow_output
85 self.mode_aster = mode_aster
86 self.memjeveux_esclave = memjeveux_esclave
87 self.table_sensibilite = table_sensibilite
89 self.vector_output = False
90 self.error_output = False
93 # ------------------------------------------------------------------------------
97 def __init__(self, PARAMETRES, UL, para, reponses, LIST_SENSI=[], LIST_DERIV=[]):
101 self.reponses = reponses
102 self.LIST_SENSI = LIST_SENSI
103 self.LIST_DERIV = LIST_DERIV
105 self.METHODE = PARAMETRES.METHODE
106 self.UNITE_RESU = PARAMETRES.UNITE_RESU
107 self.INFO = PARAMETRES.INFO
108 self.fich_output = PARAMETRES.fich_output
109 self.mode_include = PARAMETRES.mode_include
110 self.follow_output = PARAMETRES.follow_output
111 self.table_sensibilite = PARAMETRES.table_sensibilite
112 self.mode_aster = PARAMETRES.mode_aster
113 self.memjeveux_esclave = PARAMETRES.memjeveux_esclave
114 self.PARA_DIFF_FINI = PARAMETRES.PARA_DIFF_FINI
115 self.ITER_FONC_MAXI = PARAMETRES.ITER_FONC_MAXI
116 self.vector_output = PARAMETRES.vector_output
117 self.error_output = PARAMETRES.vector_output
119 self.UNITE_GRAPHIQUE = None
120 self.new_export = 'tmp_export'
121 self.nom_fichier_mess_fils = None
122 self.nom_fichier_resu_fils = None
124 self.fichier_esclave = None
126 self.evaluation_fonction = 0
131 self.L_deriv_sensible = None
135 # ------------------------------------------------------------------------------
137 def Lancement_Commande(self, cmd):
139 if self.INFO>=1: UTMESS('I','MACR_RECAL',"Lancement de la commande : " + cmd)
141 fich_output = self.fich_output
142 follow_output = self.follow_output
144 # Lancement d'Aster avec le deuxieme export
145 iret, txt_output = ExecCommand(cmd, follow_output=self.follow_output,verbose=False)
148 # Recuperation du .mess 'fils'
149 f=open(fich_output, 'w')
150 f.write( txt_output )
153 if self.INFO>=1: UTMESS('I','MACR_RECAL',"Fin du lancement de la commande : " + cmd)
155 diag = self.Recuperation_Diagnostic(txt_output)
160 # ------------------------------------------------------------------------------
162 def Recuperation_Diagnostic(self, output):
164 txt = '--- DIAGNOSTIC JOB :'
166 for ligne in output.splitlines():
167 if ligne.find(txt) > -1:
168 diag = ligne.split(txt)[-1].strip()
171 if self.INFO>=1: UTMESS('I','MACR_RECAL',"Diagnostic du calcul esclave : " + diag)
173 if diag in ['OK', 'NOOK_TEST_RESU', '<A>_ALARM', '<F>_COPY_ERROR']: return True
175 UTMESS('F','MACR_RECAL',"Le fichier esclave ne s'est pas terminé correctement.")
178 # ------------------------------------------------------------------------------
180 def Remplace_fichier_esclave(self, val_in): pass
183 # ------------------------------------------------------------------------------
185 def calcul_Aster(self, val, INFO=0):
190 reponses = self.reponses
191 UNITE_RESU = self.UNITE_RESU
192 LIST_SENSI = self.LIST_SENSI
193 LIST_DERIV = self.LIST_DERIV
195 mode_include = self.mode_include
196 follow_output = self.follow_output
197 table_sensibilite = self.table_sensibilite
199 if self.evaluation_fonction > self.ITER_FONC_MAXI:
200 UTMESS('F', nompro, "Le nombre d'evaluation de la fonctionnelle depasse le critere ITER_FONC_MAXI.")
201 self.evaluation_fonction += 1
206 # Creation du repertoire temporaire pour l'execution de l'esclave
207 tmp_macr_recal = self.Creation_Temporaire_Esclave()
209 # Creation du fichier .export de l'esclave
210 self.Creation_Fichier_Export_Esclave(tmp_macr_recal)
212 # Fichier esclave a modifier (si methode EXTERNE alors on prend directement le fichier esclave, sinon c'est le fort.UL dans le repertoire d'execution
214 if self.METHODE=='EXTERNE':
215 fic = open(self.fichier_esclave,'r')
217 fic = open('fort.'+str(UL),'r')
219 # On stocke le contenu de fort.UL dans la variable fichier qui est une string
221 # On stocke le contenu initial de fort.UL dans la variable fichiersauv
222 fichiersauv=copy.copy(fichier)
225 UTMESS('F', nompro, "Impossible de relire le fichier esclave : \n " + str(self.fichier_esclave))
228 if os.environ.has_key('ASTER_ROOT'):
229 as_run = os.path.join(os.environ['ASTER_ROOT'], 'ASTK', 'ASTK_SERV', 'bin', 'as_run')
230 elif os.path.isfile(aster.repout() + os.sep + 'as_run'):
231 as_run = aster.repout() + os.sep + 'as_run'
234 if INFO>=1: UTMESS('A', nompro, "Variable d'environnement ASTER_ROOT absente, " \
235 "on essaiera avec 'as_run' dans le $PATH.")
237 if __commandes_aster__:
239 from Cata.cata import INCLUDE, DETRUIRE, FIN, DEFI_FICHIER, IMPR_TABLE, LIRE_TABLE, INFO_EXEC_ASTER, EXTR_TABLE, CREA_TABLE
242 UTMESS('F', nompro, message)
244 # Utilisation du module Python de LIRE_TABLE
246 from Macro.lire_table_ops import lecture_table
249 sys.path.append( './Python/Macro' )
250 from lire_table_ops import lecture_table
252 UTMESS('F','MACR_RECAL',"Probleme : impossible d'importer le module de lecture des tables!")
256 txt.append( "\t\t\t%s : %s" % (i, val[para.index(i)]) )
257 if INFO>=1: UTMESS('I','MACR_RECAL',"Calcul de F avec les parametres:\n%s" % '\n'.join(txt))
261 # # Quelques verifications/modifications sur le fichier esclave, pour blindage
263 # for ligne in fichier.split('\n'):
264 # # DEBUT et FIN (on retire les espaces entre le mot-clé et la premiere parenthese)
265 # for (txt1, txt2) in [('DEBUT','('), ('FIN','(')]:
266 # if ligne.find( txt1 )!=-1 and ligne.find( txt2 )!=-1:
267 # index_deb1 = ligne.index(txt1)
268 # ligne1 = ligne[ index_deb1+len(txt1):]
269 # if ligne.find( txt1 )!=-1:
272 # for (txt1, txt2) in [('DEBUT','('), ('FIN','(')]:
273 # if ligne.find( txt1 )!=-1 and ligne.find( txt2 )!=-1:
274 # index_deb1 = ligne.index(txt1)
275 # index_fin1 = index_deb1 + len(txt1)
276 # index_deb2 = ligne.index(txt2)
277 # index_fin2 = index_deb1 + len(txt2)
278 # ligne = ligne[:index_fin1]+ligne[index_deb2:]
279 # # on retire les parametes en commentaires
281 # if ligne.find(txt)!=-1:
282 # if ligne.replace(' ', '')[0] == '#': ligne = ''
283 # fichiernew.append(ligne)
284 # fichier = '\n'.join(fichiernew)
286 #Fichier_Resu est une liste ou l'on va stocker le fichier modifié
287 #idée générale :on délimite des 'blocs' dans fichier
288 #on modifie ou non ces blocs suivant les besoins
289 #on ajoute ces blocs dans la liste Fichier_Resu
292 # Dans le cas du mode INCLUDE on enleve le mot-clé DEBUT
295 #cherche l'indice de DEBUT()
296 index_deb=fichier.index('DEBUT(')
297 while( fichier[index_deb]!='\n'):
298 index_deb=index_deb+1
299 #on restreint fichier en enlevant 'DEBUT();'
300 fichier = fichier[index_deb+1:]
302 #on va dans l'except si on a modifié le fichier au moins une fois
309 # On enleve le mot-clé FIN()
311 #cherche l'indice de FIN()
312 index_fin = fichier.index('FIN(')
313 #on restreint fichier en enlevant 'FIN();'
314 fichier = fichier[:index_fin]
321 #--------------------------------------------------------------------------------
322 #on cherche à délimiter le bloc des parametres dans le fichier
323 #Tout d'abord on cherche les indices d'apparition des paras dans le fichier
324 #en effet l'utilisateur n'est pas obligé de rentrer les paras dans optimise
325 #avec le meme ordre que son fichier de commande
326 index_para = Numeric.zeros(len(para))
327 for i in range(len(para)):
328 index_para[i] = fichier.index(para[i])
330 #On range les indices par ordre croissant afin de déterminer
331 #les indice_max et indice_min
332 index_para = Numeric.sort(index_para)
333 index_first_para = index_para[0]
334 index_last_para = index_para[len(index_para)-1]
337 #on va délimiter les blocs intermédiaires entre chaque para "utiles" à l'optimsation
339 for i in range(len(para)-1):
342 while(fichier[j]!= '\n'):
344 bloc_inter=bloc_inter + fichier[j:k] + '\n'
346 #on veut se placer sur le premier retour chariot que l'on trouve sur la ligne du dernier para
348 while(fichier[i] != '\n'):
351 #on délimite les blocs suivants:
352 pre_bloc = fichier[:index_first_para] #fichier avant premier parametre
353 post_bloc = fichier[ index_last_para+ 1:] #fichier après dernier parametre
355 #on ajoute dans L tous ce qui est avant le premier paramètre
356 Fichier_Resu.append(pre_bloc)
357 Fichier_Resu.append('\n')
359 # Liste des parametres utilisant la SENSIBILITE
360 liste_sensibilite = []
361 if len(LIST_SENSI)>0:
363 liste_sensibilite.append( i )
365 #On ajoute la nouvelle valeur des parametres
367 for j in range(dim_para):
368 if not para[j] in liste_sensibilite:
369 Fichier_Resu.append(para[j]+'='+str(val[j]) + ';' + '\n')
371 Fichier_Resu.append(para[j]+'=DEFI_PARA_SENSI(VALE='+str(val[j]) + ',);' + '\n')
374 #On ajoute à Fichier_Resu tous ce qui est entre les parametres
375 Fichier_Resu.append(bloc_inter)
377 Fichier_Resu.append(post_bloc)
379 #--------------------------------------------------------------------------------
380 #on va ajouter la fonction d'extraction du numarray de la table par la méthode Array
381 #et on stocke les réponses calculées dans la liste Lrep
382 #qui va etre retournée par la fonction calcul_Aster
384 self.g_context['Lrep'] = []
385 Fichier_Resu.append('Lrep=[]'+'\n')
386 for i in range(len(reponses)):
387 Fichier_Resu.append('t'+str(reponses[i][0])+'='+str(reponses[i][0])+'.EXTR_TABLE()'+'\n')
388 Fichier_Resu.append('F = '+'t'+str(reponses[i][0])+'.Array('+"'"+str(reponses[i][1])+"'"+','+"'"+str(reponses[i][2])+"'"+')'+'\n')
389 Fichier_Resu.append('Lrep.append(F)'+'\n')
391 #ouverture du fichier fort.3 et mise a jour de celui ci
392 x=open('fort.'+str(UL),'w')
394 x.writelines('from Accas import _F \nfrom Cata.cata import * \n')
395 x.writelines(Fichier_Resu)
402 # ----------------------------------------------------------------------------------
403 # Execution d'une deuxieme instance d'Aster
407 # Ajout des commandes d'impression des tables Resultats et Derivees à la fin du fichier esclave
411 # Tables correspondant aux Resultats
412 for i in range(len(reponses)):
413 _ul = str(int(100+i))
415 try: os.remove( tmp_macr_recal+os.sep+"REPE_TABLE"+os.sep+"fort."+_ul )
418 Fichier_Resu.append("\n# Recuperation de la table : " + str(reponses[i][0]) + "\n")
419 Fichier_Resu.append("DEFI_FICHIER(UNITE="+num_ul+", FICHIER='"+tmp_macr_recal+os.sep+"REPE_TABLE"+os.sep+"fort."+_ul+"',);\n")
420 Fichier_Resu.append("IMPR_TABLE(TABLE="+str(reponses[i][0])+", FORMAT='ASTER', UNITE="+num_ul+", INFO=1, FORMAT_R='E30.20',);\n")
421 Fichier_Resu.append("DEFI_FICHIER(ACTION='LIBERER', UNITE="+num_ul+",);\n")
423 # Tables correspondant aux Derivees
424 if len(LIST_SENSI)>0:
426 for _para in LIST_SENSI:
427 _lst_tbl = LIST_DERIV[_para][0]
428 for _lst_tbl in LIST_DERIV[_para]:
432 _ul = str(int(100+len(reponses)+i))
433 try: os.remove( tmp_macr_recal+os.sep+"REPE_TABLE"+os.sep+"fort."+_ul )
436 Fichier_Resu.append("\n# Recuperation de la table derivee : " + _tbl + " (parametre " + _para + ")\n")
437 Fichier_Resu.append("DEFI_FICHIER(UNITE="+num_ul+", FICHIER='"+tmp_macr_recal+os.sep+"REPE_TABLE"+os.sep+"fort."+_ul+"',);\n")
438 if table_sensibilite:
439 Fichier_Resu.append("IMPR_TABLE(TABLE="+_tbl+", SENSIBILITE="+_para+", FORMAT='ASTER', UNITE="+num_ul+", INFO=1, FORMAT_R='E30.20',);\n")
441 Fichier_Resu.append("IMPR_TABLE(TABLE="+_tbl+", FORMAT='ASTER', UNITE="+num_ul+", INFO=1, FORMAT_R='E30.20',);\n")
442 Fichier_Resu.append("DEFI_FICHIER(ACTION='LIBERER', UNITE="+num_ul+",);\n")
444 # Ecriture du "nouveau" fichier .comm
445 x=open('fort.'+str(UL),'a')
446 x.write( '\n'.join(Fichier_Resu) )
447 x.write('\nFIN();\n')
450 # os.system("cat %s" % self.new_export)
452 # Lancement du calcul Aster esclave
453 cmd = '%s %s' % (as_run, self.new_export)
454 self.Lancement_Commande(cmd)
456 # Recuperation du .mess et du .resu 'fils'
457 if self.METHODE != 'EXTERNE':
458 if self.nom_fichier_mess_fils:
459 cmd = 'cp ' + tmp_macr_recal + os.sep + self.nom_fichier_mess_fils + ' ./REPE_OUT/'
461 if self.nom_fichier_resu_fils:
462 cmd = 'cp ' + tmp_macr_recal + os.sep + self.nom_fichier_resu_fils + ' ./REPE_OUT/'
465 if __commandes_aster__:
466 # Unite logique libre
467 _tbul_libre=INFO_EXEC_ASTER(LISTE_INFO='UNITE_LIBRE')
468 _ul_libre=_tbul_libre['UNITE_LIBRE',1]
471 # ------------------------------------------------------
472 # Recuperation des tableaux resultats
474 _TB = [None]*len(reponses)
475 for i in range(len(reponses)):
477 if __commandes_aster__:
479 # Version par des commandes Aster
483 DEFI_FICHIER(UNITE=_ul_libre, FICHIER=tmp_macr_recal+os.sep+"REPE_TABLE"+os.sep+"fort."+str(int(100+i)), );
485 _TB[i]=LIRE_TABLE(UNITE=_ul_libre,
489 DEFI_FICHIER(ACTION='LIBERER', UNITE=_ul_libre,);
490 tREPONSE=_TB[i].EXTR_TABLE()
492 F = tREPONSE.Array( str(reponses[i][1]), str(reponses[i][2]) )
495 message = "Impossible de recuperer les resultats de calcul esclave!"
496 UTMESS('F', nompro, message)
500 # Version par utilisation directe du python de lire_table
503 # Chemin vers le fichier contenant la table
504 _fic_table = tmp_macr_recal+os.sep+"REPE_TABLE"+os.sep+"fort."+str(int(100+i))
507 file=open(_fic_table,'r')
510 except Exception, err:
512 message = """Impossible de recuperer les resultats de calcul esclave (lecture des tables)!
513 Le calcul esclave n'a pas du se terminer correctement (ajouter un repertoire en Resultat avec
514 le type repe et voir l'output du fichier esclave dans ce repertoire.
518 UTMESS('F', nompro, message)
521 ier, message, table_lue = lecture_table(texte, 1, ' ')
522 list_para = table_lue.para
523 tab_lue = table_lue.values()
524 except Exception, err:
526 message = "Impossible de recuperer les resultats de calcul esclave (lecture des tables)!\nMessage:\n" + str(err)
529 UTMESS('F', nompro, message)
532 nb_val = len(tab_lue[ list_para[0] ])
533 F = Numeric.zeros((nb_val,2), Numeric.Float)
534 for k in range(nb_val):
535 # F[k][0] = tab_lue[ list_para[0] ][1][k]
536 # F[k][1] = tab_lue[ list_para[1] ][1][k]
537 F[k][0] = tab_lue[ str(reponses[i][1]) ][k]
538 F[k][1] = tab_lue[ str(reponses[i][2]) ][k]
540 except Exception, err:
541 message = "Impossible de recuperer les resultats de calcul esclave (recuperation des tables)!\nMessage:\n" + str(err)
542 UTMESS('F', nompro, message)
545 # ------------------------------------------------------
546 # Recuperation des tableaux des derivees (SENSIBILITE)
548 if len(LIST_SENSI)>0:
550 for _para in LIST_SENSI:
551 _lon += len(LIST_DERIV[_para])
555 for _para in LIST_SENSI:
558 _lst_tbl = LIST_DERIV[_para][0]
560 for _lst_tbl in LIST_DERIV[_para]:
561 j = LIST_DERIV[_para].index(_lst_tbl)
564 if __commandes_aster__:
566 # Version par des commandes Aster
569 DEFI_FICHIER(UNITE=_ul_libre, FICHIER=tmp_macr_recal+os.sep+"REPE_TABLE"+os.sep+"fort."+str(int(100+len(reponses)+1+i)),);
570 _TBD[i]=LIRE_TABLE(UNITE=_ul_libre,
574 DEFI_FICHIER(ACTION='LIBERER', UNITE=_ul_libre,);
575 tREPONSE=_TBD[i].EXTR_TABLE()
576 DF = tREPONSE.Array( str(LIST_DERIV[_para][j][1]), str(LIST_DERIV[_para][j][2]) )
577 L_deriv[_para].append(DF)
582 # Version par utilisation directe du python de lire_table
585 # Chemin vers le fichier contenant la table
586 _fic_table = tmp_macr_recal+os.sep+"REPE_TABLE"+os.sep+"fort."+str(int(100+len(reponses)+1+i))
589 file=open(_fic_table,'r')
592 except Exception, err:
593 message = """Impossible de recuperer les resultats de calcul esclave (lecture des tables)!
594 Le calcul esclave n'a pas du se terminer correctement (ajouter un repertoire en Resultat avec
595 le type repe et voir l'output du fichier esclave dans ce repertoire.
599 UTMESS('F', nompro, message)
602 ier, message, table_lue = lecture_table(texte, 1, ' ')
603 list_para = table_lue.para
604 tab_lue = table_lue.values()
605 except Exception, err:
607 message = "Impossible de recuperer les resultats de calcul esclave (lecture des tables)!\nMessage:\n" + str(err)
611 UTMESS('F', nompro, message)
614 nb_val = len(tab_lue[ list_para[0] ])
615 DF = Numeric.zeros((nb_val,2), Numeric.Float)
616 for k in range(nb_val):
617 # DF[k][0] = tab_lue[ list_para[0] ][1][k]
618 # DF[k][1] = tab_lue[ list_para[1] ][1][k]
619 DF[k][0] = tab_lue[ str(LIST_DERIV[_para][j][1]) ][k]
620 DF[k][1] = tab_lue[ str(LIST_DERIV[_para][j][2]) ][k]
621 L_deriv[_para].append(DF)
623 except Exception, err:
624 message = "Impossible de recuperer les resultats de calcul esclave (recuperation des tables)!\nMessage:\n" + str(err)
625 UTMESS('F', nompro, message)
628 # Nettoyage du export
629 try: os.remove(self.new_export)
632 # Nettoyage du repertoire temporaire
633 if self.METHODE == 'EXTERNE': listdir = ['REPE_TABLE', 'base', 'REPE_IN']
634 else: listdir = ['.', 'REPE_TABLE', 'base', 'REPE_OUT', 'REPE_IN']
637 for fic in os.listdir(tmp_macr_recal+os.sep+dir):
638 try: os.remove(tmp_macr_recal+os.sep+dir+os.sep+fic)
644 # ----------------------------------------------------------------------------------
645 # Ou bien on inclue le fichier Esclave
649 if debug: os.system('cp fort.'+str(UL)+' REPE_OUT/')
653 Lrep = self.g_context['Lrep']
656 # Destruction des concepts Aster
657 reca_utilitaires.detr_concepts(self)
660 # ----------------------------------------------------------------------------------
661 # Ou alors probleme ?
667 # on remet le fichier dans son etat initial
668 x=open('fort.'+str(UL),'w')
669 x.writelines(fichiersauv)
676 # ------------------------------------------------------------------------------
678 def calcul_FG(self, val):
680 self.L, self.L_deriv_sensible = self.calcul_Aster(val, INFO=self.INFO)
681 self.L_J, self.erreur = self.Simul.multi_interpole(self.L, self.reponses)
682 if not self.L_J_init: self.L_J_init = copy.copy(self.L_J)
683 self.J = self.Simul.norme_J(self.L_J_init, self.L_J, self.UNITE_RESU)
685 # Calcul des derivees
686 self.A_nodim = self.Simul.sensibilite(self, self.L, self.L_deriv_sensible, val, self.PARA_DIFF_FINI)
692 # print 'self.L=', self.L
694 # print 'self.reponses=', self.reponses
696 # print 'self.resu_exp=', self.Simul.resu_exp
698 # print 'self.L_J=', self.L_J
700 # print 'self.erreur=', self.erreur
703 # A_nodim = copy.copy(self.A_nodim)
704 self.A = self.Dim.adim_sensi( copy.copy(self.A_nodim) )
705 # self.residu = self.reca_algo.test_convergence(self.gradient_init, self.erreur, self.A, Numeric.zeros(len(self.gradient_init),Numeric.Float) )
713 # print "Numeric.sum(self.A_nodim,0)=", Numeric.sum(self.A_nodim,0)
714 # print "Numeric.sum(self.A,0)=", Numeric.sum(self.A,0)
716 if self.vector_output:
717 return self.erreur, self.residu, self.A_nodim, self.A
720 self.norme = Numeric.dot(self.erreur, self.erreur)**0.5
722 self.norme_A_nodim = Numeric.zeros( (1,len(self.para)), Numeric.Float )
723 self.norme_A = Numeric.zeros( (1,len(self.para)), Numeric.Float )
724 for c in range(len(self.A[0,:])):
727 for l in range(len(self.A[:,0])):
728 norme_A_nodim += self.A_nodim[l,c] * self.A_nodim[l,c]
729 norme_A += self.A[l,c] * self.A[l,c]
730 self.norme_A_nodim[0,c] = math.sqrt( norme_A_nodim )
731 self.norme_A[0,c] = math.sqrt( norme_A )
733 # print self.norme_A_nodim
736 return self.norme, self.residu, self.norme_A_nodim, self.norme_A
739 # ------------------------------------------------------------------------------
741 def calcul_F(self, val):
743 self.L, self.L_deriv_sensible = self.calcul_Aster(val, INFO=self.INFO)
744 L_J, erreur = self.Simul.multi_interpole(self.L, self.reponses)
745 if not self.L_J_init: self.L_J_init = copy.copy(L_J)
746 J = self.Simul.norme_J(self.L_J_init, L_J, self.UNITE_RESU)
749 norme = Numeric.sum( [x**2 for x in erreur] )
752 print 'erreur=', erreur
753 print "norme de l'erreur=", norme
754 print "norme de J (fonctionnelle)=", str(J)
757 txt = "Informations de convergence :"
758 txt += '\n=======================================================\n'
759 if self.evaluation_fonction >1: txt += "\n Nombre d'evaluation de la fonction = " + str(self.evaluation_fonction)
760 txt += "\n=> Fonctionnelle = "+str(J)
762 if self.vector_output:
764 txt += "\n=> Norme de l'erreur = " + str(norme)
765 txt += '\n=======================================================\n'
766 UTMESS('I','MACR_RECAL',txt)
770 txt += "\n=> Erreur = " + str(norme)
771 txt += '\n=======================================================\n'
772 UTMESS('I','MACR_RECAL',txt)
775 # if self.error_output:
776 # print "erreur:", erreur
779 # print "norme:", norme
784 # ------------------------------------------------------------------------------
786 def calcul_G(self, val):
788 # Si le calcul Aster est deja effectue pour val on ne le refait pas
789 if (self.val == val) and self.L and self.L_deriv_sensible: pass
791 self.L, self.L_deriv_sensible = self.calcul_Aster(val, INFO=self.INFO)
792 A = self.Simul.sensibilite(self, self.L, self.L_deriv_sensible, val, self.PARA_DIFF_FINI)
793 A = self.Dim.adim_sensi(A)
794 L_J, erreur = self.Simul.multi_interpole(self.L, self.reponses)
795 grad = Numeric.dot(Numeric.transpose(A),erreur)
796 if debug: print 'grad=', grad
801 # ------------------------------------------------------------------------------
803 def Creation_Temporaire_Esclave(self):
805 Creation du repertoire temporaire d'execution du calcul esclace
809 # Creation du repertoire temporaire
810 tmp_macr_recal = os.getcwd() + os.sep + 'tmp_macr_recal'
811 try: os.mkdir(tmp_macr_recal)
813 if not os.path.exists(tmp_macr_recal): UTMESS('F','MACR_RECAL',"Probleme : Impossible de creer le repertoire temporaire : " + tmp_macr_recal)
814 try: os.mkdir(tmp_macr_recal + os.sep + 'REPE_TABLE')
816 if not os.path.exists(tmp_macr_recal + os.sep + 'REPE_TABLE'): UTMESS('F','MACR_RECAL',"Probleme : Impossible de creer le repertoire temporaire : " + tmp_macr_recal + os.sep + 'REPE_TABLE')
818 return tmp_macr_recal
821 # ------------------------------------------------------------------------------
823 def Creation_Fichier_Export_Esclave(self, tmp_macr_recal):
825 Creation du fichier .export pour le calcul esclave
828 from as_profil import ASTER_PROFIL
830 # Recuperation du fichier .export
831 list_export = glob('*.export')
833 if len(list_export) == 0: UTMESS('F','MACR_RECAL',"Probleme : il n'y a pas de fichier .export dans le repertoire de travail!")
834 elif len(list_export) >1: UTMESS('F','MACR_RECAL',"Probleme : il y a plus d'un fichier .export dans le repertoire de travail!")
836 # On modifie le profil
837 prof = ASTER_PROFIL(list_export[0])
840 if prof.param.has_key('xterm'):
841 del prof.param['xterm']
843 prof.args['memjeveux'] = self.memjeveux_esclave
846 for lab in ('data', 'resu'):
847 l_fr = getattr(prof, lab)
857 # base non prise en compte
858 if dico['type'] in ('base', 'bhdf'):
862 dico['path'] = os.path.join(tmp_macr_recal, os.path.basename(dico['path']))
867 # Nom du fichier .mess (pour recuperation dans REPE_OUT)
868 if dico['ul'] == '6':
869 self.nom_fichier_mess_fils = os.path.basename(dico['path'])
870 # self.nom_fichier_mess_fils = os.path.join(os.getcwd(), 'fort.%d' % self.UL)
872 # Nom du fichier .resu (pour recuperation dans REPE_OUT)
873 if dico['ul'] == '8':
874 self.nom_fichier_resu_fils = os.path.basename(dico['path'])
876 # Ancien .comm non pris en compte
877 # Fichier d'unite logique UNITE_RESU (rapport de MACR_RECAL) non pris en compte
878 if dico['type'] == 'comm' or (dico['ul'] == str(self.UNITE_RESU) and lab == 'resu'):
881 # Fichier d'unite logique UL devient le nouveau .comm
882 elif dico['ul'] == str(self.UL):
883 self.fichier_esclave = dico['path']
884 dico['type'] = 'comm'
886 dico['path'] = os.path.join(os.getcwd(), 'fort.%d' % self.UL)
888 # Tous les autres fichiers en Resultat
890 if self.UNITE_GRAPHIQUE and dico['ul'] == str(self.UNITE_GRAPHIQUE): l_fr.remove(dico)
892 dico['path'] = os.path.join(tmp_macr_recal, os.path.basename(dico['path']))
894 # Tous les autres fichiers en Donnees
896 dico['path'] = os.path.join(os.getcwd(), 'fort.%s' % dico['ul'])
898 # sinon on garde la ligne
899 setattr(prof, lab, l_fr)
901 # Ecriture du nouveau fichier export
902 prof.WriteExportTo(self.new_export)
904 # os.system('cp ' + self.new_export + ' /tmp')
906 # --FIN CLASSE ----------------------------------------------------------------------------