fortran 90
Post on 30-Oct-2015
25 views
Embed Size (px)
TRANSCRIPT
Apuntes de Fortran 90
V. Domnguez y F.J. Sayas
Junio de 2001
1. Introduccion
Fortran 90 es una actualizacion de Fortran 77 que moderniza este lenguaje, incorporando algunas de lascaractersticas comunes de los lenguajes mas modernos (C, C++, Pascal,etc.). Con el nuevo lenguaje sepersiguen los siguientes objetivos:
Modernizar la sintaxis.
Incluir aspectos de programacion modular, recursividad,. . .
Mejorar la habilidad para trabajar con las matematicas.
Incorporacion de estructuras de datos y de punteros.
Dentro de los posible se mantiene todava valida las instrucciones y sintaxis del Fortran 77. As pequenasmodificaciones permiten pasar un codigo en Fortran 77 a un codigo en Fortran 90. Sin embargo con elloperdemos las principales ventajas que incorpora el nuevo lenguaje.Captulo aparte merece el caso del manejo de tablas. En nuestro caso nos concentraremos en tablasunidimensionales y bidimensionales que se identifican con vectores y matrices. La nueva filosofa deFortran 90 consiste en el manejo de estas estructuras globalmente en lugar de elemento a elemento.Por ultimo conviene senalar que existe una actualizacion posterior que se conoce como Fortran 95. Sinembargo los cambios que incorpora son de una magnitud sensiblemente inferior a los desarrollados en laversion anterior
Primeras ideas sobre la sintaxis.
se emplea desde la columna inicial, a diferencia del Fortran 77 que dejaba las 6 primeras libres paraetiquetas y control de bucles.
No se distingue entre mayusculas y minusculas. Hay compiladores que distinguen para los nombresde variables.
! indica una lnea de comentario. Todo lo que sigue no se compila.
& se emplea para cortar una lnea. Se escribe al final de la lnea cortada y al principio de la siguiente.
Estructura del programa.program nombre programadeclaracion de variablescuerpo del programaend program nombre programa
Ejemplo
! mi primer programa en FORTRAN 90
program primero ! arranque del programaimplicit none ! declaracion variablesreal :: x,y
! programaprint*,dame dos numeros realesread*,x,yprint*,su suma es,x+yprint*,Esta es una linea partida en dos,&
& (x+(2*y)*x-y*y)/3.5
end program primero ! final
2
2. Declaracion de variables y asignacion
Tipos de constantes y variables:
enteras (integer) de coma flotante (real) a simple y doble precision complejas (complex) a simple y doble precision caracter (character) logicas (logical): unicamente pueden adoptar los valores
.TRUE. .FALSE
La ordenimplicit none
cancela un convenio implcito de declaracion de variables y obliga a declarar todas las variables
Por defecto real y complex son de precision simple, pero depende del compilador.
Ejemplo
program asignacionesimplicit noneinteger :: i,jreal (kind=4) :: x,y ! declara variables de precision simplereal (kind=8) :: z,t ! precision doblecomplex :: u ! complex(kind=4) :: ucharacter (len=4) :: palabra ! (len=4) indica que tiene 4 caractereslogical :: test
x=3.23e-4 ! asignacion de 3,23 104
y=-2.312e2x=3.4y=4 ! esta asignacion incluye una conversion de entero a realz=3.23e-4 8 ! 8 indica que es doble precisiont=2. 8z=(3.e-1,2.) ! =0,3 + 2palabra=casa ! las comillas identifican las constantes caracterpalabra="Juan" ! tambien se usan las dobles comillastest=.TRUE.
end program asignaciones
Inicializacion de variables.
Se pueden dar valores de arranque a las variables al declararlas
parameter bloque la posibilidad de reasignar la variable en el transcurso del programa
En las asignaciones de inicializacion no puede haber operaciones aritmeticas. Es aconsejable que nohaya conversiones automaticas (entero a real, etc).
3
programa asignacionesimplicit nonereal :: x=4.,t,z=3.e-2 ! asigna valores de arranque a x y zreal (kind=8) :: u=6.e2 8complex :: a=(2.,3.)character (4) :: palabra=casa ! (4) abrevia (len=4)real, parameter :: pi=3.141592...
3. Lectura y escritura en pantalla
Para escribir en pantalla y leer de teclado, en formato libre, se usan respectivamente
print*, read*,
Ejemplo
...x=3.5print*,x es ,xprint*,da un valor a yread*,yprint*,valores de x e y,x,y...
4. Operaciones numericas
Binarias basicas. Suma, resta, producto, division y exponenciacion.
+ - * / **
Tabla de tipos de datos y resultado.
entero real dobleentero entero real doblereal real real realdoble doble real doble
Funciones matematicas basicas. El argumento siempre se escribe entre parentesis.
abs (valor absoluto o modulo)
sqrt (raz cuadrada)
exp (exponencial)
log (logaritmo neperiano)
log10
sin
cos
tan
4
asin
acos
atan
sinh
cosh
tanh
Otras.
mod(i,j) da el resto de la division entera
int(x) da la parte entera de x
floor(x) da el mayor entero menor o igual que x
ceiling(x) da el menor entero mayor o igual que x
max(x1,...,xn) da el mayor de dos o varios argumentos
min(x1,...,xn) da el menor de dos o varios argumentos
Ejemplo
program partesEnterasreal :: x=2.3, y=-4.3, z=7.2 ! preasignadasinteger :: i=3, j=7, k=-5
print*, floor(x), ceiling(x), int(x)print*, floor(y), ceiling(y), int(y)print*, max(x,y,z), min(i,j,k)
end program partesEnteras
El programa precedente devolvera en pantalla:
2 3 2-5 -4 -47.2 -5
5. Estructuras de decision
Operadores de comparacion. Notese la diferencia entre el igual de comparacion (==) y el de asigna-cion. El smbolo /= indica 6=.
> < = == /=
5
Operadores logicos. Son cuatro: y, o, o exclusivo, negacion.
.AND. .OR. .XOR. .NOT.
Simple de sentencia unica
if (expresion logica) sentencia
Simple de sentencia multiple
if (expresion logica) thensentencia primerasentencia segunda...
end if
If-else
if (...) then...
else...
end if
Decision multiple
if (...) then...
else if (...) then...
else if (...) then...
else ! puede no estar...
end if
Puede haber estructuras anidadas.
Ejemplo
program decisionesimplicit nonereal :: x,yprint*,escribe x e yread*,x,yif (y0) then
print*,x es positivoelse
print*,x es negativoend ifif ((x>0 .AND. y>0).OR.(x
elseprint*,x*y es negativo o nulo
end ifend program decisiones
La orden select case. La sintaxis es
select case (criterio) ! criterio devuelve un valor numericocase(expr1) ! selecciona si se cumple el caso
...case(expr2) ! si se cumple este caso y no el precedente
......case default ! caso por defecto; puede no estar
...end select
Ejemplo
program casosimplicit noneinteger :: opreal :: x,y
print*,elija una opcionread*,opselect case(op)
case(1)print*,op=1read*,x
case(2)print*,op=2read*,x,y
case(3:5)print*,Valor de op entre 3 y 5
case(6:)print*,Valor de op >=6
case(:-1)print*,Valor de op negativo
case defaultprint*,op es cero
end selectend program casos
6. Estructuras de repeticion
Estructura general
do ndice = inicio, final, incrementosentencias
end do
7
Por defecto el incremento es 1.
Puede haber bucles vacos (p.ej. con inicio menor que final e incremento negativo): no se haceninguna operacion.
exit se puede emplear para forzar la salida del bucle.
cycle se puede emplear para pasar directamente al comienzo de la siguiente repeticion del bucle.
Ejemplo
program repeticionesimplicit noneinteger :: i,opreal :: xdo i=10,1,-1
print*, i**2 ! cuadrados de enteros del 10 al 1end dodo i=1,10
print*,i**2 ! lo mismo del revesend dodo i=1,10,-1 ! bucle vaco
print*,iend donombre : do i=1,10 ! bucle etiquetado
print*,inserta xread*,xif (.NOT.x>=0) then
print*,x es negativocycle ! se pasa de nuevo a la primera lnea, incrementando i
end ifprint*,Otra vez? (1->si)read*,opif (op/=1) exit ! si op 6=1 se sale del bucle
end do nombre ! cierre de bucle etiquetadoend program repeticiones
7. Ficheros
La instruccion basica de apertura de un fichero es
open(unit=unidad, file=nombreFichero, status=tipo)
donde:
unidad es un numero entero que identificara al fichero mientras permanezca abierto nombreFichero es el nombre de fichero que se desea abrir; lleva comillas tipo es uno de los cuatro siguientes valores
old cuando el fichero ya existe; permite leer pero no escribir new cuando el fichero no existe y se va a crear; si ya existe, da un error replace cuando el fichero no existe o existe pero se va a reemplazar por uno nuevo;borra el anterior
8
scratch cuando se trate de un fichero temporal de trabajo que se borrara al cerrarLas instrucciones
write(unidad,*)read(unidad,*)
sirven para escribir y leer en formato libre.
La instruccion open dada abre ficheros de tipo texto. Se puede modificar para ficheros binarios (sinformato).
El fichero se cierra con
close(unidad)
Ejemplo
program ficherosimplicit nonereal :: a,binteger :: i,nopen(unit=1, file=datos.dat, status=old)open(unit=2, file=salida.res, status=replace)read(1,*) ndo i=1,n
read(1,*) a,bwrite(2,*) a+b
end doclose(1)close(2)end program ficheros
Si el fichero datos.dat tiene la forma
54. 2.6. 3.-2. 4.1. 1.2e-32. 1.1e2
el fichero salida.res tendra la forma
6.9.2.1.0012112.
9
8. Funciones
En principio una funcion devuelve unicamente un valor.
La sintaxis general es
function nombredeclaracion de variablesinstruccionesreturnend function nombre
nombre es la denominacion de la