]> SALOME platform Git repositories - tools/eficas.git/blob - Aster/Cata/cataSTA9/Macro/lire_inte_spec_ops.py
Salome HOME
CCAR: merge de la version 1.14 dans la branche principale
[tools/eficas.git] / Aster / Cata / cataSTA9 / Macro / lire_inte_spec_ops.py
1 #@ MODIF lire_inte_spec_ops Macro  DATE 26/03/2008   AUTEUR BODEL C.BODEL 
2 # -*- coding: iso-8859-1 -*-
3 #            CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2004  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.                                                  
10 #                                                                       
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.                              
15 #                                                                       
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
21 def lire_inte_spec_ops(self,
22                        UNITE = None,
23                        FORMAT = None,
24                        FORMAT_C = None,
25                        NOM_PARA = None,
26                        NOM_RESU = None,
27                        INTERPOL = None,
28                        PROL_DROITE = None,
29                        PROL_GAUCHE = None,
30                        TITRE = None,
31                        INFO = None,
32                        **args):
33     ier=0
34
35     from Accas import _F
36     import os
37     from math import cos,sin,sqrt
38     from Utilitai.Utmess     import UTMESS
39     from Utilitai.UniteAster import UniteAster
40     # On importe les definitions des commandes a utiliser dans la macro
41     DEFI_FONCTION  =self.get_cmd('DEFI_FONCTION')
42     CREA_TABLE     =self.get_cmd('CREA_TABLE')
43
44     # La macro compte pour 1 dans la numerotation des commandes
45     self.set_icmd(1)
46     nompro='LIRE_INTE_SPEC'
47
48     # Lecture de la fonction dans un fichier d unité logique UNITE
49     UL = UniteAster()
50     nomfich=UL.Nom(UNITE)
51     if not os.path.isfile(nomfich):
52        UTMESS('F','SPECTRAL0_4',valk=nomfich)
53     file=open(nomfich,'r')
54     texte=file.read()
55     file.close()
56
57
58     if FORMAT == 'IDEAS':
59         # fabrication d'une liste de data sets 58
60         list_fonc = texte.split('    -1')
61         j = 0
62         for ind_fonc in range(len(list_fonc)):
63             try:
64                 tmp = list_fonc[j].split()
65                 if tmp[0] == '58':
66                     j = j+1
67                 else:
68                     list_fonc.pop(j)
69             except IndexError:
70                 list_fonc.pop(j)
71
72         nb_fonc = len(list_fonc)
73         if nb_fonc == 0:
74             UTMESS('F', 'SPECTRAL0_9')
75
76         l_fonc = []
77         l_noi  = []
78         l_noj  = []
79         l_cmpi = []
80         l_cmpj = []
81         for ind_fonc in range(nb_fonc):
82             # Extraction des en-tete : nom des noeuds, composantes (=ddl), de leur sens
83             fonc = list_fonc[ind_fonc]
84             ligne = fonc.split('\n')
85
86             record_6 = ligne[7].split()
87             if  record_6[0] != '2' and record_6[0] != '3' and record_6[0] != '9' :
88                 UTMESS('F', 'SPECTRAL0_10')
89             nono   = record_6[4]             # nom du noeud
90             nuno   = int(record_6[5])        # numero
91             ddlno  = float(record_6[6])/10   # DDL
92             noref  = record_6[7]             # nom du noeud de reference
93             nuref  = int(record_6[8])        # numero
94             ddlref = float(record_6[9])/10   # DDL
95             # On traduit les ddl "chiffres" en vrais ddl. Avec le sens des capteurs.
96             sens_no,ddl_no = comp(ddlno)
97             sens_ref,ddl_ref = comp(ddlref)
98             signe = sens_no*sens_ref
99
100             # On ne garde que la triang sup de la matrice inter-spectrale
101             crit1 = nuno + ddlno
102             crit2 = nuref + ddlref
103             if crit1 > crit2:
104                 continue
105             record_7 = ligne[8].split()
106             nbpairs = int(record_7[1])
107             if record_7[2] == 0:
108                 UTMESS('F', 'SPECTRAL0_11')
109             f0 = float(record_7[3])
110             df = float(record_7[4])
111
112             # Liste des valeurs
113             liste = fonc.split('\n')
114             valeurs = ''
115             for ind in range(13):
116                 liste.pop(0)
117             for ind_lign in range(len(liste)):
118                 valeurs = valeurs + liste[ind_lign]
119             tmp = valeurs.split()
120             valeurs = [signe*float(tmp[ind]) for ind in range(len(tmp))]
121
122             liste = []
123             freq = f0
124             for ind_freq in range(nbpairs):
125                 liste.append(freq)
126                 liste.append(valeurs[2*ind_freq])
127                 liste.append(valeurs[2*ind_freq+1])
128                 freq = freq + df
129
130             # création de la fonction ASTER :
131             _fonc=DEFI_FONCTION( NOM_PARA   = NOM_PARA,
132                                  NOM_RESU   = NOM_RESU,
133                                  PROL_DROITE= PROL_DROITE,
134                                  PROL_GAUCHE= PROL_GAUCHE,
135                                  INTERPOL   = INTERPOL,
136                                  INFO       = INFO,
137                                  TITRE      = TITRE,
138                                  VALE_C     = liste,)
139             l_fonc.append(_fonc.nom)     # Liste des fonctions
140             l_noi.append('N'+str(nuno))  # Liste des noeuds de mesure
141             l_cmpi.append(ddl_no)        # DDL associes
142             l_noj.append('N'+str(nuref)) # Liste des noeuds de ref
143             l_cmpj.append(ddl_ref)       # DDL associes
144
145         # Verification a posteriori de la dimension de l'inter-spectre
146         tmp = 0.5*(-1+sqrt(1+8*len(l_fonc)))
147         dim = int(tmp)
148         nb_fonc = 0.5*dim*(dim+1) 
149
150         if dim != tmp :
151             UTMESS('F', 'SPECTRAL0_6')
152
153             
154         mcfact=[]
155         mcfact.append(_F(PARA='NOM_CHAM'    ,LISTE_K=(NOM_RESU),NUME_LIGN=(1,)))
156         mcfact.append(_F(PARA='OPTION'      ,LISTE_K=('TOUT',) ,NUME_LIGN=(1,)))
157         mcfact.append(_F(PARA='DIMENSION'   ,LISTE_I=(dim)     ,NUME_LIGN=(1,)))
158         mcfact.append(_F(PARA='NOEUD_I'     ,LISTE_K=l_noi     ,NUME_LIGN=range(2,nb_fonc+2)))
159         mcfact.append(_F(PARA='NOM_CMP_I'   ,LISTE_K=l_cmpi    ,NUME_LIGN=range(2,nb_fonc+2)))
160         mcfact.append(_F(PARA='NOEUD_J'     ,LISTE_K=l_noj     ,NUME_LIGN=range(2,nb_fonc+2)))
161         mcfact.append(_F(PARA='NOM_CMP_J'   ,LISTE_K=l_cmpj    ,NUME_LIGN=range(2,nb_fonc+2)))
162         mcfact.append(_F(PARA='FONCTION_C'  ,LISTE_K=l_fonc    ,NUME_LIGN=range(2,nb_fonc+2)))
163         self.DeclareOut('tab_inte',self.sd)
164         tab_inte=CREA_TABLE(LISTE=mcfact,
165                           TITRE=TITRE,
166                           TYPE_TABLE='TABLE_FONCTION')
167
168         
169     elif FORMAT == 'ASTER':
170         list_fonc=texte.split('FONCTION_C')
171         entete=list_fonc.pop(0)
172         try : 
173             entete=entete[entete.index('DIM'):]
174             dim=int(entete[entete.index('=')+1:entete.index('\n')])
175         except ValueError : 
176             UTMESS('F', 'SPECTRAL0_5')
177
178         if len(list_fonc)!=(dim*(dim+1)/2):
179             UTMESS('F', 'SPECTRAL0_6')
180
181         nume_i=[]
182         nume_j=[]
183         l_fonc=[]
184         for i in range(dim*(dim+1)/2):
185             numi=list_fonc[i][list_fonc[i].index('I =')+3:]
186             numi=numi[:numi.index('\n')]
187             nume_i.append(int(numi))
188             numj=list_fonc[i][list_fonc[i].index('J =')+3:]
189             numj=numj[:numj.index('\n')]
190             nume_j.append(int(numj))
191             try : 
192                 vale_fonc=list_fonc[i][list_fonc[i].index('VALEUR =\n')+9:list_fonc[i].index('FINSF\n')]
193                 vale_fonc=vale_fonc.replace('\n',' ')
194                 vale_fonc=map(float,vale_fonc.split())
195             except ValueError : 
196                 UTMESS('F', 'SPECTRAL0_7')
197
198             liste=[]
199             if   FORMAT_C=='REEL_IMAG':
200                 liste=vale_fonc
201             elif FORMAT_C=='MODULE_PHASE':
202                 for i in range(len(vale_fonc)/3) :
203                   module=vale_fonc[3*i+1]
204                   phase =vale_fonc[3*i+2]
205                   liste=liste+[vale_fonc[3*i],module*cos(phase),module*sin(phase)]
206
207
208             # création de la fonction ASTER :
209             _fonc=DEFI_FONCTION( NOM_PARA   =NOM_PARA,
210                                  NOM_RESU   =NOM_RESU,
211                                  PROL_DROITE=PROL_DROITE,
212                                  PROL_GAUCHE=PROL_GAUCHE,
213                                  INTERPOL   =INTERPOL,
214                                  INFO       =INFO,
215                                  TITRE      =TITRE,
216                                  VALE_C     =liste,)
217             l_fonc.append(_fonc.nom)
218
219         nume_ib=[]
220         nume_jb=[]
221         for i in range(dim):
222             for j in range(i,dim):
223                 nume_ib.append(i+1)
224                 nume_jb.append(j+1)
225         if nume_i!=nume_ib or nume_j!=nume_jb : 
226             UTMESS('F', 'SPECTRAL0_3')
227         mcfact=[]
228         mcfact.append(_F(PARA='NOM_CHAM'    ,LISTE_K=(NOM_RESU),NUME_LIGN=(1,)))
229         mcfact.append(_F(PARA='OPTION'      ,LISTE_K=('TOUT',) ,NUME_LIGN=(1,)))
230         mcfact.append(_F(PARA='DIMENSION'   ,LISTE_I=(dim,)    ,NUME_LIGN=(1,)))
231         mcfact.append(_F(PARA='NUME_ORDRE_I',LISTE_I=nume_i    ,NUME_LIGN=range(2,len(nume_i)+2)))
232         mcfact.append(_F(PARA='NUME_ORDRE_J',LISTE_I=nume_j    ,NUME_LIGN=range(2,len(nume_j)+2)))
233         mcfact.append(_F(PARA='FONCTION_C'  ,LISTE_K=l_fonc    ,NUME_LIGN=range(2,len(list_fonc)+2)))
234         self.DeclareOut('tab_inte',self.sd)
235         tab_inte=CREA_TABLE(LISTE=mcfact,
236                           TITRE=TITRE,
237                           TYPE_TABLE='TABLE_FONCTION')
238
239     else:
240         # mot-clé != 'ASTER', ou 'IDEAS' => ERREUR !
241         UTMESS('F', 'SPECTRAL0_12')
242         
243
244     # remet UNITE dans son état initial
245     UL.EtatInit()
246     return ier
247         
248         
249     
250 def comp(ddlno):
251     sens = 1
252     if ddlno < 0:
253         sens = -1
254     if ddlno == .1:return sens,'DX'
255     elif ddlno == .2:return sens,'DY'
256     elif ddlno == .3:return sens,'DZ'
257     elif ddlno == .4:return sens,'DRX'
258     elif ddlno == .5:return sens,'DRY'
259     elif ddlno == .6:return sens,'DRZ'
260     else:
261         print "Probleme pour l'attribution des composantes"
262     
263     
264