Documente Academic
Documente Profesional
Documente Cultură
Chauca Nolasco
a(1)
a(2)
a(3)
a(4)
a(5)
a(6)
..
arreglo
Cada valor individual se llama elemento
El subndice indica la posicin particular dentro del arreglo.
El subndice es un ENTERO.
Es til para aplicar un algoritmo a un gran nmero de datos a travs de
ciclos
Ejemplo
DO i=1,100
a(i)=sqrt(a(i))
END DO
Arreglo A
B(2)
B(3)
B(4)
Arreglo B
VALOR
VALOR
VALOR
a(1)
1.
b(1)
5.
c(1)
6.
a(2)
2.
b(2)
6.
c(2)
8.
a(3)
3.
b(3)
7.
c(3)
10.
a(4)
4.
b(4)
8.
c(4)
12.
PROGRAM suma_arreglos
IMPLICIT NONE
INTEGER : : i
REAL, DIMENSION (4) : : a=(/ 1., 2., 3., 4./)
REAL, DIMENSION (4) : : b=(/ 5., 6., 7., 8./)
REAL, DIMENSION (4) : : c, d
! Elemento por elemento
DO i=1,4
c(i)= a(i)+b(i)
END DO
! Suma en forma conjunta todos los elementos de los arreglos
d= a+b
!
! Escribo los resultados
PRINT*, c
DO i=1,4
PRINT*, c(i)
END DO
PRINT*, d , d
END PROGRAM suma_arreglos
Impresin
c
6.0
d
6.0
8.0
8.0
10.0
10.0
12.0
12.0
Subconjunto de un arreglo
Para utilizar una seccin del arreglo se especifican los ndices :
inicio:fin:incremento
subndice triple
Ej :
INTEGER, DIMENSION : : arre(/1, 2, 3, 4, 5, 6, 7, 8, 9, 10/)
El subconjunto arre( 1:10: 2)
arre(1), arre(3), arre(5), arre(7) y arre(9)
1, 3, 5, 7 y 9
inicio
valor del ndice inicial del subconjunto
fin
valor del ndice final del subconjunto
Incremento
incremento a travs de los ndices del arreglo.
Si falta:
inicio 1
fin fin del arreglo
incremento 1
Ej:
Subindice vector especifica uno a uno los elementos del arreglo a ser usados
en el clculo.
Ej:
INTEGER, DIMENSION (5): : vec =(/1, 6, 4, 1, 9/)
REAL, DIMENSION (10) : : a (/1., -2., 3., -4., 5., -6., 7., -8., 9., -10./)
a(vec ) es el arreglo [1., -6., -4., 1., 9.]
Entradas y salidas
PRINT*, a(1), a(2), a(3), a(4)
Con DO implcito
Ciclos anidados
WRITE(*,*) ((i, j, j= 1, 3), i= 1, 3)
PRINT*, ((i, j, j= 1, 3), i= 1, 3)
Primero varia j y luego i
1
1
1
2
1
3
2
1
2
2
2
3
3
1
3
2
3
3
Los DO implcitos son muy importantes cuando se trabaja con arreglos que
tienen dos o mas dimensiones.
ARREGLOS
BIDIMENSIONALES
i=1
i=2
i=3
i=4
j=1
j=2
j=3
Ini es de 4x3
Ini es de 1x12
a=
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
a(1, : ) = [ 1 2 3 4 5 ]
6
a( : , 1)=
11
16
21
a(1: 3, 1: 5: 2) =
10
11
13
15
A(2,1,1)
A(1,2,1)
A(2,2,1)
A(1,1,2)
A(2,1,2)
A(1,1,2) A(1,2,2)
A(1,1,1) A(1,2,1)
A(2,1,1)
A(2,1,2)
A(2,2,2)
A(2,2,1)
A(1,2,2)
A(2,2,2)
Otra forma:
logva= log (valor)
Pero no se tuvo en cuenta si exista algn valor negativo o un 0 para la cual la funcin
LOG no es vlida.
Para evitar ese error se debera programar:
DO i=1, ifin
DO j=1, jfin
IF(valor(i,j) >0.) then
logval(i, j) = LOG(valor(i,j))
ELSE
logval(i, j) = -99999.
END IF
END DO
END DO
A esta asignacin se le dice enmascarar
En FORTRAN 90 existe una funcin que realiza esta asignacin: WHERE
[nombre] WHERE ( mask_exp)
Sentencias de asignacin del arreglo !Bloque 1
ELSEWHERE [nombre]
Sentencias de asignacin del arreglo !Bloque 2
END WHERE [nombre]
WHERE (valor>0)
logval=LOG(valor)
ELSEWHERE
logval=-99999.
ENDWHERE
Usando DO e IF
Usando WHERE
ALLOCATABLE ARRAYS
Hasta ahora el tamao de los arreglos que hemos utilizado fue declarado junto
con el nombre de la variable.
Ej:
Para permitir que el tamao de un arreglo sea asignado durante la ejecucin del
Programa el atributo ALLOCATABLE en la declaracin de las variables.
DEALLOCATE ( X )
IMPORTANTE despus de haber hecho esto no podremos acceder ms a la
variable X, su contenido se ha perdido.
PROGRAM verifica
REAL, ALLOCATABLE, DIMENSION(:,:) :: X
ALLOCATE(X(50000,1000))
WRITE(*,*)"X ya est en la memoria de la mquina, presione enter"
READ(*,*)
DEALLOCATE(X)
WRITE(*,*)"X fue eliminado de la memoria de la mquina"
STOP
END PROGRAM verifica
VENTAJAS
Testeo independiente: un subprograma que puede ser compilado
independientemente. Puede ser probado separadamente y elimina fuente de errores
en programas largos.(programa unitario).
Cdigo re-usable: en muchos casos hay procedimientos o clculos que deben
usarse reiteradamente en diferentes programas o en el mismo. Los subprogramas
permiten acceder al calculo sin programarlo reiteradamente.
Asla efectos: Las variables que pueden ser cambiadas por el procedimiento
son aquellas que figuran en la lista de argumentos. Si existe un error puede slo
estar en esos argumentos.
SUBROUTINES
SUBROUTINE nombre (lista de argumentos)
Seccin de declaracin
..
Seccin de ejecucin
..
RETURN
END SUBROUTINE [nombre]
Atributo INTENT
Declara el tipo de las variables ficticias:
INTENT (IN)
El argumento ficticio es usado solo para entrada de datos de
la subrutina
INTENT (OUT)
El argumento ficticio es usado solo para salida de datos de la
subrutina
INTENT (INOUT) El argumento ficticio es usado solo para entrada de datos
en la subrutina y devolver los resultados al llamado del programa.
Ejemplo
SUBROUTINE hipotenusa (lon1, lon2, hipote)
! Proposito: Calcular la hipotenusa a partir de los catetos del triangulo rectngulo
IMPLICIT NONE
! Diccionario y declaracin de variables
REAL , INTENT(IN) : : lon1 ! longitud del lado 1
REAL , INTENT(IN) : : lon2 ! longitud del lado 2
REAL , INTENT(OUT) : : hipote
! longitud de la hipotenusa
REAL : : tem
! Variable Auxiliar temporaria
! Calculo de la hipotenusa
tem= lon1**2 + lon2**2
hipote= SQRT(tem)
RETURN
END SUBROUTINE hipotenusa
Los argumentos ficticios son usados para pasar los datos a la subrutina asi que
ellos son declarados como valores de entrada INTENT(IN) . El argumento ficticio
hipotenusa es un real determinado en la subrutina asi que tiene que ser
declarado como variable de salida INTENT(OUT) .
Ejemplo:
PROGRAM test_hiotenusa
! Proposito: verificar la subrutina hipotenusa
!
IMPLICIT NONE
! Diccionario y declaracin de variables
REAL : : L1
! longitud del lado 1
REAL : : L2
! longitud del lado 2
REAL : : hipote
! longitud de la hipotenusa
PRINT* , test de la subrutina hipotenusa
PRINT* Entre la longitud del cateto1 y cateto 2
READ * , L1, L2
CALL hipotenusa( L1, L2, hipote)
PRINT*, Visualizo el resultado de la hipotenusa
PRINT*, La longitud de la hipotenusa es:, hipo
END PROGRAM test_hiotenusa
PROGRAM lee_ordena_escribe
!Leer, ordenar e imprimir una serie de valores en forma
ascendente
IMPLICIT NONE
INTEGER, PARAMETER::ndatos=6 ! nmero de datos
INTEGER::i
! ndice
REAL, DIMENSION(ndatos):: arr
! Arreglo a ser ordenado
print*,"El numero de datos :",ndatos
PRINT*,"Entre los valores de la serie"
READ*,(arr(i),i=1,ndatos)
PRINT 10,(arr(i),i=1,ndatos)
!LLAMA A LA SUBRUTINA
CALL ORDENAR(arr,ndatos)
!Imprimo
PRINT*," la serie ordenada es"
PRINT 10,arr
10 format(1x,6(f4.1,1x))
END PROGRAM lee_ordena_escribe
SUBROUTINE ordenar(a,nvalores)
IMPLICIT NONE
INTEGER,INTENT(IN)::nvalores ! nmero de datos
REAL,DIMENSION(nvalores),INTENT(INOUT)::a ! Arreglo a ser ordenado
INTEGER::i,j
! ndices
INTEGER::iguardo
! ndice del menor valor
REAL::tem
! Variable temporal para hacer el intercambio
Todo: DO i=1,nvalores-1
!encuentro el menor valor desde a(i) hasta a nvalores
Iguardo=i
min: DO j=i+1,nvalores
IF(a(j)<a(iguardo)) THEN
iguardo= j
END IF
END DO min
F(i /= iguardo) THEN !a(Iguardo) tiene el menor valor as que intercambio con a(i) si i /= iguardo
tem= a(i)
a(i)=a(iguardo)
a(iguardo)=tem
ENDIF
END DO todo
END SUBROUTINE ordenar
Programa de
verificacin
Subrutina
PROGRAM test
REAL : : a, b(4)
INTEGER : : next
..
Call sun1 (a, b, next)
..
End test
SUBROUTINE sun1(x, y, i)
REAL, INTENT(OUT) : : x
REAL, INTENT(IN) : : y(4)
INTEGER : : i
..
END SUBROUTINE sun1
memoria
P.
principal
subrutina
001
002
b(1)
y(1)
003
b(2)
y(2)
004
b(3)
y(3)
005
b(4)
y(4)
006
next
007
Ej:
SUBROUTINE proceso2 (dato1, dato2, n, nvalores)
INTEGER, INTENT(IN) : : n, nvalores
REAL, INTENT((IN), DINENSION(n) : : dato1 ! forma explicita
REAL, INTENT((OUT), DINENSION(n) : : dato2 ! forma explicita
!
!
DO i= 1, nvalores
dato2(i) = 3* dato1(i)
END DO
END SUBROUTINE proceso3
SUBROUTINE ejemplo(texto)
CHARACTER(len=*), INTENT(IN) : : texto
PRINT*, la longitud de texto es: , LEN(texto)
RETURN
END SUBROUTINE ejemplo
Si utilizamos banderas
SUBROUTINE proceso (a, b, resultado, error)
IMPLICIT NONE
! Diccionario y declaracin de variables
REAL , INTENT(IN) : : a, b
REAL , INTENT(OUT) : :resultado
INTEGER , INTENT(OUT) : : error ! Aviso de error =1
REAL : : tem
! Auxiliar temporaria
tem= a-b
IF(tem>=0).then
result = SQRT(tem)
error= 0
ELSE
result=0
error=1
END IF
END SUBROUTINE proceso
Ej
PROGRAM test_modulo
!
! Propsito: ver como se usa el mdulo
!
USE comparto
IMPLICIT NONE
REAL, PARAMETER : : PI= 3.14159
Valores = PI * (/1., 2., 3., 4., 5. /)
CALL sub1
END PROGRAM test_modulo
SUBROUTINE sub1
! Propsito: ver como se usa el mdulo
!
USE comparto
IMPLICIT NONE
PRINT*, valores
END SUBROUTINE sub1
Qu es un MODULE?
Los modules son una forma eficiente de intercambiar informacin entre diferentes
programas y subprogramas.
Tambin permiten agrupar funciones y subrutinas que operan sobre los mismos
datos en paquetes o tool boxes que pueden ser fcilmente utilizados por
diferentes programas
MDULO DE PROCEDIMIENTOS
Los mdulos tambin pueden contener subrutinas y funciones MDULO
DE PROCEDIMIENTOS
PROCEDIMIENTOS son compilados como parte del modulo.
Se ponen disponible a travs de USE
Estn precedidos por CONTAINS Le indica al compilador que siguen
sentencias de procediendo.
Ej:
MODULE mi_sub
(declaracin de los datos)
REAL,
.
CONTAINS
SUBROUTINE sub (a, b, c, x, error)
IMPLICIT NONE
REAL, DIMENSION (3), INTENT(IN) : : a
REAL, INTENT(IN) : : b, c
REAL, INTENT(OUT) : : x
LOGICAL, INTENT(OUT) : : error
Otro ejemplo
Value of PI = 3.1415925
x = -180.deg sin(x) = 8.742277657E-8 cos(x) = -1.
x = -170.deg sin(x) = -0.173648298 cos(x) = 0.98480773
x = -160.deg sin(x) = -0.342020214 cos(x) = -0.939692616
x = -150.deg sin(x) = -0.50000006 cos(x) = -0.866025388
x = -140.deg sin(x) = -0.642787635 cos(x) = -0.766044438
x = -130.deg sin(x) = -0.766044438 cos(x) = -0.642787635
x = -120.deg sin(x) = -0.866025388 cos(x) = -0.50000006
PUBLIC / PRIVATE
SINTAXIS:
PUBLIC :: name1 , name2 , name3
Mientras que las variables / procesos name4, name5, name6 solo podrn ser
utilizadas dentro del MODULE pero no estarn disponibles para otras unidades
que utilicen el MODULE.
PROGRAM : : test
REAL, EXTERNAL : : fun1, fun2
REAL : : x, y, salida
..
CALL evaluar( fun1, x, y, salida)
CALL evaluar( fun1, x, y, salida)
END PROGRAM : : test
****************************************
SUROUTINE evaluar( fun, a, b, resultado)
REAL , EXTERNAL : : fun
REAL, INTENT(IN) : : a, b
REAL , INTENT (OUT) resultado
resultado= b * fun(a)
END SUROUTINE evaluar
! Calculo la suma
sum=0
DO i=1,n
sum = sum + func (REAL( i 1 )* delta)
END DO
! Saco el promedio
valor_medio = sum / REAL(n)
END FUNCTION valor_medio