[ anterior ] [ Contenidos ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ siguiente ]
Fortran 90
para la asignatura Química Computacional
Los objetivos de esta clase son los siguientes:
presentar las matrices o arreglos de una y varias dimensiones como estructuras
de datos en Fortran
.
presentar cómo se define una matriz y cómo se accede a sus elementos.
presentar la sintaxis de los bucles DO como estructura de control. DO implícito. Uso de esta estructura con matrices.
Definición dinámica del tamaño de arreglos.
Arreglos multidimensionales.
Conceptos previos:
rango (rank): número de índices necesarios para indicar un elemento de la matriz.
límites (bounds): valor superior e inferior del índice que indica los elementos de la matriz en cada dimensión.
extensión (extent): número de elementos de la matriz para cada dimensión.
tamaño (size): número total de elementos de la matriz.
Se dice que dos arreglos son "conformables" si tienen idéntico rango y extensión.
Es importante al explicar este material hacer énfasis en los siguientes puntos
definición de una matriz monodimensional (vector) y uso de la estructura de control DO presentado en Programa ejemplo_3_1.f90, Sección 3.3.1. (ejercicio 2_1)
es recomendable definir las dimensiones de las matrices (en caso de dimensionamiento estático) como variables (o parámetros) lo que facilita posteriores cambios.
es importante siempre inicializar las matrices que se definan. La inicialización puede llevarse a cabo en el momento en el que la matriz se defina, mediante READ o usando asignaciones. Es muy simple inicializar todos los elementos de una matriz a un mismo valor: vec = valor. Una matriz también puede definirse e inicializarse usando los llamados array constructors. Por ejemplo, para definir una matriz entera vec_intcon seis elementos puede usarse cualquiera de las tres opciones siguientes
do i = 0, 5 vec_int(i) = 2*i enddo vec_int = (/(2*i, i = 0, 5)/) vec_int = (/0,2,4,6,8,10/)
Las dos últimas opciones implican array constructors y pueden llevarse a cabo al definir la variable.
como se define el tamaño de una matriz definida con el atributo ALLOCATABLE al correr el programa usando la función ALLOCATE tal y como se aplica en el ejemplo Programa ejemplo_3_2.f90, Sección 3.3.2. En el caso de ALLOCATE es posible añadir una opción STAT = var tal que si la definición del arreglo ha tenido éxito entonces var = 0. Un ejemplo de esta opción se muestra en el Programa ejemplo_9_3.f90, Sección 9.3.3.
presentar arreglos de datos con varias dimensiones (hasta un máximo de siete son posibles) y la forma del DO implícito. Ver ejemplo Programa ejemplo_3_3.f90, Sección 3.3.3.
explicar la forma más general de la estructura DO y de la definición de matrices utilizando índices negativos. Ver ejemplo Programa ejemplo_3_4.f90, Sección 3.3.4.
explicar como combinar el redireccionado de la bash shell
con
programas Fortran
. Necesario para ejercicio 2, se explica en Matrices o Arrays (Avanzado), Capítulo 4.
PROGRAM ej_3_1 ! ! DEFINICIÓN DE VARIABLES IMPLICIT NONE REAL :: Total=0.0, Promedio=0.0 INTEGER, PARAMETER :: semana=7 REAL , DIMENSION(1:semana) :: Horas_trab INTEGER :: dia ! PRINT *,' Introduzca las horas trabajadas' PRINT *,' por dia en una semana' DO dia=1,semana READ(*,*), Horas_trab(dia) ENDDO ! DO dia=1,semana Total = Total + Horas_trab(dia) ENDDO Promedio = Total / semana ! PRINT *,' Promedio de horas de trabajo semanales: ' PRINT *, Promedio END PROGRAM ej_3_1
PROGRAM ej_3_2 ! ! DEFINICION DE VARIABLES IMPLICIT NONE REAL :: Total=0.0, Promedio=0.0 REAL , DIMENSION(:), ALLOCATABLE :: Horas_trab INTEGER :: dia, num_dias ! PRINT *,' Introduzca el número de dias para los que ' PRINT *,' se va a calcular el promedio de horas trabajadas.' READ(*,*), num_dias ! ALLOCATE(Horas_trab(1:num_dias)) ! PRINT *,' Introduzca las horas trabajadas' PRINT *,' por dia en ', num_dias, 'dias.' DO dia=1, num_dias READ(*,*), Horas_trab(dia) ENDDO ! DO dia=1,num_dias Total = Total + Horas_trab(dia) ENDDO Promedio = Total / num_dias ! PRINT *,' Promedio de horas de trabajo en ',num_dias, ' dias : ' PRINT *, Promedio ! END PROGRAM ej_3_2
PROGRAM asistencia IMPLICIT NONE INTEGER , PARAMETER :: N_alum=4 INTEGER , PARAMETER :: N_asig=3 INTEGER , PARAMETER :: N_prac=3 INTEGER :: alumno, asignatura, pract CHARACTER(LEN = 2) , DIMENSION(1:N_prac,1:N_asig,1:N_alum) :: asiste='NO' DO alumno = 1,N_alum DO asignatura = 1,N_asig READ(*,*),(asiste(pract,asignatura,alumno),pract = 1, N_prac) ENDDO ENDDO PRINT *,' Asistencia a practicas : ' DO alumno=1, N_alum PRINT *,' Alumno = ', alumno DO asignatura = 1,N_asig PRINT *,' Asignatura = ', asignatura, ' : ', (asiste(pract,asignatura,alumno),pract=1,N_prac) ENDDO ENDDO END PROGRAM asistencia
PROGRAM longitude IMPLICIT NONE REAL , DIMENSION(-180:180) :: Time=0 INTEGER :: Degree, Strip REAL :: Value ! DO Degree=-165,165,15 Value=Degree/15 DO Strip=-7,7 Time(Degree+Strip)=Value ENDDO ENDDO ! DO Strip=0,7 Time(-180 + Strip) = -180/15 Time( 180 - Strip) = 180/15 ENDDO ! DO Degree=-180,180 PRINT *,Degree,' ',Time(Degree), 12 + Time(Degree) END DO END PROGRAM longitude
[ anterior ] [ Contenidos ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ siguiente ]
Lecciones de Fortran 90
para la asignatura Química Computacional
mailto:francisco.perez@dfaie.uhu.es