


















































Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Programación en fortran 90/95 teoría y solución de ejercicios
Tipo: Apuntes
1 / 58
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!



















































1.1.- Capítulo 1 : Forma fuente y declaraciones
1.1.1 Forma fuente - características principales 1.1.2 Forma de un programa en Fortran 1.1.3 Entrada interactiva de datos: PRINT y READ 1.1.4 Funciones intrínsecas
1.2.- Capítulo 2 : Expresiones y asignaciones
1.2.1 Expresiones - operaciones intrínsecas 1.2.2 Evaluación de expresiones 1.2.3 Asignaciones
1.3.- Capítulo 3 : Estructuras de control
1.3.1 Estructuras de control: IF 1.3.2 Estructuras de control: CASE 1.3.3 Estructuras de control: DO 1.3.4 Sentencias de control I 1.3.5 Sentencia de control II
1.4.- Capítulo 4 : Operadores
1.4.1 Tipos intrínsecos de datos 1.4.2 Tipos de datos 1.4.3 Operadores
1.5.- Capítulo 5 : Procedimientos intrínsecos
1.5.1 Procedimientos intrínsecos elementales 1.5.2 Procedimientos numéricos 1.5.3 Procedimientos matemáticos y lógicos 1.5.4 Procedimientos caracter 1.5.5 Funciones para vectores y matrices
Todo programa en Fortran90 deberá comenzar con la sentencia program nombre (Este nombre tiene que comenzar por una letra y puede tener hasta 31 caracteres, tanto letras, como números o el símbolo _ ). Este nombre solo tiene significado para el lector.
Posteriormente, al acabar el programa se usará la sentencia end program nombre.
El nombre del fichero fuente del programa deberá acabar en .f90 ( Esta condición no es propia del Fortran90, sino del sistema operativo). Ejemplo:
Program suma_de_numeros
end program suma_de_numeros
Las declaraciones de tipo aparecerán entre el principio del programa y el inicio de la parte ejecutable. Cada declaración consta de una palabra de tipo intrínseco específica del Fortran seguida de dos pares de dos puntos y una lista de nombres de variables separadas por comas. Ejemplo:
Integer ::i,j ; real ::x,z
En Fortran90 es necesario declarar todas las variables. También es posible declararlas con un parámetro de clase particular, para ello escribiremos después de la palabra especifica del Fortran90, ( kind = palabra representativa ). Por ejemplo, si quiero que unas determinadas variables reales tengan el doble de números representativos escribiré:
Real ( kind = 2 )::x,z
En el caso de variables carácter yo podré indicar la longitud, en número de caracteres, de la variable con un parámetro de clase, para ello haría:
Character ( len = 15 ):: nombre También es posible dar a una variable un valor inicial en el momento de ser declarada, por ejemplo: integer :: iteraciones = 0 , real :: x = 2.1 , y =
Así, el valor de esta variable podrá ser modificado a lo largo de la ejecución del programa. Por otro lado, si queremos darle un valor fijo a una variable usaríamos la sentencia parameter. Por ejemplo: Real , parameter :: pi = 3. Posteriormente, durante el programa usaremos el nombre del parámetro en vez de su correspondiente valor, y además este no podrá ser modificado. Como ya está comentado, todas las variables que utilicemos deberán ser declaradas y para que no olvidemos ninguna existe la sentencia implicit none. Esta sentencia se colocará al principio de cada programa y toda variable no definida provocará un error de compilación.
Para poder trabajar interactivamente con un programa Fortran90 se introducen dos sentencias básicas de entrada y salida directa de datos al terminal.
La sentencia print se usa de igual forma que en Fortran77. Ejemplo:
Print * , ´ La suma de 2 y 3 es : ´, 2 + 3
El * informa al compilador que el programador no desea especificar el formato exacto en el que desea imprimir la respuesta. Al ejecutar este ejemplo saldrá por pantalla La suma de 2 y 3 es : 5. La sentencia entre apóstrofes o entre comillas se conoce con el nombre de cadena de caracteres y puede contener todo tipo de caracteres.
Permite obtener el valor de las variables que usaremos. Ejemplo:
Las funciones de conversión de tipo numérico son usadas para convertir variables de una clase en otra con el mismo parámetro de clase, si quiero que esto no sea así tendré que especificar el parámetro de clase. Por ejemplo, real (i,kind=2) convierte el valor entero i en un real en doble precisión.
Función logical
La función denominada logical cambia el parámetro de clase de una variable lógica. Por ejemplo, si l es de tipo lógico y k es entero, logical (l,k) da el valor de l representado como una variable lógica con parámetro de clase k y la función logical (l) nos da el valor de l representado como una variable lógica con el parámetro de clase por defecto.
Las funciones intrínsecas son aquellas incluidas en el propio lenguaje de programación, y que no necesitan ser definidas por el programador para utilizarlas. Existen muchas funciones intrínsecas en Fortran90. Para usarlas solamente tenemos que escribir el nombre de la función seguido de los argumentos de ella encerrados entre paréntesis. El número de argumentos no tiene por que ser fijo, es decir, es posible usar la función MAX, por ejemplo, para calcular el máximo de dos o tres números.
Función kind
La función kind (x) devuelve el valor del parámetro de clase o tipo del argumento x. Por ejemplo kind (0) devuelve la clase por defecto de los enteros, kind (0.0) devuelve la clase por defecto de los reales, kind (.false.) devuelve la clase por defecto de las variables lógicas y kind (´A´) devuelve la clase por defecto de las variables carácter. La función intrínseca selected_real_kind devuelve un valor cuya representación tiene una cierta precisión y un cierto rango. Por ejemplo selected_real_kind (7,80) devuelve reales con 7 cifras decimales y comprendidos entre -10 ** 80 y 10 ** 80. Para los enteros la función es selected_int_kind , que funciona de forma análoga. Por ejemplo selected_int_kind (9) devuelve enteros comprendidos entre -10 ** 9 y 10 ** 9.
Existen funciones que convierten una variable numérica en cada uno de los otros tipos de variables. Estas funciones son, real , int y cmplx. Por ejemplo, el
valor de int (2.4) es el entero 2 , el valor de real (2,3.1) es el real 2 y el valor de cmplx (3) es el complejo 3 + 0i. Las funciones de conversión de tipo numérico son usadas para convertir variables de una clase en otra con el mismo parámetro de clase, si quiero que esto no sea así tendré que especificar el parámetro de clase. Por ejemplo, real (i,kind=2) convierte el valor entero i en un real en doble precisión.
Función logical
La función denominada logical cambia el parámetro de clase de una variable lógica. Por ejemplo, si l es de tipo lógico y k es entero, logical (l,k) da el valor de l representado como una variable lógica con parámetro de clase k y la función logical (l) nos da el valor de l representado como una variable lógica con el parámetro de clase por defecto.
Una expresión en Fortran90 es usada para indicar muchas clases de cálculos. Las componentes básicas de una expresión pueden ser combinadas usando unos operadores que serán explicados a continuación.
Son aquellas operaciones que están definidas y son conocidas por el compilador. A continuación veremos una tabla de operadores intrínsecos con su significado:
CATEGORIA DEL OPERADOR
Aritmética * * Exponente Numéricos Aritmética * Multiplicación Numéricos Aritmética / División Numéricos Aritmética +^ Adición Numéricos Aritmética - Sustracción Numéricos
Caracter / / Concatenación de cadenas
Caracter con el mismo parámetro de clase.
Relación. EQ. Igual Ambos numéricos o ambos caracteres.
Relación. NE. Distinto Ambos numéricos o ambos caracteres.
Lógica .not.. Lógica .and.. Lógica .or.. Lógica .eqv. or .neqv..
Extensión Operador binario definido por el usuario Menor
Hacer a + b + c + d es lo mismo que hacer (a + b) + (c + d) pero en el primer caso el ordenador sumaría a y b , el resultado se lo sumaría a c y este a d , sin embargo en el segundo caso haría a + b y c + d y sumaría ambos resultados.
Al realizar operaciones hay que tener cuidado con el tipo y la clase de las
variables a operar, ya que por ejemplo, la división de dos enteros truncaría el
resultado, es decir, 3 / 2 no daría 1.5 sino 1. El motivo de esto es que el resultado
de dividir dos enteros es un entero. Por tanto, no seria lo mismo i / 2 que 0.5 * i,
siendo i un entero.
En muchos casos el resultado obtenido al evaluar una expresión es asignado a una variable cuyo valor será usado posteriormente a lo largo del programa refiriéndose solamente a la variable. Esto se hace con una sentencia de asignación. La forma general del proceso de asignación es:
Variable = Expresión
La ejecución de la sentencia de asignación provoca que la expresión sea evaluada y luego ese valor sea asignado a la variable que esta a la izquierda del signo igual ( = ). Este signo igual no es un igual algebráico, solo indica que la variable que esta a la izquierda toma el valor de la expresión de la derecha. Así, a lo largo del programa el valor de la expresión podrá ser reemplazado por el nombre de la variable. Si tengo por ejemplo Pi = 3.141592 y x = 2 podré hacer y = x * Pi y así obtener y = 6.. En el caso de que la expresión sea escalar esta debería coincidir en tipo y clase con la variable, en caso de no ser así, deberemos utilizar una sentencia de conversión ( int, real, cmplx,... ) para corregirlo. Si la expresión y la variable son de tipo carácter estas deben tener el mismo valor del parámetro de clase, en caso contrario, es decir, si tienen distintas longitudes, ocurre lo siguiente:
Estructuras de control: IF
Una estructura de control consta de uno o más bloques de sentencias Fortran que se ejecutarán dependiendo de la veracidad de una sentencia lógica. Existen tres clases de estructuras de control, la estructura IF , la estructura CASE y la estructura DO. Una colección de sentencias cuya ejecución está controlada por una estructura de control se denomina un bloque. No está permitido pasar los valores de un bloque a otro, pero si que se puede abandonar un bloque en el momento que se desee. Suele ser habitual indentar los bloques para una mayor legibilidad del programa. Las estructuras de control pueden tener un nombre que las identifique, este se situará en la primera sentencia del bloque. En caso de ponerle un nombre a la estructura la sentencia END tendrá que ir seguida del nombre de la estructura.
La estructura IF es una estructura de decisión que permite la selección de uno u otro bloque de sentencias dependiendo de una sentencia determinada. La forma general de una estructura IF es:
IF (expresión lógica ) THEN
Bloque de sentencias
ELSE IF ( expresión lógica ) THEN
Bloque de sentencias
ELSE IF ( expresión lógica ) THEN
Bloque de sentencias
Bloque de sentencias
CASE ( valor o lista de valores )
Bloque de sentencias
Bloque de sentencias
END SELECT
El valor de la expresión de SELECT CASE tiene que ser un entero, un carácter o una variable lógica.Además, el valor o lista de valores del CASE tiene que ser del mismo tipo que la expresión. La sentencia CASE DEFAULT es opcional. El bloque CASE será ejecutado siempre y cuando el valor de la expresión del SELECT CASE coincida con el valor de este bloque. La ejecución de las sentencias de los bloques CASE es excluyente, es decir, si se realiza un bloque de sentencias ya no se ejecutará ningún otro. En el caso de que ningún valor de las sentencias CASE sea válido se ejecutará el bloque de sentencias del CASE DEFAULT. La lista de valores de un CASE puede ser los valores comprendidos entre dos números o entre dos cadenas de caracteres, en tal caso se escribirá 2 : 5, para indicar los valores entre el 2 y el 5 , ambos inclusive.
Estructuras de control: DO
La estructura DO consta de unas determinadas sentencias que son repetidas bajo el control de una parte de la estructura. La forma general de una estructura DO es:
DO ( sentencia de control )
Bloque de sentencias
El bloque de sentencias será repetido tantas veces como indique la sentencia de control. Existen tres tipos de sentencias de control:
La sentencia EXIT provoca el fin de la ejecución de un bucle, mientras que la sentencia CYCLE provoca el final de una iteración del bucle. Pasamos ahora a detallar los tres tipos de sentencias de control ya mencionados.
Para una estructura DO sin sentencia de control, el bloque de sentencias entre la sentencia DO y la sentencia END DO se ejecutará repetidamente hasta que la sentencia EXIT provoque la parada.
Habitualmente, los sucesivos valores que toma una variable están relacionados por un valor, como por ejemplo, 1, 2, 3, 4, 5 ó 8, 6, 4, 2. Como esto ocurre a menudo, hay una forma muy simple de asignar a una variable dichos valores, y es con una sentencia DO con una variable de control. La forma general de un bucle DO con variable de control es:
DO variable = expresión, expresión, expresión
Bloque de sentencias
END DO
La primera expresión especifica el valor inicial de la variable, la segunda determina el último valor de la variable, mientras que la tercera nos da la frecuencia o el paso de incremento o disminució,n de la variable. Si se omite la expresión del paso se entiende que este es uno. La variable puede tomar valores enteros o reales, aunque debido a posibles errores de cálculo, sólo deben utilizarse valores enteros. Ejemplo:
DO iteraciones = 0, 10, 2
Print * , ´ Estoy en la iteración ´, iteraciones
Esta estructura imprimiría los números 0, 2, 4, 6, 8 y 10.
seleccionar las distintas representaciones en la máquina para cada tipo de datos. Antes de nada profundicemos un poco en esto:
Gracias a ellos para los datos de tipo numérico podremos seleccionar la precisión y el rango de cada variable y para los datos de tipo carácter podremos usar durante el programa distintos alfabetos. Cada tipo intrínseco de datos tiene un parámetro de clase asociado a él, este es el parámetro de clase por defecto y es el que la máquina le asigna si el programador no lo especifica. Para los datos numéricos los números 1, 2 y 3 ( ó 4, 8 y 16 dependiendo de la máquina ) denotan al número en simple, doble o cuádruple precisión, respectivamente, por ejemplo 2132_2 ó bien 2132_ Por otro lado, para escoger el número de decimales y el rango de un número hay unas determinadas funciones intrínsecas: selected_int_kind y selected_real_kind , de las cuales ya hemos hablado. Los datos de tipo lógico, que sabemos que están almacenados bit a bit, se pueden almacenar byte a byte, con lo que ganaremos en eficacia. Estas representaciones podrán ser hechas por el programador especificando el valor del parámetro de clase. Para los datos de tipo carácter, el parámetro de clase irá situado antes de la variable y separado de esta por un subrayado ( _ ), por ejemplo ASCII_ ´aeiou´ o CHEMICAL_ ´oro´
NOTA: Los diferentes parámetros de clase suelen depender de la máquina en la que estemos trabajando, por ello es conveniente leerse el manual del ordenador para conocerlos.
El tipo entero se usa para representar valores de números enteros. Una constante entera es una cadena que contiene dígitos del 0 al 9 , que pueden ir seguidos por un subrayado ( _ ) y otros enteros o por unos valores que designan el parámetro de clase del entero. Por ejemplo, 23 ; 15_short ; 15_long ; 3_. Una constante entera con signo es un entero precedido del signo + ó -.
El tipo real se usa para representar valores de números reales. Hay dos formas en Fortran90 para representar una constante de tipo real, la primera es la forma posicional , que consiste en un entero seguido por un punto y por su parte decimal y la segunda es la forma exponencial , que es un real escrito en forma posicional seguido de la letra E y un entero con signo. Por ejemplo, 2.3E + 05 representa al número 2.3 * 10 5** , es decir, al número 230000. Esta forma se usa para representar números muy grandes o muy pequeños. En ambas formas el número puede ir seguido de un subrayado y de un parámetro de clase ( por ejemplo, double o quad ).
El tipo complejo en Fortran90 se usa para representar a los numero complejos. Se escribirá ( a, b ) para denotar al complejo a + b i. La precisión del complejo será la mayor precisión que tengan a y b.
El tipo lógico en Fortran90 se usa para representar los valores "verdadero" y "falso".
El tipo caracter en Fortran90, se usa para representar cadenas de caracteres. Una constante caracter es una secuencia de caracteres entre apóstrofes o entre comillas.
Son los siguientes: + , - , ***** , / y ******. Estos operadores relacionan operandos numéricos que no tienen que ser del mismo tipo, ya que el de menor clase se convertirá en el de mayor ( los enteros tienen menor clase que los reales y estos a su vez tienen menor clase que los complejos ) en el momento de realizarse la operación. Por ejemplo, 15.0 / 2 resulta ser 7.5 , ya que 15.0 es un real, 2 se convierte en real y la división de reales es otro real. En el caso de que los dos operandos sean del mismo tipo pero tengan distinto parámetro de clase el resultado tendrá el mismo parámetro de clase que el operando con mayor precisión.
A continuación daremos una tabla con las más usadas:
FUNCIONES SIGNIFICADO TIPO
ABS Valor absoluto o módulo de un complejo.
Real o entero, dependiendo de su argumento.
AINT Trunca el valor de su argumento real Real.
Redondea el valor de su argumento real Real.
AIMAG Parte imaginaria de un complejo Real.
CEILING Entero mayor o igual que su argumento real Entero.
CONJG Conjugado de un complejo Complejo, con números reales.
DPROD Producto en doble precisión de dos reales Real en doble precisión.
Nos da X - Y si esta diferencia es
0 ó 0 en caso contrario
Real o entero, dependiendo de su argumento. FLOOR Parte entera de un real Entero. MAX Máximo Real. MIN Mínimo Real.
MODULO Resto de una división Real o entero, dependiendo de su argumento.
SIGN(A, B) Es ABS(A) si B>=0 y -ABS(A) si B<
Real o entero, dependiendo de su argumento.
Las más usadas las detallaremos en la siguiente tabla:
FUNCIONES SIGNIFICADO ACOS Arco coseno ASIN Arco seno ATAN Arco tangente COS Coseno COSH Coseno hiperbólico EXP Exponencial
LOG Logaritmo LOG10 Logaritmo en base 10 SIN Seno SINH Seno hiperbólico SQRT Raíz cuadrada TAN Tangente TANH Tangente hiperbólica
La función denominada logical cambia el parámetro de clase de una variable lógica. Por ejemplo, si l es de tipo lógico y k es entero, logical( l, k) da el valor de l representado como una variable lógica con parámetro de clase k y la función logical (l) nos da el valor de l representado como una variable lógica con el parámetro de clase por defecto.
Las más importantes son:
FUNCIONES SIGNIFICADO TIPO
ICHAR (C) Posición que ocupa su argumento en el código ASCII. Entero.
CHAR (I) Caracter que corresponde al código ASCII I. Caracter.
IACHAR (C) Posición que ocupa su argumento en el código ASCII. Entero.
Caracter que corresponde al código ASCII I. Caracter.
Primera posición de la subcadena en la cadena. Entero.
Longitud sin espacios en blanco de la cadena. Entero.
REPEAT (CAD, N) Concatenar N veces la cadena. Caracter. VERIFY (STRING, Posición del caracter mas a la izqda. Entero.