Вы находитесь на странице: 1из 73

Introduo ao FORTRAN

Walter Collischonn IPH UFRGS

Por que FORTRAN?

Compaq FORTRAN Intel FORTRAN

O Developer Studio

Programa exemplo
PROGRAM EXEMPLO

A=10.5 WRITE(*,*) A

END PROGRAM EXEMPLO

Salvar como nome.f90 Cores mudam identificando comandos do fortran

Inserindo arquivo no programa

Criando o executvel

Testando executando ctrl F5

Tipos de Variveis
Integer Real Double precision ou Real (8) Complex Logical Character

O HELP do Compaq Fortran

Declarao implcita de variveis


Implicitamente o FORTRAN assume que variveis que iniciam com as letras A at H so reais De I at N so inteiras E de O at Z so reais

Veja o que acontece se trocamos o A pelo I no programa anterior


PROGRAM EXEMPLO

I=10.5 WRITE(*,*) I

END PROGRAM EXEMPLO

IMPLICIT NONE
fortemente sugerido que no se use a declarao implcita da variveis Isto tende a evitar confuso em programas mais complexos Para fazer isto, basta acrescentar IMPLICIT NONE No incio do programa

PROGRAM EXEMPLO IMPLICIT NONE I=10.5 WRITE(*,*) I END PROGRAM EXEMPLO

MENSAGEM DE ERRO DE COMPILAO

Aqui faltou a declarao da varivel I

MENSAGEM DE ERRO DE COMPILAO

PROGRAM EXEMPLO IMPLICIT NONE REAL A A=10.5 WRITE(*,*) A

END PROGRAM EXEMPLO

Operadores
Operador de atribuio Operadores aritmticos Operadores lgicos Operadores de combinao Operadores de variveis tipo CHARACTER

Operador de atribuio
X=10.5 Voc est dizendo que x deve ter o valor de 10.5

Operadores aritmticos
X=Y+7.5 X=Y/7.5 X=Y-7.5 X=Y*7.5 X=Y**7.5

Operadores lgicos
Atual == /= > >= < <= Antigo .EQ. .NE. .GT. .GE. .LT. .LE. Ingls Equal Not equal Greater than Greater equal than Lower than Lower equal than Igual Diferente Maior Maior ou igual Menor Menor ou igual

O resultado de operadores lgicos .true. Ou .false. Falaremos mais disso quando entrarmos no controle de operao com IF THEN - ELSE

Operadores de Combinao
AND OR ...

Operadores com CHARACTER


Concatenao de caracter Extrair pedaos Etc...

Funes Intrnsicas
Sin Cos Tan Atan Exp Abs Log Log10 Mod

...

result = SIN (x)

Ateno
Funes como sin(x), cos(x), etc supe que o argumento (x) seja dado em radianos Funes inversas como atan e acos e asin geram um valor que um ngulo em radianos

Entrada e sada padro


Write(*, . ) Fortran program Read(*, ) or Print

A Fortran program will always have default connections to the standard input and standard output. In the case of an interactive job this will be Screen and Keyboard as shown here. * Will always imply default i/o. Different compilers associate different unit channel numbers with default i/o devices. Usually 5 => keyboard , 6=>display Therefore ( READ(5, means READ(*, ) and WRITE(6,.. ) means WRITE(*,)

Melhorando o programa para receber valores do usurio


PROGRAM EXEMPLO IMPLICIT NONE REAL A !A=10.5 WRITE(*,*)'ENTRE O VALOR DE A' READ(*,*)A WRITE(*,*) A OBSERVE QUE FICA VERDE VIRA COMENTRIO

END PROGRAM EXEMPLO

Com entrada via teclado

Reading from a file

Data.fil

Fortran program
Open( Unit=12,File=data.fil,action=read)
READ(12, ) READ(12, ) READ(12, ) REWIND( UNIT=12 ) CLOSE( UNIT=12 )

PROGRAM EXEMPLO IMPLICIT NONE REAL A,B,C OPEN(12,FILE='ENTRADA.TXT',ACTION='READ') READ(12,*)A READ(12,*)B READ(12,*)C

WRITE(*,*) A,B,C

END PROGRAM EXEMPLO

Writing to a file
output.fil

Fortran program
Open( Unit=12,File=output.fil,action=WRITE)
WRITE(12, ) WRITE(12, ) WRITE(12, ) CLOSE( UNIT=12 )

PROGRAM EXEMPLO IMPLICIT NONE REAL A,B,C REAL RESULTADO OPEN(12,FILE='ENTRADA.TXT',ACTION='READ') OPEN(13,FILE='SAIDA.TXT',ACTION='WRITE') READ(12,*)A READ(12,*)B READ(12,*)C

RESULTADO=A+B+C WRITE(13,*)RESULTADO

END PROGRAM EXEMPLO

Verificar resultado no arquivo SAIDA.txt

Outra forma de usar o HELP


Clique F1 com o cursor sobre um comando do FORTRAN Por, exemplo, sobre OPEN

STATUS de um arquivo
New Old Unknown

PROGRAM EXEMPLO IMPLICIT NONE REAL A,B,C REAL RESULTADO OPEN(12,FILE='ENTRADA.TXT',ACTION='READ',STATUS='OLD') OPEN(13,FILE='SAIDA.TXT',ACTION='WRITE',STATUS='UNKNOWN') READ(12,*)A READ(12,*)B READ(12,*)C

RESULTADO=A+B+C WRITE(13,*)RESULTADO

END PROGRAM EXEMPLO

Controle de execuo
IF ... THEN ... ELSE DO LOOP SELECT CASE

DO ... ENDDO
Ler um arquivo de chuvas ou vazes com N valores.

Exemplo
Arquivo 64700000.txt contm 6939 dados de vazo de um posto fluviomtrico
1 2 3 4 5 6 7 8 ... 31 12 2003 28.327350 1 1 1 1 1 1 1 1 1985 1985 1985 1985 1985 1985 1985 1985 37.432750 46.807060 38.729910 31.963270 29.525150 28.525980 29.927600 30.940580

PROGRAMA PARA LER APENAS 1 DIA


PROGRAM EXEMPLO IMPLICIT NONE REAL Q INTEGER IDIA,IMES,IANO OPEN(12,FILE='64700000.TXT',ACTION='READ',STATUS='OLD') READ(12,*)IDIA,IMES,IANO,Q WRITE(*,*)IDIA,IMES,IANO,Q CLOSE (12) END PROGRAM EXEMPLO

Programa para ler todos os 6939 dias


PROGRAM EXEMPLO IMPLICIT NONE REAL Q INTEGER IDIA,IMES,IANO INTEGER I OPEN(12,FILE='64700000.TXT',ACTION='READ',STATUS='OLD') DO I=1,6939 READ(12,*)IDIA,IMES,IANO,Q WRITE(*,*)IDIA,IMES,IANO,Q ENDDO CLOSE (12) END PROGRAM EXEMPLO

Programa para ler todos os 6939 dias


PROGRAM EXEMPLO IMPLICIT NONE REAL Q INTEGER IDIA,IMES,IANO INTEGER I OPEN(12,FILE='64700000.TXT',ACTION='READ',STATUS='OLD') DO I=1,6939 READ(12,*)IDIA,IMES,IANO,Q WRITE(*,*)IDIA,IMES,IANO,Q ENDDO CLOSE (12) END PROGRAM EXEMPLO Recuo de um espao ou de um tab, para facilitar leitura

IF ... THEN ... ELSE


Vamos supor que s queremos mostrar valores de vazo superiores a 100 m3/s

PROGRAM EXEMPLO IMPLICIT NONE REAL Q INTEGER IDIA,IMES,IANO INTEGER I OPEN(12,FILE='64700000.TXT',ACTION='READ',STATUS='OLD') DO I=1,6939 READ(12,*)IDIA,IMES,IANO,Q IF(Q>100.0)THEN WRITE(*,*)IDIA,IMES,IANO,Q ENDIF ENDDO CLOSE (12) END PROGRAM EXEMPLO

Ainda If ... Then ... else


Agora queremos encontrar o maior valor da srie

PROGRAM EXEMPLO IMPLICIT NONE REAL Q INTEGER IDIA,IMES,IANO INTEGER I REAL QMAX OPEN(12,FILE='64700000.TXT',ACTION='READ',STATUS='OLD') QMAX=0.0 DO I=1,6939 READ(12,*)IDIA,IMES,IANO,Q IF(Q>QMAX)THEN QMAX=Q WRITE(*,*)'NOVO QMAX=',QMAX ENDIF ENDDO CLOSE (12) END PROGRAM EXEMPLO

Select Case
Vamos identificar quantos dias tem em cada ms

Outros tipos de DO LOOP


SAIR USANDO EXIT PROSSEGUIR USANDO CYCLE

Parameter
Integer, Parameter
Varivel que no ser alterada no programa INTEGER, PARAMETER (PI=3.141592)

Select Case (livro do Chapman)

Exemplo Select Case


Vamos supor que em algum ponto de um programa precisamos saber quantos dias tem um ms. O ms pode ter 28, 29, 30 ou 31 dias Poderamos usar Select Case para isto

Exemplo de programa
PROGRAM EXEMPLO IMPLICIT NONE INTEGER MES INTEGER NDIAS WRITE(*,*) ' ENTRE O NUMERO DO MES' READ(*,*)MES SELECT CASE (MES) CASE(1,3,5,7,8,10,12) !SE O MES FOR JAN, MAR, MAI, JUL, AGO, OUT, DEZ ENTO O MES TEM 31 DIAS NDIAS=31 WRITE(*,*)NDIAS,' DIAS' CASE(4,6,9,11) !SE O MES FOR ABR, JUN, SET, NOV ENTO O MES TEM 30 DIAS NDIAS=30 WRITE(*,*)NDIAS,' DIAS' CASE(2) WRITE(*,*)'FEVEREIRO PODE TER 28 OU 29 DIAS' END SELECT END PROGRAM

Anos bissextos
Como saber se um ano bissexto?

PROGRAM EXEMPLO IMPLICIT NONE INTEGER MES INTEGER NDIAS INTEGER IANO WRITE(*,*) ' ENTRE O NUMERO DO MES READ(*,*)MES SELECT CASE (MES) CASE(1,3,5,7,8,10,12) !SE O MES FOR JAN, MAR, MAI, JUL, AGO, OUT, DEZ ENTO O MES TEM 31 DIAS NDIAS=31 WRITE(*,*)NDIAS,' DIAS' CASE(4,6,9,11) !SE O MES FOR ABR, JUN, SET, NOV ENTO O MES TEM 30 DIAS NDIAS=30 WRITE(*,*)NDIAS,' DIAS' CASE(2) WRITE(*,*)'FEVEREIRO PODE TER 28 OU 29 DIAS' WRITE(*,*) WRITE(*,*)'ENTRE O ANO' READ(*,*)IANO IF(MOD(IANO,400)==0)THEN NDIAS=29 !ANO BISSEXTO ELSE IF (MOD(IANO,100)==0)THEN NDIAS=28 !NO ANO BISSEXTO ELSE IF (MOD(IANO,4)==0)THEN NDIAS=29 !ANO BISSEXTO ELSE NDIAS=28 !NO ANO BISSEXTO ENDIF WRITE(*,*) WRITE(*,*)NDIAS,' DIAS' END SELECT END PROGRAM

Arrays ou matrizes
Grupo de variveis do mesmo tipo (inteiro, real, logical, character) que recebem um nico nome Um valor individual dentro de um array ou matriz um elemento da matriz

Array ou matriz

Declarando variveis array

Declarando arrays
Em alguns casos conveniente declarar diferente:

Real, dimension (1900:2010) :: P

Voltando ao programa que l dados de vazo de um arquivo


PROGRAM EXEMPLO IMPLICIT NONE REAL Q INTEGER IDIA,IMES,IANO INTEGER I REAL QMAX OPEN(12,FILE='64700000.TXT',ACTION='READ',STATUS='OLD') QMAX=0.0 !INICIALIZAMOS O VALOR DE QMAX DO I=1,6939 READ(12,*)IDIA,IMES,IANO,Q IF(Q>QMAX)THEN QMAX=Q WRITE(*,*)'NOVO QMAX=',QMAX ENDIF ENDDO CLOSE (12) END PROGRAM EXEMPLO

Voltando ao programa que l dados de vazo de um arquivo


PROGRAM EXEMPLO IMPLICIT NONE REAL Q(10000) INTEGER IDIA,IMES,IANO INTEGER I REAL QMAX OPEN(12,FILE='64700000.TXT',ACTION='READ',STATUS='OLD') QMAX=0.0 !INICIALIZAMOS O VALOR DE QMAX DO I=1,6939 READ(12,*)IDIA,IMES,IANO,Q(I) IF(Q(I)>QMAX)THEN QMAX=Q(I) WRITE(*,*)'NOVO QMAX=',QMAX ENDIF ENDDO CLOSE (12) END PROGRAM EXEMPLO

Programa para encontrar mximo


PROGRAM EXEMPLO IMPLICIT NONE REAL Q(10000) INTEGER IDIA,IMES,IANO INTEGER I REAL QMAX OPEN(12,FILE='64700000.TXT',ACTION='READ',STATUS='OLD') QMAX=0.0 !INICIALIZAMOS O VALOR DE QMAX DO I=1,6939 READ(12,*)IDIA,IMES,IANO,Q(I) IF(Q(I)>QMAX)THEN QMAX=Q(I) ENDIF ENDDO WRITE(*,*)'QMAX=',QMAX CLOSE (12) END PROGRAM EXEMPLO

Agora usando FORTRAN 90


PROGRAM EXEMPLO IMPLICIT NONE REAL Q(10000) INTEGER IDIA,IMES,IANO INTEGER I REAL QMAX OPEN(12,FILE='64700000.TXT',ACTION='READ',STATUS='OLD') QMAX=0.0 !INICIALIZAMOS O VALOR DE QMAX DO I=1,6939 READ(12,*)IDIA,IMES,IANO,Q(I) ENDDO QMAX=MAXVAL(Q) WRITE(*,*)'QMAX=',QMAX CLOSE (12) END PROGRAM EXEMPLO

Desafio
Reescreva o programa para encontrar o mnimo

Desafio
Reescreva o programa para descobrir tambm a data em que ocorre o mximo

Colocar valores em ordem


Algoritmo clssico Ordenamento de valores em ordem crescente ou decrescente Utilidade em Hidrologia:
Curva de permanncia Hierarquizao de solues de algoritmo gentico Etc...

ALGORITMO SIMPLES E LENTO


PROGRAM EXEMPLO IMPLICIT NONE REAL Q(6939) INTEGER IDIA,IMES,IANO INTEGER I REAL QAUX LOGICAL ORGANIZADO OPEN(12,FILE='64700000.TXT',ACTION='READ',STATUS='OLD') DO I=1,6939 READ(12,*)IDIA,IMES,IANO,Q(I) ENDDO !COLOCAR EM ORDEM CRESCENTE DO ORGANIZADO=.TRUE. DO I=2,6939 IF(Q(I)<Q(I-1))THEN !ORDEM EST TROCADA QAUX=Q(I-1) Q(I-1)=Q(I) Q(I)=QAUX ORGANIZADO=.FALSE. ENDIF ENDDO IF(ORGANIZADO)EXIT !CASO NO TENHA REALIZADO NENHUMA TROCA SAI DO LOOP ENDDO !TERMINOU DE REORDENAR DO I=1,6939 WRITE(*,*)Q(I) ENDDO CLOSE (12) END PROGRAM EXEMPLO

Desafio
Calcule a Q90 utilizando como base o programa anterior Lembre-se que a Q90 a vazo que apenas maior do que 10% das vazes observadas.

Desafio
Calcule toda a curva de permanncia de 1 em 1% Salve o resultado num arquivo de sada

Fim de arquivo
PROGRAM LE_ARQUIVO IMPLICIT NONE INTEGER NDADOS INTEGER IDIA,IMES,IANO REAL BOBO OPEN(UNIT=14,FILE='64700000.TXT',ACTION='READ',STATUS='OLD') NDADOS=0 DO WHILE (.NOT. EOF(14)) READ (14, *) IDIA,IMES,IANO,BOBO !WRITE(*,*) IDIA,IMES,IANO,BOBO NDADOS = NDADOS + 1 END DO WRITE(*,*)'O NUMERO DE DADOS: ',NDADOS CLOSE(14) END PROGRAM