]> SALOME platform Git repositories - tools/eficas.git/blob - Aster/Cata/cataSTA9/Macro/defi_inte_spec_ops.py
Salome HOME
CCAR: merge de la version 1.14 dans la branche principale
[tools/eficas.git] / Aster / Cata / cataSTA9 / Macro / defi_inte_spec_ops.py
1 #@ MODIF defi_inte_spec_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 - 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 tocomplex(arg):
22     if arg[0]=='RI' : return complex(arg[1],arg[2])
23     if arg[0]=='MP' : return complex(arg[1]*cos(arg[2]),arg[1]*sin(arg[2]))
24
25 def defi_inte_spec_ops(self,DIMENSION,PAR_FONCTION,KANAI_TAJIMI,
26                        CONSTANT,TITRE,INFO,**args):
27 #  ------------------------------------------------------------------
28 #  Définition d'une matrice interspectrale
29 #  à partir de fonctions complexes
30
31    import aster
32    from types import ListType, TupleType
33    EnumTypes = (ListType, TupleType)
34    from Accas               import _F
35    from Utilitai.Utmess     import  UTMESS
36    import Numeric
37    
38    commande='DEFI_INTE_SPEC'
39
40    ier = 0
41    # La macro compte pour 1 dans la numerotation des commandes
42    self.set_icmd(1)
43
44    # Le concept sortant (de type table_sdaster ou dérivé) est tab
45    self.DeclareOut('tabout', self.sd)
46    
47    # On importe les definitions des commandes a utiliser dans la macro
48    # Le nom de la variable doit etre obligatoirement le nom de la commande
49    CREA_TABLE    = self.get_cmd('CREA_TABLE')
50    CALC_TABLE    = self.get_cmd('CALC_TABLE')
51    DEFI_FONCTION = self.get_cmd('DEFI_FONCTION')
52
53 #--- Vérifications
54
55    if PAR_FONCTION==None : PAR_FONCTION=[]
56    if KANAI_TAJIMI==None : KANAI_TAJIMI=[]
57    if CONSTANT    ==None : CONSTANT    =[]
58
59    nfntot = len(PAR_FONCTION)+len(KANAI_TAJIMI)+len(CONSTANT)
60    dimh   = (DIMENSION*(DIMENSION+1))/2
61    if dimh!=nfntot :
62       UTMESS('F','SPECTRAL0_1')
63
64    l_f=[]
65    for occ in PAR_FONCTION : l_f.append(('PAR_FONCTION',occ))
66    for occ in KANAI_TAJIMI : l_f.append(('KANAI_TAJIMI',occ))
67    for occ in CONSTANT     : l_f.append(('CONSTANT'    ,occ))
68    for occ in l_f :
69       if occ[0]!='PAR_FONCTION' and occ[1]['FREQ_MAX']<occ[1]['FREQ_MIN'] :
70           UTMESS('F','SPECTRAL0_2',valk=occ[0])
71    l_is=[occ[1]['NUME_ORDRE_I'] for occ in l_f]
72    l_js=[occ[1]['NUME_ORDRE_J'] for occ in l_f]
73    iis=sum(l_is)
74    ijs=sum(l_js)
75
76 #--- pour une matrice hermitienne ---
77    l_ih=[k*(DIMENSION-k+1) for k in range(1,DIMENSION+1)]
78    l_jh=[k*k               for k in range(1,DIMENSION+1)]
79    ih=sum(l_ih)
80    jh=sum(l_jh)
81    if ((iis!=ih) or (ijs!=jh)) :
82       UTMESS('F','SPECTRAL0_3')
83
84 #--- Construction de la liste de fonctions complexes
85    l_fc=[]
86    for occ in l_f :
87
88 #--- PAR_FONCTION
89
90        if occ[0]=='PAR_FONCTION' :
91               l_fc.append(occ[1]['FONCTION'].nom)
92
93 #--- KANAI_TAJIMI et CONSTANT
94
95        if occ[0] in ('KANAI_TAJIMI','CONSTANT')     :
96               if occ[1]['VALE_R']!=None :
97                  valr=occ[1]['VALE_R']
98                  vali=0.
99               elif occ[1]['VALE_C']!=None :
100                  cmpl=tocomplex(occ[1]['VALE_C'])
101                  valr=cmpl.real
102                  vali=cmpl.imag
103               else :
104                  valr=1.
105                  vali=0.
106               x1=Numeric.arange(occ[1]['FREQ_MIN'],occ[1]['FREQ_MAX'],occ[1]['PAS'])
107               x1=x1.tolist()+[occ[1]['FREQ_MAX'],]
108               valc=[]
109               for absc in x1 : valc=valc+[absc,valr,vali]
110
111 #--- KANAI_TAJIMI
112
113        if occ[0]=='KANAI_TAJIMI'     :
114               amor   = occ[1]['AMOR_REDUIT']
115               frqmoy = occ[1]['FREQ_MOY']
116               x11  =Numeric.array([4*(amor**2)*(frqmoy**2)*FREQ**2 \
117                                    for FREQ in x1 ])
118               xnum =x11+frqmoy**4
119               denom=Numeric.array([ (frqmoy**2-FREQ**2)**2 \
120                                    for FREQ in x1 ])
121               denom=denom+x11
122               g0=Numeric.array([valr]*len(denom))
123               g0=g0*xnum/denom
124               valc=[]
125               for i in range(len(x1)): valc=valc+[x1[i],g0[i],0.]
126        if occ[0] in ('KANAI_TAJIMI','CONSTANT')     :
127               _f=DEFI_FONCTION(PROL_GAUCHE=occ[1]['PROL_GAUCHE'],
128                                PROL_DROITE=occ[1]['PROL_DROITE'],
129                                INTERPOL   =occ[1]['INTERPOL'],
130                                VALE_C     =valc,
131                                NOM_PARA   ='FREQ',
132                                NOM_RESU   ='DSP' )
133               l_fc.append(_f.nom)
134
135    mcfact=[]
136    mcfact.append(_F(PARA='NOM_CHAM'  ,LISTE_K='DSP' ))
137    mcfact.append(_F(PARA='OPTION'    ,LISTE_K='TOUT' ))
138    mcfact.append(_F(PARA='DIMENSION' ,LISTE_I=(DIMENSION,) ))
139    tabout=CREA_TABLE(LISTE=mcfact, TITRE='',
140                      TYPE_TABLE='TABLE_FONCTION')
141    mcfact=[]
142    mcfact.append(_F(PARA='NUME_ORDRE_I'  ,LISTE_I=l_is ))
143    mcfact.append(_F(PARA='NUME_ORDRE_J'  ,LISTE_I=l_js ))
144    mcfact.append(_F(PARA='FONCTION_C'    ,LISTE_K=l_fc ,TYPE_K='K24' ))
145    __l_fonc=CREA_TABLE(LISTE=mcfact, TITRE='')
146    tabout=CALC_TABLE(reuse=tabout,TABLE=tabout,
147                      TITRE=self.sd.nom+' : interspectre obtenu par DEFI_INTE_SPEC',
148                      ACTION=_F(OPERATION='COMB',TABLE=__l_fonc,))
149
150    return ier