[ 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
Capítulo 4 - Matrices o Arrays (Avanzado)


4.1 Objetivos

Los objetivos de esta clase son los siguientes:

  1. presentar el orden natural en el que se almacenan los elementos en matrices multidimensionales.

  1. presentar como se pueden manipular matrices completas y secciones de matrices en Fortran.

  1. ver como se puede trabajar con parte de una matriz.

  1. explicar la definición de matrices con la orden WHERE.


4.2 Puntos destacables.


4.3 Programas usados como ejemplo.


4.3.1 Programa ejemplo_4_1.f90

     PROGRAM ej_4_1
       !
       ! DEFINICION DE VARIABLES
       IMPLICIT NONE
       REAL :: Total=0.0, Promedio=0.0
       REAL , DIMENSION(:), ALLOCATABLE :: t_trab
       ! Factor que corrige el tiempo trabajado los dos últimos días
       REAL :: Fac_correc=1.05 
       INTEGER :: dia, num_dias
       !
       PRINT *,' Introduzca el no. de dias para los que se va '
       PRINT *,' a calcular el promedio de horas y minutos trabajados.'
       READ(*,*), num_dias
       ! Dimensiona dinámicamente la matriz
       ALLOCATE(t_trab(1:num_dias))
       !
       PRINT *,' Introduzca las horas trabajadas'
       PRINT *,' por dia en ', num_dias, 'dias.'
       ! Lectura de datos
       READ(*,*), t_trab
       !
       t_trab(num_dias-1:num_dias) = Fac_correc*t_trab(num_dias-1:num_dias)
       !
       !
       Total = SUM(t_trab)
       !
       Promedio = Total / num_dias
       !
       PRINT *,' Horas de trabajo en ',num_dias, ' dias : '
       PRINT *, Promedio
       !
     END PROGRAM ej_4_1

4.3.2 Programa ejemplo_4_2.f90

     PROGRAM EJEMPLO_4_2
       !
       ! Program to characterize an array making use of inquiry functions
       !
       IMPLICIT NONE
       !
       REAL, DIMENSION(:,:), ALLOCATABLE :: X_grid
       INTEGER :: Ierr
       !
       ! 
       ALLOCATE(X_grid(-20:20,0:50), STAT = Ierr)
       IF (Ierr /= 0) THEN
          STOP 'X_grid allocation failed'
       ENDIF
       !
       WRITE(*, 100) SHAPE(X_grid)
     100 FORMAT(1X, "Shape :        ", 7I7)
       !
       WRITE(*, 110) SIZE(X_grid)
     110 FORMAT(1X, "Size :         ", I7)
       !
       WRITE(*, 120) LBOUND(X_grid)
     120 FORMAT(1X, "Lower bounds : ", 7I6)
       !
       WRITE(*, 130) UBOUND(X_grid)
     130 FORMAT(1X, "Upper bounds : ", 7I6)
       !
       DEALLOCATE(X_grid, STAT = Ierr)
       IF (Ierr /= 0) THEN
          STOP 'X_grid deallocation failed'
       ENDIF
       !
     END PROGRAM EJEMPLO_4_2

4.3.3 Programa ejemplo_4_3.f90

     PROGRAM ej_4_3
       !
       ! DEFINICION DE VARIABLES
       IMPLICIT NONE
       REAL, DIMENSION(1:5) :: VA = (/1.2,2.3,3.4,4.5,5.6/), PMAT
       INTEGER I
       INTEGER, DIMENSION(1:5) :: VB = (/(2*I,I=1,5)/) 
       REAL :: PE
       REAL , DIMENSION(1:5,1:5) :: MC
       REAL , DIMENSION(25) :: VC = &
            (/ 0.0,0.0,0.0,0.0,1.0,0.5,2.0,3.2,0.0,0.0, & 
               0.0,0.0,0.0,0.0,11.0,0.5,2.3,3.2,0.0,0.0, & 
               1.0,3.0,-2.0,-2.0,-0.6 /)
       ! Producto escalar VA.VB
       PE = DOT_PRODUCT(VA,VB)
       !
       PRINT *, 'PRODUCTO ESCALAR (VA,VB) = ', PE
       !
       ! Producto de matrices VAxMC
       ! Haciendo RESHAPE de VC hacemos que sea una matriz 5 x 5
       MC = RESHAPE(VC,(/ 5, 5 /))
       PMAT = MATMUL(VA,MC)
       !
       PRINT *, 'PRODUCTO VAxMC = ', PMAT(1:5)
       !
     END PROGRAM ej_4_3

4.3.4 Programa ejemplo_4_4.f90

     PROGRAM long2
       IMPLICIT NONE
       REAL , DIMENSION(-180:180) :: Time=0
       INTEGER :: Degree, Strip
       REAL :: Value
       CHARACTER (LEN=1), DIMENSION(-180:180) :: LEW=' '
     !
       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
     !
       WHERE (Time > 0) 
          LEW='E'
       ELSEWHERE (Time < 0)
          LEW='W'
       ENDWHERE
     !
       PRINT*, LEW
     !
     END PROGRAM long2

4.3.5 Programa ejemplo_4_5.f90

     PROGRAM ej_4_5
       !
       ! DEFINICION DE VARIABLES
       IMPLICIT NONE
       REAL, DIMENSION(1:7) :: VA = (/1.2,2.3,3.4,4.5,5.6,6.7,7.8/)
       REAL, DIMENSION(1:7) :: VA1 = 0.0, VA2 = 0.0
       INTEGER I
       !
       VA1 = VA
       VA2 = VA
       !
       DO I = 2, 7
          VA1(I) = VA1(I) + VA1(I-1)
       ENDDO
       !
       VA2(2:7) = VA2(2:7) + VA2(1:6)
       !
       ! The previous two operations with VA1 and VA2 seem that
       ! should provide the same result. Which is not the case.
       PRINT*, VA1
       PRINT*, VA2
       !
       ! To obtain the same effect without an explicit DO loop we can do 
       ! the following
       VA2 = VA
       VA2(2:7) = (/ (SUM(VA2(1:I)), I = 2,7) /)
       !
       PRINT*, VA1
       PRINT*, VA2
     END PROGRAM ej_4_5

4.3.6 Programa ejemplo_4_6.f90

     PROGRAM ej_4_6
       !
       ! DEFINICION DE VARIABLES
       IMPLICIT NONE
       INTEGER, DIMENSION(1:3,1:3) :: A = RESHAPE( (/ 1,2,3,4,5,6,7,8,9 /), (/ 3,3 /) )
       !
       !
       !      1  4  7     
       !  A = 2  5  8
       !      3  6  9
       !
       PRINT*, "Elemento de la matriz", A(2,3)
       PRINT*, "Submatriz", A(1:2,2:3)
       PRINT*, "Submatriz", A(::2,::2)
       PRINT*, "Columna de la matriz", A(:,3)
       PRINT*, "Fila de la matriz", A(2,:)
       PRINT*, "Matriz completa", A
       PRINT*, "Matriz traspuesta", TRANSPOSE(A)
     END PROGRAM ej_4_6

[ 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

$Id: clases_fortran.sgml,v 1.24 2013/07/02 09:38:58 curro Exp curro $

Curro Pérez Bernal mailto:francisco.perez@dfaie.uhu.es