]> SALOME platform Git repositories - tools/eficas.git/blob - Aster/Cata/cataSTA10/SD/co_macr_elem_dyna.py
Salome HOME
Modif V6_4_°
[tools/eficas.git] / Aster / Cata / cataSTA10 / SD / co_macr_elem_dyna.py
1 #@ MODIF co_macr_elem_dyna SD  DATE 11/05/2010   AUTEUR COURTOIS M.COURTOIS 
2 # -*- coding: iso-8859-1 -*-
3 #            CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2007  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 import Accas
22 from SD import *
23 from sd_macr_elem_dyna import sd_macr_elem_dyna
24
25 import numpy
26
27 def VALE_triang2array(vect_VALE, dim, dtype=None):
28    """Conversion (par recopie) de l'objet .VALE decrivant une matrice pleine
29    par sa triangulaire sup en numpy.array plein.
30    """
31    triang_sup = numpy.array(vect_VALE)
32    assert dim*(dim+1)/2 == len(triang_sup), \
33          'Matrice non pleine : %d*(%d+1)/2 != %d' % (dim, dim, len(triang_sup))
34
35    valeur = numpy.zeros([dim, dim], dtype=dtype)
36    for i in range(1, dim+1):
37      for j in range(1, i+1):
38        k = i*(i-1)/2 + j
39        valeur[j-1, i-1]=triang_sup[k-1]
40    valeur = valeur + numpy.transpose(valeur)
41    for i in range(dim):
42       valeur[i, i] = 0.5 * valeur[i, i]
43
44    return valeur
45
46 # -----------------------------------------------------------------------------
47 class macr_elem_dyna(ASSD, sd_macr_elem_dyna):
48
49    def EXTR_MATR_GENE(self,typmat) :
50       """ retourne les valeurs des matrices generalisees reelles
51       dans un format numpy
52          typmat='MASS_GENE' pour obtenir la matrice de masse generalisee
53          typmat='RIGI_GENE' pour obtenir la matrice de raideur generalisee
54          typmat='AMOR_GENE' pour obtenir la matrice d'amortissement generalisee
55          Attributs retourne
56             - self.valeurs : numpy.array contenant les valeurs """
57       if not self.accessible():
58          raise Accas.AsException("Erreur dans macr_elem_dyna.EXTR_MATR_GENE en PAR_LOT='OUI'")
59
60       if (typmat=='MASS_GENE') :
61          macr_elem = self.MAEL_MASS
62       elif (typmat=='RIGI_GENE') :
63          macr_elem = self.MAEL_RAID
64       elif (typmat=='AMOR_GENE') :
65          macr_elem = self.MAEL_AMOR
66       else:
67          raise Accas.AsException("Le type de la matrice est incorrect")
68
69       desc=numpy.array(macr_elem.DESC.get())
70       # On teste si le DESC du vecteur existe
71       if (desc==None):
72          raise Accas.AsException("L'objet matrice n'existe pas ou est mal cree par Code Aster")
73
74       matrice = VALE_triang2array(macr_elem.VALE.get(), desc[1])
75       return matrice
76
77    def RECU_MATR_GENE(self,typmat,matrice) :
78       """ envoie les valeurs d'un tableau numpy dans des matrices generalisees
79       reelles definies dans jeveux
80          typmat='MASS_GENE' pour obtenir la matrice de masse generalisee
81          typmat='RIGI_GENE' pour obtenir la matrice de raideur generalisee
82          typmat='AMOR_GENE' pour obtenir la matrice d'amortissement generalisee
83          Attributs ne retourne rien """
84       if not self.accessible():
85          raise Accas.AsException("Erreur dans macr_elem_dyna.RECU_MATR_GENE en PAR_LOT='OUI'")
86
87       nommacr=self.get_name()
88       if (typmat=='MASS_GENE') :
89          macr_elem = self.MAEL_MASS
90       elif (typmat=='RIGI_GENE') :
91          macr_elem = self.MAEL_RAID
92       elif (typmat=='AMOR_GENE') :
93          macr_elem = self.MAEL_AMOR
94       else:
95          raise Accas.AsException("Le type de la matrice est incorrect")
96       nom_vale = macr_elem.VALE.nomj()
97       desc=numpy.array(macr_elem.DESC.get())
98
99       # On teste si le DESC de la matrice jeveux existe
100       if (desc==None):
101          raise Accas.AsException("L'objet matrice n'existe pas ou est mal cree par Code Aster")
102       numpy.asarray(matrice)
103
104       # On teste si la matrice python est de dimension 2
105       if (len(numpy.shape(matrice))<>2):
106          raise Accas.AsException("La dimension de la matrice est incorrecte")
107
108       # On teste si les tailles de la matrice jeveux et python sont identiques
109       if (tuple([desc[1],desc[1]])<>numpy.shape(matrice)) :
110          raise Accas.AsException("La dimension de la matrice est incorrecte")
111       taille=desc[1]*desc[1]/2.0+desc[1]/2.0
112       tmp=numpy.zeros([int(taille)])
113       for j in range(desc[1]+1):
114          for i in range(j):
115             k=j*(j-1)/2+i
116             tmp[k]=matrice[j-1,i]
117       aster.putvectjev(nom_vale,len(tmp),tuple((
118          range(1,len(tmp)+1))),tuple(tmp),tuple(tmp),1)
119       return
120