introdução ao fortran agosto/2013. introdução formula translation system elaborado...
TRANSCRIPT
Introdução ao FortranIntrodução ao Fortran
Agosto/2013Agosto/2013
Introdução
• FORmula TRANslation System
• Elaborado especificamente para aplicações científicas e matemáticas
• Grande número de bibliotecas numéricas construído para Fortran.
• Compiladores (especialmente os livres) são fáceis de encontrar em diferentes ambientes.
Introdução
• O Fortran77 está muito obsoleto em relação às linguagens atuais e aos recursos existentes
Formato fixo: Linhas da posição 7 a 72;
Somente letras maiúsculas;Nomes de variáveis,até 6 caracteres.
• O Fortran 90 possui novos recursos na definição de um “array”, alocação de memória dinâmica, estruturas de controle, etc.
Formato livre: 132 caracteres por linha; Maiúsculas e minúsculas; Nomes de variáveis ,até 31 caracteres;
Mais de um comando por linha.
Introdução
• Compiladores
– Programa que traduz de uma linguagem de compilação para outra linguagem equivalente: código objeto.
Compiladores mais utilizados:• gfortran (gnu)• ifort (Intel Fortran)• pgf90 (pgi – Portland Group)
• Os compiladores disponíveis distinguem entre esses dois formatos através da extensão do nome do arquivo .f e .F para formato fixo .f90 e .F90 formato livre.
Instalação
tar -xvf pgroup64.tarcd pgroup ./installPasse o texto (com enter) e digite: acceptEscolha a opção: 1Escolha a opção: yPasse o texto e aceite, digitando: acceptEscolha o diretório: /home/{user}/pgiEscolha a opção para criação da licença: yPasse o texto e aceite, digitando: acceptnome: curso usuário: curso e-mail: cursoOs arquivos instalados devem ser somente de leitura: no
Criar um diretório do curso de Fortran
cd ~mkdir curso_fortrancd curso_fortran
gedit ~/.bashrcexport PGI=/home/curso/pgiexport PATH=$PGI/linux86-64/7.0/bin:$PATHexport MANPATH=$PGI/linux86/7.0/manexport LM_LICENSE_FILE=$PGI/license.dat
Instalação
Conceitos básicos
• Caracteres válidos
– Caracteres alfabéticos: sem distinção entre maiúscula e minúscula
– Caracteres numéricos: todos os dígitos de 0 até 9
Conceitos básicos
• Caracteres válidos– Caracteres especiais
<branco>
< ! > Caractere de inicio de comentários z
Conceitos básicos
• Caracteres válidos– Caracteres especiais
< & >
< ; > Caractere de separação de comandos
Conceitos básicos
• A estrutura básica de um programa FORTRAN pode ser descrita como:
PROGRAM <nome do programa>< declarações >< comandos >END PROGRAM <nome do programa>
declarações - conjunto de comandos que definem os dados a serem usados.
comandos - conjunto de comandos que serão executados, na ordem em que aparecem listados e atendendo a quaisquer desvios em seu fluxo de execução.
Conceitos básicos
• Exemplo:
PROGRAM primeiro
implicit none
print*, “Buenas tardes”
END PROGRAM primeiro
Variáveis
• Uma variável FORTRAN é um nome para uma localização de memória.
– Devem iniciar por uma letra– Podem conter letras e números
– Não faz distinção entre letras maiúsculas e minúsculas
VAR = var = Var
– Tamanho máximo de uma variável é até 31 caracteres
Declaração de variáveis
• Tipo implícito
– Variáveis iniciadas com I, J, K, L, M, ou N - variáveis inteiras– Variáveis iniciadas com outras letras - variáveis reais
• Tipo explícito– INTEGER - varáveis inteiras– REAL - variáveis reais– DOUBLE PRECISION - varáveis de dupla precisão– COMPLEX - variáveis complexas– LOGICAL - variáveis lógicas– CHARACTER - variáveis caracteres
* Recomenda-se definir todas as variáveis
implicit none - obriga a declaração de variáveis no bloco
Declaração de variáveis
• Variáveis do tipo INTEGER
Este tipo de variável armazena apenas a parte inteira de um número, exemplos de números inteiros válidos ,também denominados literais são:
123, 89312, 5Ex: INTEGER :: idade
As declarações básicas de variáveis de tipo inteiro são:
Fortran 77: INTEGER <lista de variáveis>
Fortran 90/95: INTEGER :: <lista de variáveis>
Declaração de variáveis
• Variáveis do tipo REAL
O tipo de variável real é usado para declarar variáveis de valores numéricos com casas decimais.
3.141592653, 1., -0.1Ex: REAL :: pi
As declarações básicas de variáveis de tipo real são:
Fortran 77: REAL <lista de variáveis>
Fortran 90/95: REAL :: <lista de variáveis>
Declaração de variáveis
• Variáveis do tipo COMPLEX
Este tipo complex é usado para declarar valores numéricos com parte real e parte imaginária.
(1. , .99E-2) (representando 1 + 0,99×10−2i)Ex: COMPLEX :: a(5, -5)
As declarações básicas de variáveis de tipo complex são:
Fortran 77: COMPLEX <lista de variáveis>
Fortran 90/95: COMPLEX :: <lista de variáveis>
Declaração de variáveis
• Variáveis do tipo CHARACTER
É usado para declarar variáveis do tipo caracter.Exemplos:
Character :: sexoCharacter(LEN=12) :: nome
As declarações básicas de variáveis de tipo caracter são:
Fortran 77: CHARACTER *<comprimento> <lista de variáveis>
CHARACTER <nome 1>*<comp. 1>, [<nome 2>*<comp. 2>, ...]
Fortran 90: CHARACTER (len=<comprimento>):: <lista de variáveis>
Declaração de variáveis
• Variáveis do tipo LOGICAL
Uma variável lógica só pode assumir os valores, verdadeiro ou falso. A representação dos dois estado possíveis de uma variável lógica são:ˆ
.TRUE. Verdadeiro⇒ˆ .FALSE. Falso ⇒
As declarações básicas de variáveis de tipo inteiro são:
Fortran 77: LOGICAL <lista de variáveis>
Fortran 90/95: LOGICAL :: <lista de variáveis>
Declaração de variáveis
• Declaração de uma matriz ou vetor (array)
DIMENSION Específica o número de dimensões e o número de elementos em cada dimensão davariável.
Exemplos:
INTEGER, DIMENSION(10) :: A 1 dimensão e 10 elementos
REAL, DIMENSION(2:4,2) :: B 2 dimensões e o tamanho do conjunto é 6
Declaração de variáveis
• Declaração de um parâmetro
PARAMETER A variável não poderá ter seu valor alterado
Exemplos:
INTEGER, PARAMETER :: M=10, N=20, NZ=M*N-M
REAL :: PIPARAMETER (PI=3.1415926)
Declaração de variáveis
• Alocação dinâmica de conjunto de dados
Para isso será necessário utilizar os comandos ALLOCATABLE, ALLOCATE, ALLOCATED e DEALLOCATE.
Na declaração das matrizes - ALLOCATABLE INTEGER, DIMENSION( : ), ALLOCATABLE :: A ! 1DREAL, DIMENSION( : , : ), ALLOCATABLE :: B ! 2D
Alocação de memória - ALLOCATE READ*, isizeALLOCATE(A(isize), STAT=err)ALLOCATE(B(0:isize-1,10), STAT=err)
Declaração de variáveis
• Alocação dinâmica de conjunto de dados
Verificação de memória – ALLOCATED
ALLOCATED(A)
Liberação de memória – DEALLOCATE
IF (ALLOCATED(A)) DEALLOCATE(A, STAT=err)
Compilar e excutar
gfortran <nome do programa> -o <nome do executável>Exemplo: (nedit soma.f90)
PROGRAM soma !inicia o programa chamado somaimplicit noneINTEGER :: k, n, m !declara que k,n,m são variáveis inteirasn=1 !atribui o valor 1 à variável nm=3 !atribui o valor 3 à variável mk=m+n !soma n e m, e o resultado é armazenado em kPRINT*, k !escreve na tela a variável kSTOP !para a execução do programaEND !fim do programa soma
compilar gfortran soma.f 90 -o soma.xexecutar soma.x
Expressões e operadores
• Precedência de operadores aritméticos
+ (adição)
- (subtração)
/ (divisão)
* (multiplicação)
** (exponenciação)( ) (parenteses)
- Toda expressão que vier entres parênteses, será avaliada primeiro;
Expressões e operadores
• Operador caractere
Utilizado para efetuar a concatenação “//”, somente de variáveis caracteres.
CHARACTER(LEN=*),PARAMETER :: string=‘abcdefgh’
string(1:1) ‘a’string(2:4) ‘bcd’a=string(1:1)//string(2:4) ‘abcd’ b=string//string(3:5) ‘abcdefghcde’
endereco=cidade//”-”//”Colombia” ‘Cali-Colombia’
Expressões e operadores
• Funções intrínsecas
INT(x) converte a variável x INT(14.8) = 14para inteiro
REAL(x) converte a variável x REAL(4) = 4.0para real
DBLE(x) converte a variável x DBLE(1) = 1.0para dupla precisão
NINT(x) converte a variável x NINT(3.8) = 4para o inteiro mais próximo
CHAR(x) converte a variável x CHAR(65) = Ainteira para caractere
ICHAR(x) converte a variável x ICHAR(‘A’) = 65 caractere para inteiro
LOG(x) calcula o logaritmo LOG(2.0) = 4.605170...natural
Expressões e operadores
• Funções intrínsecas
ABS(x) retorna o valor absoluto ABS(-14.8) = 14.8de uma variável real/inteira
MOD(a,b) mostra o resto da divisão MOD(5.3,2.0) = 1.3entre a e b
MAX(args) retorna o maior valor de MAX(1,2,-7,4) = 4um conjunto de variáveis inteiras
MIN(args) retorna o menor valor de MIN(1,2,-7,4) = -7um conjunto de variáveis inteiras
AMAX(args) retorna o maior valor de AMAX(1.0,2.3,5.8) = 5.8um conjunto de variáveis reais
AMIN(args) retorna o menor valor de AMIN(1.0,2.3,5.8) = 1.0um conjunto de variáveis reais
Expressões e operadores
• Funções intrínsecas
SQRT(x) retorna a raiz quadrada SQRT(9.0) = 3.0EXP(x) calcula o exponencial ex EXP(1.0) = 2.718281746LOG10(x) calcula o log na base 10 LOG10(100.0) = 2SIN(x) retorna o valor do seno SIN(3,14/2) = 1.0COS(x) retorna o valor do coseno COS(3,14/2) = 0.0TAN(x) retorna o valor da tangente TAN(3,14/2) = 1.0ASIN(x) retorna o arcoseno ASIN(1.0) = 0.0ACOS(x) retorna o arcocoseno ACOS(1.0) = ¶/2ATAN(x) retorna o arcotangente ATAN(1.0) = ¶/4 LEN(x) retorna o tamanho da LEN(‘ABCD’) = 4
variável
Expressões e operadores
• Operadores relacionais
== ou .EQ. (igual )/= ou .NE. (diferente)< ou .LT. (menor)> ou .GT. (maior)<= ou .LE. (menor ou igual)>= ou .GE. (maior ou igual)
• Operadores lógicos
.NOT. (negação lógica)
.AND. (conjunção)
.OR. (disjunção)
.EQV. (equivalência)
.NEQV. (nedgação da equivalência)
Comandos para controle de fluxo
• GO TO– Transfere o fluxo da execução para o comando que estiver
referenciado pelo rótulo n .
GO TO <n>
Exemplo:
INTEGER in 10 PRINT*, 'Entre com um numero de 1 a 10'
READ*,inPRINT*,'Numero errado ! Tente de novo.'GO TO 10
Rótulo Número inteiro colocado a frente do comando e separado do mesmo por pelo menos um espaço em branco (código em formato livre) ou nas colunas 1 a 6 de uma linha
(formato fixo)
Comandos para controle de fluxo
• IF – O valor de uma expressão lógica é testado e um único comando
é executado se e somente se o valor for verdadeiro.
IF (<expressão lógica>) <comando>
IF (x > 20) y=10
IF (M .NE. 0 .and. G .NE. 0 ) K=1/(M*G)
Comandos para controle de fluxo
• IF ... THEN ... ENDIF– Permite o desvio no fluxo de execução de um programa de
forma condicional.
IF (<expressão lógica 1>) THEN<comando 1>... comandos executados se a expr. lógica for verdade<comando n>ELSE IF (<expressão lógica 2>) THEN <comando 1>... comandos executados se a expr. lógica 1 for falsa<comando n> e a expr. lógica 2 for verdadeiraELSE<comando 1>... comandos executados se as expr lógicas 1 e 2 forem <comando n> falsasENDIF
Comandos para controle de fluxo
• DO ... END DO– Permite que um bloco de comandos seja repetitivamente
executado.
DO <variável> = <valor inicial>, <valor final>, <incremento><comando 1>...<comando n> END DO
Exemplo:
DO i=1,10,2 … ! i1 será: 1,3,5,7 … … ! 50 interações END DO
DO i=1,10 DO j=1,5 PRINT*, i,j END DO END DO
Comandos para controle de fluxo
• DO WHILE ... END DO– Permite que um bloco de comandos seja executado repetidas
vezes enquanto a condição for verdadeira.
DO WHILE (<condição>)<comando 1>...<comando n> END DO
Exemplo:
i=1DO WHILE (i <= 10) PRINT*, i
i=i+1END DO
Comandos para controle de fluxo
• STOP– Provoca o término imediato do programa (parada incondicional)
STOP [“texto”] • EXIT
– Provoca uma interrupção na execução dos comandos do bloco do DO
isto é, nenhum comando existente entre EXIT e END DO é executado.
• CYCLE– Faz com que o fluxo de execução do programa dentro do bloco do
DO seja desviado para o comando END DO e uma nova iteração será executada.
Comandos para controle de fluxo
Exemplo:
Comandos e formatos de entrada e saída
• FORMAT– Permite formatar um conjunto de caracteres.
<rótulo> FORMAT (<lista de caracteres de edição>)
Caracteres de edição - Descreve dados do tipo: rI w inteiro
rF w.d real rE w.d real, com expoente rD w.d real com dupla precisão, com expoente rG w.d rel, com ou sem expoente rL w lógico rA w caractere
rX Pula r espaços em branco
r indica o número de dados que serão lidos ou escritos com aquele formato. w representa o tamanho do campo a ser impresso d indica a quantidade de dígitos à direita do ponto decimal dentro do campo de
largura
Comandos e formatos de entrada e saída
Exemplo: PROGRAM formata_dados REAL :: var1, var2 INTEGER :: var3 LOGICAL :: var4 CHARACTER (len=7) :: var5 REAL :: var6
var1=2222.22 var2=44.44 var3=111 var4=.true. var5='america' var6=33333000
PRINT 10,var1,var2,var3,var4,var5,var6 10 FORMAT(F7.2,x,F5.2,x,I3,x,L1,x,A7,x,E11.5)
PRINT 20,var1,var2,var3,var4,var5,var6 20 FORMAT(F7.1,x,F4.2,x,I2,x,L4,x,A4,x,E8.2)
END
Comandos e formatos de entrada e saída
• PRINT– Permite escrever um conjunto de caracteres no dispositivo de
saída padrão (tela).
Exemplos: N=5340 PRINT 15, ‘O valor de n e ’,N
15 FORMAT (2x,I5)
Comandos e formatos de entrada e saída
• OPEN– Permite que se associe um arquivo externo a uma unidade de
entrada, saída ou ambos.
OPEN (unit=<no unid>,file=<nome do arq>,status=<status>)
<no unid> número inteiro não associado a outro arquivo
<status>
Comandos e formatos de entrada e saída
• READ– Permite a leitura de um conjunto de valores de um dispositivo
de entrada.
READ (<unidade>,<formato>) <var>
<unidade> número inteiro (arquivo)/ * (entrada via teclado) <formato> número inteiro (rótulo)/ * (livre)
READ (5,*) dispositivo de entrada padrão (teclado)
READ (*,501) A,B,C 501 FORMAT(3I5)
Comandos e formatos de entrada e saída
Exemplo: PROGRAM le_dados_teclado
REAL :: x,y,zREAL :: med
PRINT*, ’Entre com 3 valores...’READ(*,*) xREAD(*,*) yREAD(*,*) z
! Calculo da mediamed = (x+y+z)/3.
! Impressao do resultado no monitorPRINT*, ‘resultado: ‘,med
END PROGRAM le_dados_teclado
Comandos e formatos de entrada e saída
• WRITE– Permite que se escreva um conjunto de valores em um
dispositivo de saída.
WRITE (<unidade>,<formato>) <var>
<unidade> número inteiro (arquivo)/ * (monitor) <formato> número inteiro (rótulo)/ * (livre)
WRITE (6,*) dispositivo de saída padrão (monitor) WRITE (12,FMT=‘(I4)’) A
Comandos e formatos de entrada e saída
Exemplo: PROGRAM le_dados_tecladoREAL :: x,y,zREAL :: med
PRINT*, ’Entre com 3 valores...’READ(*,*) x
READ(*,*) yREAD(*,*) z
! Calculo da mediaMED = (x+y+z)/3.
! Impressao do resultado no monitorWRITE(*,*) ‘resultado: ‘, med
Acrescentarno programa ! Impressao do resultado no arquivo anterior OPEN(unit=12,file=‘media.txt’,status=‘new’)
WRITE(12,10) ‘resultado: ‘,med10 FORMAT(a11,f10.2)
END PROGRAM le_dados_teclado
Comandos e formatos de entrada e saída
• WRITE/READ + DO Implícito– DO implícito é usado em comandos de entrada ou saída de dados.
Exemplo: PROGRAM le_dados_teclado
REAL, DIMENSION(4) :: XINTEGER :: i
! Lendo os valores de x no arquivo fort.10READ(10,*) (X(i),i=1,4)
! Impressao de X no monitorWRITE(*,*) ‘X: ‘, (X(i),i=1,4) WRITE(*,20) (X(i),i=1,4) 20 FORMAT(2f10.3)
END PROGRAM le_dados_teclado
OBS: Criar antes o arquivo txt com 4 valores (um em cada linha)
Transforma binário em ascii
PROGRAM BITEME
PARAMETER (jm=3264)
real temp(jm), undef
integer i
real UR(jm)
character*6 hora(jm)
character*250 linha
undef=999.000
OPEN (unit=25,file='fort.15',status='old', form='unformatted')
i=1,jm
read(25)(hora(i),temp(i),UR(i))
enddo
do i=1,jm
write(15,*) (hora(i),temp(i),UR(i))
enddo
end
Tranforma ascii em binário: Program read90m
parameter(jm=3264)
real temp(jm), undef
integer i
character*6 hora(jm)
character*250 linha
undef=999.000
open(12,file='2001011512_202_PUNO_15.txt',status='old',form='formatted')
read(12,*) linha
do i=1,jm
read(12,*) (hora(i),temp(i)) ! arq ascii
print*,hora(i)
print*,temp(i)
enddo
do i=1,jm write(15) (hora(i),temp(i),UR(i)) ! arq bin p/ grads
enddo
end
Comandos e formatos de entrada e saída
• REWIND
– De forma semelhante a uma releitura, re-escritura ou verificação por leitura de um registro. O comando REWIND pode ser usado para reposicionar um arquivo, cujo número de unidade é especificado pela expressão escalar inteira <u>. Se o arquivo já estiver no seu início, ou o arquivo não exista, nada ocorre .
REWIND ([UNIT=]<u>)
REWIND 12
Comandos e formatos de entrada e saída
• BACKSPACE
– Pode acontecer em um programa que uma série de registros sejam escritos e que, por alguma razão, o último registro escrito deve ser substituído por um novo; isto é, o último registro deve ser sobrescrito. De forma similar, durante a leitura dos registros, pode ser necessário reler o último registro, ou verificar por leitura o último registro escrito.
– Se o comando for tentado quando o registro estiver no início do arquivo, nada ocorre. Se o arquivo estiver posicionado após um registro de final de arquivo, este resulta posicionado antes deste registro.
– Uma serie de comandos BACKSPACE resultará no retrocesso no número correspondente de registros.
BACKSPACE ([UNIT=]<u>)BACKSPACE 14
As subbrotinas podem conter quaisquer tipos de comandos como imprimir resultados,
abrir arquivos ou executar cálculos. As subrotinas podem ‘chamar’ outras subrotinas
ou funções.
• ChamadaCALL <nome da sub-rotina> (lista_de_parâmetros)
• EstruturaSUBROUTINE <nome_da_su-brotina> (lista de parâmetros)<definição e declaração das variáveis e constantes locais><seqüência de comandos>RETURNEND
Sub-rotinas
Sub-rotinas
Exemplo: