8.5.3 pvhemm

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:


\begin{displaymath}\alpha \cdot A\times B + \beta \cdot C \to C ; \alpha \cdot B\times A + \beta
\cdot C \to C\end{displaymath}

donde

\begin{displaymath}A=A^H\end{displaymath}

En el caso que las dimensiones de alguna de las entradas no sea correcta, la rutina 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:

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()
El resultado de este código es el siguiente:
[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.