Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programas Fortan 1
Programas Fortan 1
SUBPROGRAMAS INTERNOS
Hay dos tipos de subprogramas: funciones y subrutinas. Primero veremos las
funciones. Ya hemos visto cómo utilizar algunas de las funciones intrínsecas que
proporciona Fortran 90, como SIN, COS, LOG, etc. Puede escribir sus propias
funciones, para usarlas de la misma manera en un programa.
EJEMPLO 1:
program RaizNewton
implicit none
if (Converged) then
print*, 'Newton converged'
else
print*, 'Newton diverged'
end if
contains
function F(X) ! subprograma F(X)
! problem is to solve f(x) = 0
real F, X
F = X ** 3 + X - 3
end function F
function DF(X) ! subprograma F(X)
! first derivative of f(x)
real DF, X
DF = 3 * X ** 2 + 1
end function DF
end program
****************************************************************************
Ejemplo 2:
¿Algo errado?
program factorial
implicit none
integer i
do i = 1, 10
print*, i, fact(i)
end do
contains
function fact( n )
integer fact, n, temp
temp = 1
do i = 2, n
temp = i * temp
end do
fact = temp
end function
end
¡Corregido!
program factorial
implicit none
integer i
do i = 1, 10
print*, i, fact(i)
end do
contains
function fact( n )
integer fact, n, temp
integer i ! declarar de nuevo i dentro de la función fact()
temp = 1
do i = 2, n
temp = i * temp
end do
fact = temp
end function
end
SUBRUTINAS INTERNAS
Las subrutinas son muy similares a las funciones. Las diferencias son:
• No hay ningún valor asociado con el nombre de una subrutina, por lo que no debe
declararse.
• Se invoca una subrutina con una instrucción CALL.
• La palabra clave SUBROUTINE se usa en la definición y la instrucción END.
• Una subrutina no necesita tener argumentos, en cuyo caso el nombre se escribe sin
paréntesis, p. ej.
CALL PLONK
SUBPROGRAMAS EXTERNOS
Un subprograma externo reside en un archivo separado del programa principal. Por lo
general, realizará una tarea específica, y es externo para ser accesible a muchos
programas de llamada diferentes. Aparte del encabezado y la sentencia END, un
subprograma es idéntico en apariencia a un programa:
Tenga en cuenta las diferencias pequeñas pero significativas entre los subprogramas
internos y externos:
• los subprogramas externos pueden contener ellos mismos subprogramas internos
(que solo serán accesible al subprograma externo mismo); Los subprogramas internos
no pueden contener subprogramas internos
• la palabra clave FUNCTION o SUBROUTINE es opcional en la instrucción END del
subprograma externo, pero obligatoria en la instrucción END del subprograma interno.
los nombres de todos los subprogramas externos deben especificarse en un
EXTERNAL
declaración, que debe ir después de cualquier declaración USE (Sección 8.5) o
IMPLÍCITA. Nombrar un subprograma externo como este asegura que está vinculado
como un subprograma externo, y hace que cualquier subprograma intrínseco con el
mismo nombre no disponible. Esta práctica se recomienda encarecidamente.
BLOQUES DE INTERFASE
Si el compilador va a generar llamadas a subprogramas correctamente, necesita saber
ciertas cosas sobre el subprograma: nombre, número y tipo de argumentos, etc. Esta
colección de información se llama la interfaz del subprograma. En el caso de
subprogramas intrínsecos, subprogramas internos y módulo subprogramas, la interfaz
siempre es conocida por el compilador, y se dice que es explícita.
MODULOS
Recuerde que hay tres tipos de unidad de programa: un programa principal, un
subprograma externo y un módulo.
Un módulo se diferencia de un subprograma en dos aspectos importantes:
• un módulo puede contener más de un subprograma (llamado subprograma de
módulo);
• un módulo puede contener declaraciones y sentencias específicas que son
accesibles para todas unidades de programa que utilizan el módulo.
Los módulos también se compilan por separado.
USE MyUtils
IMPLICIT NONE
REAL A, B
READ*, A
B = Pi
CALL SWOP( A, B )
PRINT*, A, B
END
MODULE MyUtils
REAL, PARAMETER :: Pi = 3.1415927
CONTAINS
SUBROUTINE SWOP( X, Y )
REAL Temp, X, Y
Temp = X
X=Y
Y = Temp
END SUBROUTINE SWOP
END MODULE MyUtils
MODULE name
[declaration statements]
[CONTAINS
module subprograms]
END [MODULE [name]]
SOLUCION DE ECUACIONES LINEALES
Escriba los coeficientes del lado izquierdo como una matriz, con las constantes del
lado derecho como un vector unido a la matriz, separados por una línea vertical, así:
Esto es simplemente una abreviatura del conjunto original y, a veces, es una matriz
incrementada llamada matriz aumentada del sistema. Siempre que realicemos solo
operaciones de fila en los números, podemos omita los símbolos x, y y z cada vez.
Nos referiremos a la matriz aumentada como A.
Ahora toma la fila de destino R3. Para reducir a31 a cero con una operación que
involucra la fila pivote R1 requiere reemplazar la fila de destino por sí misma menos la
fila de pivote multiplicada por a31 (¡teniendo en cuenta para la subsiguiente solución
informática que esta operación puede cambiar el valor de a31 en sí mismo!):
Ahora designamos R2 como la fila de pivote y el nuevo a a22 como el elemento de
pivote. El conjunto El procedimiento se repite, excepto que las filas de destino ahora
son R1 y R3, y el objeto es obtener ceros en estas dos filas por encima y por debajo del
elemento pivote. El resultado es:
Ahora tome R3 como fila pivote, con el nuevo a33 como elemento pivote y R 1 y R2 como
objetivo. filas. Después de repetir operaciones similares en ellos, la matriz finalmente
se ve así:
La solución es: x = 1, y = 0, z = 2.