MÓDULO DE PROCEDIMIENTOS Los módulos también pueden contener subrutinas y funciones → MÓDULO DE PROCEDIMIENTOS PROCEDIMIENTOS → son compilados como parte del modulo. Se ponen disponible a través de USE Están precedidos por CONTAINS → Le indica al compilador que siguen sentencias de procediendo. Ej: MODULE mi_sub (declaración de los datos) REAL, …………… ……………………. CONTAINS SUBROUTINE sub (a, b, c, x, error) IMPLICIT NONE REAL, DIMENSION (3), INTENT(IN) : : a REAL, INTENT(IN) : : b, c REAL, INTENT(OUT) : : x LOGICAL, INTENT(OUT) : : error ………… END SUBROUTINE sub La subrutina incluida en el modulo puede ser usada con el CALL Ej PROGRAM prog_principal USE mi_sub IMPLICIT NONE ………………… CALL sub(a, b, c, x, error) ……………………. END PROGRAM prog_principal FUNCIONES FORTRAN es un procedimiento cuyo resultado es un número, un valor lógico, un texto, o un arreglo. Las funciones pueden ser → Funciones intrínsecas Funciones definidas por el usuario o Subprograma función FUNCTION nombre (lista_argumentos) … Sección de declaración …. Sección de ejecución … nombre = expresión RETURN END FUNCTION [nombre] En la FUNCTION es obligatorio poner el nombre El nombre en el END FUNCTION es opcional Cuando la ejecución se encuentra con RETURN o END FUNCTION ésta vuelve al programa principal → el RETURN es opcional El nombre de la función debe aparecer del lado izquierdo a menos que aparezca en una sentencia de asignación. La función puede no necesitar argumentos, pero igualmente los paréntesis tienen que figurar. Ya que la función da como resultado un valor es necesario signarle un tipo a la función. Si se usa IMPLICIT NONE se debe declarar el tipo de variable en la función y en el llamado a la función Si no se usa IMPLICIT NONE usa las reglas del FORTRAN a menos que se declare el tipo. Ej INTEGER, FUNCTION mi_función(i, j) o FUNCTION mi_función(i, j) INTEGER : : mi_función REAL, FUNCTION cuad( x, a, b, c) ! Propósito: evaluar la ecuación cuadrática ! cuad= a* x**2 + b * x +c ! IMPLICIT NONE ! Diccionario y declaración de variables REAL, INTENT(IN) : : x ! Valor para evaluar la ec. REAL, INTENT(IN) : : a ! Coeficiente de x**2 REAL, INTENT(IN) : : b ! Coeficiente de x REAL, INTENT(IN) : : c ! Coeficiente independiente ! ! Evaluar a* x**2 + b * x +c cuad= a* x**2 + b * x +c ! END FUNCTION cuad PROGRAM ejemplo_fun ! ! Proposito: ver como se trabaja con FUNCIONES ! IMPLICIT NONE ! Diccionario y declaración de variables REAL : : cuad REAL : : x, a, b, c WRITE (*, *) “Entre los coeficientes de la ec. cuadratica” READ( *, * ) a, b, c WRITE (*, *) “Entre el valor para el cual quiere calcular la ec cuadratica” READ (*, *) x ! ! Escribo el resultado WRITE ( *, *) “ El resuldao es:”, cuad(x, a, b, c) END PROGRAM ejemplo_fun ! Escribo el resultado Pepe= cuad(x, a, b, c) WRITE ( *, *) “ El resuldao es:”, pepe ! Definir en la función y en el programa principal cual es el tipo de variable que resulta. Los valores de entrada pasan a la función a través de los argumentos de entrada y la manera de pasarlos es apuntar a su lugar en la memoria como las subrutinas. ! Una FUNCTION bien definida debe producir un solo valor de salida de acuerdo con los valores de entrada. Nunca se deben modificar(dentro de la función) los argumentos de entrada. Para asegurarse de que esto no ocurre accidentalmente usar el atributo INTENT(IN) Ej Calcular la la funcion sinc( x ) = sin( x )/x Es función es calculable fácilmente salvo en 0 o en su entorno, donde: sinc(x) = lim sin(x)/x =1 x→0 1. Escribir una función FORTRAN que calcule sinc(x) 2. Definir las entradas y salidas La entrada de la función es un número real . La función da un resultado real 3. El algoritmo |x|>Epsi si sinc( x ) = sin( x )/x no sinc( x ) = 1 Epsi puede ser por ej 1.0e-30 4. Paso a lenguaje FORTRAN FUNCTION sinc(x) ! Propósito: Calcular la sinc( x ) = sin( x )/x IMPLICIT NONE ! Diccionario y declaración de variables REAL, INTENT (IN): : x REAL : : sinc REAL, PARAMETER : : Epsi= 1.0e-30 IF (abs(x)>Epsi) THEN Sinc= sin(x)/x ELSE Sinc=1 END IF END FUNCTION sinc 5. Verificar la función Construir un programa para la verificación PRGRAM verificación ! Propósito: verificar la función sinc IMPLICIT NONE ! Diccionario y declaración de variables REAL : : x ! variable de entrada REAL : : sinc ! Función ! Leo WRITE(*,*) “Entre x” Read(*;*) x ! Imprimo WRITE(*,*) “sinc(x)=” sinc END PRGRAM verificación Ahora pruebo con los valores: x Sinc(x) 0 1.00000 10-29 1.00000 π/2 0.63662 π 0.00000