Transcript

Beginning Fortran

Fortran (77) Basics22 October 2009

*Black text on white background provided for easy printing

Example Code

• Write a program to read in five values of temperature in Fahrenheit and convert to degrees Celsius OR Kelvin OR both.

Your Typical Programc234567 PROGRAM MYPROGRAM

STOP END

Program OptionsProgram Options

Declaration of VariablesDeclaration of Variables

MAIN CODEMAIN CODE

Your Typical Programc234567 PROGRAM MYPROGRAM

STOP END

Program OptionsProgram Options

Declaration of VariablesDeclaration of Variables

MAIN CODEMAIN CODE

Program Declaration

• You declare what kind of Fortran file you are writing on the first line.

• Syntax: <TYPE> <NAME>

c234567

PROGRAM CONVERTF

Program Declaration

• You declare what kind of Fortran file you are writing on the first line.

• Syntax: <TYPE> <NAME>

c234567

PROGRAM CONVERTFSpecifies the file as a program Program name – something short but descriptive

Your Typical Programc234567 PROGRAM CONVERTF

STOP END

Program OptionsProgram Options

Declaration of VariablesDeclaration of Variables

MAIN CODEMAIN CODE

Options and Variables

• There are numerous options – you can Google them if you are interested

• In general, there are two kinds:– You can “include” variables from another *.h file

by putting include ‘<filename>.h’in the options section.

– You can switch on other options about how the code is run (Google it)

– We are going to use implicit none

Options and Variables

• All variables we are going to use must be accounted for in the declaration section (no implicit variables allowed) – implicit none

• What do we need?– Temperature in Fahrenheit, Celsius, Kelvin– Logicals (do we want Celsius, Kelvin, both?)– Some integer to loop through all 5 values– Syntax: <TYPE> <NAME>

Options and Variables

c234567

IMPLICIT NONE

PARAMETER NT = 5

REAL F(NT)

REAL K(NT)

REAL C(NT)

LOGICAL DOC

LOGICAL DOK

INTEGER I

Options and Variables

c234567

IMPLICIT NONE

PARAMETER NT = 5

REAL F(NT)

REAL K(NT)

REAL C(NT)

LOGICAL DOC

LOGICAL DOK

INTEGER I

Specify a special parameter – an unchangeable value that can immediately be used (unlike a variable, which can change value)

Options and Variables

c234567

IMPLICIT NONE

PARAMETER NT = 5

REAL F(NT)

REAL K(NT)

REAL C(NT)

LOGICAL DOC

LOGICAL DOK

INTEGER I

Array of 5 REALs for Fahrenheit temps

Options and Variables

c234567

IMPLICIT NONE

PARAMETER NT = 5

REAL F(NT)

REAL K(NT)

REAL C(NT)

LOGICAL DOC

LOGICAL DOK

INTEGER I

Array of 5 REALs for Kelvin temps

Options and Variables

c234567

IMPLICIT NONE

PARAMETER NT = 5

REAL F(NT)

REAL K(NT)

REAL C(NT)

LOGICAL DOC

LOGICAL DOK

INTEGER I

Array of 5 REALs for Celsius temps

Options and Variables

c234567

IMPLICIT NONE

PARAMETER NT = 5

REAL F(NT)

REAL K(NT)

REAL C(NT)

LOGICAL DOC

LOGICAL DOK

INTEGER I

Logical: Do we want to convert to Celsius (TRUE) or not (FALSE)?

Options and Variables

c234567

IMPLICIT NONE

PARAMETER NT = 5

REAL F(NT)

REAL K(NT)

REAL C(NT)

LOGICAL DOC

LOGICAL DOK

INTEGER I Logical: Do we want to convert to Kelvin (TRUE) or not (FALSE)?

Options and Variables

c234567

IMPLICIT NONE

PARAMETER NT = 5

REAL F(NT)

REAL K(NT)

REAL C(NT)

LOGICAL DOC

LOGICAL DOK

INTEGER IInteger that counts from 1 to 5 for loop over one-dimensional arrays

Your Typical Programc234567 PROGRAM CONVERTF IMPLICIT NONE PARAMETER NT = 5 REAL F(NT) REAL K(NT) REAL C(NT) LOGICAL DOC LOGICAL DOK INTEGER I

STOP END

MAIN CODEMAIN CODE

Main Code

• We need to do several things:– Read in 5 values of temperature– Determine if we need to convert to Celsius, Kelvin,

or both– Output values

FF

From User

FiFi CiCi

KiKiTo User

To User

To User

DOC

DOK

FF

From User

FiFi CiCi

KiKiTo User

To User

To User

Read in 5 values of F into array

DOC

DOK

FF

From User

FiFi CiCi

KiKiTo User

To User

To User

For each of the five temperatures (for-loop):

DOC

DOK

FF

From User

FiFi CiCi

KiKiTo User

To User

To User

Compute C (we are going to do this no matter what, because we know that the output has to either be C or K or both, and we need C in order to calculate K anyway).

DOC

DOK

FF

From User

FiFi CiCi

KiKiTo User

To User

To User

Output F to user (this should be done just to make sure that the input was read correctly).

DOC

DOK

FF

From User

FiFi CiCi

KiKiTo User

To User

To User

If DOC = TRUE, then output C as well.

DOC

DOK

FF

From User

FiFi CiCi

KiKiTo User

To User

To User

If DOK = TRUE, then compute K from C and output to user as well.

DOC

DOK

Main Code

FF

From User

c234567 DO I = 1, NT READ(*,*) F(I) ENDDO

Main Code

FF

From User

c234567 DO I = 1, NT READ(*,*) F(I) ENDDO

READ is a Fortran command that is used for input.Syntax: READ(<location>,<formatting>)

Location (*) = read in from the terminalFormat (*) = no particular format

Main Code

FF

From User

c234567 DO I = 1, NT READ(*,*) F(I) ENDDO WRITE(*,*) ‘Convert to C?’ READ(*,*) DOC WRITE(*,*) ‘Convert to K?’ READ(*,*) DOK

Main Code

FF

From User

c234567 DO I = 1, NT READ(*,*) F(I) ENDDO WRITE(*,*) ‘Convert to C?’ READ(*,*) DOC WRITE(*,*) ‘Convert to K?’ READ(*,*) DOK

Write to screen with no particular formatting.

Main Code

c234567 DO I = 1, NT C(I) = (5./9.)*(F(I)-32.) ENDDO

Main Code

c234567 DO I = 1, NT C(I) = (5./9.)*(F(I)-32.) ENDDO

For each temperature:

Main Code

c234567 DO I = 1, NT C(I) = (5./9.)*(F(I)-32.) ENDDO

For each temperature:Compute Celsius temp.

Main Code

c234567 IF (DOK .EQV. .TRUE.) THEN DO I = 1, NT K(I) = C(I) + 273.15 ENDDO ENDIF

Main Code

c234567 IF (DOK .EQV. .TRUE.) THEN DO I = 1, NT K(I) = C(I) + 273.15 ENDDO ENDIF

Logical trap: If we want to calculate Kelvin:

Main Code

c234567 IF (DOK .EQV. .TRUE.) THEN DO I = 1, NT K(I) = C(I) + 273.15 ENDDO ENDIF

Logical trap: If we want to calculate Kelvin:Loop through temperatures and calculate Kelvin temps.(If DOK = .FALSE., this entire loop is avoided)

Main Codec234567 IF ((DOC .EQV. .TRUE.) .AND. (DOK .EQV. .FALSE.)) THEN DO I = 1, NT WRITE(*,*) F(I), ‘F = ‘, C(I), ‘C’ ENDDO ENDIFc IF ((DOC .EQV. .FALSE.) .AND. (DOK .EQV. .TRUE.)) THEN DO I = 1, NT WRITE(*,*) F(I), ‘F = ‘, K(I), ‘K’ ENDDO ENDIFc IF ((DOC .EQV. .TRUE.) .AND. (DOK .EQV. .TRUE.)) THEN DO I = 1, NT WRITE(*,*) F(I), ‘F = ‘, C(I), ‘C ’, K(I), ‘K’ ENDDO ENDIF

Main Codec234567 IF ((DOC .EQV. .TRUE.) .AND. (DOK .EQV. .FALSE.)) THEN DO I = 1, NT WRITE(*,*) F(I), ‘F = ‘, C(I), ‘C’ ENDDO ENDIFc IF ((DOC .EQV. .FALSE.) .AND. (DOK .EQV. .TRUE.)) THEN DO I = 1, NT WRITE(*,*) F(I), ‘F = ‘, K(I), ‘K’ ENDDO ENDIFc IF ((DOC .EQV. .TRUE.) .AND. (DOK .EQV. .TRUE.)) THEN DO I = 1, NT WRITE(*,*) F(I), ‘F = ‘, C(I), ‘C ’, K(I), ‘K’ ENDDO ENDIF

c234567 PROGRAM CONVERTF IMPLICIT NONE PARAMETER NT = 5 REAL F(NT) REAL K(NT) REAL C(NT) LOGICAL DOC LOGICAL DOK INTEGER I DO I = 1, NT READ(*,*) F(I) ENDDO WRITE(*,*) ‘Convert to C?’ READ(*,*) DOC WRITE(*,*) ‘Convert to K?’ READ(*,*) DOK DO I = 1, NT C(I) = (5./9.)*(F(I)-32.) ENDDO IF (DOK .EQV. .TRUE.) THEN DO I = 1, NT K(I) = C(I) + 273.15 ENDDO ENDIF IF ((DOC .EQV. .TRUE.) .AND. (DOK .EQV. .FALSE.)) THEN DO I = 1, NT WRITE(*,*) F(I), ‘F = ‘, C(I), ‘C’ ENDDO ENDIFc IF ((DOC .EQV. .FALSE.) .AND. (DOK .EQV. .TRUE.)) THEN DO I = 1, NT WRITE(*,*) F(I), ‘F = ‘, K(I), ‘K’ ENDDO ENDIFc IF ((DOC .EQV. .TRUE.) .AND. (DOK .EQV. .TRUE.)) THEN DO I = 1, NT WRITE(*,*) F(I), ‘F = ‘, C(I), ‘C ’, K(I), ‘K’ ENDDO ENDIF STOP END

Program Start

Options/Variable Declaration

Main Code

Program End

c234567 PROGRAM CONVERTF IMPLICIT NONE PARAMETER NT = 5 REAL F(NT) REAL K(NT) REAL C(NT) LOGICAL DOC LOGICAL DOK INTEGER I DO I = 1, NT READ(*,*) F(I) ENDDO WRITE(*,*) ‘Convert to C?’ READ(*,*) DOC WRITE(*,*) ‘Convert to K?’ READ(*,*) DOK DO I = 1, NT C(I) = (5./9.)*(F(I)-32.) ENDDO IF (DOK .EQV. .TRUE.) THEN DO I = 1, NT K(I) = C(I) + 273.15 ENDDO ENDIF IF ((DOC .EQV. .TRUE.) .AND. (DOK .EQV. .FALSE.)) THEN DO I = 1, NT WRITE(*,*) F(I), ‘F = ‘, C(I), ‘C’ ENDDO ENDIFc IF ((DOC .EQV. .FALSE.) .AND. (DOK .EQV. .TRUE.)) THEN DO I = 1, NT WRITE(*,*) F(I), ‘F = ‘, K(I), ‘K’ ENDDO ENDIFc IF ((DOC .EQV. .TRUE.) .AND. (DOK .EQV. .TRUE.)) THEN DO I = 1, NT WRITE(*,*) F(I), ‘F = ‘, C(I), ‘C ’, K(I), ‘K’ ENDDO ENDIF STOP END

Compilation

• Compilation is performed in the terminal:

Syntax:<compiler> -o <exec. filename> <source filename> <options>

Compilation

• Compilation is performed in the terminal:

Syntax:<compiler> -o <exec. filename> <source filename> <options>

Depends on system: f77, g77, pgf77, etc.

Compilation

• Compilation is performed in the terminal:

Syntax:<compiler> -o <exec. filename> <source filename> <options>

We wish to create an object that is an executable file with the following name

Compilation

• Compilation is performed in the terminal:

Syntax:<compiler> -o <exec. filename> <source filename> <options>

Use this *.f file to compile the executable

Compilation

• Compilation is performed in the terminal:

Syntax:<compiler> -o <exec. filename> <source filename> <options>

Also depends on compiler. Some frequent options:Mextend – allows you to go over column 70 in the codeMbounds – if you attempt to reference an array index out of bounds, will notify youMbyteswapio – some formats require a byte-swap

Compilation

• Compilation is performed in the terminal:

Syntax:<compiler> -o <exec. filename> <source filename> <options>

pgf77 –o CONVERTF.exe CONVERTF.f


Top Related