Cada rutina en BLAS y LAPACK se encuentra disponible en varias versiones, una para cada tipo de dato. La primera letra del nombre del subprograma indica la precisión usada:
S Precisión simple Real. D Precisión doble Real. C Precisión simple Complex. Z Precisión doble Complex.La precisión doble Comples no esta estrictamente definida en Fortran 77, pero muchos compiladores aceptarán alguna de las siguientes declaraciones:
double complex lista_de_variables complex*16 lista_de_variables
call SSCAL ( n, a, x, incx )Donde x es el vector, n es la longitud (número de elementos en x que se quieren modificar), y a es un escalar por el que se quiere multiplicar a x. El último argumento incx es el incremento. Usualmente, incx=1 y el vector x corresponde directamente a un arreglo unidimensional de Fortran. Para incx>1 este indica cuantos elementos en el arreglo serán "brincados" entre cada elemento del vector x. Por ejemplo, si incx=2 significa que se deberán escalar los elementos nones (nota: la dimensión física del arreglo x deberán ser al menos 2n-1). Considerar los siguientes ejemplos donde x ha sido declarado como real x(100).
call SSCAL(100, a, x, 1) call SSCAL( 50, a, x(50), 1) call SSCAL( 50, a, x(2), 2)La primera línea escalará los 100 elementos de x por a. La siguiente línea escalará solamente los últimos 50 elementos de x por a. La última línea escalará todos los de índice par de x por a.
Observar que el arreglo x será sobreescrito por los nuevos valores. Si se necesita preservar una copia de los valores anteriores de x, se tiene que hacer primero una copia, y para eso se puede usar SCOPY.
Ahora se considerara un ejemplo complicado. Suponer que se tienen arreglos bidimensionales A y B, y se quiere encontrar la entrada (i,j) del producto A*B. Esto es hecho fácilmente haciendo el producto interno del renglón i de A y la columna j de B. Se puede usar la subrutina SDOT de BLAS 1. La única dificultad es imaginar los índices correctos y sus incrementos. La llamada a la secuencia SDOT es
SDOT ( n, x, incx, y, incy )Suponiendo que las declaraciones de los arreglos fueron
real A(lda,lda) real B(ldb,ldb)pero en el programa se sabe que el tamaño actua de A es m*p y para B es p*n. El i-ésimo renglón de A inicia en el elemento A(i,1). Pero como Fortran almacena los arreglos bidimensionales en columnas descendentes, el siguiente elemento del renglón A(i,2) será guardado lda elementos después en la memoria (ya que lda es la longitud de una columna). Por lo tanto se pone incx = lda. Para la columna en B no hay tal problema, los elementos son guardados consecutivamente por lo tanto incy = 1. La longitud del calculo del producto interno es p. Por lo que la respuesta es
SDOT ( p, A(i,1), lda, B(1,j), 1 )
SUBROUTINE SGEMV ( TRANS, M, N, ALPHA, A, LDA, X, INCX, $ BETA, Y, INCY ) * .. Scalar Arguments .. REAL ALPHA, BETA INTEGER INCX, INCY, LDA, M, N CHARACTER*1 TRANS * .. Array Arguments .. REAL A( LDA, * ), X( * ), Y( * ) * .. * * Purpose * ======= * * SGEMV performs one of the matrix-vector operations * * y := alpha*A*x + beta*y, or y := alpha*A'*x + beta*y, * * where alpha and beta are scalars, x and y are vectors and A is an * m by n matrix. * * Parameters * ========== * * TRANS - CHARACTER*1. * On entry, TRANS specifies the operation to be performed as * follows: * * TRANS = 'N' or 'n' y := alpha*A*x + beta*y. * * TRANS = 'T' or 't' y := alpha*A'*x + beta*y. * * TRANS = 'C' or 'c' y := alpha*A'*x + beta*y. * * Unchanged on exit. * * M - INTEGER. * On entry, M specifies the number of rows of the matrix A. * M must be at least zero. * Unchanged on exit. * * N - INTEGER. * On entry, N specifies the number of columns of the matrix A. * N must be at least zero. * Unchanged on exit. * * ALPHA - REAL . * On entry, ALPHA specifies the scalar alpha. * Unchanged on exit. * * A - REAL array of DIMENSION ( LDA, n ). * Before entry, the leading m by n part of the array A must * contain the matrix of coefficients. * Unchanged on exit. * * LDA - INTEGER. * On entry, LDA specifies the first dimension of A as declared * in the calling (sub) program. LDA must be at least * max( 1, m ). * Unchanged on exit. * * X - REAL array of DIMENSION at least * ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n' * and at least * ( 1 + ( m - 1 )*abs( INCX ) ) otherwise. * Before entry, the incremented array X must contain the * vector x. * Unchanged on exit. * * INCX - INTEGER. * On entry, INCX specifies the increment for the elements of * X. INCX must not be zero. * Unchanged on exit. * * BETA - REAL . * On entry, BETA specifies the scalar beta. When BETA is * supplied as zero then Y need not be set on input. * Unchanged on exit. * * Y - REAL array of DIMENSION at least * ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n' * and at least * ( 1 + ( n - 1 )*abs( INCY ) ) otherwise. * Before entry with BETA non-zero, the incremented array Y * must contain the vector y. On exit, Y is overwritten by the * updated vector y. * * INCY - INTEGER. * On entry, INCY specifies the increment for the elements of * Y. INCY must not be zero. * Unchanged on exit. * * * Level 2 Blas routine. * * -- Written on 22-October-1986. * Jack Dongarra, Argonne National Lab. * Jeremy Du Croz, Nag Central Office. * Sven Hammarling, Nag Central Office. * Richard Hanson, Sandia National Labs. *