[ previous ] [ Contents ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ next ]


Fortran 90 Lessons for Computational Chemistry
Chapter 2 - Basic Operations


2.1 Objectives

The main aims of this session are:

  1. introducing basic Fortran syntax rules and the characters allowed in source files.

  1. Basic arithmetic operations and operator precedence rules.

  1. The PARAMETER declaration.

  1. Explain the different kinds of numerical variables and its use.


2.2 Main items.

Basic syntax rules:

Variable names can include the low hyphen ('_') and mix alphanumeric characters and digits, though variable names first character cannot be a number.

Fortran character set:

     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

Precedence of arithmetic operators:


2.3 Example Codes.


2.3.1 excode_2_1.f90

         PROGRAM ex_2_1
       IMPLICIT NONE
       !
       ! Program computing the energy of a vibrational normal mode
       ! 
       !  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 ! Units: cm-1
       INTEGER         :: v = 0
       CHARACTER*60    :: for_mol
       ! I/O
       PRINT *,'Formula de la molecula : '
       READ *, for_mol
       PRINT *,'Num. de quanta de excitacion : '
       READ *, v
       ! Calculations
       energ = we*(v+0.5) - wexe*(v+0.5)**2
       energ_0 = we*(0.5) - wexe*(0.5)**2
       delta_e = energ - energ_0
       ! 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 ex_2_1

2.3.2 excode_2_2.f90

     PROGRAM ex_2_2
       IMPLICIT NONE
       REAL :: A,B,C
       INTEGER :: I
       A = 1.5
       B = 2.0
       C = A / B
       I = A / B
       PRINT *
       PRINT *, 'Case (1), Float variable'
       PRINT *,A,'/',B,' = ',C
       PRINT *, 'Case (2), Integer variable'
       PRINT *,A,'/',B,' = ',I
     END PROGRAM ex_2_2

2.3.3 excode_2_3.f90

     PROGRAM ex_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 ex_2_3

2.3.4 excode_2_4.f90

     PROGRAM ex_2_4
       ! Program to compute the time that takes to light to travel 
       ! a given distance in AU.
       ! 1 AU = 1,50E11 m
       !
       !Definicion de variables
       IMPLICIT NONE
       ! a_u : astronomic unit in km
       REAL , PARAMETER :: a_u=1.50*10.0**8
       ! y_l : year light --> distance travelled by light during a year
       REAL , PARAMETER :: y_l=9.46*10.0**12
       ! m_l : minute light --> distance travelled by light during a minute
       REAL :: m_l
       ! dist : distance travelled in AUs (INPUT)
       REAL :: dist
       ! t_min : time in minutes needed to travel the distance dist
       REAL :: t_min
       !
       ! min : integer part of t_min
       ! seg : seconds from the decimal digits of t_min
       INTEGER :: min, seg
       !
       m_l = y_l/(365.25 * 24.0 * 60.0) ! m_l Calculation
       !
       PRINT *
       PRINT *,'Distance in AUs'
       READ *, dist
       PRINT *
       !
       t_min = (dist*a_u)/m_l
       min = t_min; seg = (t_min - min) * 60
       !
       PRINT *,' It takes light ' , min,' minutes and ', seg,' seconds'
       Print *,' to travel a distance of ',dist,' AU.'
     END PROGRAM ex_2_4

2.3.5 excode_2_5.f90

     PROGRAM ex_2_5
       INTEGER :: i
       REAL :: r
       CHARACTER(LEN=1) :: 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 ex_2_5

2.3.6 excode_2_6.f90

     PROGRAM ex_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 ex_2_6

[ previous ] [ Contents ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ next ]


Fortran 90 Lessons for Computational Chemistry

0.0

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