tutorial fortran

8

Click here to load reader

Upload: vandelio-jose-da-silva

Post on 04-Jul-2015

308 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Tutorial Fortran

1

TUTORIAL DE FORTRAN

Ana Paula Andrade Departamento de Ciências Exatas e Tecnológicas - UESC

Disciplina: Laboratório de Computação Científica I Curso: Física – Bacharelado e Licenciatura

- Para compilar um ‘códigofonte’ do GNU fortran77 f77 -C codigofonte.f (a terminação .f é obrigatória) - Para criar um arquivo executável de um código já compilado: f77 codigofonte.f -o condigofonte.exe (a terminação .exe é opcional) - Para compilar o arquivo fonte e criar o arquivo executável em seguida: f77 -O codigofonte.f -o codigofonte.exe - Para executar um programa gerado: ./nomedoprograma Itens Obrigatórios em um código fonte: - Iniciar os comandos na 7a coluna. - Linhas de comentários começam com um c na 1a coluna. - Comentários no meio da linha em diante começam com uma exclamação! Comandos Obrigatórios - para começar: program - para terminar: end - Cabeçalho na abertura do programa contendo a declaração das variáveis:

Tipo Declaração Exemplo

Inteiras Integer -5; 9; -349, 9100 Reais (precisão simples) Real 3.141516; 1.5E-3; -6.645 Precisão dupla double precision 3.141516; 1.5E-3; -6.645 Complexa Complex 2.5 + 3.9i; 0 + 5i Literal character*20 Uma seqüência de 20 caracteres Lógica Logical True ou False Constante Parameter Do tipo declarado

dimension matriz(m,n) Matriz de m linhas e n colunas do tipo default (real)

dimension matriz(0:m,0:n) Matriz cuja contagem de linhas e colunas começa no zero, ou seja uma matriz de m+1 linhas e n+1 colunas

dimension matriz(-m:m,-n:n) Matriz de 2m+1 linhas e 2n+1 colunas

real matriz(-m:m,-n:n) integer matriz(-m:m,-n:n)

Matriz

complex matriz(-m:m,-n:n)

Page 2: Tutorial Fortran

2

- Em uma lista, as variáveis devem ser separadas por vírgulas, exemplo: integer i, j, k, matrizA(0:20 , 1:3), somamatriz,n_element, n_aluno parameter (n_aluno = 20, n_nota = 3) - O comando implicit none é usado para anular variáveis implícitas. Quando usado, todas as variáveis inteiras ou não devem ser declaradas. Operadores Aritméticos:

Adição + Subtração - Multiplicação * Divisão / Potenciação ** Comando de Atribuição =

Algumas Funções Matemáticas Específicas

Raiz quadrada de um número SQRT(numero) Conversão de para um numero real REAL(numero) Parte imaginária de um número complexo AIMAG(numero) Valor absoluto de um número inteiro ou real ABS(numero) Parte inteira de um número real INT(numero) Aproximação de um número real ao inteiro mais próximo

NINT(numero)

Valor máximo de dois números (Também vale para 3 ou mais números)

MAX(numero1,numero2)

Valor mínimo de dois números MIN(numero1,numero2) Logaritmo de um número LOG(numero) Logaritmo neperiano LN(numero) Exponencial de um número EXP(numero) Cosseno de x (em radianos) COS(x) Seno de x SIN(x) Tangente de x TAN(x) Arco cosseno de x ACOS(x) Arco seno de x ASIN(x) Arco tangente de x ATAN(x)

Para abrir um arquivo open (unit = numero, file = 'nomedoarquivo', status = 'situação') unit => número inteiro que servirá de referência para o arquivo file => nome (e endereço) do arquivo a ser aberto status => situação do arquivo (new, old ou unknown) new => arquivo que obrigatoriamente não existe e deverá ser criado;

Page 3: Tutorial Fortran

3

old => arquivo que obrigatoriamente já existe; unknown => arquivo que pode ou não existir. Para mover o cursor ao início do arquivo rewind unit Para mover o cursor para o começo da linha seguinte backspace unit Para fechar o arquivo close(unit) Para ler dados não formatados no arquivo: read(unit,*)dado1,dado2 Para ler um dado não formatado do teclado read *, dado read(*,*) Para escrever dados não formatados no arquivo: write(unit,*)dado1,dado2 Para escrever dados não formatados no monitor print *,dado print *, 'Escrevendo o dado',dado write(*,*)'Escrevendo o dado',dado Para escrever dados formatados (troca-se o * por uma lista de comandos de formatação) 1 – write (unit,'lista de formataçao')dado1,dado2 2 – write (*,'lista de formatação')dado1,dado2 3 - print 40, dado1,dado2 40 format (lista de formatação) Esta lista de formatação deve conter informações sobre o tipo de variável e a formatação desejada, sendo as mais comuns:

Iw Dado inteiro com largura total de campo w. Iw.m Dado inteiro com largura total de campo w e numero mínimo de caracteres m. Fw.d Dado real com largura total de campo w e d casas decimais. nX n espaços horizontais. Ew.d Dado real em notação exponencial, com largura total de campo w e d casas

decimais. Aw Dado de caractere com largura de campo w PEw.d Dado real com p números antes da vírgula, em notação exponencial, com

largura total de campo w e d casas decimais. / Espaço vertical (saltar linha).

(Veja alguns exemplos no programa ‘formatação.f’, ao final deste texto)

Page 4: Tutorial Fortran

4

Para ler dados formatados: - a formatação deve ser especificada da mesma forma. Porém troca-se o comando write por read, sendo: read(unidade, 'lista de formatação') dado1,dado2 Para ler dados de um arquivo cujo final não se conhece bem - usa-se a função iostat, sendo: read(unidade, 'lista de formatação', iostat=var) Neste caso, ao final da leitura, o valor da variável var será um valor retornado pela função iostat, que será:

- um número positivo, caso tenha havido um erro na leitura dos dados; - um número negativo, caso o final do arquivo tenha sido encontrado sem erros; - zero se nenhum erro tenha sido encontrado, nem o final do arquivo.

Também se pode usar a função end para identificar o final de um arquivo: read(unidade, 'lista de formatação', end=5)dado1,dado2 . . . 5 close(unidade) No exemplo a seguir a identificação do final de um arquivo funciona como um comando goto, saltando procedimentos e saindo dos loops:

open(15, file = arquivoentrada, status='old') rewind 15 elementos = 0

do i = 1,1000 do j = 1,1000

read(15,*,end = 5) matriz(i,j) ! Neste caso, a leitura será continuada até que o final elementos = elementos+1 ! do arquivo seja encontrado, quando o programa

enddo ! saltará para a linha indicada pelo número 5 enddo

5 close (15) Operadores Relacionais (usados nas expressões lógicas)

Igual Eq Diferente Ne Maior Gt Menor Lt Maior e igual Ge Menor e igual Lê

Page 5: Tutorial Fortran

5

Operadores Lógicos (Conectivos)

Conjunção And Exclusão Not Disjunção Or Equivalência Eqv Não equivalência Neqv

Estrutura Condicional Simples if(expressão lógica) ... Intermediária if (expressão lógica) then . . . endif Completa if(expressão lógica) then . . Faça algo . else . . Faça outra coisa . endif Estrutura de Repetição do variável de controle = valor inicial, valor final, passo de incremento . . . enddo Exemplo: do i=1,10,2

. read (unit,*) dado . enddo

- Neste caso, i é a variável de controle, cujo valor inicial é 1, o valor final será 10 e o incremento será de 2 em 2. - Se não colocar o valor do passo, automaticamente ele assume o valor unitário. - Os valores inicial, final e o passo podem ser negativos ou mesmo números decimais.

Page 6: Tutorial Fortran

6

Outras opções:

do numero variável de controle = valor inicial, valor final, passo de incremento . . .

n continue PS: ao invés de colocar enddo, eu uso a indexação n para dizer onde continuar com o loop. Exemplo: do 10, i=1,8,2 . . . 10 continue

Repetição usando while (enquanto): i=1 do while (i.lt.10) faça algo i=i+1 enddo Neste caso o incremento da variável de repetição deve ser feito pelo usuário. Para pular atribuições Usa-se o comando => goto número da declaração Exemplo: 20 if (soma.le.limite) then soma = soma+1 goto 20 endif PS: o valor do flag (que no exemplo acima é 20) deve ser um número inteiro e deve ser colocado na segunda coluna da linha que deve dar continuidade. Outro exemplo: do i = 1,20 soma = soma+A(i) if(soma.ge.30) goto 10 endif enddo 10 continue

Page 7: Tutorial Fortran

7

Estruturas como if e do também podem ter nomes associados a elas, tipo: externo: do i = 1,10 . . . interno: do j = 1,10 . . . enddo interno enddo externo Neste caso, as palavras: externo e interno estão nomeando os loops. Para continuar a uma seqüência de comandos na linha seguinte: Usa-se o dígito 2 na 5ª coluna da linha seguinte ----------------------------------------------------------------------------------------------------------------------- A seguir, são listados os códigos-fonte de alguns algoritmos vistos em aula, são eles:

- formatacao.f => Exemplos de saída formatada;

- ordencacao.f; => Ordena uma lista de números em ordem crescente;

- ordenacaoB.f; => Outro método de ordenação; - somamatriz.f; => Soma duas matrizes;

- media_alunos.f; => Calcula a média individual dos alunos, a média global da turma, a

média dos alunos aprovados e dos reprovados.

Page 8: Tutorial Fortran

8

C Testando os tipos de formatacao C Ana Paula A Andrade (25/05/2007) Cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc program formatacao implicit none integer u,v,i real dado1,dado2 character*20 qualquer u=3 v=-2 dado1 = 2.4583344256 dado2 = 3.141529 qualquer='teste' open(10,file='saidaformatada.dat',status='unknown') rewind 10 write(10,*) '********* Saida 1 ****** ' write(10,*)u,v,dado1,dado2 write(10,*)'' write(10,*) '********* Saida 2 ****** ' write(10,'(1(I3),1(I3.2,1x),1(F8.6,1x),1(E12.6,/))') 2 u,v,dado1,dado2 write(10,*) '********* Saida 3 ****** ' write(10,'(1(I3.2),1(I3,2x),1(1pe12.6,1x),1(2pe13.6,1x,/))') 2 u,v,dado1,dado2 write(10,*) '********* Saida 4 ****** ' write(10,'(2(I2,1x),2(1pe12.6,1x),1(A5,/))') 2 u,v,dado1,dado2,qualquer close(10) c Para escrever na tela, pode-se usar o comando print print *, u,v,dado1,dado2 print * print 10,u,v,dado1,dado2 10 format((1(I3),1(I3.2,1x),1(F8.6,1x),1(E12.6,/))) print 20,u,v,dado1,dado2 20 format((1(I3.2),1(I3,2x),1(1pe12.6,1x),1(2pe13.6,1x,/))) print 30,u,v,dado1,dado2,qualquer 30 format((2(I2,1x),2(1pe12.6,1x),1(A5),/)) stop end ----------------------------------------------------------- Este programa gera uma saída formatada da seguinte forma: ********* Saida 1 ****** 3 -2 2.45833445 3.14152908 ********* Saida 2 ****** 3-02 2.458334 0.314153E+01 ********* Saida 3 ****** 03 -2 2.458334E+00 31.41529E-01 ********* Saida 4 ****** 3 -2 2.458334E+00 3.141529E+00 teste