[ 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 2 - Primeras operaciones básicas


2.1 Objetivos

Los objetivos de esta clase son los siguientes:

  1. Enumerar las reglas básicas de la sintaxis de Fortran y el juego de caracteres usado en los programas.

  1. La ejecución de operaciones básicas aritméticas y el orden en que se ejecutan los operadores aritméticos.

  1. El uso de la orden PARAMETER.

  1. Explicar los diferentes tipos que existen de variables numéricas y cómo definirlas.


2.2 Puntos destacables.

Reglas básicas de sintaxis:

En la definición de variables puede usarse el guión bajo ('_') y mezclar números y letras, aunque el nombre de la variable no puede comenzar por un número.

Juego de caracteres usados en códigos Fortran

     A-Z  Letters              0-9  Digits
     _    Underscore                Blank
     =    Equal                +    Plus
     -    Minus                *    Asterisk
     /    Slash or oblique     '    Apostrophe
     (    Left parenthesis     )    Right parenthesis
     ,    Comma                .    Period or decimal point
     :    Colon                ;    Semicolon
     !    Exclamation mark     ""    Quotation mark
     %    Percent              &   Ampersand
     <    Less than         >   Greater than

Jerarquía de operadores aritméticos:


2.3 Programas usados como ejemplo.


2.3.1 Programa ejemplo_2_1.f90

     PROGRAM ej_2_1
       IMPLICIT NONE
       !
       ! Ejemplo de programa que permite calcular la energía 
       ! de un modo normal dados el número de cuantos (v), la 
       ! frecuencia (w) y la anarmonicidad (wx) como
       ! 
       !  Ge(v) = we (v+1/2) - wexe (v+1/2)^2
       ! 
       !
       ! Definicion de variables
       REAL            :: energ_0, energ, delta_e ! deltae = energ-energ0
       REAL            :: we = 250.0, wexe = 0.25 ! Unidades: cm-1
       INTEGER         :: v = 0
       CHARACTER(LEN=60)    :: for_mol
       ! Operaciones I/O
       PRINT *,'Formula de la molecula : '
       READ(*,*), for_mol
       PRINT *,'Num. de quanta de excitacion : '
       READ(*,*), v
       ! Calculos
       energ = we*(v+0.5) - wexe*(v+0.5)**2
       energ_0 = we*(0.5) - wexe*(0.5)**2
       delta_e = energ - energ_0
       ! Operaciones I/O
       PRINT *
       PRINT *,'Especie molecular: ', for_mol
       PRINT *,'num. de quanta: ', v
       PRINT *,'energ = ',energ,'cm-1'
       PRINT *,'energ_0 = ',energ_0,'cm-1'
       PRINT *,'energ - energ_0 = ',delta_e,'cm-1'
     END PROGRAM ej_2_1

2.3.2 Programa ejemplo_2_2.f90

     PROGRAM ej_2_2
       IMPLICIT NONE
       REAL :: A,B,C
       INTEGER :: I
       A = 1.5
       B = 2.0
       C = A / B
       I = A / B
       PRINT *
       PRINT *, 'Caso (1), variable real'
       PRINT *,A,'/',B,' = ',C
       PRINT *, 'Caso (2), variable entera'
       PRINT *,A,'/',B,' = ',I
     END PROGRAM ej_2_2

2.3.3 Programa ejemplo_2_3.f90

     PROGRAM ej_2_3
       IMPLICIT NONE
       INTEGER :: I,J,K
       REAL :: Answer
       I = 5
       J = 2
       K = 4
       Answer = I / J * K
       PRINT *,'I = ',I
       PRINT *,'J = ',J
       PRINT *,'K = ',K
       PRINT *,'I / J * K = ',Answer
     END PROGRAM ej_2_3

2.3.4 Programa ejemplo_2_4.f90

     PROGRAM ej_2_4
       ! Programa para calcular el tiempo que tarda la luz en 
       ! recorrer una distancia dada en unidades astronómicas. 
       ! 1 UA = 1,50E11 m
       !
       !Definicion de variables
       IMPLICIT NONE
       ! u_a : unidad astronomica en km
       REAL , PARAMETER :: u_a=1.50*10.0**8
       ! a_luz : año luz --> distancia en km recorrida por la luz en un año.
       REAL , PARAMETER :: a_luz=9.46*10.0**12
       ! m_luz : minuto luz --> distancia en km recorrida por la luz en un minuto.
       REAL :: m_luz
       ! dist : distancia recorrida en UAs (INPUT)
       REAL :: dist
       ! t_min : tiempo en minutos necesario para recorrer la distancia Distance
       REAL :: t_min
       !
       ! min : parte entera de t_min
       ! seg : número de segundos (parte decimal de t_min)
       INTEGER :: min, seg
       !
       m_luz = a_luz/(365.25 * 24.0 * 60.0) ! Calculo del minuto-luz
       !
       PRINT *
       PRINT *,'Distancia en UAs'
       READ(*,*), dist
       PRINT *
       !
       t_min = (dist*u_a)/m_luz
       min = t_min; seg = (t_min - min) * 60
       !
       PRINT *,' La luz tarda ' , min,' minutos y ', seg,' segundos'
       Print *,' en recorrer una distancia de ',dist,' UA.'
     END PROGRAM ej_2_4

2.3.5 Programa ejemplo_2_5.f90

     PROGRAM ej_2_5
       INTEGER :: i
       REAL :: r
       CHARACTER :: c
       LOGICAL :: l
       COMPLEX :: cp
       PRINT *,' Integer ',KIND(i)
       PRINT *,' Real    ',KIND(r)
       PRINT *,' Char    ',KIND(c)
       PRINT *,' Logical ',KIND(l)
       PRINT *,' Complex ',KIND(cp)
     END PROGRAM ej_2_5

2.3.6 Programa ejemplo_2_6.f90

     PROGRAM ej_2_6
       ! From Program ch0806 of Chivers & Sleightholme
       !
       ! Examples of the use of the kind
       ! function and the numeric inquiry functions
       !
       ! Integer arithmetic
       !
       ! 32 bits is a common word size,
       ! and this leads quite cleanly
       ! to the following
       ! 8 bit integers
       ! -128 to 127 10**2
       ! 16 bit integers
       ! -32768 to 32767 10**4
       ! 32 bit integers
       ! -2147483648 to 2147483647 10**9
       !
       ! 64 bit integers are increasingly available.
       ! This leads to
       ! -9223372036854775808 to
       !  9223372036854775807 10**19
       !
       ! You may need to comment out some of the following
       ! depending on the hardware platform and compiler
       ! that you use.
       INTEGER                         :: I
       INTEGER ( SELECTED_INT_KIND( 2)) :: I1
       INTEGER ( SELECTED_INT_KIND( 4)) :: I2
       INTEGER ( SELECTED_INT_KIND( 8)) :: I3
       INTEGER ( SELECTED_INT_KIND(16)) :: I4
       ! Real arithmetic
       !
       ! 32 and 64 bit reals are normally available.
       !
       ! 32 bit reals 8 bit exponent, 24 bit mantissa
       !
       ! 64 bit reals 11 bit exponent 53 bit mantissa
       !
       REAL :: R = 1.0
       REAL ( SELECTED_REAL_KIND( 6, 37)) :: R1 = 1.0
       REAL ( SELECTED_REAL_KIND(15,307)) :: R2 = 1.0 
       REAL ( SELECTED_REAL_KIND(18,310)) :: R3 = 1.0
       PRINT *,' '
       PRINT *,' Integer values'
       PRINT *,'         Kind       Huge'
       PRINT *,' '
       PRINT *,KIND(I ),' ',HUGE(I    )
       PRINT *,' '
       PRINT *,KIND(I1 ),' ',HUGE(I1  )
       PRINT *,KIND(I2 ),' ',HUGE(I2  )
       PRINT *,KIND(I3 ),' ',HUGE(I3  )
       PRINT *,KIND(I4 ),' ',HUGE(I4  )
       PRINT *,' '
       PRINT *,' ----------------------------------- '
       PRINT *,' '
       PRINT *,' Real values'
       !
       PRINT *,'         Kind     ', KIND(R ), '    Digits     ', DIGITS(R )
       PRINT *,'  Huge    = ',HUGE(R ), ' Tiny =', TINY(R)
       PRINT *,'  Epsilon = ',EPSILON(R),' Precision = ', PRECISION(R)
       PRINT *,'  Exponent = ',EXPONENT(R), 'MAXExponent = ', MAXEXPONENT(R), '  MINExponent = ',MINEXPONENT(R)
       PRINT *,'  Radix    = ', RADIX(R ), ' Range =', RANGE(R)
       PRINT *,' ' 
       !
       !
       PRINT *,'         Kind     ', KIND(R1 ), '    Digits     ', DIGITS(R1 )
       PRINT *,'  Huge    = ',HUGE(R1 ), ' Tiny =', TINY(R1)
       PRINT *,'  Epsilon = ',EPSILON(R1),' Precision = ', PRECISION(R1)
       PRINT *,'  Exponent = ',EXPONENT(R1), 'MAXExponent = ', MAXEXPONENT(R1), '  MINExponent = ',MINEXPONENT(R1)
       PRINT *,'  Radix    = ', RADIX(R1 ), ' Range =', RANGE(R1)
       PRINT *,' ' 
       !
       !
       PRINT *,'         Kind     ', KIND(R2 ), '    Digits     ', DIGITS(R2 )
       PRINT *,'  Huge    = ',HUGE(R2 ), ' Tiny =', TINY(R2)
       PRINT *,'  Epsilon = ',EPSILON(R2),' Precision = ', PRECISION(R2)
       PRINT *,'  Exponent = ',EXPONENT(R2), 'MAXExponent = ', MAXEXPONENT(R2), '  MINExponent = ',MINEXPONENT(R2)
       PRINT *,'  Radix    = ', RADIX(R2 ), ' Range =', RANGE(R2)
       PRINT *,' ' 
       !
       !
       PRINT *,'         Kind     ', KIND(R3 ), '    Digits     ', DIGITS(R3 )
       PRINT *,'  Huge    = ',HUGE(R3 ), ' Tiny =', TINY(R3)
       PRINT *,'  Epsilon = ',EPSILON(R3),' Precision = ', PRECISION(R3)
       PRINT *,'  Exponent = ',EXPONENT(R3), 'MAXExponent = ', MAXEXPONENT(R3), '  MINExponent = ',MINEXPONENT(R3)
       PRINT *,'  Radix    = ', RADIX(R3 ), ' Range =', RANGE(R3)
       PRINT *,' ' 
       !
     END PROGRAM ej_2_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