1 #@ MODIF impr_diag_campbell_utils Macro DATE 11/05/2010 AUTEUR COURTOIS M.COURTOIS
2 # -*- coding: iso-8859-1 -*-
3 # CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2010 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 # ======================================================================
21 # RESPONSABLE TORKHANI M.TORKHANI
27 # "self" est l'objet MACRO
30 def CLASS_MODES(self,L_MODES, NFREQ, NFREQ_camp, L_GR_NOEUD, VITE_ROTA) :
31 """Classification des modes en flexion, en torsion et en traction/compression"""
33 POST_RELEVE_T =self.get_cmd('POST_RELEVE_T')
34 EXTR_MODE =self.get_cmd('EXTR_MODE')
35 NORM_MODE =self.get_cmd('NORM_MODE')
36 DETRUIRE =self.get_cmd('DETRUIRE')
37 IMPR_TABLE =self.get_cmd('IMPR_TABLE')
52 Ntot =numpy.zeros((NFREQ));
53 Nflex=numpy.zeros((NFREQ));
54 Ntors=numpy.zeros((NFREQ));
55 Nlong=numpy.zeros((NFREQ));
64 NVT =numpy.zeros((NFREQ, NBV));
71 # -------------------------------------------------------------------
72 # Extraire les modes en module, definir les differents types de modes
73 # -------------------------------------------------------------------
75 tabmoN=POST_RELEVE_T(ACTION=_F(INTITULE='MODES_MODULE',
80 NOM_CMP=('DX','DY','DZ', 'DRX', 'DRY', 'DRZ'),
82 OPERATION='EXTRACTION',),);
84 for jj in range(NFREQ):
89 for ll in range(NOEU):
91 dx = tabmoN['DX' ,nmod+1]
92 dy = tabmoN['DY' ,nmod+1]
93 dz = tabmoN['DZ' ,nmod+1]
94 drx = tabmoN['DRX',nmod+1]
95 dry = tabmoN['DRY',nmod+1]
96 drz = tabmoN['DRZ',nmod+1]
97 Ntot1 = dx**2+dy**2+dz**2+drx**2+dry**2+drz**2
98 Nflex1 = dy**2+dz**2+dry**2+drz**2
101 Ntot[jj] = Ntot[jj] + Ntot1
102 Nflex[jj] = Nflex[jj] + Nflex1
103 Ntors[jj] = Ntors[jj] + Ntors1
104 Nlong[jj] = Nlong[jj] + Nlong1
106 Ntot[jj] = numpy.sqrt(Ntot[jj])
108 Nflex[jj] = numpy.sqrt(Nflex[jj])/ Ntot[jj]
109 Ntors[jj] = numpy.sqrt(Ntors[jj])/ Ntot[jj]
110 Nlong[jj] = numpy.sqrt(Nlong[jj])/ Ntot[jj]
113 DETRUIRE(CONCEPT=_F(NOM=(tabmoN)),INFO=1)
119 for jj in range(NFREQ):
121 if (Nflex[jj]> Ntors[jj]) and (Nflex[jj]> Nlong[jj]):
126 elif (Ntors[jj]> Nflex[jj]) and (Ntors[jj]> Nlong[jj]):
131 elif (Nlong[jj]> Nflex[jj]) and (Nlong[jj]> Ntors[jj]):
144 NVT_f =numpy.zeros((NFREQ_f, NBV), int);
145 l_f =numpy.zeros((NBV, NFREQ_f), int);
147 NVT_t =numpy.zeros((NFREQ_t, NBV), int);
148 l_t =numpy.zeros((NBV, NFREQ_t), int);
150 NVT_l =numpy.zeros((NFREQ_l, NBV), int);
151 l_l =numpy.zeros((NBV, NFREQ_l), int);
155 for ii in range(NBV):
156 for jj in range(NFREQ_f):
157 NVT_f[jj][ii]=lflex[ii,jj];
158 l_f[ii][jj] =lflex[ii,jj];
160 for jj in range(NFREQ_t):
161 NVT_t[jj][ii]=ltors[ii,jj];
162 l_t[ii][jj] =ltors[ii,jj];
164 for jj in range(NFREQ_l):
165 NVT_l[jj][ii]=llong[ii,jj];
166 l_l[ii][jj] =llong[ii,jj];
168 for ii in range(NBV):
169 # ----------------------------------------------
170 # Extraire la base des modes en flexion
171 # ----------------------------------------------
173 lmodef =list(l_f[ii]);
174 Mf[ii] = EXTR_MODE ( FILTRE_MODE = _F ( MODE = L_MODES[ii],
178 Mf[ii]= NORM_MODE (MODE=Mf[ii],
183 # ----------------------------------------------
184 # Extraire la base des modes en torsion
185 # ----------------------------------------------
187 lmodet =list(l_t[ii]);
188 Mt[ii] = EXTR_MODE ( FILTRE_MODE = _F ( MODE = L_MODES[ii],
191 Mt[ii]= NORM_MODE (MODE=Mt[ii],
193 AVEC_CMP=('DRX','DRY', 'DRZ'),
196 # ----------------------------------------------
197 # Extraire la base des modes en longi
198 # ----------------------------------------------
200 lmodel =list(l_l[ii]);
201 Ml[ii] = EXTR_MODE ( FILTRE_MODE = _F ( MODE = L_MODES[ii],
205 Ml[ii]= NORM_MODE (MODE=Ml[ii],
210 # -----------------------------------------------------------
211 # Nombre de frequences par type pour le diagramme de Campbell
212 # -----------------------------------------------------------
214 for jj in range(NFREQ_f):
215 if NVT_f[jj][NBV-1]<= NFREQ_camp:
219 for jj in range(NFREQ_t):
220 if NVT_t[jj][NBV-1]<= NFREQ_camp:
224 for jj in range(NFREQ_l):
225 if NVT_l[jj][NBV-1]<= NFREQ_camp:
228 RESULT =[NFREQ_f,NFREQ_t,NFREQ_l,Mf,Mt,Ml,NVT,NVT_f,NVT_t,NVT_l,NFREQ_fc,NFREQ_tc,NFREQ_lc]
233 #------------------------------------------------------------------------------------------------
234 def EXTR_FREQ(self,L_MODES, L_MODEf,L_MODEt,L_MODEl, NFREQ, NFREQ_f, NFREQ_t, NFREQ_l) :
235 """Extraire les frequences"""
236 RECU_TABLE =self.get_cmd('RECU_TABLE')
237 IMPR_TABLE =self.get_cmd('IMPR_TABLE')
238 DETRUIRE =self.get_cmd('DETRUIRE')
243 FRQ =numpy.zeros((NFREQ,NBV));
244 FRQ_f =numpy.zeros((NFREQ_f,NBV));
245 FRQ_t =numpy.zeros((NFREQ_t,NBV));
246 FRQ_l =numpy.zeros((NFREQ_l,NBV));
247 AMO_f =numpy.zeros((NFREQ_f,NBV));
250 for ii in range(NBV):
253 tabfreq = RECU_TABLE(CO=L_MODES[ii],NOM_PARA=('NUME_MODE','FREQ','AMOR_REDUIT'),);
255 for jj in range(NFREQ):
256 FRQ[jj][ii]=tabfreq['FREQ',jj+1]
257 if FRQ_max < FRQ[jj][ii]:
261 # frequences des modes en flexion
262 tabfr_f = RECU_TABLE(CO=L_MODEf[ii],NOM_PARA=('FREQ','AMOR_REDUIT'),)
263 for jj in range(NFREQ_f):
264 FRQ_f[jj][ii]=tabfr_f['FREQ',jj+1];
265 AMO_f[jj][ii]=tabfr_f['AMOR_REDUIT',jj+1];
266 if abs(AMO_f[jj][ii])<EPSI:
268 DETRUIRE(CONCEPT=_F(NOM=(tabfr_f)),INFO=1)
271 # frequences des modes en torsion
272 tabfr_t = RECU_TABLE(CO=L_MODEt[ii],NOM_PARA='FREQ',)
274 for jj in range(NFREQ_t):
275 FRQ_t[jj][ii]=tabfr_t['FREQ',jj+1]
277 DETRUIRE(CONCEPT=_F(NOM=(tabfr_t)),INFO=1)
280 # frequences des modes en traction / compression
281 tabfr_l = RECU_TABLE(CO=L_MODEl[ii],NOM_PARA='FREQ',)
283 for jj in range(NFREQ_l):
284 FRQ_l[jj][ii]=tabfr_l['FREQ',jj+1]
286 DETRUIRE(CONCEPT=_F(NOM=(tabfr_l)),INFO=1)
288 DETRUIRE(CONCEPT=_F(NOM=(tabfreq)),INFO=1)
291 RESULT = [FRQ,FRQ_f,FRQ_t, FRQ_l, FRQ_max, AMO_f];
295 #------------------------------------------------------------------------------------------------
297 def TRI_MODE_MACf(self, MACf,NFREQ_f, NVT_f, IV) :
298 """Tri des frequences par calcul des coefficients MAC"""
301 DETRUIRE =self.get_cmd('DETRUIRE')
304 tmacf =numpy.zeros((NFREQ_f,NFREQ_f));
306 for jj in range(NFREQ_f):
308 for ll in range(NFREQ_f):
310 tmacf[jj][ll]=MACf['MAC',nmac+1]
311 chaine='MAC Modes de flexion'
312 aster.affiche('RESULTAT', chaine)
313 affiche_tab(tmacf,NFREQ_f, NFREQ_f);
315 for j2 in range(NFREQ_f):
317 JREC=int(NVT_f[j2][IV+1]-1);
318 for j1 in range(NFREQ_f):
320 if tmacf[j1][JREC] > XMAX:
323 # test d'existance de I1B dans le tableau de connexion
326 if I1B == NVT_f[jj][IV]:
328 if I1B_exist ==0: # IB1 n'existe pas
333 DETRUIRE(CONCEPT=_F(NOM=(MACf)),INFO=1);
337 #------------------------------------------------------------------------------------------------
339 def TRI_MODE_MACt(self, MACt,NFREQ_t, NVT_t, IV) :
340 """Tri des frequences par calcul des coefficients MAC"""
343 DETRUIRE =self.get_cmd('DETRUIRE')
346 tmact =numpy.zeros((NFREQ_t,NFREQ_t));
348 for jj in range(NFREQ_t):
350 for ll in range(NFREQ_t):
352 tmact[jj][ll]=MACt['MAC',nmac+1]
353 chaine='MAC Modes en torsion'
354 aster.affiche('RESULTAT', chaine)
355 affiche_tab(tmact,NFREQ_t, NFREQ_t);
357 for j2 in range(NFREQ_t):
359 JREC=int(NVT_t[j2][IV+1]-1);
360 for j1 in range(NFREQ_t):
362 if tmact[j1][JREC] > XMAX:
365 # test d'existance de I1B dans le tableau de connexion
368 if I1B == NVT_t[jj][IV]:
369 I1B_exist =1; # IB1 existe deja
370 if I1B_exist ==0: # IB1 n'existe pas
375 DETRUIRE(CONCEPT=_F(NOM=(MACt)),INFO=1);
379 #------------------------------------------------------------------------------------------------
380 def TRI_MODE_MACl(self, MACl,NFREQ_l, NVT_l, IV) :
381 """Tri des frequences par calcul des coefficients MAC"""
383 DETRUIRE =self.get_cmd('DETRUIRE')
386 tmacl =numpy.zeros((NFREQ_l,NFREQ_l));
388 for jj in range(NFREQ_l):
390 for ll in range(NFREQ_l):
392 tmacl[jj][ll]=MACl['MAC',nmac+1]
393 chaine='MAC Modes en traction/compression'
394 aster.affiche('RESULTAT', chaine)
395 affiche_tab(tmacl,NFREQ_l, NFREQ_l);
397 for j2 in range(NFREQ_l):
399 JREC=int(NVT_l[j2][IV+1]-1);
400 for j1 in range(NFREQ_l):
402 if tmacl[j1][JREC] > XMAX:
405 # test d'existance de I1B dans le tableau de connexion
408 if I1B == NVT_l[jj][IV]:
409 I1B_exist =1; # IB1 existe deja
410 if I1B_exist ==0: # IB1 n'existe pas
415 DETRUIRE(CONCEPT=_F(NOM=(MACl)),INFO=1);
420 #------------------------------------------------------------------------------------------------
421 def CALC_MACf(self, L_MODEf, NFREQ_f) :
422 """Calcul de la matrice MAC entre les deux bases successives"""
424 MAC_MODES =self.get_cmd('MAC_MODES')
427 tmacf =numpy.zeros((NFREQ_f,NFREQ_f));
430 for ii in range(NBV-1):
432 MACf[ii]=MAC_MODES(BASE_1=L_MODEf[ii],
433 BASE_2=L_MODEf[ii+1],
439 #------------------------------------------------------------------------------------------------
440 def CALC_MACt(self, L_MODEt, NFREQ_t) :
441 """Calcul de la matrice MAC entre les deux bases successives"""
443 MAC_MODES =self.get_cmd('MAC_MODES')
446 tmact =numpy.zeros((NFREQ_t,NFREQ_t));
449 for ii in range(NBV-1):
451 MACt[ii]=MAC_MODES(BASE_1=L_MODEt[ii],
452 BASE_2=L_MODEt[ii+1],
457 #-----------------------------------------------------------------------------------------------
458 def CALC_MACl(self, L_MODEl, NFREQ_l) :
459 """Calcul de la matrice MAC entre les deux bases successives """
461 MAC_MODES =self.get_cmd('MAC_MODES')
464 tmacl =numpy.zeros((NFREQ_l,NFREQ_l));
467 for ii in range(NBV-1):
469 MACl[ii]=MAC_MODES(BASE_1=L_MODEl[ii],
470 BASE_2=L_MODEl[ii+1],
475 #-----------------------------------------------------------------------------------------------
476 def CALC_PREC(self,Mf,NFREQ_f,L_GR_NOEUD, typ_prec) :
477 """Calcul le sens de precession pour un mode a une vitesse de rotation donnee
478 Type de precession, 1 somme, 2 grande orbite"""
480 POST_RELEVE_T =self.get_cmd('POST_RELEVE_T')
481 DETRUIRE =self.get_cmd('DETRUIRE')
482 IMPR_TABLE =self.get_cmd('IMPR_TABLE')
486 NOEU=len(L_GR_NOEUD);
487 SENS=numpy.zeros((NFREQ_f, NBV));
488 for ii in range(NBV):
489 # -------------------------------------------------------------------------
490 # Extraire les parties reelles, imaginaires et modules des modes en flexion
491 # -------------------------------------------------------------------------
493 tabmoR_f=POST_RELEVE_T(ACTION=_F(INTITULE='MODES_REEL',
498 NOM_CMP=('DX','DY','DZ'),
500 OPERATION='EXTRACTION',),);
501 tabmoI_f=POST_RELEVE_T(ACTION=_F(INTITULE='MODES_IMAG',
506 NOM_CMP=('DX','DY','DZ'),
508 OPERATION='EXTRACTION',),);
509 tabmoN_f=POST_RELEVE_T(ACTION=_F(INTITULE='MODES_MODULE',
514 NOM_CMP=('DX','DY','DZ'),
516 OPERATION='EXTRACTION',),);
519 for jj in range(NFREQ_f):
520 #Sens de precesion pour un mode a une vitesse donne
523 for ll in range(NOEU):
525 dy_r = tabmoR_f['DY' ,nmod+1];
526 dz_r = tabmoR_f['DZ' ,nmod+1];
527 dy_i = tabmoI_f['DY' ,nmod+1];
528 dz_i = tabmoI_f['DZ' ,nmod+1];
529 dy_m = tabmoN_f['DY' ,nmod+1];
530 dz_m = tabmoN_f['DZ' ,nmod+1];
533 #Sens parcours pour un noeud
534 preces = dy_r*dz_i-dy_i*dz_r ;
535 #Sens de precession dominant dans une mode
537 sens1=sens1+ dy_m + dz_m;
539 sens1=sens1- dy_m - dz_m;
541 #Sens de precession associe au plus grand orbite
542 lk= numpy.sqrt(dy_m*dy_m + dz_m*dz_m);
546 preces = dy_r*dz_i-dy_i*dz_r ;
554 SENS[jj][ii]=sens1/XS;
558 DETRUIRE(CONCEPT=_F(NOM=(tabmoR_f, tabmoI_f, tabmoN_f)),INFO=1)
562 #------------------------------------------------------------------------------------------------
563 def TRI_MODE_PREC_DI (SENS,NFREQ_f, NVT_f, NBV, OMIN) :
564 """Tri des modes par une methode de proche en proche avec verification du sens de precession"""
566 chaine='TRI_MODE_PREC_DI'
567 aster.affiche('RESULTAT', chaine)
569 NVT_fdir =numpy.zeros((NFREQ_f, NBV));
570 NVT_finv =numpy.zeros((NFREQ_f, NBV));
571 nb_prec_dir =NFREQ_f;
572 nb_prec_inv =NFREQ_f;
573 for nb in range(NBV):
577 for jj in range(NFREQ_f):
578 if SENS[jj][nbv1]>=0.:
579 NVT_fdir[jd][nbv1]=jj+1;
581 elif SENS[jj][nbv1]<0.:
582 NVT_finv[ji][nbv1]=jj+1;
584 # Calcul de nombre minimum de precession directe pour les vitesses
585 # Calcul de nombre minimum de precession inverse pour les vitesses
595 for ii in range(NFREQ_f):
596 NVT_fdir[ii][0]=NVT_fdir[ii][1]
597 NVT_finv[ii][0]=NVT_finv[ii][1]
599 chaine='nb_prev_dir ' + str(nb_prec_dir);
600 aster.affiche('RESULTAT', chaine)
601 chaine='Tableau de connexion des Modes de flexion precession directe'
602 aster.affiche('RESULTAT', chaine)
603 affiche_tabint(NVT_fdir,NFREQ_f, NBV);
605 chaine='nb_prev_inv ' + str(nb_prec_inv);
606 aster.affiche('RESULTAT', chaine)
607 chaine='Tableau de connexion des Modes de flexion precession inverse'
608 aster.affiche('RESULTAT', chaine)
609 affiche_tabint(NVT_finv,NFREQ_f, NBV);
611 # Rassembler les tableaux de connexion
612 NVTf_prec =numpy.zeros((NFREQ_f, NBV), int);
613 for jj in range(NFREQ_f):
615 jf=int(NVT_fdir[jj][NBV-1]);
617 for iv in range(NBV):
618 NVTf_prec[jf-1][iv]= NVT_fdir[jj][iv];
620 jf=int(NVT_finv[jj][NBV-1]);
622 for iv in range(NBV):
623 NVTf_prec[jf-1][iv]= NVT_finv[jj][iv];
626 aster.affiche('RESULTAT', chaine)
627 chaine='Tableau de connexion des Modes de flexion'
628 aster.affiche('RESULTAT', chaine)
629 affiche_tabint(NVTf_prec,NFREQ_f, NBV);
631 RESULT = [nb_prec_dir,nb_prec_inv, NVTf_prec];
636 #----------------------------------------------------------------------------------------
637 def affiche_tab(tab1,nbligne, nbcol) :
638 """affiche un taleau tab1 de nbligne lignes et nbcol colonnes"""
639 for jj in range(nbligne):
641 for ii in range(nbcol):
642 str1 = '%15.5E' %tab1[jj][ii]
643 chaine=chaine + ' '+ str1
644 aster.affiche('RESULTAT', chaine)
647 #----------------------------------------------------------------------------------------
648 def affiche_tabint(tab1,nbligne, nbcol) :
649 """affiche un taleau tab1 de nbligne lignes et nbcol colonnes"""
650 for jj in range(nbligne):
652 for ii in range(nbcol):
653 str1 = '%5d' %tab1[jj][ii]
654 chaine=chaine + ' '+ str1
655 aster.affiche('RESULTAT', chaine)
658 #----------------------------------------------------------------------------------------
659 def calc_pas(xmin, xmax) :
660 """calcul de l'echelle valeurs mini-maxi et le pas
661 On impose entre 5 et 10 intervalles
662 En entree xmin, xmax valeurs mini-maxi, xmin et xmax superieurs ou egaux a zero
663 En sortie VAL1, VAL2 et PAS valeurs mini-maxi de l'echelle et le pas
685 elif N>=21 and N<=30 :
688 elif N>=31 and N<=40 :
691 elif N>=41 and N<=50 :
695 # Calcul des valeurs mini-maxi de l'echelle
696 while abs(xmin-VAL1)>PAS:
703 RESULT=[VAL1, VAL2, PAS];
707 #----------------------------------------------------------------------------------------
708 def color_camp(sens, amortis) :
709 """determine la couleur et le style du trait
710 en entree le sens de precession
711 en sortir la couleur, le style du trait ICS IST et le marqueur
713 DIRECTE,INSTABLE rouge
714 INDIRECTE,STABLE bleu
715 INDIRECTE,INSTABLE magenta
718 if sens<0: # precession inverse
719 if amortis<0.0: # instable
727 else: # precession directe
728 if amortis<0.0: # instable
730 IST = 1; # trait continu
734 IST = 1; # trait continu
736 RESULT= [ICS,IST,IMA];
740 #----------------------------------------------------------------------------------------
741 def sup_redon_list(LS):
742 """Supprimer la redondace dans une liste de reel"""
747 if abs(LS_min) > abs(LS_max):
751 while ii < len_list-1:
752 icount = LS.count(LS[ii]);
754 for jj in range(ii+icount-1, ii,-1):
760 #----------------------------------------------------------------------------------------
761 def sup_redon_listv(LS):
762 """Supprimer la redondace dans une liste de vitesses"""
764 LS_init=[LS[ii] for ii in range(len(LS))]; # Liste de vitesses initiale sans rangement
769 if abs(LS_min) > abs(LS_max):
774 while ii < len_list-1:
775 icount = LS.count(LS[ii]);
777 for jj in range(ii+icount-1, ii,-1):
784 num_vit_tri =numpy.zeros((nbV1), int);
785 for ii in range(0,nbV1):
787 num_vit_tri[ii] = LS_init.index(vit);
790 print 'LS_init', LS_init
794 #----------------------------------------------------------------------------------------
795 def save_intersec(L_INTER, FINT):
796 """Sauvegarde dans un fichier les points d'intersection des courbes du diagramme de Campbell
797 avec les droites de pente S
801 chaine='Points d'' intersection avec les droites Y=SX'
803 for ii in range(len(L_INTER)):
806 chaine = 'S = %10.2F' %L_INTER[ii]["pente"]
810 L_POINT = L_INTER[ii]["point"]
811 for jj in range(len(L_POINT)):
812 chaine = 'Vitesse = %10.2F tr/mn' %L_POINT[jj][0]
815 chaine = 'Frequence = %10.2F HZ' %L_POINT[jj][1]
819 chaine='----------------------------'