1 #@ MODIF macr_adap_mail_ops Macro DATE 11/12/2007 AUTEUR GNICOLAS G.NICOLAS
2 # -*- coding: iso-8859-1 -*-
3 # CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2003 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 # ======================================================================
20 # RESPONSABLE GNICOLAS G.NICOLAS
23 Traitement des macros MACR_ADAP_MAIL/MACR_INFO_MAIL
27 def macr_adap_mail_ops ( self,
28 INFO, VERSION_HOMARD, MAILLAGE_FRONTIERE,
31 Traitement des macros MACR_ADAP_MAIL/MACR_INFO_MAIL
34 # 1. args est le dictionnaire des arguments
35 # args.keys() est la liste des mots-clés
36 # args.keys()[0] est la premiere valeur de cette liste
37 # args.keys()[1:] est la liste des valeurs suivantes dans cette liste
38 # args.keys(mot_cle) représente le contenu de la variable mot_cle dans la macro appelante.
42 ### if len (args.keys())>0 : print args.keys()[0]
43 ### print args["MAILLAGE"]
45 # 2. Les caractéristiques d'un passage sont conservées dans un dictionnaire. Il y a autant de
46 # dictionnaires que de sollicitations pour une série d'adaptation. L'ensemble de ces dictionnaires
47 # est conservé dans la liste Liste_Passages. Cette liste est nécessairement globale pour pouvoir
48 # la retrouver à chaque nouveau passage.
49 # Description du dictionnaire de passages :
50 # dico["Maillage_0"] = o ; string ; nom du concept du maillage initial de la série d'adaptation
51 # dico["Maillage_NP1"] = o ; string ; nom du concept du dernier maillage adapté
52 # dico["Rep_Calc_HOMARD_global"] = o ; string ; Nom global du répertoire de calcul pour HOMARD
53 # dico["Rep_Calc_HOMARD_local"] = o ; string ; Nom local du répertoire de calcul pour HOMARD
54 # depuis le répertoire de calcul pour ASTER
55 # dico["niter"] = o ; entier ; numéro d'itération
57 # 3. Les caractéristiques d'un maillage sont conservées dans un dictionnaire. Il y a autant de
58 # dictionnaires que de maillages manipulés. L'ensemble de ces dictionnaires est conservé
59 # dans la liste liste_maillages.
60 # Description du dictionnaire de maillages :
61 # dico["Type_Maillage"] = o ; string ; "MAILLAGE_N", "MAILLAGE_NP1", "MAILLAGE_NP1_ANNEXE" ou "MAILLAGE_FRONTIERE"
62 # dico["Nom_ASTER"] = o ; concept ASTER associé
63 # dico["Action"] = o ; string ; "A_ecrire" ou "A_lire"
64 # dico["NOM_MED"] = o ; string ; Nom MED du maillage
66 # 4. Les caractéristiques d'un champ sont conservées dans un dictionnaire. Il y a autant de
67 # dictionnaires que de champs manipulés. L'ensemble de ces dictionnaires est conservé
68 # dans la liste liste_champs.
69 # Description du dictionnaire de champs :
70 # dico["Type_Champ"] = o ; string ; "INDICATEUR" ou "CHAMP_MAJ"
71 # dico["RESULTAT"] = f ; concept ASTER du résutat associé
72 # dico["NOM_CHAM"] = f ; string ; Nom ASTER du champ
73 # dico["CHAM_GD"] = f ; concept ASTER du champ de grandeur associée
74 # dico["COMPOSANTE"] = f ; string ; Nom ASTER de la composante (dans le cas de l'indicateur)
75 # dico["NUME_ORDRE"] = f ; entier ; Numéro d'ordre du champ
76 # dico["INST"] = f ; entier ; Instant du champ
77 # dico["PRECISION"] = f ; entier ; Précision sur l'instant du champ
78 # dico["CRITERE"] = f ; entier ; Critère de précision sur l'instant du champ
79 # dico["CHAM_MAJ"] = f ; string ; Nom ASTER du champ interpolé sur le nouveau maillage
80 # dico["NOM_MED"] = o ; string ; Nom MED du champ
81 # dico["SENSIBILITE"] = f ; string ; Nom du paramètre sensible associé
84 from Macro import creation_donnees_homard
85 from Utilitai.Utmess import UTMESS
93 #====================================================================
95 #====================================================================
97 # 1.1. ==> La macro compte pour 1 dans la numerotation des commandes
101 # 1.2. ==> Numéro du passage dans cette macro
104 self.jdc.indice_macro_homard = self.jdc.indice_macro_homard + 1
106 self.jdc.indice_macro_homard = 1
108 numero_passage_fonction = self.jdc.indice_macro_homard
109 ### print "numero_passage_fonction = ",numero_passage_fonction
111 # 1.3. ==> On importe les definitions des commandes a utiliser dans la macro
113 DEFI_FICHIER = self.get_cmd("DEFI_FICHIER")
114 IMPR_RESU = self.get_cmd("IMPR_RESU")
115 EXEC_LOGICIEL = self.get_cmd("EXEC_LOGICIEL")
116 LIRE_MAILLAGE = self.get_cmd("LIRE_MAILLAGE")
117 LIRE_CHAMP = self.get_cmd("LIRE_CHAMP")
119 # 1.4. ==> Le nom du programme HOMARD à lancer
121 repertoire_outils = aster.repout()
122 homard = repertoire_outils + "homard"
124 # 1.5. ==> Initialisations
127 Rep_Calc_ASTER = os.getcwd()
134 LISTE_ADAPTATION_LIBRE = ("RAFF_DERA" , "RAFFINEMENT" , "DERAFFINEMENT")
136 #====================================================================
137 # 2. Décodage des arguments de la macro-commande
138 #====================================================================
139 # 2.1. ==> Données de pilotage de l'adaptation
141 if ( self.nom == "MACR_ADAP_MAIL" ) :
145 # 2.1.1. ==> Les concepts "maillage"
147 #gn print "\n.. Debut de 2.1.1"
148 # for mot_cle in ["MAILLAGE_N" , "MAILLAGE_NP1"] :
149 for mot_cle in ["MAILLAGE_N" , "MAILLAGE_NP1" , "MAILLAGE_NP1_ANNEXE"] :
150 #gn print "\nmot_cle = ",mot_cle
152 dico["Type_Maillage"] = mot_cle
153 if ( args[mot_cle] != None ) :
154 #gn print "==> args[",mot_cle,"] = ",args[mot_cle]
155 dico["Nom_ASTER"] = args[mot_cle]
156 if ( mot_cle == "MAILLAGE_N" ) :
157 dico["Action"] = "A_ecrire"
159 dico["Action"] = "A_lire"
161 dico["Action"] = "Rien"
162 #gn print "dico = ",dico
163 liste_maillages.append(dico)
165 # 2.1.2. ==> L'éventuel indicateur d'erreur
167 #gn print "\n.. Debut de 2.1.2"
168 #gn print "args = ", args
169 if args["ADAPTATION"] in LISTE_ADAPTATION_LIBRE :
171 dico["Type_Champ"] = "INDICATEUR"
172 if ( args["RESULTAT_N"] != None ) :
174 dico["RESULTAT"] = args["RESULTAT_N"]
175 noresu = dico["RESULTAT"].nom
176 dico["NOM_CHAM"] = args["INDICATEUR"]
177 nomsym = dico["NOM_CHAM"]
178 if ( args["NUME_ORDRE"] != None ) :
179 dico["NUME_ORDRE"] = args["NUME_ORDRE"]
180 if ( args["INST"] != None ) :
181 dico["INST"] = args["INST"]
182 for cle in [ "PRECISION", "CRITERE" ] :
183 if ( args[cle] != None ) :
184 dico[cle] = args[cle]
185 if ( args["SENSIBILITE"] != None ) :
186 dico["SENSIBILITE"] = args["SENSIBILITE"]
189 dico["CHAM_GD"] = args["CHAM_GD"]
190 noresu = dico["CHAM_GD"].nom
192 #gn print "dico = ", dico
194 if dico.has_key("SENSIBILITE") :
195 nopase = dico["SENSIBILITE"].nom
198 #gn print "Avant appel a aster.mdnoch, lresu = ",lresu,", noresu =", noresu ,", nomsym = ", nomsym ,", nopase = ", nopase
199 dico["NOM_MED"] = aster.mdnoch ( lresu, noresu, nomsym, nopase )
200 #gn print "==> dico[\"NOM_MED\"] = ", dico["NOM_MED"]
201 dico["COMPOSANTE"] = args["NOM_CMP_INDICA"]
202 liste_champs.append(dico)
206 # 2.1.3. ==> Les champs à mettre à jour
208 #gn print "\n.. Debut de 2.1.3."
210 if args.has_key("MAJ_CHAM") :
212 if args["MAJ_CHAM"] is None :
215 les_champs = args["MAJ_CHAM"]
217 for maj_cham in les_champs :
219 #gn print type(maj_cham)
222 dico["Type_Champ"] = "CHAMP_MAJ"
223 liste_aux = [ "CHAM_MAJ", "TYPE_CHAM" ]
224 if ( maj_cham["RESULTAT"] != None ) :
226 liste_aux.append("RESULTAT")
227 liste_aux.append("NOM_CHAM")
228 if ( maj_cham["NUME_ORDRE"] != None ) :
229 dico["NUME_ORDRE"] = maj_cham["NUME_ORDRE"]
230 elif ( maj_cham["INST"] != None ) :
231 dico["INST"] = maj_cham["INST"]
232 for cle in [ "PRECISION", "CRITERE" ] :
233 if ( maj_cham[cle] != None ) :
234 dico[cle] = maj_cham[cle]
235 noresu = maj_cham["RESULTAT"].nom
236 nomsym = maj_cham["NOM_CHAM"]
237 if ( maj_cham["SENSIBILITE"] != None ) :
238 dico["SENSIBILITE"] = maj_cham["SENSIBILITE"]
241 liste_aux.append("CHAM_GD")
242 noresu = maj_cham["CHAM_GD"].nom
244 for cle in liste_aux :
245 dico[cle] = maj_cham[cle]
246 #gn print "dico = ", dico
248 if dico.has_key("SENSIBILITE") :
249 nopase = dico["SENSIBILITE"].nom
252 #gn print "Avant appel a aster.mdnoch, lresu = ",lresu,", noresu =", noresu ,", nomsym = ", nomsym ,", nopase = ", nopase
253 dico["NOM_MED"] = aster.mdnoch ( lresu, noresu, nomsym, nopase )
254 #gn print "==> dico[\"NOM_MED\"] = ", dico["NOM_MED"]
257 liste_champs.append(dico)
259 # 2.1.4. ==> Les zones de raffinement
261 ### print "\n.. Debut de 2.1.4."
263 if args.has_key("ZONE") :
265 if args["ZONE"] is not None :
266 les_zones = args["ZONE"]
268 for zone in les_zones :
272 for aux in ['X_MINI', 'X_MAXI', 'Y_MINI', 'Y_MAXI', 'Z_MINI', 'Z_MAXI', 'X_CENTRE', 'Y_CENTRE', 'Z_CENTRE', 'RAYON'] :
273 if ( zone[aux] != None ) :
274 dico[aux] = zone[aux]
276 liste_zones.append(dico)
278 ### print liste_zones
280 # 2.2. ==> Données de pilotage de l'information
287 dico["Type_Maillage"] = "MAILLAGE_N"
288 dico["Nom_ASTER"] = args["MAILLAGE"]
289 dico["Action"] = "A_ecrire"
290 liste_maillages.append(dico)
292 # 2.3. ==> Suivi de frontière
294 #gn print "\n.. Debut de 2.3."
296 if ( MAILLAGE_FRONTIERE != None ) :
299 dico["Type_Maillage"] = "MAILLAGE_FRONTIERE"
300 dico["Nom_ASTER"] = MAILLAGE_FRONTIERE
301 dico["Action"] = "A_ecrire"
302 liste_maillages.append(dico)
304 # 2.4. ==> Le numéro de version de HOMARD
305 # Remarque : dans la donnée de la version de HOMARD, il faut remplacer
306 # le _ de la donnee par un ., qui est interdit dans la
307 # syntaxe du langage de commandes ASTER
308 # Remarque : il faut remplacer le N majuscule de la donnee par
309 # un n minuscule, qui est interdit dans la syntaxe du langage
312 #gn print "\n.. Debut de 2.4. avec VERSION_HOMARD = ", VERSION_HOMARD
313 VERSION_HOMARD = string.replace(VERSION_HOMARD,"_" , ".")
314 VERSION_HOMARD = string.replace(VERSION_HOMARD,"N" , "n")
316 if ( VERSION_HOMARD[-6:]==".PERSO" ):
317 VERSION_HOMARD = VERSION_HOMARD[:-6]
321 #gn print ".... VERSION_HOMARD = ", VERSION_HOMARD
322 #gn print ".... version_perso = ", version_perso
324 #====================================================================
325 # 3. Préparation du lancement des commandes
326 #====================================================================
328 # 3.1. ==> . Elaboration des noms MED des concepts de maillage
329 # . Memorisation des noms ASTER du maillage en entrée et en sortie (sous forme string)
331 # On crée une nouvelle liste des dictionnaires décrivant les maillages
332 # et à la fin on écrase l'ancienne liste par cette nouvelle.
334 #gn print "\n.. Debut de 3.1."
336 Nom_Concept_Maillage_NP1_ANNEXE = None
338 for dico in liste_maillages :
339 #gn print "\ndico avant = ",dico
340 if ( dico["Action"] != "Rien" ) :
341 dico["NOM_MED"] = aster.mdnoma(dico["Nom_ASTER"].nom)
343 if ( dico["Type_Maillage"] == "MAILLAGE_N" ) :
344 Nom_Concept_Maillage_N = dico["Nom_ASTER"].nom
345 elif ( dico["Type_Maillage"] == "MAILLAGE_NP1" ) :
346 Nom_Concept_Maillage_NP1 = dico["Nom_ASTER"].nom
347 elif ( dico["Type_Maillage"] == "MAILLAGE_NP1_ANNEXE" ) :
348 Nom_Concept_Maillage_NP1_ANNEXE = dico["Nom_ASTER"].nom
349 #gn print "\ndico apres = ",dico
350 liste_maillages = l_aux
352 # 3.2. ==> Recherche du numéro d'itération et du répertoire de travail
354 # 3.2.1. ==> Par défaut :
355 # . le numéro d'itération est nul
356 # . le nom du répertoire de lancement de HOMARD est construit sur le nom
357 # du maillage en entrée et le numéro de passage dans la fonction
359 #gn print "\.. Debut de 3.2.1."
362 Nom_Rep_local = Nom_Concept_Maillage_N + "_" + mode_homard + "_" + str(numero_passage_fonction)
363 Rep_Calc_HOMARD_local = os.path.join(".", Nom_Rep_local)
364 Rep_Calc_HOMARD_global = os.path.join(Rep_Calc_ASTER, Nom_Rep_local)
365 ### print "Rep_Calc_HOMARD_local = ", Rep_Calc_HOMARD_local
366 ### print "Rep_Calc_HOMARD_global = ", Rep_Calc_HOMARD_global
368 # 3.2.2. ==> En adaptation : il faut repartir du répertoire de l'itération précédente
370 #gn print "\.. Debut de 3.2.2."
372 if ( mode_homard == "ADAP" ) :
374 # 3.2.2.1. ==> On recherche si dans les passages déjà effectués, il en existe un
375 # dont le maillage d'arrivée était l'actuel maillage d'entrée. Si c'est
376 # le cas, cela veut dire que l'adaptation en cours est la suite d'une
377 # précédente. On doit donc utiliser le meme répertoire. Le numéro
378 # d'itération est celui de l'adaptation précédente augmenté de 1.
380 #gn print "\.. Debut de 3.2.2.1."
382 for dico in Liste_Passages :
383 if ( dico["Maillage_NP1"] == Nom_Concept_Maillage_N ) :
384 niter = dico["niter"] + 1
385 Rep_Calc_HOMARD_local = dico["Rep_Calc_HOMARD_local"]
386 Rep_Calc_HOMARD_global = dico["Rep_Calc_HOMARD_global"]
388 # 3.2.2.2. ==> Memorisation de ce passage
390 #gn print "\.. Debut de 3.2.2.2."
392 # 3.2.2.2.1. ==> Enregistrement d'un nouveau cas de figure
396 dico["Maillage_0"] = Nom_Concept_Maillage_N
397 dico["Maillage_NP1"] = Nom_Concept_Maillage_NP1
398 dico["Maillage_NP1_ANNEXE"] = Nom_Concept_Maillage_NP1_ANNEXE
399 dico["Rep_Calc_HOMARD_local"] = Rep_Calc_HOMARD_local
400 dico["Rep_Calc_HOMARD_global"] = Rep_Calc_HOMARD_global
401 dico["niter"] = niter
402 Liste_Passages.append(dico)
404 # 3.2.2.2.2. ==> Modification du cas en cours
408 for dico in Liste_Passages :
409 if ( dico["Maillage_NP1"] == Nom_Concept_Maillage_N ) :
410 dico["Maillage_NP1"] = Nom_Concept_Maillage_NP1
411 dico["Maillage_NP1_ANNEXE"] = Nom_Concept_Maillage_NP1_ANNEXE
412 dico["niter"] = niter
414 Liste_Passages = l_aux
416 ### print "niter = ", niter, ", Rep_Calc_HOMARD_global = ", Rep_Calc_HOMARD_global
418 # 3.2.3. Création du répertoire pour homard
419 # attention : on ne fait cette creation qu'une seule fois par cas
420 # d'adaptation ou d'information
422 #gn print "\.. Debut de 3.2.3."
427 os.mkdir(Rep_Calc_HOMARD_global)
428 except os.error,codret_partiel :
429 self.cr.warn("Code d'erreur de mkdir : " + str(codret_partiel[0]) + " : " + codret_partiel[1])
430 UTMESS("F",'HOMARD0_4',valk=Rep_Calc_HOMARD_global)
432 #====================================================================
433 # 4. Ecriture des commandes de creation des donnees MED
434 #====================================================================
436 #gn print "\.. Debut de 4."
438 # On doit écrire : le maillage,
439 # le champ d'indicateur d'erreur
440 # les champs à convertir
441 # Remarque : on met tout dans le meme fichier
443 # Chacune de ces écritures est optionnelle selon le contexte.
450 # 4.1. ==> Noms des fichiers d'ASTER vers HOMARD et éventuellement de HOMARD vers ASTER
451 # Remarque : aujourd'hui, les écritures ou les lectures au format MED se font obligatoirement sur
452 # un fichier de nom fort.n, placé dans le répertoire de calcul
454 # 4.1.1. ==> D'ASTER vers HOMARD
456 unite_fichier_aster_vers_homard = 1787 + 2*numero_passage_fonction
457 fichier_aster_vers_homard = os.path.join(Rep_Calc_ASTER,"fort." + str(unite_fichier_aster_vers_homard))
458 ### print "fichier_aster_vers_homard = ",fichier_aster_vers_homard
460 # 4.1.2. ==> De HOMARD vers ASTER
462 if ( mode_homard == "ADAP" ) :
463 unite_fichier_homard_vers_aster = unite_fichier_aster_vers_homard + 1
464 fichier_homard_vers_aster = os.path.join(Rep_Calc_ASTER,"fort." + str(unite_fichier_homard_vers_aster))
465 ### print "fichier_homard_vers_aster = ",fichier_homard_vers_aster
467 # 4.2. La définition du fichier de ASTER vers HOMARD
469 DEFI_FICHIER ( ACTION= "ASSOCIER",
470 UNITE = unite_fichier_aster_vers_homard,
474 # 4.3. Le(s) maillage(s)
475 # Le maillage de calcul et l'éventuel maillage de la frontiere sont écrits
476 # dans le meme fichier MED
477 # En fait, on pourrait s'en passer au dela de la 1ère itération
478 # car HOMARD a mémorisé. Mais dès que l'on écrit un champ,
479 # les conventions MED imposent la présence du maillage dans le fichier.
480 # Donc on va toujours écrire.
482 for dico in liste_maillages :
483 if ( dico["Action"] == "A_ecrire" ) :
485 motscsi["MAILLAGE"] = dico["Nom_ASTER"]
487 motscfa["RESU"] = _F( INFO_MAILLAGE=infomail,
490 IMPR_RESU ( INFO = INFO,
491 FORMAT ='MED', UNITE = unite_fichier_aster_vers_homard,
494 # 4.4. Le(s) champ(s)
495 # Attention : il se peut que l'on demande la mise à jour du champ qui a servi comme
496 # indicateur d'erreur. Si c'est le cas, il ne faut pas demander son
497 # impression sinon il y a plantage d'IMPR_RESU qui ne sait pas substituer
498 # deux champs. D'ailleurs, c'est plus économique ainsi !
499 # Remarque : pour l'adaptation, on ne demande a priori qu'une composante du champ d'indicateur.
500 # s'il y a demande de mise à jour, toutes les composantes sont concernées. Il faut
501 # donc dans ce cas imprimer le champ total.
502 # dico["Type_Champ"] = o ; string ; "INDICATEUR" ou "CHAMP_MAJ"
503 # dico["RESULTAT"] = f ; concept ASTER du résutat associé
504 # dico["NOM_CHAM"] = f ; string ; Nom ASTER du champ
505 # dico["CHAM_GD"] = f ; concept ASTER du champ de grandeur associée
506 # dico["COMPOSANTE"] = f ; string ; Nom ASTER de la composante (dans le cas de l'indicateur)
507 # dico["NUME_ORDRE"] = f ; entier ; Numéro d'ordre du champ
508 # dico["INST"] = f ; entier ; Instant du champ
509 # dico["PRECISION"] = f ; entier ; Précision sur l'instant du champ
510 # dico["CRITERE"] = f ; entier ; Critère de précision sur l'instant du champ
511 # dico["CHAM_MAJ"] = f ; string ; Nom ASTER du champ interpolé sur le nouveau maillage
512 # dico["NOM_MED"] = o ; string ; Nom MED du champ
513 # dico["SENSIBILITE"] = f ; string ; Nom du paramètre sensible associé
515 # 4.4.1. Recherche d'un doublon éventuel sur le champ d'indicateur d'erreur
517 #gn print "dico_indi = ",dico_indi
518 if len(dico_indi) > 0 :
519 indic_est_deja_imprime = 0
520 if dico_indi.has_key("RESULTAT") :
521 liste_aux = [ "RESULTAT", "NOM_CHAM" ]
523 liste_aux = [ "CHAM_GD" ]
525 indic_est_deja_imprime = 1
527 #gn print ".. Au debut de la boucle, liste_aux = ",liste_aux
528 #gn print ".. Au debut de la boucle, indic_est_deja_imprime = ",indic_est_deja_imprime
530 liste_champs_imprime = []
531 for dico in liste_champs :
532 ### print "\n.... dico = ",dico
533 # Pour un champ à mettre à jour, on a toujours impression
534 if ( dico["Type_Champ"] == "CHAMP_MAJ" ) :
535 liste_champs_imprime.append(dico)
536 # Si le champ d'indicateur n'a toujours pas été repéré comme champ à mettre à jour :
537 if not indic_est_deja_imprime :
538 # Est-ce le meme champ ?
540 for cle in liste_aux :
541 if ( dico.has_key(cle) ) :
542 ### print "...... dico_indi[cle] = ",dico_indi[cle]
543 ### print "...... dico[cle] = ",dico[cle]
544 if ( dico_indi[cle] != dico[cle] ) :
550 # Si oui, est-ce un champ sensible ou non ?
553 if dico.has_key(cle) :
554 if ( dico[cle] != None ) :
555 if dico_indi.has_key(cle) :
556 if ( dico_indi[cle] != dico[cle] ) :
562 # Si oui, est-ce au meme moment ? (remarque : si rien n'est désigné, c'est qu'il n'y a qu'un
563 # seul instant ... donc c'est le meme ! En revanche, on ne sait pas comparer une donnée
564 # en numéro d'ordre et une donnée en instant. On croise les doigts.)
566 for cle in [ "NUME_ORDRE", "INST" ] :
567 if dico.has_key(cle) :
568 if ( dico[cle] != None ) :
569 if dico_indi.has_key(cle) :
570 if ( dico_indi[cle] != dico[cle] ) :
574 indic_est_deja_imprime = 1
575 ### print "\n\nFin de la boucle .. indic_est_deja_imprime = ",indic_est_deja_imprime
576 # Si le champ d'indicateur n'a pas été repéré comme champ à mettre à jour, il faut
577 # l'inclure dans les champs à imprimer
578 if not indic_est_deja_imprime :
579 liste_champs_imprime.append(dico_indi)
581 # 4.4.2. Impressions après le filtrage précédent
582 #gn print "\n.... Debut de 4.2.4.2."
584 for dico in liste_champs_imprime :
586 for cle in [ "RESULTAT", "NOM_CHAM", "CHAM_GD", "NUME_ORDRE", "INST", "PRECISION", "CRITERE" ] :
587 if dico.has_key(cle) :
588 if ( dico[cle] != None ) :
589 motscsi[cle] = dico[cle]
590 if dico.has_key("COMPOSANTE") :
591 motscsi["NOM_CMP"] = dico["COMPOSANTE"]
592 if dico.has_key("SENSIBILITE") :
593 motscsi["SENSIBILITE"] = dico["SENSIBILITE"]
595 motscfa["RESU"] = _F( INFO_MAILLAGE=infomail,
598 #gn print ".. motscfa = ",motscfa
600 IMPR_RESU ( INFO = INFO,
601 FORMAT ='MED', UNITE = unite_fichier_aster_vers_homard,
604 #====================================================================
605 # 5. ==> Création des fichiers de données pour HOMARD
606 #====================================================================
608 #gn print "\.. Debut de 5."
610 dico_configuration = {}
612 # 5.1. ==> Les généralités
614 dico_configuration["INFO"] = INFO
616 dico_configuration["Rep_Calc_HOMARD_global"] = Rep_Calc_HOMARD_global
617 dico_configuration["VERSION_HOMARD"] = VERSION_HOMARD
618 dico_configuration["version_perso"] = version_perso
620 dico_configuration["niter"] = niter
621 dico_configuration["Fichier_ASTER_vers_HOMARD"] = fichier_aster_vers_homard
622 if ( mode_homard == "ADAP" ) :
623 dico_configuration["Fichier_HOMARD_vers_ASTER"] = fichier_homard_vers_aster
625 # 5.2. ==> Les noms med des maillages
627 for dico in liste_maillages :
628 #gn print "Nom MED de " + dico["Type_Maillage"] + " = " + dico["NOM_MED"]
629 dico_configuration[ "NOM_MED_"+dico["Type_Maillage"] ] = dico["NOM_MED"]
630 #gn print dico_configuration
632 # 5.3. ==> Les caracteristiques de l'éventuel indicateur d'erreur
634 for dico in liste_champs :
636 if ( dico["Type_Champ"] == "INDICATEUR" ) :
637 liste_aux = [ "NOM_MED", "COMPOSANTE" ]
638 if dico.has_key("NUME_ORDRE") :
639 liste_aux.append("NUME_ORDRE")
640 for cle in liste_aux :
641 if ( dico[cle] != None ) :
642 dico_aux[cle] = dico[cle]
643 dico_configuration["Indicateur"] = dico_aux
644 #gn if dico_configuration.has_key("Indicateur") :
645 #gn print "dico_configuration[Indicateur] = ", dico_configuration["Indicateur"]
647 # 5.4. ==> Les éventuelles zones de raffinement
650 for dico in liste_zones :
655 l_aux = dico_configuration["Zones"]
657 dico_configuration["Zones"] = l_aux
658 ### if dico_configuration.has_key("Zones") :
659 ### print "dico_configuration[Zones] = ", dico_configuration["Zones"]
661 # 5.5. ==> La mise à jour de champs
664 for dico in liste_champs :
666 if ( dico["Type_Champ"] == "CHAMP_MAJ" ) :
667 liste_aux = [ "NOM_MED", "COMPOSANTE" ]
668 if dico.has_key("NUME_ORDRE") :
669 liste_aux.append("NUME_ORDRE")
671 for cle in [ "RESULTAT", "NOM_CHAM", "INST", "PRECISION", "CRITERE" ] :
672 liste_aux.append(cle)
673 for cle in liste_aux :
674 if dico.has_key(cle) :
675 if ( dico[cle] != None ) :
676 dico_aux[cle] = dico[cle]
682 l_aux = dico_configuration["Champs"]
683 l_aux.append(dico_aux)
684 dico_configuration["Champs"] = l_aux
685 #gn if dico_configuration.has_key("Champs") :
686 #gn print "dico_configuration[Champs] = ", dico_configuration["Champs"]
688 # 5.6. ==> Appel de la fonction de création
690 donnees_homard = creation_donnees_homard.creation_donnees_homard ( self.nom, args, dico_configuration )
692 donnees_homard.quel_mode ( )
693 fic_homard_niter, fic_homard_niterp1 = donnees_homard.creation_configuration ( )
694 donnees_homard.ecrire_fichier_configuration ( )
695 if ( mode_homard == "INFO" ) :
696 Nom_Fichier_Donnees = donnees_homard.ecrire_fichier_donnees ( )
698 Nom_Fichier_Donnees = "0"
700 # 5.7. ==> Impression eventuelle des fichiers créés
702 #gn print "Répertoire ",Rep_Calc_HOMARD_global
703 #gn os.system("ls -la "+Rep_Calc_HOMARD_global)
705 l_aux = ["HOMARD.Donnees" , "HOMARD.Configuration"]
708 for nomfic in l_aux :
709 fic = os.path.join(Rep_Calc_HOMARD_global, nomfic)
710 if os.path.isfile (fic) :
711 print "\n\n=============================================================="
712 print "Contenu de", nomfic
713 fichier = open (fic,"r")
714 les_lignes = fichier.readlines()
716 for ligne in les_lignes :
718 print "==============================================================\n"
719 #gn if ( mode_homard == "ADAP" ) :
720 #gn if args.has_key("MAJ_CHAM") :
721 #gn if args["MAJ_CHAM"] is not None :
725 #====================================================================
726 # 6. Ecriture de la commande d'exécution de homard
727 #====================================================================
730 #gn print "\.. Debut de 6."
731 #gn fichier_aster_vers_homard_2 = os.path.join("/tmp" , "fort." + str(unite_fichier_aster_vers_homard))
732 #gn shutil.copyfile(fichier_aster_vers_homard, fichier_aster_vers_homard_2)
734 EXEC_LOGICIEL ( ARGUMENT = (Rep_Calc_HOMARD_global, # nom du repertoire
735 VERSION_HOMARD, # version de homard
736 str(INFO), # niveau d information
737 Nom_Fichier_Donnees, # fichier de données HOMARD
738 str(version_perso), # version personnelle de homard ?
745 #gn if ( mode_homard == "ADAP" ) :
746 #gn fichier_homard_vers_aster_2 = os.path.join("/tmp" , "fort." + str(unite_fichier_homard_vers_aster))
747 #gn shutil.copyfile(fichier_homard_vers_aster, fichier_homard_vers_aster_2)
748 #gn fichier_homard_vers_aster_2_1 = os.path.join("/tmp" , "fort." + str(unite_fichier_homard_vers_aster)+".1")
749 #gn os.system("/local00/Logiciels/med-2.3.1/Linux/bin/mdump "+fichier_homard_vers_aster_2+">"+fichier_homard_vers_aster_2_1+"</tmp/donn1")
750 #gn fichier_homard_vers_aster_2_2 = os.path.join("/tmp" , "fort." + str(unite_fichier_homard_vers_aster)+".2")
751 #gn os.system("/local00/Logiciels/med-2.3.1/Linux/bin/mdump "+fichier_homard_vers_aster_2+">"+fichier_homard_vers_aster_2_2+"</tmp/donn2")
753 #====================================================================
754 # 7. ==> Ecriture de la commande de lecture des resultats med
756 # La fonction self.DeclareOut(a,b) fonctionne ainsi :
757 # a est une chaine de caracteres
758 # b est la variable déclarée dans la commande
759 # le but est de associer le contenu de b à la variable locale qui sera désignée par a
761 # self.DeclareOut("maillage_a_lire",args["MAILLAGE_NP1"])
762 # ==> la variable maillage_a_lire est identifiée à l'argument "MAILLAGE_NP1"
763 #====================================================================
765 if ( mode_homard == "ADAP" ) :
767 # 7.1. ==> Le maillage
769 #gn print "args = ",args
770 for dico in liste_maillages :
772 if ( dico["Action"] == "A_lire" ) :
773 self.DeclareOut("maillage_a_lire", dico["Nom_ASTER"])
774 maillage_a_lire = LIRE_MAILLAGE ( UNITE = unite_fichier_homard_vers_aster,
776 NOM_MED = dico["NOM_MED"],
777 VERI_MAIL = _F(VERIF="NON"), INFO_MED = INFO, INFO = INFO )
778 #gn print "MAILLAGE = ",maillage_a_lire
779 #gn print "NOM_MED = ",dico["NOM_MED"]
780 if ( dico["Type_Maillage"] == "MAILLAGE_NP1" ) :
781 maillage_np1 = maillage_a_lire
782 maillage_np1_nom_med = dico["NOM_MED"]
784 # 7.2. ==> Les champs
788 for dico in liste_champs :
789 if ( dico["Type_Champ"] == "CHAMP_MAJ" ) :
791 self.DeclareOut("champ_maj", dico["CHAM_MAJ"])
793 for cle in [ "NUME_ORDRE", "INST", "PRECISION", "CRITERE" ] :
794 if dico.has_key(cle) :
795 if ( dico[cle] != None ) :
796 motscsi[cle] = dico[cle]
797 if dico.has_key("NUME_ORDRE") :
798 motscsi["NUME_PT"] = dico["NUME_ORDRE"]
799 #gn print "MAILLAGE = ",maillage_np1
800 #gn print "NOM_MAIL_MED = ",maillage_np1_nom_med
801 #gn print "NOM_MED = ",dico["NOM_MED"]
802 #gn print "TYPE_CHAM =", dico["TYPE_CHAM"]
803 champ_maj = LIRE_CHAMP ( UNITE = unite_fichier_homard_vers_aster, FORMAT = "MED",
804 MAILLAGE = maillage_np1, NOM_MAIL_MED=maillage_np1_nom_med,
805 NOM_MED = dico["NOM_MED"], NOM_CMP_IDEM = "OUI", TYPE_CHAM = dico["TYPE_CHAM"],
806 INFO = INFO, **motscsi )
808 #====================================================================
809 # 8. Menage des fichiers devenus inutiles
810 # On doit imperativement garder le dernier fichier homard produit
811 # En mode d'information, on garde également les fichiers textes
812 #====================================================================
814 liste_aux = [fichier_aster_vers_homard]
815 liste_aux_bis = os.listdir(Rep_Calc_HOMARD_global)
816 for fic in liste_aux_bis :
817 fic_total = os.path.join(Rep_Calc_HOMARD_global, fic)
818 liste_aux.append(fic_total)
820 if ( mode_homard == "ADAP" ) :
821 liste_aux.append(fichier_homard_vers_aster)
822 fic = os.path.join(Rep_Calc_HOMARD_global, fic_homard_niterp1)
823 liste_aux_bis.append(fic)
825 for fic in liste_aux :
826 if fic not in liste_aux_bis :
828 print "Destruction du fichier ", fic
829 if os.path.isfile(fic) :
832 except os.error,codret_partiel :
833 self.cr.warn("Code d'erreur de remove : " + str(codret_partiel[0]) + " : " + codret_partiel[1])
834 UTMESS("F",'HOMARD0_5',valk=fic)
835 #gn print "Répertoire ",Rep_Calc_HOMARD_global
836 #gn os.system("ls -la "+Rep_Calc_HOMARD_global)
837 #gn print "Répertoire ",Rep_Calc_ASTER
838 #gn os.system("ls -la "+Rep_Calc_ASTER)
839 #gn print os.listdir(Rep_Calc_HOMARD_global)
840 #gn print "glop :", Rep_Calc_HOMARD_global
842 #====================================================================
844 #====================================================================
846 #gn if ( mode_homard == "ADAP" ) :