1 #@ MODIF info_fonction_ops Macro DATE 16/10/2007 AUTEUR REZETTE C.REZETTE
2 # -*- coding: iso-8859-1 -*-
3 # CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2005 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 def info_fonction_ops(self,RMS,NOCI_SEISME,MAX,NORME,ECART_TYPE,INFO,**args):
22 Ecriture de la macro INFO_FONCTION
26 from Utilitai.t_fonction import t_fonction,t_fonction_c,t_nappe
29 from Utilitai.Utmess import UTMESS
31 from types import ListType, TupleType
32 EnumTypes = (ListType, TupleType)
34 ### On importe les definitions des commandes a utiliser dans la macro
35 CREA_TABLE = self.get_cmd('CREA_TABLE')
36 CALC_TABLE = self.get_cmd('CALC_TABLE')
37 IMPR_TABLE = self.get_cmd('IMPR_TABLE')
38 CALC_FONCTION = self.get_cmd('CALC_FONCTION')
40 ### Comptage commandes + déclaration concept sortant
42 self.DeclareOut('C_out',self.sd)
44 ### type de traitement
48 if type(MAX['FONCTION']) not in EnumTypes : l_fonc=[MAX['FONCTION'],]
49 else : l_fonc=MAX['FONCTION']
60 ltyfo.append(__ff.__class__)
61 lpara.append(__ff.para['NOM_PARA'])
62 lresu.append(__ff.para['NOM_RESU'])
63 lfnom.append(fonc.nom)
64 n_mini=len(__ex['min'])
65 n_maxi=len(__ex['max'])
66 listeMCF=[_F(LISTE_K=[fonc.nom]*(n_mini+n_maxi),PARA='FONCTION'),
67 _F(LISTE_K=['MINI',]*n_mini+['MAXI',]*n_maxi,PARA='TYPE'),]
68 n_resu=__ff.para['NOM_RESU']
69 if isinstance(__ff,t_nappe) :
71 _F(LISTE_R=[i[0] for i in __ex['min']]+[i[0] for i in __ex['max']],PARA=__ff.para['NOM_PARA']),\
72 _F(LISTE_R=[i[1] for i in __ex['min']]+[i[1] for i in __ex['max']],PARA=__ff.para['NOM_PARA_FONC']),\
73 _F(LISTE_R=[i[2] for i in __ex['min']]+[i[2] for i in __ex['max']],PARA=__ff.para['NOM_RESU'])]
76 _F(LISTE_R=[i[0] for i in __ex['min']]+[i[0] for i in __ex['max']],PARA=__ff.para['NOM_PARA']),\
77 _F(LISTE_R=[i[1] for i in __ex['min']]+[i[1] for i in __ex['max']],PARA=__ff.para['NOM_RESU'])]
78 __tmfonc[k]=CREA_TABLE(LISTE=listeMCF)
80 mfact.append(_F(OPERATION = 'COMB',TABLE=__tmfonc[k]))
82 ltyfo=dict([(i,0) for i in ltyfo]).keys()
83 lpara=dict([(i,0) for i in lpara]).keys()
84 lresu=dict([(i,0) for i in lresu]).keys()
86 # n'est pas homogène en type (fonctions et nappes) ''')
87 UTMESS('F','FONCT0_37')
89 # n'est pas homogène en label NOM_PARA :'''+' '.join(lpara))
90 UTMESS('F','FONCT0_38',valk=' '.join(lpara))
92 # n'est pas homogène en label NOM_RESU : '''+' '.join(lresu))
93 UTMESS('F','FONCT0_39',valk=' '.join(lresu))
94 __tab=CALC_TABLE(TABLE = __tmfonc[0],
96 __min=CALC_TABLE(TABLE = __tab,
97 ACTION = _F(OPERATION = 'FILTRE',
99 NOM_PARA = lresu[0] ), )
100 __max=CALC_TABLE(TABLE = __tab,
101 ACTION = _F(OPERATION = 'FILTRE',
103 NOM_PARA = lresu[0] ), )
104 print __min.EXTR_TABLE()
105 print __max.EXTR_TABLE()
106 C_out=CALC_TABLE(TABLE = __min,
107 TITRE = 'Calcul des extrema sur fonction '+' '.join(lfnom),
108 ACTION = _F(OPERATION = 'COMB',
110 print C_out.EXTR_TABLE()
113 if (ECART_TYPE != None):
114 __ff=ECART_TYPE['FONCTION'].convert()
115 if ECART_TYPE['INST_INIT']!=None : tini=ECART_TYPE['INST_INIT']
116 else : tini=__ff.vale_x[0]
117 if ECART_TYPE['INST_FIN' ]!=None : tfin=ECART_TYPE['INST_FIN' ]
118 else : tfin=__ff.vale_x[-1]
119 __ff=__ff.cut(tini,__ff.vale_x[-1],ECART_TYPE['PRECISION'],ECART_TYPE['CRITERE'])
120 __ff=__ff.cut(__ff.vale_x[0],tfin,ECART_TYPE['PRECISION'],ECART_TYPE['CRITERE'])
121 if ECART_TYPE['METHODE' ]=='SIMPSON' : __ex=__ff.simpson(0.)
122 if ECART_TYPE['METHODE' ]=='TRAPEZE' : __ex=__ff.trapeze(0.)
123 fmoy=__ex.vale_y[-1]/(__ff.vale_x[-1]-__ff.vale_x[0])
126 if ECART_TYPE['METHODE' ]=='SIMPSON' : __ez=__ff.simpson(0.)
127 if ECART_TYPE['METHODE' ]=='TRAPEZE' : __ez=__ff.trapeze(0.)
128 sigma=math.sqrt(__ez.vale_y[-1]/(__ff.vale_x[-1]-__ff.vale_x[0]))
129 C_out=CREA_TABLE(LISTE=(_F(LISTE_K=ECART_TYPE['FONCTION'].nom,PARA='FONCTION'),
130 _F(LISTE_K=ECART_TYPE['METHODE'] ,PARA='METHODE'),
131 _F(LISTE_R=fmoy ,PARA='MOYENNE'),
132 _F(LISTE_R=sigma ,PARA='ECART_TYPE'),
133 _F(LISTE_R=tini ,PARA='INST_INIT'),
134 _F(LISTE_R=tfin ,PARA='INST_FIN'),)
146 __ff=i_rms['FONCTION'].convert()
147 if i_rms['INST_INIT']!=None : tini=i_rms['INST_INIT']
148 else : tini=__ff.vale_x[0]
149 if i_rms['INST_FIN' ]!=None : tfin=i_rms['INST_FIN' ]
150 else : tfin=__ff.vale_x[-1]
151 __ff=__ff.cut(tini,__ff.vale_x[-1],i_rms['PRECISION'],i_rms['CRITERE'])
152 __ff=__ff.cut(__ff.vale_x[0],tfin,i_rms['PRECISION'],i_rms['CRITERE'])
154 if i_rms['METHODE' ]=='SIMPSON' : __ez=__ff.simpson(0.)
155 if i_rms['METHODE' ]=='TRAPEZE' :
156 __ez=__ff.trapeze(0.)
157 sigm.append(math.sqrt(__ez.vale_y[-1]/(__ff.vale_x[-1]-__ff.vale_x[0])))
160 nomf.append(i_rms['FONCTION'].nom)
161 meth.append(i_rms['METHODE'])
162 C_out=CREA_TABLE(LISTE=(_F(LISTE_K=nomf ,PARA='FONCTION'),
163 _F(LISTE_K=meth ,PARA='METHODE'),
164 _F(LISTE_R=tmpi ,PARA='INST_INIT'),
165 _F(LISTE_R=tmpf ,PARA='INST_FIN'),
166 _F(LISTE_R=sigm ,PARA='RMS'), )
171 __ff=NORME['FONCTION'].convert()
173 for __fi in __ff.l_fonc :
174 norme.append(__fi.normel2())
175 nom=[NORME['FONCTION'].nom,]*len(norme)
176 C_out=CREA_TABLE(LISTE=(_F(LISTE_R=norme ,PARA='NORME'),
177 _F(LISTE_K=nom ,PARA='FONCTION'), )
181 if (NOCI_SEISME != None):
183 if NOCI_SEISME['SPEC_OSCI'] !=None :
184 ### cas intensité spectrale d'une nappe de SRO
185 ### la seule option licite est INTE_SPEC
186 #intensite spectrale, il est prudent de verifier la norme de la nappe sur laquelle \
187 #porte le calcul, ceci peut etre une source d erreurs.''')
188 UTMESS('I','FONCT0_40')
189 amor=NOCI_SEISME['AMOR_REDUIT']
190 fini=NOCI_SEISME['FREQ_INIT' ]
191 ffin=NOCI_SEISME['FREQ_FIN' ]
192 __sp =NOCI_SEISME['SPEC_OSCI'].convert()
193 vale_x=__sp.l_fonc[0].vale_x
194 vale_y=[__sp(amor,f) for f in vale_x]
195 para =__sp.l_fonc[0].para
196 __srov=t_fonction(vale_x,vale_y,para)
197 if NOCI_SEISME['NATURE']=='DEPL' :
198 __srov.vale_y=(__srov.vale_y/__srov.vale_x)*2.*math.pi
199 elif NOCI_SEISME['NATURE']=='VITE' :
200 __srov.vale_y=__srov.vale_y/__srov.vale_x/__srov.vale_x
201 elif NOCI_SEISME['NATURE']=='ACCE' :
202 __srov.vale_y=__srov.vale_y/__srov.vale_x/__srov.vale_x
203 __srov.vale_y=__srov.vale_y/__srov.vale_x/2./math.pi
204 __srov=__srov.cut(fini,ffin,NOCI_SEISME['PRECISION'],NOCI_SEISME['CRITERE'])
205 insp=__srov.trapeze(0.).vale_y[-1]
206 l_table.append(_F(LISTE_R=fini ,PARA='FREQ_INIT' ))
207 l_table.append(_F(LISTE_R=ffin ,PARA='FREQ_FIN' ))
208 l_table.append(_F(LISTE_R=amor ,PARA='AMOR_REDUIT'))
209 l_table.append(_F(LISTE_R=insp ,PARA='INTE_SPECT' ))
210 if NOCI_SEISME['FONCTION'] !=None :
212 l_table.append(_F(LISTE_K=NOCI_SEISME['FONCTION'].nom,PARA='FONCTION'))
213 __ac=NOCI_SEISME['FONCTION'].convert()
214 option= NOCI_SEISME['OPTION']
215 if NOCI_SEISME['INST_INIT']!=None : tdeb=NOCI_SEISME['INST_INIT']
216 else : tdeb=__ac.vale_x[0]
217 if NOCI_SEISME['INST_FIN' ]!=None : tfin=NOCI_SEISME['INST_FIN' ]
218 else : tfin=__ac.vale_x[-1]
219 # calcul de la vitesse :
220 __vi=__ac.trapeze(NOCI_SEISME['COEF'])
221 # calcul du déplacement :
222 __de=__vi.trapeze(NOCI_SEISME['COEF'])
223 # calcul de |acceleration| :
225 # calcul de integrale(|acceleration|) :
226 ### on "coupe" la fonction entre tdeb et tfin
227 __ac=__ac.cut(tdeb,tfin,NOCI_SEISME['PRECISION'],NOCI_SEISME['CRITERE'])
228 __vi=__vi.cut(tdeb,tfin,NOCI_SEISME['PRECISION'],NOCI_SEISME['CRITERE'])
229 __de=__de.cut(tdeb,tfin,NOCI_SEISME['PRECISION'],NOCI_SEISME['CRITERE'])
230 __aa=__aa.cut(tdeb,tfin,NOCI_SEISME['PRECISION'],NOCI_SEISME['CRITERE'])
231 if NOCI_SEISME['FREQ' ]!=None : l_freq=NOCI_SEISME['FREQ']
232 elif NOCI_SEISME['LIST_FREQ']!=None : l_freq=NOCI_SEISME['LIST_FREQ'].Valeurs()
234 # fréquences par défaut
236 for i in range(56) : l_freq.append( 0.2+0.050*i)
237 for i in range( 8) : l_freq.append( 3.0+0.075*i)
238 for i in range(14) : l_freq.append( 3.6+0.100*i)
239 for i in range(24) : l_freq.append( 5.0+0.125*i)
240 for i in range(28) : l_freq.append( 8.0+0.250*i)
241 for i in range( 6) : l_freq.append(15.0+0.500*i)
242 for i in range( 4) : l_freq.append(18.0+1.000*i)
243 for i in range(10) : l_freq.append(22.0+1.500*i)
244 if option in('TOUT','MAXI','ACCE_SUR_VITE') :
245 # calcul du max des valeurs absolues
246 maxa_ac=__ac.abs().extreme()['max'][0][1]
247 maxa_vi=__vi.abs().extreme()['max'][0][1]
248 maxa_de=__de.abs().extreme()['max'][0][1]
249 l_table.append(_F(LISTE_R=maxa_ac,PARA='ACCE_MAX'))
250 l_table.append(_F(LISTE_R=maxa_vi,PARA='VITE_MAX'))
251 l_table.append(_F(LISTE_R=maxa_de,PARA='DEPL_MAX'))
252 l_table.append(_F(LISTE_R=maxa_ac/maxa_vi,PARA='ACCE_SUR_VITE'))
253 if option in('TOUT','INTE_ARIAS') :
255 inte_arias=__a2.trapeze(0.).vale_y[-1]
256 inte_arias=inte_arias*math.pi/NOCI_SEISME['PESANTEUR']/2.
257 l_table.append(_F(LISTE_R=inte_arias,PARA='INTE_ARIAS'))
258 if option in('TOUT','POUV_DEST') :
260 pouv_dest=__v2.trapeze(0.).vale_y[-1]
261 pouv_dest=pouv_dest*(math.pi)**3/NOCI_SEISME['PESANTEUR']/2.
262 l_table.append(_F(LISTE_R=pouv_dest,PARA='POUV_DEST'))
263 if option in('TOUT','VITE_ABSO_CUMU') :
264 __vc=__aa.trapeze(0.)
265 vite_abso=__vc.vale_y[-1]
266 l_table.append(_F(LISTE_R=vite_abso,PARA='VITE_ABSO_CUMU'))
267 if option in('TOUT','INTE_SPEC') :
268 amor=NOCI_SEISME['AMOR_REDUIT']
269 fini=NOCI_SEISME['FREQ_INIT' ]
270 ffin=NOCI_SEISME['FREQ_FIN' ]
271 __so= CALC_FONCTION(SPEC_OSCI=_F(
274 FONCTION =NOCI_SEISME['FONCTION'],
276 NORME =NOCI_SEISME['NORME'],
280 __srov=__so.convert().l_fonc[0]
281 __srov=__srov.cut(fini,ffin,NOCI_SEISME['PRECISION'],NOCI_SEISME['CRITERE'])
282 __srov.vale_y=__srov.vale_y/__srov.vale_x/__srov.vale_x
283 insp=__srov.trapeze(0.).vale_y[-1]
284 l_table.append(_F(LISTE_R=fini ,PARA='FREQ_INIT' ))
285 l_table.append(_F(LISTE_R=ffin ,PARA='FREQ_FIN' ))
286 l_table.append(_F(LISTE_R=amor ,PARA='AMOR_REDUIT'))
287 l_table.append(_F(LISTE_R=insp ,PARA='INTE_SPECT' ))
288 if option in('TOUT','DUREE_PHAS_FORT') :
290 __i2=__a2.trapeze(0.)
291 arias = __i2.vale_y[-1]*math.pi/NOCI_SEISME['PESANTEUR']/2.
292 valinf = arias * NOCI_SEISME['BORNE_INF']
293 valsup = arias * NOCI_SEISME['BORNE_SUP']
294 for i in range(len(__i2.vale_x)) :
295 ariask = __i2.vale_y[i]*math.pi/NOCI_SEISME['PESANTEUR']/2.
296 if ariask>=valinf : break
297 for j in range(len(__i2.vale_x)-1,-1,-1) :
298 ariask = __i2.vale_y[j]*math.pi/NOCI_SEISME['PESANTEUR']/2.
299 if ariask<=valsup : break
300 dphfor = __i2.vale_x[j] - __i2.vale_x[i]
301 l_table.append(_F(LISTE_R=dphfor,PARA='DUREE_PHAS_FORT'))
302 C_out=CREA_TABLE(LISTE=l_table)