8.5.7 pvher2k

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:


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

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:

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()
El resultado de este código es el siguiente:
[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]]
Podemos ver en este ejemplo, que el resultado no es una matriz simétrica aunque debiera serlo puesto que 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.