2 # -*- coding: iso-8859-1 -*-
4 Lancement d'un calcul ASTER
13 # ==== Debut de personnalisation ====
15 # opt1_defaut, opt2_defaut : les valeurs par defaut de ces options, selon les cas
19 # ==== Fin de personnalisation ====
27 Cette procedure lance un calcul Aster. Avant de lancer ce script, il faut avoir cree un repertoire pour le calcul. Apres un premier calcul, qui aura ete lance traditionnellement, on aura copie le fichier '*export' sous le nom 'calcul.ref.export' dans ce repertoire.
29 Le mode de lancement est le suivant :
31 ScriptAster --rep_calc=rep_calc --mesh_file=mesh_file --num=nro [-dump] [-tr [--opt1=inst_deb] [--opt2=inst_fin]] [-h|-help] [-v] [-v_max]
33 Arguments obligatoires :
34 ------------------------
35 --rep_calc=rep_calc : le repertoire du calcul.
36 --mesh_file=mesh_file : le fichier contenant le maillage sur lequel on veut calculer. Le nom est absolu ou relatif par rapport au repertoire de calcul ou a $HOME.
37 --num=nro : le numero du calcul, depuis 0.
39 Options supplementaires, selon les cas :
40 ----------------------------------------
41 . Pour un cas transitoire avec changement des instants de debut et fin :
42 On doit faire le choix -tr
43 Les numeros des instants varient de 0 a N. On fournit le numero ou l'instant selon les commandes.
44 --opt1=inst_deb : le numero ou l'instant initial ; si absent, on prend 0.
45 --opt2=inst_fin : le numero ou l'instant final ; si absent, on va jusqu'au bout du transitoire.
47 --opt1=nro_couche : le numero de la couche ; si absent, on prend 1.
48 --opt2=nro_adap : le nombre d'adaptations deja realisees pour la couche ; si absent, on prend 0.
49 . Pour les autres cas :
50 Aucune option supplementaire.
52 Arguments optionnels :
53 ----------------------
54 --tr=1 : le calcul est transitoire et on change les instants ; par defaut, pas de changement.
55 --wait=wait : temps d'attente en secondes entre deux examens de l'etat d'un calcul batch ; si absent, on prend 10.
56 -dump : produit le fichier dump du fichier med de resultats ; par defaut, pas de dump.
58 -h|-help : produit l'aide, quels que soient les autres arguments
59 -v : mode verbeux simple
60 -v_max : mode verbeux intensif
64 ./ScriptAster.py --rep_calc=`pwd` --mesh_file=maill.00.med --num=0 -dump
65 ./ScriptAster.py --rep_calc=/scratch/D68518/HOMARD_SVN/trunk/training/tet_aster_ther --mesh_file=/scratch/D68518/Salome/Adapt/resu/maill.02.med --num=2
71 # 0.1. ==> Les constantes de la machine
73 info_gene = os.uname()
76 machine = info_gene[1]
82 if os.environ.has_key("LOGNAME") :
83 user = os.environ ["LOGNAME"]
89 # 0.3. ==> Le lancement d'Aster
95 # Attente en secondes entre deux controles du job
98 # 0.4. ==> Information
100 affiche_aide_globale = 0
108 #========================= Debut de la fonction ==================================
110 def __init__ ( self, liste_arg ) :
113 Le constructeur de la classe Script
116 # 1. Decodage des arguments
120 self.mesh_file = None
126 for argu in liste_arg :
129 l_aux = argu.split("=")
134 if l_aux[0] == "--rep_calc" :
135 self.rep_calc = l_aux[1]
136 elif l_aux[0] == "--num" :
137 self.numero = int(l_aux[1])
138 elif l_aux[0] == "--mesh_file" :
139 self.mesh_file = l_aux[1]
140 elif l_aux[0] == "--tr" :
142 elif l_aux[0] == "--opt1" :
144 elif l_aux[0] == "--opt2" :
146 elif l_aux[0] == "--wait" :
147 self.attente = l_aux[1]
148 elif l_aux[0] == "--version" :
149 self.version = l_aux[1]
152 if saux in ( "-H", "-HELP" ) :
153 self.affiche_aide_globale = 1
156 elif saux in ( "-V_MAX", "-VMAX" ) :
159 elif saux == "-DUMP" :
162 # 2. Les paramètres de base
165 self.nomfic_export = None
167 self.numero_str = None
169 if self.verbose_max :
170 nom_fonction = __name__ + "/__init__"
171 print "\nDans " + nom_fonction + ","
172 print ". rep_calc :", self.rep_calc
173 print ". mesh_file :", self.mesh_file
174 print ". numero :", self.numero
175 print ". opt1 :", self.opt1
176 print ". opt2 :", self.opt2
177 print ". attente :", self.attente
179 #========================= Fin de la fonction ===================================
181 #========================= Debut de la fonction ==================================
183 def compute ( self ) :
186 Lancement d'un calcul
189 nom_fonction = __name__ + "/compute"
190 blabla = "\nDans " + nom_fonction + ","
199 # 1. Preparation du calcul
201 #print "\n==== self.prepa_calcul () ===="
202 erreur, message_erreur = self.prepa_calcul ()
208 #print "\n==== self.calcul () ===="
209 erreur, message_erreur, fic_caract, fic_caract_2 = self.calcul ()
210 #print "erreur en sortie de self.calcul :", erreur
216 #print "\n==== calcul_aster_attente.calcul (",fic_caract,") ===="
217 erreur, message_erreur = self.calcul_aster_attente (fic_caract)
220 os.remove(fic_caract)
221 os.remove(fic_caract_2)
223 # 4. Gestion du resultat
225 #print "\n==== self.post_aster (dico_resu) ===="
226 erreur, message_erreur, dico_resu = self.post_aster (dico_resu)
233 #print "\n==== self.dump_resultat() ===="
234 erreur, message_erreur = self.dump_resultat ()
240 if self.verbose_max :
242 print ". erreur :", erreur
244 return erreur, message_erreur, dico_resu
246 #========================= Fin de la fonction ===================================
248 #========================= Debut de la fonction ==================================
250 def prepa_calcul ( self ) :
253 Preparation d'un calcul
256 nom_fonction = __name__ + "/prepa_calcul"
257 blabla = "\nDans " + nom_fonction + ","
262 if self.verbose_max :
264 print ". rep_calc :", self.rep_calc
265 print ". mesh_file :", self.mesh_file
266 print ". tr :", self.tr
270 # 1. Controles des arguments
272 erreur, message_erreur = self.controle_argument()
276 # 2. Modification du fichier export
278 erreur, message_erreur = self.modif_export()
282 # 3. Modifications du fichier de commandes
283 # 3.1. Pour un cas transitoire
286 erreur, message_erreur = self.modif_cas_transitoire()
290 # 3.2. Pour l'excavation
292 elif self.nomcas[:6] == "couche" :
293 erreur, message_erreur = self.modif_cas_excavation()
299 if self.verbose_max :
300 print blabla, "a la fin"
301 print ". erreur :", erreur
303 return erreur, message_erreur
305 #========================= Fin de la fonction ===================================
307 #========================= Debut de la fonction ==================================
309 def controle_argument ( self ) :
312 Controle les arguments et stockage de quelques informations
315 messages_erreur = { 0 : None,
316 -1 : "Quel repertoire de calcul ?",
317 -3 : "Quel fichier de maillage ?",
318 -4 : "Ce repertoire est inconnu.",
319 -5 : "Ce fichier est inconnu.",
320 -8 : "Quel temps d'attente ?",
321 -9 : "Quel numero de calcul ?",
322 -20 : "Numeros de pas de temps invalides.",
323 -30 : "Numero de couche invalide.",
324 -31 : "Numero d'adaptation invalide." }
326 nom_fonction = __name__ + "/controle_argument"
327 blabla = "\nDans " + nom_fonction + ","
332 if self.verbose_max :
334 print ". rep_calc :", self.rep_calc
335 print ". mesh_file :", self.mesh_file
336 print ". numero :", self.numero
337 print ". tr :", self.tr
338 print ". opt1 :", self.opt1
339 print ". opt2 :", self.opt2
340 print ". attente :", self.attente
344 # 1. Les repertoire et fichier
345 # 1.1. Il y a bien eu une donnee
347 if self.rep_calc == None :
349 elif self.mesh_file == None :
352 self.message_info += "Relancer avec -h pour avoir le mode d'emploi."
355 # 1.2. Le repertoire de calcul
357 if os.environ.has_key("HOME") :
358 HOME = os.environ ["HOME"]
360 HOME = "/local/home/salome"
362 if ( self.rep_calc[:1] == "~" ) :
363 self.rep_calc = os.path.join(HOME, self.rep_calc[2:])
364 if not os.path.isdir(self.rep_calc) :
365 self.message_info += "Repertoire " + self.rep_calc
369 aux = os.path.join(os.getcwd(), self.rep_calc)
370 self.rep_calc = os.path.normpath(aux)
376 if ( fic[:1] == "~" ) :
377 fic = os.path.join(HOME, fic[2:])
378 if not os.path.isfile(fic) :
379 aux = os.path.join(self.rep_calc, fic)
380 if not os.path.isfile(aux) :
381 self.message_info += "Fichier : " + fic
385 fic = os.path.normpath(aux)
386 aux = os.path.join(os.getcwd(), fic)
388 self.mesh_file = os.path.normpath(aux)
390 # 2. On en deduit le cas
392 self.nomcas = os.path.basename(self.rep_calc)
393 if self.verbose_max :
394 print ". Cas :", self.nomcas
396 # 3. Le temps d'attente
400 iaux = int(self.attente)
406 # 4. Le numero du calcul
408 if self.numero == None :
411 if ( self.numero < 100 ) :
412 self.numero_str = "%02d" % self.numero
413 elif ( self.numero < 1000 ) :
414 self.numero_str = "%03d" % self.numero
415 elif ( self.numero < 10000 ) :
416 self.numero_str = "%04d" % self.numero
418 self.numero_str = "%d" % self.numero
420 # 5. Options speciales pour les cas transitoires et pour l'excavation
422 if ( self.tr or ( self.nomcas[:6] == "couche" ) ) :
424 if self.opt1 == None :
425 self.opt1 = opt1_defaut[self.nomcas]
426 #print ". opt1 defaut :", self.opt1
428 if self.opt2 == None :
429 self.opt2 = opt2_defaut[self.nomcas]
430 #print ". opt2 defaut :", self.opt2
432 # 5.1. Pour un cas transitoire
439 iaux1 = int(self.opt1)
441 daux1 = float(self.opt1)
448 iaux2 = int(self.opt2)
450 daux2 = float(self.opt2)
452 if ( ( daux1 == None ) or ( daux2 == None ) ) :
453 #print "------------ ( daux1 == None ) or ( daux2 == None ) ------------"
454 #print "iaux1, iaux2 =", iaux1, iaux2
457 elif ( ( iaux1 == None ) or ( iaux2 == None ) ) :
458 #print "------------ ( iaux1 == None ) or ( iaux2 == None ) ------------"
459 #print "daux1, daux2 =", daux1, daux2
466 self.message_info += "opt1 = " + self.opt1
467 self.message_info += "\nopt2 = " + self.opt2
469 # 5.2. Pour l'excavation
471 elif self.nomcas[:6] == "couche" :
475 iaux1 = int(self.opt1)
479 if ( ( iaux1 < 1 ) or ( iaux1 > 20 ) ) :
480 #print "iaux1 =", iaux1
485 iaux2 = int(self.opt2)
490 #print "iaux1 =", iaux1
494 self.message_info += "nro_mail = " + self.numero
495 self.message_info += "\nopt1 = " + self.opt1
496 self.message_info += "\nopt2 = " + self.opt2
499 self.nro_couche = iaux1
500 self.nro_adap = iaux2
505 message_erreur = messages_erreur[erreur]
507 if self.verbose_max :
508 print ". rep_calc :", self.rep_calc
509 print ". mesh_file :", self.mesh_file
510 print ". opt1 :", self.opt1
511 print ". opt2 :", self.opt2
513 return erreur, message_erreur
515 #========================= Fin de la fonction ===================================
517 #========================= Debut de la fonction ==================================
519 def modif_export ( self ) :
522 Modification du fichier export et reperage de quelques informations
525 messages_erreur = { 0 : None }
527 nom_fonction = __name__ + "/modif_export"
528 blabla = "\nDans " + nom_fonction + ","
533 if self.verbose_max :
535 print ". numero :", self.numero
536 print ". mesh_file :", self.mesh_file
540 # 1. Lecture du fichier export original
542 fic_export_ref = os.path.join(self.rep_calc, "calcul.ref.export")
543 fic = open (fic_export_ref, "r")
544 les_lignes = fic.readlines()
547 # 2. Ouverture du nouveau fichier export
550 if self.nomcas[:6] == "couche" :
551 nomfic += ".%02d" % self.nro_couche
552 nomfic += "." + self.numero_str + ".export"
553 self.nomfic_export = os.path.join(self.rep_calc, nomfic)
554 if self.verbose_max :
555 print ". nouveau fic_export :", self.nomfic_export
556 fic = open (self.nomfic_export, "w")
558 # 3. Exploration des lignes
560 for ligne in les_lignes :
562 # 3.1. Pas de modification, a priori
567 # 3.2. Decodage des composants de la ligne pour un fichier
569 if ligne[0:2] == "F " :
580 if ( ":" in nomfic_0 ) :
581 laux1 = nomfic_0.split(":")
582 saux = laux1[0] + ":"
585 # 3.2.1. Si c'est le fichier de commandes, mise a jour du nom du repertoire
587 if ( typfic == "comm" ) :
589 if self.verbose_max :
590 print ". Commandes : mise a jour du nom du repertoire"
592 nomfic_l_0 = os.path.basename(nomfic_0)
593 nomfic = os.path.join(self.rep_calc, nomfic_l_0)
595 # 3.2.2. Si c'est un fichier de resultats ou le fichier de maillage, mise a jour du nom
597 elif ( ( statut == "R" ) or ( typfic == "mmed" ) ) :
598 if self.verbose_max :
599 print ". Mise a jour du nom"
602 # 3.2.2.1. Le fichier de maillage est celui passe en argument
604 if typfic == "mmed" :
605 nomfic = self.mesh_file
607 # 3.2.2.2. Pour les autres fichiers, on recupère le nom initial
610 nomfic_l_0 = os.path.basename(nomfic_0)
611 laux1 = nomfic_l_0.split(".")
612 #print "laux1 =", laux1
614 # 3.2.2.2.1. Base des noms de fichiers si excavation
616 if laux1[0] == "couche_n" :
617 saux0 = "couche_%02d" % self.nro_couche
619 iaux = len(laux1[-1]) + 1
620 saux0 = nomfic_l_0[:-iaux]
621 #print "saux0 =", saux0
623 # 3.2.2.2.2. Indicage des fichiers
625 nomfic_l = saux0 + "." + self.numero_str + "." + laux1[-1]
626 nomfic_l_1 = os.path.dirname(nomfic_0)
627 nomfic = os.path.join(nomfic_l_1, nomfic_l)
628 #print " ==> ", nomfic
631 ligne_bis = laux[0] + " " + laux[1] + " " + saux
632 ligne_bis += nomfic + " "
633 ligne_bis += laux[3] + " " + laux[4] + "\n"
635 # 3.2.2.3. On detruit preventivement les fichiers des resultats
637 if ( statut == "R" ) :
638 if ( self.nomcas[:6] != "couche" ) :
639 if os.path.isfile(nomfic) :
642 # 3.2.3. Memorisation des noms
644 self.dico[typfic] = nomfic
646 # 3.3. Decodage des composants de la ligne pour la base
648 elif ligne[0:2] == "R " :
655 # 3.3.1. Si c'est le fichier de la base, on recupere le nom initial, en ajustant l'indice
657 if typfic in ( "base", "bhdf" ) :
660 if ( ":" in nomfic_0 ) :
661 laux1 = nomfic_0.split(":")
662 saux = laux1[0] + ":"
664 nomfic_l_0 = os.path.basename(nomfic_0)
665 laux1 = nomfic_l_0.split(".")
667 nomfic_l = laux1[0] + "." + self.numero_str + "." + laux1[2]
668 elif len(laux1) >= 2 :
669 if laux1[0] == "couche_nm1" :
670 saux0 = "couche_%02d" % (self.nro_couche-1)
671 elif laux1[0] == "couche_n" :
672 saux0 = "couche_%02d" % self.nro_couche
675 nomfic_l = saux0 + "." + laux1[1]
677 nomfic_l = nomfic_l_0
678 nomfic_l_1 = os.path.dirname(nomfic_0)
679 nomfic = os.path.join(nomfic_l_1, nomfic_l)
681 ligne_bis = laux[0] + " " + laux[1] + " " + saux
682 ligne_bis += nomfic + " "
683 ligne_bis += laux[3] + " " + laux[4] + "\n"
685 # 3.4. Decodage des composants de la ligne pour un parametre
687 elif ligne[0:2] == "P " :
691 if ( len(laux) == 3 ) :
693 if laux[1] in ( "username" ) :
695 elif laux[1] in ( "uclient" ) :
697 elif laux[1] in ( "aster_root" ) :
698 self.aster_root = aux
699 elif laux[1] in ( "serveur" ) :
701 elif laux[1] in ( "mclient" ) :
703 #elif laux[1] in ( "display" ) :
704 #aux = self.machine+":0.0"
705 elif laux[1] in ( "nomjob" ) :
707 elif laux[1] in ( "mode" ) :
709 ligne_bis = laux[0] + " " + laux[1] + " " + aux + "\n"
711 # 3.5. Ecriture de la ligne
720 message_erreur = messages_erreur[erreur]
722 if self.verbose_max :
723 print ". mclient ", self.mclient
724 print ". uclient ", self.uclient
725 print ". serveur ", self.serveur
726 print ". username ", self.username
727 print ". aster_root ", self.aster_root
728 print ". nomjob ", self.nomjob
729 print ". mode ", self.mode
731 return erreur, message_erreur
733 #========================= Fin de la fonction ===================================
735 #========================= Debut de la fonction ==================================
737 def modif_cas_transitoire ( self ) :
740 Modification du fichier de commandes lie au cas transitoire
743 messages_erreur = { 0 : None,
744 2 : "Mot_cle inconnu dans les commandes." }
746 nom_fonction = __name__ + "/modif_cas_transitoire"
747 blabla = "\nDans " + nom_fonction + ","
752 if self.verbose_max :
754 print ". opt1 :", self.opt1
755 print ". opt2 :", self.opt2
759 # 1. Lecture du fichier de commandes
761 nomfic = os.path.join(self.rep_calc, self.dico["comm"])
762 fic = open (nomfic, "r")
763 les_lignes = fic.readlines()
766 # 2. Ouverture du nouveau fichier de commandes
768 fic = open (nomfic, "w")
770 # 3. Exploration des lignes
772 # 3.0. Reperage de la zone a modifier
776 for ligne in les_lignes :
778 if self.verbose_max :
779 print "ligne =", ligne[:-1]
781 # 3.1. Pas de modification, a priori
785 # 3.2. Reperage de la zone a modifier
787 if ( "A PERSONNALISER - DEBUT" in ligne ) :
789 elif ( "A PERSONNALISER - FIN" in ligne ) :
794 #print "A_modifier =", A_modifier
797 #print "ligne =", ligne[:-1]
798 for iaux in range(2) :
800 mot_cle_ref = "NUME_INST_"
803 mot_cle_ref = "INST_"
805 #print "mot_cle_ref =", mot_cle_ref
807 if ligne[0:lg_mot_cle] == mot_cle_ref :
809 if ligne[lg_mot_cle:lg_mot_cle+4] == "INIT" :
811 motcle = ligne[0:lg_mot_cle+4]
812 elif ligne[lg_mot_cle:lg_mot_cle+3] == "FIN" :
814 motcle = ligne[0:lg_mot_cle+3]
816 self.message_info += ligne
820 ligne_bis = motcle + " = " + str(aux) +"\n"
825 # 3.4. Ecriture de la ligne
833 # 4. Gestion des erreurs
836 message_erreur = messages_erreur[erreur]
838 return erreur, message_erreur
840 #========================= Fin de la fonction ===================================
842 #========================= Debut de la fonction ==================================
844 def modif_cas_excavation ( self ) :
847 Modification du fichier de commandes lie au cas de l'excavation
850 messages_erreur = { 0 : None }
852 nom_fonction = __name__ + "/modif_cas_excavation"
853 blabla = "\nDans " + nom_fonction + ","
858 if self.verbose_max :
860 print ". numero :", self.numero
861 print ". nro_couche :", self.nro_couche
862 print ". nro_adap :", self.nro_adap
866 # 1. Lecture du fichier de commandes
868 nomfic = os.path.join(self.rep_calc, self.dico["comm"])
869 fic = open (nomfic, "r")
870 les_lignes = fic.readlines()
873 # 2. Ouverture du nouveau fichier de commandes
875 fic = open (nomfic, "w")
877 # 3. Exploration des lignes
879 # 3.0. Reperage de la zone a modifier
883 for ligne in les_lignes :
885 if self.verbose_max :
886 print "ligne =", ligne[:-1]
888 # 3.1. Pas de modification, a priori
892 # 3.2. Reperage de la zone a modifier
894 if ( "A PERSONNALISER - DEBUT" in ligne ) :
896 elif ( "A PERSONNALISER - FIN" in ligne ) :
901 #print "A_modifier =", A_modifier
904 #print "ligne =", ligne[:-1]
905 for iaux in range(3) :
907 mot_cle_ref = "nro_mail"
911 mot_cle_ref = "nro_couche"
913 aux = self.nro_couche
915 mot_cle_ref = "nro_adap"
918 #print "mot_cle_ref =", mot_cle_ref
920 if ligne[0:lg_mot_cle] == mot_cle_ref :
921 #print "==> aux =", aux, type(aux)
922 ligne_bis = mot_cle_ref + " = " + str(aux) +"\n"
924 # 3.4. Ecriture de la ligne
932 # 4. Gestion des erreurs
935 message_erreur = messages_erreur[erreur]
937 return erreur, message_erreur
939 #========================= Fin de la fonction ===================================
941 #========================= Debut de la fonction ==================================
943 def calcul ( self ) :
946 Lancement d'un calcul
949 messages_erreur = { 0 : None }
951 nom_fonction = __name__ + "/calcul"
952 blabla = "\nDans " + nom_fonction + ","
957 if self.verbose_max :
958 print ". mclient ", self.mclient
959 print ". serveur ", self.serveur
961 # 1. Copie du fichier export sur le serveur de calcul
963 if ( self.mclient != self.serveur ) :
965 nomfic_export_dist = self.nomjob + ".export"
966 commande = "scp " + self.nomfic_export + " " + self.username + "@" + self.serveur + ":" + nomfic_export_dist
967 if self.verbose_max :
968 print "Copie du fichier export vers", self.serveur, ":"
970 erreur = os.system(commande)
972 # 2. Commande du lancement
974 commande_base = os.path.join(self.aster_root, "bin", "as_run")
976 if self.mode == "batch" :
977 commande_base += "--serv "
978 commande_base += self.username + "@" + self.serveur + ":"
979 #if self.verbose_max :
982 fic_caract = tempfile.mktemp()
983 fic_caract_2 = tempfile.mktemp()
986 # 3.1. Commande finale
988 if ( self.mclient == self.serveur ) :
989 commande = commande_base
990 commande += commande_base + self.nomfic_export
992 commande = "ssh " + self.username + "@" + self.serveur
993 commande += " \"" + commande_base + nomfic_export_dist + "\""
994 commande += " 1>" + fic_caract
995 commande += " 2>" + fic_caract_2
996 if self.verbose_max :
997 print "Lancement sur", self.serveur, ":"
1000 # 3.2. Lancement vrai
1002 erreur = os.system(commande)
1004 messages_erreur[erreur] = "erreur de calcul numero %d" % erreur
1006 self.message_info += "resultat dans le fichier :\n"
1008 self.message_info += self.dico["rmed"]+"\n"
1010 if self.verbose_max :
1012 print ". erreur :", erreur
1013 print ". self.mode :", self.mode
1014 print ". fic_caract :", fic_caract
1017 message_erreur = messages_erreur[erreur]
1019 return erreur, message_erreur, fic_caract, fic_caract_2
1021 #========================= Fin de la fonction ===================================
1023 #========================= Debut de la fonction ==================================
1025 def calcul_aster_attente ( self, fic_caract ) :
1028 Bilan du calcul Aster
1029 fic_caract : fichier caracteristique du job
1032 nom_fonction = __name__ + "/calcul_aster_attente"
1033 blabla = "\nDans " + nom_fonction + ","
1036 message_erreur = " "
1038 if self.verbose_max :
1039 print ". fic_caract :", fic_caract
1040 print ". nomjob :", self.nomjob
1041 print ". rep_calc :", self.rep_calc
1042 print ". mode :", self.mode
1043 print ". attente :", self.attente
1045 if ( self.mode != "interactif" ) :
1047 # 1. Recuperation du numero de job
1049 fic = open (fic_caract, "r")
1050 les_lignes = fic.readlines()
1053 for ligne in les_lignes :
1055 if ( len(ligne)>0 ) :
1057 if "JOBID" in ligne :
1059 laux = ligne.split()
1060 laux1 = laux[0].split("=")
1063 elif "num_job" in ligne :
1065 laux = ligne.split("num_job")
1066 laux1 = laux[1].split()
1070 print ". numjob :", numjob
1072 # 2. Commande de l'examen de l'etat du job,
1074 fic_etat = os.path.join(self.rep_calc, self.nomjob+".etat")
1075 fic_etat_2 = tempfile.mktemp()
1076 commande_base = os.path.join(self.aster_root, "bin", "as_run")
1077 commande_base += " --actu " + numjob + " " + self.nomjob + " " + self.mode
1078 if self.verbose_max :
1079 print "commande_base =", commande_base
1080 if ( self.mclient == self.serveur ) :
1081 commande = commande_base
1083 commande = "ssh " + self.username + "@" + self.serveur
1084 commande += " \"" + commande_base + "\""
1085 commande += " 1>" + fic_etat
1086 commande += " 2>" + fic_etat_2
1087 if self.verbose_max :
1088 print "Examen sur", self.serveur, ":"
1091 # 3. Examen de l'etat du job, jusqu'a la fin
1096 if encore % 4 == 0 :
1097 aux = ((encore-1)*self.attente) / 60
1098 print "..", aux, "mn"
1101 time.sleep(self.attente)
1102 erreur = os.system(commande)
1107 elif os.path.isfile(fic_etat) :
1108 fic = open (fic_etat, "r")
1109 les_lignes = fic.readlines()
1111 if len(les_lignes) > 0 :
1112 if len(les_lignes[0]) > 0 :
1113 laux = les_lignes[0].split()
1114 laux1 = laux[0].split("=")
1116 laux1 = laux[1].split("=")
1118 if self.verbose_max :
1120 if etat in ( "RUN", "PEND" ) :
1123 if etat != "ENDED" :
1124 self.message_info += "Etat du job : " + etat
1127 if diag[:3] in ( "<S>", "<F>" ) :
1130 self.message_info = "Diagnostic du job : " + diag + "\n"
1141 os.remove(fic_etat_2)
1143 if self.verbose_max :
1145 print ". erreur :", erreur
1148 message_erreur = "Erreur dans le calcul"
1150 return erreur, message_erreur
1152 #========================= Fin de la fonction ===================================
1154 #========================= Debut de la fonction ==================================
1156 def post_aster ( self, dico_resu_init ) :
1159 Affichage de resultats selon les cas
1162 messages_erreur = { 0 : None,
1163 1 : "Ce fichier est inconnu." }
1165 nom_fonction = __name__ + "/post_aster"
1166 blabla = "\nDans " + nom_fonction + ","
1169 message_erreur = " "
1172 for cle in dico_resu_init.keys() :
1173 dico_resu[cle] = dico_resu_init[cle]
1177 # 1. Exploration du fichier resu
1179 # 1.1. Recuperation du contenu
1181 nomfic = self.dico["resu"]
1184 erreur, message_erreur, info = self.post_aster_1 ( nomfic, chaine, nuocc )
1190 if ( erreur == 0 ) :
1191 self.message_info += info[:-1]
1192 info = info.replace(chaine, " ")
1193 laux = info[:-1].split()
1196 aux = aux.replace("D", "E")
1197 dico_resu[chaine] = float(aux)
1200 message_erreur = " "
1202 # 2. Exploration du fichier mess
1203 # 2.1. Que chercher ?
1205 for chaine in ( "INSTANT", "NOMBRE DE NOEUDS", "NOMBRE DE MAILLES" ) :
1207 # 2.2. Recuperation du contenu
1209 nomfic = self.dico["mess"]
1210 if chaine == "INSTANT" :
1214 erreur, message_erreur, info = self.post_aster_1 ( nomfic, chaine, nuocc )
1220 if ( erreur == 0 ) :
1221 self.message_info += info[:-1]
1222 if chaine == "INSTANT" :
1223 l_aux = info[:-1].split()
1225 for iaux in range(lg_aux) :
1226 if ( "ORDRE" in l_aux[iaux] ) :
1227 if l_aux[iaux+1] == ":" :
1231 ordre = int(l_aux[jaux])
1232 dico_resu["ORDRE"] = ordre
1233 dico_resu["PAS_DE_TEMPS"] = ordre
1234 elif chaine in ( "NOMBRE DE NOEUDS", "NOMBRE DE MAILLES" ) :
1235 l_aux = info[:-1].split(chaine)
1236 dico_resu[chaine] = int(l_aux[1])
1239 message_erreur = " "
1244 # 3. Fichier de resultats au format med
1246 dico_resu["FileName"] = self.dico["rmed"]
1252 print ". erreur :", erreur
1253 print ". dico_resu :", dico_resu
1256 message_erreur = messages_erreur[erreur]
1258 return erreur, message_erreur, dico_resu
1260 #========================= Fin de la fonction ===================================
1262 #========================= Debut de la fonction ==================================
1264 def post_aster_1 ( self, nomfic, chaine, nuocc ) :
1268 nomfic = nom du fichier a decoder
1269 chaine = chaine a chercher
1270 nuocc = numero de l'occurence a chercher, 0 si toutes
1272 codret = 0 : tout va bien
1273 1 : le fichier de resultats est absent
1274 -1 : la chaine est absente
1275 message_erreur = "" : tout va bien
1277 info = la ou les lignes recherchees
1280 messages_erreur = { 0 : None,
1281 -1 : "La chaine est absente.",
1282 1 : "Ce fichier est inconnu." }
1284 nom_fonction = __name__ + "/post_aster_1"
1285 blabla = "\nDans " + nom_fonction + " :"
1286 if self.verbose_max :
1287 print blabla, "nomfic =", nomfic, "chaine =", chaine, ", nuocc =", nuocc
1291 message_erreur = " "
1296 # 1. Lecture du fichier
1298 if not os.path.isfile(nomfic) :
1299 self.message_info += "\nFichier "+nomfic+"\n"
1302 fic = open (nomfic, "r")
1303 les_lignes = fic.readlines()
1306 # 2. Exploration des lignes
1307 # 2.1. On recupere tout
1311 for ligne in les_lignes :
1319 for ligne in les_lignes :
1320 if chaine in ligne :
1322 if ( ( nuocc == 0 ) or ( iaux == nuocc ) ) :
1325 self.message_info += "\n"
1333 if ( self.verbose_max or ( erreur>0 ) ) :
1334 print blabla, "nomfic =", nomfic, "chaine =", chaine, ", nuocc =", nuocc
1335 print ". erreur =", erreur
1338 message_erreur = messages_erreur[erreur]
1340 return erreur, message_erreur, info
1342 #========================= Fin de la fonction ===================================
1344 #========================= Debut de la fonction ==================================
1346 def dump_resultat ( self ) :
1349 Dump du resultat du calcul
1352 messages_erreur = { 0 : None }
1354 nom_fonction = __name__ + "/dump_resultat"
1355 blabla = "\nDans " + nom_fonction + ","
1358 message_erreur = " "
1362 nomfic_donn = os.path.join(self.rep_calc, "donn")
1363 fic = open (nomfic_donn, "w")
1364 fic.write("1\n1\n1\n")
1366 fic_dump = self.dico["rmed"]+".dump"
1367 commande = "mdump " + self.dico["rmed"] + "<" + nomfic_donn + ">" + fic_dump
1369 erreur = os.system(commande)
1371 messages_erreur[erreur] = "Erreur de dump numero %d" % erreur
1373 self.message_info += "\nDump dans le fichier :\n"
1374 self.message_info += fic_dump+"\n"
1376 if self.verbose_max :
1378 print ". erreur :", erreur
1380 os.remove(nomfic_donn)
1383 message_erreur = messages_erreur[erreur]
1385 return erreur, message_erreur
1387 #========================= Fin de la fonction ===================================
1390 if __name__ == "__main__" :
1392 #print "Arguments a l'entree de", sys.argv[0], ":", sys.argv[1:], "\n"
1394 Script_A = Script(sys.argv[1:])
1396 if Script_A.affiche_aide_globale :
1397 Script_A.message_info = Script_A.__doc__
1399 message_erreur_m = ""
1402 erreur_m, message_erreur_m, dico_resu_m = Script_A.compute ()
1404 sys.stdout.write(Script_A.message_info+"\n")
1405 sys.stderr.write(message_erreur_m+"\n")