Presentacin .................................................................................................................. 5
1.0 Programacin bsica con FORTRAN ...................................................................... 6
1.1 Etapas para la preparacin de un programa .......................................................... 6
1.2 Programa fuente .................................................................................................. 6
1.2.1 Formatos para cdigo fuente y lmites del programa ..................................... 6
1.2.2 Esquema bsico de un programa tpico en Fortran ........................................ 7
1.2.3 Caracteres indicadores .................................................................................. 7
1.2.4 Variables y expresiones matemticas ............................................................ 8
1.2.5 Formatos numricos y alfanumricos ............................................................ 9
1.3 Declaraciones bsicas .......................................................................................... 9
1.3.1 OPEN ........................................................................................................... 9
1.3.2 CLOSE ....................................................................................................... 10
1.3.3 READ - WRITE ......................................................................................... 11
1.3.4 IF................................................................................................................ 11
1.3.5 DO ............................................................................................................. 12
1.3.6 DO WHILE ................................................................................................ 12
1.3.7 SELECT CASE .......................................................................................... 12
1.3.8 WHERE ..................................................................................................... 13
1.4 Funciones implcitas .......................................................................................... 13
2.0 Vectores y Matrices............................................................................................... 13
2.1 Declaracin y disposiciones de memoria ........................................................... 14
2.1.1 Vectores ..................................................................................................... 14
2.1.2 Matrices...................................................................................................... 16
2.2 Dimensionamiento dinmico ............................................................................. 20
2.2.1 Punteros...................................................................................................... 20
2.2.2 Alojamiento de memoria............................................................................. 22
2.2.3 Arreglos Automticos ................................................................................. 23
2.2.4 Ejercicios de aplicacin .............................................................................. 23
2.3 Almacenamiento por defecto en FORTRAN...................................................... 24
3.0 Tipos derivados de datos ....................................................................................... 25
3.1 Generalidades .................................................................................................... 25
3.2 Ejemplos ........................................................................................................... 26
4.0 El ambiente de trabajo Developer Studio ........................................................... 28
4.1 Iniciando un proyecto ........................................................................................ 29
4.2 Ejemplos ........................................................................................................... 31
5.0 Subprogramas, creacin y usos .............................................................................. 34
-1 -
-2 -
-3 -
-4 -
Presentacin
El presente texto gua, resume algunos aspectos fundamentales de la programacin con
Fortran 90, de manera que el estudiante estar en capacidad de implementar
herramientas numricas eficientes para resolver problemas de ingeniera.
La
organizacin del texto es la misma estructura del programa de la materia aprobado por
el consejo de facultad para el ao 2005, y abarca desde nociones generales hasta la
creacin de programas usando herramientas de Visual y libreras estadsticas y
matemticas (IMSL).
El compilador Visual Fortran, se encuentra disponible en la facultad, en su versin 6.0,
actualmente se encuentra en el mercado la versin 9.1; la actualizacin de la versin
disponible a 6.5A puede ser obtenida de internet, en el sitio web de Compaq Co.
http://www.compaq.com/fortran. La versin disponible es del antiguo propietario de los
derechos del compilador, Digital Co., http://www.digital.com/fortran que los vendi a
Compaq Co., se hace esta aclaracin porque seguramente encontrar dentro de las
opciones de instalacin las siglas DVF (Digital Visual Fortran), y si obtiene
informacin de internet o baja alguna librera o actualizacin, encontrar las siglas CVF
(Compaq Visual Fortran), desde el ao 1999. Desde la versin 8.0 a partir del ao
2004, los derechos del compilador fueron comprados por el fabricante de
microprocesadores Intel, por lo que se encontraran referencias con las siglas IVF (Intel
Visual Fortran), http://www.intel.com
Es necesario mencionar que las versiones ms avanzadas de un compilador no son ms
que optimizadores respecto la anterior. Lo que quiere decir que su trabajo ser ms
eficiente y talvez ms amigable en el entorno de programacin.
FORTRAN tiene una ventaja realmente importante sobre otros lenguajes y es que se
pueden generar algoritmos matemticos altamente eficientes con l, es un lenguaje para
desarrolladores y no para usuarios comerciales, el compilador genera programas tiles
para cualquier plataforma. Lo que lo ubica entre los programas compilados y no
evaluados (Visual Basic de aplicaciones, MatLab, etc.) La desventaja son los sistemas
de graficacin, sin embargo, existen interfaces amigables que hacen ms fcil el manejo
de grficos y su exportacin a formatos ms conocidos, como BMP, JPG y DXF.
Espero que disfruten aprendiendo de estas notas, como yo lo hice escribindolas.
-5 -
2.
El formato fijo.- Fortran Fixed Format Source File, que es rgido y una herencia
del Fortran 77, admite solo 72 columnas por lnea y tiene una columna fija, la
sexta, debiendo empezar la escritura en la sptima, las cinco primeras se las usa
para numerar las lneas. El Compilador DVF 6.0, disponible en la facultad
admite archivos fuente codificados en F77, a pesar que para la versin F90 este
tipo de formato es considerada obsoleto.
El formato libre.- Fortran Free Format Source File, es ms flexible en cuanto a
la ubicacin de comandos, admite 132 columnas por lnea.
-6 -
Declaracin de variables
FORMATOS
COMENTARIOS
USE declaraciones
Declaracin ejecutables
END
-7 -
Descripcin
Comentario
Lnea de comentario
Smbolo
C,c,*
Separador de
declaraciones
Nmero de lnea
Separador de lnea
Observaciones
En cualquier parte
Al inicio de la lnea
Continuacin
Formatos
Todos
Libre
Fijo
Libre
Sintaxis
Observaciones
Enteros
INTEGER(N)
N = 1,2,4,8 (4)
Real
REAL(N)
N = 4,8,16 (4)
Complejos
COMPLEX(N)
N = 8,16 (8)
Complejo doble precisin DOUBLE COMPLEX(N) N = 8,16 (8)
Lgica
LOGICAL(N)
N = 1,2,4,8 (4)
Alfanumricos
CHARACTER
Mximo 256
Matrices
DIMENSION
Mximo 7 dimensiones
Tabla No. 3.- Tipos de Variables principales
Descripcin
Suma y resta
Multiplicacin
Divisin
Potencia
Menor que
Mayor que
Igual
Mayor o igual
Menor o igual
Diferente
Y
O
No equivalente
Equivalente
No (negacin)
Smbolo
Tipo
Resultado
+,*
Aritmtico
Valor numrico
/
**
.LT., <
.GT., >
.EQ., ==
Comparacin
.GE.,>=
.LE., <=
.TRUE.
.NE.,/=
.FALSE.
.AND.
.OR.
.NEQV. .XOR.
Lgicas
.EQV.
.NOT.
Tabla No. 4.- Operadores admitidos
-8 -
Cientfica
Complejos
Alfanumricos
Formato
In
Ln
Bn
Zn
Ejemplo
I3 : 125
L1 : Y
B4 : 1001 (9)
Z3 : A94
Fn.m
F4.2 : 3.45
En.m
E6.1 : .2E+02
Observaciones
n nmero de cifras
n nmero de caracteres
n nmero de cifras
n nmero de cifras
n nmero de cifras,
m nmero de decimales
n nmero de cifras,
m nmero de decimales
Cientfica de doble densidad
n nmero de cifras,
m nmero de decimales
Dn.m
D8.2 : 0.53D+01
Fn.m,Fn.m
(F5.2,F5.1) :
2Fn.m
(23.56,125.7)
En.m,En.m
An
A5 : varia
n nmero de caracteres
Tabla No. 5.- Formatos usados en Fortran
Los formatos por defecto en el programa, a menos que sean definidos previamente son
los que se detallan en la tabla No. 6.
Variable
Formato
Enteros
I12
Lgica
L2
7
Reales (1 a 10 ) F15.6
Reales (1 a -107) E15.6
Complejos
F23.15,F23.15, 2F23.15
Alfanumricos
A1
Tabla No. 6.- Formatos por defecto
Descripcin
Sirve para abrir un archivo o una variable para posteriormente leer o escribir en ella
informacin producto de una ejecucin o de una asignacin directa de valores.
Sintaxis
OPEN unidad , file
nombre, status
estado, err
-9 -
nmero, iostat
1.3.2 CLOSE
Descripcin
Sirve para cerrar un archivo o una variable que ha sido previamente abierta usando la
declaracin OPEN.
Sintaxis
CLOSE unidad , STATUS
1.
2.
3.
4.
nmero, IOSTAT
- 10 -
Descripcin
Sirve para leer/escribir desde/en un archivo o una variable valores numricos o
alfanumricos.
Sintaxis
READ unidad , format var
WRITE unidad , format var
1.
2.
3.
1.3.4 IF
Descripcin
Existen de tres tipos:
1. El IF aritmtico: este comando ejecuta tres acciones definidas por la lnea que se
designe de acuerdo al valor que toma la variable: negativa, cero o positiva.
2. El IF lgico: este comando ejecuta una declaracin si el valor de la variable es
verdadero, caso contrario la ignora
3. El IF condicional: esta declaracin condiciona la ejecucin de un conjunto de
acciones a una pregunta lgica: si la respuesta es verdadera entonces ejecuta la
accin despus del comando THEN, caso contrario ejecuta la accin colocada
despus del comando ELSE. Siempre se cierra con la declaracin ENDIF.
Puede obviarse la declaracin ELSE, pero no el ENDIF.
Sintaxis
IF (aritmtico)
IF(expr)label1,label2,label3
1. expr: es una expresin numrica del tipo entero o real, encerrado en parntesis.
2. Label1: es una lnea del programa, la ejecucin pasa a esta lnea si la expresin
es menor que cero.
3. Label2: es una lnea del programa, la ejecucin pasa a esta lnea si la expresin
es igual a cero.
4. Label3: es una lnea de programa, la ejecucin pasa a esta lnea si la expresin
es mayor que cero.
IF (lgico)
IF (expr)stmt
1. Expr: es una expresin lgica, entre parntesis.
- 11 -
1.3.5 DO
Descripcin
Ejecuta una accin definida controlando el nmero de veces que se ejecuta un bloque.
Sintaxis
DO [Variable = (valor entero)]
Bloque de ejecucin
ENDDO
1.3.6 DO WHILE
Descripcin
Ejecuta una accin definida si la declaracin entre el parntesis es verdadera, caso
contrario la ignora
Sintaxis
DO [WHILE] (expr)
Bloque de ejecucin
ENDDO
Descripcin
Selecciona dentro de varias opciones las acciones a seguir de acuerdo al valor que toma
una variable entera, lgica o alfanumrica. Esta declaracin reemplaza al GOTO de
Fortran 77.
Sintxis
[nombre] SELECT CASE (variable)
CASE (valor)
Bloque de ejecucin
CASE (valor)
Bloque de ejecucin..
CASE DEFAULT
Bloque de ejecucin
END SELECT [nombre]
- 12 -
1.3.8 WHERE
Descripcin
Realiza una prueba lgica a los elementos de un arreglo o matriz, o a una matriz
completa, ocasionalmente se le asigna un nombre, que debe ser conservado. Lo que se
encuentra entre los signos de agrupacin [] es opcional en la construccin del bloque.
Sintaxis
[nombre] WHERE (expr 1)
Bloque de ejecucin
[ELSEWHERE (expr2) [nombre]
[Bloque de ejecucin] ...]
[ELSEWHERE [nombre]
[Bloque de ejecucin] ...]
END WHERE [nombre]
Definicin
Tipo de Argumento
Tipo de Funcin
Valor absoluto
Entero, real, complejo Entero, real, complejo
Arco Coseno
Real
Real
Logaritmo natural
Real
Real
Logaritmo base 10
Real
Real
Convierte a caracter
Entero
Alfanumrico
Convierte a complejo Entero, real, complejo Complejo
Exponencial
Real
Real
Convierte en real
Entero
Real
Longitud de cadenas
Alfanumrico
Entero
Raz cuadrada
Real o complejo
Real o complejo
Tabla No. 7.- Ejemplo de funciones matemticas
- 13 -
- 14 -
Usando la funcin WHERE tambin se puede asignar valores a los vectores, conocido
los elementos de otro.
Ejemplos
Declaraciones de vectores
COMPLEX, DIMENSION (10) :: A,B,C
COMPLEX :: A(10), B(10), C(10)
COMPLEX, DIMENSION (0:9) :: A,B,C
COMPLEX, DIMENSION (0:18:2) :: A,B,C
COMPLEX A(0:9), B(2:18:2), C(::), D(:20:)
Otra forma:
REAL, DIMENSION (:) :: A,B,C
ALLOCATABLE :: A,B,C
Luego de un bloque de ejecucin se obtiene n
ALLOCATE(A(n),B(n),C(n), STAT = StatusValor)
IF (statusValor /= 0) STOP No hay memoria suficiente
- 15 -
Ejercicios de aplicacin
1. Declarar un vector de cantidades enteras con las siguientes caractersticas:
a. La sucesin de ndices comienza en el -1 y finaliza en el 9, con un
escaln, entre subndices de 2 unidades
2. Se desea asignar al vector Z de nmeros enteros los valores pares comprendidos
entre 2 y 12. Usando una funcin para definir los elementos.
3. Haciendo uso de un lazo DO implcito asignar al vector compuesto por 100
nmeros enteros, los siguientes valores: -4 y 8 para el primero y el ltimo
elemento y 0 para los 98 restantes.
4. Escribir un programa que tome una lista de nmeros y los ordene. El usuario
deber introducir primero cuantos nmeros quiere ordenar y a continuacin la
lista de nmeros. El programa devolver por pantalla la lista ordenada.
5. Realizar un programa usando FORALL, que convierta todos los caracteres de
una frase introducida por teclado en maysculas.
2.1.2 Matrices
Son arreglos de datos con ms de una dimensin, Fortran soporta hasta 7 dimensiones.
Igual que los vectores son del tipo ENTERO, REAL, COMPLEJO o
ALFANUMERICO.
- 16 -
Cuando se hacen declaraciones con triple especificacin, el ltimo elemento indica las
posiciones: inferior, inferior + paso, inferior + 2*paso, etc. Sin sobrepasar el lmite
superior si el paso es mayor que cero, si el paso es menor que cero sin llegar a valores
bajo el lmite superior. Si i es omitido se toma el lmite inferior del arreglo, si s es
omitido se toma el lmite superior del arreglo, y, si el paso es omitido se asume el valor
de 1.
Tipo, DIMENSION (:,:,:,), ALLOCATABLE :: lista de arreglos
Asignacin de valores
1. Lectura usando DO implcito:
READ *,((TABLA(FILA,COL), COL = a,b), FILA = c,d)
READ *,(TABLA(I,J,K), I = a,b), J = c,d), K = e,f)
Con valores:
11 22 33
A
44 55 66
El subarreglo definido por: A(1:2:1, 2:3:1) o simplemente A(:, 2:3) es una
matriz de 2x2 que contiene las dos ltimas columnas de la matriz A.
22 33
55 66
44 55 66
- 17 -
55 66
22 33
3. Asignacin de un arreglo a otro.
Sean dos matrices declaradas como:
A
0 0 0
0 0 0
La declaracin: B = RESHAPE (A, (/3,2/)), asigna a la matriz B el contenido
de A
0 0
B 0 0
0 0
Tambin se pueden asignar valores a manera de subarreglos dentro de una
matriz, por ejemplo en la matriz original A con elementos igual a cero, la
declaracin:
A
0 1 9
0 4 16
4. Asignacin mediante la sentencia WHERE
Sean dos matrices A y B declaradas como:
REAL, DIMENSION (2,3) :: A, B
Donde la matriz A tiene los valores:
A
WHERE ( A /= 0.)
B = 1.0/REAL(A)
ELSEWHERE
B = 0.0
END WHERE
- 18 -
Ejemplos
Declaraciones de matrices
COMPLEX, DIMENSION (10,20,10) :: A,B,C
COMPLEX :: A(10,10), B(10,5), C(10,30)
COMPLEX, DIMENSION (0:9,1:4) :: A,B,C
COMPLEX, DIMENSION (0:18:2,1:12:4,0:9:1) :: A,B,C
COMPLEX A(0:9,:13:,1:6), B(2:18:2,12)
Otra forma:
REAL, DIMENSION (:,:,:) :: A,B,C
ALLOCATABLE :: A,B,C
Luego de un bloque de ejecucin se obtiene n y m
ALLOCATE(A(n,m),B(n,m),C(n,m), STAT = StatusValor)
IF (statusValor /= 0) STOP No hay memoria suficiente
SHAPE(A)
SUM(A,D)
SPREAD(A,D,N)
TRANSPOSE(A)
Ejercicios de aplicacin
1. Declarar una matriz de nmeros enteros, de dos filas y tres columnas. Rellenarla
en sus primeros elementos con los valores 11, 12, 13, 14 y los dos restantes con
0, rellenarlas por filas e indicar la matriz obtenida.
2. En un programa se declara una matriz mediante la sentencia:
REAL, DIMENSION (-4:0:1,1:7:1):: A
- 19 -
2.2.1 Punteros
El objetivo de su uso es el de almacenar los arreglos consecutivamente dejando
posiciones de memoria sin uso al final del espacio reservado. Considrese la siguiente
declaracin de matrices y vectores:
PARAMETER (NA_MAX = 100)
REAL(KIND = 8), DIMENSION (NA_MAX, NA_MAX) :: A
REAL(KIND = 8), DIMENSION (NA_MAX) :: V, W
Se observa claramente que para no tener que compilar y enlazar el programa cada vez
que se desea trabajar con matrices de tamaos de distintos tamaos se ha definido un
parmetro, este parmetro indica el mximo tamao admisible sin necesidad de
modificar el programa. En este caso se suponen que no existirn matrices de orden
mayor a 100, por lo que se reserva espacio suficiente para matrices 100x100
coeficientes reales de doble densidad, luego un vector de 100 espacios y luego otro
vector de 100 posiciones. Una vez asignado el espacio el programa mediante una
- 20 -
Si por ejemplo se ingresa para NDIM el valor de 4, el programa solo usa las primeras 16
posiciones de memoria para la matriz A, el vector V de 4 elementos se encuentra
almacenado detrs de la matriz A, es decir, hay 100 2-16 nmeros reales de doble
densidad que no van a ser usados.
=
=
=
=
1
NA + NDIM*NDIM
NV + NDIM
NW + NDIM
Matriz A
Vector V despus de A
Vector W despus de V
Fin del espacio ocupado
- 21 -
O su equivalente
Tipo, DIMENSION (:,:,:,) :: lista de arreglos
ALLOCATABLE :: lista de arreglos
Una vez conocido el valor de la dimensin que se define se asigna la dimensin usando
la sentencia:
ALLOCATE(lista de arreglos, STAT = variable entera)
ALLOCATE(lista de arreglos)
- 22 -
Siempre que sea necesario reasignar valores al arreglo es necesario liberar la memoria,
de igual forma antes de finalizar la ejecucin se recomienda liberar la memoria.
ai , j
xi
j 1
i, j 1,...n
- 23 -
Se almacenan los coeficientes siguiendo el orden que imponen las columnas, es decir:
a22
a32
a13
a23
a33
l11 0 0 0
l21 l22 0 0
L
l31 l32 l33 0
l41 l42 l43 l44
Por consiguiente para esta matriz el computador la almacena como:
l11 l21 l31 l41 0 l22 l32 l42
- 24 -
0 0 l33 l43
10
0 0 0 l44
0 0 l33 l43
10
0 0 0 l44
:: estructura1, estructura2, .
- 25 -
Esta forma de definir un valor constante para un tipo derivado de datos, se conoce con
el nombre de constructor de estructura, adems es posible referirse directamente a una
determinada componente de una estructura escribiendo el nombre de esa estructura
seguido del smbolo % y del nombre de la componente:
Nombre_estructura%nombre_componente
Con los tipos derivados de datos as como con sus componentes pueden hacerse ciertas
operaciones.
1. Encapsular un tipo dentro de otro tipo: en la definicin de tipo derivado se puede usar a
su vez otro.
2. Asignar valores a las variables de un tipo derivado: dado que cada componente de una
estructura posee cierto tipo declarado, tal componente se puede utilizar de la misma
forma que se hace con cualquier otro dato del mismo tipo.
3. Entrada y salida de componentes de un tipo derivado.
READ *, elemento%nombre
PRINT *, elemento%nombre
3.2 Ejemplos
1. Escribir un programa que lee las coordenadas de dos puntos en el plano, p1(x1,y1),
p2(x2,y2) y calcule los tres coeficientes a,b,c de la recta que los une, sabiendo que esa
ecuacin tiene la forma: ax + by +c = 0, los tres coeficientes de la recta, en funcin de
las coordenadas de los dos puntos son: a = y2 y1, b = x1 x2, c = y1.x2 y2.x1
2. La distancia entre dos puntos de coordenadas (x1,y1) y (x2,y2) est dada por
- 26 -
3.
PAUL
10101ADA
PABLO
10102APLIC
GEOVANNY 10103CALC
- 27 -
75038081
65059884
25019374
Explorador
del espacio
de trabajo
Escritorio de trabajo
- 28 -
- 29 -
- 30 -
Source Files: donde se almacenan los programas fuente, con extensin *.FOR
o *.F90.
Header Files: donde se almacenan los archivos de interface con extensin
*.FD o *.FI, entre el programa fuente y los recursos de visual.
Resource Files: donde se almacenan los recursos de visual (cuadros de
dilogo, conos, men, etc.), archivos con extensin *.RC.
4.2 Ejemplos
1. Escriba un programa que permita realizar operaciones con nmeros complejos,
es necesario ingresar la informacin desde pantalla y el resultado debe mostrarse
en la pantalla.
Solucin
De acuerdo al esquema mostrado en la figura No. 1, la codificacin de este
programa en formato libre es la siguiente:
! Iniciamos con el titulo del programa
program complejos
! Se evita que el programa adopte la variables por defecto
implicit none
! Definicin de variables
complex a,b,c
integer n
! Bloque de ejecucin
! Ingresa el primer nmero complejo
write(*,*)'Ingrese un nmero complejo, como par ordenado'
read(*,*)a
- 31 -
- 32 -
- 33 -
5.1 Subrutinas
5.1.1 Definicin
Son subprogramas con igual estructura que un programa, salvo por su ttulo, inicia con
la lnea especificando la expresin SUBROUTINE y depende del tipo de subrutina los
argumentos necesarios. Una subrutina se invoca con la declaracin CALL desde el
programa principal y retorna un valor o varios de la ejecucin de la misma.
Existen 3 tipos de subrutinas:
1. Recursiva: permite incidencia de lo ocurrido sobre s misma
2. Pura: los procedimientos que se ejecuten no pueden incidir sobre s misma
3. Elemental: los procedimientos estn restringidos al hecho de que no se pueden
usar los arreglos de manera simultnea.
La sintaxis de la lnea inicial es la siguiente
[prefijo] SUBROUTINE nombre (lista de argumentos)
El prefijo es opcional y tiene que ver con el tipo de subrutina descrito en el prrafo
anterior: RECURSIVE, PURE, ELEMENTAL, por omisin es pura (PURE). El nombre
de la subrutina sigue las mismas reglas que el de un programa principal, es decir, es una
cadena alfanumrica que inicia con una letra y no puede contener caracteres especiales,
salvo barra baja. La lista de argumentos es opcional, si es que los tiene van separados
por comas.
Las reglas de su uso:
1. Los argumentos de llamada, si los hay, deben ser del mismo tipo que los usados
en la ejecucin de la subrutina.
2. La ejecucin de la subrutina empieza con la primera lnea despus del ttulo
SUBROUTINE, y retorna el control al programa principal cuando se ha
invocado la declaracin END o RETURN.
3. Una subrutina no puede contener declaraciones de otros subprogramas.
5.1.2 Ejemplo
El siguiente cdigo muestra el llamado a una subrutina PURE, con y sin argumentos
para ilustrar su uso. El resultado de la ejecucin se muestra en la figura No. 8.
program ejemplo
implicit none
! Definicin de variables
real x,y,z
- 34 -
5.2 Mdulos
5.2.1 Definicin
Es un subprograma que contiene especificaciones y definiciones que pueden ser usadas
por otros subprogramas o por un programa principal. El nombre del mdulo es
- 35 -
5.2.2 Ejemplo
El ejemplo muestra el uso de mdulos para definir variables que sern usadas en el
programa principal y las subrutinas que son llamadas desde ste, aunque el programa es
sencillo y realiza operacin entre complejos, la aplicacin en problemas ms elaborados
es similar.
El cdigo del programa principal es el siguiente:
program usomodulo
! Declaracin para usar el mdulo
use ejemplo
use variables
! Bloque de ejecucin
write(*,10)
! Llamada a subrutinas del mdulo
call primera(a,b)
call segunda(a,b,c)
call tercera(c)
! Definicin de formatos
10 format(/,'PROGRAMA USANDO MODULOS',/)
! Fin del programa principal
end
- 36 -
- 37 -
5.3 Funciones
5.3.1 Definicin
Es un subprograma que evala una expresin y retorna un valor, que se almacena en la
variable que se usa. Dentro de su bloque de ejecucin no puede tener ningn otro tipo
de subprograma o hacer referencia a ellos.
La sintaxis que usa una funcin es la siguiente:
[prefijo] FUNCTION nombre ([lista de argumentos]) [RESULT (variable)]
Bloque que ejecucin
END FUNCTION [nombre]
El prefijo es el mismo que se usa para las subrutinas o define el tipo de funcin que es:
entera, real, alfanumrica o compleja; el nombre cumple con las mismas reglas para
nombrar subprogramas, la lista de argumentos son las variables de entrada y si es el
caso se especifica la variable de salida que resultar de la ejecucin de la funcin.
Cuando la funcin es invocada desde el programa principal simplemente se lo hace con
el nombre de la funcin y el listado de argumentos, de la misma manera que se llama
una funcin implcita del lenguaje.
5.3.2 Ejemplo
El siguiente ejemplo ilustra el uso de funciones en un programa principal, la funcin es
del tipo real y obtiene la semisuma de dos nmeros complejos, al final el resultado es
mostrado por pantalla.
El cdigo fuente del programa principal es el que sigue:
program usofuncion
implicit none
! Definicin de variables
complex x,y,z,semisuma
! bloque de ejecucin
! Ingreso de la informacin
write(*,*)'Ingrese un complejo como par ordenado'
read(*,*)x
write(*,*)'Ingrese un complejo como par ordenado'
read(*,*)y
! Clculo de la funcin
z=semisuma(x,y)
! Escritura de resultados
write(*,*)'el resultado es: '
write(*,*)z
! fin del bloque de ejecucin
end
- 38 -
5.4 Interfaces
5.4.1 Definicin
Es un subprograma que define interfaces explcitas para subprogramas externos o
procedimientos. Tambin pueden ser usados para definir un nombre genrico para
procedimientos, un nuevo operador para funciones o una nueva asignacin para
subrutinas. Puede contener subrutinas o funciones.
Una interface va ubicada en el cuerpo del programa y no puede contener la declaracin
FORMAT, pero si puede hacer referencia a mdulos usando la declaracin USE.
La sintaxis de las interfaces es la siguiente:
INTERFACE [ nombre o especificacin ]
[declaraciones] ...
[ MODULE PROCEDURE nombres o lista de nombres ] ...
END INTERFACE [ nombre o especificacin ]
- 39 -
- 40 -
- 41 -
6.2.3 Ejemplo
Se va a realizar la codificacin del proyecto DLL y luego la del programa principal,
para ilustrar el uso de las libreras DLL.
Se crearn 4 subrutinas divididas en 2 archivos DLL, uno para realizar sumas y restas y
otro para divisin y multiplicacin. Las variantes que se hacen es que en el de sumas y
restas se generan un archivo para cada subrutina, contenidos en el mismo proyecto. Y
para el caso de producto en el mismo archivo se generan las dos subrutinas.
El cdigo del programa principal es el siguiente:
program main
!DEC$ ATTRIBUTES
!DEC$ ATTRIBUTES
!DEC$ ATTRIBUTES
!DEC$ ATTRIBUTES
implicit none
real :: x,y,z
DLLIMPORT::LIBRERIAS
DLLEXPORT::PRODUCTOS
DLLEXPORT::CASOS
DLLEXPORT::COCIENTES
write(*,*)'Ingrese x'
read(*,*)x
write(*,*)'Ingrese Y'
read(*,*)y
call librerias(x,y,z)
write(*,*)'la suma es: ',z
call casos(x,y,z)
write(*,*)'La resta es: ',z
call productos(x,y,z)
write(*,*)'El producto es: ',z
call cocientes(x,y,z)
write(*,*)'El cociente es: ',z
end
- 42 -
En este cdigo podemos observar que la declaracin de atributos se hace para cada
subrutina, no para cada archivo, las cuatro lneas se pueden simplificar usando comas
para separar el nombre de las subrutinas.
Las subrutinas del para sumar y restar son las siguientes, una en cada archivo.
! LIBRERIAS.f90
! FUNCTIONS/SUBROUTINES exportadas desde LIBRERIAS.dll:
!
LIBRERIAS
- subroutine
!
subroutine LIBRERIAS(X,Y,Z)
!DEC$ ATTRIBUTES DLLEXPORT::LIBRERIAS
implicit none
real :: x,y,z
z = x+y
end subroutine LIBRERIAS
! Fin del archivo
! LIBRERIAS.f90
! FUNCTIONS/SUBROUTINES exportadas desde LIBRERIAS.dll:
!
LIBRERIAS
- subroutine
!
subroutine CASOS(X,Y,Z)
!DEC$ ATTRIBUTES DLLEXPORT::CASOS
implicit none
real :: x,y,z
z = x-y
end subroutine CASOS
! Fin del archivo
- 43 -
!
!
!
!
!
!
!
!
!
!
!
- 44 -
Para que esta ventana sea activa debe recibir salidas de texto o grficos pero no por eso
al estar abierta con otras ventanas sta es la superior o la primera que se presenta, para
que esto ocurra se debe usar la sentencia IOFOCUS, en las opciones de la sentencia
OPEN o como una funcin INQFOCUSQQ del tipo entero.
OPEN(UNIT=10,FILE=USER,TITLE=Ventana Adicional, IOFOCUS=.TRUE.)
USE DFLIB
INTEGER(4) status, focusunit
OPEN(UNIT = 10, FILE = 'USER', TITLE = 'Child Window 1')
OPEN(UNIT = 11, FILE = 'USER', TITLE = 'Child Window 2')
! Convierte en ventana active a la ventana 2
WRITE (11, *) 'Giving focus to Child 2.'
! Convierte en ventana activa a la 1 con la funcin FOCUSQQ
status = FOCUSQQ(10)
...
! Determina que ventana est activa y la almacena en la variable
status = INQFOCUSQQ(focusunit)
- 45 -
Para escribir texto en pantalla se debe definir primero el color del texto y luego otras
configuraciones usando la subrutina OUTGTEXT y el texto que debe mostrarse, las
lneas de cdigo para hacerlo son:
TYPE (xycoord) xys
! Inicio de la configuracin del texto a escribirse
I = INITIALIZEFONTS()
! Caractersticas de la fuente: tipo, tamao, etc
I = SETFONT('t''Arial''h18w10pvib')
! Color de la fuente un nmero del 1 al 16
I = SETCOLOR(INT2(5))
! Ubicacin del texto en pixels dentro de la ventana active, ntese
! que se necesita definer un tipo de objeto coordenadas
CALL MOVETO(INT2(0),INT2(30),xys)
! Texto que se escribir
CALL OUTGTEXT('he escrito este texto')
Para dibujar figuras, la secuencia es la misma solo que en lugar de llamar a la subrutina
OUTGTEXT, se usa la funcin de la figura que se desea dibujar. Esta funcin es del
tipo entera, las funciones que soporta FORTRAN son lneas, rectngulos, elipses y
polgonos. Adems de relleno de estas figuras y opciones de estilo de lnea, siempre
usando como coordenadas los pxeles.
! Dibuja un rectngulo/elipse, el parmetro control puede tener dos
valores: ! $GFILLINTERIOR que indica que el rectngulo ser coloreado
totalmente y no se podr definir la lnea de contorno, y $GBORDER
dibuja el contorno del rectngulo/elipse y el interior transparente.
x1,y1,x2,y2 son las coordenadas en pixeles de la esquina superior
izquierda y la esquina inferior derecha.
i = RECTANGLE (control, x1, y1, x2, y2)
i = ELLIPSE(control, x1,y1,x2,y2)
! Dibuja una lnea desde la posicin actual hasta las coordenadas en
! pixels x,y.
i = LINETO(x,y)
!
!
- 46 -
- 47 -
2.
3.
4.
5.
6.
7.
MB$IDCANCEL.
MB$IDIGNORE
MB$IDNO.
MB$IDOK.
MB$IDRETRY
MB$IDYES
Para evaluar las opciones se puede usar SELECT CASE y especificar las acciones para
cada botn que se presione.
El cuadro de dilogo ABOUT (Acerca de), de los mens de Ayuda de la barra de
mens de los programas tpicos pueden personalizarse, por defectos se muestran como
se grafica en la figura No. 14.
- 48 -
Del cdigo anterior se observa que la funcin que controla las variaciones del men es
la funcin lgica APPENDMENUQQ que tiene 4 argumentos: el nmero de secuencia
en la que se crear el men, el primer men y sus submens tienen el nmero 1, el
segundo 2 y as en adelante, FLAGS corresponde a las opciones que se listan a
continuacin; TEXT el texto que aparecer en el men o submen: ROUTINE, es la
rutina que se ejecuta cuando se selecciona este men, puede ser una rutina por defecto
del sistema o rutinas creadas por el usuario.
log = APPENDMENUQQ (menuID, flags, text, routine)
Si queremos activar una tecla de acceso rpido para usar un men o submen con
ALT+LETRA, se coloca un & delante de la letra del nombre que aparecer como men
o submen que queremos activar y sta aparecer en la ventana de ejecucin del
programa subrayada. El parmetro ROUTINE corresponde al paso del comando a una
subrutina, propia de FORTRAN o una creada por el usuario, en caso de que el usuario
las haya creado se usa la sentencia EXTERNAL luego de USE DFLIB, para declarar
estas subrutinas. Las rutinas de FORTRAN son:
1.
2.
3.
4.
5.
6.
7.
- 49 -
i = CLICKMENUQQ (item)
- 50 -
- 51 -
7.9.2 Ejemplo
El siguiente cdigo ejemplariza el uso de las funciones basadas en eventos; las acciones
de escribir en pantalla algo especfico pueden ser reemplazados por cualquier accin. En
este caso se ha escrito la accin realizada y la posicin en pixeles dentro de la pantalla
adems dibuja una lnea gris con el botn izquierdo y coloca un punto amarillo con el
derecho, en la posicin X,Y.
program principal
use dflib
external rutina, rutina2
integer :: i
open(1,file='user', title='Ventana 1')
write(1,*)'Eventos del Ratn'
i = registermouseevent(1,mouse$lbuttondown,rutina)
i = registermouseevent(1,mouse$rbuttondown,rutina2)
do while(.true.)
enddo
end
subroutine rutina(unidad,evento,estado,x,y)
use dflib
integer :: i,evento,estado,x,y,unidad
write(unidad,*)'click izquierdo'
write(unidad,*)x,y
i = setcolor(8)
i = lineto(x,y)
end
subroutine rutina2(unidad,evento,estado,x,y)
use dflib
integer :: i,evento,estado,x,y,unidad
write(unidad,*)'click derecho'
write(unidad,*)x,y
i = setcolor(14)
i = RECTANGLE($GBORDER, x, y, x+2, y+2 )
end
- 52 -
Donde EVENTO son los mismos descritos en la tabla No. 10, ESTADO son los
enunciados en la tabla No. 11, y, X y Y es la posicin en pixeles de la ventana donde
ocurre el evento.
Como la funcin bloquea la ejecucin del programa, debe primero definirse un evento
para esperar su ejecucin. El esquema general de codificacin de esta funcin se ilustra
en el siguiente ejemplo:
event=mouse$lbuttondown
event=ior(event,mouse$move)
i=registermouseevent(unit,event,rutina)
do while (.true.)
i=waitonmouseevent(mouse$move,estado,x,y)
enddo
7.9.4 Ejemplo
El siguiente ejemplo ilustra como se codifica una aplicacin para dibujar a mano alzada,
con el botn derecho con lneas color verde y con el botn izquierdo con rectngulos
blancos de aspecto slido.
program subrutina
use dflib
external boceto
integer i,event,unit,estado,x,y
unit=0
event=mouse$lbuttondown
event=ior(event,mouse$move)
i=registermouseevent(unit,event,boceto)
do while (.true.)
i=waitonmouseevent(mouse$move,estado,x,y)
enddo
end
subroutine boceto(unit,event,estado,x,y)
use dflib
integer i,x,y,event,estado,unit
type(xycoord)xys
selectcase(estado)
case(mouse$ks_lbutton)
i = SETCOLOR(15)
I = rectangle($gfillinterior,x-2,y-2,x+2,y+2)
case(mouse$ks_rbutton)
I = SETCOLOR(10)
i = lineto(x,y)
case default
I = SETCOLOR(0)
i = lineto(x,y)
- 53 -
endselect
end subroutine
- 54 -
- 55 -
La variable que define la funcin dlgget (adquirir) es del tipo lgica; dlg, es la
definicin del tipo de cuadro, IDC_INT es el identificador del cuadro de texto en el
cuadro de dilogo, texto es una variable del tipo alfanumrica, xint es una variable
del tipo real o la que se haya definido.
log = dlgget(dlg,IDC_INT,texto)
read(texto,*)xint
La funcin para asignar el valor lgico a la variable de cada control es DLGSET con
iguales argumentos que el caso anterior.
=
=
=
=
DlgSet
DlgSet
DlgSet
DlgSet
(
(
(
(
dlg,
dlg,
dlg,
dlg,
IDC_LISTBOX1,
IDC_LISTBOX1,
IDC_LISTBOX1,
IDC_LISTBOX1,
3, DLG_NUMITEMS )
"Proa",1 )
"Popa", 2 )
"Seccin Media", 3 )
Se puede cambiar en cualquier momento la lista o los valores de la lista, el nuevo tem,
simplemente se define en una lnea de cdigo como sigue:
log = DLGSET ( dlg, IDC_LISTBOX1, 4)
log = DLGSET ( dlg, IDC_LISTBOX1, "Cubierta", 4)
- 56 -
Para leer desde un LIST BOX, se usa la funcin lgica DLGGET. Hay que aclarar que
solamente se leen caracteres, por lo que si existe un valor numrico en la lista, es
necesario hacer una reasignacin de variables, como se detall en la seccin de los
EDIT BOX. La sintaxis empleada es la siguiente:
log = DLGGET (dlg, id_control, Variable_texto)
Ejemplo
El siguiente cdigo adiciona elementos a un cuadro de dilogo, el resultado de la
ejecucin se presenta en la figura No. 20.
! TAMBIEN SE PUEDE CODIFICAR EN FORMATO FIJO
! El programa muestra un cuadro de dilogo de donde se lee texto
! y opciones lgicas, luego escribe en pantalla y en el mismo cuadro
! de dilogo, con lo que se completan las funciones bsicas de operacin
! de un cuadro en Fortran. Antes de escribir una secuencia o lnea de
! comando se explica brevemente el porqu.
!
! El proceso de creacin de un cuadro de dilogos es el siguiente
! del men INSERT - RESOURCE - DIALOG - NEW. Con esta secuencia se abre el
! editor de cuadro de dilogos.
!
! Desde la barra de controles se insertan los objetos, en este ejemplo se han
! insertado 2 EditBox, 1 StaticText, 2 RadioButton, 1 CheckBox y se
conservaron los
! botones OK,Cancel. Con doble click en cada objeto se abre el cuadro de
! propiedades donde se pueden cambiar algunas opciones. En el identificador
! se puede cambiar a partir del _ para personalizar los nombres.
! una vez terminado el diseo en el cuadro de dilogos se graba, por defecto
! se abre la ltima ventana de grabacin, as que es prudente colocar este
! nuevo archivo en el mismo directorio del Espacio de Trabajo y del Proyecto
! por defecto el nombre es 'Script1.RC', si se desea se puede cambiar caso
! contrario da igual, el siguiente paso es adicionar al proyecto este archivo
! siguiendo la secuencia: PROJECT - ADD TO PROJECT - FILES - Seleccionar el
! archivo *.rc
!
! Finalmente compilar, concatenar y ejecutar
!
! El archivo 'resource.fd' es producto de la compilacin del archivo
! 'Script1.rc', as que no es creado, el nico que debe ser codificado
! es este archivo
!
! Demasiado fcil como para no hacerlo.
program dialogos
- 57 -
- 58 -
log = DlgInit(IDD_DIALOG1,dlg)
! Accin que se ejecuta al hacer click en el botn OK
! Funcin lgica que pasa la ejecucin del programa a la subrutina
! Tiene tres argumentos
! 1. La variable que define al cuadro (TYPE)
! 2. El identificador del botn que se ejecuta para pasar el mando
! 3. Nombre de la subrutina que continua con la ejecucin del programa
log = DlgSetSub (dlg,IDOK,Subrutina)
! Funcin entera que muestra al cuadro de dilogo en pantalla
! requiere un argumento, la variable que define al cuadro (TYPE)
i4 = DlgModal(dlg)
!
!
!
!
!
end subroutine
! Subrutina que es llamada cuando se da click en el botn aceptar OK
! Requiere tres argumentos:
! 1. Variable que define al cuadro (TYPE)
! 2. Identificador del botn que pasa el comando
! 3. Accin que se ejecuta sobre el botn
subroutine subrutina(dlg,IDOK,dlg_clicked)
! Librera necesaria para trabajar con cuadros de dilogos, viene
! instalada con el compilador DVF, pero es necesario expresarla
use dflogm
logical log,retlog1,retlog2
integer i4
real x,y
character*25 texto,numero,texty
! Declaracin del tipo de objeto a usarse. 'dlg' es una variable
! puede tener cualquier nombre
type(dialog)dlg
! Producto de la compilacin del cuadro de dilogos, no puede cambiarse
! el nombre.
include 'resource.fd'
! Funcin lgica que lee la informacin de un cuadro de edicin
! y asigna el valor de lo que lee a la variable alfanumrica 'texto'
! **Desde un cuadro solo se lee y escribe caracteres, NO VALORES**
! La funcin requiere tres argumentos
! 1. Variable que define al cuadro (TYPE)
! 2. Identificador del cuadro de texto
! 3. Variable alfanumrica a la que se le asigna la informacin leda
log = DlgGet(dlg,IDC_EDIT1,texto)
! Condicin que evita error cuando se ha dejado en blanco esta casilla
if (texto.eq.' ') then
texto='nada'
endif
! Cuando se necesitan ingresar valores numricos, stos inicialmente se
! les asigna una variable alfanumrica y luego se hace la transformacin
! como sigue.
log = DlgGet(dlg,IDC_EDIT2,numero)
! Condicin que evita que error cuando no se llena esta casilla
if (numero.eq.' ') then
- 59 -
numero='0.0'
endif
read(numero,*)x
! Asigna lo ledo en 'numero' a la variable real 'X' con
cualquier formato
! Funcin lgica que lee la informacin lgica de los botones de
! seleccin RADIO BUTTONS, su resultado se almacena en la variable
! lgica 'retlog'
log = DlgGet(dlg,IDC_RADIO1,retlog1)
! Funcin lgica que lee la informacin lgica del cuadro de verificacin
! CHECK, su resultado se almacena en la variable 'retlog2'
log = DlgGet(dlg,IDC_CHECK1,retlog2)
! Acciones que se ejecutan cuando las variables 'texto','retlog1' y
! 'retlog2' tienen un valor ya definido, este prrafo ya se lo hace
! de acuerdo a las exigencias que desee cada uno.
! Ejecucin para la variable 'retlog1' del botn de seleccin
select case (retlog1)
! Cuando se selecciona toma el valor de verdadero y se ejecuta
! lo que sigue
case (.true.)
! Funcin lgica que escribe en la etiqueta lo que se ley en el
! cuadro de edicin de texto. La funcin requiere los mismos argumentos
! que la funcin DLGGET.
log = DlgSet(dlg,IDC_STATIC,texto)
write(*,*)'Se ha seleccionado la opcin 1'
! Cuando no ha sido seleccionado toma el valor de falso
case (.false.)
texto = '<static>'
! Funcin lgica que escribe en la etiqueta el contenido de la variable
texto
log = DlgSet(dlg,IDC_STATIC,texto)
write(*,*)'Se ha seleccionado la opcin 2'
end select
! Ejecucin para la variable 'retlog2' de la casilla de verificacin
!
!
!
y
- 60 -
use dflogm
logical l4,retlog
integer i4
type(dialog)dlg
include 'resource.fd'
l = dlginit(IDD_ACERCA,dlg)
i4 = dlgmodal(dlg)
call dlgexit(dlg)
end subroutine
- 61 -
8.1.2 Descripcin
El mdulo contiene 10 subrutinas.
1. FAGLCLOSE
2. FAGLENDWATCH
3. FAGLGETSHARENAME
4. FAGLHIDE
5. FAGLLBOUND
6. FAGLNAME
7. FAGLSAVEASFILE
8. FAGLSHOW
9. FAGLSTARTWATCH
10. FAGLUPDATE
Estas rutinas son llamadas en la siguiente secuencia
La primera rutina que debe llamarse es faglStartWatch con el arreglo como
argumento.
Si se desea presentar un arreglo en diferentes escalas, se llama a faglLBound
con el arreglo como argumento y el otro arreglo donde se encuentran los lmites
inferiores.
Para colocar un ttulo en la barra de la ventana se llama a faglName con el
arreglo a presentar y el ttulo personal.
- 62 -
8.1.3 Sintaxis
A continuacin se describen las principales rutinas del programa Array Visualizer,
describiendo sus argumentos y sintaxis.
CALL FAGLSTARTWATCH (array,status)
Array
nombre del arreglo que contiene la informacin a ser presentada es del
tipo real, dimension NxMxP
Status
Variable entera de uso interno del programa, toma el valor de 0 cuando se
ha ejecutado correctamente la rutina y el valor de 1 cuando no lo ha
hecho.
CALL FAGLLBOUND (array,lbnd,status)
Array
nombre del arreglo que contiene la informacin a ser presentada es del
tipo real, dimension NxMxP
Lbnd
Un arreglo del tipo entero que tiene la misma dimension de Array, con la
informacin en escala 1.
Status
Variable entera de uso interno del programa, toma el valor de 0 cuando se
ha ejecutado correctamente la rutina y el valor de 1 cuando no lo ha
hecho.
CALL FAGLNAME (array,Title,status)
Array
nombre del arreglo que contiene la informacin a ser presentada es del
tipo real, dimension NxMxP
Title
Una variable de carcter que contiene el ttulo del grfico.
Status
Variable entera de uso interno del programa, toma el valor de 0 cuando se
ha ejecutado correctamente la rutina y el valor de 1 cuando no lo ha
hecho.
CALL FAGLSHOW (array,,status)
Array
nombre del arreglo que contiene la informacin a ser presentada es del
tipo real, dimension NxMxP
Status
Variable entera de uso interno del programa, toma el valor de 0 cuando se
ha ejecutado correctamente la rutina y el valor de 1 cuando no lo ha
hecho.
CALL FAGLCLOSE (array,,status)
Array
nombre del arreglo que contiene la informacin a ser presentada es del
tipo real, dimension NxMxP
- 63 -
Status
8.1.4 Ejemplo
La siguiente codificacin produce la curva de la funcin coseno. El resultado de la
ejecucin del programa se observa en la figura No. 21.
program array
use avdef
real, dimension(0:360) :: x,y
real :: angulo,pi
integer :: i,status
character(len=25) :: titulo
titulo='Funciones Seno y Coseno'
pi=3.14159
do i=0,360
angulo = float(i)*pi/180.
x(i) = cos(angulo)
write(*,*)angulo,x(i),y(i)
enddo
CALL FAGLSTARTWATCH (x,status)
CALL FAGLNAME (x,titulo,status)
CALL FAGLSHOW (x,status)
pause
CALL FAGLENDWATCH (x,status)
- 64 -
end
- 65 -
ETAPA
SUBRUTINA
SINTAXIS
PLOTS
(idef,ioport,model)
Inicio
FACTOR
(fact)
PLOT
(x,y,ipen)
Origen
SCALE
(array,axlen,npts,inc)
Escala y valores
STAXIS
(annhgt,tihgt,xphgt,ticlug,ndeca)
Ejes coordenados
AXIS
(x,y,ctext,nchar,axlen,angle,first,delta)
Graficacin de datos
LINE
(xarray,yarray,npts,inc,lintyp,inteq)
CURVE
(xarray,yarray,npts,seglen)
Caracteres del grfico SYMBOL
(x,y,height,ctext,angle,nc)
NUMBER
(x,y,height,fpn,angle,ndec)
(x,y,ipen)
Ejecucin del grfico PLOT
Tabla No. 11.- Secuencia de una graficacin con Plot 88
- 66 -
2.
3.
4.
5.
6.
- 67 -
7.
8.
9.
10.
8.2.4 Ejemplo
La siguiente codificacin produce el ejemplo clsico de Plot88, la curva Gaussiana.
Correspondiente al ejemplo EXA 42; ntese el orden en el que se hacen las llamadas a
subrutinas.
PROGRAM EXA42
CHARACTER*1 TITC(20),NAM1(20),NAM2(20)
CHARACTER*20 TITLE,NAME1,NAME2
CHARACTER*27 FILENAME
REAL XDATA(202),YDATA(202)
INTEGER*2 IC
CHARACTER*1 ANS
EQUIVALENCE (TITC(1),TITLE),(NAM1(1),NAME1),(NAM2(1),NAME2)
DATA IC/0/
open(4,file="exa42.inp")
- 68 -
- 69 -
CALL PLOT(1.00,1.00,-3)
CALL SCALE(XDATA,6.00,LENG,1)
CALL SCALE(YDATA,3.00,LENG,1)
CALL STAXIS(.25,.25,.111,.112,1)
CALL AXIS(0.,0.,NAME2,-N2,6.00,00.,XDATA(LENG+1),XDATA(LENG+2))
CALL AXIS(0.,0.,NAME1, N1,3.00,90.,YDATA(LENG+1),YDATA(LENG+2))
WRITE(0,*) 'Begin drawing output.'
CALL PLOT(0.0,0.0,999)
60 FORMAT(A27)
61 FORMAT(A20)
1000 FORMAT(A)
END
8.3 CVFGraf
8.3.1 Generalidades
Esta rutina de graficacin fue creada entre abril de 2002 y Junio de 2004, cuando se
hizo la ltima correccin a la presente versin, no por esto quiere decir que no habr
versiones posteriores mejoradas que con la ayuda de retroalimentacin que
proporcionarn ustedes los usuarios de esta rutina. La rutina est escrita en Fortran 90,
formato libre y para ser usada en un proyecto del tipo FORTRAN STANDARD
GRAPHICS. No tiene la estructura de mdulo as que bastar con adicionar al proyecto
el archivo que la contiene y llamar a sus subrutinas desde el programa principal. No
soporta graficacin en tres dimensiones, ni funciones cuyo resultado sean valores
- 70 -
infinitos, los arreglos no tienen lmites, estn declarados con 500 valores pero el usuario
puede cambiarlos a voluntad.
1. CVFaxis ( )
1.1 Descripcin: Esta subrutina define los ejes de coordenadas del grfico,
requiere de los siguientes parmetros
1.2 Sintaxis
CVFAXIS(x,y,n,titulo,titx,tity,escalas,grilla,fondo,scalx,scaly)
1.3 Argumentos:
1.3.1 X: es el arreglo que desea graficarse en el eje de las abcisas; debe
declararse como un vector de nmeros reales
1.3.2 Y: es el arreglo que desea graficarse en el eje de las ordenadas; debe
declararse como un vector de nmeros reales
1.3.3 N: es el nmero de puntos que van a graficarse, definido por un entero
1.3.4 Titulo: es el ttulo del grfico, que se colocar como ttulo de la
ventana que contiene el grfico. Se la define como carcter, si no ingresa
como variable a la rutina debe colocarse apstrofes con el nombre.
1.3.5 Titx: es el ttulo del eje X, que se colocar a la derecha del eje de
abcisas
1.3.6 Tity: es el ttulo del eje Y, que se colocar sobre el eje de las ordenadas
1.3.7 Escalas: es un nmero entero que puede tomar dos valores CERO (0)
para que cada eje tenga escalas independientes, y, UNO (1) para que los
ejes tengan la misma escala, cualquier otro valor resulta en error.
1.3.8 Grilla: es un nmero entero que puede tomar dos valores CERO(0)
para no graficar una grilla en el plano cartesiano, y, UNO (1) para
graficar una grilla en el plano, cualquier otro valor resulta en error.
1.3.9 Fondo: es un nmero entero que puede tomar tres valores CERO (0)
coloca el fondo negro ejes y textos en blanco, UNO (1) fondo gris, ejes y
textos en negro, DOS (2) fondo blanco, ejes y textos en negro, y, TRES
(3) no grafica ejes pero el fondo siempre ser negro. Las curvas
ploteadas no se ven afectadas en el color.
1.3.10 ScalX: es el valor de la escala para graficar el eje X, resultado que se
obtiene de la subrutina, sirve para ingresar a la subrutina
CVFGRAFICA.
1.3.11 ScalY: es el valor de la escala para graficar el eje Y, resultado que se
obtiene de la subrutina, sirve para ingresar a la subrutina
CVFGRAFICA.
- 71 -
2. CVFGrafica ()
2.1 Descripcin: Esta subrutina plotea los puntos en el plano previa graficacin de
los ejes, si no se ha llamado previamente a la subrutina CVFAXIS no es posible
graficar los puntos.
2.2 Sintxis: CALL CVFGRAFICA(x,y,n,marca,color,scalx,scaly)
2.3 Argumentos: Requiere de los siguientes argumentos de entrada:
2..3.1 X: es el arreglo que desea graficarse en el eje de las abcisas debe
declararse como un vector de nmeros reales
2.3.2 Y: es el arreglo que desea graficarse en el eje de las ordenadas, debe declararse
como un vector de nmeros reales
2.3.3 N: es el nmero de puntos que van a graficarse, definido por un entero.
2.3.4 Marca: es un nmero entero, dibuja una marca para indicar la posicin del par
graficado y toma los siguientes valores:
0 Dibuja una lnea sin marcas
1 Dibuja una lnea con marcas cuadradas
2 Dibuja marcas redondas sin lnea
3 Dibuja marcas cuadradas sin lnea
4 Dibuja una lnea con marcas redondas
5 Dibuja sercha cbica sin marcas
6 Dibuja sercha cbica con marca cuadrada
7 Dibuja sercha cbica con marca redonda
Cualquier otro valor el resultado es error
2.3.5 Color: es un nmero entero que define el color de la curva, y toma los
siguientes valores:
1 rojo
2 blanco
3 verde
4 amarillo
5 azul
6 magneta
7 turquesa
8 gris
2.3.6 ScalX y ScalY: son el resultado de la subrutina anterior.
8.3.3 Ejemplo
La codificacin siguiente genera la curva de las funciones Seno y Coseno.
program principal
real, dimension(500) :: x,y,z
integer i,n,color,marca,escalas,grilla
character(25) titulo,titx,tity
titulo='Funciones Seno y Coseno'
titx='Grados'
tity='Seno/Coseno'
pi=3.14159
do i=0,360
angulo=float(i)*pi/180
y(i)=cos(angulo) x(i)=float(i)
z(i)=sin(angulo)
write(*,*)angulo,y(i),x(i)
enddo
escalas=0 ! usar escalas independientes
- 72 -
8.4 DXFortran
8.4.1 Generalidades
El proyecto DXFortran, fue desarrollado por los profesores Carlos Otero y Davide
Santos de la Universidad de Algarve de Lisboa, Portugal, y tiene por objeto el
desarrollo de una Librera Vectorial de Graficacin en formato DXF (Drawing
Interchange Format) para Fortran 90. El autor de estas notas, adapt esta librera para
ser usada como herramienta de ploteo de coordenadas en un plano y el espacio, de tal
forma que este nuevo arreglo sea usado directamente sin necesidad de conocer a fondo
las rutinas principales del proyecto. Las subrutinas adapatadas fueron adicionadas al
mdulo del proyecto, para evitar errores y est constituido por dos secciones:
- 73 -
- 74 -
1.3.6 y: arreglo que contiene los datos de las ordenadas, argumento real
1.3.7 n: nmero de puntos en los arreglos, la subrutina soporta hasta 999
puntos, argumento Entero
1.3.8 L: Parmetro Entero que indica si se desea graficar una marca que
indique la posicin de los pares ordenados, los valores que puede
tomar son:
0 Dibuja lneas y no las marcas
1 Dibuja lneas y marcas
2 Dibuja marcas y no lneas
2. dfGraph3D ( )
2.1 Descripcin: realiza el ploteo de una funcin matemtica o de un arreglo de
pares ordenados en tres dimensiones, define 3 capas denominadas Ejes
(rojo), Textos (azul) y Grfico (blanco), y todas con el tipo de lnea continua.
El ploteo lo realiza uniendo los pares de coordenadas con una lnea recta. La
longitud de los ejes se define en la subrutina buscando el mximo valor del
arreglo en cada eje y el tamao de los textos son definidos en base a una
fraccin del mnimo de los mximos valores de los arreglos para de esta
forma guardar proporcionalidad entre los textos y el grfico.
2.2 Sintaxis: CALL dfGraph3D (Archdxf,Texto,TextX,TextY,x,y,z,n,L)
2.3 Argumentos:
2.3.1 Archdxf: nombre del archivo con extensin DXF, argumento
alfanumrico
2.3.2 Texto: ttulo del grfico, argumento alfanumrico.
2.3.3 TextX: ttulo del eje X, argumento alfanumrico.
2.3.4 TextY: Ttulo del eje Y, argumento alfanumrico.
2.3.5 x: arreglo que contiene los datos de las abcisas, argumento real.
2.3.6 y: arreglo que contiene los datos de las ordenadas, argumento real.
2.3.7 z: arreglo que contiene los datos de los valores de Z, argumento real.
2.3.8 n: nmero de puntos en los arreglos, la subrutina soporta hasta 999
puntos. Argumento Entero.
2.3.9 L: Parmetro Entero que indica si se desea graficar una marca que
indique la posicin de los pares ordenados, los valores que puede tomar
son:
0 Dibuja lneas y no las marcas
1 Dibuja lneas y marcas
2 Dibuja marcas y no lneas
La segunda seccin nos permite realizar varios ploteos en el mismo dibujo, para lo cual
es necesario seguir la siguiente secuencia: todo dibujo se inicia con el llamado a dfStart
y los argumentos respectivos, luego si se desea graficar ejes se invoca a la subrutina
dfAxis, la parte del ploteo la realiza la subrutina dfGraph, que puede ser invocada las
veces que sean necesarias para realizar todas los ploteos que se deseen, finalmente debe
terminarse el ploteo con dfEnded (de la primera seccin).
3.
dfStart ()
3.1 Descripcin: Inicia el dibujo para ploteo y define 3 capas denominadas
Ejes (rojo), Textos (azul) y Grafico (blanco), y todas con el tipo de lnea
continua.
3.2 Sintaxis: CALL dfStart (archdxf,FileNum)
3.3 Argumentos:
- 75 -
8.4.4 Ejemplo
El siguiente cdigo grafica las curvas de las funciones Seno y Coseno en un archivo
DXF.
program grafico
use dflib
integer i4,j4
character(25) archdata, texto,ARCHDXF
real, dimension (500)::x,y,z,w
pi=3.14159
do i=0,360,1
x(i+1)=pi*float(i)/180.
y(i+1)=sin(pi*float(i)/180.)
- 76 -
z(i+1)=cos(pi*float(i)/180.)
w(i+1)=0.0
enddo
archdxf='grafico.dxf'
CALL dfStart (archdxf,i4)
CALL dfAxis ('SENO Y COSENO','ANGULO','F(X)',x,y,W,360)
CALL dfGraph (x,y,W,360,0)
CALL dfGraph (x,Z,W,360,0)
CALL dfEnded (i4)
end
- 77 -
9.3 Ejemplo
Se us la rutina BCONG, que minimiza una funcin de N variables, sujeta a lmites de
las variables, usando el mtodo de Newton y una gradiente proporcionada por el
usuario.
program LibreriasIMSL
use numerical_libraries
INTEGER N
PARAMETER (N=2)
INTEGER IPARAM(7), ITP, L, NOUT
REAL F, FSCALE, RPARAM(7), X(N), XGUESS(N),XLB(N), XSCALE(N), XUB(N)
- 78 -
EXTERNAL ROSBRK
DATA XGUESS/-1.2E0, 1.0E0/, XSCALE/2*1.0E0/, FSCALE/1.0E0/
DATA XLB/-2.0E0, -1.0E0/, XUB/0.5E0, 2.0E0/
! All the bounds are provided
ITP = 0
! Default parameters are used
IPARAM(1) = 0
! Minimize Rosenbrock function using
! initial guesses of -1.2 and 1.0
CALL BCONF ( rosbrk,N, XGUESS, ITP, XLB, XUB, XSCALE, FSCALE,IPARAM,
RPARAM, X, F)
! Print results
CALL UMACH (2, NOUT)
WRITE (NOUT,10) X, F, (IPARAM(L),L=3,5)
!
10 FORMAT (' The solution is ', 6X, 2F8.3, //, ' The function ',&
&'value is ', F8.3, //, ' The number of iterations is ',&
& 10X, I3, /, ' The number of function evaluations is ',&
& I3, /, ' The number of gradient evaluations is ', I3)
!
END
!
SUBROUTINE ROSBRK (N, X, F)
INTEGER N
REAL X(N), F
!
F = 1.0E2*(X(2)-X(1)*X(1))**2 + (1.0E0-X(1))**2
!
RETURN
END
- 79 -
- 80 -
- 81 -
- 82 -
Titulo:
Ncols:
Nfilas:
fmt
Excel
El cdigo abajo expuesto dar como resultado una tabla como la presentada en la figura
30.
program main
use dflib
real, dimension(1000,1000)::array
CHARACTER(6) TITULO(1000)
character(25)fmt
NROWS=10
NCOLS=2
do i=1,nrows
array(1,i)=0.2*i
enddo
do i=1,nrows
array(2,i)=30.*9.*array(1,i)*0.65/1.025
enddo
titulo(1)='H'
titulo(2)='DESP'
! Uno para generar el archivo, Cero para no generarlo
i4=1
fmt='(f7.1)'
CALL TABLA(array,titulo,ncols,nrows,fmt,i4)
end
- 83 -
- 84 -
- 85 -
- 86 -
aunque al igual que la subrutina anterior esta dimensin puede variar de acuerdo a las
necesidades del usuario.
1. CVFxlsEsc ()
1.1 Descripcin: Esta subrutina escribe un archivo de datos en formato DIF, capaz
de ser ledo por MS Excel, con la informacin almacenada en un arreglo
x(fila,columna)
1.2 Sintaxis: CALL CVFxlsEsc (archdata,col,n,x)
1.3 Argumentos:
1.3.1 Archdata: es una variable alfanumrica que contiene el nombre del
archivo en el que se escribir la informacin, el programa coloca la
extensin DIF, si el nombre no la tiene y cambia cualquier extensin que
se ingrese a la de DIF.
1.3.2 Col: es el nmero de columnas del arreglo
1.3.3 N: es el nmero de filas del arreglo
1.3.4 X: es el arreglo donde se almacena la informacin que desea escribirse
en el archivo, tiene dimensin (n,col)
2. CVFxlsLee()
2.1 Descripcin: Esta subrutina lee desde un archivo de datos en formato DIF,
informacin numrica y la almacenada en un arreglo x(fila,columna).
2.2 Sintxis: CALL CVFxlsLee (archdata,col,n,x)
2.3 Argumentos: Requiere de los siguientes argumentos de entrada:
2.3.1 Archdata: es una variable alfanumrica que contiene el nombre del
archivo en el que se escribir la informacin, el programa coloca la
extensin DIF, si el nombre no la tiene y cambia cualquier extensin que
se ingrese a la de DIF.
2.3.1 Col: es el nmero de columnas del arreglo, esta variable es el resultado
de llamar a la subrutina.
2.3.1 N: es el nmero de filas del arreglo, variable resultante de llamar a la
subrutina.
2.3.1 X: es el arreglo donde se almacena la informacin que se lee desde el l
archivo, tiene dimensin (n,col).
El cdigo fuente que ejecuta esta subrutina se detalla a continuacin:
! INICIO DE RUTINA DE ESCRITURA EN EXCEL
! Esta subrutina escribe en un archivo de intercambio de datos, para
! abrirlo en Excel, por defecto se crea una sola hoja electnica.
subroutine CVFxlsEsc(archdat,col,n,x)
! Nota: la declaracin del arreglo x(n,col) debe ser la misma que en
! el arreglo del archivo principal
! la variable con la que se llama a la subrutina debe tener la
! misma dimensin para que sea compatible.
!
! Argumentos
!
! archdat
Nombre del archivo de datos, el programa cambia la
!
extensin a DIF
! col
Nmero de columnas del arreglo de datos, entero
! n
Nmero de filas del arreglo de datos, entero
! x
Arreglo que contiene la informacin que desea guardarse d
!
aunque es mandatorio que debe tener la misma dimensin de
!
la variable que llama a la subrutina.
- 87 -
use dflib
use dfwin
integer i,n,col
real, dimension(10,10):: x
character*25 archdat,archdif,arch
character*1 resul(29)
equivalence (resul(1),archdif)
! Cambio o coloca la extensin al nombre del archivo de datos
archdif=archdat
do i=1,25
k=26-i
if((resul(k).ne.' ')) goto 7
end do
7 nt=k
if (nt.ge.5) then
if (resul(nt-3).eq.'.') then
resul(nt-2)='d'
resul(nt-1)='i'
resul(nt) ='f'
endif
else
resul(nt+1)='.'
resul(nt+2)='d'
resul(nt+3)='i'
resul(nt+4)='f'
endif
! Fin del cambio de extensin
! Abrir el archivo DIF
open(2,file=archdif,status='new',err=1969)
! Escribe el encabezado
write(2,10)n,col
! Fin del encabezado
! Escritura de resultados
do i=1,n
write(2,13)
do j=1,col
write(2,14)x(i,j)
end do
end do
! Fin de escritura de informacin
! Cerrar el archivo de resultados
write(2,15)
close(2,status='keep')
i4=messageboxqq('El programa ha terminado, se ha generado un &
& archivo, \rescrito en formato de intercambio de &
& datos'c,'Fin de la aplicacin'c,&
& mb$iconexclamation.or.mb$ok)
!
! para poder ver el archivo de resultados debe cambiarse el nombre del
! archivo LEE.DIF por el nombre que se uso en el programa
!
- 88 -
- 89 -
subroutine CVFxlsLee(archdat,col,n,x)
! Nota: la declaracin del arreglo x(n,col) debe ser la misma que en
! el arreglo del archivo principal, la variable con la que se llama a
! la subrutina debe tener la misma dimensin para que sea compatible.
!
! Argumentos
!
! archdat
Nombre del archivo de datos siempre con extensin DIF
! col
Nmero de columnas del arreglo de datos, esta variable es
!
el resultado de llamar a la subrutina. INTENT (OUT)
! n
Nmero de filas del arreglo de datos. INTENT (OUT)
! x
Arreglo que resulta de leer la informacin desde un archivo
!
de datos DIF, es de dos dimensiones (NxCOL)
use dflib
integer i
integer, intent(out):: n,col
real, intent(out), dimension (200,200):: x
character*25 archdat
character*2 alfa,bravo
! Abrir el archivo para lectura y
! Obtencin del nmero de filas (n) y columnas (col)
open(2,file=archdat,status='old',err=1969)
read(2,10)n
read(2,11)col
10 format(////,2x,i4)
11 format(//,2x,i4)
! Fin de lectura inicial Filas y columnas
! Inicio de lectura por filas
read(2,12)alfa
do i=1,n
read(2,13)
do j=1,col
read(2,14)x(i,j)
end do
end do
12 format(///,a2)
13 format(/,a2)
14 format(2x,e12.6,/)
! Fin de la lectura de datos
! Cerrar el archivo de datos
close (2,status='keep')
! Fin
return
1969 i4 = messageboxqq('El archivo no ha sido encontrado'c, 'Error'c,&
& mb$iconstop.or.mb$ok)
end subroutine
- 90 -
- 91 -
use dfwin
integer unit, hwnd, res, rows, i
hwnd = GetHwndQQ(unit)
do i = 1, rows
res = SendMessage(hwnd,WM_VSCROLL,SB_LINEDOWN,0)
enddo
end subroutine scrolldown
- 92 -
En trminos generales los mtodos de resolucin se ajustan a los tipos de matrices, los
primeros se resuelven con mtodos directos y los segundos con mtodos iterativos.
Mtodos directos
Los mtodos directos de resolucin son aquellos que permiten obtener la solucin del
sistema despus de un nmero finito de operaciones.
Debido a que las computadoras tienen un nmero finito de cifras decimales, los errores
de redondeo se propagan, de manera que se pretende desarrollar mtodos con un
nmero mnimo de operaciones, la clasificacin de los mtodos directos son:
- 93 -
La solucin se expresa como sustitucin hacia delante o hacia atrs, segn se est
resolviendo un sistema triangular superior o inferior respectivamente. Los algoritmos
para resolver estas matrices son:
El nmero de operaciones que deben realizarse en cada caso es: n2 para ambos casos
Mtodos de eliminacin
1. Mtodo de Gauss, eliminacin simple: este mtodo se basa en transformar la matriz
original A, mediante permutaciones y combinaciones lineales de las ecuaciones en una
matriz triangular superior, este nuevo sistema equivalente se resuelve de manera
inmediata, aplicando el algoritmo del apartado anterior.
Las ecuaciones que transforman la matriz original en una triangular superior y
modifican al trmino independiente son:
- 94 -
Mtodos de descomposicin
Los mtodos de factorizacin se fundamentan en el concepto de que toda matriz A
puede descomponerse en matrices triangulares superiores e inferiores o en el producto
- 95 -
- 96 -
- 97 -
. Se pide
- 98 -
Nota: Toda la teora, algoritmos y ejemplo han sido extrados del texto de la referencia:
[8]
- 99 -
11.1 Documentacin
La documentacin de una aplicacin puede ser agrupada en dos categoras, la
documentacin externa, es decir la que se genera fuera del cdigo y la interna que viene
incluida dentro del cdigo. Para fines de modificaciones, stas deben hacerse en los dos
tipos de documentacin y en lo posible si el cdigo va a ser colocado en Internet o para
intercambio con otros centros de investigacin deben escribirse en ingls.
- 100 -
!----------------------------------------------!
! [Nmero de seccin] [Ttulo de seccin]
!
!-----------------------------------------------------------------------
NombreArreglo
[ProgramName]
! Description:
!
[Say what this program does]
!
! Method:
!
[Say how it does it: include references to external documentation]
!
[If this routine is divided into sections, be brief here,
!
and put Method comments at the start of each section]
!
! Input files:
!
[Describe these, and say in which routine they are read]
! Output files:
!
[Describe these, and say in which routine they are written]
! Current Code Owner: [Name of person responsible for this code]
!
!
!
!
History:
Version
Date
---------[version] [date]
Comment
------Original code. [Your name]
! Code Description:
!
Language:
Fortran 90.
!
Software Standards: "European Standards for Writing and
!
Documenting Exchangeable Fortran 90 Code".
! Declarations:
! Modules used:
Use, Only : &
! Imported Type Definitions:
! Imported Parameters:
! Imported Scalar Variables with intent (in):
- 102 -
11.4.2 Subrutinas
! [A one line description of this subroutine]
!
Subroutine [SubroutineName] &
!
!
([InputArguments, inoutArguments, OutputArguments])
! Description:
!
[Say what this routine does]
!
! Method:
!
[Say how it does it: include references to external documentation]
!
[If this routine is divided into sections, be brief here,
!and put Method comments at the start of each section]
!
! Current Code Owner: [Name of person responsible for this code]
!
! History:
! Version
Date
Comment
! ---------------! [version] [date]
Original code. [Your name]
!
! Code Description:
!
Language:
Fortran 90.
!
Software Standards: "European Standards for Writing and
!
Documenting Exchangeable Fortran 90 Code".
!
! Declarations:
! Modules used:
Use, Only : &
! Imported Type Definitions:
! Imported Parameters:
- 103 -
! Local parameters:
! Local scalars:
! Local arrays:
!- End of header ------------------------------------------------
11.4.3 Funciones
! [A one line description of this function]
!
Function [FunctionName]]&
([InputArguments])
&
Result ([ResultName]) ! The use of result is recommended
! but is not compulsory.
!
!
!
!
!
!
!
!
!
!
!
!
Description:
[Say what this function does]
Method:
[Say how it does it: include references to external documentation]
[If this routine is divided into sections, be brief here,
and put Method comments at the start of each section]
Current Code Owner: [Name of person responsible for this code]
History:
Version
Date
Comment
- 104 -
!
!
!
!
!
!
!
!
!
!
---------[version] [date]
Code Description:
Language:
Fortran 90.
Software Standards: "European Standards for Writing and
Documenting Exchangeable Fortran 90 Code".
Declarations:
Modules used:
! Local parameters:
! Local scalars:
! Local arrays:
!- End of header ----------------------------------------------------
11.4.4 Mdulos
! [A one line description of this module]
!
Module [ModuleName]
!
! Description:
!
[Say what this module is for]
!
! Current Code Owner: [Name of person responsible for this code]
!
- 105 -
! History:
!
! Version
Date
Comment
! ---------------! [version] [date]
Original code. [Your name]
!
! Code Description:
!
Language:
Fortran 90.
!
Software Standards: "European Standards for Writing and
!
Documenting Exchangeable Fortran 90 Code".
!
! Modules used:
!
Use, only : &
! Imported Type Definitions:
! Imported Parameters:
! Imported Scalar Variables with intent (in):
! Imported Scalar Variables with intent (out):
! Imported Array Variables with intent (in):
! Imported Array Variables with intent (out):
! Imported Routines:
! Declarations must be of the form:
! [type]
[VariableName]
! Description/ purpose of variable
Implicit none
! Global (i.e. public) Declarations:
! Global Type Definitions:
! Global Parameters:
! Global Scalars:
! Global Arrays:
! Local (i.e. private) Declarations:
! Local Type Definitions:
! Local Parameters:
! Local Scalars:
! Local Arrays:
! Operator definitions:
!
Define new operators or overload existing ones.
Contains
! Define procedures contained in this module.
End module [ModuleName]
!- End of module header
- 106 -
- 107 -
V
0.5V
3.28 LPP
LPP
CB 0.7 0.125ATAN 25
0.14 LPP 20B
CB
FN
26B
0.23 LPP 20B
CB
3
26B
FN 2
CB
0.23 FN
- 108 -
x 2 y2
DG
Lpp 4.19
203Cb
47.4TRIM
Lpp
13B
Lpp
194
35.8APala
Lpp H
7.79ABulbo
Lpp H
Esta frmula se refiere a codastes abiertos, sin considerar diferencias entre los
giros de estribor o babor, si el codaste es cerrado, el sexto trmino se reemplaza
el coeficiente de -35.8 por +3.82.
Buques de dos hlices
DG
Lpp 0.727
197Cb
41TRIM
Lpp
4.65B 188
Lpp
218APala
Lpp H N 1
25.66ABulbo
Lpp H
0.234V
0.675
Lpp
Buques de dos hlices
DG
DT Lpp
0.14
Lpp
Avance (advance)
IMO requiere que el avance no exceda de 4.5 veces la eslora entre
perpendiculares
DT
Lpp
0.91DG
Lpp
- 109 -
1.77V
Lpp
0.357
En general IMO requiere que, tras haber metido el timn 10, el buque no
recorra ms de 2.5 veces su eslora cuando su rumbo haya cambiado 10.
Escriba un programa en FORTRAN, que permita obtener los parmetros de
maniobrabilidad del buque. El programa debe reunir obligatoriamente los
siguientes aspectos:
1. Usar el formato de codificacin de las Normas Europeas para Fortran 90
2. Debe usarse al menos un tipo de subprograma para realizar los clculos
3. Debe usar DLL para los subprogramas.
4. Los resultados y los parmetros de ingreso deben almacenarse en un archivo
5. La matriz de resultados debe imprimirse por pantalla como una tabla que
permita verificar la informacin de manera fcil, se considera la dimensin X
como los parmetros de maniobrabilidad y la dimensin Y los ngulos de caa.
12. En cierto tipo de material metlico de prueba, se sabe que la resistencia a la
traccin sobre un metal est relacionada funcionalmente con la resistencia al
corte. La tabla siguiente es un conjunto de datos experimentales codificados
sobre las dos variables.
Resistencia a la traccin
26.8
25.4
28.9
23.6
27.7
23.9
24.7
28.1
26.9
27.4
22.6
25.6
Resistencia al corte
26.5
27.3
24.2
27.1
23.6
25.9
26.3
22.5
21.7
21.4
25.8
24.9
Relaciones tiles:
Ecuacin de la lnea de regresin simple:
YX
x i yi
xi
i 1
yi
i 1
n
i 1
2
x i2
xi
i 1
n
i 1
n
yi
xi
i 1
i 1
n
13. Escribir un programa en FORTRAN, que calcule el momento de inercia I zz y el
mximo momento flexionante de un perfil estructural L,T,I,H y C, el programa
debe tener las siguientes caractersticas:
a. Mensajes para continuar con otra figura hasta que el usuario desee salir
b. Mensajes de advertencia y error cuando se ingresa un dato errneo
c. Todas las subrutinas deben realizarse usando DLL
d. Debe mostrar una tabla en pantalla con los valores intermedios y el
resultado
e. Debe guardar en un archivo los valores intermedios y el resultado
f. Debe haber opciones para vigas de varios materiales.
Frmulas tiles
yA
I zz
mx
Io
Ad 2
Io
bh 3
(Donde b es la base, h la altura)
12
Mc
I zz
- 111 -
ESFUERZO A
TENSION (Kg/cm2)
4200
2100
2800
14000
- 112 -
3 mdulos
Separador Central
5 mdulos
- 113 -
- 114 -
12
A
A
A
A
A
A
A
A
A
A
11
A
A
A
A
B
B
B
B
B
B
10
A
B
B
B
A
B
B
A
A
B
9
A
A
B
B
A
A
B
B
B
A
8
A
B
A
B
B
A
A
A
B
B
7
A
B
B
A
B
B
A
B
A
A
- 115 -
15. Escriba un programa en Fortran que permita escoger una figura para graficar
entre la siguientes opciones: rectngulo, polgono de N lados, elipse o crculo, el
usuario debe seleccionar el tipo e ingresar la informacin referente a
dimensiones o nmero de lados, el grfico se lo hace en pantalla y en un archivo.
16. Haga un programa en Fortran para dibujar un boceto a mano alzada sobre la
ventana.
- 116 -
Referencias
[1] Etzel, M., Dickinson, K. Digital Visual Fortran Programmers Guide, 1999
[2] Digital Equipment Co. Digital Fortran, Language Reference Manual, 1997.
[3] Nyhoff, L., Leestma, S., Fortran 90 for Engineers and Scientists, 1997
[4] Jones, C., Fortran 90 Standards, 2001
[5] PlotWorks, Plot88 Users Manual, 2000.
[6] Moreno, J., CVFGraf Manual de Usuario, 2004
[7] Santos, D., Otero D., DXFortran Gua del Usuario, 2002
[8] Varios, Mtodos Numricos Introduccin, aplicaciones y programacin, 1998.
[9] Varios, Programacin en FORTRAN 95 y Problemas resueltos, 2005.
- 117 -