Está en la página 1de 29

Universidad Nacional de Colombia

Facultad de Ingeniera
Departamento de Ingeniera Mecnica y Mecatrnica

Modelacin matemtica
Sem I - 2014

GUIA RAPIDA PARA EL USO DE FORTRAN

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/

Modelacin matemtica Pgina 1 de 29


Modelacin Matemtica - Gua rpida de Fortran

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

La estructura general de un mdulo (llamado en el siguiente ejemplo moduloA) corresponde al cdigo


presentado a continuacin:

Cdigo ejemplo
module moduloA (parametros)

local variable declarations

contains

body of function code

end module moduloA

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

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 2 de 29


Modelacin Matemtica - Gua rpida de Fortran

2.1. Nuestro primer cdigo. Hello World

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:

user@prompt:$ ifort hello.f90 -o hello

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

Notas sobre nuestro primer cdigo:


La primer lnea determina el inicio del programa, y define el nombre del mismo. En ste caso el
nombre del programa es hello
La segunda lnea indica que usted quiere declarar explcitamente el tipo de todas y cada una de
las variables o constantes. De lo contrario, usted est dejando al compilador decidir por usted el
tipo de variable o constante.
La inclusin de comentarios es importante en todo cdigo. En Fortran (F90) los comentarios van
precedidos por un signo de exclamacin (!). Adquiera el hbito de escribir comentarios tiles en
su cdigo.
Cada declaracin de una lnea en F90 esta limitada a 132 caracteres en total. Para continuar una
lnea, use un ampersand (&) al final de la linea, y con la nueva lnea apareciendo directamente
debajo de la que se est continuando. La excepcin es cuando se est dividiendo una cadena de
caracteres, en cuyo caso se debe comenzar la siguiente lnea con un ampersand tambin.
Tambin puede declarar varias sentencias en una sola lnea. Cada sentencia sobre la lnea debe
estar separada por un punto y coma (;)

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 3 de 29


Modelacin Matemtica - Gua rpida de Fortran

3. Variables y constantes

3.1. Tipos de datos

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)

3.2. Declaracion de variables

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:

real :: element = 1.3E2


La declaracin de variables tipo cracter es un poco diferente. Hay que incluir tambin la longitud
de la cadena como (len=) como parte de la definicin. Este valor se tratar como una longitud
mxima, por lo que tal variable podr almacenar una cadena de caracteres de tamao menor o
igual a la longitud especificada. Por ejemplo, para declarar una variable de caracteres denominada
cadena, para ajustarla al valor skywalker tendramos que usar lo siguiente:

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 4 de 29


Modelacin Matemtica - Gua rpida de Fortran

character(len=12) :: string = skywalker


Si se requiere, espacios en blanco pueden ser preservados dentro de una cadena limitada por
comillas.
Definiciones tipo parameter siguen un patron similar, ejemplo:

real, parameter :: pi = 3.14159


Las variables tipo parameter almacenan el valor definido en la inicializacin, y este valor NUNCA
podr ser cambiado dentro del programa. Piense en estas variables como parmetros constantes
de su programa.
Si se declara una variable sin asignar de inmediato un valor a la misma, siempre se puede asignar
su valor ms adelante en el cdigo. La instruccin de asignacin es un signo de igual (=), de
forma que el valor de la derecha del signo de igualdad se almacenar en la variable presentada a
la izquierda del signo igual.

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

! print out your variables/constants


print*,special
print*
print*,name
end program hello
Asegurese que su cdigo est compilando correctamente, e imprimiendo el valor adecuado en la pantalla
de la terminal.

IMPORTANTE!!!

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 5 de 29


Modelacin Matemtica - Gua rpida de Fortran

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

4.1. Salida de datos

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

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 6 de 29


Modelacin Matemtica - Gua rpida de Fortran

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)

4.2. Ingreso/entrada de datos

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:

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 7 de 29


Modelacin Matemtica - Gua rpida de Fortran

program getname

implicit none
character(len=100) :: name

! Solicite ingreso del nombre desde la terminal


print*,"please enter your name at the prompt"
! Adquiera el texto ingresado
read*,name
! Imprima el texto ingresado en la terminal
print*,"your name is ",name

end program getname

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

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 8 de 29


Modelacin Matemtica - Gua rpida de Fortran

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

! Presente instrucciones en la terminal


print*,please enter your name at the prompt

! Lea el texto ingresado por el usuario


read*,name

! Abra un archivo para escribir el nombre ingresado


open(unit=6,file=myname.txt,status=new)

! Escriba el texto ingresado al archivo myname.txt,


! y asigne la unidad 6 para este archivo
write(6,*) "your name is",name

! Cierre el archivo myname.txt


close(6)

! Detengamos TODO antes de salir


stop

! 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?

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 9 de 29


Modelacin Matemtica - Gua rpida de Fortran

5. Operadores
Los operadores en Fortran son utilizados para manipular y comparar variables y constantes.

5.1. Operadores Aritmticos

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

print*,"the result of 22/4 is",22/4


print*,"the result of 22.0/4.0 is",22.0/4.0
print*,"the result of 15/4*4.0 is",15/4*4.0

end program getname


Compile y corra ste cdigo. La salida debera ser:

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

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 10 de 29


Modelacin Matemtica - Gua rpida de Fortran

5.2. Operadores Comparativos

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

! compare the value of a and b


same = (abs(a-b).lt.tol)

5.3. Operadores Lgicos

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

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 11 de 29


Modelacin Matemtica - Gua rpida de Fortran

5.4. Operadores de Caracter

Aqu son mostradas dos operadores de caracteres: El operador concatenacin (//) y operaciones con
subcadenas substring. Mire los ejemplos a continuacin para su uso:

EJEMPLO: Abajo se encuentran algunos ejemplo de operacin con cadenas:

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

5.5. Prioridad de Operadores

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

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 12 de 29


Modelacin Matemtica - Gua rpida de Fortran

6. Condicionales y Bucles

6.1. if / else / endif

Estas estructuras condicionales le permiten controlar el flujo de su cdigo. La declaracin if le permite


controlar s un programa entra a una seccin del cdigo o no, basado en s una condicin es falsa o
verdadera. Hay tres variaciones bsicas en la declaracin if, con una sintaxis general como:

if ( condicin verdadera ) Ejecute est declaracin

O usted podra utilizar una declaracin en bloque como:

if ( condicin verdadera ) then


. Ejecute est declaracin
. Ejecute est declaracin tambien
. etc...
endif

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:

if ( condicin 1 es verdadera ) then


. Ejecute est declaracin si la condicin 1 es verdadera
else if ( condicin 2 es verdadera ) then
. Ejecute est declaracin si la condicin 2 es verdadera
else
. Ejecute est declaracin si ninguna de las dos condiciones es vedadera
endif

Ejemplo de prctica
Codifique las declaraciones mostradas a continuacin para ver como funcionan este tipo de construc-
ciones.

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 13 de 29


Modelacin Matemtica - Gua rpida de Fortran

program ageist
implicit none
integer :: age

print*,"Por favor introduzca su edad"


read*,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

end program ageist


Compile y corra ste cdigo. Intente escribir alguna variacin sobre el cdigo.

6.2. Declaracin case

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:

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 14 de 29


Modelacin Matemtica - Gua rpida de Fortran

program numbers

implicit none
integer :: i

print*,"Por favor ingrese un numero"


read*,i

select case (i)


case (:-1) ! i is negative
print*,"El numero es negativo"
case(0) ! only zero
print*,"El numero es cero"
case(1:9) ! i is positive
print*,"El numero es positivo y menor a 10"
case default
print*,"El numero es positivo y mayor a 9"
end select

end program numbers

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.

6.3. Ciclos DO / Bucles

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:

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 15 de 29


Modelacin Matemtica - Gua rpida de Fortran

Cdigo ejemplo
program loopy

implicit none
integer :: i

i = 0

do
i = i+1
print*,i
if (i>99) exit
end do

end program loopy

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

end program loopy

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:

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 16 de 29


Modelacin Matemtica - Gua rpida de Fortran

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,...

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 17 de 29


Modelacin Matemtica - Gua rpida de Fortran

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).

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 18 de 29


Modelacin Matemtica - Gua rpida de Fortran

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!

7.2. Arreglos Multidimensionales

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:

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 19 de 29


Modelacin Matemtica - Gua rpida de Fortran

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

end program myarray


Compile y ejecute este cdigo. Intente escribir algunas variaciones del cdigo.

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

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 20 de 29


Modelacin Matemtica - Gua rpida de Fortran

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)

7.3. Operaciones con arreglos

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 = matrix_3by3 * 2.5


Inicializar cada uno de los elementos de la matriz matrix_3by3 con el valor de 1.0:

matrix_3by3 = 1.0

Ejemplo de una expresin algebraica que involucra otra matriz (del mismo tamao) llamada matrix_2:

matrix_3by3 = 3.0 * matrix_3by3 + (matrix_2)**2


Ejemplo de la multiplicacin de 2 matrices.

matrix_3by3 = matrix_3by3 * matrix_2

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 21 de 29


Modelacin Matemtica - Gua rpida de Fortran

Nota: El ejemplo anterior NO corresponde con la "multiplicacin de matrices"; esta es una


simple multiplicacin elemento por elemento. Este ltimo ejemplo podra expresarse como:

matrix_3by3(i,j) = matrix_3by3(i,j) * matrix_2(i,j)

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.

7.4. Arreglo - Funciones Especificas

Hay mucho ms para descubrir en la manipulacin de arreglos en Fortran 90 - en particular existen


muchas "funciones de arreglos". Dos de las cuales usted podra encontrar muy tiles son dot_product
(efecta el producto interno de dos arreglos) y matmul (toma el producto de dos matrices - la propia
multiplicacin matricial). Estas dos funciones, entonces, operan en el sentido estricto de algebra lineal.

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)

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 22 de 29


Modelacin Matemtica - Gua rpida de Fortran

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

! create vector a from the first row of matrix_3by3


a = matrix_3by3(1,:)
! create vector b from the second row of matrix_2
b = matrix_2(2,:)

! take dot product of these two vectors


c = dot_product(a,b)
print*,c

! take the real matrix inner product


! of the two matrices
d = matmul(matrix_3by3,matrix_2)
print*,d

end program armanip


compile y corra ste cdigo. Intente escribir algunas variaciones en est cdigo.

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).

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 23 de 29


Modelacin Matemtica - Gua rpida de Fortran

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

! assign elements of a to be 1 -> 9


a = (/ (i,i=1,9) /)
! reshape this array, a, into a 3by3 matrix
matrix_3by3 = reshape ( a, (/ 3,3 /) )

print*,matrix_3by3

end program shape


Compile y ejecute este cdigo. Intente escribir algunas variaciones obre este cdigo.

7.5. Arreglos de tamao dinmico / Allocatable arrays

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.

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 24 de 29


Modelacin Matemtica - Gua rpida de Fortran

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 )

end program dynamic


Compile y ejecute este cdigo. Intente escribir algunas variaciones obre este cdigo.

8. Unidades de programa y procedimientos

8.1. Definicin de mdulo

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).

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 25 de 29


Modelacin Matemtica - Gua rpida de Fortran

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:

! declare your module


module myconstants
implicit none
real, parameter :: pi=3.1415927, ee=2.7182818
end module myconstants

! start the main body of code


program area
! include your module with the *use* statement
use myconstants
implicit none
real :: radius, result

print*,"Please enter the radius of a circle"

read*,radius

result = pi * radius**2

print*,"the area of the circle is ",result," units"


end program area
Compile y ejecute este cdigo. Intente escribir algunas variaciones obre este cdigo.

8.2. Definicin de Subrutinas y Funciones

En F90 un procedimiento de programa puede ser bien una subrutina o una funcin.

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 26 de 29


Modelacin Matemtica - Gua rpida de Fortran

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:

real function work(x)


Entonces, en este ejemplo, la variable temporal o ficticia es x. Cuando el programa ingresa a la funcin,
reemplazar el valor de x por el actual valor de a.

8.3. Argumentos con atributos de intencin

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).

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 27 de 29


Modelacin Matemtica - Gua rpida de Fortran

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

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 28 de 29


Modelacin Matemtica - Gua rpida de Fortran

Compile y corra ste cdigo. Intente escribir variaciones sobre l.

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..

Ingeniera Mecnica Actualizacin: Marzo/2014 Pgina 29 de 29

También podría gustarte