c=PyPBLAS.pvher2k(alpha,a,b,beta,c[,uplo,trans])
La función "PyPBLAS.pvher2k" implementa la siguiente operación entre matrices teniendo en cuenta que este tipo de matrices son simétricas y con elementos de tipo complejo:
En el caso que las dimensiones de alguna de las entradas no sea correcta, la
rutina PyPBLASpvher2k
informará de ello y no podrá finalizar la
operación.
Esta rutina se provee para matrices simétricas con elementos de tipo
complejo. Un detalle importante en esta rutina es la suposición que las
matrices de entrada son simétricas, de este modo se realizan los cálculos
con la parte superior (o inferior) a la diagonal. El resultado válido en la
matriz devuelta por la función será el situado en la posición que le
indiquemos a través del parámetro uplo
.
Las características de cada uno de los parámetros son las siguientes:
Parametros de Entrada
uplo='U'
: (Valor por defecto).Se obtienen los resultados en la
diagonal principal y por encima de ella.
uplo='L'
: Se obtienen los resultados en la diagonal principal y por
debajo de ella.
a
:
trans='N'
: (Valor por defecto).La operación que se lleva a cabo es
:
.
trans='H'
: La operación que se lleva a cabo es :
.
Parametros de Salida
A continuación mostramos un ejemplo en la utilización de esta rutina:
from PyACTS import * import PyACTS.PyPBLAS as PyPBLAS from RandomArray import * from Numeric import * #Dimension of Arrays def make_sym_b(x,y): return x*y +(x+y)*1j def make_sym_c(x,y): return x+y +(x*y)*1j n=6 #Initiliaze the Grid PyACTS.gridinit() if PyACTS.iread==1: print "Example of using PyPBLAS 3: PvHER2K" print "N=",n,";nprow x npcol:",PyACTS.nprow,"x",PyACTS.npcol print "Block's size:",PyACTS.mb,"*",PyACTS.nb a=ones([n,n])+1j*ones([n,n]) print "a=",a b=fromfunction(make_sym_b,(n,n)) print "b=",b c=fromfunction(make_sym_c,(n,n)) print "c=",c alpha,beta=2.,3. print "alpha=",alpha,";","beta=",beta else: alpha,a,b,beta,c=None,None,None,None,None #We convert Numeric Array to PyACTS.Scalapack Array ACTS_lib=1 # 1=Scalapack alpha=Scal2PyACTS(alpha,ACTS_lib) beta=Scal2PyACTS(beta,ACTS_lib) a=Num2PyACTS(a,ACTS_lib) b=Num2PyACTS(b,ACTS_lib) c=Num2PyACTS(c,ACTS_lib) #We call PBLAS routine c= PyPBLAS.pvsyr2k(alpha,a,b,beta,c) c_num=PyACTS2Num(c) if PyACTS.iread==1: print "PvHER2K=",transpose(c_num) PyACTS.gridexit()
[vgaliano@localhost EXAMPLES]$ mpirun -np 4 mpipython exPypvher2k.py Example of using PyPBLAS 3: PvHER2K N= 6 ;nprow x npcol: 2 x 2 Block's size: 2 * 2 a= [[ 1.+1.j 1.+1.j 1.+1.j 1.+1.j 1.+1.j 1.+1.j] [ 1.+1.j 1.+1.j 1.+1.j 1.+1.j 1.+1.j 1.+1.j] [ 1.+1.j 1.+1.j 1.+1.j 1.+1.j 1.+1.j 1.+1.j] [ 1.+1.j 1.+1.j 1.+1.j 1.+1.j 1.+1.j 1.+1.j] [ 1.+1.j 1.+1.j 1.+1.j 1.+1.j 1.+1.j 1.+1.j] [ 1.+1.j 1.+1.j 1.+1.j 1.+1.j 1.+1.j 1.+1.j]] b= [[ 0. +0.j 0. +1.j 0. +2.j 0. +3.j 0. +4.j 0. +5.j] [ 0. +1.j 1. +2.j 2. +3.j 3. +4.j 4. +5.j 5. +6.j] [ 0. +2.j 2. +3.j 4. +4.j 6. +5.j 8. +6.j 10. +7.j] [ 0. +3.j 3. +4.j 6. +5.j 9. +6.j 12. +7.j 15. +8.j] [ 0. +4.j 4. +5.j 8. +6.j 12. +7.j 16. +8.j 20. +9.j] [ 0. +5.j 5. +6.j 10. +7.j 15. +8.j 20. +9.j 25.+10.j]] c= [[ 0. +0.j 1. +0.j 2. +0.j 3. +0.j 4. +0.j 5. +0.j] [ 1. +0.j 2. +1.j 3. +2.j 4. +3.j 5. +4.j 6. +5.j] [ 2. +0.j 3. +2.j 4. +4.j 5. +6.j 6. +8.j 7.+10.j] [ 3. +0.j 4. +3.j 5. +6.j 6. +9.j 7.+12.j 8.+15.j] [ 4. +0.j 5. +4.j 6. +8.j 7.+12.j 8.+16.j 9.+20.j] [ 5. +0.j 6. +5.j 7.+10.j 8.+15.j 9.+20.j 10.+25.j]] alpha= 2.0 ; beta= 3.0 PvHER2K= [[ 60. +0.j 1. +0.j 2. +0.j 3. +0.j 4. +0.j 5. +0.j] [ 105.+18.j 150. +0.j 3. +2.j 4. +3.j 5. +4.j 6. +5.j] [ 150.+36.j 195.+24.j 240. +0.j 5. +6.j 6. +8.j 7.+10.j] [ 195.+54.j 240.+45.j 285.+36.j 330. +0.j 7.+12.j 8.+15.j] [ 240.+72.j 285.+66.j 330.+60.j 375.+54.j 420. +0.j 9.+20.j] [ 285.+90.j 330.+87.j 375.+84.j 420.+81.j 465.+78.j 510. +0.j]]
a
y c
lo son y el resultado de la
operación descrita ha de genera una matriz simétrica. Como por defecto
uplo='U'
, el resultado es una matriz simétrica con los valores
correctos situados en y por encima de la diagonal.
Si ejecutaramos c=PyPBLAS.pvher2k(alpha,a,b,beta,c,uplo='L')
,
podríamos comprobar que los valores correctos se obtienen en y por debajo de
la diagonal principal.
See Sobre este documento... para sugerencias en cambios.