Notes Fortran
Notes Fortran
Course Objectives
+ 1
+ +
Resources
http://www.fortran.com/fortran
http://www.nag.co.uk
http://www.intel.com
+ +
Programming
a+b
+ 3
+ +
Various Stages
• Problem formulation.
• Coding.
• Testing.
+ 4
+ +
Coding
+ 5
+ +
• To compile code do
f95 program.f90
+ 6
+ +
+ 7
+ +
Program.f90
...
...
...
end
+ 8
+ +
Example
a=10.8
b=9.2
i=2
j=3
k=2
c= a*b ;d=(i*a)/j + k
e = (i/j)*a &
+ k
i= a*j
+ 9
+ +
+ 10
+ +
My first program
PROGRAM test
PRINT *, ’my name is jitesh’
END PROGRAM test
+ 11
+ +
Variables
LOGICAL, CHARACTER
+ 13
+ +
IMPLICIT TYPES
IMPLICIT NONE
Examples
+ 15
+ +
Arithmetic Operations
+ , – , * , / , **
Precedence: ** , */ , +–
Assignments
a = expr
Example
d = a**6 ! computes a6
a= 2.*a !
+ 17
+ +
Example
PROGRAM Test
IMPLICIT NONE
REAL :: a,b,c,d,e
INTEGER :: i,j,k
a=10.8
b=9.2
i=2
j=3
k=2
c= a*b
d=(i*a)/j + k
e = (i/j)*a + k
i= a*j
+ 18
+ +
+ 19
+ +
CHARACTER variables
string = "abc"
st1 = "defg"
st2 = string // st1
st3= st1
+ 20
+ +
Substrings
+ 21
+ +
PRINT *, ....
REAL :: a,b
CHARACTER (LEN=20) :: string
READ *, a,b,string
+ 22
+ +
Examples
+ 23
+ +
q
−b ± b2 − 4ac
x=
2a
we would use
+ 24
+ +
FUNCTION name(arg1,...)
specification statements
executable statements
+ 25
+ +
We can use
FUNCTION hsinh(x)
IMPLICIT NONE
REAL, INTENT(IN) :: x
REAL :: hsinh
y= hsinh(x)
+ 26
+ +
specification statements
executable statements
CALL name(arg1,...)
+ 27
+ +
SUBROUTINE swap(a,b)
IMPLICIT NONE
REAL, INTENT(INOUT) :: a,b
REAL :: c
c=a
a=b
b=c
PROGRAM main
IMPLICT NONE
REAL :: a=1,b=0., c=2
CALL swap(a,b)
PRINT *, a,b,c
END PROGRAM main
LOGICAL :: a,b
a= .TRUE.
b= .FALSE.
+ 29
+ +
+ 30
+ +
LOGICAL :: log
IF (....) THEN
action
ENDIF
IF (criterion 1) THEN
action 1
action 2
...
ELSE
other action
ENDIF
+ 32
+ +
Example
PROGRAM quad
IMPLICIT NONE
REAL :: a,b,c,d,x1,x2
PRINT *, ’enter coefficents of quadratic’
READ *, a,b,c
d = b*b - 4.*a*c
IF( d >= 0) THEN
x1 = (-b + SQRT(d))/(2.*a)
x2 = (-b - SQRT(d))/(2.*a)
PRINT *, ’real roots’,x1,x2
ELSE
PRINT *, ’complex roots’
ENDIF
+ 33
+ +
DO count = initial,final,inc
block of statements
END DO
Examples
DO i=1,10 ! 10 i=1,2,3,4,5,6,7,8,9,10
DO j=20,50,5 ! 7 j=20,25,30,35,40,45,50
DO x=-20,20,6 ! 7 x=-20,-14,-8,-2,4,10,16
DO k=6,4,3 ! 0 times
myloop: DO i=1,10
.
.
ENDDO myloop
+ 35
+ +
.
.
ENDDO
Example
DO i=1,maxits
call sub(residual,a)
If(residual.lt.1.e-6)THEN
PRINT *, ’converged’,i,residual
EXIT
ENDIF
ENDDO
+ 36
+ +
+ 37
+ +
+ 38
+ +
Arrays
+ 39
+ +
Array Declarations
REAL :: a(50),b(0:20),c(-2:5)
! a has 50 elements
! b has 21 elements starting with b(0)
! c has 8 elements starting at c(-2)
+ 40
+ +
READ *, a,b,c
PRINT *, a,b,c
or
+ 41
READ "(edit description)",input_list
Examples
INTEGER :: n,m,p
READ ’(I4,I3,I2)’, n,m,p
READ ’(2X,I4)’,n
.Tcccc...c or Tccccc..c
.Fccccc..c or Fccccc..c
where c is any character.
! is equivalent to
100 FORMAT(1x,E12.5,1x,E12.5,1x,E12.5,1x)
+ +
READ(UNIT=5,FMT=’(3(I5,1x)’))i1,i2,i3
READ(FMT=’(3(I5,1x)’))i1,i2,i3
READ(5,FMT=’(3(I5,1x)’))i1,i2,i2
READ(5,100)i1,i2,i3
READ(5,’(3(I5,1x)’))i1,i2,i3
100 FORMAT(3(I5,1x))
WRITE(6,100)r1,r3,r3
100 FORMAT(1x,e12.5,1x,F12.5,1x,E12.5)
WRITE(6,120)(A(i),i=1,12)
120 FORMAT(4(E12.5,1x))
+ 46
+ +
COMPLEX VARIABLES
+ 47
+ +
Array Processing
– e has rank 1
+ 48
+ +
Array Processing
– e has extents 10
+ 49
+ +
Array Processing
+ 50
+ +
Array Processing
+ 51
+ +
a=0.0
a=a/3.1 + b*SQRT(c)
! a(i)=a(i)/3.1 + b(i)*sqrt(c(i)) i=1:20
e=2*d
! e(i,j)= 2.*d(i,j) i=1:5, j=1:5
f= e*d
! f(i-1,j)=e(i,j)*d(i,j) i=1:5,j=1,5
+ 52
+ +
Dynamics Arrays
...
READ(5,*) n,m
ALLOCATE(a(n,m),b(2*n,2*n), STAT= error)
IF(error >0)STOP ’Failed to allocate memory’
IF(ALLOCATED(a))DEALLOCATE(a)
+ 53
+ +
Automatic arrays
SUBROUTINE(a,b,n)
IMPLICIT NONE
INTEGER :: n
REAL, DIMENSION(n,n) :: a
REAL :: b(0:n)
+ 54
+ +
INTERFACE blocks
+ 55
+ +
INTERFACE
FUNCTION l2norm(a)
IMPLICIT NONE
REAL, DIMENSION(:,:), INTENT(IN) ::a
REAL :: work,l2norm
INTEGER ::n,j,m
END FUNCTION l2norm
END INTERFACE
REAL a(20,20),result
...
result=l2norm(a)
....
END PROGRAM main
FUNCTION l2norm(a)
IMPLICIT NONE
REAL, DIMENSION(:,:), INTENT(IN) ::a
REAL :: work,l2norm
INTEGER ::n,j,m,i
! first find size of array
...
END FUNCTION l2norm
+ 56
+ +
PROGRAM example17
IMPLICIT NONE
INTERFACE
FUNCTION l2norm(a)
IMPLICIT NONE
REAL, DIMENSION(:,:), INTENT(IN) ::a
REAL :: work,l2norm
INTEGER ::n,j,m
END FUNCTION l2norm
END INTERFACE
FUNCTION l2norm(a)
IMPLICIT NONE
REAL, DIMENSION(:,:), INTENT(IN) ::a
REAL :: work,l2norm
INTEGER ::n,j,m,i
! first find size of array
n=SIZE(a,1)
m=SIZE(a,2)
PROGRAM choose_prec
IMPLICIT NONE
REAL (KIND = wp) :: a
WRITE(*, *) HUGE(a)
+ 58
MODULE precision