FORTRAN 90/95
Lenguaje FORTRAN
PRIMER lenguaje de Alto nivel CÁLCULO; ANÁLISIS NUMÉRICO (FORmula TRANslation)
1954 FORTRAN II – 1958 FORTRAN IV – 1962 FORTRAN66 FORTRAN77 – 1977 en vigor! FORTRAN90 – 1990 incluye F77 FORTRAN95 – 1996 (mejoras mínimas) FORTRAN2003 – 2000/2004
F90/95
• Es el lenguaje más utilizado en el ámbito científico
• Es el lenguaje dominante en supercomputación
• Es un lenguaje fácil de aprender y utilizar.
• Es el único lenguaje que perdura desde los años 50 hasta el
momento actual.
• Existen miles de programas de cálculo, y librerías de uso
absolutamente generalizado: •IMSL (International Mathematics and Statistical Library),
•NAG (Numerical Algorithms Group), etc.
¿Por qué el Fortran?
• Compilador: traduce a código máquina
• ejecución muy rápida• ejecutable depende de la CPU (no portabilidad)
• permite OPTIMIZAR la ejecución (tiempo, memoria, etc)
COMPILADOR:
• “compila”: genera un objeto binario NO ejecutable instrucciones empaquetadas e incomunicadas
• “linka”: vincula paquetes entre si para comunicarse con el exterior (EJECUTARSE) EJECUTABLE/BINARIO
• Permite el uso de LIBRERIAS ya compiladas
ELEMENTOS DE FORTRAN1. Caracteres: a-z, A-Z, 0-9, _ case insensitive
2. Aritméticos: +,-,*,/,**
3. Otros: ( ) . = , ‘ $ : ! “ % & ; < > ?
SENTENCIAS:
1. ejecutables2. no ejecutables3. Longitud 132 caracteres
10 output = input1+input2 ! suma
etiqueta de sentencia comentario
output = input1 + & input2
Continuación de línea
Estructura de un programa:
1. Sección de declaración de variables• Variables, tipo, arrays, parámetros, precisión,...
2. Sección ejecutable• El código principal, procedimientos,...
3. Terminación
PROGRAM myprogram
... ...
END PROGRAM myprogram
Identificadores
Es un nombre para denotar variables, constantes, programas y procedimientos.
Deben empezar con una letra (a-z) y pueden tener una longitud de 31 caracteres (a-z, 0-9, _)
Válidos: pepe, JUAN, PI, x0, x1, z3rt_1234
No válidos: 3luis, fifo$, R2-D2, obi/uan/kenobi
Tipos de datos en Fortran 90/95Hay 5 tipos de datos predefinidos llamados intrínsecos para constantes y variables Fortran.Cada uno de estos tipos de datos intrínsecos admiten varias longitudes de memoria, dependiendo de la anchura de la palabra del computador.
Tipo Denominación en FortranBytes ocupados
Intervalo de valores
Entero INTEGER 4-232-1=-2147483648232-1-1=2147483647
Real REAL 4
-3.402823 10+39
-1.175495 10-39
y1.175495 10-39
3.402823 10+39
Complejo COMPLEX 8 Igual que REAL
Lógico LOGICAL 4 .TRUE. o .FALSE.
CarácterCHARACTER [{(len=nº caract de variab)| (nº caract de variab)}]
longitudConjunto de caracteres ASCII de 8-bits
La longitud de las variables de tipo carácter viene dada por el número de caracteres que tengan. Si no se especifica, las variables sólo podrán tener un carácter.Fortran 90/95 permite al programador definir tipos de datos derivados, que son tipos de datos especiales para resolver problemas particulares.
Variable REAL y precisión
• Una variable declarada de tipo REAL es de 32 bits (4 bytes) por defecto
24 bits de mantisa y 8 de exponente: 10-39 - 10+39
• Existe DOBLE PRECISIÓN de 64 bits (8 bytes)
53 bits de mantisa y 11 de exponente: 10-308 - 10+308
Procesador 32bits
proc. 32b proc. 64b
precisión simple REAL*4 REAL*8doble precisión REAL*8 REAL*16
Declaración de variables
Sintaxis de declaración explícita de tipo de variable:
TIPO:: lista de variables
TIPO es cualquiera de los tipos de datos Fortran válidos
lista de variables es un conjunto de variables separadas por comas cuyos nombres son identificadores válidos.
REAL:: radio,area
INTEGER:: mesas,sillas
COMPLEX:: z1,z2
LOGICAL:: testea
CHARACTER (len=20):: alumno1,alumno2
CHARACTER*20::alumno1,alumno2
CHARACTER(20)::alumno1,alumno2Fortran 90/95 permite al programador definir tipos de datos derivados, que son tipos de datos especiales para resolver problemas particulares.
Declaración implicita de variables
Si una variable no ha sido definida explícitamente por una sentencia de definición de tipo, éste será determinado por la primera letra de su nombre:
I, J, K, L, M, N: entera. resto de letras: real.
• IMPLICIT {NONE | TIPO (lista de letras)}• IMPLICIT LOGICAL (L-P)
• IMPLICIT NONE RECOMENDADO
PARAMETROS
Se puede declarar una “variable” como constante a lo largo del programa:
TIPO, PARAMETER:: nombre=número
REAL,PARAMETER:: planck=6.626E-27
• No puede reasignarse el valor de una constante = error de compilación
Inicialización de variables
variable = valor en la parte de código
TIPO:: variable=valor al declararla
Variables CHARACTER:
• string=‘pepe’
Variables LOGICAL:
• test=.FALSE. (.TRUE.)
El valor de una variable no inicializada no está definido en el standard de F90/95.
Si el tipo de la variable es diferente de la expresión_aritmética, se produce una conversión de tipo: expresión_aritmética es convertida al tipo de variable antes de ser asignada a variable.
Pueden producirse problemas de truncamiento.
variable = expresión_aritmética
INTEGER:: I
I =3./2. !se asigna a I el valor 1
Expresiones aritméticas (I)Operador Descripción
+ Suma
- Resta
* Multiplicación
/ División
** Potencia
+ Signo positivo
- Signo negativo
Operadores binarios
Operadores unarios
Operadores aritméticos
No se pueden escribir dos operadores seguidos.Ejemplo: la expresión a**-b es ilegal en Fortran, debe ser escrita como a**(-b)
Orden de precedencia
Operador
( )
**
+, - (unarios)
*, /
+, -
Prioridad
Mayor
Menor
• La multiplicación, división, suma y resta se evalúan de izquierda a derecha.• Las potencias se evalúan de derecha a izquierda. • Cuando existen paréntesis anidados se evalúan desde el más interno hasta el más externo.
Expresiones aritméticas (II)Orden de
precedencia de tipos
Tipo
COMPLEX
REAL
INTEGERPrioridad
Mayor
Menor
• Si se mezclan en una expresión operandos de distintos tipos, el resultado se eleva a la categoría del de mayor precedencia
Ejemplo, sean:A=8.0 B=4.0 C=3.0 (Reales)I=8 J=4 K=3 (Enteros)El resultado de:A/B 2.0 (real) J/A 0.5 (real)I/J 2 (entero) B/C 1.33333... (real)A/C 2.66667 (real) J/K 1 (entero)J/I 0 (entero) J/C 1.33333... (real)• La división entera puede producir resultados no deseados, los enteros deberían ser usados únicamente para variables que sean intrínsecamente enteras, como los contadores y los subíndices.• Algunos números reales no pueden representarse exactamente. Por ejemplo, la representación de 1./3. puede ser 0.333333 y, como resultado, algunas cantidades que son teóricamente iguales no lo son al ser evaluadas en un computador: 3.*(1./3.) = 0.999999 ≠ 1.
Variables CHARACTER
Variable_char = expresión carácter
• CHARACTER(LEN=3):: ext
ext=‘f’ f__
ext=‘filete’ fil
• CHARACTER(LEN=8):: a,b,c
a=‘ABCDEFGHIJ’ ABCDEFGHb=‘12345678’ 12345678c=a(5:7) EFG_____b(7:8)=a(2:6) b(7:8)=BC b=123456BC
• concatenaciónc=a(1:3)//b(4:5) ABC45___
Funciones intrínsecas•Fortran incorpora todas las funciones matemáticas (y de otros tipos). •Las funciones de esas librerías se denominan funciones intrínsecas del lenguaje.• funciones externas e internas pueden crearse por el propio programador para resolver problemas específicos.• apéndices de cualquier libro de texto Fortran.• calcula un resultado único a partir de ellos. • La sintaxis general de una función intrínseca Fortran es:
NOMBRE (lista de argumentos) Lista de argumentos es una lista de variables, constantes, expresiones, o incluso los resultados de otras funciones, separadas por comas, en número y tipo fijado para cada función intrínseca.
• El resultado es de un tipo también fijado para cada función intrínseca.
REAL::x,yY=funcion(x)
http://www.nsc.liu.se/~boein/f77to90/a5.html
Funciones intrínsecas en F90/95
Ejemplos:
Raíz cuadrada SQRT SQRT R R Exponencil EXP EXP R R Logaritmo neperiano LOG ALOG R R Logaritmo decimal LOG10 ALOG10 R R Seno SIN SIN R R Coseno COS COS R R Tangente TAN TAN R R Arcoseno ASIN ASIN R R Arcocoseno ACOS ACOS R R Arcotangente ATAN ATAN R R Seno hiperbólico SINH SINH R R Coseno hiperbólico COSH COSH R R Tangente hiperbólica TANH TANH R R
Versiones DOUBLE PRECISION (e.g. DEXP) y COMPLEX (e.g. CEXP)
Funciones CHARACTER (algunas):
ACHAR(I) devuelve el carácter ASCII de número I
IACHAR(C) devuelve el número ASCII
LEN(STRING) devuelve la longitud de STRING
LEN_TRIM(STRING) devuelve la longitud de STRING sin contar los blancos de relleno (a la derecha)
TRIM(STRING) devuelve la cadena quitando los blancos de relleno
INDEX(STRING, SUBSTRING, back) devuelve la posición inicial de SUBSTRING dentro de STRING. Si BACK es .TRUE., devuelve la última posición; si no, devuelve la primera.
INT(X) parte entera, X=REAL, devuelve INTEGER
MIN(A,B) devuelve el mínimo de A y B
MAX(A,B) devuelve el máximo de A y B
... y muchas más ....
Entrada/salida simple
READ(*,*) A !lee del teclado !y asigna el valor a AREAD(*,*) a,b,c !lee y asigna tres entradas
WRITE(*,*) A !escribe en pantalla AWRITE(*,*) ´Hola mundo..’ !escribe la cadena
PROGRAM temp_conversion ! Purpose: ! To convert an input temperature from degrees Fahrenheit to! an output temperature in kelvins. !! Record of revisions:! Date Programmer Description of change! ==== ========== =====================! 04/03/02 -- S. J. Chapman Original code !
IMPLICIT NONE ! Force explicit declaration of variables
! Data dictionary: declare variable types, definitions, & units REAL :: temp_f ! Temperature in degrees FahrenheitREAL :: temp_k ! Temperature in kelvins
! Prompt the user for the input temperature.WRITE (*,*) 'Enter the temperature in degrees Fahrenheit: 'READ (*,*) temp_f ! Convert to kelvins.temp_k = (5. / 9.) * (temp_f - 32.) + 273.15 ! Write out the result.WRITE (*,*) temp_f, ' degrees Fahrenheit = ', temp_k, ' kelvins' ! Finish up.END PROGRAM temp_conversion