curso de fortran - anp

231
Prof.: José Renato M. de Sousa Fevereiro / 2006 Curso Básico de Fortran 90/95 Universidade Federal do Rio de Janeiro ANP / PRH35

Upload: fabio-andrade

Post on 25-Jun-2015

1.821 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Curso de Fortran - ANP

Prof.: José Renato M. de Sousa

Fevereiro / 2006

Curso Básico de Fortran 90/95

Universidade Federal do Rio de Janeiro

ANP / PRH35

Page 2: Curso de Fortran - ANP

2

Agenda

Introdução. Bases para programação em Fortran. Declarações condicionais. Declarações recursivas. Lendo e escrevendo dados. Operações com arquivos. Vetores e matrizes. Subrotinas e funções. Dupla precisão, complexos e tipos derivados. Propostas para programas.

Page 3: Curso de Fortran - ANP

3

Agenda

Introdução. Introdução. Bases para programação em Fortran. Declarações condicionais. Declarações recursivas. Lendo e escrevendo dados. Operações com arquivos. Vetores e matrizes. Subrotinas e funções. Dupla precisão, complexos e tipos derivados. Propostas para programas.

Page 4: Curso de Fortran - ANP

4

IntroduçãoO que é Fortran?

O que é Fortran?

– Fortran é uma linguagem de programação genérica, mas com ênfase em processamento matemático. Por essa razão, é amplamente utilizada em engenharia.

– Fortran significa “Formula Translation” e foi a primeira linguagem de alto nível criada. O início de seu desenvolvimento vem da década de 1950 a partir dos laboratórios da IBM e desde então muitas versões foram lançadas.

– Por convenção, uma versão da linguagem é batizada com os dois últimos dígitos do ano de lançamento: Fortran 66, Fortran 77 e Fortran 90 / 95.

Page 5: Curso de Fortran - ANP

5

IntroduçãoO que é Fortran?

O que é Fortran?

– A versão mais popular, até bem pouco tempo, era o Fortran 77. Atualmente, essa versão vem perdendo espaço para o Fortran 90/95.

– Há algumas diferenças entre o Fortran 77 e o Fortran 90/95:

Fortran 77: Sem recursos visuais. Pobre interface com o usuário.

Fortran 90/95: Muitos recursos gráficos. Criação de softwares com interface amigável. Compilação de programas desenvolvidos em Fortran com

subprogramas desenvolvidos em C, gerando um único executável.

Paralelização de cálculos.

Page 6: Curso de Fortran - ANP

6

IntroduçãoPor que aprender Fortran?

Por que aprender Fortran?

– Apesar de frequentemente a “morte” da linguagem ser anunciada mundo afora (substituição por outras linguagens de alto nível), a linguagem permanece viva há mais de 50 anos!

– Existem diversas rotinas já elaboradas, o que facilita o trabalho do programador (lembrem-se que, em geral, engenheiros têm pouco tempo para apresentar soluções!)

– É uma linguagem que, atualmente, interage com outros programas (Visual Basic, Mathcad etc.).

Page 7: Curso de Fortran - ANP

7

IntroduçãoBibliografia

Bibliografia:

– FORTRAN 90/95 for Scientists and EngineersStephen J. Chapman

WCB McGraw-Hill, 1998.

– Fortran Numerical RecipesWilliam H. Press, Saul A. Teukolsky, William T. Vetterling, Brian P. Flannering

Vols. 1 e 2, University of Cambridge.

– Manual do programa.

– Material disponível na Internet.

Page 8: Curso de Fortran - ANP

8

Agenda

Introdução. Bases para programação em Fortran.Bases para programação em Fortran. Declarações condicionais. Declarações recursivas. Lendo e escrevendo dados. Operações com arquivos. Vetores e matrizes. Subrotinas e funções. Dupla precisão, complexos e tipos derivados. Propostas para programas.

Page 9: Curso de Fortran - ANP

9

Existem vários compiladores Fortran disponíveis:– Lahey;– Compaq;– Intel;– Absoft.

Neste curso, vamos utilizar o Compaq Visual Studio, versão 6.5. Os comandos que serão apresentados, no entanto, são válidos para qualquer outro compilador.

Bases para programação em FortranCompiladores

Page 10: Curso de Fortran - ANP

10

Após a instalação do Compaq Visual Fortran (CVF), a inicialização é feita através do menu:

– Iniciar > Programas > Compaq Visual Fortran 6 > Developer Studio

Bases para programação em FortranVisual Fortran

Page 11: Curso de Fortran - ANP

11

O CVF abrirá com o seguinte aspecto:

Bases para programação em FortranVisual Fortran

Page 12: Curso de Fortran - ANP

12

O estúdio de desenvolvimento do CVF tem o seguinte aspecto geral (projeto Teste foi carregado):

Bases para programação em FortranVisual Fortran

Componentes de projeto

Janela de edição

Compilação e link

Menu principalBarra de

ferramentas

Page 13: Curso de Fortran - ANP

13

A janela de componentes de projeto (lado esquerdo):

Bases para programação em FortranVisual Fortran

Janela onde se visualizam os arquivos utilizados pelo projeto:

Programa principal.

Subrotinas.

Funções.

Informações sobre o editor de recursos.

Pasta com informações sobre dependências.Componentes

de projeto

Page 14: Curso de Fortran - ANP

14

A janela de edição (lado direito): Programas. Funções, subrotinas etc.

Bases para programação em FortranVisual Fortran

Janela de edição

Page 15: Curso de Fortran - ANP

15

A janela de informações sobre compilação e link:Tem as seguintes funções:

Dá informações sobre a compilação do programa principal, subrotinas e funções e o link entre elas (na situação abaixo, o programa foi compilado e gerado (link) com sucesso.

Gera erros (impedem a geração do programa (.exe)) e warnings (advertências que não impedem a criação do .exe).

Bases para programação em FortranVisual Fortran

Compilação e link

Page 16: Curso de Fortran - ANP

16

Os arquivos com instruções Fortran podem ter dois tipos de formato:

– Fixo (arquivo .FOR, Fortran 77, imita os antigos cartões):

O código é escrito da coluna 7 à coluna 72. Para continuar um comando em outra linha, a linha de continuação deve ter um caractere na coluna 6.

Comentários são feitos colocando um C ou * na primeira coluna.

Variáveis com até 6 caracteres maiúsculos (em alguns compiladores). O primeiro não pode ser numérico.

As colunas de zero a cinco são reservadas para os endereços numéricos (rótulos) dos comandos.

Bases para programação em FortranVisual Fortran

Page 17: Curso de Fortran - ANP

17

Bases para programação em FortranVisual Fortran

1 a 5

6

7 a 72

Page 18: Curso de Fortran - ANP

18

Os arquivos com instruções Fortran podem ter dois tipos de formato:

– Livre (arquivo .F90, Fortran 90):

O código é escrito da coluna 1 à coluna 132. Para continuação de linha, utiliza-se o símbolo & (e comercial), que deve ser colocado no fim da linha a ser continuada.

Comentários são feitos posicionando um ! em qualquer ponto da linha de comando. A partir do !, o compilador entende que seguirá um texto de comentário.

Variáveis com até 31 caracteres (incluindo o símbolo _ ). O primeiro não pode ser numérico.

Bases para programação em FortranVisual Fortran

Page 19: Curso de Fortran - ANP

19

Bases para programação em FortranVisual Fortran

Page 20: Curso de Fortran - ANP

20

Bases para programação em FortranCaracteres válidos

Caracteres válidos em Fortran:

– Letras maiúsculas: A – Z (26)– Letras minúsculas: a – z (26)– Dígitos: 0 – 9 (10)– Underscore: _ (1)– Símbolos aritméticos: + - / * ** (5)– Símbolos gerais: ( ) . = , ‘

$ : ! “ % &

; < > ? Vazio (17)

– TOTAL: (86)

– O Fortran não diferencia letras maiúsculas e minúsculas!

Page 21: Curso de Fortran - ANP

21

Bases para programação em FortranEstrutura de um programa Fortran

Um programa Fortran pode ser dividido em três seções:

– Declaração: Grupo de instruções não executáveis, localizadas no início do

programa, que definem o nome do programa e, também, a quantidade, tipos e nomes de todas as variáveis do programa.

– Execução: Grupo de uma ou mais instruções que descrevem as ações

que serão realizadas pelo programa.

– Término: Consiste de uma ou duas instruções que encerram a

execução de um programa.

Page 22: Curso de Fortran - ANP

22

Bases para programação em FortranEstrutura de um programa Fortran

Declarações

Execução

Término

Page 23: Curso de Fortran - ANP

23

Bases para programação em FortranEstrutura de um programa Fortran

Seção de declarações:

– PROGRAM nome do programa (OBRIGATÓRIO).

– Comentários (objetivo do programa, dados sobre revisões etc) (OPCIONAL, mas fortemente RECOMENDADO).

– Tipo e nomes das variáveis e constantes (até 31 caracteres alfanuméricos). Recomenda-se descrever cada variável utilizada.

Page 24: Curso de Fortran - ANP

24

Bases para programação em FortranEstrutura de um programa Fortran

Nome do programa

Comentários iniciais

Elimina tipos default

Declara variáveis

Page 25: Curso de Fortran - ANP

25

Bases para programação em FortranEstrutura de um programa Fortran

Seção de execução:

– Seção na qual se posicionam as instruções que formam o código.

– Comentar as instruções, descrevendo o que fazem (importante para futura compreensão do programa).

– Letras MAIÚSCULAS para palavras do Fortran (READ, WRITE, REAL, PROGRAM etc.) e minúsculas para variáveis, operações etc (Sugestão de estilo).

Page 26: Curso de Fortran - ANP

26

Bases para programação em FortranEstrutura de um programa Fortran

Comentário

Comentário

Comentário

Comentário

Instruções para leitura de dados

Operação

Operação

Exporta resultado

final

Page 27: Curso de Fortran - ANP

27

Bases para programação em FortranEstrutura de um programa Fortran

Seção de término:

– Contém OBRIGATORIAMENTE o comando END PROGRAM nome do programa (opcional):

Page 28: Curso de Fortran - ANP

28

Bases para programação em FortranConstantes e variáveis: nomes

As constantes e variáveis em Fortran possuem até 31 caracteres alfanuméricos não podendo ser iniciadas com dígitos:

– Nomes válidos: Tempo (Lembre-se que não há distinção entre

maiúsculas e minúsculas!) distancia jk123_45 Meu_time_eh_bom

– Nomes inválidos: 3_dias (inicia com dígito) JK$ ($ é um caractere ilegal para

variáveis) O_nome_dessa_variavel_eh_muito_grande

Page 29: Curso de Fortran - ANP

29

Bases para programação em FortranConstantes e variáveis: tipos

Podem ser dos seguintes tipos:

– Tipos intrínsecos (built-in): Inteiras (INTEGER) Reais (REAL) Complexas (COMPLEX) Lógicas (LOGICAL) Caracteres (CHARACTER)

– Tipos derivados: Definidos pelo usuário para resolver problemas específicos.

Numéricos

Page 30: Curso de Fortran - ANP

30

Bases para programação em FortranConstantes e variáveis: tipos

Tipo inteiro:

– Válidos: 0 1 -999 123456789 17

– Inválidos: 1,000,000 (vírgulas não são permitidas) -100. (se tem um ponto decimal, trata-se

de um real)

Page 31: Curso de Fortran - ANP

31

Bases para programação em FortranConstantes e variáveis: tipos

Tipo real:– Precisão simples, 4 bytes, 32 bits: números com até 7

algarismos significativos e variando entre 10-38 e 10+38 (positivo ou negativo).

– Válidos: 10. -999.99 +1.0E-3 123.45E20 0.12E+1

– Inválidos: 1,000,000. (vírgulas não são permitidas) 111E3 (é necessário um ponto decimal na

mantissa) 111E2.5 (não é permitido pontos decimais no expoente)

Page 32: Curso de Fortran - ANP

32

Bases para programação em FortranConstantes e variáveis: tipos

Tipo caractere:– Sequências alfanuméricas delimitadas por ‘ ou “. Na região

delimitada por ‘ “ podem ser utilizados quaisquer símbolos, não só os 86 listados anteriormente.

– Válidos: ‘Isto eh um teste’ ‘ ‘ (espaço em branco) ‘ (^) ‘ (apesar de não constar na

lista, ^ é possível dentro dos ‘ ‘)

“123.45E20” (tipo caractere, não é número!)

– Inválidos: Isto eh um teste (não está limitado por ‘ ‘ ou “ “) ‘Isto eh um teste” (limites misturados) ‘ ‘ Isto eh um teste’ (não há balanço entre os ‘)

Page 33: Curso de Fortran - ANP

33

Bases para programação em FortranConstantes e variáveis: tipos

Tipo lógico:

– Válidos: .TRUE. .FALSE.

– Inválidos: TRUE (faltam os pontos) .FALSE (falta o ponto à direita)

Page 34: Curso de Fortran - ANP

34

Bases para programação em FortranConstantes e variáveis: declaração

Declaração:

– O Fortran assume, por default, que variáveis iniciadas por I, J, K, L, M ou N são inteiras. Variáveis iniciadas por qualquer outra letra é assumida como real.

– Não é recomendável que se utilize diretamente a convenção estabelecida pelo Fortran. Pode causar erros!

– Assim, sugere-se FORTEMENTE que se declarem todas as variáveis a serem utilizadas no programa.

Page 35: Curso de Fortran - ANP

35

Bases para programação em FortranConstantes e variáveis: declaração

Declaração:

– Como declarar variáveis (modificam-se ao longo do programa)?

PROGRAM nome do programa ...

INTEGER :: var1, var2, var3, ...

REAL :: var1, var2, var3, ...

LOGICAL :: var1, var2, var3, ...

CHARACTER(len=tamanho) :: var1, var2, var3, ...

Número de caracteres na

variável

Page 36: Curso de Fortran - ANP

36

Bases para programação em FortranConstantes e variáveis: declaração

Declaração:

– Como declarar constantes (não se modificam ao longo do programa)?

PROGRAM nome do programa ...

INTEGER, PARAMETER :: var1 = valor1, var2 = valor2, ...

REAL , PARAMETER :: var1 = valor1, var2 = valor2, ...

LOGICAL, PARAMETER :: var1 = valor1, var2 = valor2, ...

CHARACTER(len=tamanho), PARAMETER :: var1 = texto1, ...

Page 37: Curso de Fortran - ANP

37

Bases para programação em FortranConstantes e variáveis: declaração

Declaração:

Desabilita os tipos default do Fortran e obriga o compilador a verificar se todas as variáveis utilizadas foram declaradas.

Page 38: Curso de Fortran - ANP

38

Bases para programação em FortranAtribuindo valores e operações aritméticas

Atribuição de valores:

nome_da_variavel = expressao

Ex.:a = b + cc = (b ** c + (2.404 * d + 3.5))c = c +1

– expressao é uma combinação de

Variáveis.

Operadores aritméticos: + , - , * (multiplicação), / , ** (exponenciação).

Funções intrínsecas: SIN(var), COS(var) etc. (mais a frente será visto com mais detalhes).

Page 39: Curso de Fortran - ANP

39

Bases para programação em FortranAtribuindo valores e operações aritméticas

Operações aritméticas:

– Operações com números inteiros levam a números inteiros: 3 / 4 = 0 7 / 4 = 1 8 / 4 = 2

– Operações com números reais levam a números reais: 3. / 4. = 0.75 1. / 3. = 0.3333333 Repare que, devido a aproximações e dependendo do

compilador:– 3. * (1. / 3.) ≠ 1.– 2. * (1. / 2.) = 1.

Page 40: Curso de Fortran - ANP

40

Bases para programação em FortranAtribuindo valores e operações aritméticas

Operações aritméticas:

– Hierarquia de operações:

1. Tudo que estiver entre parênteses é avaliado primeiro, começando dos parênteses mais internos para os mais externos.

2. Todas as exponenciações são avaliadas da direita para a esquerda.

3. Todas as multiplicações e divisões são efetuadas da esquerda para direita.

4. Todas as adições e subtrações são efetuadas da esquerda para a direita.

Page 41: Curso de Fortran - ANP

41

Bases para programação em FortranAtribuindo valores e operações aritméticas

Operações aritméticas:

– Aritmética mista:

Operação entre um número inteiro e um número real é chamada de operação de aritmética mista.

Quando uma operação com aritmética mista é encontrada, o Fortran converte o inteiro em real e realiza a operação.

A conversão automática não ocorre até que um número inteiro encontre-se com um número real em uma mesma operação. Até lá, é possível que operações com aritmética inteira e/ou real ocorram dentro da expressão.

Aritmética mista deve ser EVITADA, salvo em uma exceção que será apresentada mais adiante.

Page 42: Curso de Fortran - ANP

42

Bases para programação em FortranAtribuindo valores e operações aritméticas

Operações aritméticas:

– Aritmética mista (exemplos): 1 + 1 / 4 = 1 1. + 1 / 4 = 1. 1 + 1. / 4 = 1.25

– Qual seria o resultado armazenado na variável nres?

INTEGER :: nres

nres = 1.25 + 9 / 4

Page 43: Curso de Fortran - ANP

43

Bases para programação em FortranAtribuindo valores e operações lógicas

Atribuição de valores:

variavel_logica = expressao_logica

expressao_logica pode ser definida como uma comparação entre duas operações aritméticas, sendo da forma:

a1 op a2

onde op é um operador relacional ou lógico.

O resultado dessa operação será .TRUE. ou .FALSE.

Page 44: Curso de Fortran - ANP

44

Bases para programação em FortranAtribuindo valores e operações lógicas

Operações lógicas– Operadores relacionais:

Estilo novo

(Fortran 90)

Estilo antigo

(Fortran 77)

Definição

== .EQ. Igual a

/= .NE. Diferente

> .GT. Maior que

< .LT. Menor que

>= .GE. Maior ou igual

<= .LE. Menor ou igual

Page 45: Curso de Fortran - ANP

45

Bases para programação em FortranAtribuindo valores e operações lógicas

Operações lógicas– Operadores relacionais:

3 < 4 .TRUE. 3 <= 4 .TRUE. 3 == 4 .FALSE. 4 <= 4 .TRUE. ‘A’ < ‘B’ .TRUE. (ordem alfabética)

4 == 4. .TRUE. (inteiro é transformado em real). 4 <= ‘A’ Ilegal, comparação entre inteiro e caractere.

Page 46: Curso de Fortran - ANP

46

Bases para programação em FortranAtribuindo valores e operações lógicas

Operações lógicas– Operadores lógicos:

Operador Função

.AND. E lógico

.OR. Ou lógico

.EQV. Equivalência lógica

.NEQV. Inequivalência lógica

.NOT. Não lógico

Page 47: Curso de Fortran - ANP

47

Bases para programação em FortranAtribuindo valores e operações lógicas

a1 a2 a1. AND. a2 a1. OR. a2 a1. EQV. a2 a1. NEQV. a2

.FALSE. .FALSE. .FALSE .FALSE. .TRUE. .FALSE.

.FALSE. .TRUE. .FALSE. .TRUE. .FALSE. .TRUE.

.TRUE. .FALSE. .FALSE. .TRUE. .FALSE. .TRUE.

.TRUE. .TRUE. .TRUE. .TRUE. .TRUE. .FALSE.

Operações lógicas– Operadores lógicos:

Page 48: Curso de Fortran - ANP

48

Bases para programação em FortranAtribuindo valores e operações com caracteres

Atribuição de valores:

variavel_caractere = expressao_caractere

expressao_caractere pode ser definida como uma operação entre caracteres. Há dois operadores de caracteres:

Substring Concatenação (//)

O resultado dessa operação será outro caractere.

Page 49: Curso de Fortran - ANP

49

Bases para programação em FortranAtribuindo valores e operações com caracteres

Operações com caracteres:

1. CHARACTER(len=3) :: file_ext

file_ext = ‘f’

Resultado: file_ext = ‘f¢¢’ , ¢ representa um espaço vazio.

2. CHARACTER(len=3) :: file_ext_2

file_ext_2 = ‘FILE01’

Resultado: file_ext_2 = ‘FIL’

Page 50: Curso de Fortran - ANP

50

Bases para programação em FortranAtribuindo valores e operações com caracteres

Operações com caracteres:

3. Substring:

CHARACTER(len=6), PARAMETER :: file_ext = ‘123456’CHARACTER(len=6), PARAMETER :: file_ext_3 = ‘456’CHARACTER(len=3) :: file_ext_2, file_ext_4

file_ext_2 = file_ext(1:3) ! Identifica os caracteres ! nas posições de

1 a 3 ! da variável file_ext.file_ext(1:3) = file_ext_3 ! Reescreve posições de 1

! a 3.

Resultados: file_ext_2 = ‘123’ , file_ext = ‘456456’

Page 51: Curso de Fortran - ANP

51

Bases para programação em FortranAtribuindo valores e operações com caracteres

Operações com caracteres:

4. Concatenação (//):

PROGRAM test

CHARACTER(len=10) :: aCHARACTER(len=8) :: b, ca = ‘ABCDEFGHIJ’b = ‘12345678’c = a(1:3) // b(4.5) // a(6:8)

END PROGRAM test

Resultado: c = ‘ABC45FGH’

Page 52: Curso de Fortran - ANP

52

Bases para programação em FortranFunções intrínsecas

Algumas funções intrínsecas do Fortran:

Função Tipo de argumento

Tipo de resultado

Descrição

SIN (X) Real Real Seno de X (X em radianos)

COS(X) Real Real Cosseno de X (X em radianos)

TAN(X) Real Real Tangente de X (X em radianos)

ASIN(X) Real Real Arco cujo seno é X (X em radianos)

ACOS(X) Real Real Arco cujo cosseno é X (X em radianos)

ATAN(X) Real Real Arco cuja tangente é X (X em radianos)

EXP(X) Real Real e elevado a X

SQRT(X) Real Real Raiz quadrada de X (X≥0)

Page 53: Curso de Fortran - ANP

53

Bases para programação em FortranFunções intrínsecas

Algumas funções intrínsecas do Fortran:

Função Tipo de argumento

Tipo de resultado

Descrição

LOG(X) Real Real Logaritmo natural de X (X≥0)

LOG10(X) Real Real Logaritmo na base 10 de X (X≥0)

IACHAR(C) CHAR(1) Inteiro Retorna a posição do caractere C na sequência ASCII.

ACHAR(I) Inteiro CHAR(1) Retorna o caractere na posição I da sequência ASCII.

INT(X) Real Inteiro Retorna a parte inteiro do real X

NINT(X) Real Inteiro Retorna o inteiro mais próximo de X

Page 54: Curso de Fortran - ANP

54

Bases para programação em FortranFunções intrínsecas

Algumas funções intrínsecas do Fortran:

Função Tipo de argumento

Tipo de resultado

Descrição

REAL(I) Inteiro Real Transforma o inteiro I em número real

MOD(A,B) Real / Inteiro Real / Inteiro Retorna o resto da divisão de A por B

MAX(A,B) Real / Inteiro Real / Inteiro Retorna o máximo entre A e B.

MIN(A,B) Real / Inteiro Real / Inteiro Retorna o mínimo entre A e B.

Page 55: Curso de Fortran - ANP

55

Bases para programação em FortranLendo e escrevendo dados

No Fortran, a leitura de dados é feita através do comando READ:

READ (*,*) var1, var2, var3, ...

Exportam-se dados através do comando WRITE:

WRITE (*,*) var1, var2, var3, ...

Mais adiante, novas opções serão dadas para a leitura e escrita de dados em programas Fortran.

Page 56: Curso de Fortran - ANP

57

Bases para programação em FortranAplicação

Programa para converter uma dada temperatura em Fahrenheit para Kelvin e Celsius:

– Definição do problema: dada uma temperatura em Fahrenheit, convertê-la para Kelvin e Celsius.

– Entrada e saída de dados: ler a temperatura temp_f e escrever os valores convertidos em Kelvin e Celsius.

– Elaboração do algoritmo:

Ler a temperatura temp_f. Converter para Kelvin (temp_k) e Celsius (temp_c). Escrever a temperatura convertida.

– Transformar o algoritmo em um código FORTRAN utilizando declarações condicionais: vide projeto Equation.

Page 57: Curso de Fortran - ANP

58

Bases para programação em FortranAplicação

Passo 1: criar um projeto dentro do CVF:

No menu de tarefas, clicar em File > New.

Page 58: Curso de Fortran - ANP

59

Bases para programação em FortranAplicação

Passo 2: Na caixa de diálogo chamada New, com a aba em Projects, selecione 'Fortran Standard Graphics or QuickWin Application‘ (Windows) ou ‘Fortran Console Aplication’ (Texto) e, na caixa de edição chamada project name dê o nome (nesse caso) 'Equation' ao projeto. Clique em 'OK'.

Nome do projeto

Diretório de trabalho

O subdiretório (default) foi aberto em:

C:\Program Files\Microsoft Visual Studio\MyProjects\Equation

Page 59: Curso de Fortran - ANP

60

Bases para programação em FortranAplicação

Passo 3: seleciona-se e define-se o tipo de arquivo que será empregado:

o Clique, novamente, no menu de tarefas > File > New

o Selecionar Fortran Free Format Source File para editar o programa (Fortran 90).

o Entrar com o nome do programa (deixar selecionado a adição ao projeto).

o Será criado o arquivo Teste1.f90.

Page 60: Curso de Fortran - ANP

61

Bases para programação em FortranAplicação

Passo 4: Codifica-se o programa Fortran:

Page 61: Curso de Fortran - ANP

62

o Para observar que o seu programa realmente já faz parte do projeto, clique na caixinha Equation files na janela esquerda, que contém os elementos do projeto. Clicando, depois, em Source Files (a primeira dentre as três caixinhas amarelas) deverá aparecer o arquivo teste1.f90, que já pode ser compilado.

Bases para programação em FortranAplicação

Page 62: Curso de Fortran - ANP

63

Passo 5: A compilação é uma operação que visa detectar erros de programação (de sintaxe e de estrutura dos comandos) e, na ausência de erros, há a criação do programa objeto correspondente ao programa fonte.

o Dirija-se a Build > Compile Teste1.f90.

Bases para programação em FortranAplicação

Page 63: Curso de Fortran - ANP

64

Bases para programação em FortranAplicação

o Com a compilação, foi gerado um programa objeto chamado teste1.obj.

Diretório onde foi criado o projeto

Diretório Debug

Page 64: Curso de Fortran - ANP

65

Bases para programação em FortranAplicação

Passo 6: Para criar um programa executável (se não houver erros de compilação), clique em Build > Build Equation.exe.

Page 65: Curso de Fortran - ANP

66

Bases para programação em FortranAplicação

o Ao clicar no item Build Equation.exe, você ligará todas as peças (programa principal, funções e subrotinas) de seu programa, gerando um único programa executável (que terá o nome do projeto + .exe). A ligação dessas unidades de programa já compiladas (programas objeto) em um único executável é conhecida como operação de “linking” (link).

o Observação: Etapas (válidas para todo tipo de programa):

Page 66: Curso de Fortran - ANP

67

Bases para programação em FortranAplicação

o Se a ligação for feita com sucesso, o CVF gerará o arquivo Equation.exe (diretório debug).

o Pode-se executar o programa através de um duplo clique sobre Equation.exe ou dentro do próprio CVF.

Diretório Debug

Page 67: Curso de Fortran - ANP

68

Bases para programação em FortranAplicação

Passo 7: Build > Execute Equation.exe.

Page 68: Curso de Fortran - ANP

69

Bases para programação em FortranAplicação

Page 69: Curso de Fortran - ANP

70

Bases para programação em FortranAplicação

Gere novamente o projeto Equation, porém utilizando a opção Fortran Console Application.

Dê a temperatura em Celsius e converta para Fahrenheit e Kelvin.

Page 70: Curso de Fortran - ANP

71

Agenda

Introdução. Bases para programação em Fortran. Declarações condicionais.Declarações condicionais. Declarações recursivas. Lendo e escrevendo dados. Operações com arquivos. Vetores e matrizes. Subrotinas e funções. Dupla precisão, complexos e tipos derivados. Propostas para programas.

Page 71: Curso de Fortran - ANP

72

Declarações condicionais Apresentação

Declarações condicionais são aquelas que, através de instruções lógicas, nos permitem selecionar e executar partes específicas de um código (blocos) sem passar por outras.

Em FORTRAN, constroem-se declarações condicionais através de dois comandos:

– IF (mais utilizado);

– SELECT CASE.

Page 72: Curso de Fortran - ANP

73

Declarações condicionais O comando IF

O comando IF especifica que um determinado bloco do código será executado SE E SOMENTE SE uma dada expressão lógica for verdadeira:

IF (expressão lógica) THENInstrução 1Instrução 2...Instrução N

END IFInstrução A

– Se expressão lógica for VERDADEIRA, executam-se as instruções 1 a N.

– Se expressão lógica for FALSA, o programa segue para a próxima instrução após END IF (Instrução A).

Bloco

Page 73: Curso de Fortran - ANP

74

Declarações condicionais O comando IF

Outra possibilidade (apenas uma instrução):

IF (expressão lógica) Instrução 1

Observações importantes:

1. O comando IF (...) THEN deve estar sempre na mesma linha. Caso o número de colunas ultrapasse o limite estabelecido pelo compilador FORTRAN, continuar na linha seguinte:

IF (................................................ &

....................................................) THEN

Page 74: Curso de Fortran - ANP

75

Declarações condicionais O comando IF

2. Cada instrução deve ocupar linhas exclusivas após o comando IF (...) THEN.

3. O comando END IF também deve ser posicionado em uma linha exclusiva.

4. Para melhor visualização do programa, as instruções devem ser “indentadas” (2 ou mais espaços em relação a IF).

Page 75: Curso de Fortran - ANP

76

Declarações condicionais O comando IF

Dentro do comando IF, caso se deseje executar um ou mais blocos de código quando a instrução lógica for falsa, utilizam-se os comandos:

– ELSE

– ELSE IF

Page 76: Curso de Fortran - ANP

77

Declarações condicionais O comando IF

Forma dos comandos:

IF (expressão lógica 1) THENInstrução 1Instrução 2...

ELSE IF (expressão lógica 2) THENInstrução 1Instrução 2...

ELSEInstrução 1Instrução 2...

END IF

Bloco 1

Bloco 2

Bloco 3

Page 77: Curso de Fortran - ANP

78

Declarações condicionais O comando IF

Observações importantes:

1. Os comandos ELSE e ELSE IF devem ocupar linhas exclusivas. Caso a linha seja excedida, estender a linha através de &.

2. O número de ELSE IF em uma declaração condicional é indeterminado (quantos forem desejados!)

Page 78: Curso de Fortran - ANP

79

Declarações condicionais Aplicação 1

Avaliar o valor de uma função de duas variáveis em um dado ponto (x,y):

00,

00,

00,

00,

),(

22

2

2

yexyx

yexyx

yexyx

yexyx

yxf

Page 79: Curso de Fortran - ANP

80

Declarações condicionais Aplicação 1

Etapas do programa:– Definição do problema: calcular o valor da função f em um

ponto (x,y).

– Entrada e saída de dados: ler o ponto (x,y), exportar o valor da função f.

– Elaboração do algoritmo:

Leitura dos valores x e y. Cálculo da função f(x,y). Escrever o valor da função.

– Transformar o algoritmo em um código FORTRAN utilizando declarações condicionais.

Page 80: Curso de Fortran - ANP

81

Declarações condicionais Rotulando o comando IF

É possível rotular (nomear) o comando IF associando aos respectivos ELSE, ELSE IF e END IF:

nome: IF (expressão lógica 1) THENInstrução 1Instrução 2...

ELSE IF (expressão lógica 2) THEN nomeInstrução 1Instrução 2...

ELSE nomeInstrução 1Instrução 2...

END IF nome

Observações sobre nome:

Qualquer expressão alfanumérica com até 31 caracteres começando com uma letra.

Deve ser diferente em cada um dos IF ao longo do programa e também deve ser diferente de qualquer nome de variável ou constante declarada.

Page 81: Curso de Fortran - ANP

82

Declarações condicionais Rotulando o comando IF

Por que nomear o comando IF? Só para dar mais trabalho?!

– Nos ajuda e, também o compilador, na associação dos blocos de código a declarações condicionais complexas. Nomeando a declaração em um programa complexo (que se estende por páginas e páginas) se torna extremamente fácil identificar a quem pertence um determinado bloco de código.

– Sempre que possível, nomeie o comando IF!

Page 82: Curso de Fortran - ANP

83

Declarações condicionais Mais opções do comando IF

Comandos IF agrupados:

nome1: IF (expressão lógica 1) THENInstrução 1

Instrução 2...

nome2: IF (expressão lógica 2) THEN Instrução 1 Instrução 2 ...

END IF nome2Instrução 1Instrução 2...

END IF nome1

Observações importantes:

Poderia haver um número indeterminado de ELSE e ELSE IF (cada um com o nome associado ao seu respectivo IF), além dos próprios IF.

Os IF são fechados (END IF), por definição, do mais interno para o mais externo.

Page 83: Curso de Fortran - ANP

84

Declarações condicionais Aplicação 2

Construir uma declaração condicional na qual, dada uma nota, associe-se um conceito:

– Conceito A: Nota > 95

– Conceito B: Nota > 86 e Nota <= 95

– Conceito C: Nota > 76 e Nota <= 86

– Conceito D: Nota > 66 e Nota <= 76

– Conceito E: Nota > 0 e Nota <=66

Page 84: Curso de Fortran - ANP

85

Declarações condicionais Aplicação 2

Opção 1 (IF, ELSE IF e ELSE)

if1: IF (nota > 95.0) THENWRITE(*,*) ‘O conceito eh A.’

ELSE IF (nota > 86.0) THEN if1WRITE(*,*) ‘O conceito eh B.’

ELSE IF (nota > 76.0) THEN if1WRITE(*,*) ‘O conceito eh C.’

ELSE IF (nota > 66.0) THEN if1WRITE(*,*) ‘O conceito eh D.’

ELSE if1WRITE(*,*) ‘O conceito eh E.’

END IF if1

Page 85: Curso de Fortran - ANP

86

Declarações condicionais Aplicação 2

Opção 2 (Comandos IF agrupados)if1: IF (nota > 95.0) THEN

WRITE(*,*) ‘O conceito eh A.’ELSE if1

if2: IF (nota > 86.0) THEN WRITE(*,*) ‘O conceito eh B.’ELSE if2 if3: IF (nota > 76.0) THEN WRITE(*,*) ‘O conceito eh C.’ ELSE if3

if4: IF (nota > 66.0) THEN if1 WRITE(*,*) ‘O conceito eh D.’

ELSE if4 WRITE(*,*) ‘O conceito eh E.’

END IF if4 END IF if3END IF if2

END IF if1

Conclusão:

Quando as opções são mutuamente exclusivas é preferível utilizar ELSE IF a comandos IF agrupados!

Page 86: Curso de Fortran - ANP

87

Declarações condicionais O comando CASE

O comando CASE é uma outra forma de declaração condicional. É menos utilizada do que o comando IF.

Permite ao programador selecionar um bloco específico do código para um dado valor inteiro, lógico ou alfabético.

Page 87: Curso de Fortran - ANP

88

Declarações condicionais O comando CASE

Forma geral do comando:

nome: SELECT CASE (dado)CASE (grupo 1) nome

Instrução 1Instrução 2...

CASE (grupo 2) nomeInstrução 1Instrução 2...

...CASE DEFAULT nome

Instrução 1Instrução 2...

END SELECT nome

Bloco 1

Bloco 2

Bloco n

Observações:

nome: segue as mesmas considerações feitas para o comando IF.

Grupos 1, 2 .. N: devem ser mutuamente exclusivos

DEFAULT é opcional.

Page 88: Curso de Fortran - ANP

89

Declarações condicionais Aplicação 3

Exemplo de utilização do comando CASE:

INTEGER :: temp...Case1: SELECT CASE (temp)CASE (:-1)

WRITE(*,*) ‘Está abaixo de 0 hoje!’

CASE (0)WRITE(*,*) ‘Está exatamente 0 graus’

CASE (1:20)WRITE(*,*) ‘Está frio hoje!’

CASE (21:33)WRITE(*,*) ‘A temperatura está agradável!’

CASE (34:)WRITE(*,*) ‘Está quente hoje’

END SELECT CASE Case1

Page 89: Curso de Fortran - ANP

90

Declarações condicionaisDicas

É comum, quando se constroem blocos condicionais, cometermos erros na escolha do operador condicional a ser utilizado ou mesmo errarmos na própria concepção da expressão lógica (uso de .AND. ao invés de .OR., etc)

Atenção ao se construir comparações de variáveis com números reais! Pequenos erros de aproximação são cometidos durante operações com aritmética de ponto flutuante. Assim, evite expressões:

IF ( x == 10.) THEN

Prefira:

IF (ABS(x-10.) <= 0.0001) THEN

Page 90: Curso de Fortran - ANP

91

Agenda

Introdução. Bases para programação em Fortran. Declarações condicionais. Declarações recursivas.Declarações recursivas. Lendo e escrevendo dados. Operações com arquivos. Vetores e matrizes. Subrotinas e funções. Dupla precisão, complexos e tipos derivados. Propostas para programas.

Page 91: Curso de Fortran - ANP

92

Declarações recursivasApresentação

Declarações recursivas (loops) são aquelas que permitem a execução de uma sequência de instruções mais de uma vez.

Em FORTRAN, há dois tipos de declarações recursivas, que se diferenciam pela forma de controle do número de repetições:

– WHILE loops: as instruções neles contidas são executadas indefinidamente até que uma condição especificada pelo programador seja atingida.

– Loops iterativos: as instruções neles contidas são executadas um número de vezes previamente especificado.

Page 92: Curso de Fortran - ANP

93

Declarações recursivasWHILE Loops

Neste tipo de comando, as instruções são repetidas até que uma condição especificada pelo programador seja atingida:

Forma geral do comando

DO ......

IF (expressão lógica) EXIT

...

END DO

Observações:

Pode haver mais de uma controle lógico para interrupção do loop.

A interrupção pode estar posicionado em qualquer lugar entre DO e END DO.interrupção

Page 93: Curso de Fortran - ANP

94

Declarações recursivasAplicação 1

Elaborar um programa FORTRAN para cálculo da média aritmética e do desvio padrão de um dado conjunto de números reais.

– A média aritmética é dada pela expressão:

– O desvio padrão é dado por:

N

iixN

x1

1

111

2

NN

xxN

s

N

ii

N

ii

Page 94: Curso de Fortran - ANP

95

Declarações recursivasAplicação 1

Etapas do programa:– Definição do problema: calcular a média aritmética e o

desvio padrão de um dado conjunto de pontos

– Entrada e saída de dados: ler o número de valores e o conjunto de valores. Retornar a média e o desvio.

– Elaboração do algoritmo:

Leitura da dimensão do conjunto e dados de entrada. Cálculo da média e do desvio padrão

– Presença de somatório requer o uso de variáveis acumulativas (somax, somax2).

Escrever o valor da média, desvio e número de pontos.

– Transformar o algoritmo em um código FORTRAN

Page 95: Curso de Fortran - ANP

96

Declarações recursivasLoops iterativos

Neste tipo de comando, as instruções são repetidas um número de vezes previamente especificado.

Forma geral do comando

DO indice = iinicio, ifim, incrInstrução 1

Instrução 2

...

Instrução N

END DO

indice = variável inteira utilizada como contador.

iinicio = valor inicial para indice.

ifim = valor final para indice.

incr (opcional, default = 1) = incremento no valor de indice.

Page 96: Curso de Fortran - ANP

97

Declarações recursivasLoops iterativos

iinicio, ifim e incr podem ser constantes ou variáveis. Se forem variáveis, seus valores devem ser definidos antes do comando DO.

No início da excução, indice = iinicio e é feita a verificação:

indice * incr <= ifim * incr

Caso seja atendida, as instruções a seguir são executadas, caso contrário a instrução após END DO é executada.

Page 97: Curso de Fortran - ANP

98

Declarações recursivasLoops iterativos

Depois que as instruções 1 a N são executadas, a variável índice é recalculada:

indice = indice + incr

O número de iterações realizadas em um dado loop pode ser calculado por:

niter = (ifim – iinicio + incr) / incr

Page 98: Curso de Fortran - ANP

99

Declarações recursivasAplicação 2

Quantas iterações serão realizadas nos comandos abaixo?1. DO i=1,10

Instrução 1 Instrução 2

END DO

2. DO i=1,10,2 Instrução 1 Instrução 2

END DO

Reescrever o programa estatística utilizando loop iterativo.

3. DO i=1,10,-1

Instrução 1

Instrução 2

END DO

4. DO i=3,-3,-2

Instrução 1

Instrução 2

END DO

10

5

0

4

Page 99: Curso de Fortran - ANP

100

Declarações recursivasMais detalhes sobre loops iterativos

Não é obrigatório “identar” as instruções no corpo da declaração recursiva, porém torna muito mais fácil a leitura do código.

A variável índice não deve nunca ser modificada no corpo da declaração recursiva:

PROGRAM naofacaissoINTEGER :: iDO i = 1, 4

i = 2

END DOEND PROGRAM naofacaisso

Gera um loop infinito!

Page 100: Curso de Fortran - ANP

101

Declarações recursivasMais detalhes sobre loops iterativos

Pode-se sair do loop iterativo utilizando uma declaração condicional:INTEGER :: i

DO i = 1, 5...

IF (i >=3) EXIT

...

END DO

WRITE (*,*) i

Este programa escreveria o valor 3.

Page 101: Curso de Fortran - ANP

102

Declarações recursivasMais detalhes sobre loops iterativos

Após o fim da execução do loop, o valor da variável índice é indeterminado. Não tentar utilizar este valor para cálculo de qualquer outra variável no programa!

É ilegal referenciar a uma instrução dentro de um loop sem que este loop não esteja sendo executado:

INTEGER :: iDO i = 1, 5

...200

...END DO...GO TO 200

Não utilizar GO TO!

Não referenciar a instruções dentro de loop.

Page 102: Curso de Fortran - ANP

103

Declarações recursivasCYCLE e EXIT

CYCLE é executado dentro de um loop. Esse comando pára a execução das instruções e retorna ao topo do loop:

PROGRAM teste_cycle

INTEGER :: i

DO i = 1, 5IF (i == 3) CYCLE

WRITE (*,*) i

END DO

WRITE (*,*) ‘Fim de loop!’

END PROGRAM teste_cycle

Saída do programa:

1

2

4

5

Fim de loop!

Page 103: Curso de Fortran - ANP

104

Declarações recursivasCYCLE e EXIT

EXIT também é executado dentro de um loop, porém sua execução provoca a saída do loop:

PROGRAM teste_exit

INTEGER :: i

DO i = 1, 5

IF (i == 3) EXIT

WRITE (*,*) i

END DO

WRITE (*,*) ‘Fim de loop!’

END PROGRAM teste_cycle

Saída do programa:

1

2

Fim de loop!

Page 104: Curso de Fortran - ANP

105

Declarações recursivasNomeando loops

WHILE loops:

nome: DOInstrução 1

Instrução 2

...

IF (expressão lógica 1) CYCLE nome

...

IF (expressão lógica 2) EXIT nome

...

END DO nome

Page 105: Curso de Fortran - ANP

106

Declarações recursivasNomeando loops

Loops iterativos:

nome: DO indice = iinicio, ifim, incrInstrução 1

Instrução 2

...

IF (expressão lógica 1) CYCLE nome

...

END DO nome

Page 106: Curso de Fortran - ANP

107

Declarações recursivasLoops agrupados

Pode-se criar um ou mais loops dentro de outros loops gerando, assim, loops agrupados:

PROGRAM loops_agrupados

INTEGER :: i, j, produto

DO i = 1, 3

DO j = 1, 3

produto = i * j

WRITE (*,*) i, ‘ * ‘, j, ‘ = ‘, produto

END DO

END DO

END PROGRAM

1 * 1 = 1

1 * 2 = 2

1 * 3 = 3

2 * 1 = 2

2 * 2 = 4

2 * 3 = 6

3 * 1 = 3

3 * 2 = 6

3 * 3 = 9

Page 107: Curso de Fortran - ANP

108

Declarações recursivasLoops agrupados

O loop interno é executado inteiramente antes de se incrementar o loop externo.

Quando o compilador Fortran encontra o primeiro END DO, esse é associado ao DO mais interno.

É recomendável que se nomeie os DO para que se torne mais fácil a leitura do programa e, também, seja mais fácil localizar a possível falta de um END DO (erro de programação).

Page 108: Curso de Fortran - ANP

109

Declarações recursivasLoops agrupados

Pode-se nomear a declaração do seguinte modo:

PROGRAM loops_agrupados

INTEGER :: i, j, produto

externo: DO i = 1, 3

interno: DO j = 1, 3

produto = i * j

WRITE (*,*) i, ‘ * ‘, j, ‘ = ‘, produto

END DO interno

END DO externo

END PROGRAMAos comandos CYCLE e EXIT devem ser atribuídos os nomes dos loops aos quais se referem.

Page 109: Curso de Fortran - ANP

110

Agenda

Introdução. Elementos básicos para programação em Fortran. Declarações condicionais. Declarações recursivas. Lendo e escrevendo dados. Lendo e escrevendo dados. Operações com arquivos. Vetores e matrizes. Subrotinas e funções. Dupla precisão, complexos e tipos derivados. Propostas para programas.

Page 110: Curso de Fortran - ANP

111

Lendo e escrevendo dadosApresentação

Para ler (importar) ou escrever (exportar) dados em Fortran, utilizam-se os comandos:

– READ.– WRITE.

Formato dos comandos:– WRITE (unidade,formato)– READ (unidade,formato)

Page 111: Curso de Fortran - ANP

112

Lendo e escrevendo dadosO comando FORMAT

O comando FORMAT permite especificar a maneira exata segundo a qual nós queremos escrever (ou ler) as variáveis em um programa:

WRITE(*,100) i, result

100 FORMAT(‘ O resultado da iteracao ‘, I3,’eh’, F7.3)

Rótulo Texto Texto

Formatos

(inteiro – I, real – F)

Page 112: Curso de Fortran - ANP

113

Lendo e escrevendo dadosO comando FORMAT

O resultado deste comando seria, por exemplo:

Caso fosse assumido formato livre: WRITE(*,*) ‘ O resultado da iteracao ‘, i,’eh’, result

Tem-se, portanto, controle sobre a forma como uma determinada variável é escrita ou, da mesma maneira, lida.

Page 113: Curso de Fortran - ANP

115

Lendo e escrevendo dadosEscrevendo resultados formatados

Formatos para impressão:– Números inteiros:

Regra geral: rIw.m– r: número de vezes que o formato será repetido (default = 1).– w: número de caracteres a serem usados na leitura ou impressão.– m: número mínimo de dígitos a serem impressos.

Exemplo:

INTEGER :: indice = -12, dummy = 4, num = -12345WRITE (*,200) indice, indice + 12, dummy, numWRITE (*,210) indice, indice + 12, dummy, numWRITE (*,220) indice, indice + 12, dummy, num200 FORMAT (‘ ‘, 2I5, I6, I10)210 FORMAT (‘ ‘, 2I5.0, I6, I10.8)220 FORMAT (‘ ‘, 2I5.3, I6, I5)

Page 114: Curso de Fortran - ANP

116

Lendo e escrevendo dadosEscrevendo resultados formatados

Formatos para impressão:– Números inteiros:

5 10 16 261

Primeiro número: colunas 1 a 5 (I5)

Segundo número: colunas 6 a 10 (I5)

Terceiro número: colunas 11 a 16 (I6)

Quarto número: colunas 17 a 26 (I10)

Quando o número de dígitos é maior que o formato especificado, o Fortran escreve ****.

Page 115: Curso de Fortran - ANP

117

Lendo e escrevendo dadosEscrevendo resultados formatados

Formatos para impressão:– Números reais:

Regra geral: rFw.d– r: número de vezes que o formato será repetido (default = 1)– w: número de caracteres a serem usados na leitura ou impressão.– d: número de dígitos à direita do ponto decimal.

Exemplo:

REAL :: a = -12.3, b = .123, c = 123.456

WRITE (*,200) a, b, c

WRITE (*,210) a, b, c

200 FORMAT (‘ ‘, 2F6.3, F8.3)

210 FORMAT (‘ ‘, 3F10.2)

Page 116: Curso de Fortran - ANP

118

Lendo e escrevendo dadosEscrevendo resultados formatados

Formatos para impressão:– Números reais:

2F6.3 – 2 números reais escritos em 6 colunas e com 3 casas

decimais. F8.3

– 1 número real escrito em 8 colunas e com 3 casas decimais. 3F10.2

– 3 números reais escritos em 10 colunas e com 2 casas decimais.

Page 117: Curso de Fortran - ANP

119

Lendo e escrevendo dadosEscrevendo resultados formatados

Formatos para impressão:– Números reais:

Quando o número de dígitos é maior que o formato especificado, o Fortran escreve ****.

1 5 10 15 20 3025

Page 118: Curso de Fortran - ANP

120

Lendo e escrevendo dadosEscrevendo resultados formatados

Formatos para impressão:– Números reais (notação exponencial):

Regra geral: rEw.d– r: número de vezes que o formato será repetido (default = 1)– w: número de caracteres a serem usados na leitura ou impressão.– d: número de dígitos à direita do ponto decimal.– w >= d + 7

Exemplo:

REAL :: a = 1.234E6, b = 0.001, c = -77.7E10, d = -77.7E10

WRITE (*,200) a, b, c, d

200 FORMAT (‘ ‘, 2E14.4, E13.6, E11.6)

Page 119: Curso de Fortran - ANP

121

Lendo e escrevendo dadosEscrevendo resultados formatados

Formatos para impressão:– Números reais (notação exponencial):

O último formato (E11.6) não atende a relação w>=d+7. Por esta razão, o Fortran escreve ****.

5 10 15 20 25 30 35 40 45 50

A presença do 0 à esquerda do ponto decimal depende do compilador Fortran utilizado.

Page 120: Curso de Fortran - ANP

122

Lendo e escrevendo dadosEscrevendo resultados formatados

Formatos para impressão:– Números reais (notação científica):

Notação exponencial x Notação científica:– 0.1234E+05 x 1.2340E+04

Regra geral: rESw.d– r: número de vezes que o formato será repetido (default = 1)– w: número de caracteres a serem usados na leitura ou impressão.– d: número de dígitos à direita do ponto decimal.– w >= d + 7

Exemplo:

REAL :: a = 1.2346E6, b = 0.001, c = -77.7E10

WRITE (*,200) a, b, c, d

200 FORMAT (‘ ‘, 2ES14.4, E12.6)

Page 121: Curso de Fortran - ANP

123

Lendo e escrevendo dadosEscrevendo resultados formatados

Formatos para impressão:– Números reais (notação científica):

O último formato (E11.6) não atende a relação w>=d+7. Por esta razão, o Fortran escreve ****.

5 10 15 20 25 30 35 40

Quando for escrever números muito grandes, dê preferência à notação científica.

Page 122: Curso de Fortran - ANP

124

Lendo e escrevendo dadosEscrevendo resultados formatados

Formatos para impressão:– Notação lógica

T – TRUE ; F - FALSE

Regra geral: rLw– r: número de vezes que o formato será repetido (default = 1)– w: número de caracteres a serem usados na leitura ou impressão.

Exemplo:

LOGICAL :: output = .TRUE. , debug = .FALSE.

WRITE (*,200) output, debug

200 FORMAT (‘ ‘, 2L5)

5 10

Page 123: Curso de Fortran - ANP

125

Lendo e escrevendo dadosEscrevendo resultados formatados

Formatos para impressão:– Caracteres

Regra geral: rA ou rAw– r: número de vezes que o formato será repetido (default = 1).– w: número de caracteres a serem usados na leitura ou impressão.– rA imprime utilizando um número de campos igual ao número de

caracteres presentes na variável. rAw fixa o número de campos a ser utilizado

Exemplo:

CHARACTER (len = 17) :: string = ‘Isto e uma frase.’WRITE (*,10) stringWRITE (*,11) stringWRITE (*,12) string10 FORMAT (‘ ‘, A)11 FORMAT (‘ ‘, A20)12 FORMAT (‘ ‘, A6)

Page 124: Curso de Fortran - ANP

126

Lendo e escrevendo dadosEscrevendo resultados formatados

Formatos para impressão:– Caracteres

Imprime exatamente o número de campos na variável (A).

Fixa o número de campos em 20 (A20).

O número de campos é insuficiente para escrever toda a frase (A6)

Page 125: Curso de Fortran - ANP

127

Lendo e escrevendo dadosEscrevendo resultados formatados

Formatos para impressão:– Espaçamentos

Regra geral: rX ou Tc– X: insere um campo vazio – ‘ ‘.– T: leva a impressão para uma coluna c.– r: número de vezes que o formato será repetido (default = 1).– c: coluna na qual o texto será iniciado.

Exemplo:

CHARACTER (len = 10) :: nome = ‘Vasco da Gama‘

CHARACTER (len = 25) :: titulo = ‘Tetra Campeao Brasileiro!’

INTEGER :: ano1 = 1974, ano2 = 1989, ano3 = 1997, & ano4 = 2000

WRITE (*,10) nome, titulo, ano1, ano2, ano3, ano4

10 FORMAT (1X, A10, 5X, A, T50, I4, 1X, I4, 1X, I4, 1X, I4)

Page 126: Curso de Fortran - ANP

128

Lendo e escrevendo dadosEscrevendo resultados formatados

Formatos para impressão:– Espaçamentos

5 10 15 20 25 50 55 70

O comando T permite avançar ou mesmo regredir na linha que se está escrevendo.

Page 127: Curso de Fortran - ANP

129

Lendo e escrevendo dadosEscrevendo resultados formatados

Formatos para impressão:– Agrupamento de formatos

Exemplo anterior:

10 FORMAT (1X, A10, 5X, A, T50, I4, 1X, I4, 1X, I4, 1X, I4)

10 FORMAT (1X, A10, 5X, A, T50, I4, 3 (1X, I4) )

Minimiza-se, assim, o comando FORMAT. Tome cuidado, entretanto, para não abusar! O comando FORMAT pode-se tornar tão complexo que nem você mesmo entenderá!

Page 128: Curso de Fortran - ANP

130

Lendo e escrevendo dadosEscrevendo resultados formatados

Formatos para impressão:– Pulando para outra linha

Dentro de um FORMAT, caso se deseje pular para uma outra linha, utiliza-se a /. Cada / significa uma linha que se pulará:

INTEGER :: indice = 10

REAL :: tempo = 0.53, prof = 432., amp = 3.5, fase = 87.965

WRITE(*,100) indice, tempo, prof, amp, fase

100 FORMAT (T20, ‘Resultados do teste numero’, I3, ///, &

1X, ‘Tempo =‘ , F7.0 / , &

1X, ‘Profundidade =‘ , F7.1, ‘metros’, /, &

1X, ‘Amplitude =‘ , F8.2 /, &

1X, ‘Fase =‘ , F7.1)

Page 129: Curso de Fortran - ANP

131

Lendo e escrevendo dadosEscrevendo resultados formatados

Formatos para impressão:– Pulando para outra linha

Page 130: Curso de Fortran - ANP

132

Lendo e escrevendo dadosAplicação 1

Criar uma tabela com a raiz quadrada, quadrados, cubos e logaritmos decimal e neperianos dos números inteiros de 1 a 10.

Funções:– Raiz quadrada : SQRT– Quadrado : **2– Cubo : **3– Logaritmo natural : LOG10 (atenção com o logaritmo!)– Logaritmo neperiano : LOG (atenção com o logaritmo!)

Page 131: Curso de Fortran - ANP

133

Lendo e escrevendo dadosDicas sobre o comando WRITE

Verifique sempre se para cada variável ou texto presente no comando WRITE há uma correspondência no FORMAT. Esse tipo de erro não é percebido pelo compilador. O erro aparecerá somente na execução do programa.

O comando FORMAT é sempre lido da esquerda para a direita.

Se um formato de impressão é repetido (ex. 2I5, 3F10.3), o programa só passa para o próximo após essas repetições serem executadas.

Page 132: Curso de Fortran - ANP

134

Lendo e escrevendo dadosDicas sobre o comando WRITE

Verifique sempre se para cada variável presente no comando WRITE há uma correspondência no FORMAT e se os tipos a elas associados estão corretos. Esses erros não são percebidos pelo compilador. Aparecerão somente na execução.

O comando FORMAT é sempre lido da esquerda para a direita.

Se um formato de impressão é repetido (ex. 2I5, 3F10.3) ou um bloco é repetido (ex. 2(I3,1X,I5) ou 3(A2,3X,F10.3)), o programa só passa para o próximo tipo após essas repetições serem executadas.

Page 133: Curso de Fortran - ANP

135

Lendo e escrevendo dadosDicas sobre o comando WRITE

Se há um número menor de variáveis no comando WRITE em relação ao que é associado no comando FORMAT, o programa interrompe a execução do FORMAT no primeiro tipo sem associação no comando WRITE ou no fim do FORMAT, o que acontecer primeiro.

INTEGER :: m = 1

WRITE (*, 40) m

40 FORMAT (1X, ‘M = ‘, I3, ‘N = ‘, I4, ‘O = ‘, F7.2)

Page 134: Curso de Fortran - ANP

136

Lendo e escrevendo dadosDicas sobre o comando WRITE

Se há um número maior de variáveis no comando WRITE em relação ao que é associado no comando FORMAT, o comando FORMAT é reiniciado a partir do parêntese aberto que não precede uma instrução de repetição. Para clarear...

INTEGER :: j = 1, k = 1, l = 3, m = 4, n = 5

WRITE (*,60) j, k, l, m, n

60 FORMAT (1X, ‘value = ‘, I3)

Page 135: Curso de Fortran - ANP

137

Lendo e escrevendo dadosDicas sobre o comando WRITE

INTEGER :: j = 1, k = 2, l = 3, m = 4, n = 5

WRITE (*,60) j, k, l, m, n

60 FORMAT (1X, ‘Value = ‘, /, (1X, ‘Nova linha’, 2(3X,I5)))

Primeira abertura de parêntese após o final do comando que não está associado a uma repetição.

Page 136: Curso de Fortran - ANP

138

Lendo e escrevendo dadosLendo dados formatados

Da mesma forma que se escrevem resultados com formatação, pode-se ler resultados formatados, isto é, definidos precisamente dentro de uma linha, através do comando READ:READ (*,100)100 FORMAT (6X, I6) ! Lê uma variável inteira com 6 ! dígitos a partir da 6ª coluna

Valem os mesmos formatos apresentados para o comando WRITE:

– Inteiros: rIw– Real: rFw.d– Lógico: rLw– Caracter: rA ou rAw– Posicionamento: X ou T– Pula linha: /

Page 137: Curso de Fortran - ANP

139

Agenda

Introdução. Bases para programação em Fortran. Declarações condicionais. Declarações recursivas. Lendo e escrevendo dados. Operações com arquivos.Operações com arquivos. Vetores e matrizes. Subrotinas e funções. Dupla precisão, complexos e tipos derivados. Propostas para programas.

Page 138: Curso de Fortran - ANP

140

Operações com arquivosApresentação

Até aqui, a quantidade de informação passada aos programas elaborados foi muito pequena. Como seria possível, por exemplo, passar 1000 ou 10000 dados de entrada para um programa Fortran?

Além disso, as próprias saídas de dados se limitaram a pequenas quantidades de informação. E se tivéssemos uma grande quantidade de informações de saída ou mesmo quiséssemos armazenar a saída de dados de um programa?

A resposta para ambas as questões pode ser a criação de arquivos de entrada ou saída, respectivamente.

Page 139: Curso de Fortran - ANP

141

Operações com arquivosCriando arquivos

Para se abrir um arquivo texto em Fortran utiliza-se o comando OPEN:

– OPEN (UNIT = numero, FILE = ‘nome’, STATUS = ‘cond’, & ACTION = ‘acao’, IOSTAT = ierror)

UNIT– Número inteiro associado ao arquivo. É o número que será

utilizado para se referenciar a ele nos comandos READ e WRITE.

FILE– Nome do arquivo que se deseja abrir.

STATUS– Status do arquivo que será aberto: OLD, NEW, REPLACE,

SCRATCH ou UNKNOWN. ACTION

– Estabelece a ação que será executada: READ, WRITE e READWRITE

IOSTAT– É igual a 0 se o arquivo for aberto com sucesso e igual a um

número positivo se falhar.

Page 140: Curso de Fortran - ANP

142

Operações com arquivosCriando arquivos

Abrindo arquivo para entrada de dados:

INTEGER :: ierror, i, jOPEN (UNIT = 8, FILE = ‘exemplo.dat’, STATUS = ‘OLD’, & ACTION = ‘READ’, IOSTAT = ierror)DO i = 1, 20 READ(8,*) jEND DO

– STATUS: OLD: diz que o arquivo especificado em FILE já existe. Se não

existe a variável ierror retornará com um número negativo. Se existe, ierror retornará zero.

– ACTION: READ: especifica que o arquivo será apenas lido, ou seja, não

é possível escrever nenhum dado adicional.

Page 141: Curso de Fortran - ANP

143

Operações com arquivosCriando arquivos

Abrindo arquivo para escrever dados:INTEGER :: ierror, unit, iCHARACTER(len = 9) :: filenameunit = 25filename = ‘saida.dat’

OPEN (UNIT = unit, FILE = filename, STATUS = ‘NEW’, & ACTION = ‘WRITE’, IOSTAT = ierror)

! Outra possibilidade:

OPEN (UNIT = unit, FILE = filename, STATUS = & ‘REPLACE’, ACTION = ‘WRITE’, IOSTAT = ierror)

DO i=1, 1000 WRITE (25,*) i

END DO

Page 142: Curso de Fortran - ANP

144

Operações com arquivosCriando arquivos

– STATUS NEW: diz que o arquivo especificado em FILE é novo. Se já

existe a variável ierror retornará positiva. Se não existe a variável ierror retornará nula.

REPLACE: diz que o arquivo especificado em FILE será criado tanto se ele já existe ou não. Se não existir, será criado diretamente. Se já existir, o arquivo antigo será reescrito. Essa é a opção correta caso queiramos sempre reescrever o arquivo de saída.

– ACTION WRITE: diz que o arquivo especificado em FILE é apenas

para ser escrito. Qualquer tentativa de leitura de dados desse arquivo durante a execução do programa causará um erro.

READWRITE: o arquivo serve tanto para escrever quanto para leitura.

Page 143: Curso de Fortran - ANP

145

Operações com arquivosCriando arquivos

Criando um arquivo temporário:– Um arquivo temporário é aquele em que se escrevem

dados durante a execução de um programa e, após sua execução, é automaticamente apagado:

OPEN ( UNIT = 12, STATUS = ‘SCRATCH’, IOSTAT = & ierror)

Page 144: Curso de Fortran - ANP

146

Operações com arquivosFechando arquivos

Deve-se fechar (prática da boa programação) os arquivos abertos durante a execução do programa. Para tanto, utiliza-se o comando CLOSE:

CLOSE (UNIT = numero)

O comando acima é suficiente para fechar o arquivo. Pode-se, se for desejado, acrescentar as demais opções vistas em OPEN.

Se o arquivo não for fechado pelo programador, o próprio programa fechará após o término de sua execução.

Page 145: Curso de Fortran - ANP

147

Operações com arquivosIOSTAT com comando READ

Na leitura de dados de um arquivo é interessante acrescentar a variável IOSTAT:

READ (3, *, IOSTAT=status)

Se a leitura for feita com sucesso, status retornará igual a 0. Se não, retornará um valor positivo:

Razões para falha:– Formato inadequado do dado.– Tentativa de leitura após a última linha do arquivo

(provavelmente, faltam dados no arquivo de entrada)– Etc.

Page 146: Curso de Fortran - ANP

148

Operações com arquivosPosicionamento em um arquivo

Comandos para mudarmos a ordem sequencial de leitura do programa Fortran:

– BACKSPACE (UNIT = numero) Retorna à linha lida previamente. numero é a unidade do arquivo declarada no comando OPEN.

DEVE SER INTEIRO!

– REWIND (UNIT = numero) Retorna ao início do arquivo. numero é a unidade do arquivo declarada no comando OPEN.

DEVE SER INTEIRO!

Page 147: Curso de Fortran - ANP

149

Operações com arquivosAplicação 1

Criar um programa que leia pares de pontos (x,y) e ajuste uma reta a eles (regressão linear):

– Reta:

– Coeficientes:

bxmy

xxx

yxyxm

2 xmyb

média das ordenadas

média das abscissas

Page 148: Curso de Fortran - ANP

150

Operações com arquivos Aplicação 1

Etapas do programa:

– Definição do problema: elaborar um programa que ajuste uma reta a uma nuvem de pontos dada.

– Entrada e saída de dados: entrada de dados a partir de um arquivo no qual se informam as coordenadas x e y dos pontos. Como resultado final, o programa exporta a inclinação da reta e o ponto de interseção com o eixo das ordenadas.

Page 149: Curso de Fortran - ANP

151

Operações com arquivos Aplicação 1

Etapas do programa:– Algoritmo:1. Inicializar variáveis n, soma_x, soma_x2, soma_y, soma_xy (iguais a 0).2. Prompt para informar o nome do arquivo de dados.3. Abrir arquivo “filename”4. Verificar possíveis problemas em 3 (iostat).5. DO

– READ x, y do arquivo filename– n = n + 1– soma_x = soma_x + x– soma_y = soma_y + y– soma_x2 = soma_x2 + x**2– soma _xy = soma_xy + x*y

END DO6. Calcula a inclinação e a interseção.7. Imprime resultado.

Page 150: Curso de Fortran - ANP

152

Operações com arquivos Aplicação 1

Etapas do programa:

– Transformar o algoritmo proposto em instruções Fortran.

Page 151: Curso de Fortran - ANP

153

Agenda

Introdução. Elementos básicos para programação em Fortran. Declarações condicionais. Declarações recursivas. Lendo e escrevendo dados. Operações com arquivos. Vetores e matrizes.Vetores e matrizes. Subrotinas e funções. Dupla precisão, complexos e tipos derivados. Aplicações.

Page 152: Curso de Fortran - ANP

154

Vetores e matrizesApresentação

Vetores e matrizes são representados (e tratados) como variáveis comuns dentro do Fortran.

Cada elemento do vetor ou matriz é referenciado pelo nome dado ao vetor ou matriz e sua posição entre parênteses. Exemplo:

– a(5) é o quinto elemento do vetor a.– n(2,3) é o elemento localizado na 2ª linha e na 3ª. Coluna

da matriz n.

Todos os elementos de uma matriz ou vetor devem ser do mesmo tipo!

Page 153: Curso de Fortran - ANP

155

Vetores e matrizesVetores: definição

Vetores (e também matrizes) são declarados através do comando DIMENSION, por exemplo:

REAL, DIMENSION(16) :: numeros

CHARACTER(len=20), DIMENSION(30) :: nomes

LOGICAL, DIMENSION(0:20) :: teste ! 21 elementos de 0 a 20.

INTEGER, DIMENSION(-3:3) :: inteiros ! 7 elementos de -3 a 3.

Page 154: Curso de Fortran - ANP

156

Vetores e matrizesVetores: definição

São inicializados diretamente no corpo de declaração de variáveis:

INTEGER, DIMENSION(4) :: arrayc1 = (/1,2,3,4/)INTEGER, DIMENSION(4) :: arrayc2 = (/ (i, i=1,4) /)

Ou ao longo do programa:

REAL, DIMENSION(10) :: array1DO i = 1, 10 array(i) = 0.0END DO

Se todos os elementos têm o mesmo valor:

INTEGER, DIMENSION(4) :: inteiro = 4

arrayc1 = arrayc2 =

1

2

3

4

Page 155: Curso de Fortran - ANP

157

Vetores e matrizesVetores: definição

Para facilitar a mudança das dimensões de um vetor (e também de uma matriz), pode-se definir uma variável (ou variáveis) para a dimensão através do comando PARAMETER:

INTEGER, PARAMETER :: lsize = 1000

REAL :: array1(lsize)

REAL :: array2(2*lsize)

– Se desejarmos modificar as dimensões de array1 e array2, basta alterar lsize!

Page 156: Curso de Fortran - ANP

158

Vetores e matrizesVetores: uso

Cada elemento do vetor pode ser tratado como uma variável análoga às que vêm sendo utilizadas ao longo deste curso, por exemplo:

INTEGER, DIMENSION(10) :: index

REAL, DIMENSION(3) :: temp

...

index(1) = 1

temp(3) = REAL(index(1)) / 4.

WRITE (*,*) ‘ index(1) = ‘, index(1)

Page 157: Curso de Fortran - ANP

159

Vetores e matrizesVetores: uso

As operações entre vetores podem ser feitas elemento a elemento utilizando, por exemplo, o comando DO:

INTEGER, DIMENSION(4) :: a

INTEGER, DIMENSION(4) :: b

INTEGER, DIMENSION(4) :: c ! a, b e c têm a mesma dimensão

...

DO i = 1, 4

a(i) = i + 1

b(i) = 2 * a(i)

c(i) = a(i) + b(i)

END DO

Page 158: Curso de Fortran - ANP

160

Vetores e matrizesVetores: lendo e escrevendo

Suponha os seguintes comandos:

WRITE (*,100) a(1), a(2), a(3), a(4), a(5)

100 FORMAT (1X, ‘a = ‘, 5F10.2)

Esses comandos podem ser simplificados através de loops implícitos:

WRITE (*,100) ( a(i), i = 1, 5) ! Escreve os 5 em uma linha

100 FORMAT (1X, ‘a = ‘, 5F10.2)

O mesmo tipo de loop pode ser aplicado, também com o comando READ.

Page 159: Curso de Fortran - ANP

161

Vetores e matrizesVetores: lendo e escrevendo

Loops implícitos agrupados também são possíveis:

WRITE (*,100) ((i, j, j = 1, 3), i = 1, 2)

100 FORMAT (1X, I5, 1X, I5)

– Esses comandos geram as linhas (fixa o valor de i e varia j):

1 1

1 2

1 3

2 1

2 2

2 3

Equivalente a...

DO i = 1, 2

DO j = 1, 3

WRITE (*,100)

END DO

END DO

100 FORMAT (1X, I5, 1X, I5)

Page 160: Curso de Fortran - ANP

162

Vetores e matrizesMatrizes: definição

Matrizes são definidas por linhas e colunas, ou seja, possuem duas dimensões e podem ser declaradas, por exemplo, da seguinte forma:

– REAL, DIMENSION (3,6) :: soma Matriz com elementos reais, formada por 3 linhas e 6 colunas.

As linhas são numeradas de 1 a 3 e as colunas de 1 a 6. Quaisquer outros valores não são aceitos pelo compilador.

– INTEGER, DIMENSION (0:100,0:20) :: hist Matriz com elementos inteiros, formada por 101 linhas e 21

colunas. As linhas variam de 0 a 100 e as colunas de 0 a 20.

– CHARACTER (len=6), DIMENSION (-3:3,10) :: nomes Matriz com elementos formados por caracteres com dimensão

6. A matriz possui 6 linhas e 10 colunas. O índice das linhas varia de -3 a 3 e as colunas de 1 a 10.

Page 161: Curso de Fortran - ANP

163

Vetores e matrizesMatrizes: armazenamento na memória

(1,1) (1,2) (1,3)

(2,1) (2,2) (2,3)

(3,1) (3,2) (3,3)

(4,1) (4,2) (4,3)

a(1,1)

a(2,1)

a(3,1)

a(4,1)

a(1,2)

a(2,2)

a(3,2)

a(4,2)

a(1,3)

a(2,3)

a(3,3)

a(4,3)Matriz

Alocação na memória feita sempre a partir das

colunas da matriz:

(semelhante a de um vetor 12x1)

a =

Page 162: Curso de Fortran - ANP

164

Vetores e matrizesMatrizes: inicialização

As matrizes podem ser inicializadas durante a execução do programa, por exemplo:

INTEGER, DIMENSION (4,3) :: istat

INTEGER :: i, j

DO i = 1, 4

DO j = 1, 3

istat(i,j) =j

END DO

END DO

Page 163: Curso de Fortran - ANP

165

Vetores e matrizesMatrizes: inicialização

Ou ainda, através de uma única linha de comando utilizando o comando RESHAPE e observando como os elementos são armazenados na memória:

– Durante a execução do código:

istat = RESHAPE ( (/ 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3 /), (/4,3/) )

– Na declaração de variáveis:

INTEGER, DIMENSION (4,3) :: istat(4,3) = &

RESHAPE ( (/ 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3 /), (/4,3/) )

Page 164: Curso de Fortran - ANP

166

Vetores e matrizesMatrizes: inicialização

Ou, por fim, através de um arquivo de dados utilizando o comando READ. Suponha, por exemplo, um arquivo chamado “inicial.dat”, composto por apenas uma linha:

1 2 3 1 2 3 1 2 3 1 2 3

O código que geraria uma matriz semelhante a anterior seria:

INTEGER :: i, jINTEGER, DIMENSION (4,3) :: istatOPEN(7, FILE=‘inicial.dat’, STATUS=‘OLD’, ACTION=‘READ’)READ(7,*) ((istat(i,j), j = 1, 3), i = 1, 4)

Page 165: Curso de Fortran - ANP

167

Vetores e matrizesMatrizes: linhas, colunas e submatrizes

1

4

7

10

1 2 3

4 5 6

7 8 9

10 11 12

a =

1 2

4 5

7 8

a(:,1) =

a(1:3,1:2) =

Matriz

Tomando uma coluna...

Tomando uma submatiz...

Page 166: Curso de Fortran - ANP

168

Vetores e matrizesFunções disponíveis no Fortran

Funções intrínsecas elementares:– Pode-se utilizar funções como SIN, COS, TAN, LOG10,

MOD, SQRT etc. com elementos de vetores e matrizes, por exemplo:

REAL, DIMENSION(4) :: x = (/ 0., 3.141592, 1., 2. /)REAL, DIMENSION(4) :: yINTEGER :: i

y = SIN(x) ! Todo o vetor de uma só vez.

DO i = 1, 4y(i) = sin( x(i) ) ! Elemento por elemento

END DO

Page 167: Curso de Fortran - ANP

169

Vetores e matrizesFunções disponíveis no Fortran

Funções intrínsecas inquisidoras:– Funções pelas quais pode-se obter as propriedades de um

dado vetor ou matriz (arrays): LBOUND (array):

– Retorna os limites inferiores de array (índice da linha e da coluna)

SHAPE (array):– Retorna a forma de array.

SIZE (array):– Retorna o número de elementos de array.

UBOUND (array):– Retorna os limites superiores de array (índice da linha e

da coluna).

Page 168: Curso de Fortran - ANP

170

Vetores e matrizesFunções disponíveis no Fortran

Funções intrínsecas de transformação:– Funções cuja entrada de dados é um ou mais vetores ou

matrizes e a resposta é um escalar, vetor ou matriz: DOT_PRODUCT (vetor_A, vetor_B):

– Retorna um escalar igual ao produto interno do vetor_A pelo vetor_B.

MATMUL (matriz_A, matriz_B):– Retorna uma matriz igual ao produto da matriz_A pela

matriz_B. TRANSPOSE (matriz_A):

– Retorna uma matriz igual à transposta de matriz_A.

Page 169: Curso de Fortran - ANP

171

Vetores e matrizesO comando WHERE

Suponha que desejamos aplicar a função LOG a todos os elementos de uma matriz mat e que se queira armazenar o resultado na matriz logval :

logval = LOG (mat) ! Aplica a todos os elementos de uma só vez

OU

DO i = 1, ndim1 ! ndim1 e ndim2 são as dimensões da matrizDO j = 1, ndim2

logval(i,j) = LOG (mat(i,j)) ! Aplica elemento por elementoEND DO

END DO

Page 170: Curso de Fortran - ANP

172

Vetores e matrizesO comando WHERE

Da forma como foi programado anteriormente, caso haja algum número negativo ou nulo, haverá um erro durante a execução. Deste modo, modifica-se o código para:

DO i = 1, ndim1 ! ndim1 e ndim2 são as dimensões da matrizDO j = 1, ndim2 IF (mat(i,j) > 0.) THEN

logval(i,j) = LOG (mat(i,j)) ELSE

logval(i,j) = -999999. ! Número grande caso <= 0. END IFEND DO

END DO

Page 171: Curso de Fortran - ANP

173

Vetores e matrizesO comando WHERE

O código anterior, contudo, pode ser representado de modo mais elegante e simples através do comando WHERE (apenas no Fortran 90/95):

WHERE (mat > 0.)

logval = LOG(mat)

ELSEWHERE

logval = -999999.

END WHERE

SINTAXE DO COMANDO:

nome: WHERE (expressão lógica) Instrução 1 Instrução 2 ...ELSEWHERE nome Instrução 1 Instrução 2...END WHERE nome

Page 172: Curso de Fortran - ANP

174

Vetores e matrizesAlocação dinâmica de memória

Até aqui, o tamanho de cada matriz ou vetor foi previamente definido no bloco de declaração de variáveis no início de cada programa elaborado. Assim, suas dimensões não se alteram durante a execução de um programa (alocação estática de memória):

– REAL, DIMENSION (4,3) matriz

Muitas vezes, entretanto, não sabemos a priori quais dimensões atribuir a um vetor ou matriz (depende de dados fornecidos pelo usuário, por exemplo). Nessa situação pode-se recorrer à alocação dinâmica de memória.

Page 173: Curso de Fortran - ANP

175

Vetores e matrizesAlocação dinâmica de memória

Para tanto, utilizamos os comandos:– ALLOCATABLE: declara um dado vetor ou matriz como de

dimensão variável:

REAL, ALLOCATABLE, DIMENSION( : , :) :: matriz, vetor ...

– ALLOCATE: especifica, durante a execução do programa, as dimensões de uma dada matriz ou vetor:

ALLOCATE (lista de matrizes ou vetores, STAT = status), ex.:

ALLOCATE (matriz(100,0:100), STAT = status)

status retorna 0 se a alocação for feita com êxito e um número positivo caso contrário.

Page 174: Curso de Fortran - ANP

176

Vetores e matrizesAlocação dinâmica de memória

– ALLOCATED: verifica a condição (alocada ou não) de uma dada matriz ou vetor durante a execução do programa:

ALLOCATED (matriz ou vetor)

Retorna .TRUE. Se a matriz ou vetor estiver alocada e .FALSE. caso contrário.

O programa não utiliza uma matriz ou vetor com alocação dinâmica antes do comando ALLOCATE ser executado com sucesso!

– DEALLOCATE: desaloca as matrizes ou vetores alocados.

DEALLOCATE (lista de matrizes ou vetores, STAT = status)

Uma vez desalocados, as matrizes ou vetores não estarão mais disponíveis para uso!

Page 175: Curso de Fortran - ANP

177

Vetores e matrizesAplicação 2

Para ilustrar a aplicação da alocação dinâmica de memória, retornou-se ao programa estatistica.

– Vide projeto: estatistica_dinamica

Page 176: Curso de Fortran - ANP

178

Agenda

Introdução. Elementos básicos para programação em Fortran. Declarações condicionais. Declarações recursivas. Lendo e escrevendo dados. Operações com arquivos. Vetores e matrizes. Subrotinas e funções.Subrotinas e funções. Dupla precisão, complexos e tipos derivados. Propostas para programas.

Page 177: Curso de Fortran - ANP

179

Subrotinas e funçõesDefinições

Até agora, todos os programas apresentados consistiram em longas sequências de comandos agrupadas em um único arquivo (programa principal).

Para facilitar a programação, o Fortran permite agrupar blocos ou instruções apresentadas no programa principal em outros arquivos que podem ser chamados durante sua execução.

Esses arquivos, que são procedimentos externos ao programa principal, podem ser de dois tipos:

– Funções.– Subrotinas.

Page 178: Curso de Fortran - ANP

180

Subrotinas e funçõesDefinições

Subrotinas são subprogramas que podem retornar resultados múltiplos. As funções, por sua vez, só podem retornar um único resultado.

O uso de subrotinas e funções trazem os seguintes benefícios:

– Possibilidade de testar individualmente os procedimentos.– São reutilizáveis.– Melhor controle sobre as variáveis.

– Enfim, reduz de maneira significativa o esforço de programação em grandes códigos!

Page 179: Curso de Fortran - ANP

181

Subrotinas e funçõesSubrotinas: declaração

Uma subrotina Fortran é uma unidade independente de um programa que tem a seguinte forma:

SUBROUTINE nome_subrotina ( lista de argumentos )

...

Seção de declaração

...

Seção de execução

RETURN ! Opcional.

END SUBROUTINE nome_subrotina ! Nome é opcional.

São chamadas a partir do programa principal através do comando CALL:CALL nome_subrotina ( lista de argumentos )

Page 180: Curso de Fortran - ANP

182

Subrotinas e funçõesSubrotinas: declaração

Nomes devem possuir até 31 caracteres, sendo que o primeiro não deve ser numérico.

A lista de argumentos deve conter as variáveis e/ou arrays que são passados do programa principal para a subrotina.

Cada subrotina é uma unidade independente de um programa. Assim, são compiladas separadamente e as variáveis e constantes a serem utilizadas deverão ser declaradas na seção de declaração.

Page 181: Curso de Fortran - ANP

183

Subrotinas e funçõesSubrotinas: declaração

Por serem unidades independentes, rótulos e variáveis utilizadas em uma subrotina podem ser novamente declaradas e utilizadas em outra subrotina.

IMPORTANTÍSSIMO: A ordem e o número de argumentos utilizados na chamada da subrotina no programa principal (comando CALL) deve ser mantida na definição da subrotina (SUBROUTINE (...)).

REAL :: lado1, lado2, hipot

CALL hipotenusa (lado1, lado2, hipot)

...

SUBROUTINE hipotenusa (l1, l2, h)

REAL :: l1, l2, h

Page 182: Curso de Fortran - ANP

184

Subrotinas e funçõesSubrotinas: declaração

As subrotinas não alocam espaço na memória para as variáveis passadas ou que serão retornadas por elas.

Na realidade, quando um programa chama uma subrotina, o que é passado para a subrotina são ponteiros para posições de memória que contêm os argumentos (variáveis) dessa chamada:

PROGRAM test SUBROUTINE sub1 (x, y, i)

REAL :: a, b(4) REAL, INTENT (OUT) :: x

INTEGER :: prox REAL, INTENT (IN), DIMENSION(4) :: y

... INTEGER :: i

CALL sub1 (a, b, prox) ...

... END SUBROUTINE sub

END PROGRAM

Page 183: Curso de Fortran - ANP

185

Subrotinas e funçõesSubrotinas: declaração

Posição de memória

Programa principal

Subrotina

001 a x

002 b(1) y(1)

003 b(2) y(2)

004 b(3) y(3)

005 b(4) y(4)

006 prox i

Page 184: Curso de Fortran - ANP

186

Subrotinas e funçõesSubrotinas: aplicação 1

Subrotina para cálculo da hipotenusa de um triângulo retângulo:

SUBROUTINE calc_hipotenusa (lado1, lado2, hipot)

IMPLICIT NONE

REAL, INTENT(IN) :: lado1, lado2 ! Lados do triângulo

REAL, INTENT(OUT) :: hipot ! Hipotenusa

REAL :: temp

temp = lado1**2 + lado2**2

hipot = SQRT (temp)

RETURN

END SUBROUTINE calc_hipotenusa

Page 185: Curso de Fortran - ANP

187

Subrotinas e funçõesSubrotinas: o atributo INTENT

O atributo INTENT informa ao compilador como o programador pretende que a variável seja utilizada na subrotina:

– INTENT (IN) : a variável será utilizada apenas para passar valores do programa principal para a subrotina (seu valor não é modificado na subrotina).

– INTENT (OUT) : a variável será utilizada apenas para passar valores da subrotina para o programa principal (retornará valores calculados na subrotina).

– INTENT (INOUT): a variável tanto passa valores do programa principal para a subrotina quanto retorna valores dessa para o programa principal (default).

Page 186: Curso de Fortran - ANP

188

Subrotinas e funçõesSubrotinas: o atributo INTENT

Para evitar erros de programação, deve-se sempre utilizar o atributo INTENT:

SUBROUTINE exemplo (input, output)

REAL, INTENT (IN) :: input

REAL, INTENT (OUT) :: output

output = 2.0 * input

Input = -1. ! Essa linha está errada.

RETURN

END SUBROUTINE exemplo

Page 187: Curso de Fortran - ANP

189

Subrotinas e funções Subrotinas: continuação da aplicação 1

Programa que utiliza a subrotina calc_hipotenusa:

PROGRAM testa_hipotenusaIMPLICIT NONEREAL :: s1, s2, hypot

WRITE (*,*) ‘Entre com os lados 1 e 2:’READ (*,*) s1, s2

CALL calc_hipotenusa (s1, s2, hypot)

WRITE (*,100) ‘A hipotenusa do triangulo mede:’, hypot100 FORMAT (A,F10.4)

END PROGRAM testa_hipotenusa

Page 188: Curso de Fortran - ANP

190

Subrotinas e funções Subrotinas: passando vetores e matrizes

Há três maneiras de passar vetores e matrizes a uma subrotina:

– Vetores ou matrizes com forma explícita (explicit-shape):

SUBROUTINE process ( data1, data2, n, nvals)

INTEGER, INTENT (IN) :: n, nvals

REAL, INTENT (IN), DIMENSION(n) :: data1

REAL, INTENT(OUT), DIMENSION(n) :: data2

DO i = 1, nvalsdata2(i) = 2. * data1(i)

END DO

RETURN

END SUBROUTINE process

Outra possibilidade:

data2(1:nvals) = 2. * data1(1:nvals)

Page 189: Curso de Fortran - ANP

191

Subrotinas e funções Subrotinas: passando vetores e matrizes

Há três maneiras de passar vetores e matrizes a uma subrotina:

– Vetores ou matrizes com dimensões assumidas (assumed- size):

SUBROUTINE process ( data1, data2, nvals)

INTEGER, INTENT (IN) :: nvals

REAL, INTENT (IN), DIMENSION(*) :: data1

REAL, INTENT(OUT), DIMENSION(*) :: data2

DO i = 1, nvalsdata2(i) = 2. * data1(i)

END DO

RETURN

END SUBROUTINE process

Page 190: Curso de Fortran - ANP

192

Subrotinas e funções Subrotinas: passando vetores e matrizes

Há três maneiras de passar vetores e matrizes a uma subrotina:

– Vetores ou matrizes com forma assumida (assumed-shape): Será visto mais adiante...

Page 191: Curso de Fortran - ANP

193

Subrotinas e funções Subrotinas: passando caracteres

Para passar caracteres para uma subrotina, não há necessidade de se definir a dimensão da variável:

SUBROUTINE sample ( string )

CHARACTER(len=*), INTENT (IN) :: string

...

Na chamada da subrotina, o tamanho de string será o mesmo definido no programa principal. Dentro da subrotina, essa dimensão pode ser obtida através da função LEN ().

Page 192: Curso de Fortran - ANP

194

Subrotinas e funções Subrotinas: aplicação 2

Definição do problema:– Para um conjunto de pontos, elaborar subrotina que calcule o

valor máximo e o número da amostra relacionada a esse valor máximo. Construir, também, programa para teste da subrotina:

Entrada e saída de dados:– Subrotina: Vetor de dados (dimensão n) com os valores

(números reais). Variável real com o valor máximo e variável inteira com o número sequencial da amostra).

– Programa principal: Leitura do vetor de dados (dimensão n).

Page 193: Curso de Fortran - ANP

195

Subrotinas e funções Subrotinas: aplicação 2

Algoritmo:– Subrotina

! Inicializar “real_max” com o valor da posição 1 no vetor

! Inicializar “imax” como sendo a primeira posição

real_max = a(1)

imax = 1

! Localizar o valor máximo:

do i=2,n

if a(i) >= real_max then

real_max = a(i)

imax = i

end if

end do

Page 194: Curso de Fortran - ANP

196

Subrotinas e funções Subrotinas: aplicação 2

Algoritmo:– Programa principal

! Leitura do arquivo com o vetor de dados

! Chamada da subrotina

! Imprime valor final

Transformar os algoritmos em comandos Fortran.

Page 195: Curso de Fortran - ANP

197

Subrotinas e funções Subrotinas: o atributo SAVE

Os valores de todas as variáveis, vetores e matrizes declaradas apenas dentro da subrotina (locais) se tornam indeterminados assim que termina a execução dessa.

Se se deseja que os valores dessas variáveis não se percam entre as chamadas de uma dada subrotina, deve-se utilizar o atributo SAVE. Há três maneiras:

REAL, SAVE :: var1 ! Armazena o último valor de var1.

SAVE :: var1, var2, var3, ... ! Armazena os últimos valores de ! var1, var2, var3 (antes da

! declaração dessas variáveis).

SAVE ! Antes da declaração, salva todas ! as variáveis.

Page 196: Curso de Fortran - ANP

198

Subrotinas e funções Subrotinas: aplicação 3

Calcular a média e o desvio padrão atualizados de uma dada sequência de dados:

– O objetivo é, para cada dado informado a uma subrotina, essa calcule a média e o desvio padrão considerando os valores anteriores.

– Utiliza, basicamente, as instruções já apresentadas no programa estatística.

– Verificar o código no projeto estatistica_acumulada.

Page 197: Curso de Fortran - ANP

199

Subrotinas e funções Módulos

Suponhamos que haja um grupo de variáveis em um dado programa que será compartilhado por várias subrotinas deste programa. Esse compartilhamento pode ser feito diretamente com a criação de módulos.

Em Fortran, um módulo é uma unidade separada do programa principal, compilável, que contém a definição e/ou valores iniciais de todas as variáveis que desejamos compartilhar entre várias subrotinas.

Cada subrotina (ou mesmo o programa principal), caso compartilhem um mesmo módulo, terão acesso às mesmas variáveis e valores nelas armazenados.

Page 198: Curso de Fortran - ANP

200

Subrotinas e funções Módulos

Criando um módulo:

MODULE teste

! Objetivo:

! Exemplificar a criação de um módulo

!

IMPLICIT NONE

SAVE

INTEGER, PARAMETER :: num_vals = 5

REAL, DIMENSION (num_vals) :: values

END MODULE teste

Page 199: Curso de Fortran - ANP

201

Subrotinas e funções Módulos

Para utilizar o módulo criado, basta, na primeira linha não comentada (depois de PROGRAM ou SUBROUTINE) do programa principal ou subrotina utilizar o comando USE:

USE nome do módulo

Page 200: Curso de Fortran - ANP

202

Subrotinas e funções Módulos

Programa utilizando o módulo teste:

PROGRAM tmodulo

USE teste

IMPLICIT NONE

REAL, PARAMETER :: pi = 3.14

values = pi * (/1.,2.,3.,4.,5./)

CALL sub1

END PROGRAM tmodulo

Subrotina utilizando o módulo teste:

SUBROUTINE sub1

USE teste

WRITE (*,*) values

END SUBROUTINE sub1

Page 201: Curso de Fortran - ANP

203

Subrotinas e funções Módulos

Os módulos, além de variáveis, podem armazenar a definição de subrotinas:

MODULE my_subsIMPLICIT NONE

CONTAINSSUBROUTINE sub1 (a, b, c, x, error)IMPLICIT NONEREAL, INTENT (IN) :: b, cREAL, DIMENSION (3), INTENT (IN) :: aREAL, INTENT (OUT) :: xLOGICAL, INTENT (OUT):: error....END SUBROUTINE sub1

END MODULE my_subs

Declaração da subrotina

CONTAINS avisa que serão declaradas subrotinas

Page 202: Curso de Fortran - ANP

204

Subrotinas e funções Módulos

O emprego desse tipo de módulo é análogo ao módulo de variáveis:

PROGRAM main_prog

USE my_subs

IMPLICIT NONE

...

CALL sub1 (a, b, c, x, error)

...

END PROGRAM main_prog

Page 203: Curso de Fortran - ANP

205

Subrotinas e funções Módulos

Por que declarar subrotinas dentro de módulos se elas podem ser criadas individualmente e compiladas também individualmente?

Ao se declarar uma subrotina através de um módulo, fica disponível para o compilador todas as informações das variáveis por ela utilizadas (tipos, número, dimensões etc).

Assim, quando a unidade que a chama é compilada, o compilador checa se, nessa unidade, há correspondência entre tipos, número e dimensões em relação ao que é utilizado na subrotina (isto não é feito caso não se declare dentro do módulo).

Page 204: Curso de Fortran - ANP

206

Subrotinas e funções Módulos

Vetores ou matrizes com forma assumida:

– Quando uma subrotina é declarada utilizando-se módulos, todos os detalhes das variáveis por ela utilizada são conhecidos pela unidade que a chama. Os parâmetros passados pelo programa que a chama também são conhecidos pela subrotina.

– Assim, a subrotina conhece previamente as dimensões dos vetores ou matrizes que serão manipulados por ela. Desta forma, não seria necessário definir de forma explícita as dimensões desses arrays.

– Esta forma de declaração de vetores ou matrizes é chamada de forma assumida (assumed shape arrays).

Page 205: Curso de Fortran - ANP

207

Subrotinas e funções Módulos

Vetores ou matrizes com forma assumida:

– Definição:

REAL, DIMENSION (:,:) :: array1, array2, ...

– Exemplo de aplicação: vide projeto assumed_shape.

Page 206: Curso de Fortran - ANP

208

Subrotinas e funçõesFunções: declaração

Uma função Fortran é um procedimento cujo resultado é um número, valor lógico, caractere, matriz ou vetor:

Existem dois tipos: intrínsecas (SIN(x), COS(x), etc.) ou definidas pelo usuário (valem as mesmas recomendações feitas para as subrotinas):

FUNCTION nome ( lista de argumentos )...

Seção de declaração (DEVE INCLUIR O TIPO DE nome)...

Seção de execuçãonome = expressão

RETURN ! Opcional.END FUNCTION nome ! nome é opcional.

Page 207: Curso de Fortran - ANP

209

Subrotinas e funçõesFunções: declaração

Exemplo: função para calcular o valor do polinômio ax2 + bx + c para um dado valor x:

REAL FUNCTION quadf ( a, b, c, x)IMPLICIT NONE

REAL, INTENT(IN) :: a, b, c, x! Se não tivesse declarado diretamente quadf:! REAL, INTENT(OUT) :: quadf

quadf = a*x**2 + b*x + c

END FUNCTION quadf

Page 208: Curso de Fortran - ANP

210

Subrotinas e funçõesFunções: declaração

Exemplo: programa utilizando a função quadf:

PROGRAM teste_quadfIMPLICIT NONEREAL :: quadf ! É SEMPRE necessário declarar

! o tipo da funçãoREAL :: a, b, c, x

WRITE (*,*) ‘Entre com os coeficientes a, b e c:’READ(*,*) a, b, cWRITE (*,*) ‘Entre com o ponto x:’READ(*,*) xWRITE (*,100) ‘quadf(‘,x,’) = ‘, quadf (a, b, c, x)100 FORMAT (A, F10.4,A,F12.4)

END PROGRAM teste_quadf

Page 209: Curso de Fortran - ANP

211

Subrotinas e funçõesPassando procedimentos como argumentos

É possível passar procedimentos (funções e subrotinas) como argumentos de outras funções e subrotinas.

Para tanto, deve-se utilizar o atributo EXTERNAL na seção de declaração de variáveis.

Page 210: Curso de Fortran - ANP

212

Subrotinas e funçõesPassando procedimentos como argumentos

Exemplo:

PROGRAM teste

REAL, EXTERNAL :: fun_1, fun_2 ! Duas funções

! previamente definidas

REAL :: x, y, output

...

CALL evaluate (fun_1, x, y, output)

CALL evaluate (fun_2, x, y, output)

...

END PROGRAM teste

Page 211: Curso de Fortran - ANP

213

Subrotinas e funçõesPassando procedimentos como argumentos

Exemplo:

SUBROUTINE evaluate ( fun, a, b, result )

IMPLICIT NONE

REAL, EXTERNAL :: fun ! Declara-se a função

REAL, INTENT (IN) :: a, b

REAL, INTENT (OUT) :: result

result = b * fun(a)

END SUBROUTINE evaluate

Page 212: Curso de Fortran - ANP

214

Agenda

Introdução. Elementos básicos para programação em Fortran. Declarações condicionais. Declarações recursivas. Lendo e escrevendo dados. Operações com arquivos. Vetores e matrizes. Funções e subrotinas. Dupla precisão, complexos e tipos derivados.Dupla precisão, complexos e tipos derivados. Propostas para programas.

Page 213: Curso de Fortran - ANP

215

Dupla precisão, complexos e tipos derivadosDupla precisão

Ao longo desse curso, variáveis reais foram definidas utilizando precisão simples, que, usualmente, é alocada em 4 bytes (32 bits).

Isto permite representar adequadamente:– Números reais com até 7 algarismos significativos.– Números reais tão grandes quanto 1038 ou tão pequenos

quanto 10-38.

Em situações nas quais precisamos lidar com números com mais algarismos significativos ou maiores / menores do que os apresentados, pode-se utilizar números reais com dupla precisão.

Page 214: Curso de Fortran - ANP

216

Dupla precisão, complexos e tipos derivadosDupla precisão

Números com dupla precisão ocupam 8 bytes (64 bits) e podem representar:

– Números reais com até 16 algarismos significativos.– Números reais tão grandes quanto 10308 ou tão pequenos

quanto 10-308.

Variáveis com dupla precisão podem ser declaradas através de:

DOUBLE PRECISION :: variavel

Sugere-se representá-las, ao longo do programa, através de 1.0E0 ou -1.5E-05 etc.

Page 215: Curso de Fortran - ANP

217

Dupla precisão, complexos e tipos derivadosDupla precisão

Aritmética mista:– Quando o Fortran realiza uma operação entre um número

com dupla precisão e outro com precisão simples ou inteiro, esses últimos são, inicialmente, convertidos para dupla precisão e o resultado também é em dupla precisão.

– CUIDADO (números em azul em dupla precisão):

1.0E0 / 3. + 1 / 3 = 3.333333333333333D-01 1. / 3. + 1.0E0 / 3 = 6.666666333333333D-01 1.0E0 / 3. + 1. / 3.0E0 = 6.666666666666666D-01

– No uso de variáveis com dupla precisão, garanta que todos os resultados intermediários sejam também realizados em dupla precisão e sejam armazenados em variáveis com dupla precisão!

Page 216: Curso de Fortran - ANP

218

Dupla precisão, complexos e tipos derivadosDupla precisão

Funções intrínsecas com dupla precisão:– Em geral, as funções matemáticas disponíveis em precisão

simples também são disponibilizadas em precisão dupla. Exemplos:

Seno: SIN DSIN Cosseno: COS DCOS Tangente: TAN DTAN Log 10: LOG10 DLOG10 Ln: LOG DLOG Etc...

Simples Dupla

Page 217: Curso de Fortran - ANP

219

Dupla precisão, complexos e tipos derivadosDupla precisão

Quando utilizar dupla precisão?– O uso de variáveis com dupla precisão deve ser feita com

muito cuidado: Requer o dobro da memória de armazenamento em relação a

variáveis com simples precisão. O processamento se torna mais lento (operações mais

demoradas).

– Por outro lado, faz-se necessário quando: Necessitam-se de números reais com mais de 7 algarismos

significativos. Números reais com ordem de grandeza superior a 1038 ou

inferior a 10-38. Operações com números reais com dimensões muito distintas:

– Simples: 1.000.000,0 + 3,25 = 1.000.003,0– Dupla: 1.000.000,0 + 3,25 = 1.000.003,25

Subtração entre números reais muito próximos.

Page 218: Curso de Fortran - ANP

220

Dupla precisão, complexos e tipos derivadosAplicação 1

Elaborar um programa para calcular a derivada da função f(x) = 1 / x em um dado ponto, utilizando simples e dupla precisão.

Expressão para cálculo da derivada:

Considerar x variando entre 10-1 e 10-10.

x

xfxxfxf

dx

dx

0lim

Page 219: Curso de Fortran - ANP

221

Dupla precisão, complexos e tipos derivadosNúmeros complexos

O Fortran permite representar e operar números complexos.

Um número complexo pode ser inicializado do seguinte modo:

COMPLEX :: a1 = (3.141592,-3.141592)

que representa o número a1 = 3.141592 - 3.141592*i

real imaginária

Page 220: Curso de Fortran - ANP

222

Dupla precisão, complexos e tipos derivadosNúmeros complexos

Ou ainda...

COMPLEX, DIMENSION(256) :: array1

array1 = (0., 0.) ! Todos os elementos de array1 são nulos

COMPLEX :: a1

READ(*, ‘(2F10.2)’) a1 ! Os primeiros dez campos correspondem à ! parte real, os dez seguintes à parte

imaginária.

COMPLEX :: a1

READ (*,*) a1 ! O número complexo deve ser lido na forma, por ! exemplo, (-1.,1.)

COMPLEX :: a1 = (1.0, 0.25)

WRITE (*,*) a1 ! ! Escreve a1 = (1.000000,2.500000E-01)

Page 221: Curso de Fortran - ANP

223

Dupla precisão, complexos e tipos derivadosNúmeros complexos

Operações com números complexos e outros tipos de dados:

– O número real ou inteiro é convertido em complexo e o resultado final se torna complexo. A parte real ou inteira se torna a parte real do número complexo.

Operadores lógicos:– Pode-se utilizar os operadores == e /=, porém >, <. >=, etc.

não são possíveis (faria sentido?)

Page 222: Curso de Fortran - ANP

224

Dupla precisão, complexos e tipos derivadosNúmeros complexos

Funções intrínsecas:

– CMPLX (n1,n2) : Converte os números reais e/ou inteiros n1 e n2 em um

número complexo com parte real igual a n1 e parte complexa n2.

As funções REAL () ou INT () transformam em número real (precisão simples) ou inteiro a parte real do número complexo (a parte imaginária é desprezada).

– AIMAG(cp): Converte a parte imaginária do número complexo cp em um

número real.

Page 223: Curso de Fortran - ANP

225

Dupla precisão, complexos e tipos derivadosNúmeros complexos

Funções intrínsecas:

– CABS (c) : Calcula o módulo do número complexo c.

– CONJG(c) : Calcula o conjugado do número complexo c.

– Funções matemáticas como SIN ( ), COS ( ), LOG ( ), LOG10 ( ), entre outras também podem ser utilizadas com números complexos. Empregam-se as formas CSIN ( ), CCOS ( ), CLOG ( ), CLOG10, etc.

Page 224: Curso de Fortran - ANP

226

Dupla precisão, complexos e tipos derivadosTipos derivados

Até aqui, trabalhou-se com os tipos de dados intrínsecos ao Fortran: inteiros, reais, complexos, lógicos e caracteres.

O Fortran, entretanto, permite-nos criar nossos próprios tipos de dados. Esses tipos de dados são conhecidos como derivados.

Os tipos derivados são, na realidade, uma forma bastante conveniente de agrupar todas as informações sobre um dado item.

Page 225: Curso de Fortran - ANP

227

Dupla precisão, complexos e tipos derivadosTipos derivados

Ao contrário dos vetores e matrizes, os tipos derivados permitem que seus elementos sejam de diferentes tipos.

Sintaxe (logo após PROGRAM e USE ou dentro de módulos):

TYPE :: nome_do_tipo

definições dos componentes

...

END TYPE nome_do tipo

Page 226: Curso de Fortran - ANP

228

Dupla precisão, complexos e tipos derivadosTipos derivados

Exemplo: – Tipo derivado para definição de características pessoais:

TYPE :: pessoaCHARACTER(len=14) :: nome

CHARACTER(len=14) :: sobrenome

CHARACTER(len=9) :: telefone

INTEGER :: idade

CHARACTER :: sexo

END TYPE pessoa

– Uma vez definido o tipo, na seção de declaração de variáveis, pode ser empregado:

TYPE (pessoa) :: andre, andrea

TYPE (pessoa), DIMENSION (100) :: pessoas

Page 227: Curso de Fortran - ANP

229

Dupla precisão, complexos e tipos derivadosTipos derivados

Exemplo: – Pode-se, ainda, criar constantes com o tipo definido:

andrea = pessoa(‘Andrea’, ‘Paiva’, ’2222-4569’, 15, ‘F’)

– A constante deve ter seus parâmetros definidos segundo a ordem apresentada no comando TYPE.

Page 228: Curso de Fortran - ANP

230

Dupla precisão, complexos e tipos derivadosTipos derivados

Exemplo: – Pode-se, também, utilizar um tipo derivado como

componente de um outro tipo derivado:

TYPE :: notasTYPE (pessoa) :: aluno

REAL, DIMENSION(10) :: notas_provas

REAL :: media

END TYPE

...

TYPE (notas), DIMENSION (30) :: turma

Page 229: Curso de Fortran - ANP

231

Dupla precisão, complexos e tipos derivadosTipos derivados

Trabalha-se com esses tipos ao longo de um programa com o auxílio do símbolo %. Cada componente trabalha de modo independente.

Exemplo:– Atribuir ao aluno André a idade de 35 anos:

andre%idade = 35

– Atribuir ao 5º aluno da turma, a nota do 3º exame: turma(5)%notas_provas(3) = 9.5

– Atribuir ao 5º aluno da turma, a idade de 23 anos: turma(5)%aluno%idade = 23

Page 230: Curso de Fortran - ANP

232

Dupla precisão, complexos e tipos derivadosTipos derivados

Programa para ilustrar a aplicação de tipos derivados:

– Ver projeto tipos_derivados

Page 231: Curso de Fortran - ANP

233

Agenda

Introdução. Elementos básicos para programação em Fortran. Declarações condicionais. Declarações recursivas. Lendo e escrevendo dados. Operações com arquivos. Vetores e matrizes. Subrotinas e funções. Dupla precisão, complexos e tipos derivados. Propostas para programas.Propostas para programas.