[ 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 7 - Operaciones I/O (II)


7.1 Objetivos

Los objetivos de esta clase son los siguientes:

  1. presentar como se emplea la orden FORMAT, y sus diferentes descriptores con la orden READ.

  1. adquirir conocimientos básicos acerca de la lectura de ficheros en Fortran.

  1. dar como alternativas útiles para las operaciones de I/O los here documents y el formato de NAMELIST.

  1. dar un ejemplo de como se puede trabajar con ficheros internos (internal files).

Son similares a los de la clase anterior, aunque en este caso nos centramos en la lectura de datos en Fortran. En general la lectura con formato se emplea al leer datos en ficheros y no al introducir datos con el teclado como entrada estándar.


7.2 Puntos destacables.


7.3 Programas usados como ejemplo.


7.3.1 Programa ejemplo_7_1.f90

     PROGRAM EJEMPLO_7_1
       IMPLICIT NONE
       !Definicion de variables
       INTEGER , PARAMETER :: NROW=5
       INTEGER , PARAMETER :: NCOL=6
       REAL , DIMENSION(1:NROW,1:NCOL)   :: RESULT_EXAMS = 0.0
       REAL , DIMENSION(1:NROW)          :: MEDIA_ESTUD = 0.0
       REAL , DIMENSION(1:NCOL)          :: MEDIA_ASIGN = 0.0
       INTEGER :: R,C
       !
       ! Abrir fichero para lectura
       OPEN(UNIT=20,FILE='notas.dat',STATUS='OLD') 
       !
       DO R=1,NROW
          READ(UNIT=20,FMT=100) RESULT_EXAMS(R,1:NCOL),MEDIA_ESTUD(R) ! Lectura de notas y luego de promedio
          100 FORMAT(6(2X,F4.1),2X,F5.2) ! Se leen 6 numeros seguidos y luego un septimo 
       ENDDO
       READ (20,*) ! Saltamos una linea con esta orden
       READ (20,110) MEDIA_ASIGN(1:NCOL) ! 
     110 FORMAT(6(2X,F4.1))
     !
     ! IMPRESION DE LAS NOTAS EN LA SALIDA ESTANDAR
       DO R=1,NROW
          PRINT 200, RESULT_EXAMS(R,1:NCOL), MEDIA_ESTUD(R)
     200  FORMAT(1X,6(1X,F5.1),' = ',F6.2)
       END DO
       PRINT *,'  ====  ====  ====  ====  ====  ==== '
       PRINT 210, MEDIA_ASIGN(1:NCOL)
     210 FORMAT(1X,6(1X,F5.1))
     END PROGRAM EJEMPLO_7_1

7.3.2 Programa ejemplo_7_2.f90

     PROGRAM EJEMPLO_7_2
     ! PROGRAMA QUE CALCULA LAS SOLUCIONES DE UNA EC DE SEGUNDO GRADO
     ! y = A*x**2 + B*x + C
       IMPLICIT NONE
       !Definicion de variables
       REAL :: A = 0.0
       REAL :: B = 0.0
       REAL :: C = 0.0
       REAL, DIMENSION(2) :: SOL
       REAL :: TEMP
       INTEGER :: I
       !
       ! Lectura de coeficientes
       READ*, A 
       READ*, B
       READ*, C 
       ! print*, a,b,c
       !
       ! CALCULOS
       TEMP = SQRT(B*B-4.0*A*C)
       !
       SOL(1) = (-B+TEMP)/(2.0*A)
       SOL(2) = (-B-TEMP)/(2.0*A)
       !
       !
       ! IMPRESION DE LAS SOLUCIONES
       DO I=1, 2
          PRINT 200, I, SOL(I)
     200  FORMAT(1X,'SOLUCION ', I2,' = ',F18.6)
       END DO
     !
     END PROGRAM EJEMPLO_7_2

7.3.3 Script ej_here_file

     # Compilar
     gfortran -o second_order  ejemplo_7_2.f90
     # Ejecutar
     ./second_order <<eof
     2.0     # A
     1.0     # B
     -4.0    # C
     eof

7.3.4 Programa ejemplo_7_3.f90

     PROGRAM EJEMPLO_7_3
     ! PROGRAMA QUE CALCULA LAS SOLUCIONES DE UNA EC DE SEGUNDO GRADO
     ! y = A*x**2 + B*x + C
       IMPLICIT NONE
       !Definicion de variables
       REAL :: A = 0.0
       REAL :: B = 0.0
       REAL :: C = 0.0
       REAL, DIMENSION(2) :: SOL
       REAL :: TEMP
       INTEGER :: I
       !
       !     NAMELIST DEFINITIONS
       NAMELIST/INP0/ A, B, C
       !     NAMELIST FILE
       OPEN(UNIT=10,FILE='sec_order.inp',STATUS='OLD')
       ! Lectura de coeficientes
       READ(10,INP0)
       !
       ! CALCULOS
       TEMP = SQRT(B*B-4.0*A*C)
       !
       SOL(1) = (-B+TEMP)/(2.0*A)
       SOL(2) = (-B-TEMP)/(2.0*A)
       !
       !
       ! IMPRESION DE LAS SOLUCIONES
       DO I=1, 2
          PRINT 200, I, SOL(I)
     200  FORMAT(1X,'SOLUCION ', I2,' = ',F18.6)
       END DO
     !
     END PROGRAM EJEMPLO_7_3

7.3.5 namelist input file

     #
     #       INPUT FILE FOR EJEMPLO_7_3
     #
      &INP0 A=2.0, B=1.0, C=-4.0 /

7.3.6 Programa ejemplo_7_4.f90

     PROGRAM EJEMPLO_7_4
       !
       ! Internal file example
       !
       IMPLICIT NONE
       !Definicion de variables
       REAL :: x_var
       INTEGER :: unit_n, index_X
       CHARACTER(LEN=65) :: filename
       CHARACTER(LEN=56) :: pref
       !
       PRINT*, "Introduce file name preffix: "
       READ(*,*) pref
       !
       DO unit_n = 10, 20
          !
          WRITE(filename, '(A, "_", i2,".dat")') TRIM(pref), unit_n
          OPEN(UNIT = unit_n, FILE = filename, STATUS = "UNKNOWN", ACTION = "WRITE")
          !
          DO index_X = 0, 100
             x_var = REAL(index_X)*0.01
             WRITE(unit_n, '(1X,2ES14.6)') x_var, SIN(REAL(unit_n)*x_var)
          ENDDO
          !
          CLOSE(UNIT = unit_n)
          !
       ENDDO
     !
     END PROGRAM EJEMPLO_7_4

[ 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