introduction to fortran, part 1 - nics.tennessee.edu schmidt introduction to fortran 42/50....

59
Introduction Basics Control Functions Precision Wrapup Introduction to Fortran Drew Schmidt January 16, 2014 Drew Schmidt Introduction to Fortran

Upload: lykhuong

Post on 16-Apr-2018

236 views

Category:

Documents


1 download

TRANSCRIPT

Introduction Basics Control Functions Precision Wrapup

Introduction to Fortran

Drew Schmidt

January 16, 2014

Drew Schmidt Introduction to Fortran

Introduction Basics Control Functions Precision Wrapup

Contents

1 Introduction

2 Basics

3 Control

4 Functions, Intrinsics, and Subroutines

5 Precision

6 Wrapup

Drew Schmidt Introduction to Fortran

Introduction Basics Control Functions Precision Wrapup

Contents

1 IntroductionBackgroundHello World

Drew Schmidt Introduction to Fortran

Introduction Basics Control Functions Precision Wrapup

Background

What is Fortran?

Formula translation system.

General purpose programming language.

Well-suited for mathematics and engineering.

Compiled (rather than interpreted)

Portable.

Drew Schmidt Introduction to Fortran 1/50

Introduction Basics Control Functions Precision Wrapup

Background

History

Created at IBM in 1954 as an alternative to assemblylanguage.

Debuted in the days of punch cards.

Regularly gets updated to a new standard.

Drew Schmidt Introduction to Fortran 2/50

Introduction Basics Control Functions Precision Wrapup

Background

What people think Fortran is like

1 1121 FORMAT(I4,F8.3)

2 3298 CONTINUE

3 IF(MOD(I,A)

4 $.EQ.Z) THEN

5 GOTO 2359

6 ELSE IF(MOD(I,B)

7 $.EQ.Z) THEN

8 GOTO 8125

9 ELSE

10 WRITE (* ,2930) I

11 GOTO 7365

12 END IF

13 7235 FORMAT(A,F5.3)

14 7356 CONTINUE

15 I=I

16 $+1

17 GOTO 1249

18 2930 FORMAT(I4,$)

19 2359 CONTINUE

Drew Schmidt Introduction to Fortran 3/50

Introduction Basics Control Functions Precision Wrapup

Background

Standards

Fortran standards are denoted by year.

Fortran 66

Fortran 77

Fortran 90

Fortran 95

Fortran 2003

Fortran 2008

Fortran 2015

Drew Schmidt Introduction to Fortran 4/50

Introduction Basics Control Functions Precision Wrapup

Background

Language Features

Fortran essentially has two formats: Fortran 77 and “modern”.All versions have:

Matrices.

Complex numbers.

Good interoperability with C.

REALLY good compilers.

Modern variants of Fortran additionally have:

Dynamic memory allocation.

Pointers.

OOP.

Drew Schmidt Introduction to Fortran 5/50

Introduction Basics Control Functions Precision Wrapup

Background

Applications for Fortran

Bad applications:

A website

An OS kernel

Text processing

Random numbergenerators

Good applications:

Mathematics

Engineering

Statistics

Scientific computing

Drew Schmidt Introduction to Fortran 6/50

Introduction Basics Control Functions Precision Wrapup

Background

Compilers

GNU gfortran (free)

Intel ifortran

Portland Group pgfortran

. . .

Drew Schmidt Introduction to Fortran 7/50

Introduction Basics Control Functions Precision Wrapup

Background

Why Fortran?

High level language

Avoids fiddly memory management like in C

Fortran binaries are VERY fast

Good HPC support (MPI, OpenMP, . . . )

Drew Schmidt Introduction to Fortran 8/50

Introduction Basics Control Functions Precision Wrapup

Hello World

Hello world example

hello.f

1 program helloworld

2 print *, "Hello world"

3 end program helloworld

Drew Schmidt Introduction to Fortran 9/50

Introduction Basics Control Functions Precision Wrapup

Hello World

Hello world example

hello.f90

1 program helloworld

2 print *, "Hello world"

3 end program helloworld

Drew Schmidt Introduction to Fortran 10/50

Introduction Basics Control Functions Precision Wrapup

Hello World

Comments

.f is for F77, .f90 is for F90+

Don’t use F77.

Fortran is case insensitive.

print and write print/write output

read reads input

Drew Schmidt Introduction to Fortran 11/50

Introduction Basics Control Functions Precision Wrapup

Contents

2 BasicsNumeric TypesLogical Type

Drew Schmidt Introduction to Fortran

Introduction Basics Control Functions Precision Wrapup

Basic Type

Integer

Real/double

Complex/double complex

Logical

Character

Drew Schmidt Introduction to Fortran 12/50

Introduction Basics Control Functions Precision Wrapup

Numeric Types

Integer

Whole numbers.

1

-517

0

Not 1.2

Not π

Not 0.0

Drew Schmidt Introduction to Fortran 13/50

Introduction Basics Control Functions Precision Wrapup

Numeric Types

Real and Double

Floating point

1.1

3.14159

Not 1

Not√−1

Drew Schmidt Introduction to Fortran 14/50

Introduction Basics Control Functions Precision Wrapup

Numeric Types

Basic Numeric Operations

a=b: assign the value of b to a

a+b: add a and b

a-b: subtract b from a

a*b: multiply a and b

a/b: divide b into a

a**b: raise a to the power b

Drew Schmidt Introduction to Fortran 15/50

Introduction Basics Control Functions Precision Wrapup

Numeric Types

Quick example

1 program arithmetic

2 integer :: a = 2, b = 3

3

4 print *, a+b

5 print *, a**b

6 print *, a/b

7 end program

5

8

0

Drew Schmidt Introduction to Fortran 16/50

Introduction Basics Control Functions Precision Wrapup

Logical Type

Logical

Logical variables can take two values:

.true.

.false.

Drew Schmidt Introduction to Fortran 17/50

Introduction Basics Control Functions Precision Wrapup

Logical Type

Comparing Logicals

.eqv. tests if two logical expressions are equivalent

.neqv. tests if two logical expressions are not equivalent

.and. the and operator

.or. the or operator

.not. the negation operator

Drew Schmidt Introduction to Fortran 18/50

Introduction Basics Control Functions Precision Wrapup

Logical Type

Comparing Numerics

a<b or a.lt.b: a less than b

a<=b or a.le.b: a less than or equal to b

a>b or a.gt.b: a greater than b

a>=b or a.ge.b: a greater than or equal to b

a==b or a.eq.b: a equal to b

a/=b or a.ne.b: a not equal to b

The type of a numeric comparison is of type logical.

Drew Schmidt Introduction to Fortran 19/50

Introduction Basics Control Functions Precision Wrapup

Logical Type

Comparing Numerics

Note: The output of a comparison of numerics is logical:

a < b < c makes no sense (types mismatch)

Instead: a < b .and. b < c

Drew Schmidt Introduction to Fortran 20/50

Introduction Basics Control Functions Precision Wrapup

Logical Type

Quick example

1 program logicals

2 integer :: a = 2, b = 3, c = 1

3

4 print *, a < b

5 print *, a /= b .and. a < c

6 end program

T

F

Drew Schmidt Introduction to Fortran 21/50

Introduction Basics Control Functions Precision Wrapup

Logical Type

Implicit Declaration

In Fortran, variables may be used implicitly.

Do not get into the habit of doing this.

You can turn this off in a program (function, subroutine) bydeclaring implicit none.

Declaring implicit none is generally recommended.

Drew Schmidt Introduction to Fortran 22/50

Introduction Basics Control Functions Precision Wrapup

Logical Type

Implicit variables quick example

Compiles:

1 program implicit_declaration

2 a = 2

3 b = 3

4 print *, a+b

5 end program

Fails to compile:

1 program implicit_declaration

2 implicit none

3 a = 2

4 b = 3

5 print *, a+b

6 end program

Drew Schmidt Introduction to Fortran 23/50

Introduction Basics Control Functions Precision Wrapup

Logical Type

Example

Go to example.

Not covered:

complex

character

kind/precision

Drew Schmidt Introduction to Fortran 24/50

Introduction Basics Control Functions Precision Wrapup

Contents

3 Controlif-then-elseLoops

Drew Schmidt Introduction to Fortran

Introduction Basics Control Functions Precision Wrapup

if-then-else

if-then-else

Conditionals can take a few different forms:

1 if (condition) one -liner

1 if (condition 1) then

2 statement

3 else if (condition 2) then

4 statement

5 else if (...) then

6 ...

7 else

8 statement

9 end if

Note: the else if and else pieces are optional

Drew Schmidt Introduction to Fortran 25/50

Introduction Basics Control Functions Precision Wrapup

if-then-else

if-then-else quick example

1 integer :: score

2 character(len=1) :: grade

3

4 if (score < 60) then

5 grade = "F"

6 else if (score < 70) then

7 grade = "D"

8 else if (score < 80) then

9 grade = "C"

10 else if (score < 90) then

11 grade = "B"

12 else

13 grade = "A"

14 end if

Drew Schmidt Introduction to Fortran 26/50

Introduction Basics Control Functions Precision Wrapup

Loops

do Loops

1 do index = first , last , step

2 ! statements

3 end do

index, first, last are integers

step is a non-zero integer

step can be omitted (and in this case, the step is 1)

Drew Schmidt Introduction to Fortran 27/50

Introduction Basics Control Functions Precision Wrapup

Loops

do loops quick example

1 integer :: factorial , i, n

2

3 print *, "Give me a positive integer integer:"

4 read *, n

5

6 factorial = 1

7

8 do i = 2, n

9 factorial = factorial * i

10 end do

11

12 print *, n, "! = ", factorial

Drew Schmidt Introduction to Fortran 28/50

Introduction Basics Control Functions Precision Wrapup

Loops

do Loops

1 do

2 ! statements

3 end do

statements are executed repeatedly

To exit the loop, use exit

To jump to the next iteration, use cycle

Drew Schmidt Introduction to Fortran 29/50

Introduction Basics Control Functions Precision Wrapup

Loops

do loops quick example

1 integer :: f, i, n

2

3 print *, "Give me an integer:"

4 read *, n

5

6 f = 1

7 i = 2

8 do

9 if (i <= n) then

10 f = f * i

11 i = i + 1

12 else

13 exit

14 end if

15 end do

16

17 print *, n, "! = ", f

Drew Schmidt Introduction to Fortran 30/50

Introduction Basics Control Functions Precision Wrapup

Loops

Example

Go to example.

Not covered: do-while loops

Drew Schmidt Introduction to Fortran 31/50

Introduction Basics Control Functions Precision Wrapup

Contents

4 Functions, Intrinsics, and SubroutinesFunctionsIntrinsicsSubroutines

Drew Schmidt Introduction to Fortran

Introduction Basics Control Functions Precision Wrapup

Functions

Functions

1 ! Declaration

2 function foo(bar)

3 type :: foo

4 ! statements

5 end function

6

7 ! Invocation

8 a = foo(b)

Can take variety of inputs.

Returns single output.

Drew Schmidt Introduction to Fortran 32/50

Introduction Basics Control Functions Precision Wrapup

Functions

Functions quick example

1 function circumference(r)

2 implicit none

3 real :: pi = 3.14159

4 real :: r

5 real :: circumference

6 circumference = 2.0*pi*r

7 end function circumference

8

9 program circles

10 real :: r = 2.0

11 real :: circumference

12 print *, circumference(r)

13 end program circles

12.5663605

Drew Schmidt Introduction to Fortran 33/50

Introduction Basics Control Functions Precision Wrapup

Intrinsics

Intrinsics

Built-in functions.

Casting.

Basic math utilitis.

Bit-shifting.

Drew Schmidt Introduction to Fortran 34/50

Introduction Basics Control Functions Precision Wrapup

Intrinsics

Intrinsic Examples

Intrinsic Effect Intrinsic Effectint Convert to integer mod Modular arithmeticreal Convert to real abs Absolute valuefloor Greatest integer below sqrt Square rootceiling Smallest integer above exp Exponential

Drew Schmidt Introduction to Fortran 35/50

Introduction Basics Control Functions Precision Wrapup

Intrinsics

Intrinsics quick example

1 integer :: a = 2, b = 3

2

3 print *, mod(3, 2)

4 print *, real(a/b)

5 print *, real(a) / real(b)

1

0.00000000

0.666666687

Drew Schmidt Introduction to Fortran 36/50

Introduction Basics Control Functions Precision Wrapup

Subroutines

Subroutines

1 ! Declaration

2 subroutine foo(bar , baz)

3 type :: bar , baz

4 ! statements

5 end subroutine

6

7 ! Invocation

8 call foo(a, b)

Can take variety of inputs.

Returns a variety of outputs (modifying values of inputs).

Equivalent in C is void function.

Drew Schmidt Introduction to Fortran 37/50

Introduction Basics Control Functions Precision Wrapup

Subroutines

Intent

Can declare intention of use for variable.

intent(in), intent(out), intent(inout).

Like implicit none, not strictly necessary, but useful.

1 subroutine foo(a, b)

2 integer , intent(in) :: a

3 integer , intent(out) :: b

4 ! statements

5 end subroutine

Drew Schmidt Introduction to Fortran 38/50

Introduction Basics Control Functions Precision Wrapup

Subroutines

Subroutine quick example

1 subroutine circ_stuff(r, circumference , area)

2 implicit none

3 real :: pi = 3.14159

4 real , intent(in) :: r

5 real , intent(out) :: circumference , area

6 circumference = 2.0 * pi * r

7 area = pi * r * r

8 end subroutine circ_stuff

9

10 program circles

11 real :: r = 2.0, circumference , area

12 call circ_stuff(r, circumference , area)

13 print *, "Circumference = ", circumference

14 print *, "Area = ", area

15 end program circles

Circumference = 12.5663605

Area = 12.5663605

Drew Schmidt Introduction to Fortran 39/50

Introduction Basics Control Functions Precision Wrapup

Subroutines

Example

Go to example.

Drew Schmidt Introduction to Fortran 40/50

Introduction Basics Control Functions Precision Wrapup

Contents

5 PrecisionKind

Drew Schmidt Introduction to Fortran

Introduction Basics Control Functions Precision Wrapup

Precision

In C, there are two floating point types

float

double

In elder Fortran, the corresponding types are

real

double precision

Drew Schmidt Introduction to Fortran 41/50

Introduction Basics Control Functions Precision Wrapup

Scientific Notation and Precision

number = mantissa× 10exponent

1.234 = 1234× 10−4

real: 23 bit of mantissa, 8 bits of exponent, and 1 sign bit.

double precision: 52 bit of mantissa, 11 bits of exponent,and 1 sign bit.

real: ≈ 6 decimal digits of precision

double precision: ≈ 15 decimal digits of precision

Drew Schmidt Introduction to Fortran 42/50

Introduction Basics Control Functions Precision Wrapup

Kind

Kind

kind is a parameter that specifies the storage/precision of atype (beyond its default)

real(kind=4)

Different compilers assign different meaning to kind.

Avoid this complexity with the intrinsic functionsselected_<type>_kind

real(kind=selected_real_kind(6))

real(kind=selected_real_kind(15))

. . .

Drew Schmidt Introduction to Fortran 43/50

Introduction Basics Control Functions Precision Wrapup

Kind

Quick example

1 program kind_example

2 implicit none

3 integer , parameter :: r15 = selected_real_kind (15)

4 real :: x

5 real(kind=r15) :: y

6

7 x = 1.0

8 y = 1.0

9

10 print *, x

11 print *, y

12

13 end program

1.00000000

1.0000000000000000

Drew Schmidt Introduction to Fortran 44/50

Introduction Basics Control Functions Precision Wrapup

Contents

6 Wrapup

Drew Schmidt Introduction to Fortran

Introduction Basics Control Functions Precision Wrapup

Other Important Topics Not Discussed Here

Debugging

Arrays

Pointers

Interfacing to C

Tabs versus spaces

Drew Schmidt Introduction to Fortran 45/50

Introduction Basics Control Functions Precision Wrapup

Some languages come and go

Drew Schmidt Introduction to Fortran 46/50

Introduction Basics Control Functions Precision Wrapup

But with Fortran. . .

Drew Schmidt Introduction to Fortran 47/50

Introduction Basics Control Functions Precision Wrapup

Because when the USS Enterprise makes her maiden voyage

Drew Schmidt Introduction to Fortran 48/50

Introduction Basics Control Functions Precision Wrapup

Beneath the fancy blinking screens

Drew Schmidt Introduction to Fortran 49/50

Introduction Basics Control Functions Precision Wrapup

You can bet that their crucial systems are powered by Fortranwritten in the 1970’s

Drew Schmidt Introduction to Fortran 50/50

Introduction Basics Control Functions Precision Wrapup

Thanks for coming!

Questions?

Drew Schmidt Introduction to Fortran 50/50