1 #@ MODIF reca_calcul_aster Macro DATE 16/10/2007 AUTEUR REZETTE C.REZETTE
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
25 __commandes_aster__ = False
29 import copy, Numeric, types, os, sys, pprint, math
31 from externe_mess import UTMESS
33 from Utilitai.System import ExecCommand
39 # ------------------------------------------------------------------------------
43 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):
45 self.METHODE = METHODE
46 self.UNITE_RESU = UNITE_RESU
48 self.fich_output = fich_output
49 self.PARA_DIFF_FINI = PARA_DIFF_FINI
50 self.ITER_FONC_MAXI = ITER_FONC_MAXI
51 self.ITER_MAXI = ITER_MAXI,
55 from Cata.cata import INCLUDE, DETRUIRE, FIN, DEFI_FICHIER, IMPR_TABLE, LIRE_TABLE, INFO_EXEC_ASTER, EXTR_TABLE, CREA_TABLE
62 from Macro.lire_table_ops import lecture_table
66 sys.path.append( './Python/Macro' )
67 from Macro.lire_table_ops import lecture_table
70 UTMESS('F','MACR_RECAL',"Probleme : impossible d'importer le module de lecture des tables!")
71 self.mode_include = mode_include
72 self.follow_output = follow_output
73 self.mode_aster = mode_aster
74 self.memjeveux_esclave = memjeveux_esclave
75 self.table_sensibilite = table_sensibilite
77 self.vector_output = False
78 self.error_output = False
81 # ------------------------------------------------------------------------------
85 def __init__(self, PARAMETRES, UL, para, reponses, LIST_SENSI=[], LIST_DERIV=[]):
89 self.reponses = reponses
90 self.LIST_SENSI = LIST_SENSI
91 self.LIST_DERIV = LIST_DERIV
93 self.METHODE = PARAMETRES.METHODE
94 self.UNITE_RESU = PARAMETRES.UNITE_RESU
95 self.INFO = PARAMETRES.INFO
96 self.fich_output = PARAMETRES.fich_output
97 self.mode_include = PARAMETRES.mode_include
98 self.follow_output = PARAMETRES.follow_output
99 self.table_sensibilite = PARAMETRES.table_sensibilite
100 self.mode_aster = PARAMETRES.mode_aster
101 self.memjeveux_esclave = PARAMETRES.memjeveux_esclave
102 self.PARA_DIFF_FINI = PARAMETRES.PARA_DIFF_FINI
103 self.ITER_FONC_MAXI = PARAMETRES.ITER_FONC_MAXI
104 self.vector_output = PARAMETRES.vector_output
105 self.error_output = PARAMETRES.vector_output
107 self.UNITE_GRAPHIQUE = None
108 self.new_export = 'tmp_export'
109 self.nom_fichier_mess_fils = None
110 self.nom_fichier_resu_fils = None
112 self.fichier_esclave = None
114 self.evaluation_fonction = 0
119 self.L_deriv_sensible = None
123 # ------------------------------------------------------------------------------
125 def Lancement_Commande(self, cmd):
127 if self.INFO>=1: UTMESS('I','MACR_RECAL',"Lancement de la commande : " + cmd)
129 fich_output = self.fich_output
130 follow_output = self.follow_output
132 # Lancement d'Aster avec le deuxieme export
133 iret, txt_output = ExecCommand(cmd, follow_output=self.follow_output,verbose=False)
136 # Recuperation du .mess 'fils'
137 f=open(fich_output, 'w')
138 f.write( txt_output )
141 if self.INFO>=1: UTMESS('I','MACR_RECAL',"Fin du lancement de la commande : " + cmd)
143 diag = self.Recuperation_Diagnostic(txt_output)
148 # ------------------------------------------------------------------------------
150 def Recuperation_Diagnostic(self, output):
152 txt = '--- DIAGNOSTIC JOB :'
154 for ligne in output.splitlines():
155 if ligne.find(txt) > -1:
156 diag = ligne.split(txt)[-1].strip()
159 if self.INFO>=1: UTMESS('I','MACR_RECAL',"Diagnostic du calcul esclave : " + diag)
161 if diag in ['OK', 'NOOK_TEST_RESU', '<A>_ALARM', '<F>_COPY_ERROR']: return True
163 UTMESS('F','MACR_RECAL',"Le fichier esclave ne s'est pas terminé correctement.")
166 # ------------------------------------------------------------------------------
168 def Remplace_fichier_esclave(self, val_in): pass
171 # ------------------------------------------------------------------------------
173 def calcul_Aster(self, val, INFO=0):
178 reponses = self.reponses
179 UNITE_RESU = self.UNITE_RESU
180 LIST_SENSI = self.LIST_SENSI
181 LIST_DERIV = self.LIST_DERIV
183 mode_include = self.mode_include
184 follow_output = self.follow_output
185 table_sensibilite = self.table_sensibilite
187 if self.evaluation_fonction > self.ITER_FONC_MAXI:
188 UTMESS('F', nompro, "Le nombre d'evaluation de la fonctionnelle depasse le critere ITER_FONC_MAXI.")
189 self.evaluation_fonction += 1
194 # Creation du repertoire temporaire pour l'execution de l'esclave
195 tmp_macr_recal = self.Creation_Temporaire_Esclave()
197 # Creation du fichier .export de l'esclave
198 self.Creation_Fichier_Export_Esclave(tmp_macr_recal)
200 # 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
202 if self.METHODE=='EXTERNE':
203 fic = open(self.fichier_esclave,'r')
205 fic = open('fort.'+str(UL),'r')
207 # On stocke le contenu de fort.UL dans la variable fichier qui est une string
209 # On stocke le contenu initial de fort.UL dans la variable fichiersauv
210 fichiersauv=copy.copy(fichier)
213 UTMESS('F', nompro, "Impossible de relire le fichier esclave : \n " + str(self.fichier_esclave))
216 if os.environ.has_key('ASTER_ROOT'):
217 as_run = os.path.join(os.environ['ASTER_ROOT'], 'ASTK', 'ASTK_SERV', 'bin', 'as_run')
218 elif os.path.isfile(aster.repout() + os.sep + 'as_run'):
219 as_run = aster.repout() + os.sep + 'as_run'
222 if INFO>=1: UTMESS('A', nompro, "Variable d'environnement ASTER_ROOT absente, " \
223 "on essaiera avec 'as_run' dans le $PATH.")
225 if __commandes_aster__:
227 from Cata.cata import INCLUDE, DETRUIRE, FIN, DEFI_FICHIER, IMPR_TABLE, LIRE_TABLE, INFO_EXEC_ASTER, EXTR_TABLE, CREA_TABLE
230 UTMESS('F', nompro, message)
232 # Utilisation du module Python de LIRE_TABLE
234 from Macro.lire_table_ops import lecture_table
237 sys.path.append( './Python/Macro' )
238 from lire_table_ops import lecture_table
240 UTMESS('F','MACR_RECAL',"Probleme : impossible d'importer le module de lecture des tables!")
244 txt.append( "\t\t\t%s : %s" % (i, val[para.index(i)]) )
245 if INFO>=1: UTMESS('I','MACR_RECAL',"Calcul de F avec les parametres:\n%s" % '\n'.join(txt))
249 # # Quelques verifications/modifications sur le fichier esclave, pour blindage
251 # for ligne in fichier.split('\n'):
252 # # DEBUT et FIN (on retire les espaces entre le mot-clé et la premiere parenthese)
253 # for (txt1, txt2) in [('DEBUT','('), ('FIN','(')]:
254 # if ligne.find( txt1 )!=-1 and ligne.find( txt2 )!=-1:
255 # index_deb1 = ligne.index(txt1)
256 # ligne1 = ligne[ index_deb1+len(txt1):]
257 # if ligne.find( txt1 )!=-1:
260 # for (txt1, txt2) in [('DEBUT','('), ('FIN','(')]:
261 # if ligne.find( txt1 )!=-1 and ligne.find( txt2 )!=-1:
262 # index_deb1 = ligne.index(txt1)
263 # index_fin1 = index_deb1 + len(txt1)
264 # index_deb2 = ligne.index(txt2)
265 # index_fin2 = index_deb1 + len(txt2)
266 # ligne = ligne[:index_fin1]+ligne[index_deb2:]
267 # # on retire les parametes en commentaires
269 # if ligne.find(txt)!=-1:
270 # if ligne.replace(' ', '')[0] == '#': ligne = ''
271 # fichiernew.append(ligne)
272 # fichier = '\n'.join(fichiernew)
276 # On supprime tous les commentaires du fichier esclave
278 for ligne in fichier.split('\n'):
279 if ligne.strip() != '':
280 if ligne.replace(' ', '')[0] == '#': ligne = ''
281 fichiernew.append(ligne)
282 fichier = '\n'.join(fichiernew)
285 #Fichier_Resu est une liste ou l'on va stocker le fichier modifié
286 #idée générale :on délimite des 'blocs' dans fichier
287 #on modifie ou non ces blocs suivant les besoins
288 #on ajoute ces blocs dans la liste Fichier_Resu
291 # Dans le cas du mode INCLUDE on enleve le mot-clé DEBUT
294 #cherche l'indice de DEBUT()
295 index_deb=fichier.index('DEBUT(')
296 while( fichier[index_deb]!='\n'):
297 index_deb=index_deb+1
298 #on restreint fichier en enlevant 'DEBUT();'
299 fichier = fichier[index_deb+1:]
301 #on va dans l'except si on a modifié le fichier au moins une fois
308 # On enleve le mot-clé FIN()
310 #cherche l'indice de FIN()
311 index_fin = fichier.index('FIN(')
312 #on restreint fichier en enlevant 'FIN();'
313 fichier = fichier[:index_fin]
320 #--------------------------------------------------------------------------------
321 #on cherche à délimiter le bloc des parametres dans le fichier
322 #Tout d'abord on cherche les indices d'apparition des paras dans le fichier
323 #en effet l'utilisateur n'est pas obligé de rentrer les paras dans optimise
324 #avec le meme ordre que son fichier de commande
325 index_para = Numeric.zeros(len(para))
326 for i in range(len(para)):
327 index_para[i] = fichier.index(para[i])
329 #On range les indices par ordre croissant afin de déterminer
330 #les indice_max et indice_min
331 index_para = Numeric.sort(index_para)
332 index_first_para = index_para[0]
333 index_last_para = index_para[len(index_para)-1]
336 #on va délimiter les blocs intermédiaires entre chaque para "utiles" à l'optimsation
338 for i in range(len(para)-1):
341 while(fichier[j]!= '\n'):
343 bloc_inter=bloc_inter + fichier[j:k] + '\n'
345 #on veut se placer sur le premier retour chariot que l'on trouve sur la ligne du dernier para
347 while(fichier[i] != '\n'):
350 #on délimite les blocs suivants:
351 pre_bloc = fichier[:index_first_para] #fichier avant premier parametre
352 post_bloc = fichier[ index_last_para+ 1:] #fichier après dernier parametre
354 #on ajoute dans L tous ce qui est avant le premier paramètre
355 Fichier_Resu.append(pre_bloc)
356 Fichier_Resu.append('\n')
358 # Liste des parametres utilisant la SENSIBILITE
359 liste_sensibilite = []
360 if len(LIST_SENSI)>0:
362 liste_sensibilite.append( i )
364 #On ajoute la nouvelle valeur des parametres
366 for j in range(dim_para):
367 if not para[j] in liste_sensibilite:
368 Fichier_Resu.append(para[j]+'='+str(val[j]) + ';' + '\n')
370 Fichier_Resu.append(para[j]+'=DEFI_PARA_SENSI(VALE='+str(val[j]) + ',);' + '\n')
373 #On ajoute à Fichier_Resu tous ce qui est entre les parametres
374 Fichier_Resu.append(bloc_inter)
376 Fichier_Resu.append(post_bloc)
378 #--------------------------------------------------------------------------------
379 #on va ajouter la fonction d'extraction du numarray de la table par la méthode Array
380 #et on stocke les réponses calculées dans la liste Lrep
381 #qui va etre retournée par la fonction calcul_Aster
383 self.g_context['Lrep'] = []
384 Fichier_Resu.append('Lrep=[]'+'\n')
385 for i in range(len(reponses)):
386 Fichier_Resu.append('t'+str(reponses[i][0])+'='+str(reponses[i][0])+'.EXTR_TABLE()'+'\n')
387 Fichier_Resu.append('F = '+'t'+str(reponses[i][0])+'.Array('+"'"+str(reponses[i][1])+"'"+','+"'"+str(reponses[i][2])+"'"+')'+'\n')
388 Fichier_Resu.append('Lrep.append(F)'+'\n')
390 #ouverture du fichier fort.3 et mise a jour de celui ci
391 x=open('fort.'+str(UL),'w')
393 x.writelines('from Accas import _F \nfrom Cata.cata import * \n')
394 x.writelines(Fichier_Resu)
401 # ----------------------------------------------------------------------------------
402 # Execution d'une deuxieme instance d'Aster
406 # Ajout des commandes d'impression des tables Resultats et Derivees à la fin du fichier esclave
410 # Tables correspondant aux Resultats
411 for i in range(len(reponses)):
412 _ul = str(int(100+i))
414 try: os.remove( tmp_macr_recal+os.sep+"REPE_TABLE"+os.sep+"fort."+_ul )
417 Fichier_Resu.append("\n# Recuperation de la table : " + str(reponses[i][0]) + "\n")
418 Fichier_Resu.append("DEFI_FICHIER(UNITE="+num_ul+", FICHIER='"+tmp_macr_recal+os.sep+"REPE_TABLE"+os.sep+"fort."+_ul+"',);\n")
419 Fichier_Resu.append("IMPR_TABLE(TABLE="+str(reponses[i][0])+", FORMAT='ASTER', UNITE="+num_ul+", INFO=1, FORMAT_R='E30.20',);\n")
420 Fichier_Resu.append("DEFI_FICHIER(ACTION='LIBERER', UNITE="+num_ul+",);\n")
422 # Tables correspondant aux Derivees
423 if len(LIST_SENSI)>0:
425 for _para in LIST_SENSI:
426 _lst_tbl = LIST_DERIV[_para][0]
427 for _lst_tbl in LIST_DERIV[_para]:
431 _ul = str(int(100+len(reponses)+i))
432 try: os.remove( tmp_macr_recal+os.sep+"REPE_TABLE"+os.sep+"fort."+_ul )
435 Fichier_Resu.append("\n# Recuperation de la table derivee : " + _tbl + " (parametre " + _para + ")\n")
436 Fichier_Resu.append("DEFI_FICHIER(UNITE="+num_ul+", FICHIER='"+tmp_macr_recal+os.sep+"REPE_TABLE"+os.sep+"fort."+_ul+"',);\n")
437 if table_sensibilite:
438 Fichier_Resu.append("IMPR_TABLE(TABLE="+_tbl+", SENSIBILITE="+_para+", FORMAT='ASTER', UNITE="+num_ul+", INFO=1, FORMAT_R='E30.20',);\n")
440 Fichier_Resu.append("IMPR_TABLE(TABLE="+_tbl+", FORMAT='ASTER', UNITE="+num_ul+", INFO=1, FORMAT_R='E30.20',);\n")
441 Fichier_Resu.append("DEFI_FICHIER(ACTION='LIBERER', UNITE="+num_ul+",);\n")
443 # Ecriture du "nouveau" fichier .comm
444 x=open('fort.'+str(UL),'a')
445 x.write( '\n'.join(Fichier_Resu) )
446 x.write('\nFIN();\n')
449 # os.system("cat %s" % self.new_export)
451 # Lancement du calcul Aster esclave
452 cmd = '%s %s' % (as_run, self.new_export)
453 self.Lancement_Commande(cmd)
455 # Recuperation du .mess et du .resu 'fils'
456 if self.METHODE != 'EXTERNE':
457 if self.nom_fichier_mess_fils:
458 cmd = 'cp ' + tmp_macr_recal + os.sep + self.nom_fichier_mess_fils + ' ./REPE_OUT/'
460 if self.nom_fichier_resu_fils:
461 cmd = 'cp ' + tmp_macr_recal + os.sep + self.nom_fichier_resu_fils + ' ./REPE_OUT/'
464 if __commandes_aster__:
465 # Unite logique libre
466 _tbul_libre=INFO_EXEC_ASTER(LISTE_INFO='UNITE_LIBRE')
467 _ul_libre=_tbul_libre['UNITE_LIBRE',1]
470 # ------------------------------------------------------
471 # Recuperation des tableaux resultats
473 _TB = [None]*len(reponses)
474 for i in range(len(reponses)):
476 if __commandes_aster__:
478 # Version par des commandes Aster
482 DEFI_FICHIER(UNITE=_ul_libre, FICHIER=tmp_macr_recal+os.sep+"REPE_TABLE"+os.sep+"fort."+str(int(100+i)), );
484 _TB[i]=LIRE_TABLE(UNITE=_ul_libre,
488 DEFI_FICHIER(ACTION='LIBERER', UNITE=_ul_libre,);
489 tREPONSE=_TB[i].EXTR_TABLE()
491 F = tREPONSE.Array( str(reponses[i][1]), str(reponses[i][2]) )
494 message = "Impossible de recuperer les resultats de calcul esclave!"
495 UTMESS('F', nompro, message)
499 # Version par utilisation directe du python de lire_table
502 # Chemin vers le fichier contenant la table
503 _fic_table = tmp_macr_recal+os.sep+"REPE_TABLE"+os.sep+"fort."+str(int(100+i))
506 file=open(_fic_table,'r')
509 except Exception, err:
511 message = """Impossible de recuperer les resultats de calcul esclave (lecture des tables)!
512 Le calcul esclave n'a pas du se terminer correctement (ajouter un repertoire dans ASTK en Resultat avec
513 le type repe et voir l'output du fichier esclave dans ce repertoire.
517 UTMESS('F', nompro, message)
520 table_lue = lecture_table(texte, 1, ' ')
521 list_para = table_lue.para
522 tab_lue = table_lue.values()
523 except Exception, err:
525 message = "Impossible de recuperer les resultats de calcul esclave (lecture des tables)!\nMessage:\n" + str(err)
530 UTMESS('F', nompro, message)
533 nb_val = len(tab_lue[ list_para[0] ])
534 F = Numeric.zeros((nb_val,2), Numeric.Float)
535 for k in range(nb_val):
536 # F[k][0] = tab_lue[ list_para[0] ][1][k]
537 # F[k][1] = tab_lue[ list_para[1] ][1][k]
538 F[k][0] = tab_lue[ str(reponses[i][1]) ][k]
539 F[k][1] = tab_lue[ str(reponses[i][2]) ][k]
541 except Exception, err:
542 message = "Impossible de recuperer les resultats de calcul esclave (recuperation des tables)!\nMessage:\n" + str(err)
543 UTMESS('F', nompro, message)
546 # ------------------------------------------------------
547 # Recuperation des tableaux des derivees (SENSIBILITE)
549 if len(LIST_SENSI)>0:
551 for _para in LIST_SENSI:
552 _lon += len(LIST_DERIV[_para])
556 for _para in LIST_SENSI:
559 _lst_tbl = LIST_DERIV[_para][0]
561 for _lst_tbl in LIST_DERIV[_para]:
562 j = LIST_DERIV[_para].index(_lst_tbl)
565 if __commandes_aster__:
567 # Version par des commandes Aster
570 DEFI_FICHIER(UNITE=_ul_libre, FICHIER=tmp_macr_recal+os.sep+"REPE_TABLE"+os.sep+"fort."+str(int(100+len(reponses)+1+i)),);
571 _TBD[i]=LIRE_TABLE(UNITE=_ul_libre,
575 DEFI_FICHIER(ACTION='LIBERER', UNITE=_ul_libre,);
576 tREPONSE=_TBD[i].EXTR_TABLE()
577 DF = tREPONSE.Array( str(LIST_DERIV[_para][j][1]), str(LIST_DERIV[_para][j][2]) )
578 L_deriv[_para].append(DF)
583 # Version par utilisation directe du python de lire_table
586 # Chemin vers le fichier contenant la table
587 _fic_table = tmp_macr_recal+os.sep+"REPE_TABLE"+os.sep+"fort."+str(int(100+len(reponses)+1+i))
590 file=open(_fic_table,'r')
593 except Exception, err:
594 message = """Impossible de recuperer les resultats de calcul esclave (lecture des tables)!
595 Le calcul esclave n'a pas du se terminer correctement (ajouter un repertoire en Resultat avec
596 le type repe et voir l'output du fichier esclave dans ce repertoire.
600 UTMESS('F', nompro, message)
603 table_lue = lecture_table(texte, 1, ' ')
604 list_para = table_lue.para
605 tab_lue = table_lue.values()
606 except Exception, err:
608 message = "Impossible de recuperer les resultats de calcul esclave (lecture des tables)!\nMessage:\n" + str(err)
613 UTMESS('F', nompro, message)
616 nb_val = len(tab_lue[ list_para[0] ])
617 DF = Numeric.zeros((nb_val,2), Numeric.Float)
618 for k in range(nb_val):
619 # DF[k][0] = tab_lue[ list_para[0] ][1][k]
620 # DF[k][1] = tab_lue[ list_para[1] ][1][k]
621 DF[k][0] = tab_lue[ str(LIST_DERIV[_para][j][1]) ][k]
622 DF[k][1] = tab_lue[ str(LIST_DERIV[_para][j][2]) ][k]
623 L_deriv[_para].append(DF)
625 except Exception, err:
626 message = "Impossible de recuperer les resultats de calcul esclave (recuperation des tables)!\nMessage:\n" + str(err)
627 UTMESS('F', nompro, message)
630 # Nettoyage du export
631 try: os.remove(self.new_export)
634 # Nettoyage du repertoire temporaire
635 if self.METHODE == 'EXTERNE': listdir = ['REPE_TABLE', 'base', 'REPE_IN']
636 else: listdir = ['.', 'REPE_TABLE', 'base', 'REPE_OUT', 'REPE_IN']
639 for fic in os.listdir(tmp_macr_recal+os.sep+dir):
640 try: os.remove(tmp_macr_recal+os.sep+dir+os.sep+fic)
646 # ----------------------------------------------------------------------------------
647 # Ou bien on inclue le fichier Esclave
651 if debug: os.system('cp fort.'+str(UL)+' REPE_OUT/')
655 Lrep = self.g_context['Lrep']
658 # Destruction des concepts Aster
659 reca_utilitaires.detr_concepts(self)
662 # ----------------------------------------------------------------------------------
663 # Ou alors probleme ?
669 # on remet le fichier dans son etat initial
670 x=open('fort.'+str(UL),'w')
671 x.writelines(fichiersauv)
678 # ------------------------------------------------------------------------------
680 def calcul_FG(self, val):
682 self.L, self.L_deriv_sensible = self.calcul_Aster(val, INFO=self.INFO)
683 self.L_J, self.erreur = self.Simul.multi_interpole(self.L, self.reponses)
684 if not self.L_J_init: self.L_J_init = copy.copy(self.L_J)
685 self.J = self.Simul.norme_J(self.L_J_init, self.L_J, self.UNITE_RESU)
687 # Calcul des derivees
688 self.A_nodim = self.Simul.sensibilite(self, self.L, self.L_deriv_sensible, val, self.PARA_DIFF_FINI)
690 self.A = self.Dim.adim_sensi( copy.copy(self.A_nodim) )
691 # self.residu = self.reca_algo.test_convergence(self.gradient_init, self.erreur, self.A, Numeric.zeros(len(self.gradient_init),Numeric.Float) )
694 if self.vector_output:
695 return self.erreur, self.residu, self.A_nodim, self.A
698 self.norme = Numeric.dot(self.erreur, self.erreur)**0.5
700 self.norme_A_nodim = Numeric.zeros( (1,len(self.para)), Numeric.Float )
701 self.norme_A = Numeric.zeros( (1,len(self.para)), Numeric.Float )
702 for c in range(len(self.A[0,:])):
705 for l in range(len(self.A[:,0])):
706 norme_A_nodim += self.A_nodim[l,c] * self.A_nodim[l,c]
707 norme_A += self.A[l,c] * self.A[l,c]
708 self.norme_A_nodim[0,c] = math.sqrt( norme_A_nodim )
709 self.norme_A[0,c] = math.sqrt( norme_A )
711 return self.norme, self.residu, self.norme_A_nodim, self.norme_A
714 # ------------------------------------------------------------------------------
716 def calcul_F(self, val):
718 self.L, self.L_deriv_sensible = self.calcul_Aster(val, INFO=self.INFO)
719 L_J, erreur = self.Simul.multi_interpole(self.L, self.reponses)
720 if not self.L_J_init: self.L_J_init = copy.copy(L_J)
721 J = self.Simul.norme_J(self.L_J_init, L_J, self.UNITE_RESU)
724 norme = Numeric.sum( [x**2 for x in erreur] )
727 print 'erreur=', erreur
728 print "norme de l'erreur=", norme
729 print "norme de J (fonctionnelle)=", str(J)
732 txt = "Informations de convergence :"
733 txt += '\n=======================================================\n'
734 if self.evaluation_fonction >1: txt += "\n Nombre d'evaluation de la fonction = " + str(self.evaluation_fonction)
735 txt += "\n=> Fonctionnelle = "+str(J)
737 if self.vector_output:
739 txt += "\n=> Norme de l'erreur = " + str(norme)
740 txt += '\n=======================================================\n'
741 UTMESS('I','MACR_RECAL',txt)
745 txt += "\n=> Erreur = " + str(norme)
746 txt += '\n=======================================================\n'
747 UTMESS('I','MACR_RECAL',txt)
752 # ------------------------------------------------------------------------------
754 def calcul_G(self, val):
756 # Si le calcul Aster est deja effectue pour val on ne le refait pas
757 if (self.val == val) and self.L and self.L_deriv_sensible: pass
759 self.L, self.L_deriv_sensible = self.calcul_Aster(val, INFO=self.INFO)
760 A = self.Simul.sensibilite(self, self.L, self.L_deriv_sensible, val, self.PARA_DIFF_FINI)
761 A = self.Dim.adim_sensi(A)
762 L_J, erreur = self.Simul.multi_interpole(self.L, self.reponses)
763 grad = Numeric.dot(Numeric.transpose(A),erreur)
764 if debug: print 'grad=', grad
768 # ------------------------------------------------------------------------------
770 def Creation_Temporaire_Esclave(self):
772 Creation du repertoire temporaire d'execution du calcul esclace
775 # Creation du repertoire temporaire
776 tmp_macr_recal = os.getcwd() + os.sep + 'tmp_macr_recal'
777 try: os.mkdir(tmp_macr_recal)
779 if not os.path.exists(tmp_macr_recal): UTMESS('F','MACR_RECAL',"Probleme : Impossible de creer le repertoire temporaire : " + tmp_macr_recal)
780 try: os.mkdir(tmp_macr_recal + os.sep + 'REPE_TABLE')
782 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')
784 return tmp_macr_recal
787 # ------------------------------------------------------------------------------
789 def Creation_Fichier_Export_Esclave(self, tmp_macr_recal):
791 Creation du fichier .export pour le calcul esclave
794 from as_profil import ASTER_PROFIL
796 # Recuperation du fichier .export
797 list_export = glob('*.export')
799 if len(list_export) == 0: UTMESS('F','MACR_RECAL',"Probleme : il n'y a pas de fichier .export dans le repertoire de travail!")
800 elif len(list_export) >1: UTMESS('F','MACR_RECAL',"Probleme : il y a plus d'un fichier .export dans le repertoire de travail!")
802 # On modifie le profil
803 prof = ASTER_PROFIL(list_export[0])
806 if prof.param.has_key('xterm'):
807 del prof.param['xterm']
809 prof.args['memjeveux'] = self.memjeveux_esclave
812 for lab in ('data', 'resu'):
813 l_fr = getattr(prof, lab)
821 # base non prise en compte
822 if dico['type'] in ('base', 'bhdf'):
826 dico['path'] = os.path.join(tmp_macr_recal, os.path.basename(dico['path']))
831 # Nom du fichier .mess (pour recuperation dans REPE_OUT)
832 if dico['ul'] == '6':
833 self.nom_fichier_mess_fils = os.path.basename(dico['path'])
834 # self.nom_fichier_mess_fils = os.path.join(os.getcwd(), 'fort.%d' % self.UL)
836 # Nom du fichier .resu (pour recuperation dans REPE_OUT)
837 if dico['ul'] == '8':
838 self.nom_fichier_resu_fils = os.path.basename(dico['path'])
840 # Ancien .comm non pris en compte
841 # Fichier d'unite logique UNITE_RESU (rapport de MACR_RECAL) non pris en compte
842 if dico['type'] == 'comm' or (dico['ul'] == str(self.UNITE_RESU) and lab == 'resu'):
845 # Fichier d'unite logique UL devient le nouveau .comm
846 elif dico['ul'] == str(self.UL):
847 self.fichier_esclave = dico['path']
848 dico['type'] = 'comm'
850 dico['path'] = os.path.join(os.getcwd(), 'fort.%d' % self.UL)
852 # Tous les autres fichiers en Resultat
854 if self.UNITE_GRAPHIQUE and dico['ul'] == str(self.UNITE_GRAPHIQUE): l_fr.remove(dico)
856 dico['path'] = os.path.join(tmp_macr_recal, os.path.basename(dico['path']))
858 # Tous les autres fichiers en Donnees
860 if dico['type'] not in ('exec', 'ele'):
861 if dico['ul'] != '0': # Traite le cas des sources python sourchargees
862 if self.METHODE !='EXTERNE':
863 dico['path'] = os.path.join(os.getcwd(), 'fort.%s' % dico['ul'])
865 # sinon on garde la ligne telle quelle
866 setattr(prof, lab, l_fr)
868 # Ecriture du nouveau fichier export
869 prof.WriteExportTo(self.new_export)
871 if debug: os.system('cp ' + self.new_export + ' /tmp')
873 # --FIN CLASSE ----------------------------------------------------------------------------