You are on page 1of 6

1

Matematicas - Curso 2007/08 - Metodos Numericos I


Pr
acticas de FORTRAN - SESION 3

SUBPROGRAMAS: FUNCIONES y SUBRUTINAS

En un mismo programa, muchas veces necesitamos repetir una serie de sen-


tencias iguales pero con distintos valores de las variables; o utilizar una serie de
sentencias iguales en distintos programas y con distintos valores para las variables.

Los subprogramas son una serie de sentencias que forman una unidad que puede
ser llamada desde un programa principal o desde otro subprograma.

Un programa ejecutable consta de un u


nico programa principal (el que empieza
por la sentencia PROGRAM y termina en END) al que se le pueden a nadir todos
los subprogramas que queramos.

Los subprogramas se pueden definir en el mismo fichero que el programa prin-


cipal, o en otro u otros ficheros diferentes. En el caso del VISUAL FORTRAN,
todos los ficheros deben asociarse al mismo proyecto.

El FORTRAN nos proporciona dos formas de definir subprogramas.

EXTERNA
FUNCION

Es como una funcion intrnseca, pero definida por nosotros.


Las funciones pueden tener uno o mas valores de entrada, pero devuelven un
solo valor almacenado en el nombre de la funcion. La forma de definirla es:

[TIPO] FUNCTION NOMBRE(<lista de argumentos de entrada>1 )


...
NOMBRE= ...
RETURN
END
Llamada desde el programa principal (o desde otro subprograma):
VAR= NOMBRE(<lista de argumentos de entrada>2 )
FacMat - Curso 2007/08 - Metodos Numericos I - Practicas de FORTRAN - Sesion 3 2

TIPO: Tipo de la variable NOMBRE (INTEGER, REAL, etc.)


<lista de argumentos de entrada>1 = lista de argumentos de entrada ficticios.
<lista de argumentos de salida>2 = lista de argumentos de entrada reales.

N
umero de argumentos1 = Numero de argumentos2
Tipo de argumentos1 = Tipo de argumentos2

Observaciones:
Una funcion externa no puede llamarse a s misma, ni directa ni indirecta-
mente.
No deben modificarse los argumentos de entrada dentro de la funcion externa.
Si no se define el TIPO, el valor devuelto sera del mismo tipo que NOMBRE
(regla por defecto seg
un sea la letra inicial de NOMBRE).

Ejemplo: Funcion externa que calcula el maximo valor absoluto de dos


valores.
REAL FUNCTION MAXAB(a,b)
REAL a,b
MAXAB=abs(a)
IF(ABS(b).GT.MAXAB) MAXAB=abs(b)
RETURN
END

PROGRAM ejemplo
REAL X,Y,MAXAB
PRINT*, x,y ?
READ*,x,y
PRINT*, El maximo en valor absoluto es: ,MAXAB(x,y)
END
FacMat - Curso 2007/08 - Metodos Numericos I - Practicas de FORTRAN - Sesion 3 3

Variables dimensionadas en la FUNCION EXTERNA:

Si se pasa como argumento un array de una dimension (vector), basta con


pasar tambien como argumento la dimension que realmente se utiliza y dimen-
sionar el array en la FUNCTION a este valor.

Ejemplo: Funcion que calcula el maximo en valor absoluto de un vector.


REAL FUNCTION MAXVEC(M,A)
INTEGER M
REAL A(M)
c
MAXVEC=abs(A(1))
DO i=2,M
IF(ABS(A(i)).GT.MAXVEC) MAXVEC=abs(A(i))
ENDDO
RETURN
END

PROGRAM ejemplo
INTEGER N
REAL X(10),MAXVEC
PRINT*, Numero de componentes: ?
READ*,N
PRINT*, Componentes del vector ?
READ*, (X(i),i=1,N)
PRINT*, El maximo en valor absoluto es: ,MAXVEC(N,X)
END
FacMat - Curso 2007/08 - Metodos Numericos I - Practicas de FORTRAN - Sesion 3 4

Si se pasa como argumento un array de mas de una dimension, en la FUNC-


TION hay que dimensionar este array a estas mismas dimensiones (que se pueden
o no pasar como argumentos). Las dimensiones que realmente se utilizan se pasan
como argumentos de entrada.

Ejemplo: Funcion que calcula el maximo en valor absoluto de los elementos


de una matriz.
REAL FUNCTION MAXMATRIZ(D1MAX,D2MAX,D1,D2,A)
INTEGER D1MAX,D2MAX,D1,D2
REAL A(D1MAX,D2MAX)
MAXMATRIZ=0.
DO i=1,D1
DO j=1,D2
IF(ABS(A(i,j)).GT.MAXMATRIZ) MAXMATRIZ=abs(A(i,j))
ENDDO
ENDDO
RETURN
END

PROGRAM ejemplo
INTEGER N,M
REAL X(10,10),maximo,MAXMATRIZ
PRINT*, Numero de filas, columnas: ?
READ*,N,M
.... Se leen los elemntos de la matriz (X(i,j),i=n),j=M)
maximo=MAXMATRIZ(10,10,N,M,X)
PRINT*, El maximo en valor absoluto es: ,maximo
END
FacMat - Curso 2007/08 - Metodos Numericos I - Practicas de FORTRAN - Sesion 3 5

Cuando se necesita que el subprograma devuelva al programa de llamada mas


de un valor, es necesario usar otro tipo de subprograma llamado SUBRUTINA.
SUBRUTINA
Programa autocontenido que puede ejecutarse tanto desde el programa prin-
cipal como desde otra subrutina o funcion externa. La forma de definir una
subrutina es:
SUBROUTINE NOMBRE(<lista de argumentos E/S>1 )
..
.
RETURN
END

Llamada desde el programa principal o desde otro subprograma:


....
CALL NOMBRE(<lista de argumentos E/S>2 )
....

<lista de argumentos E/S>1 = lista de argumentos de entrada/salida ficticios.


<lista de argumentos E/S>2 = lista de argumentos de entrada/salida reales.

N
umero de argumentos1 = Numero de argumentos2
Tipo de argumentos1 = Tipo de argumentos2
- Una subrutina no puede llamarse a s misma, ni directa ni indirectamente.
- No deben modificarse los argumentos de entrada dentro de la subrutina. Para
proteger estos valores.
- Las reglas para pasar variables dimensionadas son las mismas que para la
funcion externa.
FacMat - Curso 2007/08 - Metodos Numericos I - Practicas de FORTRAN - Sesion 3 6

Ejemplo: Subrutina que multiplica dos matrices.


SUBROUTINE MULMATRIZ(D1MAX,D2MAX,M,L,N,A,B,C)
INTEGER D1MAX,D2MAX,M,N,L
REAL*8 A(D1MAX,D2MAX),B(D1MAX,D2MAX),C(D1MAX,D2MAX)
REAL*8 suma
DO I=1,M
DO j=1,L
suma=0.d0
DO k=1,N
suma=suma+a(i,k)*b(k,j)
ENDDO
c(i,j)=suma
ENDDO
ENDDO
RETURN
END

Programa principal
PROGRAM ejemplo
REAL*8 X(10,10),Y(10,10),XY(10,10)
INTEGER F1,C1F2,C2
.... Leemos F1,C1F2,C2 (Filas de X, Columnas de X = Filas de Y,
Columnas de Y)
... Leemos la matrix X y la matriz Y
CALL MULMATRIZ(10,10,F1,C2,C1F2,X,Y,XY)
... En (XY(i,j),I=1,F1),j=1,C2) esta la matriz producto
END

Practica 4: Transformar la practica 3 para que tanto la lectura de matrices


como la multiplicacion de matrices se haga en subrutinas.

You might also like