c=PyPBLAS.pvhemm(alpha,a,b,beta,c[,side='L',uplo='U'])
La función "PyPBLAS.pvhemm" implementa la siguiente operación entre matrices teniendo en cuenta que este tipo de matrices han de ser con elementos de tipo complejo:
PyPBLASpvhemm
informará de ello y no podrá finalizar la
operación.
Esta rutina se provee para matrices con elementos de tipo complejo pero de carácter simetrétrico, es decir tomara las mátrices como simétricas desechando uno de los lados de la diagonal principal. Las características de cada uno de los parámetros son las siguientes:
Parametros de Entrada
a
en la
operación:
side='L'
: (Valor por defecto).La operación que se realiza es
.
side='R'
: La operación que se realiza es
.
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.
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 m,n=6,6 #Initiliaze the Grid PyACTS.gridinit() if PyACTS.iread==1: print "Example of using PyPBLAS 3: PvHEMM" print "N=",n,";nprow x npcol:",PyACTS.nprow,"x",PyACTS.npcol print "Block's size:",PyACTS.mb,"*",PyACTS.nb a=ones([m,m])+1.j*reshape(range(m*m),[m,m]) print "a=",a b=ones([m,m])-1.j*reshape(range(m*n),[m,n]) print "b=",b c=1.j*ones([m,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.pvsymm(alpha,a,b,beta,c) c_num=PyACTS2Num(c) if PyACTS.iread==1: print "PvHEMM=",transpose(c_num) PyACTS.gridexit()
[vgaliano@localhost EXAMPLES]$ mpirun -np 4 mpipython exPypvhemm.py Example of using PyPBLAS 3: PvSYMM N= 6 ;nprow x npcol: 2 x 2 Block's size: 2 * 2 a= [[ 1. +0.j 1. +1.j 1. +2.j 1. +3.j 1. +4.j 1. +5.j] [ 1. +6.j 1. +7.j 1. +8.j 1. +9.j 1.+10.j 1.+11.j] [ 1.+12.j 1.+13.j 1.+14.j 1.+15.j 1.+16.j 1.+17.j] [ 1.+18.j 1.+19.j 1.+20.j 1.+21.j 1.+22.j 1.+23.j] [ 1.+24.j 1.+25.j 1.+26.j 1.+27.j 1.+28.j 1.+29.j] [ 1.+30.j 1.+31.j 1.+32.j 1.+33.j 1.+34.j 1.+35.j]] b= [[ 1. +0.j 1. -1.j 1. -2.j 1. -3.j 1. -4.j 1. -5.j] [ 1. -6.j 1. -7.j 1. -8.j 1. -9.j 1.-10.j 1.-11.j] [ 1.-12.j 1.-13.j 1.-14.j 1.-15.j 1.-16.j 1.-17.j] [ 1.-18.j 1.-19.j 1.-20.j 1.-21.j 1.-22.j 1.-23.j] [ 1.-24.j 1.-25.j 1.-26.j 1.-27.j 1.-28.j 1.-29.j] [ 1.-30.j 1.-31.j 1.-32.j 1.-33.j 1.-34.j 1.-35.j]] c= [[ 0.+1.j 0.+1.j 0.+1.j 0.+1.j 0.+1.j 0.+1.j] [ 0.+1.j 0.+1.j 0.+1.j 0.+1.j 0.+1.j 0.+1.j] [ 0.+1.j 0.+1.j 0.+1.j 0.+1.j 0.+1.j 0.+1.j] [ 0.+1.j 0.+1.j 0.+1.j 0.+1.j 0.+1.j 0.+1.j] [ 0.+1.j 0.+1.j 0.+1.j 0.+1.j 0.+1.j 0.+1.j] [ 0.+1.j 0.+1.j 0.+1.j 0.+1.j 0.+1.j 0.+1.j]] alpha= 2.0 ; beta= 3.0 PvSYMM= [[ 672.-147.j 1752. -85.j 2772. -33.j 3672. +9.j 4392. +41.j 4872. +63.j] [ 702.-159.j 1844. -97.j 2916. -45.j 3858. -3.j 4610. +29.j 5112. +51.j] [ 732.-171.j 1936.-109.j 3060. -57.j 4044. -15.j 4828. +17.j 5352. +39.j] [ 762.-183.j 2028.-121.j 3204. -69.j 4230. -27.j 5046. +5.j 5592. +27.j] [ 792.-195.j 2120.-133.j 3348. -81.j 4416. -39.j 5264. -7.j 5832. +15.j] [ 822.-207.j 2212.-145.j 3492. -93.j 4602. -51.j 5482. -19.j 6072. +3.j]]
Los paramentros side
y uplo
son parámetros opcionales que
tienen un valor establecido por defecto. En el caso que no se especifiquen estos
parámetros tomaraán sus valores por defecto. Para especificar un valor
diferente se puede realizar del siguiente modo:
c,descc=PyPBLAS.pvsymm(alpha,a,b,beta,c,side='R',uplo='L')
See Sobre este documento... para sugerencias en cambios.