Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Programación Fortran 90/95, Apuntes de Métodos Matemáticos para Análisis Numérico y Optimización

Programación en fortran 90/95 teoría y solución de ejercicios

Tipo: Apuntes

2019/2020

Subido el 15/09/2020

erich-man
erich-man 🇵🇪

3

(1)

2 documentos

1 / 58

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
PROGRAMACIÓN AVANZADA
UNIVERSIDAD NACIONAL
AUTONOMA DE MÉXICO
FACULTAD DE INGENIERIA
PROGRAMACIÓN AVANZADA
ING. MARTÍN CARLOS
VELÁZQUEZ
CURSO FORTRAN 90-95
Sección 1: Elementos básicos del lenguaje
Sección 2: Organización del programa
Sección 3: Arrays y punteros
Sección 4: Entrada/salida de datos
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a

Vista previa parcial del texto

¡Descarga Programación Fortran 90/95 y más Apuntes en PDF de Métodos Matemáticos para Análisis Numérico y Optimización solo en Docsity!

UNIVERSIDAD NACIONAL

AUTONOMA DE MÉXICO

FACULTAD DE INGENIERIA

PROGRAMACIÓN AVANZADA

ING. MARTÍN CARLOS

VELÁZQUEZ

CURSO FORTRAN 90-

Sección 1: Elementos básicos del lenguaje

Sección 2: Organización del programa

Sección 3: Arrays y punteros

Sección 4: Entrada/salida de datos

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

Forma de un programa en Fortran

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

Definición de variables

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.

Entrada interactiva de datos: print y

read

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

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.

La sentencia read

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.

Funciones intrínsecas

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.

Funciones de conversión de tipo numérico

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.

Expresiones - operaciones intrínsecas

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.

Operaciones intrínsecas

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

OPERADOR

INTRINSECO SIGNIFICADO^

TIPO DE

OPERANDOS

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.

Asignaciones

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:

  • Si la longitud de la variable es menor que la de la expresión, el valor de la expresión se trunca por la derecha para adecuarse a la longitud de la variable.
  • En el caso de que la longitud de la variable sea mayor que la longitud de la expresión, el valor de la expresión se rellenará con espacios en blanco hasta completar la longitud de la variable.

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

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

CASE DEFAULT

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

END DO

El bloque de sentencias será repetido tantas veces como indique la sentencia de control. Existen tres tipos de sentencias de control:

  1. Que no haya sentencia de control; así el bucle se ejecutará hasta que alguna instrucción, dentro del bloque de sentencias, provoque la parada. Esta instrucción será la sentencia EXIT.
  1. Que la sentencia de control tome una progresión de valores hasta alcanzar un valor predeterminado.
  2. Que la sentencia de control sea ejecutada mientras una expresión lógica sea cierta.

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.

Sentencias de control I

Bucles sin sentencia de control

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.

Bucles con sentencia de variable de control

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

END DO

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:

Parámetros de clase

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.

Tipos de datos

  • Tipo entero

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

  • Tipo real

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

  • Tipo complejo

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.

  • Tipo lógico

El tipo lógico en Fortran90 se usa para representar los valores "verdadero" y "falso".

  • Tipo caracter

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.

Operadores

  • Operadores aritméticos

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.

  • Operadores de relació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.

ANINT

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.

DIM(X, Y)

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.

Procedimientos matemáticos y lógicos

Funciones matemáticas

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

Funciones lógicas

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.

Procedimientos carácter

Funciones caracter

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.

ACHAR (I)

Caracter que corresponde al código ASCII I. Caracter.

INDEX(CAD,SUBCAD)

Primera posición de la subcadena en la cadena. Entero.

LEN_TRIM (CAD)

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.