Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila Fortran
Apostila Fortran
DE
LINGUAGEM FORTRAN
Notas de Aula
Caracteres aceitos:
Letras :
a, b, c, d, e, f, g, h, i, j, k, ,l m, n, o, p, q, r, s, t, u, v, w, x, y, z
A, B, C, D, E, F, G, H, I, J, K, ,L M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z
Nmeros:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Smbolos:
+
-
Varivel: Local na memria do computador que serve para guardar um nmero, letra
ou smbolo, este valor pode ser alterado. representado com um nome que dado
pelo programador, que no pode ser alterado durante o programa. O nome deve
obedecer a algumas regras que sero apresentadas a seguir.
Como informar qual o tipo de uma varivel ? Basta escrever o nome do tipo seguido de
um espao e do nome das varivel no programa, onde os nomes das variveis so separados
por vrgula (,). Por exemplo:
integer a1, i2, valor1, numero
real a1, i2, valor1, numero
complex a1, i2, valor1, numero
character a1, i2, valor1, nome
logical a1, i2, valor1, logico, vouf
Cada tipo de varivel possui um tamanho de memria para que ele possa guardar
informaes, conforme apresentado a seguir:
Tipo
Tamanho
Valor Mnimo
Valor Mximo
Integer
4 bytes
-2147483648
+2147483647
Real
4 bytes
-3.4028235E+38
+3.4028235E+38
Complex
8 bytes
-3.4028235E+38
+3.4028235E+38
- i 3.4028235E+38
+ i 3.4028235E+38
Character
varivel
vazio
32.767 caracteres
Logical
4 bytes
.false. ou .true.
.false. ou .true.
Obs. 1: O nmero real pode ser representado na forma de notao cientfica, onde o smbolo
E ou e representa a base da potncia 10.
12
-4
Ex. 1.5E12 = 1.5 x 10 ,-0.1e-4 = -0.1 x 10 .
Obs. 2: Para nmeros reais qualquer valor acima de -1.1754944E-38, ou abaixo de
+1.1754944E-38 considerado igual a zero (0).
Obs. 3: O expoente da potncia de 10 deve ser inteiro.
Obs. 4: O tipo complex pode ser considerado como dois tipos reais, onde cada um ocupa 4
bytes, dando um total de 8 bytes.
Obs. 5: Os valores do tipo character devem estar entre apstrofes e .
Ex. Texto
0897
a1(4)
Obs. 6: O tamanho, em bytes, de um tipo character igual a quantidade de caracteres que a
constante ou varivel possui mais 1, onde este byte a mais, guarda o tamanho da
constante ou varivel.
3. Expresses:
Existem trs tipos de expresses em Fortran, as expresses aritmticas, cujo
resultado um nmero, as expresses lgicas, e as expresses relacionais, cujos resultados
so .true. ou .false..
Expresses Aritmticas:
Operador Fortran
+
*
/
**
Operador Matemtico
+
ab ou ab
Significado
Adio
Subtrao
Multiplicao
Diviso
Potenciao ou Radiciao
Exemplo
A+B
AB
A*B
A/B
A ** B
Ordem de Precedncia
a
1 ordem (ordem mais alta)
a
2 ordem
a
3 ordem
4 ordem
5 ordem (ordem mais baixa)
+
-
Exemplo:
A * B ** C + D E ** F =
ax + by + c
a
b+c
x n 1
yn
a
a+b
+
b+c
c
Codificao em Fortran
a * x **2 + b * y + c
a / (b + c)
x ** (n 1) / y ** n
x +1
((a + b) / c + a / (b + c)) ** (x + 1)
Expresses Lgicas:
Operador Fortran
.GT.
.GE.
.LT.
.LE.
.EQ.
.NE.
Operador Matemtico
>
<
Significado
Maior que
Maior ou igual a
Menor que
Menor ou igual a
Igual
Diferente
Exemplo
A>B
AB
A<B
AB
A=B
AB
Expresses Relacionais:
Operador Fortran
.NOT.
.AND.
.OR.
.XOR.
Operador Matemtico
No existe
No existe
Significado
Negao
E
Ou
Ou exclusivo
Exemplo
.NOT. A
A .AND. B
A .OR. B
A .XOR. B
Obs. O operador .NOT. usado com apenas 1 argumento, os demais usam 2 argumentos.
Exemplo:
((A .GT. B) .EQ. (C .NE. D)) . AND. F
O significado desses operadores um pouco diferente do que a matemtica usa, a
seguir so apresentadas tabelas chamadas de Tabela Verdade. Estas tabelas mostram os
possveis resultados das expresses relacionais.
A
.false.
.false.
.true.
.true.
B
.false.
.true.
.false.
.true.
A .AND. B
.false.
.false.
.false.
.true.
A
.false.
.false.
.true.
.true.
B
.false.
.true.
.false.
.true.
A
.false.
.false.
.true.
.true.
B
.false.
.true.
.false.
.true.
A .XOR. B
.false.
.true.
.true.
.false.
A
.false.
.true.
.NOT. A
.true.
.false.
A .OR. B
.false.
.true.
.true.
.true.
x=2+1
x = 3, ou seja, na memria passa a ficar gravado o valor 3, ao invs do 2 que
havia antes.
O que vlido e o que no vlido?
Vlido
No vlido
x=1
1=x
x=y+1
1+y=x
2
2
2
x = x + 2x 2
x = x 2x + 5
4.2. Comando de Escrita:
um comando utilizado para escrever na tela, ou monitor, do computador, e tambm
para escrever em um arquivo no disco. O comando de escrita WRITE, ele pode ser utilizado
de uma forma muito complexa, porm utilizaremos sua forma mais simples, a chamada forma
livre. Formas de uso:
write(*,*) a
write(*,*) 5
write(*,*) a + b
write(*,*) 5 / x
write(*,*) texto
O primeiro * substitui o nmero correspondente a linha onde est o formato do nmero
(ser apresentado mais adiante), o segundo * substitui o dispositivo de sada (monitor,
impressora ou arquivo).
4.3. Comando de Leitura:
um comando utilizado para ler do teclado do computador, e tambm para ler de um
arquivo no disco. O comando de leitura READ, tambm utilizaremos sua forma mais simples,
a chamada forma livre. Diferentemente do comando de escrita, o comando de leitura s pode
se referenciar a variveis, j que a leitura de um valor deve ser guardado na memria do
computador. Formas de uso:
read(*,*) a
read (*,*) b
O primeiro * substitui o nmero correspondente a linha onde est o formato do nmero
(ser apresentado mais adiante), o segundo * substitui o dispositivo de entrada (teclado ou
arquivo).
Obs.: Os comandos de escrita e leitura podem ser utilizados para escrever ou ler mais de uma
varivel de cada vez.
Exemplo:
read(*,*) a, b, c
write(*,*) a, b, texto, 5, a + 2 * b
Porm na leitura deve-se ter o cuidado de separar os valores digitados por vrgulas ou
espaos, j para a escrita sero escritos todos juntos, ento para evitar esse pssimo hbito
vou aconselhar que use um comando de escrita e de leitura para cada varivel, constante, ou
caracter, como nos primeiros exemplos.
5. Como Escrever um Programa em Fortran
1
10
11
70
71
72
73
74
75
76
77
78
Para as colunas:
1. O programa deve ser escrito a partir da coluna 7 at a coluna 72, aps esta coluna
tudo desprezado.
2. A coluna 1: reservada para sinalizao de comentrios, basta colocar uma letra c
(maisculo ou minsculo) nesta coluna e toda a linha considerada como
comentrio, ou seja, um aviso ou mensagem, e no como parte constituinte do
programa.
3. Colunas 1 a 5: numerao de linhas, pode-se numerar todas as linhas do
programa, mas na prtica se numeram apenas comandos que exigem a
numerao.
4. Coluna 6: identificador de continuao de linha de comando. Caso algum comando
no caiba entre as colunas 7 e 72, basta colocar um caracter qualquer na coluna 6
e continuar o comando como se no houvesse interrupo, um comando pode
ocupar mais de uma linha (duas, trs, etc).
1
10
70
71
72
73
74
75
76
77
78
1
2
3
4
5
6
7
8
9
Para as linhas:
1. Linha 1: Pode-se usar o comando Program nome, para identificar o nome do
programa.
2. Linha 2: Pode-se declarar as constantes (pode fazer isso em vrias linhas).
3. Linha 3: Pode-se declarar variveis (pode fazer isso em vrias linhas).
4. Linha 4 at a antepenltima: Escreve-se o programa.
5. Penltima linha: o comando stop, indicando a parada de execuo do programa.
6. ltima linha: o comando end indicando o final do programa.
c
c
c
c
a
r
r
e
a
a
u
w
r
r
r
e
a
i
a
t
d
u
w
r
r
r
e
a
i
a
d
=
s
w
d
s
e
Obs. 1:
Obs. 2:
Obs. 3:
Obs. 4:
c
s
l
n
p
e
a
r
r
o
d
a
s
c
d
l
i
o
x
d
y
e
,
d
e
(
o
(
*
p
,
*
r
*
)
i
)
x
e
d
i
i
r
g
o
i
n
e
*
,
d
e
(
o
(
*
*
,
s
,
*
e
*
)
g
)
y
n
d
d
i
o
g
n
t
t
d
o
x
s
+
e
r
n
i
t
t
a
e
o
,
d
)
e
r
s
e
u
s
l
u
t
l
o
t
n
p
p
o
d
6
i
m
u
e
m
o
n
e
o
r
u
o
t
a
t
d
a
o
d
Funes em
Fortran
x+y
sin (2y )
+ sinh (x )
Expresso em Fortran
8. Exemplos de Programas
1. Programa para ler um nmero e apresentar o seno, coseno e tangente:
program trigon
c
declarao da varivel
real x
c
leitura do nmero
write(*,*) Digite um nmero:
read(*,*) x
c
clculo das funes e apresentao dos resultados
write(*,*)Seno do nmero em radianos = ,sin(x)
write(*,*)Coseno do nmero em radianos = ,cos(x)
write(*,*)Tangente do nmero em radianos = ,tan(x)
c
fim do programa
stop
end
2. Programa para ler o nome de uma pessoa e dizer quantas letras tem o nome:
program letras
c
declarao da varivel character com no mximo 30 caracteres
character*30 nome
c
leitura do nome
write(*,*) Digite seu nome (mximo 30 letras):
read(*,*) nome
c
clculo da quantidade de letras e apresentao do resultado
write(*,*)Quantidade de letras no nome = ,len(nome)
c
fim do programa
stop
end
o
10
8. Vetores e Matrizes
A declarao de vetores e matrizes feita por meio do comando DIMENSION. Por
exemplo, para declarar que uma varivel V um vetor de 10 componentes, fazemos:
DIMENSION V(10)
Note que isto no especifica o tipo de V. Seu tipo especificado por meio dos comandos
listados acima. possvel especificar o tipo de um vetor (ou matriz) e seu tamanho em uma nica
declarao. Por exemplo, no caso da matriz M(10,10) (matriz 10 x 10):
REAL*8 M(10,10)
Note que nas declaraes acima, os ndices de V e M variam de 1 a 10. Muitas vezes
necessrio utilizar ndices que assumam valores negativos ou nulo. Deste modo, se o primeiro
ndice da matriz A variar de 0 a 20 e o segundo ndice de -15 a 50 fazemos:
DIMENSION A(0:20,-15:50)
Finalmente, note que uma matriz pode ser de ordem maior do que 2. Por exemplo, para
delcarar uma matriz 10 x 10 x 10, fazemos:
DIMENSION M(10,10,10)
Exemplo 1:
Apresentamos abaixo um exemplo simples do uso de vetores e matrizes
program summat
real mat1(2,2), mat2(2,2), sum(2,2)
write(*,*)'Digite os elementos da primeira matriz (2x2)'
read(*,*) mat1(1,1), mat1(1,2), mat1(2,1), mat1(2,2)
write(*,*)'Digite os elementos da segunda matriz (2x2)'
read(*,*) mat2(1,1), mat2(1,2), mat2(2,1), mat2(2,2)
sum(1,1) = mat1(1,1) + mat2(1,1)
sum(1,2) = mat1(1,2) + mat2(1,2)
sum(2,1) = mat1(2,1) + mat2(2,1)
sum(2,2) = mat1(2,2) + mat2(2,2)
11
"valor" - representa tanto um nmero quanto o valor de uma varivel ou valor retornado por
uma funo.
"condio" - denota a condio lgica que se deseja testar. Estas condies podem ser
tanto operadores lgicos (.GE., . GE., .LT, .LE., .EQ. e .NE.), quanto operadores
relacionais (.AND., .OR., .NOT. e .XOR.).
No caso de um teste envolvendo uma varivel lgica, delcaradas por meio de LOGICAL
TESTE (TESTE o nome da varavel), deveramos fazer o teste lgico utilizando IF(TESTE)THEN.
As instrues associadas a este teste lgico sero executadas apenas se a varivel TESTE for
verdadeira. Neste ponto, til mencionar o modo de se atribuir um valor a variveis lgicas. Para
atribuirmos a TESTE o valor "verdadeiro", devemos fazer:
TESTE=.true.
e se quizermos que TESTE seja falso, fazemos:
TESTE=.false.
12
O valor de TESTE pode ser alterado durante o programa por meio de atribuies explicitas
do programador. possvel testar mais de uma condio em um nico IF. Para isto, utilizamos
AND ou OR. Por exemplo, o teste lgico
IF("valor1"."condio1"."valor2".AND."valor3"."condio2"."valor4")THEN
far com as instrues associadas a ele sejam executadas apenas se os testes
"valor1"."condio1"."valor2" e "valor3"."condio2"."valor4" forem simultaneamente verdadeiros.
Outra maneira de usar o comando IF :
IF("valor1"."condio1"."valor2") "instruo"
Em muitos casos essa instruo pode ser o comando GOTO "n", onde "n" o nmero de
uma linha de comando. O GOTO leva a execuo do programa para a linha "n", que ser a linha
da prxima intruo a ser executada. Porm, esse comando pode executar apenas uma nica
instruo, se quizermos executar mais de uma instruo, devemos usar o THEN e o ENDIF.
10. Loops
O comando DO do fortran permite que um conjunto de instrues seja executado at que
um contador atinja um certo valor determinado. A sintaxe deste comando :
DO "contador"="incio","fim","passo"
"instrues"
ENDDO
Pode se usar tanto variveis do tipo real como inteiro para controlar e incrementar o loop.
No entanto, recomenda-se o uso de variveis do tipo inteiro para evitar problemas numricos.
Como ltima observao, permitido omitir "passo" no loop. Neste caso, o compilador
fortran assume que o incremento de "contador" 1.
Embora no faa parte do padro do fortran 77, loops do tipo
DO WHILE("varivel1"."condio"."varivel2")
"instrues"
ENDDO
so
aceitos
pela
maior
parte
dos
compiladores
fortran
77.
A
instruo
"varivel1"."condio"."varivel2" funciona como um teste lgico, descrito acima. O loop
executado enquanto o teste lgico for verdadeiro.
13
Outra maneira de usar o comando DO conhecido como DO implicito, muito para leitura
e escrita de matrizes e vetores. Seu formato
write(*,*) (variavel(contador), "contador" = "inicio", "fim", passo")
onde o comando write executado quantas vezes o comando DO for repetido. semelhante a
DO "contador"="incio","fim","passo"
write(*,*) variavel(contador)
ENDDO
porm tem a vantagem de no pular de linha toda vez que executar o comando write. Outra
maneira muito usada para o comando DO :
"n"
DO "n" "contador"="incio","fim","passo"
"instrues"
CONTINUE
ou
"n"
DO "n" "contador"="incio","fim","passo"
"instrues"
"ltima instruo"
onde "n" o nmero da linha do comando CONTINUE, que simplesmente continua o comando DO,
ou pode ser o nmero da linha da ltima instruo.
Exemplo 2:
Apresentamos abaixo um exemplo mais completo que o anterior
program summat
real mat1(10,10), mat2(10,10), sum(10,10)
integer lin, col, i, j
write(*,*)'Qual a dimenso das matrizes'
read(*,*) lin, col
write(*,*)'Digite os elementos da primeira matriz', '(',lin,'x',col,')'
do i = 1, lin
read(*,*) (mat1(i,j), j = 1, col)
enddo
write(*,*)'Digite os elementos da segunda matriz', '(',lin,'x',col,')'
do i = 1, lin
read(*,*) (mat2(i,j), j = 1, col)
enddo
do i = 1, lin
do j = 1,col
sum(i,j) = mat1(i,j) + mat2(i,j)
enddo
enddo
write(*,*)'A soma das matrizes e'''
do i = 1, lin
14
15
Exemplo 3:
Uso da formatao
program exemp1
integer*4 i,j
real*8 x, y, w
x=10.d0
y=50.d0
i=20
j=100
w=((x - y) / (i + j)) * (i - j)
10
write(*,10)w
format(1x,'w = ',f7.3,\)
20
write(*,20)x,y,i,j
format(1x,'x = ', f5.2 ,5x, 'y = ', f5.2, 5x, \, 'i = ',i2, 5x,'j = ',i3)
30
write(*,30)w,x,y,i,j
format(3(f5.2, 5x), \, 2(i2, 5x))
stop
end
NOME - Nome do arquivo. Pode ser um nome entre ' ', como 'saida.dat' por exemplo, ou
uma varivel do tipo cadeia de caracteres, previamente definida.
NMERO - Unidade lgica por meio da qual o arquivo ser acessado.
STATUS - Se STATUS='OLD', significa que o arquivo j existe e ser usado para leitura.
Se STATUS='NEW', o arquivo ainda no existe e criado no momento em que a instruo
OPEN executada. Neste caso, podemos escrever no arquivo. Finalmente,
STATUS='UNKNOWN', permite uma maior flexibilidade no que se refere ao acesso ao
arquivo. No entraremos em detalhes sobre esta opo aqui, pois importante em
programao se ter segurana no que se est fazendo. Saber previamente se o arquivo
acessado j existe ou no importante para evitar que resultados anteriores sejam
apagados ou que os novos sejam misturados com antigos.
TIPO - Se a opo FORM for omitida, o compilador assumir que o arquivo formatado.
Neste caso, os seu conteudo ser escrito em ASCII. Isto pode ser reforado fazendo-se
TIPO='FORMATTED'. Para que o arquivo seja escrito em binrio, fazemos
FORM='UNFORMATTED'. Isto basntante til quando estamos lidando com arquivos
grandes. Um arquivo em binrio ocupa muito menos espaco em disco do que um arquivo
em ASCII.
16
20.D0
y/3 = 6.667
17
14. Funes
Uma FUNO em fortran retorna um valor, que pode ser atribudo a uma varivel ou comparado a
algum outro valor. Por exemplo se f(x) uma funo que recebe um argumento x e retorna um
valor real ao final de sua execuo, podemos atribuir este valor varivel real Y:
y=f(x)
Existem funes pre-definidas, como SIN(X), EXP(X), etc... Entretanto, o programador tambm
pode definir funes que sejam convenientes para seu programa. Isto feito por meio da
declarao FUNCTION. Uma FUNCTION construda do seguinte modo:
function f(x1,x2,i1,i2,etc..)
real*8 f
real*8 x1,x2,etc..
integer i1,i2,etc..
(instrues)
f=expresso
end
Observaes:
As vezes necessrio fazer com que a funo no execute todas as linhas, abreviadas no
exemplo acima por (instrues), dependendo dos resultados intermedirios obtidos nestas linhas
ou se a funo for definida por meio de testes lgicos (veremos isto mais adiante). Para isto,
utilizamos o comando RETURN. Contudo, importante ter em mente que uma funo deve
retornar um valor. Ento, necessrio que a declarao F=expresso aparea antes de RETURN.
importante mencionar que todas as variveis, exceto aquelas que so passadas para
funo por argumento (ou por COMMON como veremos abaixo), so locais. Mais precisamente, as
demais partes do programa no sabem que elas existem. Isto significa, que podemos utilizar uma
varivel x dentro de uma funo sem nos preocuparmos se existe alguma outra varivel no
programa, fora desta funo, que possua o mesmo nome.
Entretanto, importante ter em
mente que, em princpio, variveis definidas dentro de uma funo deixam de existir quando
samos da funo. Em outras palavras, se uma dada varivel x possui um certo valor antes de
sairmos da funo, esta varivel pode conter lixo na prxima vez que o programa acessar esta
funo. Para que esta varivel no perca seu contedo, devemos utilizar a instruo SAVE nome
da varivel, na linha abaixo da linha em que a varivel declarada.
18
Como ltima observao, importante ter em mente que uma FUNCTION pode chamar outras
FUNCTIONS. Porm, ela no pode chamar a si prpria (recursividade). Embora vrios
compiladores fortran permitam recursividade, o fortran 77 padro no permite isto.
Exemplo 2:
O exemplo abaixo ilustra algumas das caractersticas dos comandos descritos acima.
integer*4 i
real*8 x,y
real*8 absx
integer*4 n
real*8 dx
parameter(dx=0.5d0,n=10)
x=-2.d0
do i=1,n
x=x+dx
y=absx(x)
write(*,*)' x = ',x,' f(x) = ',y
end do
write(*,*)
x=-2.d0
do while(x.lt.3.0d0)
x=x+dx
write(*,*)' x = ',sngl(x),' f(x) = ',sngl(absx(x))
end do
end
function absx(x)
implicit none
real*8 absx
real*8 x
if(x.lt.0.d0)then
absx=-x
else
absx=x
end if
end
Em ambos os loops, a varivel x incrementada de dx a cada vez que o loop executado.
Em cada loop, a funo xabs chamada. Esta funo o valor absoluto de x. Note que
desnecessrio se fazer uma FUNCTION com este fim. O fortran prov uma funo intrnseca
(ABS) para isto.
Alguns comentarios sobre as instrues novas que apareceram no exemplo acima.
A instruo PARAMETER serve para se definir uma constante que pode ser utilizada no programa.
Embora as constantes definidas por PARAMETER se paream com variveis, elas no podem ser
alteradas pelo programa.
O comando SNGL utilizado no ltimo loop converte o valor de seu argumento em real de
preciso simples. Isto extremamente til quando se deseja escrever num arquivo de dados. Em
primeiro lugar, o arquivo ocupar menos espao em disco (o que pode ser muito importante se o
arquivo for grande). Em segundo lugar, muitos softwares grficos tm problemas em ler arquivos
de dados em dupla preciso.
19
15. Subrotinas
O fortran permite a separao do programa em vrias partes independentes que executam tarefas
diferentes. Estas partes independentes so chamadas SUBROUTINE. Uma subrotina recebe, ou
no, uma lista de variveis por argumento, de modo anlogo s FUNCTIONS descritas acima. A
diferena fundamental entre uma SUBROUTINE e uma FUNCTION que a primeira no retorna
nenhum valor. Ilustramos abaixo a forma que uma subrotina deve possuir:
subroutine nome(x1,x2,...,i1,i2,...)
implicit none
real*8 x1,x2,...
integer*4 i1,i2,...
"instrues"
end
O comando END delimita o fim da subrotina. Todas as observaes feitas sobre as
variveis locais a uma FUNCTION permanecem vlidas no caso de uma subrotina. O comando
RETURN tambm pode ser utilizado dentro de uma subrotina, afim de que as demais linhas da
subrotina no sejam executadas. Isto particularmente til no caso em que, se alguns resultados
intermedirios assumem certos valores, no necessrio (ou no se deve) executar as demais
linhas da subrotina.
De modo anlogo s FUNCTIONS, as "instrues" representam um conjunto de linhas
contendo vrias instrues diferentes, que podem ser chamada a FUNCTIONS ou outras
subrotinas, etc... Porm, recursividade tambm no permitida aqui (veja comentrios em
FUNES).
Apresentamos uma lista de argumentos bastante limitada para a subrotina, embora estes
argumentos podem ser vetores, matrizes, etc... Na realidade, poderamos ter passado at mesmo
subrotinas ou FUNCTIONS por argumento. Para se passar uma FUNCTION por argumento,
necessrio avisar ao compilador que no se trata de uma varivel, mas sim de uma FUNCTION.
Isto feito dentro da subrotina utilizando o comando EXTERNAL. Por exemplo, para que o
compilador espere que uma subrotina receba uma FUNCTION por argumento, devemos incluir as
seguintes linhas na subrotina:
REAL*8 F
EXTERNAL F
Note que estamos supondo que F uma FUNCTION que retorna um resultado em dupla
preciso. Isto no necessariamente verdade. Ela poderia retornar um valor em preciso simples,
por exemplo. Neste caso, deveramos modificar a instruo correspondente a declarao de seu
tipo convenientemente.
No caso de alguns compiladores, apenas as instrues descritas acima so necessrias
para se passar uma FUNCTION por argumento. Entretanto, isto pode gerar resultados errados em
alguns outros. Por este motivo, importante que a linha
EXTERNAL NOME DA FUNO
esteja presente no lugar onde a subrotina chamada.
A chamada de uma subrotina executada por meio da instruo CALL. Por exemplo
CALL NOME(A1,A2,...,J1,J2,...)
faz com que as instrues contidas na subrotina NOME sejam executadas e a lista de argumentos
(A1,A2,...,J1,J2,...) seja transferida a ela. Ao trmino da execuo dos comandos da subrotina, as
variveis contidas na lista de argumentos so "devolvidas" atualizadas para a parte do programa
20
que chamou a subrotina, caso alguma delas tenha sido alterada. Note que utilizamos nomes
diferentes para as variveis da lista de argumentos para insistir no fato de que os nomes de
variveis dentro das subrotinas (ou FUNCTIONS) so independentes dos nomes de variveis em
outras partes do programa. Isto no verdade no que se refere s FUNCTIONS ou
SUBROUTINES. O nome de uma FUNCTION ou subrotina conhecido em todas as FUNCTIONS
ou subrotinas do programa. Entretanto, o tipo da FUNCTION (se ela real ou retorna valor lgico)
no conhecido. Por esta razo, necessrio declarar o tipo da FUNCTION dentro de uma
subrotina ou funo. Note que isto no quer dizer que se uma FUNCTION passada por
argumento ela deve possuir o mesmo nome na lista de argumentos da declarao da subrotina que
no resto do programa (na chamada subrotina sim). Neste caso, temos liberdade para escolher
seu nome como no caso de qualquer outra varivel.
16. Common
Uma vez que as variveis dentro de FUNCTIONS e SUBROUTINES so independentes, o
comando COMMON extremamente importante para que SUBROUTINES e FUNCTIONS se
comuniquem sem que tenhamos que passar todas as variavis por argumento de uma para a
outra. A sintaxe para COMMON a seguinte:
COMMON/"nome do common"/X1,X2,...
21
do i=1,n
write(*,*)' i = ',i,' v1(i) = ',sngl(v1(i)), ' v2(i) = ',sngl(v2(i))
end do
end
subroutine altera(v2,f)
integer*2 n
parameter(n=10)
real*8 v2(n)
real*8 v1(n)
common/zerav1/v1
real*8 f
external f
real*8 fexp
integer*2 i
real*8 x
real*8 dx
parameter(dx=0.5d0)
x=-2.d0
do i=1,n
x=x+dx
v1(i)=f(x)
v2(i)=fexp(x)
end do
end
function absx(x)
real*8 absx
real*8 x
if(x.lt.0.d0)then
absx=-x
else
absx=x
end if
end
function fexp(x)
real*8 fexp
real*8 x
fexp=exp(x)
end
22
Exerccios Fortran
1. Faa um programa que leia 3 nmeros diferentes e os escreva em ordem crescente.
2. Faa um programa que leia dois vetores e apresente o produto escalar e o produto vetorial
deles.
3. Faa um programa que leia uma lista de valores (semelhante a vetores) de uma experincia de
laboratrio (por exemplo, temperatura e velocidade do som no ar) e calcule as mdias
aritmticas, o desvio padro e a varincia de cada uma das grandezas, alm disso, calcule a
correlao. As equaes esto no final das notas de aula.
4. Faa um programa que calcule a integral de uma funo pelo mtodo do retngulo.
5. Faa um programa que calcule a soluo de um sistema de equaes pelo mtodo iterativo.
Obs.: Para todos os programas use arquivos de dados na entrada e na sada dos resultados, crie
tambm funes e/ou subrotinas para os clculos.
a) Mdia Aritmtica:
N
x=
xi
i =1
1
(x1 + x2 + + xN )
N
b) Desvio Padro:
1 N
(xi x )2
N 1 i =1
v=
c) Regresso Linear:
N
a=
i =1
i =1
2
xi yi N xi yi
i =1
xi2
i =1
1 N
xi
N i = 1
b=
i =1
i =1
yi a xi
N
R=a
x
y
23