apostila fortran - prof. rudi gaelzer ufpel

Upload: joao-marcos-lenhardt-silva

Post on 06-Jul-2015

765 views

Category:

Documents


0 download

TRANSCRIPT

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

k

lic

C

m

C

lic

k

to

bu

y

N.c

O Ww.d oc u -tr a c k

!

w

o

.d o

c u -tr a c k

.c

Introduo ao Fortran 90/95 ca

Apostila preparada para a disciplina de Modelos Computacionais da F sica I, ministrada para o Curso de Licenciatura em F sica do Departamento de F sica, Instituto de F sica e Matemtica, Fundao Universidade a ca Federal de Pelotas, Pelotas - RS.

In cio: Janeiro de 2005.

Verso: 24 de fevereiro de 2009 a

o

m

ww

ww

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

k

lic

C

m

C

lic

k

to

bu

y

N.c

O Ww.d oc u -tr a c k

!

w

o

.d o

c u -tr a c k

.c

o

m

ww

ww

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

k

lic

C

m

C

lic

k

to

bu

y

N.c

O Ww.d oc u -tr a c k

!

w

o

.d o

c u -tr a c k

.c

Sumrio aReferncias Bibliogrcas e a 1 Introduo ca 1.1 As origens da Linguagem Fortran . . . . . . . . . . 1.2 O padro Fortran 90 . . . . . . . . . . . . . . . . . a 1.2.1 Recursos novos do Fortran 90 . . . . . . . . 1.2.2 Recursos em obsolescncia do Fortran 90 . e 1.2.3 Recursos removidos do Fortran 90 . . . . . 1.3 Uma reviso menor: Fortran 95 . . . . . . . . . . . a 1.3.1 Recursos novos do Fortran 95 . . . . . . . . 1.3.2 Recursos em obsolescncia do Fortran 95 . e 1.3.3 Recursos removidos do Fortran 95 . . . . . 1.4 O Fortran no Sculo XXI: Fortran 2003 . . . . . . e 1.4.1 Recursos novos do Fortran 2003 . . . . . . . 1.4.2 Recursos em obsolescncia do Fortran 2003 e 1.4.3 Recursos removidos do Fortran 2003 . . . . 1.5 O novo padro: Fortran 2008 . . . . . . . . . . . . a 1.5.1 Recursos novos do Fortran 2008 . . . . . . . 1.6 Comentrios sobre a bibliograa . . . . . . . . . . a 1.7 Agradecimentos . . . . . . . . . . . . . . . . . . . . 2 Formato do Cdigo-Fonte o 2.1 Formato do programa-fonte . . 2.2 Nomes em Fortran 90/95 . . . 2.3 Entrada e sa padres . . . . da o 2.4 Conjunto de caracteres aceitos v 1 1 2 3 3 4 4 4 5 5 6 6 6 7 7 7 8 8 9 9 11 11 12 13 13 14 14 15 15 17 17 17 17 18 18 19 21 22 22 22 23 23

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

3 Tipos de Variveis a 3.1 Declarao de tipo de varivel . . . . . . . . . . ca a 3.2 Variveis do tipo INTEGER . . . . . . . . . . . . a 3.3 Variveis do tipo REAL . . . . . . . . . . . . . . a 3.4 Variveis do tipo COMPLEX . . . . . . . . . . . . a 3.5 Variveis do tipo CHARACTER . . . . . . . . . . . a 3.6 Variveis do tipo LOGICAL . . . . . . . . . . . . a 3.7 O conceito de espcie (kind) . . . . . . . . . . . e 3.7.1 Fortran 77 . . . . . . . . . . . . . . . . . 3.7.2 Fortran 90/95 . . . . . . . . . . . . . . . 3.7.2.1 Compilador Intel Fortran 3.7.2.2 Compilador gfortran . . . . . 3.7.2.3 Compilador F . . . . . . . . . . 3.7.2.4 Literais de diferentes espcies . e 3.7.3 Funes intr co nsecas associadas ` espcie a e 3.7.3.1 KIND(X) . . . . . . . . . . . . 3.7.3.2 SELECTED_REAL_KIND(P,R) . . 3.7.3.3 SELECTED_INT_KIND(R) . . . . 3.8 Tipos derivados . . . . . . . . . . . . . . . . . . i

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

o

m

ww

ww

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr a c k

4 Expresses e Atribuies Escalares o co 4.1 Regras bsicas . . . . . . . . . . . . . . . . . . a 4.2 Expresses numricas escalares . . . . . . . . . o e 4.3 Atribuies numricas escalares . . . . . . . . . co e 4.4 Operadores relacionais . . . . . . . . . . . . . . 4.5 Expresses e atribuies lgicas escalares . . . . o co o 4.6 Expresses e atribuies de caracteres escalares o co 5 Comandos e Construtos de Controle de Fluxo 5.1 Comandos obsoletos do Fortran 77 . . . . . . . 5.1.1 Rtulos (statement labels) . . . . . . . . o 5.1.2 Comando GO TO incondicional . . . . . . 5.1.3 Comando GO TO computado . . . . . . . 5.1.4 Comando IF aritmtico . . . . . . . . . e 5.1.5 Comandos ASSIGN e GO TO atribu . . do 5.1.6 Laos DO rotulados . . . . . . . . . . . . c 5.2 Comando e construto IF . . . . . . . . . . . . . 5.2.1 Comando IF . . . . . . . . . . . . . . . 5.2.2 Construto IF . . . . . . . . . . . . . . . 5.3 Construto CASE . . . . . . . . . . . . . . . . . . 5.4 Construto DO . . . . . . . . . . . . . . . . . . . 5.4.1 Construto DO ilimitado . . . . . . . . . . 5.4.2 Instruo EXIT . . . . . . . . . . . . . . ca 5.4.3 Instruo CYCLE . . . . . . . . . . . . . ca

.c

w

o

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

27 27 28 29 30 30 32 35 35 35 36 36 36 37 37 38 38 38 39 41 43 43 44 47 47 51 53 54 54 54 55 55 57 58 58 59 59 59 60 61 64 64 64 67 67 67 68 68 68 69 69 70 70 70 71 71

.d o

c u -tr a c k

.c

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

6 Processamento de Matrizes 6.1 Terminologia e especicaes de matrizes . . . . . co 6.2 Expresses e atribuies envolvendo matrizes . . . o co 6.3 Sees de matrizes . . . . . . . . . . . . . . . . . . co 6.3.1 Subscritos simples . . . . . . . . . . . . . . 6.3.2 Tripleto de subscritos . . . . . . . . . . . . 6.3.3 Vetores de subscritos . . . . . . . . . . . . . 6.4 Atribuies de matrizes e sub-matrizes . . . . . . . co 6.5 Matrizes de tamanho zero . . . . . . . . . . . . . . 6.6 Construtores de matrizes . . . . . . . . . . . . . . . 6.6.1 A funo intr ca nseca RESHAPE. . . . . . . . . 6.6.2 A ordem dos elementos de matrizes . . . . . 6.7 Rotinas intr nsecas elementais aplicveis a matrizes a 6.8 Comando e construto WHERE . . . . . . . . . . . . . 6.8.1 Comando WHERE . . . . . . . . . . . . . . . 6.8.2 Construto WHERE . . . . . . . . . . . . . . . 6.9 Matrizes alocveis . . . . . . . . . . . . . . . . . . a 6.10 Comando e construto FORALL . . . . . . . . . . . . 6.10.1 Comando FORALL . . . . . . . . . . . . . . . 6.10.2 Construto FORALL . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .

7 Rotinas Intr nsecas 7.1 Categorias de rotinas intr nsecas . . . . . . . . . . . . . 7.2 Declarao e atributo INTRINSIC . . . . . . . . . . . . . ca 7.3 Funes inquisidoras de qualquer tipo . . . . . . . . . . co 7.4 Funes elementais numricas . . . . . . . . . . . . . . . co e 7.4.1 Funes elementais que podem converter . . . . . co 7.4.2 Funes elementais que no convertem . . . . . . co a 7.5 Funes elementais matemticas . . . . . . . . . . . . . co a 7.6 Funes elementais lgicas e de caracteres . . . . . . . . co o 7.6.1 Converses caractere-inteiro . . . . . . . . . . . . o 7.6.2 Funes de comparao lxica . . . . . . . . . . . co ca e 7.6.3 Funes elementais para manipulaes de strings co co 7.6.4 Converso lgica . . . . . . . . . . . . . . . . . . a oAutor: Rudi Gaelzer IFM/UFPel

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

Impresso: 24 de fevereiro de 2009

o

m

ii

SUMARIO

k

lic

lic

k

to

bu

y

N

O W

!

ww

ww

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

c u -tr a c k

.c

7.7

7.8

7.9

7.10 7.11 7.12

7.13

7.14

7.15 7.16 7.17

Funes no-elementais para manipulao de strings . . . . . . co a ca 7.7.1 Funo inquisidora para manipulao de strings . . . . . ca ca 7.7.2 Funes transformacionais para manipulao de strings co ca Funes inquisidoras e de manipulaes numricas . . . . . . . co co e 7.8.1 Modelos para dados inteiros e reais . . . . . . . . . . . . 7.8.2 Funes numricas inquisidoras . . . . . . . . . . . . . . co e 7.8.3 Funes elementais que manipulam quantidades reais . . co 7.8.4 Funes transformacionais para valores de espcie (kind) co e Rotinas de manipulao de bits . . . . . . . . . . . . . . . . . . ca 7.9.1 Funo inquisidora . . . . . . . . . . . . . . . . . . . . . ca 7.9.2 Funes elementais . . . . . . . . . . . . . . . . . . . . . co 7.9.3 Subrotina elemental . . . . . . . . . . . . . . . . . . . . Funo de transferncia . . . . . . . . . . . . . . . . . . . . . . ca e Funes de multiplicaao vetorial ou matricial . . . . . . . . . . co c Funes transformacionais que reduzem matrizes . . . . . . . . co 7.12.1 Caso de argumento unico . . . . . . . . . . . . . . . . . 7.12.2 Argumento opcional DIM . . . . . . . . . . . . . . . . . . 7.12.3 Argumento opcional MASK . . . . . . . . . . . . . . . . . Funes inquisidoras de matrizes . . . . . . . . . . . . . . . . . co 7.13.1 Status de alocao . . . . . . . . . . . . . . . . . . . . . ca 7.13.2 Limites, forma e tamanho . . . . . . . . . . . . . . . . . Funes de construo e manipulao de matrizes . . . . . . . . co ca ca 7.14.1 Funo elemental MERGE . . . . . . . . . . . . . . . . . . ca 7.14.2 Agrupando e desagrupando matrizes . . . . . . . . . . . 7.14.3 Alterando a forma de uma matriz . . . . . . . . . . . . 7.14.4 Funo transformacional para duplicao . . . . . . . . ca ca 7.14.5 Funes de deslocamento matricial . . . . . . . . . . . . co 7.14.6 Transposta de uma matriz . . . . . . . . . . . . . . . . . Funes transformacionais para localizao geomtrica . . . . . co ca e Funo transformacional para dissociao de ponteiro . . . . . ca ca Subrotinas intr nsecas no-elementais . . . . . . . . . . . . . . . a 7.17.1 Relgio de tempo real . . . . . . . . . . . . . . . . . . . o 7.17.2 Tempo da CPU . . . . . . . . . . . . . . . . . . . . . . . 7.17.3 Nmeros aleatrios . . . . . . . . . . . . . . . . . . . . . u o

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

71 71 71 72 72 72 73 73 73 74 74 75 75 75 75 75 76 76 76 76 76 77 77 77 77 78 78 78 78 78 79 79 79 79

8 Sub-Programas e Mdulos o 8.1 Unidades de programa . . . . . . . . . . . . . . . . . . . . . . 8.1.1 Programa principal . . . . . . . . . . . . . . . . . . . . 8.1.2 Rotinas externas . . . . . . . . . . . . . . . . . . . . . 8.1.3 Mdulos . . . . . . . . . . . . . . . . . . . . . . . . . . o 8.2 sub-programas . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2.1 Funes e subrotinas . . . . . . . . . . . . . . . . . . . co 8.2.2 Rotinas internas . . . . . . . . . . . . . . . . . . . . . 8.2.3 Argumentos de sub-programas . . . . . . . . . . . . . 8.2.4 Comando RETURN . . . . . . . . . . . . . . . . . . . . . 8.2.5 Atributo e declarao INTENT . . . . . . . . . . . . . . ca 8.2.6 Rotinas externas e bibliotecas . . . . . . . . . . . . . . 8.2.7 Interfaces impl citas e expl citas . . . . . . . . . . . . . 8.2.8 Argumentos com palavras-chave . . . . . . . . . . . . 8.2.9 Argumentos opcionais . . . . . . . . . . . . . . . . . . 8.2.10 Tipos derivados como argumentos de rotinas . . . . . 8.2.11 Matrizes como argumentos de rotinas . . . . . . . . . 8.2.11.1 Matrizes como argumentos em Fortran 77 . . 8.2.11.2 Matrizes como argumentos em Fortran 90/95 8.2.12 sub-programas como argumentos de rotinas . . . . . . 8.2.13 Funes de valor matricial . . . . . . . . . . . . . . . . co 8.2.14 Recursividade e rotinas recursivas . . . . . . . . . . . 8.2.15 Atributo e declarao SAVE . . . . . . . . . . . . . . . caAutor: Rudi Gaelzer IFM/UFPel

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

81 . 81 . 81 . 83 . 83 . 83 . 83 . 85 . 85 . 86 . 86 . 88 . 88 . 90 . 93 . 94 . 94 . 94 . 96 . 99 . 100 . 103 . 105

Impresso: 24 de fevereiro de 2009

o

m

SUMARIO

iii

k

lic

lic

k

to

bu

y

N

O W

!

ww

w

w

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr a c k

.c

w

o

.d o

c u -tr a c k

.c

8.3

8.4

8.2.16 Funes de efeito lateral e rotinas puras . . . . . . . . . . . . . co 8.2.17 Rotinas elementais . . . . . . . . . . . . . . . . . . . . . . . . . Mdulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o 8.3.1 Dados globais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.3.2 Rotinas de mdulos . . . . . . . . . . . . . . . . . . . . . . . . o 8.3.3 Atributos e declaraes PUBLIC e PRIVATE . . . . . . . . . . . . co 8.3.4 Interfaces e rotinas genricas . . . . . . . . . . . . . . . . . . . e 8.3.5 Estendendo rotinas intr nsecas via blocos de interface genricos e Ambito (Scope) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.4.1 Ambito dos rtulos . . . . . . . . . . . . . . . . . . . . . . . . . o 8.4.2 Ambito dos nomes . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

. . . . . . . . . . .

106 108 109 110 113 115 116 120 120 120 121 123 123 127 131 131 134 135 136 137 137 138 141 147 148 148 151 151 151 151

9 Comandos de Entrada/Sa de Dados da 9.1 Comandos de Entrada/Sa da: introduo rpida ca a 9.2 Declarao NAMELIST . . . . . . . . . . . . . . . . ca 9.3 Unidades lgicas . . . . . . . . . . . . . . . . . . o 9.4 Comando OPEN . . . . . . . . . . . . . . . . . . . 9.5 Comando READ . . . . . . . . . . . . . . . . . . . 9.6 Comandos PRINT e WRITE . . . . . . . . . . . . . 9.7 Comando FORMAT e especicador FMT= . . . . . . 9.8 Descritores de edio . . . . . . . . . . . . . . . . ca 9.8.1 Contadores de repetio . . . . . . . . . . ca 9.8.2 Descritores de edio de dados . . . . . . ca 9.8.3 Descritores de controle de edio . . . . . ca 9.8.4 Descritores de edio de strings . . . . . . ca 9.9 Comando CLOSE . . . . . . . . . . . . . . . . . . 9.10 Comando INQUIRE . . . . . . . . . . . . . . . . . 9.11 Outros comandos de posicionamento . . . . . . . 9.11.1 Comando BACKSPACE . . . . . . . . . . . . 9.11.2 Comando REWIND . . . . . . . . . . . . . . 9.11.3 Comando ENDFILE . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . .

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 24 de fevereiro de 2009

o

m

iv

SUMARIO

k

lic

lic

k

to

bu

y

N

O W

!

ww

ww

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

k

lic

C

m

C

lic

k

to

bu

y

N.c

O Ww.d oc u -tr a c k

!

w

o

.d o

c u -tr a c k

.c

Referncias Bibliogrcas e a[1] Intel Fortran Compiler for Linux. http://www.intel.com/software/products/compilers/in/docs/manuals.htm. Acesso em: 01 jun. 2005. [2] MARSHALL, A. C. Fortran 90 Course Notes. http://www.liv.ac.uk/HPC/HTMLFrontPageF90.html, 1996. Acesso em: 01 jun. 2005. [3] METCALF, MICHAEL, REID, JOHN. Fortran 90/95 Explained. New York : Oxford University Press, 1996, 345 + xv pp. [4] PAGE, CLIVE G. Professional Programers Guide to Fortran77. http://www.star.le.ac.uk/ cgp/prof77.pdf, Leicester, 2001. Acesso em: 01 jun. 2005. [5] RAMSDEN, S., LIN, F., PETTIPHER, M. A., NOLAND, G. S., BROOKE, J. M. Fortran 90. A Conversion Course for Fortran 77 Programmers. http://www.hpctec.mcc.ac.uk/hpctec/courses/Fortran90/F90course.html, 1995. Acesso em: 01 jun. 2005. [6] REID, JOHN. The New Features of Fortran 2003. tran/john reid new 2003.pdf, 2004. Acesso em: 03 Jun. 2006. http://www.kcl.ac.uk/kis/support/cit/for-

v

o

m

ww

ww

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr a c k

.c

w

o

.d o

c u -tr a c k

.c

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 24 de fevereiro de 2009

o

m

vi

REFERENCIAS BIBLIOGRAFICAS

k

lic

lic

k

to

bu

y

N

O W

!

ww

ww

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

k

lic

C

m

C

lic

k

to

bu

y

N.c

O Ww.d oc u -tr a c k

!

w

o

.d o

c u -tr a c k

.c

Cap tulo 1

Introduo caI dont know what the technical characteristics of the standard language for scientic and engineering computation in the year 2000 will be... but I know it will be called Fortran. John Backus Esta apostila destina-se ao aprendizado da Linguagem de Programao Fortran 95. ca

1.1

As origens da Linguagem Fortran

Programao no per ca odo inicial do uso de computadores para a soluo de problemas em f ca sica, qu mica, engenharia, matemtica e outras reas da cincia era um processo complexo e tedioso ao extremo. Programaa a e dores necessitavam de um conhecimento detalhado das instrues, registradores, endereos de memria e outros co c o constituintes da Unidade Central de Processamento (CPU1 ) do computador para o qual eles escreviam o cdigo. o O Cdigo-Fonte era escrito em um notao numrica denominada cdigo octal. Com o tempo, cdigos mnemo ca e o o o nicos foram introduzidos, uma forma de programao conhecida como cdigo numrico ou cdigo Assembler. ca o e o Estes cdigos eram traduzidos em instrues para a CPU por programas conhecidos como Assemblers. Durante o co os anos 50 cou claro que esta forma de programao era de todo inconveniente, no m ca nimo, devido ao tempo necessrio para se escrever e testar um programa, embora esta forma de programao possibilitasse um uso a ca otimizado dos recursos da CPU. Estas diculdades motivaram que um time de programadores da IBM, liderados por John Backus, desenvolvessem uma das primeiras chamadas linguagem de alto-n vel, denominada FORTRAN (signicando FORmula TRANslation). Seu objetivo era produzir uma linguagem que fosse simples de ser entendida e usada, mas que gerasse um cdigo numrico quase to eciente quanto a linguagem Assembler. Desde o in o e a cio, o Fortran era to simples de ser usado que era poss programar frmulas matemticas quase como se estas fossem escritas a vel o a de forma simblica. Isto permitiu que programas fossem escritos mais rapidamente que antes, com somente o uma pequena perda de ecincia no processamento, uma vez que todo cuidado era dedicado na construo do e ca compilador, isto , no programa que se encarrega de traduzir o cdigo-fonte em Fortran para cdigo Assembler e o o ou octal. Mas o Fortran foi um passo revolucionrio tambm porque o programadores foram aliviados da tarefa tediosa a e de usar Assembler, assim concentrando-se mais na soluo do problema em questo. Mais importante ainda, ca a computadores se tornaram acess veis a qualquer cientista ou engenheiro disposto a devotar um pequeno esforo c na aquisio de um conhecimento bsico em Fortran; a tarefa da programao no estava mais restrita a um ca a ca a corpus pequeno de programadores especialistas. O Fortran disseminou-se rapidamente, principalmente nas reas da f a sica, engenharia e matemtica, uma a vez que satisfazia uma necessidade premente dos cientistas. Inevitavelmente, dialetos da linguagem foram desenvolvidos, os quais levaram a problemas quando havia necessidade de se trocar programas entre diferentes computadores. O dialeto de Fortran otimizado para processadores fabricados pela IBM, por exemplo, geralmente gerava erro quando se tentava rodar o mesmo programa em um processador Burroughs, ou em outro qualquer. Assim, em 1966, aps quatro anos de trabalho, a Associao Americana de Padres (American Standards o ca o Association), posteriormente Instituto Americano Nacional de Padres (American National Standards Institute, o ou ANSI) originou o primeiro padro para uma linguagem de programao, agora conhecido como Fortran a ca 66. Essencialmente, era uma subconjunto comum de vrios dialetos, de tal forma que cada dialeto poderia a1 Do

ingls: Central Processing Unit. e

1

o

m

ww

ww

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

c u -tr a c k

.c

ser reconhecido como uma extenso do padro. Aqueles usurios que desejavam escrever programas portveis a a a a deveriam evitar as extenses e restringir-se ao padro. o a O Fortran trouxe consigo vrios outros avanos, alm de sua facilidade de aprendizagem combinada com a c e um enfoque em execuo eciente de cdigo. Era, por exemplo, uma linguagem que permanecia prxima (e ca o o explorava) o hardware dispon vel, ao invs de ser um conjunto de conceitos abstratos. Ela tambm introduziu, e e atravs das declaraes COMMON e EQUIVALENCE, a possibilidade dos programadores controlarem a alocao da e co ca armazenagem de dados de uma forma simples, um recurso que era necessrio nos primrdios da computao, a o ca quando havia pouco espao de memria, mesmo que estas declaraes sejam agora consideradas potencialmente c o co perigosas e o seu uso desencorajado. Finalmente, o cdigo fonte permitia espaos em branco na sua sintaxe, o c liberando o programador da tarefa de escrever cdigo em colunas rigidamente denidas e permitindo que o corpo o do programa fosse escrito da forma desejada e visualmente mais atrativa. A proliferao de dialetos permaneceu um problema mesmo aps a publicao do padro Fortran 66. A ca o ca a primeira diculdade foi que muitos compiladores no aderiram ao padro. A segunda foi a implementao, em a a ca diversos compiladores, de recursos que eram essenciais para programas de grande escala, mas que eram ignorados pelo padro. Diferentes compiladores implementavam estes recursos de formas distintas. a Esta situao, combinada com a existncia de falhas evidentes na linguagem, tais como a falta de construes ca e co estruturadas de programao, resultaram na introduo de um grande nmero de pr-processadores. Estes eram ca ca u e programas que eram capazes de ler o cdigo fonte de algum dialeto bem denido de Fortran e gerar um segundo o arquivo com o texto no padro, o qual ento era apresentado ao compilador nesta forma. Este recurso provia a a uma maneira de estender o Fortran, ao mesmo tempo retendo a sua portabilidade. O problema era que embora os programas gerados com o uso de um pr-processador fossem portveis, podendo ser compilados em diferentes e a computadores, o cdigo gerado era muitas vezes de uma diculdade proibitiva para a leitura direta. o Estas diculdades foram parcialmente removidas pela publicao de um novo padro, em 1978, conhecido ca a como Fortran 77. Ele inclu diversos novos recursos que eram baseados em extenses comerciais ou pra o e processadores e era, portanto, no um subconjunto comum de dialetos existentes, mas sim um novo dialeto por a si s. O per o odo de transio entre o Fortran 66 e o Fortran 77 foi muito mais longo que deveria, devido aos ca atrasos na elaborao de novas verses dos compiladores e os dois padres coexistiram durante um intervalo de ca o o tempo considervel, que se estendeu at meados da dcada de 80. Eventualmente, os fabricantes de compiladores a e e passaram a liber-los somente com o novo padro, o que no impediu o uso de programas escritos em Fortran a a a 66, uma vez que o Fortran 77 permitia este cdigo antigo por compatibilidade. Contudo, diversas extenses no o o a foram mais permitidas, uma vez que o padro no as incluiu na sua sintaxe. a a

1.2

O padro Fortran 90 a

Aps trinta anos de existncia, Fortran no mais era a unica linguagem de programao dispon o e a ca vel para os programadores. Ao longo do tempo, novas linguagens foram desenvolvidas e, onde elas se mostraram mais adequadas para um tipo particular de aplicao, foram adotadas em seu lugar. A superioridade do Fortran ca sempre esteve na rea de aplicaes numricas, cient a co e cas, tcnicas e de engenharia. A comunidade de usurios e a do Fortran realizou um investimento gigantesco em cdigos, com muitos programas em uso freqente, alguns o u com centenas de milhares ou milhes de linhas de cdigo. Isto no signicava, contudo, que a comunidade eso o a tivesse completamente satisfeita com a linguagem. Vrios programadores passaram a migrar seus cdigos para a o linguagens tais como Pascal, C e C++. Para levar a cabo mais uma modernizao da linguagem, o comit tcca e e nico X3J3, aprovado pela ANSI, trabalhando como o corpo de desenvolvimento do comit da ISO (International e Standards Organization, Organizao Internacional de Padres) ISO/IEC JTC1/SC22/WG5 (doravante conheca o cido como WG5), preparou um novo padro, inicialmente conhecido como Fortran 8x, e agora como Fortran a 90. Quais eram as justicativas para continuar com o processo de reviso do padro da linguagem Fortran? Alm a a e de padronizar extenses comerciais, havia a necessidade de modernizao, em resposta aos desenvolvimentos nos o ca conceitos de linguagens de programao que eram explorados em outras linguagens tais como APL, Algol, Pascal, ca Ada, C e C++. Com base nestas, o X3J3 podia usar os bvios benef o cios de conceitos tais como ocultamento de dados. Na mesma linha, havia a necessidade de fornecer uma alternativa ` perigosa associao de armazenagem a ca de dados, de abolir a rigidez agora desnecessria do formato xo de fonte, bem como de aumentar a segurana a c na programao. Para proteger o investimento em Fortran 77, todo o padro anterior foi mantido como um ca a subconjunto do Fortran 90. Contudo, de forma distinta dos padres prvios, os quais resultaram quase inteiramente de um esforo o e c de padronizar prticas existentes, o Fortran 90 muito mais um desenvolvimento da linguagem, na qual so a e a introduzidos recursos que so novos em Fortran, mas baseados em experincias em outras linguagens. Os recursos a e novos mais signicativos so a habilidade de manipular matrizes usando uma notao concisa mais poderosa e a a caAutor: Rudi Gaelzer IFM/UFPel Impresso: 24 de fevereiro de 2009

o

m

2

1.2. O padro Fortran 90 a

k

lic

lic

k

to

bu

y

N

O W

!

ww

ww

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

c u -tr a c k

.c

habilidade de denir e manipular tipos de dados denidos pelo programador. O primeiro destes recursos leva a uma simplicao na escrita de muitos problemas matemticos e tambm torna o Fortran uma linguagem mais ca a e eciente em supercomputadores. O segundo possibilita aos programadores a expresso de seus problemas em a termos de tipos de dados que reproduzem exatamente os conceitos utilizados nas sua elaboraes. co

1.2.1

Recursos novos do Fortran 90

Um resumo dos novos recursos dado a seguir: e O Fortran 90 possui uma maneira para rotular alguns recursos antigos como em obsolescncia (isto , e e tornando-se obsoletos). Operaes de matrizes. co Ponteiros. Recursos avanados para computao numrica usando um conjunto de funes inquisidoras numricas. c ca e co e Parametrizao dos tipos intr ca nsecos, permitindo o suporte a inteiros curtos, conjuntos de caracteres muito grandes, mais de duas precises para variveis reais e complexas e variveis lgicas agrupadas. o a a o Tipos de dados derivados, denidos pelo programador, compostos por estruturas de dados arbitrrias e de a operaes sobre estas estruturas. co Facilidades na denio de coletneas denominadas mdulos, uteis para denies globais de dados e para ca a o co bibliotecas de subprogramas. Exigncia que o compilador detecte o uso de construes que no se conformam com a linguagem ou que e co a estejam em obsolescncia. e Um novo formato de fonte, adequado para usar em um terminal. Novas estruturas de controle, tais como SELECT CASE e uma nova forma para os laos DO. c A habilidade de escrever subprogramas internos e subprogramas recursivos e de chamar subprogramas com argumentos opcionais. Alocao dinmica de dados (matrizes automticas, matrizes alocveis e ponteiros). ca a a a Melhoramentos nos recursos de entrada/sa de dados. da Vrios novos subprogramas intr a nsecos.

Todos juntos, estes novos recursos contidos em Fortran 90 iro assegurar que o padro continue a ser bem a a sucedido e usado por um longo tempo. O Fortran 77 continua sendo suportado como um subconjunto durante um per odo de adaptao. ca Os procedimentos de trabalho adotados pelo comit X3J3 estabelecem um per e odo de aviso prvio antes que e qualquer recurso existente seja removido da linguagem. Isto implica, na prtica, um ciclo de reviso, que para a a o Fortran de cerca de cinco anos. A necessidade de remoo de alguns recursos evidente; se a unica ao e ca e ca adotada pelo X3J3 fosse de adicionar novos recursos, a linguagem se tornaria grotescamente ampla, com muitos tens redundantes e sobrepostos. A soluo nalmente adotada pelo comit foi de publicar como uma apndice ca e e ao padro um conjunto de duas listas mostrando quais os a tens que foram removidos e quais so os candidatos a para uma eventual remoo. ca A primeira lista contm os recursos removidos (deleted features). A segunda lista contm os recursos em e e obsolescncia (obsolescent features), os quais so considerados obsoletos e redundantes, sendo assim candidatos e a ` remoo na prxima reviso da linguagem. a ca o a

1.2.2

Recursos em obsolescncia do Fortran 90 e

Os recursos em obsolescncia do Fortran 90 so: e a IF aritmtico; e desvio para uma declarao END IF a partir de um ponto fora de seu bloco; caAutor: Rudi Gaelzer IFM/UFPel Impresso: 24 de fevereiro de 2009

o

m

Cap tulo 1. Introduo ca

3

k

lic

lic

k

to

bu

y

N

O W

!

ww

ww

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

variveis reais e de dupla preciso nas expresses de controle de um comando DO; a a o nalizao compartilhada de blocos DO, bem como nalizao por uma declarao ou comando distintos ca ca ca de um CONTINUE ou de um END DO; declarao ASSIGN e comando GO TO atribu ca do; RETURN alternativo; comando PAUSE; especicadores FORMAT atribu dos; descritor de edio H. ca

c u -tr a c k

.c

1.2.390.

Recursos removidos do Fortran 90

Uma vez que Fortran 90 contm o Fortran 77 como subconjunto, esta lista permaneceu vazia para o Fortran e

1.3

Uma reviso menor: Fortran 95 a

Seguindo a publicao do padro Fortran 90 em 1991, dois signicativos desenvolvimentos posteriores refeca a rentes ` linguagem Fortran ocorreram. O primeiro foi a continuidade na operao dos dois comits de regulaa ca e mentao do padro da linguagem: o X3J3 e o WG5; o segundo desenvolvimento foi a criao do Frum Fortran ca a ca o de Alta Performance (High Performance Fortran Forum, ou HPFF). Logo no inicio de suas deliberaes, os comits concordaram na estratgia de denir uma reviso menor no co e e a Fortran 90 para meados da dcada de 90, seguida por uma reviso de maior escala para o in dos anos 2000. e a cio Esta reviso menor passou a ser denominada Fortran 95. a O HPFF teve como objetivo a denio de um conjunto de extenses ao Fortran tais que permitissem a ca o construo de cdigos portveis quando se zesse uso de computadores paralelos para a soluo de problemas ca o a ca envolvendo grandes conjuntos de dados que podem ser representados por matrizes regulares. Esta verso do a Fortran cou conhecida como o Fortran de Alta Performance (High Performance Fortran, ou HPF), tendo como linguagem de base o Fortran 90, no o Fortran 77. A verso nal do HPF consiste em um conjunto de instrues a a co que contm o Fortran 90 como subconjunto. As principais extenses esto na forma de diretivas, que so vistas e o a a pelo Fortran 90 como comentrios, mas que so reconhecidas por um compilador HPF. Contudo, tornou-se a a necessria tambm a incluso de elementos adicionais na sintaxe, uma vez que nem todos os recursos desejados a e a puderam ser acomodados simplesmente na forma de diretivas. ` A medida que os comits X3J3 e WG5 trabalhavam, este comunicavam-se regularmente com o HPFF. Era e evidente que, para evitar o surgimento de dialetos divergentes de Fortran, havia a necessidade de incorporar a sintaxe nova desenvolvida pelo HPFF no novo padro da linguagem. De fato, os recursos do HPF constituem a as novidades mais importantes do Fortran 95. As outras mudanas consistem em correes, claricaes e c co co interpretaes do novo padro. Estas se tornaram prementes quando os novos compiladores de Fortran 90 co a foram lanados no mercado e utilizados; notou-se uma srie de erros e detalhes obscuros que demandavam c e reparaes. Todas estas mudanas foram inclu co c das no novo padro Fortran 95, que teve a sua verso inicial a a lanada no prprio ano de 1995.2 c o O Fortran 95 compat com o Fortran 90, exceto por uma pequena alterao na funo intr e vel ca ca nseca SIGN (seo 7.4.2) e a eliminao de recursos t ca ca picos do Fortran 77, declarados em obsolescncia no Fortran 90. Os e detalhes do Fortran 95 foram nalizados em novembro de 1995 e o novo padro ISO foi nalmente publicado a em outubro de 1996.

1.3.1

Recursos novos do Fortran 95

Os novos recursos do Fortran 95 esto discutidos ao longo desta apostila. Em relao ao Fortran 90, foram a ca introduzidos os seguintes recursos: Concordncia aprimorada com o padro de aritmtica de ponto utuante binria da IEEE (IEEE 754 ou a a e a IEC 559-1989).2 Fortran

95, Commitee Draft, May 1995. ACM Fortran Forum, v. 12, n. 2, June 1995.

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 24 de fevereiro de 2009

o

m

4

1.3. Uma reviso menor: Fortran 95 a

k

lic

lic

k

to

bu

y

N

O W

!

ww

ww

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

Rotinas (procedures) puras (seo 8.2.16). ca Rotinas (procedures) elementais (seo 8.2.17). ca Dealocao automtica de matrizes alocveis (pgina 63). ca a a a Comando e construto FORALL (seo 6.10). ca Extenses do construto WHERE (pgina 60). o a Funes especicadoras. co Inicializao de ponteiro e a funo NULL (seo 7.16). ca ca ca Inicializao de componentes de tipo derivado (pgina 25). ca a Funes elementares CEILING, FLOOR e SIGN (sees 7.4.1 e 7.4.2). co co Funes transformacionais (7.15). co Subrotina intr nseca CPU_TIME (seo 7.17.2). ca Comentrio na entrada de uma lista NAMELIST (pgina 130). a a Descritores de edio com largura de campo m ca nimo. Especicao genrica na clusula END INTERFACE. ca e a

c u -tr a c k

.c

1.3.2

Recursos em obsolescncia do Fortran 95 e

Os recursos abaixo entraram na lista em obsolescncia do Fortran 95 e, portanto, pouco ou nada foram e comentados ao longo desta Apostila. Formato xo de fonte. Comando GO TO computado. Declarao de varivel de caractere na forma CHARACTER*. ca a Declaraes DATA entre comandos executveis. co a Funes denidas em uma linha (statement functions). co Extenso assumida de caracteres quando estas so resultados de funes. a a co

1.3.3

Recursos removidos do Fortran 95

Cinco recursos foram removidos do padro da linguagem Fortran 95 e, portanto, no sero mais aceitos por a a a compiladores que respeitam o padro Fortran 95. a Indices de laos DO do tipo real (qualquer espcie). c e Declarao ASSIGN e comando GO TO atribu e uso de um inteiro atribu por ASSIGN em uma declarao ca do do ca FORMAT. Desvio para uma declarao END IF a partir de um ponto fora do bloco. ca Comando PAUSE. Descritor de edio H. caAutor: Rudi Gaelzer IFM/UFPel Impresso: 24 de fevereiro de 2009

o

m

Cap tulo 1. Introduo ca

5

k

lic

lic

k

to

bu

y

N

O W

!

ww

ww

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

1.4

O Fortran no Sculo XXI: Fortran 2003 e

.d o

c u -tr a c k

.c

O Fortran 2003 novamente uma reviso grande do padro anterior: Fortran 95. A verso curta (draft) do e a a a novo padro foi divulgada em nais de 20033 e tornou-se desde ento o novo padro da linguagem, embora at a a a e o presente momento nenhum compilador apresenta suporte completo do novo padro. As grandes novidades a introduzidas foram: um direcionamento ainda maior para programao orientada a objeto, a qual oferece uma ca maneira efetiva de separar a programao de um cdigo grande e complexo em tarefas independentes e que ca o permite a construo de novo cdigo baseado em rotinas j existentes e uma capacidade expandida de interface ca o a com a linguagem C, necessria para que os programadores em Fortran possam acessar rotinas escritas em C e a para que programadores de C possam acessar rotinas escritas em Fortran. Esta Apostila no ir abordar os novos recursos introduzidos pelo Fortran 2003, limitando-se a list-los. a a a

1.4.1

Recursos novos do Fortran 2003

Os principais recursos introduzidos pelo padro so: a a Aprimoramentos dos tipos derivados: tipos derivados parametrizados, controle melhorado de acessibilidade, construtores de estrutura aperfeioados e nalizadores. c Suporte para programao orientada a objeto: extenso de tipo e herana (inheritance), polimorsmo ca a c (polymorphism), alocao dinmica de tipo e rotinas (procedures) ligadas a tipo. ca a Aperfeioamentos na manipulao de dados: componentes alocveis de estruturas, argumentos mudos aloc ca a cveis, parmetros de tipo deferidos (deferred type parameters), atributo VOLATILE, especicao expl a a ca cita de tipo em construtores de matrizes e declaraes de alocao, aperfeioamentos em ponteiros, expresses co ca c o de inicializao estendidas e rotinas intr ca nsecas aperfeioadas. c Aperfeioamentos em operaes de Entrada/Sa (E/S) de dados: transferncia ass c co da e ncrona, acesso de uxo (stream access), operaes de transferncia especicadas pelo usurio para tipos derivados, conco e a trole especicado pelo usurio para o arredondamento em declaraes FORMAT, constantes nomeadas para a co unidades pr-conectadas, o comando FLUSH, regularizao de palavras-chave e acesso a mensagens de erro. e ca Ponteiros de rotinas (procedure pointers). Suporte para as excees do padro de aritmtica binria de ponto utuante ISO/IEC 559, anteriormente co a e a conhecido como padro IEEE 754. a Interoperabilidade com a linguagem de programao C. ca Suporte aperfeioado para internacionalizao: acesso ao conjunto de caracteres de 4 bytes ISO 10646 c ca and escolha de v rgula ou ponto como separador de parte inteira e parte decimal em operaes de E/S co numricas formatadas. e Integrao aperfeioada com o sistema operacional hospedeiro: acesso a argumentos de linha de comando, ca c variveis de ambiente e mensagens de erro do processador. a

1.4.2

Recursos em obsolescncia do Fortran 2003 e

Nesta lista permanecem tens que j estavam na lista de obsolescncia do Fortran 95. Os critrios para a e e incluso nesta lista continuam sendo: recursos redundantes e para os quais mtodos melhores estavam dispon a e veis no Fortran 95. A lista dos tens em obsolescncia do Fortran 2003 : e e IF aritmtico. e END DO compartilhado por dois ou mais laos e trmino de um lao em uma clusula distinta de END DO c e c a ou CONTINUE. RETURN alternativo. Comando GO TO computado. Funes denidas em uma linha (statement functions). co3 Ver

o draft em: http://www.dkuug.dk/jtc1/sc22/open/n3661.pdf.

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 24 de fevereiro de 2009

o

m

6

1.4. O Fortran no Sculo XXI: Fortran 2003 e

k

lic

lic

k

to

bu

y

N

O W

!

ww

ww

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

Declaraes DATA entre comandos executveis. co a Funes de caractere de extenso assumida. co a Formato xo da fonte. Forma CHARACTER* da declarao CHARACTER. ca

c u -tr a c k

.c

1.4.3

Recursos removidos do Fortran 2003

Um recurso removido do novo padro se este for considerado redundante e praticamente sem uso pela e a comunidade, devido a novos recursos muito mais uteis na construo do cdigo. ca o A lista de recursos removidos no Fortran 2003, divulgada no draft, repete os recursos removidos do Fortran 95. Portanto, nenhum outro recurso foi removido.

1.5

O novo padro: Fortran 2008 a

Embora ainda no exista nenhum compilador que suporte completamente o padro atual, Fortran 2003, j a a a est em fase de concluso as discusses a respeito do padro futuro: Fortran 2008. A verso curta (draft) do a a o a a novo padro deve ser divulgada ao nal do ano de 2008. a O Fortran 2008, embora pelo procedimento adotado pelos comits X3J3/WG5 devesse ser uma reviso menor e a do Fortran 2003, pode vir a apresentar algumas novidades substanciais, tais como as co-matrizes (co-arrays). Os detalhes completos dos novos recursos ainda no foram plenamente divulgados para o pblico em geral, mas a u alguns dos tens que iro compor o novo padro, por consenso, esto listados a seguir. a a a

1.5.1

Recursos novos do Fortran 2008

Com base em material de divulgao obtido na World Wide Web, os seguintes recursos sero inclu ca a dos: Co-matrizes (co-arrays). BITS, originalmente denominados objetos sem tipo (TYPELESS). Macros inteligentes (no lugar de mdulos parametrizados). o Atributo CONTIGUOUS. Laos DO concorrentes (DO CONCURRENT). c Interoperabilidade de ponteiros, objetos alocveis, matrizes de forma assumida e argumentos opcionais. a Execuo de programas externos. ca Ponteiro alocvel em resoluo genrica a ca e Rotina interna como argumento real Inicializao de ponteiros com alvos distintos de NULL(). ca Rotinas intr nsecas estendidas. Operao de E/S recursivas a distintas unidades. ca ...Autor: Rudi Gaelzer IFM/UFPel Impresso: 24 de fevereiro de 2009

o

m

Cap tulo 1. Introduo ca

7

k

lic

lic

k

to

bu

y

N

O W

!

ww

ww

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

1.6

Comentrios sobre a bibliograa a

.d o

c u -tr a c k

.c

Para escrever esta apostila, z uso de um nmero restrito de publicaes, algumas das quais so de livre u co a acesso atravs da internet. e Para informaes a respeito do padro existente na linguagem Fortran 77, a qual foi substitu pelo co a da Fortran 90/95, utilizei freqentemente o livro de Clive Page: Professional Programers Guide to Fortran u 77 [4]. A principal fonte de informao sobre o padro do Fortran 90/95 foi o amplo livro de Michael Metcalf e ca a John Reid: Fortran 90/95 Explained [3]. O curso virtual de Fortran 90 oferecido pela Universidade de Liverpool [2]. O curso virtual de Fortran 90 para programadores que j conhecem o Fortran 77, oferecido pela Universia dade de Manchester [5]. O manual de referncia ` Linguagem Fortran 90/95 que acompanha o compilador intel tambm foi freqene a e u temente consultado [1]. Informaes divulgadas sobre o Fortran 2003 foram obtidas do livreto de John Reid [6]. co

1.7

Agradecimentos

Durante o desenvolvimento e divulgao desta apostila, diversas pessoas contribuiram com o seu aprimoraca mento ao apontar erros e inconsistncias e ao oferecer sugestes quanto a sua estrutura e contedo. e o u Gostaria de agradecer publicamente as contribuies das seguintes pessoas: Leandro Tezani. co

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 24 de fevereiro de 2009

o

m

8

1.6. Comentrios sobre a bibliograa a

k

lic

lic

k

to

bu

y

N

O W

!

ww

ww

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

k

lic

C

m

C

lic

k

to

bu

y

N.c

O Ww.d oc u -tr a c k

!

w

o

.d o

c u -tr a c k

.c

Cap tulo 2

Formato do Cdigo-Fonte oNeste cap tulo estuda-se, inicialmente, um formato bsico para o programa-fonte em Fortran 90/95 e os tipos a de variveis e suas caracter a sticas bsicas. a

2.1

Formato do programa-fonte

Em Fortran h trs formatos bsicos de arquivos que so utilizados: a e a a Programa-Fonte. Trata-se do programa e/ou dos subprogramas escritos pelo programador, usando algum tipo de editor de texto, de acordo com as regras denidas pela linguagem de programao de alto n ca vel. Programa-Objeto. Trata-se do programa-fonte compilado pelo compilador. Esta a transcrio realizada e ca pelo compilador do programa-fonte fornecido pelo programador para uma linguagem de baixo n vel, como Assembler ou outro cdigo diretamente interpretvel pela CPU. O programa-objeto no pode ainda ser o a a executado; necessria ainda passar-se pela fase do linking (traduo livre: linkagem). e a ca Programa executvel. Aps a fase de compilao, onde os programas objetos so criados, o agente de compia o ca a lao aciona o linker, o qual consiste em um programa especial que agrupa os programas objetos de forma ca a criar um arquivo nal, o programa executvel, o qual pode ser ento executado pelo programador. a a Nesta seo ser apresentada a estrutura bsica de um programa-fonte em Fortran 90/95. ca a a O Fortran 90/95 suporta duas formas de cdigo-fonte: o formato antigo do Fortran 77, agora denominado o formato xo e o novo formato livre. Fortran 77: O formato xo foi utilizado pelo Fortran desde a primeira verso at o Fortran 77. Este formato a e foi determinado pelas restries impostas pelos cartes perfurados, que eram a unica opo para entrar com o co o ca cdigo fonte. A estrutura do formato xo a seguinte: o e Colunas 1-5: rtulos (labels) para desvio de processamento do programa. o Coluna 6: caractere de continuao de linha. ca Colunas 7-72: cdigo fonte. o H, ainda, a possibilidade de incluir o caractere C ou c na coluna 1, o que instrui o compilador a ignorar a tudo que segue neste linha. Esta a forma encontrada para se colocar comentrios dentro do cdigo fonte. a a o Fortran 90/95: No formato livre no h uma coluna espec a a ca para iniciar o programa. Pode-se comear a c escrever o cdigo a partir da coluna 1 e a linha de cdigo pode se estender at a coluna 132. Alm disso, os o o e e caracteres em branco so irrelevantes em qualquer lugar do cdigo, exceto quanto estiverem sendo utilizados a o entre apstrofes. Neste caso cada caractere em branco ser avaliado na composio nal do string. o a ca Mais de uma instruo pode ser colocada na mesma linha. O separador de linhas padro o ponto-e-v ca a e rgula ;. Mltiplos ; em uma linha, com ou sem brancos, so considerados como um separador simples. Desta u a forma, a seguinte linha de cdigo interpretada como 3 linhas em seqncia1 : o e ue1 Este

recurso no aceito pelo compilador em uso. a e

9

o

m

ww

ww

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

c u -tr a c k

.c

A = 0; B = 0; C = 0 O caractere ampersand & a marca de continuao, isto , ele indica que a linha com instrues imedie ca e co atamente posterior continuao da linha onde o & foi digitado. Desta forma, so permitidas at 39 linhas e ca a e adicionais de cdigo. Como exemplo, a seguinte linha de cdigo: o o X = (-Y + ROOT_OF_DISCRIMINANT)/(2.0*A) tambm pode ser escrita usando o &: e X = (-Y + ROOT_OF_DISCRIMINANT) /(2.0*A) & &

Para entrar com comentrios em qualquer ponto do cdigo-fonte, o usurio deve digitar o ponto de exclamao a o a ca ! em qualquer coluna de uma linha. Todo o restante da linha ser desprezado pelo compilador. Exemplo: a X = Y/A - B ! Soluciona a equa~o linear. ca O programa Al Mame. o a Como primeiro exemplo de programa em Fortran 90/95, considere o seguinte cdigo-fonte: o program p r i m e i r o i m p l i c i t none print * , Al Mame o a end program p r i m e i r o A forma mais simples de um programa em Fortran 90/95 a seguinte: e PROGRAM co a a END PROGRAM Comparando com o exemplo do programa primeiro, a declarao ca PROGRAM primeiro sempre a primeira instruo de um programa. Ela serve para identicar o cdigo ao compilador. e ca o Em seguida vm as declara~es de variveis. Neste ponto, so denidas as variveis a ser usadas pelo e co a a a programa. Caso no seja necessrio declarar variveis, como no programa primeiro, recomendvel2 incluir, a a a e a pelo menos, a instruo implicit none. Esta instrui o compilador a exigir que todas as variveis usadas pelo ca a programa tenham o seu tipo explicitamente denido. Aps declaradas as variveis, vm os comandos executveis. No caso do programa primeiro, o unico o a e a comando executvel empregado foi a print *, Al^ Mam~e o a o qual tem como conseqncia a impresso do texto Al Mame na tela do monitor, o qual a chamada sa ue a o a e da padro. a Finalmente, o programa encerrado com a instruo e ca end program primeiro Os recursos utilizados no programa primeiro sero explicados com mais detalhes neste e nos prximos cap a o tulos da apostila.2 Para

o compilador empregado neste curso, obrigatrio. e o

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 24 de fevereiro de 2009

o

m

10

2.1. Formato do programa-fonte

k

lic

lic

k

to

bu

y

N

O W

!

ww

ww

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

2.2

Nomes em Fortran 90/95

c u -tr a c k

.c

Um programa em Fortran 90/95 faz referncia a muitas entidades distintas, tais como programas, subproe gramas, mdulos, variveis, etc. Os nomes destas entidades devem consistir em caracteres alfanumricos, de 1 o a e a 31 caracteres. Os caracteres alfanumricos vlidos so: e a a Letras (a - z; A - Z). Numerais (0 - 9). O caractere underscore .

A unica restrio que o primeiro caractere seja uma letra. Os seguintes exemplos so vlidos: ca e a a A A_COISA X1 MASSA Q123 TEMPO_DE_VOO j estes exemplos no so vlidos: a a a a 1A (comea com numeral) c A COISA (espao em branco) c $SINAL (contm caractere no alfanumrico). e a e

2.3

Entrada e sa padres da o

O Fortran 90 possui trs comandos de entrada/sa de dados. A maneira mais direta de denir valores de e da variveis ou de exibir os valores destas atravs dos dispositivos de entrada/sa padres. a e e da o O dispositivo padro de entrada de dados o teclado. O comando de leitura para o programa ler os valores a e das variveis : a e READ *, a READ(*,*) a onde lista de variveis so as variveis que devero receber seus valores via teclado. O usurio deve entrar a a a a a com os valores das variveis separando-as por v a rgulas. O dispositivo padro de sa de dados a tela do monitor. H dois comandos de sa padro de dados: a da e a da a PRINT *, [[,]][] a WRITE(*,*) [[,]][] a O programa a seguir instrui o computador a ler o valor de uma varivel real a partir do teclado e, ento, a a imprimir o valor desta na tela do monitor: program l e v a l o r i m p l i c i t none real : : a print * , I n f o r m e o v a l o r de a : read * , a print * , Valor l i d o : , a end program l e v a l o r No programa acima, foi declarada a varivel real a, cujo valor ser lido pelo computador, a partir do teclado, a a e ento impresso na tela do monitor. E importante salientar que a instruo implicit none deve ser sempre a ca a segunda linha de um programa, sub-programa ou mdulo, aparecendo antes do restante das declaraes de o co variveis. a Esta seo apresentou somente um uso muito simples dos recursos de Entrada/Sa de dados. Uma descrio ca da ca mais completa destes recursos ser realizada no cap a tulo 9 na pgina 123. aAutor: Rudi Gaelzer IFM/UFPel Impresso: 24 de fevereiro de 2009

o

m

Cap tulo 2. Formato do Cdigo-Fonte o

11

k

lic

lic

k

to

bu

y

N

O W

!

ww

w

w

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

c u -tr a c k

.c

Tabela 2.1: Caracteres especiais do Fortran 90/95

Caractere = + * / ( ) , . $ :

Nome/Funo ca Igual Soma Subtrao ca Multiplicao ca Diviso a Parnteses esquerdo e Parnteses direito e V rgula Ponto decimal Cifro a Dois pontos

Caractere ! % & ; ? ** < >

Nome/Funo ca Espao em branco c Exclamao ca Aspas Porcentagem E comercial (ampersand) Ponto e v rgula Ponto de interrogao ca Potncia e Apstrofe o Menor que Maior que

2.4

Conjunto de caracteres aceitos

No Fortran 90/95, os elementos bsicos, denominados de tokens, so os caracteres alfanumricos, os 10 d a a e gitos arbicos, o underscore e o conjunto de caracteres especiais apresentados na tabela 2.1. Dentro da sintaxe da a linguagem, no existem diferenas entre letras maisculas e min sculas. a c u u

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 24 de fevereiro de 2009

o

m

12

2.4. Conjunto de caracteres aceitos

k

lic

lic

k

to

bu

y

N

O W

!

ww

ww

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

k

lic

C

m

C

lic

k

to

bu

y

N.c

O Ww.d oc u -tr a c k

!

w

o

.d o

c u -tr a c k

.c

Cap tulo 3

Tipos de Variveis aEm Fortran, h cinco tipos intr a nsecos de variveis: trs tipos numricos, inteiros, reais e complexos (em a e e ingls INTEGER, REAL e COMPLEX) e dois tipos no numricos, caracteres e lgicos (em ingls CHARACTER e e a e o e LOGICAL). O primeiro grupo de variveis utilizado em operaes matemticas e o mais utilizado. O segundo a e co a e grupo utilizado para operaes que envolvem manipulaes de texto ou operaes lgicas. e co co co o Em Fortran 90/95, cada um dos cinco tipos intr nsecos possui um valor inteiro no negativo denominado a parmetro de espcie do tipo (em ingls, kind type parameter ). A norma padro da linguagem determina que a e e a qualquer processador deve suportar pelo menos duas espcies para os tipos REAL e COMPLEX e pelo menos uma e espcie para os tipos INTEGER, CHARACTER e LOGICAL. e Um outro avano do Fortran 90 sobre o predecessor Fortran 77 consiste na habilidade em denir novos c tipos de variveis, baseados nos tipos intr a nsecos. Estas so os chamados tipos derivados ou estruturas, os quais a consistem em combinaes de partes compostas por tipos intr co nsecos e/ou por outros tipos derivados, permitindo gerar objetos de complexidade crescente. Neste cap tulo, vamos inicialmente denir o uso bsicos dos tipos intr a nsecos de variveis, seguindo pela a denio das espcies de variveis mais comuns, terminando por denir os tipos derivados. ca e a

3.1

Declarao de tipo de varivel ca a

Como j foi colocado anteriormente, uma boa praxe de programao1 iniciar o setor de declaraes de a e ca co variveis com a declarao a ca IMPLICIT NONE a qual impede a possibilidade de haver nomes de variveis no denidos, os quais possuem o seu tipo impl a a cito, uma prtica corriqueira em Fortran 77. a A forma geral de uma declarao de tipo de variveis : ca a e [([KIND=])][,] :: a e

onde especica o tipo de varivel, especica a espcie da varivel, um dos seguintes: e PARAMETER PUBLIC PRIVATE POINTER TARGET ALLOCATABLE e cada entidade e [(lista de extens~es)] [*char-len] [= express~o de inicializa~o] o a ca ou1 Para

DIMENSION() o INTENT() OPTIONAL SAVE EXTERNAL INTRINSIC

o compilador usado, obrigatrio. e o

13

o

m

ww

ww

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

[*char-len] ca onde o nome da varivel, seguindo a regra de nomes vlidos denida no cap e a a tulo 2. Os objetos restantes, em particular o e sero estudados ao longo a e a do desenvolvimento desta apostila.

c u -tr a c k

.c

3.2

Variveis do tipo INTEGER a

Este tipo de varivel armazena apenas a parte inteira de um nmero, exemplos de nmeros inteiros vlidos, a u u a tambm denominados literais so: e a 123, 89312, 5. As declaraoes bsicas de variveis de tipo inteiro so: c a a a Fortran 77: INTEGER a Fortran 90/95: INTEGER :: a O tipo de dados inteiro possui valores que pertencem ao conjunto dos nmeros inteiros. u Programa exemplo: program i n t e i r o i m p l i c i t none integer : : x ! O v a l o r d i g i t a d o n o pode c o n t e r ponto ( . ) Caso i s t o a ! acon te a , v a i g e r a r um e r r o de e x e c u o no programa , c ca ! a b o r t a n d o o mesmo . read * , x print * , Valor l i d o : , x end program i n t e i r o

3.3

Variveis do tipo REAL a

O tipo de varivel real composto de quatro partes, assim dispostas: a e 1. uma parte inteira, com ou sem sinal, 2. um ponto decimal, 3. uma parte fracionria e a 4. um expoente, tambm com ou sem sinal. e Um ou ambos das partes 1. e 3. devem estar presentes. A parte 4. ou est ausente ou consiste na letra E a seguida por um inteiro com ou sem sinal. Um ou ambos das partes 2. e 4. devem estar presentes. Exemplos de literais reais so: a -10.6E-11 (representando 10, 6 1011 ) 1. -0.1 1E-1 (representando 101 ou 0,1) 3.141592653 Os literais reais so representaoes do conjunto dos nmeros reais e o padro da linguagem no especica a c u a a o intervalo de valores aceitos para o tipo real e nem o nmero de d u gitos signicativos na parte fracionria (3.) a que o processador suporta, uma vez que estes valores dependem do tipo de processador em uso. Valores comuns so: intervalo de nmeros entre 1038 a 10+38 , com uma preciso de cerca de 7 (sete) d a u a gitos decimais. As declaraoes bsicas do tipo real so: c a a Fortran 77: REAL a Fortran 90/95: REAL :: aImpresso: 23 de abril de 2008

Autor: Rudi Gaelzer IFM/UFPel

o

m

14

3.2. Variveis do tipo INTEGER a

k

lic

lic

k

to

bu

y

N

O W

!

ww

ww

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

Programa exemplo: program v a r r e a l i m p l i c i t none r e a l : : a , b= 1 0 . 5 e2 ! V a r i v e l b i n i c i a l i z a d a a 1 0 . 5 e 2. a e print * , Valor de a : read * , a print * , Valor de a : , a print * , Valor de b : , b end program v a r r e a l

c u -tr a c k

.c

3.4

Variveis do tipo COMPLEX a

O Fortran, como uma linguagem destinada para clculos cient a cos ou em engenharia, tem a vantagem de possuir um terceiro tipo intr nseco: complexo. Este tipo concebido como um par de literais, os quais so ou e a inteiros ou reais, separados por v rgula , e contidos entre parnteses ( ). Os literais complexos representam e nmeros contidos no conjunto dos nmeros complexos, isto , nmeros do tipo z = x + iy, onde i = 1, x a u u e u e parte real e y a parte imaginria do nmero complexo z. Assim, um literal complexo deve ser escrito: e a u (,) a Exemplos de literais complexos so: a (1.,3.2) (representando 1 + 3, 2i) (1.,.99E-2) (representando 1 + 0, 99 102 i) (1.0,-3.7) Uma outra grande vantagem do Fortran que toda a lgebra de nmeros complexos j est implementada e a u a a a n vel de compilador. Assim, se for realizado o produto de dois nmeros complexos (x1,y1) e (x2,y2), o u resultado ser o literal complexo dado por (x1*x2 - y1*y2,x1*y2 + x2*y1). O mesmo acontecendo com as a outras operaes algbricas. co e As declaraes bsicas do tipo complexo so: co a a Fortran 77: COMPLEX a Fortran 90/95: COMPLEX :: Programa exemplo: program va r c omp le xa i m p l i c i t none complex : : a= (5 , 5) , b , c ! V a r i v e l a i n i c i a l i z a d a a (5 , 5). a e print * , Valor de b : ! O v a l o r de b d e v e s e r e n t r a d o como um l i t e r a l complexo . ! Exemplo : ( 1 . 5 , 2 . 5 ) read * , b c= a * b print * , O v a l o r de c : , c ! V e r i f i q u e o r e s u l t a d o no p a p e l . end program va r com ple xa a

3.5

Variveis do tipo CHARACTER a

O tipo padro consiste em um conjunto de caracteres contidos em um par de apstrofes ou aspas. Os a o caracteres no esto restritos ao conjunto de caracteres padro denidos na seo 2.4. Qualquer caractere a a a ca que possa ser representado pelo processador aceito, exceto os caracteres de controle tais como o return. Os e apstrofes ou aspas servem como delimitadores dos literais de caractere e no so considerados parte integrante o a a do conjunto. Ao contrrio das normas usuais, um espao em branco diferente de dois ou mais. a c e Exemplos de literais de caractere:Autor: Rudi Gaelzer IFM/UFPel Impresso: 23 de abril de 2008

o

m

Cap tulo 3. Tipos de Variveis a

15

k

lic

lic

k

to

bu

y

N

O W

!

ww

w

w

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

bom Dia bomDia BRASIL Fortran 90 As declaraoes mais utilizadas para o tipo caractere so: c a

.d o

c u -tr a c k

.c

Fortran 77: character* a ou character *, [*, ...] Fortran 90/95: character(len=) :: a

onde indica a quantidade de caracteres contidos nas variveis. Todas as variveis denidas por a a esta declarao tm o mesmo nmero de caracteres. Se for informado um literal maior que , este ca e u ser truncado; se for informado um literal menor que o declarado, o processador ir preencher o espao restante a a c a ` direita com espaos em branco. c Programa exemplo: program l e c a r a c t e r e i m p l i c i t none character ( len =10) : : s t r r e a d print * , Entre com t e x t o : read ( a ) , s t r r e a d print * , Texto l i d o : , s t r r e a d end program l e c a r a c t e r e E importante mencionar aqui a regra particular para o formato de fonte dos literais de caractere que so a escritos em mais de uma linha: 1. Cada linha deve ser encerrada com o caractere & e no pode ser seguida por comentrio. a a 2. Cada linha de continuao deve ser precedida tambm pelo caractere &. ca e 3. Este par && no faz parte do literal. a 4. Quaisquer brancos seguindo um & em nal de linha ou precedendo o mesmo caractere em in de linha cio no so partes do literal. a a 5. Todo o restante, incluindo brancos, fazem parte do literal. Como exemplo temos: car_longo = O tempo que eu hei sonhado & Quantos anos foi de vida! & Ah, quanto do meu passado & Foi s a vida mentida o & De um futuro imaginado! & & Aqui ` beira do rio a & Sossego sem ter raz~o. a & Este seu correr vazio & Figura, an^nimo e frio, o & A vida, vivida em v~o. aAutor: Rudi Gaelzer IFM/UFPel

& & & & & & & & & & &

Impresso: 23 de abril de 2008

o

m

16

3.5. Variveis do tipo CHARACTER a

k

lic

lic

k

to

bu

y

N

O W

!

ww

ww

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

3.6

Variveis do tipo LOGICAL a

.d o

c u -tr a c k

.c

O tipo lgico dene variveis lgicas. Uma varivel lgica s pode assumir dois valores, verdadeiro e falso. o a o a o o A representao dos dois estado poss ca veis de uma varivel lgica so: a o a .TRUE. Verdadeiro .FALSE. Falso.

As declaraoes do tipo lgico so: c o a Fortran 77: logical a Fortran 90/95: logical :: Programa exemplo: program l o g i c o i m p l i c i t none l o g i c a l : : a= . t r u e . i f ( a ) then print * , A v a r i v e l v e r d a d e i r a . a e end i f end program l o g i c o a

3.7

O conceito de espcie (kind) e

Em Fortran, alm dos 5 tipos de variveis denidos nas sees 3.2 a 3.6, poss e a co e vel denir extenses a o um determinado tipo, cujas declaraes dependem da verso do Fortran utilizada e do processador no qual o co a programa ser executado. a

3.7.1

Fortran 77

Em Fortran 77 as extenses mais comuns e as correspondentes declaraes so: o co a variveis reais de preciso dupla: real*8 ou double precision . a variveis reais de preciso estendida (ou qudrupla): real*16 . a a a a variveis complexas de preciso dupla: complex*16 . a a a

As diferenas entre estas extenses e os correspondentes tipos originais sero ilustradas a seguir. c o a

3.7.2

Fortran 90/95

Em Fortran 90/95, cada um dos cinco tipos intr nsecos, INTEGER, REAL, COMPLEX, CHARACTER e LOGICAL possui associado um valor inteiro no negativo denominado parmetro de espcie do tipo (kind type parameter). a a e Por exigncia do padro, um processador deve suportar, no m e a nimo, duas espcies para os tipos REAL e COMPLEX e e uma espcie para os tipos INTEGER, CHARACTER e LOGICAL. e Os valores da espcie so dependentes do processador e/ou do compilador empregado. Contudo, h funes e a a co intr nsecas fornecidas pelo compilador que vericam as precises suportadas pelo processador e que podem o ser usadas para denir o valor do parmetro KIND, possibilitando assim a portabilidade do cdigo, isto , a a o e possibilidade deste rodar em diferentes arquiteturas usando uma preciso m a nima especicada pelo programador. Para demonstrar como diferentes compiladores implementam e usam o parmetro de espcie, sero considea e a rados os compiladores Intel Fortran Compiler for linux (verso 9.1), gfortran e o compilador F, todos a gratuitos.Autor: Rudi Gaelzer IFM/UFPel Impresso: 23 de abril de 2008

o

m

Cap tulo 3. Tipos de Variveis a

17

k

lic

lic

k

to

bu

y

N

O W

!

ww

w

w

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

c u -tr a c k

.c

Tabela 3.1: Tabela de armazenamento de variveis para o compilador Intel Fortran. a

Tipo e Espcie e INTEGER(KIND=1) INTEGER(KIND=2) INTEGER(KIND=4) INTEGER(KIND=8) REAL(KIND=4) REAL(KIND=8) REAL(KIND=16) 3.7.2.1

Armazenamento (bytes) 1=8 bits 2 4 8 4 8 16

Tipo e Espcie e LOGICAL(KIND=1) LOGICAL(KIND=2) LOGICAL(KIND=4) LOGICAL(KIND=8) COMPLEX(KIND=4) COMPLEX(KIND=8) COMPLEX(KIND=16)

Armazenamento (bytes) 1 2 4 8 8 16 32

Compilador Intel Fortran

O compilador Intel Fortran oferece os seguintes tipos intr nsecos, juntamente com as respectivas declaraes de tipo e espcie: co e Tipo Inteiro. H 04 parmetros de espcie para o tipo inteiro. a a e Declarao: INTEGER([KIND=]) [::] ca a Sendo das espcies 1, 2, 4 ou 8. Se o parmetro de espcie explicitado, as variveis na sero da espcie escolhida. Em caso contrrio, a espcie ser o inteiro padro: INTEa a e a e a a GER(KIND=4); ou seja, a declarao INTEGER :: equivale a INTEGER(KIND=4) ca a :: . a Tipo Real. H 03 parmetros de espcie para o tipo real. a a e Declarao: REAL([KIND=]) [::] ca a Sendo igual a 4, 8 ou 16. Caso o parmetro de espcie no seja especicado, a espcie ser o real a e a e a padro: REAL(KIND= 4). a Tipo Complexo. H 03 parmetros de espcie para o tipo complexo. a a e Declarao: COMPLEX([KIND=]) [::] ca a Sendo igual a 4, 8 ou 16. Caso o parmetro de espcie no seja explicitado, a espcie ser o complexo a e a e a padro: COMPLEX(KIND= 4). a Tipo Lgico. H 04 parmetros de espcie para o tipo lgico. o a a e o Declarao: LOGICAL([KIND=]) [::] ca a Sendo igual a 1, 2, 4 ou 8. Tipo Caractere. H somente uma espcie do tipo caractere. a e Declarao: CHARACTER([KIND=1],[LEN=]) [::] ca a

Cada espcie distinta ocupa um determinado espao de memria na CPU. Para o compilador Intel Fortran, e c o o espao ocupado est descrito na tabela 3.1. c a O programa 3.1 a seguir ilustra do uso e as diferenas de algumas opes de espcies de tipos de variveis. O c co e a mesmo programa tambm indica o uso de alguns atributos na declarao de variveis, tais como na declarao e ca a ca INTEGER, PARAMETER :: DP= 2

O atributo PARAMETER indica que as variveis declaradas nesta sentena devem se comportar como constantes a c matemticas, isto , no podem ser alteradas no programa por nenhuma atribuio de variveis (ver cap a e a ca a tulo ??). Na mesma declarao, j foi denido que o valor do parmetro DP igual a 2. ca a a e O mesmo exemplo tambm ilustra o uso da funo impl e ca cita SQRT(X): R_SIMPLES= SQRT(2.0) a qual calculou a raiz quadrada da constante 2.0 e atribuiu o resultado ` varivel R_SIMPLES. a a 3.7.2.2 Compilador gfortran

Gfortran o compilador Fortran 95 da GNU,2 inicialmente desenvolvido como alternativa ao compilador e f95 distribu pelas verses comerciais do Unix. Atualmente, o gfortran parte integrante da plataforma de do o e2 Fundao ca

Gnu is Not Unix.

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 23 de abril de 2008

o

m

18

3.7. O conceito de espcie (kind) e

k

lic

lic

k

to

bu

y

N

O W

!

ww

ww

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

c u -tr a c k

.c

Programa 3.1: Testa distintas espcies suportadas pelo compilador Intel Fortran. e

program t e s t a k i n d i n t e l i m p l i c i t none integer , parameter : : dp= 8 , qp= 16 real : : r s i m p l e s r e a l ( kind= dp ) : : r d u p l a r e a l ( kind= qp ) : : r quad ! ! C a l c u l a a r a i z quadrada de 2 em d i v e r s a s p r e c i s e s . o r s i m p l e s= s q r t ( 2 . 0 ) ! Preciso simples a r d u p l a= s q r t ( 2 . 0 dp ) ! P r e c i s o d u p l a a r quad= s q r t ( 2 . 0 qp ) ! P r e c i s o q u d r u p l a ou e s t e n d i d a . a a ! ! Imprime r e s u l t a d o s na t e l a . print * , r s i m p l e s print * , r d u p l a print * , r quad ! end program t e s t a k i n d i n t e l

Tabela 3.2: Tabela de armazenamento de variveis para o compilador gfortran da fundaao GNU. a c

Tipo e Espcie e INTEGER(KIND=1) INTEGER(KIND=2) INTEGER(KIND=4) INTEGER(KIND=8) INTEGER(KIND=16)3 REAL(KIND=4) REAL(KIND=8) REAL(KIND=10)

Armazenamento (bytes) 1=8 bits 2 4 8 16 4 8 10

Tipo e Espcie e LOGICAL(KIND=1) LOGICAL(KIND=2) LOGICAL(KIND=4) LOGICAL(KIND=8) LOGICAL(KIND=16) COMPLEX(KIND=4) COMPLEX(KIND=8) COMPLEX(KIND=10)

Armazenamento (bytes) 1 2 4 8 16 8 16 20

desenvolvimento de software GCC (GNU Compiler Collection), que composta por compiladores de diversas e linguagens distintas, tais como Fortran 95, C/C++, Java, Ada, entre outros. O comando gfortran consiste simplesmente em um script que invoca o programa f951, o qual traduz o cdigo-fonte para assembler, invocando o em seguida o linkador e as bibliotecas comuns do pacote GCC. No gfortran, os parmetros de espcie so determinados de forma semelhante ao compilador Intel a e a Fortran, discutido na seo 3.7.2.1, ou seja, o parmetro indica o nmero de bytes necessrios para armazenar ca a u a cada varivel da respectiva espcie de tipo. As espcies suportadas pelo gfortran so descritas na tabela 3.2. a e e a O programa testa_kind_gfortran a seguir (programa 3.2) ilustra o uso e as diferenas entre as diversas c espcies de tipos de dados no compilador gfortran. e 3.7.2.3 Compilador F

Como exemplo do uso do parmetro de espcie, a tabela 3.3 ilustra os valores suportados pelo compilador a e F, conforme fornecidos pelo guia do usurio4 . H duas possibilidades para os nmeros da espcie: a a u e 1. o modo padro de operao, tambm denominado seqencial, o qual pode, porm, ser especicado explia ca e u e citamente no momento da compilao com a chave -kind=sequential; ca 2. o esquema de numerao bytes, o qual deve ser especicado no momento da compilao com a chave ca ca -kind=byte: alunos|fulano>F -kind=byte .f90 -o 3 Em

4 The

plataformas de 64 bits, tais como a fam de processadores Intel Core 2. lia F Compiler and Tools http://www.fortran.com/imagine1/ftools.pdf.

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 23 de abril de 2008

o

m

Cap tulo 3. Tipos de Variveis a

19

k

lic

lic

k

to

bu

y

N

O W

!

ww

w

w

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

c u -tr a c k

.c

Programa 3.2: Testa distintas espcies suportadas pelo compilador gfortran . e

program t e s t a k i n d g f o r t r a n i m p l i c i t none integer , parameter : : i 1= 1 , i 2= 2 , i 4= 4 , i 8= 8 , i 1 6= 16 integer , parameter : : dp= 8 , qp= 10 integer ( kind= i 1 ) : : v i 1 integer ( kind= i 2 ) : : v i 2 integer ( kind= i 4 ) : : v i 4 integer ( kind= i 8 ) : : v i 8 integer ( kind= i 1 6 ) : : v i 1 6 real : : r s i m p l e s r e a l ( kind= dp ) : : r d u p l a r e a l ( kind= qp ) : : r quad complex : : c s i m p l e s complex ( kind= dp ) : : c d u p l a complex ( kind= qp ) : : c quad ! ! Mostra maiores numeros r e p r e s e n t a v e i s do t i p o i n t e i r o . v i 1= huge ( 1 i 1 ) v i 2= huge ( 1 i 2 ) v i 4= huge ( 1 i 4 ) v i 8= huge ( 1 i 8 ) v i 1 6= huge ( 1 i 1 6 ) print * , E s p e c i e s I n t e i r a s : print * , vi1 , vi2 , v i 4 print * , v i 8 print * , v i 1 6 ! Mostra maiores numeros r e p r e s e n t a v e i s do t i p o r e a l . r s i m p l e s= huge ( 1 . 0 ) ! Precisao simples r d u p l a= huge ( 1 . 0 dp ) ! P r e c i s a o d u p l a r quad= huge ( 1 . 0 qp ) ! P r e c i s a o e s t e n d i d a ! ! C a l c u l a a r a i z quadrada de ( 2 , 2 ) em d i v e r s a s p r e c i s o e s . c s i m p l e s= s q r t ( ( 2 . 0 , 2 . 0 ) ) c d u p l a= s q r t ( ( 2 . 0 dp , 2 . 0 dp ) ) c quad= s q r t ( ( 2 . 0 qp , 2 . 0 qp ) ) ! print * , print * , E s p e c i e s R e a i s e Complexas : print * , r s i m p l e s print * , r d u p l a print * , r quad print * , c s i m p l e s print * , c d u p l a print * , c quad ! end program t e s t a k i n d g f o r t r a n

Autor: Rudi Gaelzer IFM/UFPel

Impresso: 23 de abril de 2008

o

m

20

3.7. O conceito de espcie (kind) e

k

lic

lic

k

to

bu

y

N

O W

!

ww

ww

PD

PD

F-

XC

h a n g e Vi e

w

F-

XC

h a n g e Vi e

w

er

er

!

O W

N

y

bu

to

C

m

C

w

.d o

c u -tr

. ack

c

w

o

.d o

c u -tr a c k

.c

Tabela 3.3: Valores de espcies (kind) de tipos de variveis suportados pelo compilador F. e a

Tipo Real Real Real5 Complex Complex Complex Logical Logical Logical Logical Integer Integer Integer Integer Character

N mero do Kind u (Sequencial) 1 2 3 1 2 3 1 2 3 4 1 2 3 4 1

N mero do Kind u (Byte) 4 8 16 4 8 16 1 2 4 8 1 2 4 8 1

Descrio ca Real preciso simples (padro) a a Real preciso dupla a Real preciso qudrupla a a Complexo preciso simples (padro) a a Complexo preciso dupla a Complexo preciso qudrupla a a Lgico 1 byte o Lgico 2 bytes o Lgico 4 bytes (padro) o a Lgico 8 bytes o Inteiro 1 byte Inteiro 2 bytes Inteiro 4 bytes (padro) a Inteiro 8 bytes Caractere, 1 byte por caractere

O exemplo a seguir, programa testa_kind_F, ilustra do uso e as diferenas de algumas opes de espcies de c co e tipos de variveis. a program t e s t a k i n d F i m p l i c i t none integer , parameter : : dp= 2 real : : r s i m p l e s r e a l ( kind= dp ) : : r d u p l a complex : : c s i m p l e s complex ( kind= dp ) : : c d u p l a ! ! C a l c u l a a r a i z quadrada de 2 em d i v e r s a s p r e c i s e s . o r s i m p l e s= s q r t ( 2 . 0 ) ! Preciso simples a r d u p l a= s q r t ( 2 . 0 ) ! Preciso dupla a ! ! N meros co mp l ex o s : p a r t e r e a l : r a i z de 2 . P arte i m a g i n r i a : r a i z de 3 . u a c s i m p l e s= cmplx ( s q r t ( 2 . 0 ) , s q r t ( 3 . 0 ) ) c d u p l a= cmplx ( s q r t ( 2 . 0 ) , s q r t ( 3 . 0 ) ) ! ! Imprime r e s u l t a d o s na t e l a . print * , r s i m p l e