[ 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 6 - Operaciones de Entrada/Salida (I/O) (I)


6.1 Objetivos

Los objetivos de esta clase son los siguientes:

  1. presentar como es posible aprovechar el redireccionamiento de la entrada y salida estándar en UNIX para la lectura y escritura de datos en Fortran.

  1. presentar la orden FORMAT, sus diferentes descriptores y cómo se define un formato que combina con las órdenes PRINT y WRITE.

  1. adquirir conocimientos básicos acerca del uso de ficheros en Fortran con las órdenes OPEN, CLOSE, WRITE.

En esta clase, salvo en el primer punto mencionado, que es general, nos centramos en las operaciones de salida desde el programa Fortran, mientras que la siguiente clase se dedica a aplicar lo aprendido a la lectura de datos desde Fortran.


6.2 Puntos destacables.


6.3 Programas usados como ejemplo.


6.3.1 Programa ejemplo_6_1.f90

     PROGRAM ej_6_1
     !
       IMPLICIT NONE
       INTEGER :: i, big=10
     !
       DO i=1,18
          PRINT 100, i, big
          100 FORMAT(1X, '10 elevado a ',I3,2X,'=',2X,I12)
          big=big*10
       END DO
     END PROGRAM ej_6_1

6.3.2 Programa ejemplo_6_2.f90

     PROGRAM ejemplo_6_2
     !
       IMPLICIT NONE
     !
       INTEGER, PARAMETER :: Long=SELECTED_INT_KIND(16) ! Tipo de entero de 64 bits
       INTEGER :: i
       INTEGER (KIND = Long) :: big=10 
     !
       DO i=1,18
     !
          PRINT 100, i, big
          100 FORMAT(1X, '10 elevado a ',I3,2X,'=',2X,I16)
     !
          big=big*10
     !
       END DO
     !
     END PROGRAM ejemplo_6_2

6.3.3 Programa ejemplo_6_3.f90

     PROGRAM ej_6_3
     ! Programa que hace patente problemas de desbordamiento 
     ! aritmetico por exceso y por defecto.
       IMPLICIT NONE
       INTEGER :: I
       REAL     :: peq = 1.0
       REAL     :: gran    = 1.0
     !
       DO i=1,45
          PRINT 100, I, peq, gran
     100  FORMAT(' ',I3,' ',F9.4,' ',F9.4)
     !
          peq=peq/10.0
          gran=gran*10.0
     !
       END DO
     END PROGRAM ej_6_3

6.3.4 Programa ejemplo_6_4.f90

     PROGRAM ej_6_4
     ! Programa que hace patente problemas de desbordamiento 
     ! aritmético por exceso y por defecto.
       IMPLICIT NONE
       INTEGER :: I
       REAL     :: peq = 1.0
       REAL     :: gran    = 1.0
     !
       DO i=1,45
          PRINT 100, I, peq, gran
     100  FORMAT(' ',I3,' ',E10.4,' ',E10.4)
     !
          peq=peq/10.0
          gran=gran*10.0
     !
       END DO
     END PROGRAM ej_6_4

6.3.5 Programa ejemplo_6_5.f90

     PROGRAM ej_6_5
       ! Programa que calcula el IMC o indice de Quetelet. 
       ! Se hace según la expresión matemática:
       !    IMC=(peso (kg))/(talla^2 (m^2)) 
       !
       IMPLICIT NONE
       CHARACTER (LEN=25) :: NOMBRE
       INTEGER :: hcm = 0, peso = 0 ! altura en cm y peso en kg
       REAL     :: talla = 0.0 ! altura en metros
       REAL     :: IMC ! Indice de masa corporal
       !
       PRINT*, 'Introduzca su nombre de pila:'; READ*, NOMBRE
       !
       PRINT*, 'Introduzca su peso en kilogramos:'; READ*, peso
       !
       PRINT*, 'Introduzca su altura en centimetros:'; READ*, hcm
       !
       talla = hcm/100.0
       IMC = peso/(talla**2)
       !
       PRINT 100, NOMBRE, IMC, IMC
     100  FORMAT(1X,'El IMC de ',A,' es ',F10.4,' o ',E10.4)
     !
     END PROGRAM ej_6_5

6.3.6 Programa ejemplo_6_6.f90

     PROGRAM ej_6_6
     !
       IMPLICIT NONE
       INTEGER , PARAMETER :: N=1000000
       INTEGER , DIMENSION(1:N) :: X
       REAL    , DIMENSION(1:N) :: Y
       INTEGER :: I
       REAL :: T
       REAL    , DIMENSION(1:5) :: TP
       CHARACTER(LEN = 10) :: COMMENT
     !
       OPEN(UNIT=10,FILE='ej_6_6.txt')
     !
       CALL CPU_TIME(T)
     !
       TP(1)=T
       COMMENT=' T INICIAL '
       PRINT 100,COMMENT,TP(1)
     !
       DO I=1,N
          X(I)=I
       END DO
     !
       CALL CPU_TIME(T)
     !
       TP(2)=T-TP(1)
       COMMENT = ' VAR ENTERA '
       PRINT 100,COMMENT,TP(2)
     !
       Y=REAL(X)
     !
       CALL CPU_TIME(T)
     !
       TP(3)=T-TP(1)-TP(2)
       COMMENT = ' VAR REAL '
     !
       PRINT 100,COMMENT,TP(3)
     !
       DO I=1,N
          WRITE(10,200) X(I)
          200 FORMAT(1X,I10)
       END DO
     !
       CALL CPU_TIME(T)
       TP(4)=T-TP(1)-TP(2)-TP(3)
     !
       COMMENT = ' WRITE INTEG '
       PRINT 100,COMMENT,TP(4)
     !
       DO I=1,N
          WRITE(10,300) Y(I)
     300  FORMAT(1X,f10.0)
       END DO
     !
       CALL CPU_TIME(T)
       TP(5)=T-TP(1)-TP(2)-TP(3)-TP(4)
     !
       COMMENT = ' WRITE REAL '
       PRINT 100,COMMENT,TP(5)
       100 FORMAT(1X,A,2X,F7.3)
     END PROGRAM ej_6_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