You are on page 1of 49

Anlisis Numrico para Ingeniera

Clase Nro. 2
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 1

Programacin en FORTRAN
Tpicos Avanzados: Arreglos en FORTRAN Operaciones con Arreglos Lectura y Grabacin de Archivos Subrutinas y Funciones Programacin Modular Utilizacin de Libreras Visualizacin de Datos con GNUPlot
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 2

Arreglos
Los arreglos (Arrays) se utilizan para almacenar un conjunto de variables del mismo tipo. El espacio de memoria para almacenar los arreglos ESTATICOS es fijo y se reserva en tiempo de compilacin. FORTRAN permite la utilizacin de arreglos DINMICOS. Esto permite optimizar recursos y reservar slo la cantidad de memoria necesaria en cada momento.
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 3

Arreglos Estticos

El nmero de dimensiones de un arreglo es denominado rango (rank) y el nmero total de elementos es el tamao (size) del arreglo. La forma (shape) de un arreglo est determinada por su rango y la extensin de cada dimensin.

REAL matriz (10, 3, 2) REAL arreglo (0:9, -1:1, 4:5)


Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 4

Arreglos Dinmicos
REAL(8), ALLOCATABLE :: A(:,:), B(:) INTEGER i, j, n READ (*,*), n ALLOCATE(A(n, n), B(n)) DO i=1, n B(i) = LOG(i) DO j+1, n A(i,j) = SQRT(i+j) END DO END DO DEALLOCATE (A, B)
Ing. Francisco A. Lizarralde

Los Arreglos dinmicos se especifican como ALLOCATABLE. El espacio de memoria se reserva en tiempo de ejecucin por medio de la instruccin ALLOCATE. Dicho espacio se libera por medio de la instruccin DEALLOCATE.
5

Facultad de Ingeniera - UNMDP - 2011

Asignacin de Valores
Para referenciar a un arreglo se utiliza el nombre declarado en su definicin. La asignacin de un valor a dicho nombre significa que se asignar dicho valor a todos sus elementos.
REAL A ( 1 0 ), B( 1 0 ), C( 1 0 ) A = 3.0 B = SQRT(A) C=A+B
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 6

Referencias a un elemento
Los elementos de un arreglo se referencian por medio de subndices. Los valores de estos subndices pueden ser constantes, variables expresiones.
REAL A ( 3,3 ), B( 3,3 ), C( 89 ), R B(2, 2) = 4.5 R = 7.1 C( INT(R)*2 + 1 ) = 2.7 A(1, 2) = B( INT( C(15) ), INT(SQRT(R)))
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 7

Referencias a varios elementos


FORTRAN permite referenciar conjuntos de elementos de un arreglo. Esta caracterstica, denominada DO-IMPLICITO simplifica enormemente el cdigo.
REAL A ( 10, 10 ) INTEGER i DO i=1, 10 A(i, :) = A(i, :)/A(i,i) A(i, 4:8) = A(i, 4:8)*2 A(i, :4) = A(i, :8:2)/3.0 END DO A(:, 9) = A(:, 9) + 1
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 8

Operaciones con Arreglos

Es posible realizar ciertas operaciones sobre los elementos de un arreglo. Por ejemplo:
REAL A ( 3,3 ), B( 3,3 ), C( 3,3) A =2.7 B = 4.2 C=A+B C=A-B C=A*B C=A/B

Tener en cuenta que estas operaciones se realizan slo elemento a elemento.


9

Ing. Francisco A. Lizarralde

Facultad de Ingeniera - UNMDP - 2011

Archivos en FORTRAN
Los archivos permiten almacenar datos para que puedan ser utilizados por otros programas simplemente para resguardarlos una vez finalizado el programa que los gener y posteriormente recuperarlos fcilmente. Los archivos de texto con formato, son muy sencillos de generar y recuperar, y muchos programas son capaces de importarlos con facilidad. Adems de brindarnos la posibilidad de crearlos, examinarlos y modificarlos con un simple editor de textos.
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 10

OPEN
OPEN ( [UNIT=] unidad [, ACCESS=acceso] [, ACTION=accion] [, DELIM=delim] [, ERR=err] [, FILE=archivo] [, STATUS=estado] )

La sentencia OPEN nos permite abrir un archivo y vincularlo con un nro. de unidad de entrada-salida, para poder referenciarlo posteriormente en las operaciones de lectura grabacin. Esta sentencia permite adems especificar otras caractersticas como el tipo de archivo, la forma de acceso, etc.
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 11

OPEN
OPEN ( [UNIT=] unidad [, ACCESS=acceso] [, ACTION=accion] [, DELIM=delim] [, ERR=err] [, FILE=archivo] [, STATUS=estado] )

UNIT es el nmero de unidad que especifica el dispositivo lgico asociado (conectado) a un archivo externo fsico (existente en un medio externo). Este especificador es un nmero entero no negativo un * . Utilizar un * significa que las operaciones de lectura y/o grabacin se harn sobre los dispositivos estndar de entrada-salida, es decir, el teclado la pantalla.
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 12

OPEN
OPEN ( [UNIT=] unidad [, ACCESS=acceso] [, ACTION=accion] [, DELIM=delim] [, ERR=err] [, FILE=archivo] [, STATUS=estado] )

Es posible acceder a los archivos en forma secuencial, directa en una modalidad que permite agregar datos al final del mismo, esto se especifica por medio del parmetro ACCESS y sus posibles valores son: SEQUENTIAL, DIRECT y APPEND, respectivamente.

Ing. Francisco A. Lizarralde

Facultad de Ingeniera - UNMDP - 2011

13

OPEN
OPEN ( [UNIT=] unidad [, ACCESS=acceso] [, ACTION=accion] [, DELIM=delim] [, ERR=err] [, FILE=archivo] [, STATUS=estado] )

Un archivo puede utilizarse para lectura, grabacin para lectura-grabacin, esto se especifica por medio del parmetro ACTION, siendo sus posibles valores: READ, WRITE READWRITE.

Ing. Francisco A. Lizarralde

Facultad de Ingeniera - UNMDP - 2011

14

OPEN
OPEN ( [UNIT=] unidad [, ACCESS=acceso] [, ACTION=accion] [, DELIM=delim] [, ERR=err] [, FILE=archivo] [, STATUS=estado] )

Si un archivo se abre con STATUS=SCRATCH, el mismo se borrar despus del CLOSE. En cambio si se utiliza STATUS=REPLACE, el archivo ser creado si no existe y si existe se lo reemplazar por uno nuevo. Los archivos temporarios, son archivos que no se precisa conservarlos una vez que el programa ha finalizado, para especificarlos se utiliza el parmetro STATUS.
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 15

Instrucciones de Entrada-Salida
Las instrucciones de Entrada-Salida de FORTRAN permiten la interaccin con diversos dispositivos. Esta interaccin se realiza principalmente por medio de las instrucciones READ y WRITE. Si bien es posible utilizar la salida standard por medio de la instruccin PRINT, las instrucciones READ y WRITE, permiten una mayor flexibilidad, sobre todo en lo que se refiere al formato de los datos.
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 16

WRITE
WRITE ( [UNIT=] unidad [, FMT=] fmt] [, ERR=err]) lista de salida

La especificacin de formato es muy importante cuando se desea generar archivos de datos que puedan ser ledos por otros programas, como por ejemplo, GNUPlot.

Ing. Francisco A. Lizarralde

Facultad de Ingeniera - UNMDP - 2011

17

Grabacin de Archivos
PROGRAM grabaCoord IMPLICIT NONE INTEGER n, i REAL(8) x, y, z !Abre un archivo, si no existe lo crea, si existe lo reemplaza OPEN(UNIT=2, FILE='coordenadas',STATUS='REPLACE') WRITE (*, '(A28)', ADVANCE='NO'),'Ingrese cantidad de puntos: ' READ *, n DO i=1, n WRITE (*, '(A2, I3, A4)', ADVANCE='NO') 'X(', i, ') = ' READ *, x WRITE (*, '(A2, I3, A4)', ADVANCE='NO') 'Y(', i, ') = ' READ *, y WRITE (*, '(A2, I3, A4)', ADVANCE='NO') 'Z(', i, ') = ' READ *, z ! Graba las coordenadas en el archivo WRITE (2,'(3F15.5)') x, y, z END DO ! Cierra el archivo CLOSE (2, STATUS='KEEP') END PROGRAM
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 18

READ
READ ( [UNIT=] unidad [, FMT=] fmt] [, ERR=err][, END=endLabel]) lista de entrada

Cuando se leen datos desde un archivo es muy importante que el formato sea el adecuado. Una prctica comn, es utilizar el mismo formato con el que fueron grabados.

Ing. Francisco A. Lizarralde

Facultad de Ingeniera - UNMDP - 2011

19

CLOSE
CLOSE( [UNIT=]unidad [, STATUS =stat] [,ERR=errLabel][, IOSTAT=var] )

Siempre es conveniente cerrar un archivo, al finalizar su uso, ya que esto libera recursos del sistema. Si se desea conservar los datos es necesario utilizar el especificador STATUS=KEEP.
Facultad de Ingeniera - UNMDP - 2011 20

Ing. Francisco A. Lizarralde

Especificacin de Formato
Ejemplo 1 :
INTEGER i REAL(8) x, y OPEN (2, FILE = entrada, ACCESS = 'SEQUENTIAL') OPEN (3, FILE = salida, ACCESS = 'SEQUENTIAL', STATUS = 'REPLACE') DO i=1, 10 READ ( 2,'(2F10.4)' ) x, y WRITE (3,'(A6, F15.6, A2)' ) z = [ , sin(x)*cos(y), ] END DO CLOSE(2) CLOSE(3)
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 21

Especificacin de Formato
Ejemplo 2 :
PROGRAM grabaVector REAL(8), ALLOCATABLE :: v(:) CHARACTER*15 formato, filename INTEGER n=6 WRITE (*, '(A30)', ADVANCE = 'NO') Ingrese el nombre del archivo: READ filename WRITE (*, '(A30)', ADVANCE = 'NO') Ingrese el orden del vector: READ n ! Reserva espacio para v ALLOCATE(v(n) v=0
Ing. Francisco A. Lizarralde

! Sigue en la prxima transparencia


Facultad de Ingeniera - UNMDP - 2011 22

Especificacin de Formato
Ejemplo 2 : (Cont.)
! Especifica el formato de grabacin en una variable WRITE (formato,'(A4,I2,A2,I2,A1,I1,A1)' ) "(I5,", n+1, "F", 15, ".", 6, ")" ! Abre el archivo OPEN (2, FILE = filename, ACCESS = 'SEQUENTIAL', STATUS = 'REPLACE') DO i=1, 10 v(:n-1) =v(2:n)+SQRT(i) WRITE (2, formato) i, v END DO CLOSE (2, STATUS='KEEP') DEALLOCATE(v) END PROGRAM
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 23

Lectura de Archivos
PROGRAM leeCoord IMPLICIT NONE INTEGER n, i REAL(8) x, y, z !Abre un archivo, si no existe lo crea, si existe lo reemplaza OPEN(UNIT=2, FILE='coordenadas') DO WHILE (.TRUE.) ! Lee las coordenadas desde el archivo READ (2,'(3F15.5)', END=99) x, y, z ! Imprime las coordenadas en pantalla WRITE (*,'(3F15.5)') x, y, z END DO ! Esta sentencia se ejecuta cuando encuentra el final del archivo 99 CONTINUE ! Cierra el archivo CLOSE (2, STATUS='KEEP') END PROGRAM
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 24

Procedimientos en FORTRAN
Cuando en FORTRAN hablamos de procedimientos en forma genrica, nos estamos refiriendo tanto a subrutinas como a funciones. En este contexto, podemos diferenciar cuatro tipos de procedimientos:

EXTERNOS INTERNOS INTRINSECOS MODULARES


Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 25

Procedimientos Externos
Los procedimientos externos son funciones o subrutinas que escribe el programador y que se encuentran fuera del programa principal. Los mismos pueden almacenarse en archivos fuente separados o pueden incluirse dentro del mismo archivo del programa principal, pero a luego de la sentencia END. Los procedimientos externos pueden contener a su vez funciones y procedimientos internos, los que se situarn luego de una sentencia CONTAINS y antes del final del procedimiento.
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 26

Procedimientos Internos
Los procedimientos internos son funciones o subrutinas que se encuentran dentro del programa principal, luego de una sentencia CONTAINS. Dichas subrutinas o funciones solo pueden ser invocadas por el programa que las contiene. Por otra parte los procedimientos internos son iguales a los procedimientos externos excepto por:

Los nombres de los procedimientos internos son locales. No globales. No se puede utilizar un procedimiento interno como argumento actual al invocar a otro procedimiento.
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 27

Procedimientos Intrnsecos
Los procedimientos intrnsecos son funciones o subrutinas predefinidas por el lenguaje FORTRAN y por lo tanto son automticamente enlazados al programa. Entre otras cosas, los procedimientos intrnsecos realizan conversiones de datos y devuelven informacin sobre tipos de datos, ejecutan operaciones sobre datos numricos y caracteres, controlan el final de los archivos, ejecutan operaciones de bit, etc. HUGE(n) BIT_SIZE(i) ALLOCATED(A) CALL RANDOM_SEED
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 28

Procedimientos Modulares

Un procedimiento modular es un procedimiento declarado y definido dentro de un mdulo. El cdigo se situar luego de la sentencia MODULE y dentro de sentencias CONTAINS y END. Cualquier programa que desee acceder a los procedimientos pblicos definidos en el mdulo deber incluir la sentencia USE con el nombre del mdulo correspondiente.
Facultad de Ingeniera - UNMDP - 2011 29

Ing. Francisco A. Lizarralde

Subrutinas
SUBROUTINE nombresub [( [ lista de argumentos] )] [sentencias de declaracin] [sentencias ejecutables] END [SUBROUTINE [nombresub]]

Para invocar a una subrutina se utiliza la sentencia CALL. Una subrutina no devuelve directamente un valor. Cuando es invocada, una subrutina ejecuta el conjunto de acciones definido por sus sentencias ejecutables.
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 30

Subrutinas
Ejemplo:
SUBROUTINE Intercambio(a,b) ! Declaracion de argumentos REAL a,b ! Declaracion de variables auxiliares REAL auxi ! Cuerpo de la subrutina auxi=a a=b b=auxi END SUBROUTINE Intercambio
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 31

Subrutinas
Ejemplo de Invocacin:
PROGRAM MUESTRA INTEGER n CALL sub_A(n) PRINT *, n END PROGRAM SUBROUTINE sub_A(a) INTEGER a ... END SUBROUTINE
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 32

!llamada a la subrutina

Funciones
FUNCTION nombreFunc [( [ lista de argumentos] )] [sentencias de declaracin] [sentencias ejecutables] END [FUNCTION [nombreFunc]]

Una funcin se invoca directamente por su nombre y lista de argumentos. Una funcin devuelve directamente un valor. El valor de retorno de una funcin puede combinarse como parte de expresiones ms complejas.

Ing. Francisco A. Lizarralde

Facultad de Ingeniera - UNMDP - 2011

33

Funciones
Declaracin:
FUNCTION factorial(n) INTEGER factorial, n, aux aux = 1 DO i=2, n aux = i*aux END DO factorial = aux END FUNCTION
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 34

Funciones
Retorno de arreglos:
FUNCTION hilbert(n) INTEGER i,j,n REAL, DIMENSION(n,n) :: hilbert DO i=1, n DO j=1, n hilbert(i, j)=1.0/(i+j+1) ENDDO ENDDO END FUNCTION

Ing. Francisco A. Lizarralde

Facultad de Ingeniera - UNMDP - 2011

35

INTENT
INTENT especifica el uso intencional de los parmetros formales dentro de un procedimiento. El uso del atributo INTENT protege de acciones no buscadas. Si el argumento es INTENT(IN), puede suministrarse una expresin o constante del tipo requerido en el parmetro actual. Si este es INTENT(OUT) o INTENT(INOUT), se debe suministrar una variable en el parmetro actual.
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 36

INTENT
Ejemplos de declaracin:
SUBROUTINE intercambio (a, b) INTENT (INOUT) :: a, b .......

SUBROUTINE inversa(A,singular) REAL, DIMENSION(:,:), INTENT (INOUT) :: A LOGICAL;INTENT(OUT) :: singular ........


Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 37

Mdulos
Los mdulos son archivos de cdigo que contienen funciones y subrutinas ya compiladas, las cules pueden ser invocadas desde el programa principal.

Ing. Francisco A. Lizarralde

Facultad de Ingeniera - UNMDP - 2011

38

Mdulos (I)
MODULE matrixFunctions IMPLICIT NONE CONTAINS SUBROUTINE creaMatrizIdentidad(orden, matriz) !Crea una matriz identidad REAL(8), ALLOCATABLE :: matriz(:,:) INTEGER :: i, orden IF (ALLOCATED(matriz)) THEN DEALLOCATE(matriz) ENDIF ! Crea la matriz ALLOCATE(matriz(orden,orden)) !Inicializa la matriz matriz = 0 DO i=1, orden matriz(i,i) = 1 ENDDO
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 39

Mdulos (II)
SUBROUTINE imprimeMatriz(a) !Imprime la Matriz REAL(8) a(:,:) INTEGER i,j,cantFilas, cantCols cantFilas = SIZE(a,DIM=1) cantCols = SIZE(a,DIM=2) DO i=1,cantFilas DO j=1,cantCols WRITE (*,'(F12.4)', ADVANCE='NO') a(i,j) ENDDO WRITE (*,*) ENDDO END MODULE
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 40

Mdulos (III)
Declaracin de mdulos en Programa Principal:
PROGRAM matrices !Modulos utilizados USE matrixFunctions IMPLICIT NONE ! Codigo del Programa principal ... END PROGRAM

Ing. Francisco A. Lizarralde

Facultad de Ingeniera - UNMDP - 2011

41

Bibliotecas de cdigo (Libraries)


Una forma muy difundida de reutilizacin de cdigo, es la utilizacin de bibliotecas de funciones y sub-rutinas especficas. FORTRAN, es tal vez, uno de los lenguajes que posee la mayor cantidad de bibliotecas de funciones y sub-rutinas para la resolucin de problemas relacionados con mltiples reas de la matemtica, la ciencia y la ingeniera. Ms informacin en http://www.netlib.org/lapack y http://www.netlib.org/blas
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 42

Utilizacin de Libreras
PROGRAM triDiag ! Resuelve un sistema tri-diagonal IMPLICIT NONE INTEGER, PARAMETER :: n=3 REAL(8), DIMENSION(n) :: lD, dD, uD, x INTEGER INFO CALL ingVec(lD, "Diagonal Inferior ") CALL ingVec(dD, "Diagonal Principal ") CALL ingVec(uD, "Diagonal Superior ") CALL ingVec(x, "Terminos Independientes") CALL DGTSV( n, 1, lD, dD, uD, x, n, INFO ) PRINT *, "La solucion es: ", x CONTAINS ! Sigue en la prxima transparencia
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 43

Utilizacin de Libreras
SUBROUTINE ingVec(vec, title) ! Ingresa vector REAL(8) vec(:) INTEGER i,n CHARACTER*22 title CALL SYSTEM("clear") PRINT *, "Ingrese ", title n=SIZE(vec) DO i=1, n WRITE(*,'(A10, I2, A4)', ADVANCE='NO') "Elemento (", i, " ): " READ (*,*) vec(i) ENDDO END SUBROUTINE END PROGRAM
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 44

Invocacin a programas externos

Para invocar a un programa externo, se utiliza la subrutina intrnseca SYSTEM. Por ejemplo: CALL SYSTEM ("clear") Invoca al programa clear del Sistema Operativo para borrar la pantalla.

Ing. Francisco A. Lizarralde

Facultad de Ingeniera - UNMDP - 2011

45

GNUPLOT
GNUPlot es un programa de visualizacin de datos, el cul puede utilizarse de forma interactiva, por medio de un script. Un script es un archivo con un conjunto de instrucciones que son interpretadas por el GNUPlot para realizar un grfico determinado. Los scripts permiten generar visualizaciones de datos de gran calidad, en forma muy sencilla.
Ing. Francisco A. Lizarralde Facultad de Ingeniera - UNMDP - 2011 46

Ejemplo de Script (I)


set autoscale unset log unset label set xtic auto set ytic auto # escala los ejes automaticamente # quita la escala logaritmica # quita los titulos anteriores # establece las divisiones del eje x # establece las divisiones del eje y

set title "Valores de la Funcin" set xlabel "Tiempo" set ylabel "f(x)" plot "misDatos.dat" using 1:2 title 'Seno(x)' with lines

Ing. Francisco A. Lizarralde

Facultad de Ingeniera - UNMDP - 2011

47

Grfico combinando dos archivos


Archivo experimento.dat Archivo prueba.dat

Ing. Francisco A. Lizarralde

Facultad de Ingeniera - UNMDP - 2011

48

Ejemplo de Script (II)


set autoscale unset log unset label set xtic auto set ytic auto # escala los ejes automaticamente # quita la escala logaritmica # quita los titulos anteriores # establece las divisiones del eje x # establece las divisiones del eje y

set title "Variacin de la Temperatura" set xlabel "Tiempo" set ylabel "Temperatura" plot "experimento.dat" using 1:2 title 'Componente 1' with lines,\ "experimento.dat" using 1:3 title 'Componente 2' with points ,\ "prueba.dat" using 1:2 title 'Componente de Control' with lines

Ing. Francisco A. Lizarralde

Facultad de Ingeniera - UNMDP - 2011

49

You might also like