1 #@ MODIF co_matr_asse_gene 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.
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 # ======================================================================
23 from sd_matr_asse_gene import sd_matr_asse_gene
28 def VALM_triang2array(dict_VALM, dim, dtype=None):
29 """Conversion (par recopie) de l'objet .VALM decrivant une matrice pleine
30 par sa triangulaire inf (et parfois triang sup) en numpy.array plein.
32 # stockage symetrique ou non (triang inf+sup)
33 sym = len(dict_VALM) == 1
34 triang_sup = numpy.array(dict_VALM[1])
35 assert dim*(dim+1)/2 == len(triang_sup), \
36 'Matrice non pleine : %d*(%d+1)/2 != %d' % (dim, dim, len(triang_sup))
38 triang_inf = triang_sup
40 triang_inf = numpy.array(dict_VALM[2])
41 valeur=numpy.zeros([dim, dim], dtype=dtype)
42 for i in range(1, dim+1):
43 for j in range(1, i+1):
45 valeur[i-1, j-1]=triang_inf[k-1]
46 valeur[j-1, i-1]=triang_sup[k-1]
49 def VALM_diag2array(dict_VALM, dim, dtype=None):
50 """Conversion (par recopie) de l'objet .VALM decrivant une matrice
51 diagonale en numpy.array plein.
53 diag = numpy.array(dict_VALM[1])
54 assert dim == len(diag), 'Dimension incorrecte : %d != %d' % (dim, len(diag))
55 valeur=numpy.zeros([dim, dim], dtype=dtype)
60 # -----------------------------------------------------------------------------
61 class matr_asse_gene(ASSD, sd_matr_asse_gene):
64 # -----------------------------------------------------------------------------
65 class matr_asse_gene_r(matr_asse_gene):
66 def EXTR_MATR_GENE(self) :
67 """ retourne les valeurs de la matrice generalisee reelle
68 dans un format numpyal Array
70 - self.valeurs : numpy.array contenant les valeurs """
71 if not self.accessible():
72 raise Accas.AsException("Erreur dans matr_asse_gene.EXTR_MATR_GENE en PAR_LOT='OUI'")
74 desc=numpy.array(self.DESC.get())
75 # On teste si le DESC de la matrice existe
77 raise Accas.AsException("L'objet matrice n'existe pas ou est mal cree par Code Aster")
78 # Si le stockage est plein
80 valeur = VALM_triang2array(self.VALM.get(), desc[1])
82 # Si le stockage est diagonal
84 valeur = VALM_diag2array(self.VALM.get(), desc[1])
86 # Sinon on arrete tout
91 def RECU_MATR_GENE(self,matrice) :
92 """ envoie les valeurs d'un tableau numpy dans des matrices
93 generalisees reelles definies dans jeveux
94 Attributs ne retourne rien """
95 if not self.accessible():
96 raise Accas.AsException("Erreur dans matr_asse_gene.RECU_MATR_GENE en PAR_LOT='OUI'")
99 desc=numpy.array(self.DESC.get())
101 # On teste si le DESC de la matrice existe
103 raise Accas.AsException("L'objet matrice n'existe pas ou est mal cree par Code Aster")
104 numpy.asarray(matrice)
106 # On teste si la dimension de la matrice python est 2
107 if (len(numpy.shape(matrice))<>2) :
108 raise Accas.AsException("La dimension de la matrice est incorrecte ")
110 # On teste si les tailles des matrices jeveux et python sont identiques
111 if (tuple([desc[1],desc[1]])<>numpy.shape(matrice)) :
112 raise Accas.AsException("La taille de la matrice est incorrecte ")
114 # Si le stockage est plein
116 taille=desc[1]*desc[1]/2.0+desc[1]/2.0
117 tmp=numpy.zeros([int(taille)])
118 for j in range(desc[1]+1):
121 tmp[k]=matrice[j-1,i]
122 aster.putcolljev('%-19s.VALM' % ncham,len(tmp),tuple((\
123 range(1,len(tmp)+1))),tuple(tmp),tuple(tmp),1)
124 # Si le stockage est diagonal
126 tmp=numpy.zeros(desc[1])
127 for j in range(desc[1]):
129 aster.putcolljev('%-19s.VALM' % ncham,len(tmp),tuple((\
130 range(1,len(tmp)+1))),tuple(tmp),tuple(tmp),1)
131 # Sinon on arrete tout
136 # -----------------------------------------------------------------------------
137 class matr_asse_gene_c(matr_asse_gene):
138 def EXTR_MATR_GENE(self) :
139 """ retourne les valeurs de la matrice generalisee complexe
142 - self.valeurs : numpy.array contenant les valeurs """
143 if not self.accessible():
144 raise Accas.AsException("Erreur dans matr_asse_gene_c.EXTR_MATR_GENE en PAR_LOT='OUI'")
146 desc = numpy.array(self.DESC.get())
148 raise Accas.AsException("L'objet matrice n'existe pas ou est mal cree par Code Aster ")
149 # Si le stockage est plein
151 valeur = VALM_triang2array(self.VALM.get(), desc[1], complex)
153 # Si le stockage est diagonal
155 valeur = VALM_diag2array(self.VALM.get(), desc[1], complex)
157 # Sinon on arrete tout
162 def RECU_MATR_GENE(self,matrice) :
163 """ envoie les valeurs d'un tableau numpy dans des matrices
164 generalisees reelles definies dans jeveux
165 Attributs ne retourne rien """
166 if not self.accessible():
167 raise Accas.AsException("Erreur dans matr_asse_gene_c.RECU_MATR_GENE en PAR_LOT='OUI'")
169 numpy.asarray(matrice)
170 ncham=self.get_name()
171 desc=numpy.array(self.DESC.get())
173 # On teste si le DESC de la matrice existe
175 raise Accas.AsException("L'objet matrice n'existe pas ou est mal cree par Code Aster")
176 numpy.asarray(matrice)
178 # On teste si la dimension de la matrice python est 2
179 if (len(numpy.shape(matrice))<>2) :
180 raise Accas.AsException("La dimension de la matrice est incorrecte ")
182 # On teste si la taille de la matrice jeveux et python est identique
183 if (tuple([desc[1],desc[1]])<>numpy.shape(matrice)) :
184 raise Accas.AsException("La taille de la matrice est incorrecte ")
186 # Si le stockage est plein
188 taille=desc[1]*desc[1]/2.0+desc[1]/2.0
189 tmpr=numpy.zeros([int(taille)])
190 tmpc=numpy.zeros([int(taille)])
191 for j in range(desc[1]+1):
194 tmpr[k]=matrice[j-1,i].real
195 tmpc[k]=matrice[j-1,i].imag
196 aster.putvectjev('%-19s.VALM' % ncham, len(tmpr), tuple((\
197 range(1,len(tmpr)+1))),tuple(tmpr),tuple(tmpc),1)
198 # Si le stockage est diagonal
200 tmpr=numpy.zeros(desc[1])
201 tmpc=numpy.zeros(desc[1])
202 for j in range(desc[1]):
203 tmpr[j]=matrice[j,j].real
204 tmpc[j]=matrice[j,j].imag
205 aster.putvectjev('%-19s.VALM' % ncham,len(tmpr),tuple((\
206 range(1,len(tmpr)+1))),tuple(tmpr),tuple(tmpc),1)
207 # Sinon on arrete tout