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)