Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Jesus GuiaFortran00 PDF
Jesus GuiaFortran00 PDF
Facultad de Ingeniera
Departamento de Ingeniera Mecnica y Mecatrnica
Modelacin matemtica
Sem I - 2014
1. Introduccin
El objetivo del presente documento es proporcionar una gua rapida para el uso de Fortran 90/95,
para los estudiantes de Modelacin Matemtica de la Universidad Nacional de Colombia. El documento
est basado en un curso virtual de la Universidad de Warwick (UK) 1 . No pretende ser una referencia
completa, y por lo tanto cuando se requiera mayor claridad sobre cualquier tpico particular se debe
consultar la respectiva bibliografa especializada.
Fortran es un lenguaje de propsito general, pero principalmente orientado a la computacin cientfica.
Su principal fortaleza se centra en la realizacin eficiente de clculos matemticos y numricos para
uso y aplicacin en diferentes reas de la ciencia y la ingeniera. Fortran es un acrnimo de FORmula
TRANslator, originalmente escrito simplemente como FORTRAN. Fortran fu uno de los primeros
lenguajes de programacin de alto nivel. El desarrollo de Fortran empieza en la dcada de 1950 en
IBM y han habido varias versiones desde entonces. Por convencin, y como medio de identificacin, las
versiones de Fortran se distinguen por los dos ltimos dgitos del ao en que se propuso la estandarizacin
respectiva. De esta forma se tienen:
Fortran 66
Fortran 77
Fortran 90 (95)
Fortran 2000
Fortran es un lenguaje de programacin dominante usado en muchas aplicaciones de ingeniera y mate-
mticas, por lo que es importante que se tengan bases para poder leer y modificar cualquier cdigo de
Fortran. Algunas opiniones de expertos han dicho que Fortran ser un lenguaje que pronto decaer en
popularidad y se extinguir, lo que no ha sucedido todava. Una de las razones para esta supervivencia
es la inercia del software, ya que una vez que una compaa ha gastado muchos millones de dlares y
de aos en el desarrollo de software, no le es conveniente traducir el software a un lenguaje diferente,
por el costo que implica y por ser una tarea difcil y laboriosa.
1
http://www2.warwick.ac.uk/fac/sci/csc/teaching/modules/cy900/current/session2/fortran/introduction/
2. Formato de Cdigo
La estructura bsica de un programa en Fortran 90 (F90) con mdulos y funciones2 definidas como
unidades internas y dentro del mismo archivo fuente, se indica en la siguiente esquema:
Cdigo ejemplo
module1
module2
program nameOfProgram
use module1
use module2
implicit none
constant/variable declarations
parameter declarations
data declarations
body of program
contains
function1
function2
end program nameOfProgram
Cdigo ejemplo
module moduloA (parametros)
contains
La estructura de una funcin es muy similar, pero no incluir declaraciones del tipo contains. En tal
caso slo se reemplaza la palabra reservada module por function.
2
Ms adelante se discutir en detalle como se definen mdulos y funciones en F90
A continuacin encontrar el primer cdigo trivial a realizar usando Fortran. Este cdigo incluye una
salida a la terminal. Usando un editor de texto cree un archivo nuevo llamado hello.f90, y a continuacin
escriba el siguiente texto,
program hello
implicit none
! Este es un comentario
! Este programa escribe "hello world" en la terminal
print*, "hello world!"
end program hello
Una vez escrito el anterior texto, guarde el archivo y cierre el editor.
El archivo anterior es simplemente el cdigo fuente. Ahora se debe compilar este cdigo usando otro
programa denominado compilador. En el prompt de su terminal de trabajo escriba:
Si no existe ningn error, se crear un archivo ejecutable llamado hello. Este archivo binario, o ejecutable,
est listo para ser ejecutado desde la terminal. Para ejecutarlo escriba en el prompt de su terminal:
user@prompt:$ ./hello
3. Variables y constantes
Para declarar constantes o variables en F90, se debe declarar el tipo de variable. En F90 solo hay cuatro
tipos bsicos de variables, as saber:
Tipo dato Ejemplo
character x o "x"
integer 365
real 2.718 o 1.4E-03
complex (2.0,3.5)
En F90 las variables deben ser declaradas en el cdigo antes de ser usadas. La sintaxis de declaracin
empieza con el tipo, seguido del smbolo ::, y a continuacin por una lista de una o ms variables,
cada una separada por una coma. Ejemplo:
Cdigo ejemplo
integer :: big,small,medium
Esta sentencia declara tres variables del tipo entero, llamadas "big", "small", y "medium".
Existen restricciones en los nombres que se pueden usar para declarar variables en F90:
Nombres de variables debern siempre empezar con una letra del alfabeto.
Slo en el caso de nombres de archivo o links en linux, puede haber un espacio en el nombre de
las variables. En F90 los nombres de variables NO pueden tener espacios, pero se puede usar el
guion bajo (underscore).
Evite el uso de caracteres especiales.
F90 no distingue entre maysculas y minsculas, as que los nombres de variables ELEMENT,
Element y element harn referencia a la misma variable.
Las variables tambien pueden tener asignados valores por defecto al tiempo de su declaracin,
slo use un signo igual en este caso, ejemplo:
Ejemplo de prctica
En el siguiente ejemplo, edite el cdigo existente para incluir algunas declaraciones. Siga como ejemplo
el siguiente cdigo:
program hello
implicit none
integer :: special
character(len=12) :: name = organa
special = 5
IMPORTANTE!!!
Palabras reservadas:
Usted debe asegurarse de que ninguno de sus nombres de variables o constantes sean textos como
integer, real, character, etc. Claramente estos son palabras reservadas en F90 y tienen un pro-
psito especial.
4. Entrada y salida
Usted ya habr visto cmo podemos hacer que F90 obtenga una salida de informacin en formato libre,
usando print. La sintaxis de la sentencia print es la siguiente:
Cdigo ejemplo
print*, your_data
Usted ya ha visto en uno de los ejemplos anteriores que para imprimir un texto ms el valor de una
variable entera, haba que incluir una lnea como: print*,special.
Ejemplo de prctica
Suponga que usted desea imprimir cuatro variables reales en una lnea, pero presentando cada nmero
con 4 posiciones decimales. Si se tratara de imprimir tales nhumeros usando la instruccin de formato
de impresin libre (por ejemplo, vase el fragmento de cdigo ms adelante) Qu pasa?
Cdigo ejemplo
a1 = 5.67893454
a2 = 4.65124454
a3 = 10.2342454
a4 = 539.40405324
print*,a1,a2,a3,a4
Aunque la salida se ve ordenada, vale la pena notar que cada entrada ocupa 8 espacios, con diferente
nmero de decimales.
Puede cambiar esta presentacin utilizando una instruccin de formato. Para ilustrar esto, pruebe el
siguiente fragmento de cdigo:
Cdigo ejemplo
a1 = 5.67893454; a2 = 4.65124454
a3 = 10.2342454; a4 = 539.40405324
3 format(f10.5,f10.5,f10.5,f10.5)
write(*,3) a1,a2,a3,a4
Note que cuando se le d formato a la salida, la sentencia write se utiliza en lugar de print. Debera
tambin notar que print/write enviara una salida de forma estndar, es decir a la trminal X, o a un
archivo si ha redireccionado la salida.
Si quiere enviar los datos de salida a un archivo especfico, tiene que hacer pocos cambios en su cdigo
(esto se indicar ms adelante).
La instruccin format en el ejercicio anterior contiene entradas llamadas descriptores de edicin (edit
descriptors). Los descriptores de edicin en este ejemplo imprimirn cada nmero usando un total de 10
espacios, pero con 4 decimales c/u. Los descriptores de edicin en esta declaracin de formato contienen
repeticin. En este caso se podra escribir la instruccin format de manera ms compacta como:
Cdigo ejemplo
3 format(4f10.5)
En F90 existen comandos que son la contraparte a los previamente discutidos print/write. Uno de
ellos es read, el cual puede ser usado para leer o adquirir datos, bien sea desde la terminal o desde un
archivo.
En los siguientes ejemplos consideraremos la lectura de datos desde la entrada estndar (es decir,
mediante teclado en la terminal o desde algn archivo de datos usando re-direccionamiento). Este
comando puede operar usando formato libre o formato definido (como en los casos anteriores). La
sintaxis general del formato libre de lectura read es el siguiente:
Cdigo ejemplo
! Esta cdigo de ejemplo permite la lectura desde terminal
! sin ningn formato definido, es decir en formato libre
read*, your_data
Ejemplo de prctica
En este ejemplo usted escribir un cdigo que leer algn texto desde el teclado (la terminal) y lo
imprimir de nuevo en la terminal. En un archivo .f90 escriba el siguiente pedazo de cdigo:
program getname
implicit none
character(len=100) :: name
Compile y corra este cdigo como se indic anteriormente (use ifort o gfort, segn el compilador
disponible en su sistema). Qu pasa si se escribe un nombre con un espacio? Qu pasa si escribe este
nombre entre comillas?
Al igual que con la instruccin write, la instruccin read puede ser modificada para leer datos con
formato. Los descriptores de formato para el comando read son muy similares a los del comando write,
y pueden ser consultados en cualquier gua o libro de F90.
La forma en la que se pueden obtener datos de entrada desde enviar datos de salida hacia un archivo
especfico (en lugar de la interaccin con teclado a travs de la terminal) son un poco diferentes.
Primero debe abrir el archivo con la instruccin open. La declaracin open especifica el nmero de
unidad del archivo (un identificador interno para fortran), el nombre del archivo y el estado del archivo
(nuevo/existente/desconocido3 .
Cuando usted necesite enviar datos al archivo definido con la instruccin for, se debe indicar el nmero
de la unidad al comando write. Finalmente, el archivo debe cerrarse con una declaracin close. Para
mayor ilustracin pruebe el siguiente ejemplo,
3
Obviamente, estos identificadores de estado deben ser ingresados en ingls, es decir como new,old,unknown
Ejemplo de prctica
En este ejemplo usted crear un cdigo que va a leer un nombre e imprimir la salida a un archivo
llamado myname.txt. Cambie alguno de sus archivo existentes .f90 de manera que sea igual al siguiente
ejemplo.
program getname
implicit none
! Declaracion de variables
character(len=100) :: name
! Finalice programa
end program getname
Compile este cdigo. Corra el cdigo para ver si funciona. Abra el archivo myname.txt, y verifique
su contenido. Que aparece impreso en el archivo myname.txt? Que pasa si corre el cdigo otra vez
inmediatamente?
5. Operadores
Los operadores en Fortran son utilizados para manipular y comparar variables y constantes.
Estos pueden ser aplicados a numros reales y enteros. Los operandos pueden ser enteros, numros
reales o una mezcla de los dos. Los operadores se resumen a continuacin:
Adicin +
Substraccin -
Multiplicacin *
Divisin /
Potenciacin **
S los operandos, para cualquiera de los operadores indicados son dos enteros, el resultado ser tambin
un entero; si al menos uno de los operandos es un numero real, el resultado ser un numero real.
Ejemplo de prctica En ste ejemplo usted escribirun cdigo para realizar diferentes operaciones
aritmticas con diferentes valores. Siga el ejemplo ilustrado en el siguiente cdigo.
program getname
implicit none
user@prompt:$
the result of 22/4 is 5
the result of 22.0/4.0 is 5.500000
the result of 15/4*4.0 is 12.000000
Para comparar dos variables o constantes en F90 se utilizan operadores comparativos. Estos operadores
retornan un valor de 0 o 1, con 0 significando que la declaracin o afirmacin es falsa, y 1 significando
que es verdadera. Los operadores se resumen a continuacin4 :
Igualdad .eq. ==
Inigualdad .ne. /=
Menor a .lt. <
Mayor a .gt. >
Menor o igual a .le.
Mayor o igual a .ge.
Los operadores comparativos son muy tiles a la hora de tomar decisiones o en el momento de hacer
declaraciones de control (lo que se ver ms adelante).
Algo para tener en cuenta: No utilice estos operadores para comparar directamente dos numros reales,
buscando igualdad. Debido la forma en que los computadores tratan a los numros reales es mejor
definir una tolerancia y entonces verificar si la diferencia absoluta es menor que la tolerancia definida,
por ejemplo
Cdigo ejemplo
real :: a,b
real, parameter :: tol = 1.0e-06
logical :: same
Estos operadores trabajan con valores reales y retornan otro valor real. Los operadores se resumen a
continuacin:
.not. a .true. S a es falso y viceversa
a .and. b .true. S a y b son .true.
a .or. b .true. S cualquiera de los dos, a o b, es .true.
a .eqv. b .true. S a y b son lo mismo
4
Observe que en F90 existen dos sintaxis equivalentes para este tipo de operadores
Aqu son mostradas dos operadores de caracteres: El operador concatenacin (//) y operaciones con
subcadenas substring. Mire los ejemplos a continuacin para su uso:
Expresin Value
string1 .abcdef"
string2 "xyz"
string1 (2:4) "bcd"
string1 (1:1) .a"
string1 (1) No vlido
string1 // string 2 .abcdefxyz"
string2 (2:3) // string1 (1:2) zab"
2
Al aplicar muchos operadores juntos en una sola declaracin, la evaluacin de algunos operadores
ocurrir primero. La lista mostrada a continuacin otorga el orden en el cual estas operaciones son
efectuadas en Fortran 90, en orden de prioridad descendente:
Potenciacin
Multiplicacin y divisin
Adicin y substraccin
6. Condicionales y Bucles
Ambas estructuras ejecutarn nicamente la(s) declaracin(es) que se encuentran dentro del if s la
declaracin inicial es verdadera.
Si usted quiere ejecutar otro cdigo para el caso en el cual la declaracin sea falsa, usted puede usar la
construccin if/else if/ else:
Ejemplo de prctica
Codifique las declaraciones mostradas a continuacin para ver como funcionan este tipo de construc-
ciones.
program ageist
implicit none
integer :: age
if (age.lt.50) then
print*,"Usted es bastante joven!"
else if (age==50) then
print*,"Usted es viejo!"
else
print*,"Usted es en verdad viejo!"
endif
La declaracin case es otra forma de usar construcciones de decisin en Fortran 90. Observe el siguiente
ejemplo.
Ejemplo de prctica Ejemplo de una declaracin case, o toma de decisiones con mltiples opciones:
program numbers
implicit none
integer :: i
Con la instruccin case usted no est restringido a utilizar valores enteros (integer). Usted podra
usar tambin caracteres. La opcin por defecto (default) es completamente opcional.
Est construccin es til para ejecutar una declaracin particular, o un bloque de declaraciones, varias
veces. Hay dos casos claramente definidos: uno en el cul usted no tiene una idea predefinida de cuantas
veces se necesita ejecutar su declaracin en un bucle, y otro cuando usted sabe exactamente cuantas
veces necesita ejecutar su bucle. Para el primer caso usted puede usar una declaracin condicional para
evaluar la salida del bucle. Un ejemplo de est aplicacin se muestra a continuacin:
Cdigo ejemplo
program loopy
implicit none
integer :: i
i = 0
do
i = i+1
print*,i
if (i>99) exit
end do
Observe que usted puede introducir una declaracin de salida condicional en cualquier parte del cuerpo
del bucle, y de esta forma controlar el nmero de ejecuciones del bucle antes de que ocurra la salida
(instruccin exit). Al poner el condicional al final del bucle se asegura que la declaracin se ejecuta al
menos una vez.
Una variacin en est construccin es usar una declaracin de ciclo en vez de una declaracin de salida.
Est construccin de bucle asegura que cuando la evaluacin de condicin retorna true, el bucle pasar
sobre el valor del contador del bucle. Ejemplo:
Cdigo ejemplo
program loopy
implicit none
integer :: i
i = 0
do
i = i+1
if (i.gt.100) exit
if (i==80) cycle
print*,i
end do
Intente cdificar lo anterior por usted mismo y ejecutelo. La salida ser una impresin de todos los
numeros del 1 al 100, a excepcin del numero 80, en la terminal.
La segunda forma de los ciclos do es aquella en la que conoce cuantas veces usted quiere que se repita el
ciclo. Esto es tambin conocido como un bucle indexado (indexed loop). La sintaxis del bucle indexado
es:
Cdigo ejemplo
do <variable> = inicio, final, avance
El avance (o "stride" ) es el intervalo de incremento entre cada iteracin, y es opcional. El caso por
defecto es un incremento positivo de 1. Note que el "stride" puede ser de igual forma un nmero positivo
o negativo.
Ejemplo de prctica
Ejemplo de un bucle indexado:
program loopy
implicit none
integer :: i
i = 0
print*,"Hacia Adelante"
do i=1, 5
print*,i
end do
print*,"Hacia Atras"
do i = 5, 1, -1
print*,i
end do
end program loopy
Usted no est restringido a un bucle simple o sencillo. Usted podr necesitar tambin bucles anidados.
7. Arreglos / Arrays
7.1. Introduccin
Un arreglo en Fortran 90 es una estructura de datos que es usada para almacenar una coleccin de
objetos del mismo tipo. La sintaxis general de la declaracin de un arreglo es la siguiente:
Cdigo ejemplo
type, DIMENSION( extent ) :: array_name1, array_name2,...
El tipo de variable del arreglo es simplemente el tipo de variable de los valores que sern almacenados
en el arreglo (por ejemplo reales, enteros etc). El comando DIMENSION determina el rango del arreglo
y es por lo tanto obligatorio. El valor extent es el rango de las entradas del arreglo, lo que determina
los subndices de sus elementos. La sintaxis general para la definicin de este rango es
Cdigo ejemplo
entero_inicio : entero_final
Los enteros de definicin del rango del arreglo pueden ser positivos, negativos o cero. No es necesario
definir el valor de inicio del rango, ya que Fortan 90 asumir que el primer valor es 1. Un elemento de
un arreglo puede ser accedido en el cdigo mediante la siguiente sintaxis:
Cdigo ejemplo
array_name1( expresin de entero )
donde la expresin del entero puede ser tan simple como un solo nmero entero, o puede ser una
expresin para evaluar, por ejemplo i + 1, donde i ser un contador, es decir una variable tipo entero.
Ejemplo de prctica
Este ejemplo muestra un caso concreto de declaracin de un arreglo:
program createArray
implicit none
integer :: i
integer, DIMENSION( -2 : 2 ) :: arrayA
do i = -2, 2
arrayA(i) = i
enddo
print*, arrayA
stop
end program createArray
Este cdigo declara un arreglo entero, arrayA, que tiene 5 elementos: arrayA(-2), arrayA(-1), arrayA(0),
arrayA(1) y arrayA(2). Luego se asignan los valores de cada uno de los elementos del arreglo. Si usted
tena asignada una variable entera i = 2, entonces usted podra referirse a sus elementos como a(i-4),
a(i-3), a(i-2), a(i-1) y a(i).
PRECAUCION!
Usted siempre deber tener cuidado de no referenciar elementos que se encuentren por fuera del rango
del arreglo declarado - en el ejemplo de arriba esto sera equivalente a intentar acceder a arrayA(-3) o
arrayA(3). Si usted intenta escribir algo en arrayA(-3) en ste ejemplo, esto sera escrito en una posicin
aleatoria de memoria, lo que podra ocasionar que sucedieran sucesos impredecibles! Seguramente el
programa colapsar, o incluso el compilador se rehusar a compilar tal cdigo. Note que si usted realiza
un error de este tipo en su cdigo, y no se toman las opciones adecuadas, el compilador no ser capaz
de reconocer el error en el momento de la compilacin. As que tenga mucho cuidado!
Es posible crear arreglos multidimensionales en Fortran 90. Por ejemplo, para almacenar una matriz en
F90, usted puede declarar un arreglo bidimensional. El ejemplo a continuacin es la declaracin de una
matriz 3 x 3.
Cdigo ejemplo
real, DIMENSION( extent_1, extent_2 ) :: matrix_3by3
La primera extensin define el rango de filas de la matriz, mientras que la segunda define el rango de
columnas. La matrices en Fortran 90 son almacenadas en el denominado ordenamiento en memoria
por columna o column-major order, como se muestra a continuacin:
As, por ejemplo, si usted ha intentado imprimir su arreglo de matriz 3x3 al teclear simplemente:
print*,matrix_3by3
Los elementos aparecern en la terminal en el orden indicado anteriormente. Pruebe por usted mismo!
Ejemplo de prctica
Codifique las declaraciones abajo mostradas para ver un ejemplo de como asignar valores a los elementos
de una matriz de enteros, e imprimir estos elementos en el ordenamiento por columna. Observe el uso
de bucles anidados.
program myarray
implicit none
integer :: i,j
integer, DIMENSION (1:3, 1:3) :: matrix_3by3
do i = 1, 3
do j = 1, 3
matrix_3by3(i,j) = (2*i)*(j*j)
enddo
enddo
print*,matrix_3by3
Como usted ha visto en el ejemplo anterior, usted puede referirse a elementos individuales del arreglo
de la misma manera en que se referencian las posiciones de una matriz. Por ejemplo, la instruccin
matrix_3by3(1,2) claramente se refiere al elemento en la fila 1 y la columna 2 del arreglo o matriz
que este representa
Como en otros lenguajes, en Fortran 90 usted tambin puede referirse a una subseccin del arreglo, al
suministrar rangos de subsecciones. Mire los ejemplos a continuacin.
Para acceder a toda la primera fila de la matriz matrix_3by3 use cualquiera de las siguientes lineas:
matrix_3by3(1,1:3)
o
matrix_3by3(1,:)
La siguiente instruccin hace referencia a toda la segunda columna de la matriz:
matrix_3by3(1:3,2)
o
matrix_3by3(:,2)
Usted tambin puede referirse a elementos en un arreglo al especficar el "stride". A menos que se
especifique, el "stride" siempre ser 1. Digamos que usted quiere tomar cada segundo elemento de la
matriz matrix_3by3 , empezando por el elemento 1. Esto podra ser hecho especificando:
matrix_3by3(1::2)
o de forma alternativa como
matrix_3by3(::2)
En Fortan 90, usted puede aplicar operaciones globales sobre arreglos. Sin embargo, si ms de un
arreglo va a ser usado en expresiones o calculos, todos los arreglos usados (o subsecciones de los
mismos) deben tener la misma forma, es decir deben referirse al mismo nmero de filas y columnas.
El operador (aritmtico, lgico, etc) actuar elemento por elemento. A continuacin algunos ejemplos
cortos y especficos darn mayor claridad.
Multiplicar todos los elementos de la matriz matrix_3by3 por un numero, por ejemplo 2.5:
matrix_3by3 = 1.0
Ejemplo de una expresin algebraica que involucra otra matriz (del mismo tamao) llamada matrix_2:
Usted tambin puede aplicar funciones matemticas intrnsecas (tales como funciones trigonomtricas)
a arreglos. En este caso, como en todos los anteriores, la funcin operar con base en operacin elemento
por elemento.
Ejemplo de prctica
Codifique el siguiente programa para ver un ejemplo de como usar estos operados especficos sobre
arreglos.
(ver siguiente pgina para el cdigo completo)
program armanip
implicit none
integer :: i,j,c
integer, DIMENSION(1:3, 1:3) :: matrix_3by3,matrix_2,d
integer, DIMENSION(3) :: a,b
do i = 1, 3
do j = 1, 3
matrix_3by3(i,j) = 2*i*j*j
matrix_2(i,j) = 1.5 * j * (i+1)
enddo
enddo
Dado un arreglo con un cierto numero de elementos, usted puede re-configurar este arreglo en un arreglo
diferente, es decir un arreglo con otra forma. Por ejemplo, es posible transformar un arreglo lineal de 9
elementos en un arreglo 3 x 3 (matriz).
Ejemplo de prctica
Escriba el siguiente programa para ver como funciona el cambio de forma de arreglos (tambin deno-
minado re-shape").
program reshape
implicit none
integer :: i
integer, DIMENSION(1:3, 1:3) :: matrix_3by3
integer, DIMENSION(9) :: a
print*,matrix_3by3
La ultima rea que usted puede encontrar til con respecto a arreglos son los .Allocatable Arrays". A
veces no es conveniente haber decidido el tamao del arreglo en una lnea de compilacin. Usted puede
obtener flexibilidad al usar un arreglo asignable - en ste caso usted declara un arreglo al especificar el
rango (nmero de dimensiones) unicamente. Su declaracin debe incluir la palabra allocatable.
En el cuerpo del cdigo, usted debe asignar la memoria de su arreglo, y una vez usted finalice esta
tarea, liberar la memoria mediante la deasignacin de la memoria. Esto ser ms claro con el siguiente
ejemplo.
Ejemplo de prctica
Codifique el siguiente programa para ver como funcionan los arreglos con asignacin dinmica.
program dynamic
implicit none
integer :: i,j
integer, DIMENSION (:,:), allocatable :: matrix
print*,&
&"Please enter the desired dimensions of your matrix"
read*,i,j
allocate ( matrix(0:i-1,0:j-1) )
matrix = 1.0
print*,matrix
deallocate ( matrix )
En F90 una unidad de programa puede ser el cuerpo principal de un programa (iniciado por la sentencia
program, como se ha visto en la parte inicial de cada cdigo que se ha presentado hasta ahora), as
como tambin lo puede ser un mdulo.
Un mdulo es un elemento usado en proyectos de cdigos grandes que involucran varias personas. Los
mdulos realizan muchas funciones:
Los mdulos proporcionan una ubicacin central de constantes y variables, de manera que las
declaraciones de estos objetos no tengan que repetirse en muchos lugares dentro del cdigo. Esto
es equivalente a proporcionar declaraciones globales.
Los mdulos pueden ser usados por todo un grupo de subprogramas agrupados.
Los mdulos son un lugar muy prctico para almacenar tipos de datos derivados (esto se discutir
ms adelante).
Un mdulo se puede compilar por separado o en conjunto con el programa principal. En todo caso se
debe compilar antes de compilar el cdigo principal. Si un mdulo se escribe en el mismo archivo fuente
que el cuerpo principal del cdigo, entonces el mdulo debe estar antes de la declaracin del programa.
Un mdulo es invocado en el cdigo principal mediante la sentencia use. Mdulos y programas pueden
contener procedimientos del programa (ver ms adelante).
Ejemplo de prctica
Escriba las siguientes sentencias en un archivo nuevo. Este es un ejemplo trivial del uso de un mdulo
en un programa (llamado area ) En donde el mdulo myconstants define algunas constantes:
read*,radius
result = pi * radius**2
En F90 un procedimiento de programa puede ser bien una subrutina o una funcin.
Una subrutina es una seccin de cdigo, identificada con un nombre particular, y que realiza una tarea
determinada. Las subrutinas pueden ser invocadas desde una unidad de programa. Estas unidades de
programacin pueden afectar diferentes variables o porciones de memoria. Una funcin es similar, pero
se utiliza para generar una nica respuesta, y es invocada por referencia al nombre de la funcin. La
funcin puede tener cualquier tipo de dato (por ejemplo, entero, real, etc).
A menudo es el caso de que no hay necesidad de escribir un procedimiento por usted mismo, F90 ya
tiene muchas funciones intrnsecas, bastante tiles. Adems existen muchas librerias numricas (por
ejemplo, NAG, BLAS, LAPACK, ATLAS, etc) que estn disponibles. Estas librerias adicionalmente han
sido optimizadas para el funcionamiento en plataformas especficas, por lo que sern bastante rpidas
- probablemente mucho ms rpidas que cualquier cosa que usted pueda escribir por si mismo.
Un procedimiento de programa puede ser declarado y especificado dentro del cuerpo principal del cdigo,
o puede ser externo al cuerpo principal de cdigo. Un procedimiento debe tener argumentos (variables
o constantes) que deben ser suministrados por otras insrucciones en el programa. Igualmente un proce-
dimiento puede contener variables/constantes locales. Estos objetos locales se crean cuando se invoca
el procedimiento y se destruyen cuando el programa sale de este procedimiento. Estos objetos locales
no conservan los valores entre invocaciones (llamadas). La declaracin del procedimiento debe conte-
ner marcadores de posicin para los argumentos a ser procesados. Estos son usualmente denominados
argumentos temporales. Este proceso se conoce como asociacin de argumentos.
Ejemplo de funcin
Supongamos que en el cuerpo principal de un cdigo vamos a llamar una funcion llamada work, pasando
por ella una variable real llamada a, as:
print*,work(a)
La definicin correspondiente, o declaracin, de esta funcin en este cdigo es:
Para hacer su cdigo ms claro, puede usar algo llamado atributos de intencin para los argumentos
de su procedimiento (sea este una funcin o una subrutina). Estos atributos facilitarn el proceso de
compilacin al indicar explcitamente al compilador cul es su intencin para el argumento temporal.
Por ejemplo, si usted quiere que el argumento temporal:
Slo sea referenciado (no hacer cambios a la variable asociada con ese argumento). En este caso
use la sentencia intent(int).
Sea cambiado y se le asigne un valor diferente al usado anteriormente. En tal caso use la sentencia
intent(out).
Debe ser referenciado y ademas cambiado. Para este caso use la sentencia intent(inout).
Cuando un procedimiento es definido internamente, la definicin del procedimiento debera venir solo
despues del final del programa principal. La declaracin deberia ser precedida por la sentencia contains.
Ejemplo de funcin
Escriba el siguiente cdigo - Este le brindar claridad sobre algunos conceptos que se han cubierto en
esta seccin.
program example
implicit none
real :: x,y, result
print*,"Please enter the lengths of the rectangle"
read*,x,y
!***********************************************
! make a call to the subroutine called area
!-----------------------------------------------
! the "real" attribute makes sure the input numbers
! are real, even if the user puts in integers
!***********************************************
call area(real(x),real(y),result)
print*,"the area of the rectangle is ",result," units"
! here is a list of one (or more) procedure defintions
! this is for internal procedures
contains
! subroutine declaration contains dummy arguments a,b,c
! these will be substituted for x,y,result
! (as taken from the call statement)
subroutine area(a,b,c)
real, intent(out) :: c
real, intent(in) :: a,b
! note the intent attributes of these variables
c = a * b
end subroutine area
end program example
9. BIBLIOGRAFA
[1] http://www2.warwick.ac.uk/fac/sci/csc/teaching/modules/cy900/current/session2/fortran/introduction/
[2]Tutorial Rpido de Fortran (Incluye versiones Fortran 77 y 90) Julio R. Baeza Pereyra, Dr..