]> SALOME platform Git repositories - tools/eficas.git/blob - Aster/Cata/cataSTA10/SD/co_matr_asse_gene.py
Salome HOME
Modif V6_4_°
[tools/eficas.git] / Aster / Cata / cataSTA10 / SD / co_matr_asse_gene.py
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.                                                  
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_matr_asse_gene import sd_matr_asse_gene
24
25 import numpy
26 import math
27
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.
31    """
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))
37    if sym:
38       triang_inf = triang_sup
39    else:
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):
44        k = i*(i-1)/2 + j
45        valeur[i-1, j-1]=triang_inf[k-1]
46        valeur[j-1, i-1]=triang_sup[k-1]
47    return valeur
48
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.
52    """
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)
56    for i in range(dim):
57       valeur[i,i] =  diag[i]
58    return valeur
59
60 # -----------------------------------------------------------------------------
61 class matr_asse_gene(ASSD, sd_matr_asse_gene):
62    pass
63
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
69         Attributs retourne
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'")
73
74     desc=numpy.array(self.DESC.get())
75     # On teste si le DESC de la matrice existe
76     if (desc==None):
77        raise Accas.AsException("L'objet matrice n'existe pas ou est mal cree par Code Aster")
78     # Si le stockage est plein
79     if desc[2]==2 :
80        valeur = VALM_triang2array(self.VALM.get(), desc[1])
81
82     # Si le stockage est diagonal
83     elif desc[2]==1 :
84        valeur = VALM_diag2array(self.VALM.get(), desc[1])
85
86     # Sinon on arrete tout
87     else:
88       raise KeyError
89     return valeur
90
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'")
97
98     ncham=self.get_name()
99     desc=numpy.array(self.DESC.get())
100
101     # On teste si le DESC de la matrice existe
102     if (desc==None):
103        raise Accas.AsException("L'objet matrice n'existe pas ou est mal cree par Code Aster")
104     numpy.asarray(matrice)
105
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 ")
109
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 ")
113
114     # Si le stockage est plein
115     if desc[2]==2 :
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):
119         for i in range(j):
120           k=j*(j-1)/2+i
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
125     elif desc[2]==1 :
126       tmp=numpy.zeros(desc[1])
127       for j in range(desc[1]):
128           tmp[j]=matrice[j,j]
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
132     else:
133       raise KeyError
134     return
135
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
140     dans un format numpy
141         Attributs retourne
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'")
145
146     desc = numpy.array(self.DESC.get())
147     if desc == None:
148        raise Accas.AsException("L'objet matrice n'existe pas ou est mal cree par Code Aster ")
149     # Si le stockage est plein
150     if desc[2] == 2 :
151        valeur = VALM_triang2array(self.VALM.get(), desc[1], complex)
152
153     # Si le stockage est diagonal
154     elif desc[2]==1 :
155        valeur = VALM_diag2array(self.VALM.get(), desc[1], complex)
156
157     # Sinon on arrete tout
158     else:
159        raise KeyError
160     return valeur
161
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'")
168
169     numpy.asarray(matrice)
170     ncham=self.get_name()
171     desc=numpy.array(self.DESC.get())
172
173     # On teste si le DESC de la matrice existe
174     if (desc==None):
175        raise Accas.AsException("L'objet matrice n'existe pas ou est mal cree par Code Aster")
176     numpy.asarray(matrice)
177
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 ")
181
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 ")
185
186     # Si le stockage est plein
187     if desc[2]==2 :
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):
192         for i in range(j):
193           k=j*(j-1)/2+i
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
199     elif desc[2]==1 :
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
208     else:
209       raise KeyError
210     return