Ejemplo arrays en F90/95 El programa testarray.f90 es un ejemplo

Anuncio
Ejemplo arrays en F90/95
El programa testarray.f90 es un ejemplo sencillo de algunos detalles sobre arrays (2D)
en fortran90/95.
Listado del programa:
PROGRAM testarray
!muestra algunas maneras de escribir/leer arrays 2D
IMPLICIT NONE
! Fuerza declaracion explicita
! Declaracion variables
REAL ,dimension(4,4) :: array, interm
INTEGER :: j
!asigna 1,2,3,4 a la columna 1; 5,6,7,8 a la columna 2, etc
array=RESHAPE((/1.,2.,3.,4.,5.,6.,7.,8.,9.,10.,11.,12.,13.,14.,15.,16.
/) &
,(/4,4/))
1 format(4(1x,f4.1))
! escribe las filas 1,2,3,4 de array
write(*,*) 'Array: '
do j=1,4
write(*,1) array(j,:)
enddo
!inicializa interm por filas:
interm(1,:)=20.0
interm(2,:)=21.0
interm(3,:)=22.0
interm(4,:)=23.0
!escribe interm por orden de columnas
write(*,*) 'Interm: '
write(*,1) interm(:,:)
!transpone la matriz y vuelve a escribirla
interm=transpose(interm)
write(*,*) 'Transpose(interm): '
write(*,1) interm(:,:)
!suma las matrices
array=interm+array
write(*,*) 'Suma: '
do j=1,4
write(*,1) array(j,:)
enddo
!Termina
END PROGRAM testarray
La declaración de los arrays se hace de la forma
REAL, DIMENSION(N,M) :: var1, var2
Para inicializar arrays a valores conocidos, puede hacerse de varias maneras. Aquí se
utiliza un array constructor de la forma (/1.,2.,3., ..../). Inicializar así un array tiene el
problema de que crearía un array de una dimensión, en este caso de tamaño 16. Si no se
quiere esto, debe usarse la instrucción RESHAPE cuyo uso es de la forma:
output=RESHAPE( array1, array2)
donde array1 contiene los datos y array2 es un array de rango 1 conteniendo la
forma (shape) del array de salida output. En nuestro ejemplo, como queremos un
array de rango 2 de tamaño 4x4 escribimos array2=(/4,4/). Hay que tener
cuidado al escribir el array array1, ya que los valores se asignan en orden de
columnas, es decir, la columa 1 de la salida (array) será 1,2,3,4, etc. La matriz será
pues:
1

2
array= 
3
 4

5 9 13 

6 10 14 
7 11 15 

8 12 16 
Podemos escribir la matriz en pantalla fila a fila para visualizarla a la manera estándar
haciendo un bucle y escribiendo cada vez una columna así:
write(*,1) array(j,:)
que escribe todos los valores de la fila j con el formato especificado en 1 format.
Puesto que son 4 valores format debe escribirse en concordancia.
El array interm, también de 4x4, se inicializa por filas. Tal y como está escrito en
este ejemplo, la fila 1 consta de 4 elementos todos iguales a 20.0, etc.
A continuación se muestra otra forma de escribir una matriz en pantalla especificando la
matriz entera (interm(:,:)) pero en este caso la salida es por columnas y no por
filas como en el caso anterior.
Un ejemplo de operación con matrices es la instrucción interna de F95 TRANSPOSE
que simplemente transpone, en el sentido matemático, la matriz del argumento y la
escribe en otra matriz (que debe estar previamente declarada y dimensionada), aunque
en nuestro ejemplo, se rescribe la matriz original. Se imprime en pantalla esta salida de
nuevo por columnas:
write(*,1) interm(:,:)
El lenguaje FORTRAN 95 permite operaciones con matrices de modo directo, es decir,
sin necesidad de recorrer, usando bucles, todos los indices de las matrices. Aquí se
suman las dos matrices array y interm:
array=interm+array
El array array se rescribe en este caso. Si el resultado es otro array, debe declararse y
dimensionarse de manera consistente con la operación a realizar.
Finalmente, se imprime en pantalla el resultado de la suma, de nuevo en forma estandar
(es decir, por filas).
Cuando se ejecuta este ejemplo, la salida es la siguiente:
Array:
1.0 5.0 9.0 13.0
2.0 6.0 10.0 14.0
3.0 7.0 11.0 15.0
4.0 8.0 12.0 16.0
Interm:
20.0 21.0 22.0 23.0
20.0 21.0 22.0 23.0
20.0 21.0 22.0 23.0
20.0 21.0 22.0 23.0
Transpose(interm):
20.0 20.0 20.0 20.0
21.0 21.0 21.0 21.0
22.0 22.0 22.0 22.0
23.0 23.0 23.0 23.0
Suma:
21.0 26.0 31.0 36.0
22.0 27.0 32.0 37.0
23.0 28.0 33.0 38.0
24.0 29.0 34.0 39.0
Otras operaciones con arrays en F95 son :
SHAPE(ARRAY)
Devuelve el shape de la matriz ARRAY
Devuelve el número de elementos de
SIZE(ARRAY)
ARRAY
Devuelve el número de elementos en la
SIZE(ARRAY,DIM)
dimension DIM
Determina el estado de un array
ALLOCATED(ARRAY)
allocateado
Devuelve los límites inferiores de
ARRAY. Si DIM está ausente, devuelve
LBOUND(ARRAY,DIM)
un vector con todos los límites inferiores.
Si se especifica DIM devuelve un solo
límite inferior.
UBOUND(ARRAY,DIM)
Idem para los límites superiores
Calcula el producto escalar
DOT_PRODUCT(VECTOR_A,VECTOR_B)
deVECTOR_A por VECTOR_B
Multiplica los arrays ARRAY1 por
MATMUL(ARRAY1,ARRAY2)
ARRAY2
Devuelve la localización del valor
MAXLOC(ARRAY)
máximo en ARRAY
MAXVAL(ARRAY)
Devuelve el valor máximo en ARRAY
Devuelve la localización del valor
MINLOC(ARRAY)
mínimo en ARRAY
MINVAL(ARRAY)
Devuelve el valor mínimo en ARRAY
PRODUCT(ARRAY)
SUM(ARRAY)
TRANSPOSE(ARRAY)
Devuelve el producto de todos los
elementos del ARRAY
Devuelve la suma de todos los elementos
del ARRAY
Devuelve la matriz transpuesta de
ARRAY (rango 2)
Descargar