Salome HOME
Modif V6_4_°
[tools/eficas.git] / Aster / Cata / cataSTA6 / Macro / macro_matr_asse_ops.py
1 # -*- coding: iso-8859-1 -*-
2 #@ MODIF macro_matr_asse_ops Macro  DATE 15/10/2002   AUTEUR DURAND C.DURAND 
3 #            CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2002  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 macro_matr_asse_ops(self,MODELE,CHAM_MATER,CARA_ELEM,MATR_ASSE,
22                         SOLVEUR,NUME_DDL,CHARGE,INST,**args):
23   """
24      Ecriture de la macro MACRO_MATR_ASSE
25   """
26   ier=0
27
28   # On met le mot cle NUME_DDL dans une variable locale pour le proteger
29   numeddl=NUME_DDL
30   # On importe les definitions des commandes a utiliser dans la macro
31   # Le nom de la variable doit etre obligatoirement le nom de la commande
32   CALC_MATR_ELEM=self.get_cmd('CALC_MATR_ELEM')
33   NUME_DDL      =self.get_cmd('NUME_DDL')
34   ASSE_MATRICE  =self.get_cmd('ASSE_MATRICE')
35   # La macro compte pour 1 dans la numerotation des commandes
36   self.icmd=1
37
38   if SOLVEUR:
39     methode=SOLVEUR['METHODE']
40     if methode=='LDLT':
41       if SOLVEUR['RENUM']:
42          renum=SOLVEUR['RENUM']
43       else:
44          renum='RCMK'
45       if renum not in ('SANS','RCMK'):
46         ier=ier+1
47         self.cr.fatal("Avec methode LDLT, RENUM doit etre SANS ou RCMK.")
48         return ier
49     elif methode=='MULT_FRONT':
50       if SOLVEUR['RENUM']:
51          renum=SOLVEUR['RENUM']
52       else:
53          renum='MDA'
54       if renum not in ('MDA','MD','METIS'):
55         ier=ier+1
56         self.cr.fatal("Avec methode MULT_FRONT, RENUM doit etre MDA, MD ou RCMK.")
57         return ier
58     elif methode=='GCPC':
59       if SOLVEUR['RENUM']:
60          renum=SOLVEUR['RENUM']
61       else:
62          renum='SANS'
63       if renum not in ('SANS','RCMK'):
64         ier=ier+1
65         self.cr.fatal("Avec methode GCPC, RENUM doit etre SANS ou RCMK.")
66         return ier
67   else:
68     methode='MULT_FRONT'
69     renum  ='MDA'
70
71   if numeddl in self.sdprods:
72     # Si le concept numeddl est dans self.sdprods
73     # il doit etre  produit par la macro
74     # il faudra donc appeler la commande NUME_DDL
75     lnume = 1
76   else:
77     lnume = 0
78   lrigel = 0
79   lmasel = 0
80
81 # decalage eventuel en premiere position dans la liste de l occurence de MATR_ASSE contenant 
82 # l option de rigidite
83   try :
84     for m in MATR_ASSE:
85       option=m['OPTION']
86       if option in ('RIGI_MECA','RIGI_MECA_LAGR','RIGI_THER','RIGI_ACOU') :
87          decal=m
88          MATR_ASSE.remove(decal)
89          MATR_ASSE.insert(0,decal)
90          break
91   except: pass
92
93   iocc=0
94   for m in MATR_ASSE:
95     iocc=iocc+1
96     option=m['OPTION']
97     if iocc == 1 and lnume == 1 and option not in ('RIGI_MECA','RIGI_MECA_LAGR',
98                                                    'RIGI_THER','RIGI_ACOU')      :
99       ier=ier+1
100       self.cr.fatal("UNE DES OPTIONS DOIT ETRE RIGI_MECA OU RIGI_THER OU RIGI_ACOU OU RIGI_MECA_LAGR")
101       return ier
102
103     if m['SIEF_ELGA']!=None and option!='RIGI_GEOM':
104       ier=ier+1
105       self.cr.fatal("SIEF_ELGA N EST ADMIS QU AVEC L OPTION RIGI_GEOM")
106       return ier
107
108     if m['MODE_FOURIER']!=None and option not in ('RIGI_MECA','RIGI_FLUI_STRU','RIGI_THER'):
109       ier=ier+1
110       self.cr.fatal("MODE_FOURIER N EST ADMIS QU AVEC UNE DES OPTIONS RIGI_MECA RIGI_FLUI_STRU RIGI_THER")
111       return ier
112
113     if (m['THETA']!=None or m['PROPAGATION']!=None) and option!='RIGI_MECA_LAGR':
114       ier=ier+1
115       self.cr.fatal("PROPAGATION ET,OU THETA NE SONT ADMIS QU AVEC L OPTION RIGI_MECA_LAGR")
116       return ier
117
118     motscles={'OPTION':option}
119     if option == 'AMOR_MECA':
120        if (not lrigel or not lmasel):
121           ier=ier+1
122           self.cr.fatal("""POUR CALCULER AMOR_MECA, IL FAUT AVOIR CALCULE
123                            RIGI_MECA ET MASS_MECA AUPARAVANT (DANS LE MEME APPEL)""")
124           return ier
125        if CHAM_MATER != None:
126           motscles['RIGI_MECA']   =rigel
127           motscles['MASS_MECA']   =masel
128     if CHARGE     != None:
129        if option[0:9] not in ('MASS_THER','RIGI_GEOM','MASS_ID_M'):
130                            motscles['CHARGE']      =CHARGE
131     if CHAM_MATER != None: motscles['CHAM_MATER']  =CHAM_MATER
132     if CARA_ELEM  != None: motscles['CARA_ELEM']   =CARA_ELEM
133     if INST       != None: motscles['INST']        =INST
134     if m['SIEF_ELGA']   :  motscles['SIEF_ELGA']   =m['SIEF_ELGA']
135     if m['MODE_FOURIER']:  motscles['MODE_FOURIER']=m['MODE_FOURIER']
136     if m['THETA']       :  motscles['THETA']       =m['THETA']
137     if m['PROPAGATION'] :  motscles['PROPAGATION'] =m['PROPAGATION']
138
139     __a=CALC_MATR_ELEM(MODELE=MODELE,**motscles)
140
141     if option == 'RIGI_MECA':
142       rigel  = __a
143       lrigel = 1
144     if option == 'MASS_MECA':
145       masel  = __a
146       lmasel = 1
147
148     if lnume and option in ('RIGI_MECA','RIGI_THER','RIGI_ACOU','RIGI_MECA_LAGR'):
149       self.DeclareOut('num',numeddl)
150       # On peut passer des mots cles egaux a None. Ils sont ignores
151       num=NUME_DDL(MATR_RIGI=__a,METHODE=methode,RENUM=renum)
152     else:
153       num=numeddl
154
155     self.DeclareOut('mm',m['MATRICE'])
156     mm=ASSE_MATRICE(MATR_ELEM=__a,NUME_DDL=num)
157   return ier
158
159
160 def macro_matr_asse_prod(self,NUME_DDL,MATR_ASSE,**args):
161   if not MATR_ASSE:  raise AsException("Impossible de typer les concepts resultats")
162   if not NUME_DDL:  raise AsException("Impossible de typer les concepts resultats")
163   self.type_sdprod(NUME_DDL,nume_ddl)
164   for m in MATR_ASSE:
165     opti=m['OPTION']
166
167     if opti in ( "RIGI_MECA","RIGI_FLUI_STRU","RIGI_MECA_LAGR" ,
168        "MASS_MECA" , "MASS_FLUI_STRU" ,"RIGI_GEOM" ,"RIGI_ROTA",
169        "AMOR_MECA","IMPE_MECA","MASS_ID_MDEP_R","MASS_ID_MDNS_R",
170        "ONDE_FLUI","MASS_MECA_DIAG" ) : t=matr_asse_depl_r
171
172     if opti in ( "RIGI_ACOU","MASS_ACOU","AMOR_ACOU",) : t=matr_asse_pres_c
173
174     if opti in ( "RIGI_THER","MASS_THER","RIGI_THER_CONV" ,
175        "RIGI_THER_CONV_D","MASS_ID_MTEM_R","MASS_ID_MTNS_R",) : t=matr_asse_temp_r
176
177     if opti == "RIGI_MECA_HYST"   : t= matr_asse_depl_c
178
179     self.type_sdprod(m['MATRICE'],t)
180   return None
181