]> SALOME platform Git repositories - tools/eficas.git/blob - Aster/Cata/cataSTA8/Macro/post_k_trans_ops.py
Salome HOME
Modif V6_4_°
[tools/eficas.git] / Aster / Cata / cataSTA8 / Macro / post_k_trans_ops.py
1 #@ MODIF post_k_trans_ops Macro  DATE 31/10/2006   AUTEUR REZETTE C.REZETTE 
2 # -*- coding: iso-8859-1 -*-
3 #            CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2006  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 post_k_trans_ops(self,RESU_TRANS,K_MODAL,TOUT_ORDRE, NUME_ORDRE, LIST_ORDRE, 
22                  INST, LIST_INST,INFO,**args):          
23   """
24      Ecriture de la macro post_k_trans
25   """
26   import aster
27   import string
28   from Accas import _F
29   from Utilitai.Utmess     import UTMESS
30   from types import ListType, TupleType
31   from Utilitai.Table      import Table, merge
32   EnumTypes = (ListType, TupleType)
33   
34   macro = 'POST_K_TRANS'
35   ier=0
36 #------------------------------------------------------------------
37   # On importe les definitions des commandes a utiliser dans la macro
38   CALC_G           =self.get_cmd('CALC_G'  )
39   IMPR_TABLE       =self.get_cmd('IMPR_TABLE'      )
40   CREA_TABLE       =self.get_cmd('CREA_TABLE'      )
41   
42   # La macro compte pour 1 dans la numerotation des commandes
43   self.set_icmd(1)
44   
45   # Le concept sortant (de type table_sdaster ou dérivé) est tab
46   self.DeclareOut('tabout', self.sd)
47
48 #------------------------------------------------------------------
49   TABK = K_MODAL['TABL_K_MODA']
50   F2D = K_MODAL['FOND_FISS']
51   F3D = K_MODAL['FISSURE']
52 #
53 # Calcul du tableau des K modaux
54 #
55   if TABK == None :
56     montit = 'Calcul des K modaux'
57     resumod = K_MODAL['RESU_MODA']
58     thet = K_MODAL['THETA']
59
60     motscles={}
61     motscles2={}
62     motscles['THETA'] = []
63     mcthet = {}
64     if F2D != None :    mcthet['FOND_FISS'] = F2D
65     if thet != None :   mcthet['THETA'] = thet
66     if F3D != None :   mcthet['FISSURE'] = F3D
67     if K_MODAL['DIRECTION']!=None :  mcthet['DIRECTION'] = K_MODAL['DIRECTION']
68     if K_MODAL['DIRE_THETA']!=None: mcthet['DIRE_THETA'] = K_MODAL['DIRE_THETA']
69     if K_MODAL['R_SUP']!=None : mcthet['R_SUP'] = K_MODAL['R_SUP']
70     if K_MODAL['R_SUP_FO']!=None : mcthet['R_SUP_FO'] = K_MODAL['R_SUP_FO']
71     if K_MODAL['R_INF']!=None : mcthet['R_INF'] = K_MODAL['R_INF']
72     if K_MODAL['R_INF_FO']!=None : mcthet['R_INF_FO'] = K_MODAL['R_INF_FO']
73     if K_MODAL['MODULE']!=None : mcthet['MODULE'] = K_MODAL['MODULE']
74     if K_MODAL['MODULE']==None and  F2D : mcthet['MODULE'] = 1
75     if K_MODAL['MODULE_FO']!=None : mcthet['MODULE_FO'] = K_MODAL['MODULE_FO']
76     
77     if thet == None and F3D :  
78         motscles2['LISSAGE'] = [] 
79         if K_MODAL['LISSAGE_G'] == None :  K_MODAL['LISSAGE_G']='LEGENDRE'
80         if K_MODAL['LISSAGE_THETA'] == None :  K_MODAL['LISSAGE_THETA']='LEGENDRE'
81         if K_MODAL['DEGRE'] :   K_MODAL['DEGRE'] = 5
82         motscles2['LISSAGE'].append(_F(LISSAGE_G =K_MODAL['LISSAGE_G'],
83                         LISSAGE_THETA =K_MODAL['LISSAGE_G'], 
84                         DEGRE = K_MODAL['DEGRE'] ))
85     
86     __kgtheta = CALC_G(       RESULTAT   = resumod,
87                             OPTION = 'K_G_MODA',
88                             TOUT_MODE = 'OUI',
89                             INFO       = INFO, 
90                             TITRE      = montit, 
91                             THETA=mcthet,
92                             **motscles2)
93
94
95 #
96 # Recuperation du tableau des K modaux
97 #
98   else :
99     __kgtheta=TABK
100     
101 #-----------------------------------------
102 #  
103 # Verification de cohérence sur le nombre de modes
104 #  
105 # RESULTAT TRANSITOIRE
106   nomresu=RESU_TRANS.nom
107   coef=aster.getvectjev(nomresu.ljust(19)+'.DEPL')
108   nmodtr=aster.getvectjev(nomresu.ljust(19)+'.DESC')[1]
109 # BASE MODALE
110   if F2D : 
111     n_mode = len((__kgtheta.EXTR_TABLE())['K1'])
112     nbno = 1
113   if F3D : 
114     n_mode = max((__kgtheta.EXTR_TABLE())['NUME_MODE'].values()['NUME_MODE'])
115     nbno = max((__kgtheta.EXTR_TABLE())['NUM_PT'].values()['NUM_PT'])
116     labsc = (__kgtheta.EXTR_TABLE())['ABS_CURV'].values()['ABS_CURV'][0:nbno]
117       
118   if nmodtr != n_mode : 
119       n_mode = min(nmodtr,n_mode)
120       message = 'NOMBRE DE MODES DIFFERENT ENTRE LA BASE MODALE'
121       message = message +'ET %s : ON PREND LE MINIMUM DES DEUX (%i)\n'%(nomresu,n_mode)
122       UTMESS('A', macro, message)
123
124 #  
125 # Traitement des mots clés ORDRE/INST/LIST_INST et LIST_ORDRE
126 #  
127   l0_inst = aster.getvectjev(nomresu.ljust(19)+'.INST')
128   l0_ord = aster.getvectjev(nomresu.ljust(19)+'.ORDR')
129   nbtrans = len(l0_ord)
130   li =  [[l0_ord[i],l0_inst[i]] for i in range(nbtrans)]
131   ln =  [[l0_ord[i],i] for i in range(nbtrans)]
132   lo =  [[l0_inst[i],l0_ord[i]] for i in range(nbtrans)]
133   li = [(i[0],i[1:]) for i in li]
134   ln = [(i[0],i[1:]) for i in ln]
135   lo = [(i[0],i[1:]) for i in lo]
136   d_ord = dict(lo) 
137   d_ins = dict(li) 
138   d_num = dict(ln) 
139
140
141   l_ord =[]
142   l_inst =[]
143   if LIST_ORDRE or NUME_ORDRE :
144     if  NUME_ORDRE  :
145       if type(NUME_ORDRE) not in EnumTypes : NUME_ORDRE=(NUME_ORDRE,)
146       ltmp = list(NUME_ORDRE)
147     elif LIST_ORDRE :
148       ltmp = aster.getvectjev(string.ljust(LIST_ORDRE.nom,19)+'.VALE') 
149     for ord in ltmp :
150       if ord in l0_ord :
151          l_ord.append(ord)
152          l_inst.append(d_ins[ord][0])
153       else :
154          message = 'LE NUMERO D ORDRE %i N APPARTIENT PAS AU RESULTAT %s'%(ord,nomresu) 
155          UTMESS('A', macro, message) 
156   elif LIST_INST or INST :
157     CRITERE = args['CRITERE']
158     PRECISION = args['PRECISION']
159     if INST :
160       if type(INST) not in EnumTypes : INST=(INST,)
161       ltmp = list(INST)
162     elif LIST_INST :
163       ltmp = aster.getvectjev(string.ljust(LIST_INST.nom,19)+'.VALE') 
164     for ins in ltmp :
165       if CRITERE=='RELATIF' and ins!=0.: match=[x for x in l0_inst if abs((ins-x)/ins)<PRECISION]
166       else                             : match=[x for x in l0_inst if abs(ins-x)<PRECISION]
167       if len(match)==0 : 
168          message = 'PAS D INSTANT TROUVE DANS LA TABLE POUR L INSTANT %f\n'%ins
169          UTMESS('A', macro, message)
170       elif len(match)>=2 :
171          message = 'PLUSIEURS INSTANTS TROUVES DANS LA TABLE POUR L INSTANT %f\n'%ins
172          UTMESS('A', macro, message)
173       else :
174          l_inst.append(match[0])
175          l_ord.append(d_ord[match[0]][0])
176   else :
177       l_ord = l0_ord
178       l_inst = l0_inst
179   nbarch = len(l_ord)
180   if nbarch ==0 : UTMESS('F', macro, 'AUCUN INSTANT OU NUMERO D ORDRE TROUVE') 
181   
182
183 #  
184 # Calcul des K(t)
185 #  
186
187   K1mod = [None]*n_mode*nbno
188   K2mod = [None]*n_mode*nbno
189   K1t = [None]*nbarch*nbno
190   K2t = [None]*nbarch*nbno
191   if F3D : 
192     K3mod = [None]*n_mode*nbno
193     K3t = [None]*nbarch*nbno
194     k1 = 'K1_LOCAL'
195     k2 = 'K2_LOCAL'
196     k3 = 'K3_LOCAL'
197   else :
198     k1 = 'K1'
199     k2 = 'K2'
200   
201   
202   for x in range(0,nbno) :
203     for k in range(0,n_mode) :
204       K1mod[k*nbno + x] = __kgtheta[k1,k*nbno + x+1]
205       K2mod[k*nbno + x] = __kgtheta[k2,k*nbno + x+1]
206       if F3D : K3mod[k*nbno + x] = __kgtheta[k3,k*nbno + x+1]
207    
208     for num in range(0,nbarch) :
209       K1t[num*nbno + x] = 0.0
210       K2t[num*nbno + x] = 0.0
211       if F3D : K3t[num*nbno + x] = 0.0
212       for k in range(0,n_mode) :
213         num_ord = d_num[l_ord[num]][0]
214         alpha = coef[n_mode*num_ord+k]
215         K1t[num*nbno + x] = K1t[num*nbno + x] + alpha*K1mod[k*nbno + x]
216         K2t[num*nbno + x] = K2t[num*nbno + x] + alpha*K2mod[k*nbno + x]
217         if F3D : K3t[num*nbno + x] = K3t[num*nbno + x] + alpha*K3mod[k*nbno + x]
218  
219   v = aster.__version__
220   titre = 'ASTER %s - CONCEPT CALCULE PAR POST_K_TRANS LE &DATE A &HEURE \n'%v
221   if F2D :
222     tabout = CREA_TABLE(LISTE = (_F(LISTE_I =l_ord, PARA = 'NUME_ORDRE'),
223                            _F(LISTE_R =l_inst, PARA = 'INST'),
224                            _F(LISTE_R =K1t, PARA = k1),
225                            _F(LISTE_R =K2t, PARA = k2),),
226                         TITRE = titre,  );
227   if F3D : 
228    lo = []
229    li = []
230    for i in range(nbarch) :
231      for j in range(nbno) :
232         lo.append(l_ord[i])
233         li.append(l_inst[i])
234    tabout = CREA_TABLE(LISTE = (_F(LISTE_I =lo, PARA = 'NUME_ORDRE'),
235                            _F(LISTE_R =li, PARA = 'INST'),
236                            _F(LISTE_I =range(nbno)*nbarch, PARA ='NUM_PT' ),
237                            _F(LISTE_R =labsc*nbarch, PARA = 'ABS_CURV'),
238                            _F(LISTE_R =K1t, PARA = k1),
239                            _F(LISTE_R =K2t, PARA = k2),
240                            _F(LISTE_R =K3t, PARA = k3),),
241                         TITRE = titre,
242                   );
243    
244 #------------------------------------------------------------------
245   return ier