Top Banner
WorkEta Introdução ao Fortran 90 Margarete Domingues [email protected] Tips Fortran 90 – p.1/87
90

Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Feb 08, 2019

Download

Documents

nguyencong
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

WorkEtaIntrodução ao Fortran 90

Margarete Domingues

[email protected]

Tips Fortran 90 – p.1/87

Page 2: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Estrutura de um programa Fortran

Tips Fortran 90 – p.2/87

Page 3: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Estrutura de um programa Fortran

Um prog. em Fortran 90 consiste de frases

algumas frases (statements) são executadasoutras são descritivas

Os programas são executados sequencialmente,iniciando na primeira frase executável.

Tips Fortran 90 – p.3/87

Page 4: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Estrutura de um programa principal

PROGRAM namespecification statements...........executable statements...........END PROGRAM name

Tips Fortran 90 – p.4/87

Page 5: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Exemplo:

PROGRAM SIMPLE! THIS IS A SIMPLE SAMPLE PROGRAMIMPLICIT NONEREAL :: A,B,C,TOTALA = 1.0B = 2.0C = 3.0TOTAL = A + B + CPRINT *,’TOTAL IS’,TOTAL

END PROGRAM SIMPLE

Tips Fortran 90 – p.5/87

Page 6: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Fortran statements

Tips Fortran 90 – p.6/87

Page 7: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Program Statement

PROGRAM program name

Todos os nomes em Fortran devem:ter tamanho máximo de 31 caracterescomeçar com uma letra (maiúscula/minúscula)pode ser composto apenas por: A-Z,a-z, 0-9 e _

Tipos de declarações statements:IMPLICIT NONE —- não permite atribuições detipos defaultREAL :: {list of variables} — todas as variáveisprecisam ser declaradas

Tips Fortran 90 – p.7/87

Page 8: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

(cont.)

Entrada e saída: PRINT e READ —- lista-direta deoutput e input statements

PRINT *,{list of items to be printed}READ *,{list of items to be read in}

CALL {subroutine name} ({argument list}) — é umprocesso de transferência para uma subrotina deinformações com argumentos.

END ou END PROGRAM {name}

Tips Fortran 90 – p.8/87

Page 9: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Cometários iniciais de um prog.

nome dos autores

data e modificações

documentação para usuários

documentação técnica: que informações são utéispara o entendimento do programa.

limitações do programa.

Tips Fortran 90 – p.9/87

Page 10: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Exemplo

...! Author: CooleyTuckey!! Date: 10th july 1965: original code creation.! Modified: 19th Mar 2004: clarified program structure.!! Program Description:! FFT program!! Input Description: The numbers to be read in must be real.!! List of Variables Used:! X...CONTAINS THE TIME SERIES! COEF...CONTAINS THE RESULT FFT COEF.

....

Tips Fortran 90 – p.10/87

Page 11: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Erros

Tips Fortran 90 – p.11/87

Page 12: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Compilador e erros nos programas

Erros podem fazer com que os programas não sejamexecutados, ou pior ainda, fazer com que eles nosdeem respostas incorretas.

A maioria das tarefas ligadas a programação estáassociada a corrigir erros.

Classificação dos erros:erros de sintaxeerros de lógica

Tips Fortran 90 – p.12/87

Page 13: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Design e Teste

Tips Fortran 90 – p.13/87

Page 14: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Design, Maintainability, Portability

especificar o problema a ser resolvido claramente

input/output claros

um design limpo e modular

uso de procedures/libraries já existentes

nomes descritivos, comentarios claros e úteis

verificação de erro na entrada e nos estágios internosdos cálculos.

programas testes com casos realisticos

Tips Fortran 90 – p.14/87

Page 15: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Exercícios - erros

PROGRAM test! This program contains four major errors && and three examples of bad programming stylePRINT *,Please type a numberREAD *,numbrPRINT *,"The number you typed was ",numberEND

Tips Fortran 90 – p.15/87

Page 16: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

(cont.)

quais são os erros?

compile o programa, verifique os erros encontrados,faça as correções, compile novamente, execute-o eentre com o número 123 qdo solicitado. A resposta foicorreta?

E se a entrada fosse 12.3?

Como podemos ajudar o compilador?

Tips Fortran 90 – p.16/87

Page 17: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

(cont.)

quais são os erros?

compile o programa, verifique os erros encontrados,faça as correções, compile novamente, execute-o eentre com o número 123 qdo solicitado. A resposta foicorreta?

E se a entrada fosse 12.3?

Como podemos ajudar o compilador?

Tips Fortran 90 – p.16/87

Page 18: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

(cont.)

quais são os erros?

compile o programa, verifique os erros encontrados,faça as correções, compile novamente, execute-o eentre com o número 123 qdo solicitado. A resposta foicorreta?

E se a entrada fosse 12.3?

Como podemos ajudar o compilador?

Tips Fortran 90 – p.16/87

Page 19: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

(cont.)

quais são os erros?

compile o programa, verifique os erros encontrados,faça as correções, compile novamente, execute-o eentre com o número 123 qdo solicitado. A resposta foicorreta?

E se a entrada fosse 12.3?

Como podemos ajudar o compilador?

Tips Fortran 90 – p.16/87

Page 20: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Formas do F77 & F90

Tips Fortran 90 – p.17/87

Page 21: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

F77 fixed form

brancos não são significativos, exceto em caracteres

Fortran statement são escritos nas colunas 7 to 72

linha comentário — C ou* na coluna 1

continuação de uma linha — um caracter na coluna 6

máximo de um statement 19 linhas de continuação

labels ficam nas colunas 1 a 5

Tips Fortran 90 – p.18/87

Page 22: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

F90 free form

brancos são significativos, eles não devem aparecerem nomes e pelo menos um branco deve separarnomes/números e Fortran keywords.

linhas de comentário ! - mesmo que não seja nocomeço (trailing comments)

linhas podem ter até 132 caracteres e podem contermais de um statement separados por ";"

& indica que o statement continua na próxima linha.

39 linhas de continuação

label possuem até 5 digitos que precedem ostatement.

Tips Fortran 90 – p.19/87

Page 23: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Caracteres válidos, constantes, variáveis,memória

Tips Fortran 90 – p.20/87

Page 24: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Fortran Character Set

A–Z. (maiúsculas ou minúsculas).

digitos 0- 9

_

branco = + - * / ( ) , . $ ’ ": ! % & ; < > ?

ASCII character set são legais em constantes literais,e.g. ’fred@home’, ’[...]’.

Tips Fortran 90 – p.21/87

Page 25: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Constantes and Variáveis

memória principal de um computador consistepalavras (words)

cada word uma certa quantidade de informação

typicamente, uma palavra possui 2 bytes (8 bits -binary digits) de informação

Tips Fortran 90 – p.22/87

Page 26: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Armazenamento na memória emFortran

Integers: e.g. 1, 123, -56 (4 bytes (2 words = 32 bits))

Real (or floating point) numbers: e.g. 1.23, -4.56,1.0E02

Real – armazenado em duas partes: a mantissa eo expoent, e.g. 4.5E02.single precision real numbers: 4 bytes (2 words =32 bits)double precision real numbers are stored in 8 bytes( 4words = 64 bits)

Character or arrays de texto: e.g. ABCDE, FREDtamanho das variáveis caracter dependem da suadeclaração inicial (e.g. CHARACTER*4 = 32 bits =4 letters). Tips Fortran 90 – p.23/87

Page 27: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Variable Type Declarations

IMPLICIT NONETYPE :: {names}CHARACTER (LEN=length) :: name1, name2

Exemplo:

REAL :: a,b,cINTEGER :: i,j,kCHARACTER (LEN=10) :: name="Undefined"

Constantes – especificadas com o PARAMETERREAL, PARAMETER :: alpha=3.01INTEGER, PARAMETER :: ten=10

Tips Fortran 90 – p.24/87

Page 28: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Derived Data Types

Tipos padrões do Fortran:

REAL, INTEGER, CHARACTER, DOUBLEPRECISION, LOGICAL, COMPLEX.

Tipos derivados:

TYPE new_typecomponent defn

...END TYPE new_type

Tips Fortran 90 – p.25/87

Page 29: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Exemplo - data type

TYPE WorkEta_participante

CHARACTER (LEN=12) :: first_name,

& middle_name last_name

INTEGER :: age

CHARACTER :: Origin_Institute

END TYPE WorkEta_participante

Tips Fortran 90 – p.26/87

Page 30: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Exemplo - data type

variáveis passam a ser declaradas:

TYPE(WorkEta_participante) :: cristiane,

cristine =

& WorkEta_participante

("Cristiane","Maria","Osorio",28,"ONS")

componentes passam a ser referidas:cristiane\%first_namecristiane\%agecristiane\%Origin_Institute

Tips Fortran 90 – p.27/87

Page 31: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Exemplo

PROGRAM geometry! Copyright 1994, Miles Ellis, Ivor Philips and Tom Lahey! A program to use derived types for two-dimensional! geometric calculations! Type definitionsIMPLICIT NONE

TYPE pointCHARACTER(LEN=12) :: nameREAL :: x,y ! Cartesian coordinates of the pointEND TYPE point

Tips Fortran 90 – p.28/87

Page 32: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Exemplo (cont.)

TYPE lineCHARACTER(LEN=12) :: nameREAL :: a,b,c ! coefficients of defining equation

END TYPE line

! Variable declarationsTYPE(point) :: p1,p2TYPE(line) :: p1_to_p2

Tips Fortran 90 – p.29/87

Page 33: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Exemplo (cont.)

! Read dataPRINT *,"Please type co-ordinates of first point"READ *,p1%x,p1%yPRINT *,"Please type co-ordinates of second point"READ *,p2%x,p2%y

Tips Fortran 90 – p.30/87

Page 34: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Exemplo (cont.)

! Calculate coefficients of equation representing the linep1_to_p2%a = p2%y - p1%yp1_to_p2%b = p1%x - p2%xp1_to_p2%c = p1%y*p2%x - p2%y*p1%x

! Print resultPRINT *,"The equation of the line joining these two points is"PRINT *,"ax + by + c = 0"PRINT *,"where a = ",p1_to_p2%aPRINT *," b = ",p1_to_p2%bPRINT *," c = ",p1_to_p2%c

END PROGRAM geometry

Tips Fortran 90 – p.31/87

Page 35: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Expressões

Tips Fortran 90 – p.32/87

Page 36: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Expressões aritméticas

+ addition- subtraction* multiplication/ division** exponentiationPor exemplo:

� � � � ��� ��� � � � ��� � � ��� � � �

Ordemde cálculo:

parenteses (o mais interno primeiro),

exponenciação,

multiplicação e divisão,

adição e subtração.

Por exemplo:

� � � � � �� � �� � � � ��

� � � � � � � � � � � ��� � � � � �

Tips Fortran 90 – p.33/87

Page 37: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Expression Type

IMPLICIT NONEREAL :: X,YINTEGER :: I,J

I + J resulta num tipo integerX/Y resulta num tipo realI + X resulta em um tipo real.

I=5J=3I/J = ?

(Isso é uma fonte potencial de erros lógicos!!!)

Tips Fortran 90 – p.34/87

Page 38: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Assignment Statement

variable = expressionPor exemplo:IMPLICIT NONEREAL :: A,B,C,DINTEGER :: I,J

A = 3.0B = 1.0C = -5.1D = A*B+CD=?

I = 4.8I=I+1I=?

Tips Fortran 90 – p.35/87

Page 39: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Strings

character string to acharacter variable, quando ostamanhos não são os mesmos as strings são preenchidaspor zeros ou cortadas à direita.

A única operação existente com caracteres é aconcatenação:char = "fred"//"die"substringschar(1:2) ! access first two characterschar(:10) ! access first ten characterschar(4:) ! access fourth till the last characters

Tips Fortran 90 – p.36/87

Page 40: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Overflow, Underflow and DivideCheck Error

overflow – qdo. a magnitude de um resultado é maiordo que a capacidade de armazenamento.

underflow – qdo. a magnitude de um número é menorque a do menor número permitido

qdo ocorre uma divisão por zero — divide check error.

Como esses erros são tratados depende doscompiladores

Tips Fortran 90 – p.37/87

Page 41: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Exercícios:

Identifiquem como constantes real, integer nem umanem outra:

���

� �� � � � � � � � � � �� � � � � � �� � � � � � � � ��

��

� � � ��

Quais os nomes a seguir são nomes válidos emFortran?QAZ, COMPUTER, TUFF., A+B, 3XY, AJKLMN, L9A45

Aonde estão os erros nos statements?

X = A + 3B3.14159 = PIX + Y = (A+B)/Z-2*PI*RJ = M-4.5*N**-2

Tips Fortran 90 – p.38/87

Page 42: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Exercícios:

Considere A,B,X,Z (real) e I,J,K,N (integer)

A = 6.0 X=-6.0 J=2B = 3.2 I=-3 N=5

Quais são os resultados obtidos:

Z = (A+B)/XZ = J + I + NZ = (J-I)/NZ = N/J+I+2K=BK = N/JK = B*3.0 + XK = (A+B-X)/3.0K=I*J/N ; K=I/N*J

Tips Fortran 90 – p.39/87

Page 43: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Input/Output – Free format

Tips Fortran 90 – p.40/87

Page 44: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

READ Statement

READ *,{input list}READ(5,*) {input list}READ(UNIT=5,FMT=*) {input list}

Por exemplo,READ(5,*) A,B,C

são esperados os valores de A,B, C separados por virgulas

ou espaços em branco.

Tips Fortran 90 – p.41/87

Page 45: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

WRITE Statement

PRINT *,{output list}WRITE(6,*) {output list}WRITE(UNIT=6,FMT=*) {output list}

Por exemplo,WRITE(6,*) ’ THE TOTAL IS:’, TOTAL

Tips Fortran 90 – p.42/87

Page 46: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Exemplo

PROGRAM Celscius_to_fahrenheit! Copyright 1994, Miles Ellis, Ivor Philips and Tom Lahey! A program to convert a Celsius temperature to Fahrenheit

! Variable declarationsIMPLICIT NONEREAL :: temp_c,temp_f

! Ask for Celsius temperaturePRINT *,"What is the Celsius temperature? "READ *,temp_c

! Convert it to Fahrenheittemp_f = 9.0*temp_c/5.0 + 32.0

Tips Fortran 90 – p.43/87

Page 47: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Exemplo

! Print both temperaturesPRINT *,temp_c,"C = ",temp_f,"F"

END PROGRAM Celsius_to_fahrenheit

Tips Fortran 90 – p.44/87

Page 48: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Exercícios

Escreva um programa que leia 4 números, sendo os 2primeiros do tipo real e os 2 últimos do tipo integer.

Escreva os números na ordem inversa.

Escreva a soma dos 2 primeiros números e as dos 2últimos números.

Tips Fortran 90 – p.45/87

Page 49: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Basic Building Blocks: Unidades doPrograma

Tips Fortran 90 – p.46/87

Page 50: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Main programs

Programas simples podem conter apenas um módulode programa, que são chamados programasprincipais.

Problemas mais complexos são subdivididos emsubprograms e procedures (functions e subroutines)

Isso deixa o problema modular e facilita o reutilizaçãodo código

COMMON blocks é uma forma de se acessar variáveisglobais, mas atualmente esse tipo de procedimentonão é recomendado.

Tips Fortran 90 – p.47/87

Page 51: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Layout das unidades deprogramação

main program unit

function subprogram

subroutine subprogram

modules and block data subprogram

Tips Fortran 90 – p.48/87

Page 52: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Estrutura de um programa

PROGRAM {name}specification statements........................executable statements.....................

END PROGRAM {name}

FUNCTION {name} ({argument list})specification statements........................executable statements.....................

END FUNCTION {name}

Tips Fortran 90 – p.49/87

Page 53: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Estrutura de um programa (cont.)

SUBROUTINE {name} ({argument list})specification statements........................executable statements.....................

END SUBROUTINE {name}

MODULE {name}specification statements........................executable statements.....................

END MODULE {name}

Tips Fortran 90 – p.50/87

Page 54: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Estrutura de um programa (cont.)

BLOCK DATA {name}specification statements........................

END BLOCK DATA {name}

Tips Fortran 90 – p.51/87

Page 55: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Relational and Logical Expressions

Tips Fortran 90 – p.52/87

Page 56: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Expressões relacionais

Uma expressão relacional compara duas expressões pormeio de um operador relacional e retorna o valor TRUE ouFALSE.< .LT. less than<= .LE. less than or equal to== .EQ. equal to/= .NE. not equal to>= .GE. greater than or equal to> .GT. greater than

Tips Fortran 90 – p.53/87

Page 57: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Exemplos de expressões relacionais

pay .LT. credit

half*2 .GE. min**3/denom

OBS: Computadores não representam bem númerosreais (e.g. 1.0/3.0) então é perigoso usar .EQ. . Porque?

Tips Fortran 90 – p.54/87

Page 58: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Expressões lógicas

Operadores lógicos

.OR. logical disjunction (inclusive or): true if either orboth of its operands are true

.AND. logical conjunction: true if both of its operandsare true

.EQV. true if its operands have the same logical value

.NEQV. true if its operands have the opposite logicalvalue

Tips Fortran 90 – p.55/87

Page 59: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

(cont.)

.AND. tem precedencia sobre .OR.

operadores aritimétricos tem preferência sobreoperadores relacionais

as duplas a seguir são equivalentes:jill .EQ. jack .OR. boulder .GT. pebble .AND. ant .LT.giraffe(jill .EQ. jack) .OR. ((boulder .GT. pebble) .AND.(ant .LT. giraffe))

.NOT. tem precedencia sobre .AND.

as duplas a seguir são equivalentes:.NOT. (a<b .AND. b<c)a>=b .OR. b>=c Tips Fortran 90 – p.56/87

Page 60: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Logical Variables

LOGICAL pos, neg,answer

pos = num .GE. 0neg = .NOT. pos

answer = .TRUE.answer = (good .GT. bad)

Tips Fortran 90 – p.57/87

Page 61: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

IF lógico statment

Tips Fortran 90 – p.58/87

Page 62: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

IF

IF(E) S

E é uma expressão lógica

S é qq comando executável, exceto DO, outro IF ouum block-IF

Exemplos,IF(pay .LT. starve) pay = pay + 250.0IF(number .GT. 10) WRITE(*,*) ’number > 10’

Tips Fortran 90 – p.59/87

Page 63: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Erros comuns

1)IF(pay .LT. starve) pay = pay +250.0pay=pay+100.02)

IF(pay .LT. starve) pay = pay +250.0IF(pay .GE. starve) pay=pay+100.0

3) Forma mais correta:IF(pay .GE. starve) pay=pay+100.0IF(pay .LT. starve) pay = pay +250.0

Tips Fortran 90 – p.60/87

Page 64: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Block IF Statements

Basic Block IF

IF (logical expression) THEN[Lines of Fortran]

ENDIF

Else-If Block:

IF (logical expression1) THEN[Lines of Fortran]

ELSEIF (logical expression2) THEN[Lines of Fortran]

ELSEIF (logical expression3) THEN[Lines of Fortran]

ENDIF

Tips Fortran 90 – p.61/87

Page 65: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Block IF Statements (cont.)

Else Block:

IF (logical expression1) THEN[Lines of Fortran]

ELSEIF (logical expression2) THEN[Lines of Fortran]

ELSEIF (logical expression3) THEN[Lines of Fortran]

ELSE[Lines of Fortran]

ENDIF

Tips Fortran 90 – p.62/87

Page 66: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

IF-THEN-ELSE-ENDIF

PROGRAM test! Copyright 1994, Miles Ellis, Ivor Philips and Tom Lahey

IMPLICIT NONEREAL, EXTERNAL :: cube_rootREAL :: x ; PRINT *,"x?" ; READ *,xPRINT *,"The cube root of ",x," is ",cube_root(x)

END PROGRAM test

Tips Fortran 90 – p.63/87

Page 67: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

IF-THEN-ELSE-ENDIF (cont.)

REAL FUNCTION cube_root(x)

! Copyright 1994, Miles Ellis, Ivor Philips and Tom Lahey

IMPLICIT NONE

! Function to calculate the cube root

! of a positive real number

! Dummy argument declaration

REAL, INTENT(IN) :: x

! Local constant

REAL, PARAMETER :: epsilon=1E-20

Tips Fortran 90 – p.64/87

Page 68: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

IF-THEN-ELSE-ENDIF (cont.)

! Eliminate (nearly) zero case

IF (ABS(x)<epsilon) THEN

cube_root = 0.0

! Calculate cube root by using logs

ELSE IF (x<0) THEN

! First deal with negative argument

cube_root = -EXP(LOG(-x)/3.0)

ELSE

! Positive argument

cube_root = EXP(LOG(x)/3.0)

END IF

END FUNCTION cube_rootTips Fortran 90 – p.65/87

Page 69: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

CASE

SELECT CASE (case_expression)CASE (case_selector)block of Fortran statements

CASE (case_selector)block of Fortran statements....

CASE (case_selector)block of Fortran statements

CASE DEFAULTblock of Fortran statements

END SELECT

Tips Fortran 90 – p.66/87

Page 70: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

case_ selector

case_ valuecase_ expression == case_ value.

low_ value:low_ value <= case_ expression.

high_ valuecase_ expression <= high_ value.

low_ value:high_ valuelow_ value <= case_ expression .AND. case_expression <= high_ value.

Tips Fortran 90 – p.67/87

Page 71: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Exemplo

PROGRAM seasons! Copyright 1994, Miles Ellis, Ivor Philips and Tom Lahey

IMPLICIT NONE! A program to calculate in which season! a specified date lies! Variable declarations

CHARACTER(LEN=10) :: dateCHARACTER(LEN=2) :: month

! Read datePRINT *,

& "Please type a date in the form yyyy-mm-dd"READ *,date

! Extract month numbermonth = date(6:7)

Tips Fortran 90 – p.68/87

Page 72: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Exemplo (cont.)

! Print seasonSELECT CASE (month)CASE ("08":"10")

PRINT *,date," is in the spring"CASE ("11","12","01":"03")

PRINT *,date," is in the summer"CASE ("04","05")

PRINT *,date," is in the autumn"CASE ("06","07")

PRINT *,date," is in the winter"CASE DEFAULT

PRINT *,date," is not a valid date"END SELECT

END PROGRAM seasons

Tips Fortran 90 – p.69/87

Page 73: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

DO looping

Tips Fortran 90 – p.70/87

Page 74: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

sintaxe DO

DO count=initial,final,inc[Lines of Fortran to be looped over]ENDDO

count é um integer – DO variable

Comandos internos ao DO

CYCLE

EXIT

Tips Fortran 90 – p.71/87

Page 75: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Exemplo DO

DO i=0,12,3A = A + S(i) + S(i+1) + S(i+2)

ENDDO

Tips Fortran 90 – p.72/87

Page 76: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

alinhamento DO

DO i=m1,m2,m3DO j=n1,n2,n3

[Lines of Fortran to be looped over]ENDDO

ENDDO

Tips Fortran 90 – p.73/87

Page 77: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Exemplo DO

PROGRAM multiplication_tables! Copyright 1994, Miles Ellis, Ivor Philips and Tom Lahey

IMPLICIT NONE! A program to print multiplication tables from 2 to 12 times! Variable declarationsINTEGER :: i,j! Outer loop defines which ’times table’DO i=2,12

PRINT *," "PRINT *,i," times table"DO j=1,12

PRINT *,i," times",j," is ",i*jEND DO

END DOEND PROGRAM multiplication_tables

Tips Fortran 90 – p.74/87

Page 78: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Array Declarations

Tips Fortran 90 – p.75/87

Page 79: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Exemplos

REAL :: grades(100),marks(100),topten(10)REAL, DIMENSION(100) :: grades, marks, topten(10)

INTEGER :: ages(50)LOGICAL :: answers(10)

INTEGER :: grid(50,50)REAL :: altitude(100,100), coordinate(50,50,10)

!REAL arrayname(lowerbound : upperbound)REAL A(0 : 10)

INTEGER I(-5:10,-20:100)REAL X(0:10,-5,5)

Tips Fortran 90 – p.76/87

Page 80: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Array constants e initial values

!array_name = (/ value_1, value_2, ... /)

arr = (/ 1,2,3,4,5,6,7,8,9,10 /)

!Para grandes arrays uma seq. de DO implicito:

! set arr = (/ 1,2,3,4,5,6,7,8,9,10 /)arr = (/ (i, i=1,10) /)

Tips Fortran 90 – p.77/87

Page 81: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Arrays as Subprogram Parameters

REAL :: HUGE(100),TINY(50)...CALL SIZE(HUGE,TINY,NUMBER)...STOPEND

SUBROUTINE SIZE(BIG,SMALL,N)REAL :: BIG(100),SMALL(50)...RETURNEND

Tips Fortran 90 – p.78/87

Page 82: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Arrays as Subprogram Parameters

PROGRAM ARRAY_EXAMPLE_2

REAL :: HUGE(100),TINY(50)...

NHUGE=100NTINY=50CALL SIZE(HUGE,TINY,NHUGE,NTINY)...

NHUGE=75NTINY=34CALL SIZE(HUGE,TINY,NHUGE,NTINY)

...END PROGRAM ARRAY_EXAMPLE_2

SUBROUTINE SIZE(BIG,SMALL,NBIG,NSMALL)REAL :: BIG(:),SMALL(:)...END SUBROUTINE SIZE

Tips Fortran 90 – p.79/87

Page 83: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Implied Do Loops

! (list of variables, control = start, finish, increment)

read(*,*) (A(I), I=1,10)

! 2D, array X(10,20) row by row

read(*,*) (( X(I,J), I=1,10), J=1,20)

do j=1,20read(*,*) ( X(I,J), I=1,10)

enddo

Tips Fortran 90 – p.80/87

Page 84: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Arrays em expressões

REAL, DIMENSION(20) :: a,b,c,d

a = c*d ! Fortran 90 array processing

DO i=1,20 ! Fortran 77 array processingb(i)=c(i)*d(i)

ENDDO

REAL:: a(1:20),b(0:19),c(10:29),d(-9:10)

a = c*d ! Fortran 90 array processing

DO i=1,20 ! Fortran 77 array processingb(i-1)=c(i+9)*d(i-10)

ENDDO Tips Fortran 90 – p.81/87

Page 85: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Arrays em intrinsic procedures.

Assume array1, array2, and a, b, c, d, e são conformablearraysarray1 = SIN(array2)arr_max = MAX(100,0,a,b,c,d,e)

Tips Fortran 90 – p.82/87

Page 86: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Exemplo

PROGRAM ArrayTest! Copyright 1994, Miles Ellis, Ivor Philips and Tom Lahey

IMPLICIT NONEINTERFACE

FUNCTION max_array(array_1,array_2)IMPLICIT NONEREAL, DIMENSION(:) :: array_1,array_2REAL, DIMENSION(SIZE(array_1)) :: max_array

END FUNCTION max_arrayEND INTERFACE

Tips Fortran 90 – p.83/87

Page 87: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Exemplo (cont.)

REAL, DIMENSION(10) :: a1,a2PRINT *,"array 1?"READ *,a1PRINT *,"array 2?"READ *,a2PRINT *,"Maximum array is ",max_array(a1,a2)

END PROGRAM test

Tips Fortran 90 – p.84/87

Page 88: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Exemplo (cont.)

FUNCTION max_array(array_1,array_2)! Copyright 1994, Miles Ellis, Ivor Philips and Tom Lahey

IMPLICIT NONE! This function returns the maximum of two arrays on an! element by element basis! Dummy argumentsREAL, DIMENSION(:) :: array_1,array_2! Result variableREAL, DIMENSION(SIZE(array_1)) :: max_array! Use the elemental intrinsic MAX to compare elementsmax_array = MAX(array_1,array_2)

END FUNCTION max_array

Tips Fortran 90 – p.85/87

Page 89: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Referências

http://rsc.anu.edu.au/ harry/COURSES/MATHMETH/node1.html

Tips Fortran 90 – p.86/87

Page 90: Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

[email protected]

Tips Fortran 90 – p.87/87