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