Subroutinas,
FunçõesUm recurso de organizar um código é uso de SUBROUTINE
ou FUNCTION. O uso de FUNCTION é essencialmente igual a funões embutidas,
tipo EXP ou SIN, so que cada usuário pode cirar de acordo com sua necessidade.
A estrutura de uma função é
FUNCTION FUNC(x,y,..,z)
comandos
.
.
comandos
FUNC=expressão
RETURN
END
Aqui, FUNC é o nome da função que o usuário define. x,y,..,z
são argumentos da função. A variável que tem o nome da função tem que ser
atribuido um valor antes de retornar para o programa que chame esta função.
Em baixo, mostramos um exemplo de uso de uma função.
Open(7,FILE='F1.DAT')
DO X=0.,10.,.5
F=F1(X)
WRITE(7,*) X,F
END DO
STOP
END
FUNCTION F1(X)
IF(X.GT.0.) THEN
F1=X**2
ELSE
F1=X**3
RETURN
END
Neste exemplo, o programa principal calcula os valores
de uma função
para vários valores de x, partindo de x=0
até x=10, com intervalo de 0.2. Os resultados são imprimidos
no arquivo, F1.DAT. O comando OPEN cria o arquivo F1.DAT quando não existe.
Caso já existe, os resultados são imprimidos dentro deste arquivo, apagando
os dados que existiam antes. O comando DO aqui foi utlizado com índice
não inteiro. A primeira parte do programa acima é chamado o programa principal
(main). Em main, o uso da função F1(x) é exatamente igual
a de funções embutidas.
Transforme o programa de sinh-1(x) feito
anteriormente em FUNCTION.
O FUNCTION é um subprograma, i.e., quando anexado ao programa
principal, pode ser usado como as funções embutidas. Assim, o nome deste
FUNCTION é tratado como um variável. Quando usa-se a precisão dupla, este
nome também tem que ser declarado como precisão dúpla. Em baixo, mostramos
a versão de precisão dúpla do programa acima.
DOUBLE PRECISION X,F, F1
Open(7,FILE='F1.DAT')
DO X=0.D0,,10.D0,.5D0
F=F1(X)
WRITE(7,*) X,F
END DO
STOP
END
DOUBLE PRECISION FUNCTION F1(X)
DOUBLE PRECISION X
IF(X.GT.0.D0) THEN
F1=X**2
ELSE
F1=X**3
RETURN
END
A declaração do tipo de variável tem que preceder qualquer outra comandos exectaveis. Lembre que a declaração só vale para cada subprograma. Assim, quando qualquer variável for declarado uma vez em algum subprograma, tem que ter as mesmas declarações em todos outros subprogramas que utlizam esta variável. Como explicamos, a diferente tipo de variável implica diferente modo de armazenamento de informação nas memórias, e o compilador aloca as variáveis nas memórias para cada subprograma independentemente. Por exemplo, digamos X não for declarado como precisão dúpla mas sim numa FUNCTION. Neste caso, na medida em que o fluxo de cálculo entra neste FUNCTION, o FUNCTION aloca a informação correspondente ao X utilzando 2 unidades da memória. Deste forma, o condeúdo do X pode invadir na memória na área de programa principal que já pode estar alocada para outro fim. Assim, quando existe a inconsistência entre declarações para uma variável, o resultado do cálculo fica completamente não confiável. Em alguns compiladores, a existência de incosistência pode ser detetada na hora de execução. Mas em gereal, tal checagem custa em tempo de CPU, reduzindo a velocidade de cálculo.
Além de FUNCTION, existe uma outra forma de subprograma chamado SUBROUTINE. O objetivo de uso de SUBROUTINE pode ser classificado como:
Para demostrar, vamos construir um programa que calcula várias integrais das funções númericamente pelo metódo de Simpson,
Este fórmula vem da aproximação parabolica de uma função qualquer dentro de intervalo pequena. Se for suficientemente pequeno, podemos aproximar uma função f(x) por
f(x)f(x0)+a(x-x0)2+b(x-x0),
onde os coeficientes a e b podem ser determindado
pelas condições,
f(x)=f(x0)+a2b
tendo a=(f++f--2f0)/22,
b=(f+-f-)/2, onde f0=f(x0),f=f(x).
A integral da f(x) neste intervalo fica portanto,
A fórmula Symp1 é a soma das intervalos acima.
c Main
c A letra c na primeira coluna indica que esta linha é um comentário, sem afetar
c o programa
EXTERNAL F1,F2,F3
c O comando de declaração EXTERNAL é necessário para utilizar os nomes de
c subroutinas ou funcões como argumento de um subprograma.
CHARACTER*4 FN1,FN2,FN3
c Aqui, a declaração de CHARACTER para nomes de funções que
c são especificados pelo comando DATA. Ver depois.
OPEN(7,FILE='INTEG.DAT')
DATA A1/0.0/, B1/5.0/
DATA A2/3.0/, B2/10.0/
DATA A3/3.0/, B3/6.0/
DATA FN1/éXP'/,FN2/'SIN'/, FN3/'1/X'/
c O comando DATA é utilizado para registrar as constantes, seja númericos,
c seja não númericos ( charater ou lógico). Os dados tipo character devem ser
c escritos dentro de ' ' (aspas).
N=100
CALL SIMP(F1,A1,B1,N,S1)
c Uso de SUBROUTINE. Os argumentos podem ter diferentes nomes
c de acordo com o uso.
CALL SIMP(F2,A2,B2,N,S2)
CALL SIMP(F3,A3,B3,N,S3)
TRUE1=EXP(5.)-1.
TRUE2=COS(3.)-COS(10.)
TRUE3=ALOG(2.)
WRITE(7,100) FN1,S1,TRUE1
WRITE(7,100) FN2,S2,TRUE2
WRITE(7,100) FN3,S3,TRUE3
100 FORMAT('INTEGRAL DE ', A4, ' = ',E14.6,3X,' EXATO = ', E14.6)
STOP
END
c Subroutine para Integral pelo metodo de Simpson.
c F : nome da função a ser integrada,
c A : limite inferior
c B : limite superior
c N : Número da divisão
c S : Resposta ao retornar
c Os nomes dos argumentos são DUMMY, i.ee, os nomes temporários
c usados dentro deste subroutina, apenas indicando o tipo e a ordem dos
c argumentos. Estes podem ter nomes diferentes no programa que chama este.
SUBROUTINE SIMP(F,A,B,N,S)
D=(B-A)/(2*N)
S=F(A)
X=A
DO I=1,N
X=X+D
DS=F(X)
S=S+4.*DS
X=X+D
DS=F(X)
S=S+2.*DS
END DO
S=S-DS
S=0.33333333*D*S
RETURN
END
FUNCTION F1(X)
F1=EXP(X)
RETURN
END
FUNCTION F2(X)
F2=SIN(X)
RETURN
END
FUNCTION F3(X)
F3=1./X
RETURN
END
onde g(x)>g(a) é uma função suave neste intervalo.
Aqui, explicamos o funcionamento do programa utilizando
o comentário dentro do programa. é recomendável utlizar os comentários
detalhados, para sua memória. Não é facil de lembrar como foi feito o programa
depos ter passado algum tempo....
Prof. Takeshi Kodama
Ultima Alteração: 04 de novembro de 1996