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


Fortran 90 Lessons for Computational Chemistry
Chapter 4 - More on Arrays


4.1 Objectives

The main aims of this lesson are the following:

  1. presenting storage ordering of multidimensional arrays.

  1. presenting how to manipulate whole matrices or arrays sections in Fortran.

  1. matrix definition using the WHERE statement.


4.2 Main items.


4.3 Example Codes.


4.3.1 excode_4_1.f90

     PROGRAM ex_4_1
       !
       ! VARIABLE DEFINITION
       IMPLICIT NONE
       REAL :: Total=0.0, Average=0.0
       REAL , DIMENSION(:), ALLOCATABLE :: t_worked
       ! Correction Factor
       REAL :: correction =1.05 
       INTEGER :: day, num_days
       !
       PRINT *,' Number of workdays: '
       READ *, num_days
       ! Dynamic storage definition
       ALLOCATE(t_worked(1:num_days))
       !
       PRINT *,' Worked hours per day in ', num_days, ' days.'
       ! I/O
       READ *, t_worked
       !
       t_worked(num_days-1:num_days) = correction*t_worked(num_days-1:num_days)
       !
       DO day=1,num_days
          Total = Total + t_worked(day)
       ENDDO
       Average = Total / num_days
       !
       PRINT *,' Average daily hours of work in ',num_days, ' days : '
       PRINT *, Average
       !
     END PROGRAM ex_4_1

4.3.2 excode_4_2.f90

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

4.3.3 excode_4_3.f90

     PROGRAM ex_4_3
       !
       ! VARIABLES DEFINITION
       IMPLICIT NONE
       REAL, DIMENSION(1:5) :: VA = (/1.0,1.0,1.0,1.0,1.0/), 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 /)
       ! Scalar Product
       PE = DOT_PRODUCT(VA,VB)
       !
       PRINT *, 'Scalar Product (VA,VB) = ', PE
       !
       ! Product of matrices VAxMC
       ! RESHAPE VC to make it a  5 x 5 matrix
       MC = RESHAPE(VC,(/5,5/))
       PMAT = MATMUL(VA,MC)
       !
       PRINT *, ' VA x MC = ', PMAT(1:5)
       !
     END PROGRAM ex_4_3

4.3.4 excode_4_4.f90

     PROGRAM ex_4_4
       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 ex_4_4

4.3.5 excode_4_5.f90

     PROGRAM ex_4_5
       !
       ! VARIABLE DEFINITION 
       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)
       !
       ! 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 ex_4_5

4.3.6 excode_4_6.f90

     PROGRAM ex_4_6
       !
       ! DEFINITION OF 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*, "Matrix Element", A(2,3)
       PRINT*, "Submatrix", A(1:2,2:3)
       PRINT*, "Submatrix", A(::2,::2)
       PRINT*, "Matrix Column", A(:,3)
       PRINT*, "Matrix Row", A(2,:)
       PRINT*, "Full Matrix", A
       PRINT*, "Transposed Matrix", TRANSPOSE(A)
     END PROGRAM ex_4_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