9.6.12 pvdttrf

ACTS_ad,info= PySLK.pvdttrf(ACTS_ad)

La rutina "pvdbtrf" computa una factorización LU de un sistema tridiagonal $N \times N$ real. La reordenación se utiliza para incrementar el paralelismo en la factorización. Esta reordenación produce que los factores sean diferentes a los obtenidos en codigos secuenciales. Estos factores no pueden ser utilizados directamente por los usuarios. Sin embargo, pueden ser utilizados en llamadas a pvdttrs para solucionar sistemas lineales. La factorización tiene el siguiente aspecto:

\begin{displaymath}PAP^{T}=LU\end{displaymath}

donde $U$ es una matriz triangular con banda superior, $L$ es una matriz triangular con banda inferior, y $L$ y $Q$ son matrices de permutación. La matriz $Q$ representa la reordenación de las columnas para implementar el paralelismo, mientras que $P$ representa la matriz de reordenación de filas para implementar la estabilidad numérica que utiliza la pivotación clásica parcial.

Esta rutina tiene una particularidad, y es que la matriz a se convierte en tres vectores que identifican la banda inferior dl, la diagonal principal d, y la banda superior du. De este modo, cuando se ejecuta Num2PyACTS, la propiedad a.data realmente contiene un conjunto de estos tres vectores. Este manejo de variables es transparente al usuario y se puede apreciar con el ejemplo indicado.

Esta rutina se provee para matrices con elementos de tipo real y complejo. 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.PyScaLAPACK as PySLK
from RandomArray import *
from Numeric import *
n=7
#Initiliaze the Grid
PyACTS.gridinit(nb=4,nprow=1)
if PyACTS.iread==1:
    print "Ejemplo de Utilizacion ScaLAPACK: PvDTTRF"
    print "N=",n,";nprow x npcol:",PyACTS.nprow,"x",PyACTS.npcol
    print "Tam. Bloques:",PyACTS.mb,"*",PyACTS.nb
    a=8*identity(n,Float)+ones([n,n],Float)
    print "a=",a
else:
    a=None
#We convert Numeric Array to PyACTS.Scalapack Array
ACTS_lib=501 # 501=Scalapack; Partial pivoting Band
pivot='dt'
ACTS_ad=Num2PyACTS(a,ACTS_lib,piv=pivot)
#We call ScaLAPACK routine
a,info= PySLK.pvdttrf(ACTS_ad)
if PyACTS.iread==1:
    print "a=",a.data
    print "info=",info
PyACTS.gridexit()

El resultado de este código es el siguiente:

N= 7 ;nprow x npcol: 1 x 1
Tam. Bloques: 4 * 4
a= [[ 9.  1.  1.  1.  1.  1.  1.]
 [ 1.  9.  1.  1.  1.  1.  1.]
 [ 1.  1.  9.  1.  1.  1.  1.]
 [ 1.  1.  1.  9.  1.  1.  1.]
 [ 1.  1.  1.  1.  9.  1.  1.]
 [ 1.  1.  1.  1.  1.  9.  1.]
 [ 1.  1.  1.  1.  1.  1.  9.]]
a= [array([ 1.        ,  0.11111111,  0.1125    ,  0.11251758,  0.1125178 ,  0.11251781]), array([ 9.        ,  8.88888889,  8.8875    ,  8.88748242,  8.8874822 ,  8.88748219,
             9.        ]), array([ 1.,  1.,  1.,  1.,  1.,  1.])]
info= 0

See Sobre este documento... para sugerencias en cambios.