Você está na página 1de 68

i

PROGRAMAO
FORTRAN
PARA ENGENHARIA








Fabiano A.N. Fernandes












1
a
Edio
2003
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
ii
SUMRIO


1. INTRODUO 1
1.1. O Curso 2

2. LGICA DE PROGRAMAO 3
2.1. Algoritmo 3
2.2. Fluxograma 4
Exerccios 9

3. COMPILADOR 11
3.1. Criando um Projeto 11
3.1.1. Usando um Cdigo Pronto em um Novo Projeto 18
3.2. Cdigo em Fortran 90 18
3.4. Cdigo em Fortran 77 19

4. TIPOS E DECLARAO DE VARIVEIS 21
4.1. Declarao de Variveis 21
4.2. Atribuio de Valores 23

5. CALCULOS MATEMTICOS 25
5.1. Operaes Matemticas Bsicas 25
5.2. Funes Matemticas 26

6. LEITURA E IMPRESSO DE DADOS 29
6.1. Formatao dos Dados 30
Exerccios 32

7. PROCESSOS DECISRIOS 33
7.1. Operadores Relacionais 33
7.2. IF..THEN 33
7.3. IF..THEN..ELSE 36
7.3.1. Forma Antiga 38
7.4. Comparao em Conjunto 38
7.5. Processo Decisrio por Faixa ou Classes 41
Exerccios 44

8. LOOPS 47
8.1. Loops Limitados 47
8.1.1. Forma Antiga 50
8.2. Loops por Deciso 51
8.3. Loops Infinitos 54
8.4. CYCLE 56
Exerccios 57
iii
9. VETORES E MATRIZES 59
9.1. Tipos de Vetores e Matrizes 59
9.2. Declarao de Vetores 59
9.3. Atribuio de Valores 59
9.4. Operaes com Vetores e Matrizes 60
9.5. Funes Intrnsecas 61
9.6. Loops com Vetores e Matrizes 62
9.7. Processos Decisrios com Vetores e Matrizes 63
9.7.1. WHERE 65
9.7.2. FORALL 67
Exerccios 68

10. ARQUIVOS DE DADOS 69
10.1. Operaes com Arquivos 69
10.2. Arquivos de Dados - Leitura 70
10.2.1. EOF 71
10.3. Arquivos de Dados - Impresso 72
Exerccios 72

11. ORGANIZAO DE PROGRAMAS EXTENSOS 73
11.1. Mdulo de Variveis Globais 73
11.2. Programa Principal 74
11.2.1. USE 74
11.3. Subrotinas 75
11.3.1. CALL 75
11.4. Funes 78
11.4.1. Chamando Funes 78

12. MTODOS MATEMTICOS 81
12.1. Organizao Geral do Programa 81
12.1.1. Bibliotecas Numricas 83
12.1.2. Usando Bibliotecas Numricas - IMSL 84
12.1.3. Usando Bibliotecas Numricas - Outras 85
12.2. Funo de Zero 86
12.2.1. Usando IMSL 86
12.2.1. Usando Numerical Recipes 89
12.3. Integrao Numrica 92
12.3.1. Usando IMSL 92
12.3.1. Usando Numerical Recipes 99
12.4. Regresso No-Linear 103
12.4.1. Usando IMSL 103
12.5. Estimativa de Parmetros 108
12.5.1. Usando IMSL 108
Exerccios 114


Programao Fortran para Engenharia
Fabiano A.N. Fernandes
iv
13. ERROS 117
13.1. Erros de Execuo 121

14. DEBUG 123
14.1. Quando Debugar 123
14.2. Antes de Debugar 123
14.3. Problemas que Causam Problemas 123
14.3.1. Programa Parece No Sair do Lugar 123
14.3.2. Ocorre Diviso por Zero / Erro em Logaritmo 124
14.3.3. Overflow ou Nmero Infinito 124
14.3.4. Resultado NAN 125
14.3.5. Resultado Retornado Estranho 126
14.4. Usando o Debug do Compaq Fortran 126


Programao Fortran para Engenharia
Fabiano A.N. Fernandes
1
1. INTRODUO

O Fortran tem sido usado por cientistas e engenheiros por muitos anos,
sendo uma das principais linguagens de programao cientfica especialmente
devido a sua capacidade em fazer clculos. Taxada de linguagem obsoleta pelas
pessoas que desconhecem as novas atualizaes na sua estrutura de
programao, o Fortran hoje possui todos os elementos de linguagem que
tornaram o C++ famoso.
O Fortran, abreviao de FORmula TRANslation (ou originalmente IBM
Mathematical FORmula Translation System), a mais velha das linguagens de
alto nvel e foi desenvolvida pelo grupo IBM no final da dcada de 1950. A
linguagem ganhou popularidade na dcada de 1960 e ganhou sua primeira
verso padronizada: Fortran 66.
Em meados da dcada de 1970, todo grande computador vinha com a
linguagem Fortran embutida e era a linguagem mais robusta da poca e tinha
um processamento muito eficiente. Alm disso o cdigo podia ser compilado
(transformado em um programa executvel) em qualquer tipo de sistema de
computador e portanto se tornou a linguagem mais usada no meio cientfico. O
domnio do Fortran levou a uma nova atualizao que ganhou o nome de
Fortran 77 (pelo qual o Fortran conhecido at hoje).
Infelizmente a reviso para o Fortran 77 foi muito conservadora
mantendo uma estrutura de programao antiga. Com a popularizao dos
computadores pessoais, os jovens programadores da dcada de 1980 preferiam
aprender Basic, Pascal e no final dos anos 80, o C; que eram linguagens que
tinham uma estrutura de programao mais bem estruturada e moderna. Essa
preferncia dos jovens programadores levou no incio da dcada de 1990 a uma
mobilizao para implantar o C++ como linguagem de programao
preferencial no meio cientfico, aliando capacidade de clculo com uma
estrutura moderna de programao. A migrao para o C++ s no foi maior
porque muitas rotinas de mtodos numricos estavam em Fortran e daria muito
trabalho e levaria muito tempo para traduzi-las para o C++.
Na mesma poca (1991) o Fortran recebeu sua maior atualizao, com a
introduo do Fortran 90 que permitia o uso de muitos comandos e estrutura das
linguagens mais modernas.


2
1.1. O Curso

Este curso, ir apresentar os principais comandos do Fortran 90 usados
para fazer projetos de engenharia. Os exemplos e exerccios focam em
problemas tradicionais e de utilizao prtica.
Ao final do curso, alguns mtodos numricos mais utilizados so
abordados, mostrando como criar programas usando bibliotecas numricas.



Programao Fortran para Engenharia
Fabiano A.N. Fernandes
3
2. LGICA DE PROGRAMAO

Programar em Fortran, assim como em qualquer outra linguagem de
programao simples, o complicado organizar o pensamento lgico e
estruturar a resoluo do problema para se atingir o objetivo que se deseja.
um erro comum e grave para o iniciante em programao, escrever um
programa sem ao menos esquematizar as aes que devem ser executadas pelo
programa (algoritmo) de modo a solucionar o problema.
Nos primeiros programas, o algoritmo ajuda a organizar o pensamento
lgico, principalmente quando decises devem ser tomadas ou operaes com
vetores e matrizes so necessrios.
Aps algum tempo de experincia, o processo de organizao da estrutura
do programa passa de a ser lgico e fcil, no sendo necessrio fazer um
algoritmo muito detalhado. Porm se o programa for utilizado por mais de uma
pessoa, o algoritmo ainda necessrio para facilitar o entendimento do
programa por outras pessoas, uma vez que ler um algoritmo bem mais fcil do
que ler o cdigo de um programa.


2.1. Al gori tmo

Um algoritmo uma sequncia finita de passos que levam a execuo de
uma tarefa, ou seja, a receita que deve ser seguida para se chegar a uma meta
especfica. O programa por sua vez, nada mais do que um algoritmo escrito
numa linguagem de computador.


Regras Bsi cas para Const ruo de um Al gori t mo

Para escrever um algoritmo deve-se descrever a sequncia de instrues
de maneira simples e objetiva, podendo-se utilizar algumas tcnicas bsicas:

v usar somente um verbo por frase
v usar frases curtas e simples
v ser objetivo
v usar palavras que no tenham sentido dbio


4
Fases de um Al gori t mo

O algoritmo deve conter as trs fases fundamentais da resoluo de um
problema. Estas fases so a leitura de dados, clculos (ou processo) e impresso
dos resultados.

Entrada de
Dados
Impresso dos
Resultados
Processo



EXEMPLO 1
Um algoritmo para calcular a mdia de trs nmeros tomaria a forma:
1. Ler N1, N2 e N3
2. Calcular Mdia pela equao:
3
3 2 1 N N N
Media
+ +
=
3. Imprimir Mdia


2.2. Fl uxograma

O fluxograma uma forma padronizada e eficaz para representar os
passos lgicos de um determinado processo. Sua principal funo a de facilitar
a visualizao dos passos de um processo.
O fluxograma constitudo por diversos smbolos que representam estes
elementos de programao (Tabela 2.1). No interior dos smbolos sempre
existir algo escrito denotando a ao a ser executada.



Tabela 2.1. Elementos do fluxograma

incio e fim

leitura de dados

impresso de dados

ao

deciso

conexo



Programao Fortran para Engenharia
Fabiano A.N. Fernandes
5
EXEMPLO 2
O fluxograma para o exemplo 1 tomaria a forma:

Incio
Fim
Ler N1, N2 e N3
Calcular Mdia
Imprimir Mdia

Figura 2.1. Fluxograma para clculo da mdia de trs nmeros.


EXEMPLO 3
Uma aplicao simples em engenharia o calculo do balano de massa em um
tanque de mistura, como o mostrado na Figura 2.2.

Corrente 1 Corrente 2
Corrente 3

Figura 2.2. Tanque de mistura

Supondo que no h acmulo volumtrico no interior do tanque, e que as
densidade das correntes de entrada (1 e 2) so diferentes, o clculo do fluxo
volumtrico de sada do tanque (corrente 3), do fluxo mssico e da densidade
no tanque pode ser feito usando as equaes:

Fluxo volumtrico: 2 1 3 F F F + =

Fluxo Mssico: 2 2 1 1 3 + = F F M

Densidade:
3
2 2 1 1
3
F
F F

+
=
6
Fi fluxo volumtrico da corrente i
Mi fluxo mssico da corrente i
i densidade da corrente i

O fluxograma a ser seguido para clculo do tanque ser:

Incio
Fim
Ler Fluxo Volumtrico das
Correntes 1 e 2
Ler Densidades das
Correntes 1 e 2
Calcular Fluxo Volumtrico da Corrente 3
Calcular Fluxo Mssico da Corrente 3
Calcular Densidade da Corrente 3
Imprimir Resultados


Figura 2.3. Fluxograma para clculo do balano de massa em um tanque
agitado.


EXEMPLO 4
Se considerarmos os trocadores de calor, o coeficiente de troca trmica
depende do tipo de escoamento (laminar ou turbulento) e pode ser calculado
por meio de correlaes que so definidas para cada faixa de nmero de
Reynolds.
Um programa que calcule o coeficiente de troca trmica deve conter um
processo decisrio que utilize a correlao correta em funo do valor do
nmero de Reynolds, conforme as equaes:

EQ1:
14 , 0 33 , 0
Pr
8 , 0
Re
153 , 0 = N N N
Nu
para NRe < 2100

Programao Fortran para Engenharia
Fabiano A.N. Fernandes
7
EQ2:
14 , 0
33 , 0
33 , 0
Pr
33 , 0
Re
56 , 10

=
L
d
N N N
Nu

para NRe > 2100

d dimetro do tubo
L comprimento do tubo
NNu nmero de Nusselt
NPr nmero de Prandtl
NRe nmero de Reynolds
razo de viscosidade do fluido no centro e na parede
do tubo

O fluxograma do programa para clculo do coeficiente de transferncia de calor
ser:

Incio
NRe, NPr, d, L,
NRe < 2100
Calcula NNu pela
equao EQ1
No
Sim

Calcula NNu pela


equao EQ2
Fim
Imprime NNu

Figura 2.4. Fluxograma para clculo do coeficiente de transferncia de calor.

No fluxograma acima, aps a leitura das variveis necessrias, o programa
deve decidir qual das duas equaes ser usada para o clculo do nmero de
Nusselt,. Esta deciso feita comparando o nmero de Reynolds lido com o
limite superior para a aplicao da equao EQ1. Dependendo do valor do
nmero de Reynolds, o nmero de Nusselt ser calculado pela EQ1 ou pela
EQ2.



8
EXEMPLO 4
muito comum em engenharia, termos que gerar dados para montar um
grfico de uma determinada funo. A velocidade terminal de uma partcula
funo do tamanho da partcula e das propriedades do fluido e do slido e pode
ser calculada pela equao:

( )


f s p
t
D
u

=
2
524 , 0


Se quisermos gerar 100 pontos para construir um grfico da velocidade
superficial em funo do dimetro de partcula, para partculas variando de 50 a
1000 m poderemos usar o seguinte fluxograma:

Incio
s, f,
DeltaDP = (1000 - 50)/100
I = 1
DP = 50 + (I-1)*DeltaDP
Calcula Ut
Dp, Ut
I = I +1
I <= 100
Fim
Sim
No



Figura 2.5. Fluxograma para clculo do coeficiente de transferncia de calor.

Programao Fortran para Engenharia
Fabiano A.N. Fernandes
9
No fluxograma acima, um contador (I) utilizado para fazer a iterao de 1 at
100 que o nmero de pontos desejado para o grfico. Um valor de
incremento definido para o dimetro das partculas (DeltaDP) e este usado
no clculo do dimetro da partcula (DP). Aps a velocidade terminal (UT) ser
calculada, os valores de DP e UT so impressos. O contador incrementado
em uma unidade e o processo continua at que 100 pontos sejam impressos.


EXEMPLO 5
A tecnologia Pinch, usada para otimizar a troca de energia entre as diversas
correntes de um processo, requer a organizao das temperatura das diversas
correntes em ordem decrescente, em uma de suas etapas.
As temperaturas das correntes so armazenadas em um vetor que deve ser
organizado do maior valor para o menor valor.
Se a temperatura de 10 correntes tiverem de ser organizadas, o fluxograma a
ser seguido ser dado por:

Incio
Ler Vetor A contendo as
Temperaturas das Correntes
I = 0
I = I + 1
J = I
A(I) < A(J) B = A(I)
A(I) = A(J)
A(J) = B
J < 10
I = 9
Fim
J = J + 1
No
Sim
No
No
Sim
Sim


Figura 2.6. Fluxograma para organizao de um vetor em ordem decrescente.

10
Neste fluxograma usamos o conceito de contadores (variveis I e J), que
servem para contar o nmero de iteraes realizadas, ou simplesmente para
marcar uma posio. Neste caso os contadores servem para indicar qual a
posio no vetor A que contm as temperaturas.
Para organizar o vetor necessrio procurar pelo maior valor e coloc-lo na
primeira posio do vetor, buscar pelo segundo maior valor e coloc-lo na
segunda posio do vetor e assim por diante.
Se inicialmente o vetor estiver totalmente desorganizado o maior valor pode
estar em qualquer posio no interior do vetor, como por exemplo:

1 2 3 4 5 6 7 8 9 10
25 12 22 11 12 9 7 18 15 3
Posio
Valor


Para achar o maior valor e coloc-lo na primeira posio do vetor, podemos
usar o contador I e dar a ele o valor 1 referente primeira posio no vetor A.
Portanto a varivel A(I) conter o valor do primeiro valor do vetor, ou seja, A(1).
Para colocar o maior valor do vetor nesta posio, devemos comparar o valor
desta posio com os valores contidos nas outras posies do vetor, ou seja
com as posies 2 at 10.
Para controlar qual a posio que ser comparada com a posio I, podemos
usar o controlador J, fazendo este variar de 2 at 10. Se o valor de A(J) for
maior que o valor de A(I), ento trocamos estes valores de posio de forma
que o maior valor fique na primeira posio:
1 2 3 4 5 6 7 8 9 10
25 12 22 11 12 9 7 18 15 3
Posio
Valor


Uma vez que a primeira posio do vetor foi preenchida corretamente com o
maior valor do vetor, podemos repetir a mesma operao para achar o
segundo maior valor e coloc-lo na segunda posio do vetor. Para tanto, o
contador I incrementado recebendo o valor 2 referente segunda posio no
vetor A. Para colocar o segundo maior valor do vetor nesta posio, devemos
comparar o valor desta posio com os valores contidos nas posies
restantes do vetor, ou seja com as posies, 3 at 10. Novamente, se o valor
de A(J) for maior que o valor de A(I), ento trocamos estes valores de posio
de forma que o maior valor fique na segunda posio:

1 2 3 4 5 6 7 8 9 10
25 12 22 11 12 9 7 18 15 3
Posio
Valor


Programao Fortran para Engenharia
Fabiano A.N. Fernandes
11
Note que o contador I deve variar entre I+1 e 10 (ltima posio do vetor).
A operao repetida para as outras posies do vetor. Para um vetor com 10
posies, o valor do contador I varia de 1 a 9 e no de 1 a 10 pois no final do
processo, o valor contido na posio 10 j ser o menor valor contido no vetor.
Alm disso no seria possvel comparar o valor A(10) com o valor A(11) pois
este ltimo no existe.

Dos exemplos mostrados neste captulo, o exemplo 5 um dos problemas
mais complicados que se tem em lgica de programao para engenharia, pois
envolve operao com vetores, controle de vetores, loops e comparaes.
Embora, a modelagem e a resoluo dos problemas de engenharia sejam
muitas vezes complexos, a lgica de programao a ser utilizada ser na grande
maioria dos casos muito parecida com os exemplos mostrados neste captulo.
Nos prximos captulo iremos abordar os comandos que nos permitem
programar em Fortran.


EXERCCIOS

EXERCCIO 1
Um procedimento muito comum em programao para engenharia a obteno
das razes de uma funo. Para uma funo de segundo grau, como a mostrada
no exemplo 4, em que a velocidade de terminao uma funo de segundo
grau em relao ao dimetro da partcula, podemos determinar de duas formas o
dimetro da partcula dado uma velocidade terminal. Diretamente,
reorganizando a equao isolando o dimetro da partcula em funo da
velocidade terminal:

( )
f s
t
u
Dp

=
524 , 0


ou pela tcnica de bisseo, buscando o zero da funo:
( )


f s p
t
D
u

=
2
524 , 0
0

Desenvolva o fluxograma para calcular o dimetro da partcula a partir de cada
um destes dois processos.


12

EXERCCIO 2
A correlao a ser utilizada para calcular as propriedades fisicoqumicas
depende da fase em que a substncia se encontra: gs ou lquido. A deciso de
qual correlao deve ser utilizada pode ser feita com base na comparao entre
a temperatura de ebulio do composto e a temperatura do processo.
Desenvolva um fluxograma para calcular a capacidade calorfica de uma
substncia.
As correlaes para o clculo da calorfica so:
para gs:
2
T C T B A Cp + + =

para lquido:

2
2
2 t D A t C A B
t
A
Cp + =

c
T
T
t =1

Cp capacidade calorfica
T temperatura
Tb temperatura de ebulio
Tc temperatura crtica
A, B, C, D parmetros


EXERCCIO 3
O exemplo 5 apresentou como se organiza um vetor (contendo 10 valores) em
ordem decrescente. Desenvolva um algoritmo que organize um vetor, contendo
N valores, em ordem crescente.


Programao Fortran para Engenharia
Fabiano A.N. Fernandes
13
3. COMPILADOR FORTRAN

Compilador o nome que se d ao programa que ir transformar o seu
cdigo Fortran em um programa executvel. Existem vrios compiladores
Fortran, como o Intel Fortran, Compaq Fortran, GCC, ProFortran, entre outros.
Atualmente os compiladores mais usados so:

v INTEL e COMPAQ FORTRAN
Devido a facilidade de sua interface, modernidade do cdigo que
compila, capacidade de gerar aplicativos com interface grfica em
Windows (QuickWin) e grande variedade de mtodos j codificados em
sua biblioteca numrica.

v GNU FORTRAN (GCC)
Devido a ser um programa livre (grtis). um compilador para Fortran
77 mas contm a maioria dos comandos do Fortran 90 alm da
possibilidade de formatao livre do cdigo. No cria aplicativos com
interface grfica e no contm mdulo de bibliotecas numricas.

Os programas a serem feitos neste curso podero ser executados em
qualquer compilador Fortran com capacidade de compilar Fortran 90. Somente
alguns exemplos de captulo 12 sobre mtodos matemticos iro requerer a
biblioteca numrica IMSL.
As sees seguintes iro apresentar como iniciar um projeto no
COMPAQ Fortran, que a verso atual do antigo mas ainda popular MS
Fortran PowerStation. O INTEL Fortran a nova denominao do agora antigo
COMPAQ Fortran (a diferena a possibilidade de integrao com a
plataforma .NET da Microsoft)


3.1. Cri ando um Proj eto

No COMPAQ Fortran, todo programa em Fortran est ligado a um
projeto que ir conter o cdigo fonte do programa que est sendo escrito. Para
criar um projeto no Fortran, selecione File no menu principal e depois selecione
New (Figura 3.1).

14


Figura 3.1. Abertura de um novo projeto no Fortran

Este compilador capaz de criar vrios tipos de programas (programa
executvel, subrotina DLL, programas com interface Windows, etc.). Neste
curso abordaremos os programas executveis, portanto escolha a opo Fortran
Console Application (Figura 3.2).


Figura 3.2. Abertura de um novo projeto no Fortran

Programao Fortran para Engenharia
Fabiano A.N. Fernandes
15
D um nome para o projeto que estar sendo criado. Um novo diretrio
ser criado com o nome deste projeto. Ser neste diretrio que os arquivos com
o cdigo do programa em Fortran devero ser gravados (Figura 3.2).
Escolha para criar um projeto vazio (Figura 3.3). Finalize a abertura do
projeto pressionando o boto Finish.



Figura 3.3. Abertura de um novo projeto no Fortran

Aps criado o projeto, o arquivo que conter o cdigo em Fortran dever
ser criado. Este arquivo um arquivo texto comum que posteriormente ser
gravado com a exteno .f90. Para criar o arquivo do cdigo, pressione o boto
New Text File (Figura 3.4).



Figura 3.4. Abertura de um novo arquivo de cdigo.
16

Este arquivo texto poder ser editado e o cdigo do programa poder ser
digitado nele. Aps editado, este arquivo deve ser gravado com a extenso .f90.
Para salvar o arquivo selecione File no menu principal e depois selecione a
opo Save, ou simplesmente pressione o boto Save (Figura 3.5). O nome deste
arquivo poder ser igual ao nome do projeto (recomendvel para no causar
muita confuso).



Figura 3.5. Gravao de um novo arquivo de cdigo.

No esquea de gravar o arquivo com a extenso .f90 (Figura 3.6).



Figura 3.6. Gravao de um novo arquivo de cdigo.


Programao Fortran para Engenharia
Fabiano A.N. Fernandes
17
Este arquivo por sua vez dever ser inserido no projeto. Para isto,
selecione Project no menu principal e depois selecione a opo Add To Project
e Files (Figura 3.7). Selecione o arquivo f90 que foi criado.



Figura 3.7. Vinculao do arquivo de cdigo ao projeto.

Ateno: no porque o arquivo f90 est aberto no compilador que ele est
vinculado ao projeto. Isto s ocorre aps o usurio fazer a insero manual
deste arquivo ao projeto.

Depois de vincular o arquivo f90 ao projeto, o projeto deve ser salvo para
gravar este novo vnculo. Aps este procedimento, o arquivo com o cdigo
Fortran pode ser editado, e o programa escrito.
Aps pronto, o cdigo deve ser compilado para ento se tornar um
programa executvel. A compilao feita selecionando Build no menu
principal e depois a opo Rebuild All no menu principal (ou pressione o boto
Rebuild All). Se o compilador encontrar erros no cdigo do programa que
impeam a criao do programa executvel, as mensagem de erro aparecero na
janela abaixo do cdigo (Figura 3.8).



Figura 3.8. Compilao e criao do programa executvel.

18
Selecionar Rebuild All como mostrado na Figura 3.8 evita o trabalho de
ter que selecionar Compile e depois selecionar Build.
Para executar o programa, selecione a opo Build no menu principal e
depois a opo Execute, ou simplesmente pressione o boto Execute (Figura
3.9).



Figura 3.9. Execuo de um programa.


3.1.1. Usando um Cdi go Pront o em um Novo Proj et o

Se quiser comear um novo projeto e importar um arquivo de cdigo
existente para este novo projeto siga o seguinte procedimento:

Crie o novo projeto.
Copie o arquivo de cdigo para o diretrio criado para o novo projeto.
Vincule o arquivo de cdigo ao novo projeto.

Se o arquivo de cdigo no for copiado para o novo diretrio, este cdigo
ser compartilhado por dois ou mais projetos e uma modificao neste cdigo
implicar em mudanas no cdigo para os dois projetos. Portanto, se quiser
modificar o cdigo do programa sem afetar a ltima verso, o procedimento
acima deve ser seguido.


3.2. Cdi go em FORTRAN 90

O cdigo do programa em Fortran 90 tem formatao livre, com o cdigo
podendo ser escrito a partir da primeira coluna e no h limite de caracteres por
linha.
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
19
O programa comea com o comando PROGRAM e termina com o
comando END.

PROGRAM <nome>
:
cdigo
:
END

onde <nome> o nome dado ao programa

O comando PROGRAM na verdade opcional, mas pode vir a ser
importante para diferenciar o programa principal dos outros mdulos, subrotinas
e funes (veremos estas estruturas no Captulo 11).
possvel inserir comentrios ao longo do programa de forma a
identificar as diversas partes do programa e descrever o que est sendo realizado
em cada parte. O comentrio comea com o caracter !

PROGRAMA EXEMPLO
! PROGRAMA PARA CALCULO DE 2 + 2
A = 2 + 2 ! EQUAO
END

Muitas vezes as equaes so muito longa para caberem na tela, de forma
que a linha do programa sairia do campo visual. Neste caso o caracter & pode
ser usado para indicar que esta linha de cdigo continua na linha seguinte. O &
deve vir no final da linha.

PROGRAMA EXEMPLO
! CALCULO DE UM BALANO POPULACIONAL
A = (TAU + BETA)*(TAU + BETA/2.0*(TAU + BETA)*(R 1.0))*R/ &
(1.0 + TAU + BETA)**R
END

2.3. Cdi go em FORTRAN 77

O Fortran 77 a verso antiga da linguagem Fortran. Ainda hoje ela
bastante popular pois alguns programadores aprenderam a programar em
Fortran 77 e escolheram no se atualizar para o usar o Fortran 90. Portanto
muito comum ver programas novos sendo escritos em Fortran 77.
As desvantagens do Fortran 77 em relao ao Fortran 90 so: no poder
usar alguns comandos novos que foram criados com o Fortran 90; maior
20
dificuldade em fazer alguns tipos de operaes com vetores e matrizes;
impossibilidade de criar DLLs; e ter que conviver com regras mais rgidas para
escrever o programa.
O Fortran 77 tem vrias regras de escrita do cdigo, sendo que as linhas
de cdigo so divididas por sees:

colunas
1 5 6 7 72
A B C

Zona A contm comentrios e nmeros de linha de cdigo (linhas 1 a 5).
Zona B contm o caracter que indica a continuao da linha anterior (linha 6).
Zona C cdigo do programa (linhas 7 a 72).

Um programa em Fortran 77 teria a forma:

1 5 6 7 72
PROGRAM <NOME>
:
cdigo
:
END

A insero de comentrios deve ser feita colocando a letra C na primeira
coluna da linha:

1 5 6 7 72

C
PROGRAM EXEMPLO
PROGRAMA PARA CLCULO DE 2 + 2
A = 2 + 2
END

Qualquer linha de cdigo deve ser escrito at a coluna 72. Aps a coluna
72, nenhum cdigo lido pelo compilador. Se o texto do cdigo chegar at a
coluna 72, o restante da linha de cdigo dever continuar na coluna 7 da linha
de baixo. Um caracter qualquer deve ser colocado na coluna 6 para identificar
que aquela linha se trata da continuao da linha anterior.

1 5 6 7 72

C



*
PROGRAM EXEMPLO
CALCULO DE BALANO POPULACIONAL
A = (TAU + BETA)*(TAU + BETA/2.0*(TAU + BETA)*(R 1.0)*R
/(1.0 + TAU + BETA)**R
END

Programao Fortran para Engenharia
Fabiano A.N. Fernandes
21
4. TIPOS E DECLARAO DE VARIVEIS

As variveis podem ser basicamente de quatro tipos: numricas,
caracteres ou lgicas. Os tipos de variveis do Fortran so:

v INTEGER
nmeros inteiros

v REAL
nmero real
suporta valores entre 1.0 x 10
-45
at 1.0 x 10
45


v REAL*8
nmero real em dupla preciso
suporta valores entre 1.0 x 10
-300
at 1.0 x 10
300

este tipo de varivel o tipo mais usado em engenharia e seu uso deve
ser preferido dentre as duas formas de nmero reais
programas mais antigos usavam a declarao: DOUBLE PRECISION para
este tipo de varivel

v CHARACTER*i
sequncia alfanumrica com um mximo de i caracteres
no pode ser utilizada em operaes matemticas

v COMPLEX
nmero complexo

v LOGICAL
varivel lgica
possui dois valores: .FALSE. (falso) e .TRUE. (verdadeiro)
este tipo de varivel tem sido gradativamente substitudo por nmero
inteiros onde 0 se refere a falso e 1 a verdadeiro.


4.1. Decl arao de Vari vei s

As variveis podem ser declaradas em grupo ou individualmente. Esta
declarao deve vir logo no incio do programa.
22
Individualmente, as variveis so declaradas listando seus nomes aps o
tipo da varivel, como por exemplo:

INTEGER A, B, C
REAL D, E
REAL*8 F, G, H
CHARACTER*10 I
COMPLEX J

importante dar nomes representativos para as variveis, de forma que
se possa identificar facilmente sua funo no programa.

EXEMPLO
REAL*8 DENS, VISC para densidade e viscosidade
INTEGER IDX para ndice

comum esquecermos de declarar variveis no incio do programa
quando usamos a declarao individual das variveis. Para evitar este problema,
podemos usar a funo IMPLICIT para declarar um grupo de variveis
baseados em sua letra inicial:

IMPLICIT REAL*8 (A-H,O-Z)

esta declarao ir fazer com que todas as variveis iniciadas em A at H e em
O at Z sejam nmero reais em dupla preciso. Como consequncia, as
variveis iniciadas em I at N sero nmero inteiros.
Em geral, as letras I a N so utilizadas para denotar nmeros inteiros e as
demais so usadas para nmeros reais (conveno estabelecida), porm isto no
impede que se use as letras I a N para nmeros reais e as outras para inteiros.
Utilizar o comando IMPLICIT no impede a declarao individual de
outras variveis, sendo que declaraes individuais se sobrepe declarao
feita pelo comando IMPLICIT.

EXEMPLO
IMPLICIT REAL*8 (A-H,O-Z)
REAL*8 NSA
INTEGER P1
CHARACTER*20 ARQUIVO




Programao Fortran para Engenharia
Fabiano A.N. Fernandes
23
4.2. Atri bui o de Val ores

v Formas vlidas para nmeros inteiros:
I = 0
I = 134
I = -23


v Formas vlidas para nmeros reais:
A = 3.1415
A = -0.0012
A = .236
A = +5.0E3

A atribuio 5.0E3 quer dizer: 5.0 x 10
3



v Formas vlidas para nmeros reais em dupla preciso (REAL*8):
A = 3.1415D0
A = -0.0012D0
A = 2.4D-62
A = +5.0D2

A atribuio 5.0D3 quer dizer: 5.0 x 10
3

Mesmo para nmeros pequenos importante a colocao do D0 aps o
nmero, pois esta atribuio elimina o risco da varivel conter lixo em seu
final. A falta do D0 pode levar o nmero 5.0 a ser armazenado na varivel como
5.000000342589485 ou mesmo 4.999999993748758, sendo que algumas vezes
este lixo pode afetar operaes com nmeros muito pequenos.


v Formas vlidas para nmeros complexos:
A atribuio do nmero complexo deve ser sempre feito entre parnteses,
onde o primeiro nmero a parte real e o segundo nmero a parte
imaginria.

C = (1,2)
C = (1.70,-8.948)
C = (+502348E5,.999)




24
v Formas vlidas para varivel lgica:
L = .TRUE.
L = .FALSE.
estas so as duas nicas opes para a varivel lgica


v Formas vlidas para caracteres
O texto alfanumrico pode ser definido entre apostrofes ou entre aspas

S = Texto
S = texto

No caso do apostrofe ser necessrio no meio do texto, pode-se usar as
formas:
S = textos texto
S = textos texto



Programao Fortran para Engenharia
Fabiano A.N. Fernandes
25
5. CLCULOS MATEMTICOS

5.1. Operaes Matemti cas Bsi cas

As operaes bsicas de adio, subtrao, multiplicao, diviso e
exponenciao so feitas usando os smbolos da Tabela 5.1.

Tabela 5.1. Smbolos usados para as operaes matemticas
Smbolo Operao
+
-
*
/
**
adio
subtrao
multiplicao
diviso
exponenciao


Uma hierarquia imposta a estas operaes:
1. parnteses
2. exponenciao
3. multiplicao e diviso (o que aparecer primeiro)
4. adio e subtrao (o que aparecer primeiro)


EXEMPLO
As equaes:
D C B A +

E B A
D
+


F
D C B
A
E
+


seriam programadas como:
A = B + C*D

A = B**D + E

A = (B*C + D**E)/F

26
Deve-se sempre ter o cuidado com a hierarquia entre as diferentes
operaes matemticas, para se evitar erros de calculo.

EXEMPLO 1
A equao:

( )
G
E
F
B A C B
Z
1
1
]
1

+


deve ser programada como:
Z = (((B-C)**E + A*B)/F)**G

Se esta mesma equao fosse programada como:
Z = (B-C)**E + A*B/F**G

a equao que estaria sendo calculada seria:

G
E
F
B A
C B Z

+ ) (

que por sua vez resultaria num valor muito diferente do que o valor desejado
inicialmente.

5.2. Funes Matemti cas

O Fortran possui um conjunto de funes matemticas para clculo de
logaritmo, seno, tangente, e muitas outras. As principais funes esto listadas
abaixo.

ABS(A) calcula o nmero absoluto de A
A pode ser um inteiro, real ou complexo

ACOS(A) calcula o arco coseno de A (resultado em radianos)
A pode ser somente real

ACOSD(A) calcula o arco coseno de A (resultado em graus)
A pode ser somente real

ASIN(A) calcula o arco seno de A (resultado em radianos)
A pode ser somente real


Programao Fortran para Engenharia
Fabiano A.N. Fernandes
27
ASIND(A) calcula o arco seno de A (resultado em graus)
A pode ser somente real
Alguns compiladores podem no aceitar este comando

ATAN(A) calcula o arco tangente de A (resultado em radianos)
A pode ser somente real

ATAND(A) calcula o arco tangente de A (resultado em graus)
A pode ser somente real
Alguns compiladores podem no aceitar este comando

CEILING(A) retorna o menor nmero inteiro maior ou igual A
A pode ser somente real
CEILING(4.8) retorna 5.0
CEILING(-2.5) retorna 2.0

COS(A) calcula o coseno de A (A em radianos)
A pode ser somente real

COSD(A) calcula o coseno de A (A em graus)
A pode ser somente real
Alguns compiladores podem no aceitar este comando

COSH(A) calcula o coseno hiperblico de A
A pode ser somente real

COTAN(A) calcula a cotangente de A (resultado em radianos)
A pode ser somente real

COTAND(A) calcula a cotangente de A (resultado em graus)
A pode ser somente real
Alguns compiladores podem no aceitar este comando

EXP(A) calcula a exponencial de A
A pode ser somente real

INT (A) converte o valor de A em um nmero inteiro
A pode ser real ou complexo
INT(7.8) retorna o valor 7

LEN(S) retorna o nmero de caracteres de um texto
S pode ser somente um campo alfanumrico
28
LOG(A) calcula o logaritmo natural de A
A pode ser real ou complexo

LOG10(A) calcula o logaritmo de A
A pode ser real ou complexo

SIN(A) calcula o seno de A (A em radianos)
A pode ser real ou complexo

SIND(A) calcula o seno de A (A em graus)
A pode ser real ou complexo
Alguns compiladores podem no aceitar este comando

SINH(A) calcula o seno hiperblico de A
A pode ser somente real

TAN(A) calcula a tangente de A (A em radianos)
A pode ser real ou complexo

TAND(A) calcula a tangente de A (A em graus)
A pode ser real ou complexo
Alguns compiladores podem no aceitar este comando

TANH(A) calcula a tangente hiperblica de A
A pode ser somente real


Quando o resultado desejado um numero real em dupla preciso
(REAL*8), as funes acima devem ser precedidas por um D, ou seja, a funo
tangente ser DTAN(A), a exponencial ser DEXP(A) e assim por diante.


EXEMPLO 2
A distribuio granulomtrica pode ser representada pela equao:
1
1
]
1

,
_


N
D
D
X
*
exp 1

A programao desta equao dada por:

X = 1.0D0 DEXP(-(D/DSTAR)**N)

Programao Fortran para Engenharia
Fabiano A.N. Fernandes
29
6. LEITURA E IMPRESSO DE DADOS

A leitura e impresso de dados uma parte fundamental de muitos
programas. Em Fortran, a leitura de dados feita pelo comando READ e a
impresso de dados feito pelo comando WRITE.
Tanto o comando WRITE quanto o comando READ podem seguir um
padro (formato) ou ser livres de formato. Em geral usa-se o formato somente
para a impresso de dados.
O comando READ tem a forma:

READ(<unidade>,<formato>) <variveis>

<unidade> um ndice que indica de onde a leitura de dados ser feita:
se *, ela ser feita pelo teclado
se um nmero, ela ser feita a partir de um arquivo de dados

<formato> so as regras da formatao da leitura de dados
se *, o formato livre (forma preferencial)
se uma linha de comando (nmero da linha), o formato ser o que
estiver definido na linha de comando especificada
se um formato, seguir o formato que estiver especificado

<variveis> lista de variveis a serem lidas (separadas por vrgulas)


EXEMPLO
READ (*,*) A,B,C l as variveis A, B e C a partir do teclado

READ(2,*) A,B l as variveis A, B a partir do arquivo
especificado na unidade 2 (veremos a
especificao de arquivos no captulo 10)


O comando WRITE tem a forma:

WRITE(<unidade>,<formato>) <variveis>

<unidade> um ndice que indica de onde a impresso dos dados ser
feita:
se *, imprime as variveis na tela
se um nmero, imprime as variveis em um arquivo de dados
30

<formato> so as regras da formatao da impresso dos dados
se *, o formato livre
se uma linha de comando (nmero da linha), o formato ser o que
estiver definido na linha de comando especificada
se um formato, seguir o formato que estiver especificado

<variveis> lista de variveis a serem impressos (separadas por vrgulas)


EXEMPLO
WRITE(*,*) A,B,C escreve as variveis A, B e C na tela

WRITE(2,*) A,B escreve as variveis A, B no arquivo
especificado na unidade 2

WRITE(6,100) A,B escreve as variveis A, B no arquivo
especificado na unidade 6, seguindo o formato
especificado na linha de comando 100.
esta forma de especificao usando linhas de
comando numerados tem cado em desuso e seu
uso no mais recomendado

WRITE(*,(2F5.2)) A,B escreve as variveis A, B na tela, seguindo o
formato especificado (2F5.2).


6.1. Formatao dos Dados

O formato de impresso ou leitura especificado diretamente no
comando WRITE ou READ ou atravs do comando FORMAT.
Os formatos podem ser:

Ix inteiro, onde x o nmero de caracteres a ser impresso/lido
I3 inteiro com trs algarismos
I5 inteiro com cinco algarismos

Fx.y real com x algarismos, sendo y algarismos reservados para as casas
decimais
x deve ser pelo menos igual y+1, uma vez que o ponto decimal tambm
conta como um caracter
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
31
F5.2 nmero real com 2 casas decimais e 2 algarismos antes da
virgula
F10.4 nmero real com 4 casas decimais e 5 algarismos antes da
virgula
F5.5 forma no vlida, pois no h espao para as 5 casas
decimais mais a virgula

Ex.y nmero real escrito em notao cientfica com x caracteres, sendo y
algarismos reservados para as casas decimais. A parte exponencial ter a
forma Et00, ocupando 4 caracteres
x deve ser pelo menos igual y+5, uma vez que o ponto decimal e a parte
exponencial tambm contam como um caracteres
E9.2 nmero real escrito na forma: aa.bbEtcc
E10.1 nmero real escrito na forma: aaaa.bEtcc

Ax campo alfanumrico com x caracteres
A5 campo alfanumrico com 5 caracteres

yX y espaos


Forma de Uso

Incorporado ao comando WRITE:

WRITE(*,(I2,3X,F5.2,3X,F5.2)) N, A, B

neste exemplo, o formato 3X,F5.2 ocorre duas vezes na sequncia, e
portanto um parnteses pode ser usado para suprimir a repetio do texto:

WRITE(*,(I2,2(3X,F5.2))) N, A, B

Usando o comando FORMAT:

WRITE(*,100) N, A, B
100 FORMAT(I2,3X,F5.2,3X,F5.2)

EXEMPLO
Sendo: I = 100
N = 5
A = 1030.56
B = 5.55667
C = 12.563
S = MEDIA
32

WRITE(*,(I3,2X,F5.2,2X,E8.2)) I,C,A
Imprimiria: 100__12.56__1.03E+03 (onde _ se refere a um espao)

WRITE(*,(A8,F10.3,F10.1)) S,A,B
Imprimiria: MEDIA_____1030.560_______5.6

WRITE(*,(I2,3F5.2)) N,A,B,C
Imprimiria: _5XXXXX_5.5612.56 (a varivel A no ser impressa
pois o tamanho de sua parte
inteira maior do que o reservado
para ela)


EXERCCIOS

EXERCCIO 1
No controle de qualidade, alguns grficos de controle se baseiam na mdia de
trs valores. Escreva um programa para ler trs valores nmeros reais, calcular
sua mdia e imprimir o resultado com duas casas decimais.

EXERCCIO 2
Escreva um programa para ler dois nmeros reais, calcular o logaritmo do
primeiro nmero, o coseno do segundo e imprimir o resultado destas duas
operaes e o produto dos dois resultados.




Programao Fortran para Engenharia
Fabiano A.N. Fernandes
33
7. PROCESSOS DECISRIOS

7.1. Operadores Rel aci onai s

Toda deciso no Fortran depende de uma comparao entre dois valores
ou de um conjunto de comparaes.
Os operadores que podem ser usados para comparar duas variveis so
mostradas na Tabela 7.1.

Tabela 7.1. Operadores Relacionais
Smbolo Operador
==
>
>=
<
<=
/=
igual
maior que
maior ou igual que
menor que
menor ou igual que
diferente

Estes operadores servem para decidir o que ser feito dependendo
do resultado da comparao. O comando mais utilizado para o processo
decisrio o IF..THEN e o IF..THEN..ELSE.


7.2. IF..THEN

O comando IF..THEN tem a seguinte estrutura lgica:

Incio
comparao PROCESSO
Falso
Verdadeiro
Fim


Figura 7.1. Fluxograma lgico do comando IF..THEN
34

No comando IF..THEN uma comparao feita entre dois valores. Se a
comparao for verdadeira, um determinado processo executado, caso
contrrio o processo no executado.
Em termos de programao, a estrutura :

IF (<comparao>) THEN
:
PROCESSO
:
END IF

onde <comparao> a expresso usada para testar a condio a ser verificada.

Caso o PROCESSO consista somente de uma linha de comando, o
comando IF..THEN pode ser escrito como:

IF (<comparao>) PROCESSO


EXEMPLO 1
O coeficiente de arraste (CD) de partculas slidas pode ser calculado pela
equao:

Re
24

D
C vlida para Re < 0,1

Para valores maiores do nmero de Reynolds (Re), a equao para clculo do
coeficiente de arraste dado pela equao:

( )
7 , 0
Re 14 , 0 1
Re
24
+
D
C vlido para Re > 0,1

CD coeficiente de arraste
Re nmero de Reynolds


O fluxograma de deve ser seguido para este processo :





Programao Fortran para Engenharia
Fabiano A.N. Fernandes
35
Incio
Re > 0.1 CD = CD*(1 + 0.14*RE**0.7)
No
Sim
Fim
CD = 24/RE
CD
Re




clculo do coeficiente de arraste baseado na frmula para Re < 0,1. Uma
a execuo do programa desviada para calcular o coeficiente de arraste
baseado na segunda equao.
O programa em Fortran para clculo do coeficiente de arraste ser:

PROGRAM ARRASTE
IMPLICIT REAL*8 (A- -Z)
! LEITURA DAS VARIVEIS



CD = 24.0D0/RE
IF (RE > 0.1D0) CD = CD*(1.0D0 + 0.14D0*RE**0.7D0)
! IMPRESSO DO RESULTADO

END




36
. IF..THEN..ELSE
A estrutura do tem a seguinte lgica:
Incio
comparao PROCESSO 1
Falso
Verdadeiro
Fim
PROCESSO 2


Figura 7.3. Fluxograma lgico do comando IF..THEN..ELSE

No comando IF..THEN..ELSE, se a comparao for verdadeira, o
processo 1 executado, caso contrrio o processo 2 executado.
Em termos de programao, a estrutura a seguinte:

IF (<comparao>) THEN
:
PROCESSO 1
:
ELSE
:
PROCESSO 2
:
END IF


EXEMPLO 2
No clculo da perda de carga, o fator de atrito calculado de acordo com o
nmero de Reynolds (Re). Se o nmero de Reynolds for < 2100, a equao 1
usada (regime laminar), caso contrrio, a equao 2 utilizada (regime
turbulento).

EQ1:
Re
64
f [eq. Dorey-Weisbach]

Programao Fortran para Engenharia
Fabiano A.N. Fernandes
37
EQ2:
2
74 , 1 log 2
1

,
_

D
f

[eq. Von Karman]



O fluxograma de deve ser seguido para este processo :

Incio
Re < 2100 Calcular EQ1
Falso
Verdadeiro
Fim
Calcular EQ2
Imprime f
Re, E, D


Figura 7.4. Fluxograma lgico para clculo do fator de atrito

Segundo o fluxograma, aps a leitura do nmero de Reynolds (Re) feita uma
comparao para verificar o se Re menor do que 2100 (regio de
escoamento laminar). Caso a condio for verdadeira, o fator de atrito
calculado usando a equao 1, caso contrrio o fator ser calculado usando a
equao 2. Posteriormente, o fator de atrito impresso.
O programa em Fortran para clculo do fator de atrito ser:

PROGRAM FATRITO
IMPLICIT REAL*8 (A-H,O-Z)
! LEITURA DAS VARIVEIS
READ(*,*) RE, E, D

! CLCULO DO FATOR DE ATRITO
IF (RE < 2100.0D0) THEN
! RE < 2100 (ESCOAMENTO LAMINAR)
FATR = 64.0D0/RE
38
ELSE
! RE > 2100 (ESCOAMENTO TURBULENTO)
FATR = (1.0D0/(2.0D0*LOG10(E/D) + 1.74D0))**2.0D0
ENDIF

! IMPRESSO DOS RESULTADOS
WRITE(*,*) FATR
END

Note que para melhor visualizao e entendimento do comando
IF..THEN..ELSE, o Processo 1 e o Processo 2 esto indentados, ou seja esto
uma tabulao a frente do comando IF. A indentao do programa importante
para melhor visualizar o fluxo de informaes no programa, e til
principalmente quando o tamanho do cdigo grande.


7.3.1. Forma Ant iga

O Fortran77 no aceitava as declaraes dos operadores relacionais na
forma de smbolos (==, >, >=, <, <= e /=) e usava palavras chaves para estes
operadores. A Tabela 7.2 mostra a equivalncia entre os smbolos e as palavras
chaves para os operadores relacionais.

Tabela 7.2. Equivalncia entre os operadores relacionais no Fortran 90 (forma
atual) e Fortran 77 (forma antiga)
Fortran 90 Fortran 77
==
>
>=
<
<=
/=
.EQ.
.GT.
.GE.
.LT.
.GE.
.NE.

A forma usando palavras chaves tem cado em desuso e os novos compiladores
tendem a no mais aceitar esta forma.


7.4. Comparao em Conj unto

Algumas vezes, um processo s executado se duas ou mais condies
forem verdadeira (caso E) ou se pelo menos uma das condies for verdadeira
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
39
(caso OU). No primeiro caso, o operador .AND. usado e no segundo caso, o
operador .OR. usado.
A tabela 7.2. mostra quais sero os resultados finais das comparaes em
funo dos resultados das comparaes individuais.

Tabela 7.2. Resultado das Comparaes
Comparao Resultado
Verdadeiro .AND. Verdadeiro
Verdadeiro .AND. Falso
Falso .AND. Falso
Verdadeiro
Falso
Falso
Verdadeiro .OR. Verdadeiro
Verdadeiro .OR. Falso
Falso .OR. Falso
Verdadeiro
Verdadeiro
Falso
.NOT. Verdadeiro
.NOT. Falso
Falso
Verdadeiro

Em termos de programao, a estrutura a seguinte:

IF ((<comparao>).AND.(<comparao>)) THEN

e

IF ((<comparao>).OR.(<comparao>)) THEN


EXEMPLO 3
Um dos pontos que mais gera erro de execuo em programas a diviso por
zero. Um programa bem estruturado deve prevenir a ocorrncia de erros antes
do erro ocorrer, alertando o usurio para o problema.
O clculo da rea de troca trmica necessria em trocadores de calor dado
pela equao:

T Uc
Q
Ac



Ac rea de troca trmica
Q calor trocado
Uc coeficiente de troca trmica
T diferena de temperatura

No caso, uma diviso por zero pode ocorrer se Uc ou T forem iguais a zero.
Um programa bem feito deve prever esta possibilidade e impedir o erro antes
40
que o mesmo ocorra. Um fluxograma lgico para o clculo da rea de troca
trmica com predio de erros teria a estrutura:

Incio
UC = 0 e
DELTAT = 0
Calcula AC
No
Sim
Fim
IRR = 0
Q, UC, DELTAT
IRR = 1
1
IRR = 0
No
Sim
"Erro no Clculo"
1
CD
/
/


Figura 7.5. Fluxograma lgico para clculo do fator de atrito

Segundo o fluxograma, aps a leitura das variveis, uma varivel de controle
de erro (IRR) introduzida e inicializada. Esta varivel definida com o valor 0
(zero) para sem erro de execuo, e pode vir a receber um valor qualquer
durante a execuo do programa se um possvel erro ocorreu ou poderia
ocorrer (e foi impedido).
Seguindo o fluxograma, uma comparao para verificar se Uc ou T (DELTAT)
so diferentes de zero feita. Caso a condio seja verdadeira, a rea de troca
trmica calculada, caso contrrio a varivel de controle de erro recebe um
valor diferente de zero, indicando a ocorrncia de um erro. Posteriormente,
uma nova comparao feita, verificando o valor da varivel de controle de
erro. Se o valor desta varivel for 0 (zero), a rea de troca trmica impressa,
caso contrrio uma mensagem de erro apresentada.
O programa em Fortran para o clculo da rea de troca trmica ser:

PROGRAM TROCTERM
IMPLICIT REAL*8 (A-H,O-Z)
! LEITURA DAS VARIVEIS
READ(*,*) Q,UC,DELTAT

! DEFINIO DA VARIVEL DE ERRO
IRR = 0

! CLCULO DA REA DE TROCA TRMICA
IF ((UC /= 0.0D0).AND.(DELTAT /= 0.0D0)) THEN
AC = Q/(UC*DELTAT)
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
41
ELSE
! PODERIA OCORRER DIVISO POR ZERO
IRR = 1
ENDIF

! IMPRESSO DOS RESULTADOS
IF (IRR == 0) THEN
WRITE(*,*) AC
ELSE
WRITE(*,*) ERRO NO CLCULO DIVISO POR ZERO
ENDIF
END


7.5. Processo Deci sri o por Fai xa ou Cl asses

ndices podem ser usados para desviar a execuo do programa para
diferentes processos, dependendo do valor deste ndice. Para esta forma de
processo decisrio usamos o comando SELECT CASE que tem a seguinte
estrutura lgica:
Incio
comparao PROCESSO 1
Falso
Verdadeiro
Fim
PROCESSO 4
comparao PROCESSO 2
Falso
Verdadeiro
comparao PROCESSO 3
Falso
Verdadeiro
.
.


Figura 7.6. Fluxograma lgico do comando SELECT CASE.
42

No comando SELECT CASE, uma varivel comparada com vrios
valores. Quando a comparao resultar em verdadeiro o processo relativo
quela condio executado. Quando nenhuma comparao resultar em
verdadeiro, o processo relativo a condio CASE ELSE executado.
Em termos de programao, a estrutura a seguinte:

SELECT CASE (<varivel>)
CASE (a)
PROCESSO 1
CASE (b)
PROCESSO 2
:
CASE (n)
PROCESSO 3
CASE ELSE
PROCESSO 4
END SELECT

importante notar que o SELECT CASE s pode ser usado com
nmero inteiros. Tanto a varivel, quanto os valores de a, b, n devem ser
nmero inteiros.
Uma faixa de valores pode ser usada nos Cases, como por exemplo:
CASE (1:5) significa uma faixa de valores de 1 a 5.
A condio CASE ELSE opcional e pode ser omitida do comando
SELECT CASE.


EXEMPLO 4
O projeto de equipamentos de adsoro requer a seleo de um adsorvente e
informaes relacionados transferncia de massa para a superfcie do
adsorvente. A seleo do adsorvente requer informaes para descrever a
capacidade de equilbrio do adsorvente temperatura constante (isoterma de
adsoro). Vrios tipos de isotermas de adsoro existem e um programa
genrico ou que ir testar vrios tipos de isotermas deve ter um sistema de
seleo da isoterma que ser usada.

EQ1:
C K
C K Q
q
ADS
+

1
[eq. Langmuir]

EQ2:
n
ADS
C K q

[eq. Freundlich]

Programao Fortran para Engenharia
Fabiano A.N. Fernandes
43
EQ3:
( ) ( ) P p P p p K
p K Q
q
ADS
/ 1 / 1 + +

[eq. BET]

O fluxograma para a escolha da isoterma depende da escolha do tipo de
isoterma pelo usurio. Esta escolha armazenada em uma varivel de controle
(IDX) que ser usada na deciso para selecionar a equao que ser usada.

Incio
IDX = 1
Calcula EQ1
Falso
Verdadeiro
Fim
IDX
Q, C, AK
IDX = 2
Calcula EQ2
Falso
Verdadeiro
AK, C, AN
IDX = 3
Calcula EQ3
Falso
Verdadeiro
Q, AK, P, PTOT
QADS


Figura 7.7. Fluxograma lgico para calculo da isoterma de adsoro

O programa em Fortran para clculo da isoterma ser:

PROGRAM ISOTERMA
IMPLICIT REAL*8 (A-H,O-Z)

! LEITURA DO TIPO DE ISOTERMA
READ(*,*) IDX

! CLCULO DA ISOTERMA
SELECT CASE (IDX)

44
CASE (1) ! ISOTERMA DE LANGMUIR
READ(*,*) Q, C, AK
QADS = Q*C*AK/(1.0D0 + C*AK)
CASE (2) ! ISOTERMA DE FREUNDLICH
READ(*,*) AK, C, AN
QADS = AK*C**(-AN)
CASE (3) ! ISOTERMA BET
READ(*,*) Q, AK, P, PTOT
QADS = Q*P*AK/((1.0D0 + AK*P + P/PTOT)*(1.0D0 P/PTOT))
END SELECT

! IMPRESSO DO RESULTADO
WRITE(*,*) QADS
END



EXERCCIOS

EXERCCIO 1
Desenvolva um programa para calcular a perda de carga usando as frmulas de
Fair-Whipple-Hsiao.

EQ1:
75 , 4
75 , 1
00086 , 0
D
Q
PC [para gua fria]

EQ2:
75 , 4
75 , 1
0007 , 0
D
Q
PC [para gua quente]

D dimetro do tubo
L comprimento do tubo
PC perda de carga
Q vazo de gua

EXERCCIO 2
Refaa o Exemplo 2 inserindo no programa um sistema para deteco de erros
devido a diviso por zero. Crie um sistema para apresentar ao usurio uma
mensagem de erro indicando qual varivel apresentou o problema.


Programao Fortran para Engenharia
Fabiano A.N. Fernandes
45
EXERCCIO 3
Desenvolva um programa para calcular a presso de vapor de uma substncia
onde o usurio seleciona a equao pela qual a presso de vapor ser calculada.
Equaes:

EQ1:
1
1
]
1

+ + +

X
X D X C X B X A
P P
C vap
1
exp
6 3 5 , 1


C
T
T
X 1

EQ2:
1
]
1

+

C T
B
A P
vap
exp

EQ3:
3
10
Z
C
vap
P
P
+ 93 , 4 808 , 5 1 Z
) ln( 42 0 , 35
36
2
6
R R
R
T T
T
Z +
( ) ) log( 2 0364 , 0 ) 0 , 7 1 ( ) log( 7 2 118 , 0 3
R R
T Z Z T Z Z +

C
R
T
T
T

A,B,C,D parmetros da equao
Pvap presso de vapor
P
C
presso crtica
TC temperatura crtica
T
R
temperatura relativa
fator acntrico


46




Programao Fortran para Engenharia
Fabiano A.N. Fernandes
47
8. LOOPS

Loops so rotinas cclicas nas quais um processo executado por um
nmero pr-determinado de vezes ou enquanto uma condio de permanncia
no loop continue sendo satisfeita.

8.1. Loops Li mi tados

Um processo pode ser executado por um nmero limitado de vezes
usando o comando DO..ENDDO.
Este comando tem a seguinte estrutura lgica:

Incio
<var> < y
<var> = x
No
Sim
Fim
PROCESSO
<var> = <var> + z


Figura 8.1. Fluxograma lgico do comando DO..ENDDO.

No comando DO..ENDDO, a varivel de controle (<var>) iniciada com
um valor x. Aps a execuo do processo, a varivel de controle tem seu valor
incrementado com o valor z. Uma comparao feita para ver se a varivel de
controle atingiu o valor mximo definido para ela (y). Se o valor mximo ainda
no foi atingido, o processo executado novamente, at que a varivel de
controle seja maior que y.
Em termos de programao, a estrutura :


48

DO <var> = x,y,z
:
PROCESSO
:
ENDDO

x valor inicial de <var>
y valor final de <var>
z incremento em <var> a cada iterao

O passo de incremento da varivel de controle (<var>) pode ser maior
que 1 ou at mesmo negativo, porm deve ser um nmero inteiro. Caso o passo
seja negativo, x deve ser maior do que y.
Se o incremento for igual a 1, o valor de z pode ser omitido e o comando
DO..ENDDO toma a forma:

DO <var> = x,y
:
PROCESSO
:
ENDDO


EXEMPLO 1
Quando so produzidos, os polmeros apresentam uma distribuio de pesos
moleculares. A distribuio pode ser calculada pela funo:
( ) ( ) ( )
( )
r
r
r r W


+ +

1
]
1

+ + +
1
1
2
) (


[ ]
[ ]
[ ] M kp
X ktx
kp
ktm
M kp
ktd

+ +




[ ] M kp
ktc



kfm constante de transferncia para monmero
kfx constante de transferncia para CTA
kp constante de propagao
ktc constante de terminao por combinao
ktd constante de term. por desproporcionamento
r comprimento de cadeia
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
49
W frao de cadeias produzidas
[M] concentrao de monmero
CM concentrao de monmero (no programa)
[X] concentrao de CTA
CX concentrao de CTA (no programa)

Para obter dados para imprimir a distribuio de pesos moleculares, pode-se
usar um loop para gerar os dados da frao de cadeias formadas em funo do
comprimento de cadeia do polmero. O fluxograma a ser seguido ser:

Incio
I < 100
I = 1
No
Sim
Fim
R = I*DELTA
CALCULA W
KP, KFM, KFX, KTC, KTD
CM,CX
CALCULA TAU e BETA
R, W
I = I + 1
1
1


Figura 8.2. Fluxograma lgico para gerao de dados para a distribuio de
pesos moleculares de polmeros.

Segundo o fluxograma, primeiramente os parmetros cinticos e as
concentraes so lidas. Os parmetros e da equao so calculados e
inicia-se o loop para calculo da frao de pesos moleculares (W) em funo do
comprimento de cadeia (R). Cem pontos devem ser gerados, e portanto a
varivel de controle I deve variar entre 1 e 100.
No interior do loop o valor de R calculado em funo do valor de I e portanto
R pode ser incrementado 100 vezes (assim como I), porm seu incremento
poder ser maior ou menor do que 1 dependendo do valor de DELTA. Calcula-
se a frao de pesos moleculares (W) e R e W so impressos.

Em termos de programao, a estrutura a seguinte:



50
PROGRAM DPM
IMPLICIT REAL*8 (A-H,K,O-Z)

! LEITURA DAS VARIVEIS
READ(*,*) KP, KFM, KFX, KTC, KTD
READ(*,*) CM, CX

! CLCULO DOS PARMETROS TAU E BETA
TAU = KTD/(KP*CM) + KTM/KP + KTX*CX/(KP*CM)
BETA = KTC/(KP*CM)

! CLCULO DA DISTRIBUIO DE PESOS MOLECULARES
DO I = 1,100
R = I*1000.0D0
W = (TAU + BETA)*(TAU + BETA/2.0D0*(TAU + BETA)*(R 1.0D0))* &
(R/(1.0D0 + TAU + BETA)**R)
WRITE(*,*) R,W
ENDDO
END


8.1.1. Forma Ant iga

No Fortran 77, os loops eram controlados pelo comando
DO..CONTINUE, que tem como estrutura de programao:

DO <linha> <var> = x,y,z
:
PROCESSO
:
<linha> CONTINUE

onde <linha> o nmero da identificao de linha onde o CONTINUE est
localizado

O loop do Exemplo 1 seria programado como:

DO 100 I = 1,100
R = I*1000.0D0
W =
WRITE(*,*) R,W
100 CONTINUE

Esta forma de controle de loop caiu em desuso e no deve ser mais utilizada.

Programao Fortran para Engenharia
Fabiano A.N. Fernandes
51
8.2. Loops por Deci so

Os loops podem ocorrer enquanto uma condio continue sendo atendida,
usando o comando DO WHILE. Este comando tem como estrutura lgica:


Incio
Verdadeiro
Falso
Fim
PROCESSO
comparao


Figura 8.3. Fluxograma lgico do comando DO WHILE.


No comando DO WHILE, o programa entra e continua em loop at que
a condio responsvel pelo loop continue sendo atendida.
Em termos de programao, a estrutura :

DO WHILE (<comparao>)
:
PROCESSO
:
ENDDO


EXEMPLO 2
Sistemas de busca por mnimos e zeros de funes podem usar o esquema de
loop por desio para determinar quando parar a busca do mnimo e/ou zero
de funo.
A equao de Colebrook uma das melhores equaes para calcular o fator
de atrito em tubulaes industriais, porm esta equao uma funo
intrnseca e requer um sistema iterativo para calcular o fator de atrito. O
mtodo de bisseo pode ser usado para esta operao.

1
]
1


5 , 0 5 , 0
Re
5226 , 2
7065 , 3
log 2
1
f
D
f

[eq. Colebrook]



52
Esta equao pode ser rearranjada para:

1
]
1

+
5 , 0 5 , 0
Re
5226 , 2
7065 , 3
log 2
1
0
f
D
f
e

[eq. 2]

f fator de atrito
/D rugosidade relativa
Re nmero de Reynolds


Analisando a equao tem-se que se chutarmos um valor inicial para f, se a
equao 2 for negativa, f estar superestimado, caso contrrio estar
subestimado. Portanto pode-se fazer um sistema de bisseo que leve esta
informao em conta para calcular o fator de atrito.
difcil achar e = 0,0 para a equao 2 e portanto pode-se parar a iterao de
busca por f quando e estiver dentro de uma tolerncia, por exemplo e 0,001.
Como limites da busca na bisseo, pode-se usar os limites do fator de atrito
apresentado no grfico de Moody, e portanto f dever estar entre 0,007 e 0,1.

O fluxograma a ser seguido ser:

Incio
ERRO < 0
TOL = 0,001
ERRO = 1,0
Sim
F = (F1 + F2)/2
Calcula ERRO pela EQ2
Re, Rug
F2 = F
1
1
F1 = 0,1
F2 = 0,007
ERRO > TOL
No
Sim
F1 = F
ERRO = - ERRO
No
Fim
F


Figura 8.4. Fluxograma lgico para clculo do fator de atrito.


Segundo o fluxograma, aps a leitura e inicializao das variveis, o algoritmo
entra no loop para clculo do fator de atrito. No loop, o fator de atrito
calculado baseado na teoria do mtodo da bisseo. O erro calculado e
dependendo do seu valor, pode-se inferir se o valor atual do fator de atrito est
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
53
super ou subestimado e baseado neste resultado, define-se os novos limites
superior e inferior para o valor do fator de atrito.

Em termos de programao, a estrutura a seguinte:


PROGRAM FATRITO
IMPLICIT REAL*8 (A-H,O-Z)

! LEITURA DAS VARIVEIS
READ(*,*) RE, RUG

! INICIALIZAO DAS VARIVEIS
F1 = 0.1D0
F2 = 0.007D0
ERRO = 1.0D0
TOL = 0.001D0

! CLCULO DO FATOR DE ATRITO VIA MTODO DA BISSEO
DO WHILE (ERRO > TOL)
F = (F1 + F2)/2.0D0
ERRO = F**(-0.5D0) + 2.0D0*DLOG10(RUG/3.7065D0 &
+ 2.5226/(RE*F**0.5D0))
IF (ERRO < 0.0D0) THEN
F1 = F
ERRO = - ERRO
ELSE
F2 = F
ENDIF
ENDDO

! IMPRESSO DOS RESULTADOS
WRITE(*,*) F
END


Note que no programa, a varivel ERRO inicializada com um valor maior do
que TOL, de forma que o programa entre no loop. Se a varivel ERRO no
fosse inicializada, ou fosse inicializada com zero, o programa no entraria no
loop uma vez que a condio de entrada e permanncia no loop no seria
satisfeita.


54
8.3. Loops Inf i ni tos

O uso de loops infinitos uma opo alternativa aos loops decisrios,
onde a deciso de sada feita por um IF interno e a sada do loop feita pelo
comando EXIT.
Este tipo de loop tem estrutura lgica:


Incio
Falso
Verdadeiro
Fim
PROCESSO
comparao


Figura 8.5. Fluxograma lgico do loop infinito.


Em termos de programao, a estrutura :

DO
:
PROCESSO
:
IF (<comparao>) EXIT
ENDDO



EXEMPLO 3
Se o exemplo 2 for utilizado com um loop infinito, tem-se o seguinte
fluxograma:

Programao Fortran para Engenharia
Fabiano A.N. Fernandes
55
Incio
ERRO < 0
TOL = 0,001
ERRO = 1,0 Sim
F = (F1 + F2)/2
Calcula ERRO pela EQ2
Re, Rug
F2 = F
1
1
F1 = 0,1
F2 = 0,007
No
F1 = F
ERRO = - ERRO
No
ERRO < TOL
Sim
No
Fim
F


Figura 8.6. Fluxograma lgico para clculo do fator de atrito.

Segundo o fluxograma, aps a leitura e inicializao das variveis, o algoritmo
entra no loop para clculo do fator de atrito. No loop, o fator de atrito
calculado pelo mtodo de bisseo. O erro calculado e dependendo do valor
do erro, pode-se inferir se o valor atual do fator de atrito est super ou
subestimado e baseado neste resultado, define-se os novos limites superior e
inferior para o valor do fator de atrito.
A comparao entre os valores do erro (ERRO) e da tolerncia requerida (TOL)
feita no final do loop. Caso o erro seja menor do que a tolerncia, a execuo
do programa sai do loop usando o comando EXIT.

Em termos de programao, a estrutura a seguinte:

PROGRAM FATRITO2
IMPLICIT REAL*8 (A-H,O-Z)

! LEITURA DAS VARIVEIS
READ(*,*) RE, RUG

! INICIALIZAO DAS VARIVEIS
F1 = 0.1D0
F2 = 0.007D0
TOL = 0.001D0

! CLCULO DO FATOR DE ATRITO VIA MTODO DA BISSEO
56
DO
F = (F1 + F2)/2.0D0
ERRO = F**(-0.5D0) + 2.0D0*DLOG10(RUG/3.7065D0 &
+ 2.5226/(RE*F**0.5D0))
IF (ERRO < 0.0D0) THEN
F1 = F
ERRO = - ERRO
ELSE
F2 = F
ENDIF
IF (ERRO < TOL) EXIT
ENDDO

! IMPRESSO DOS RESULTADOS
WRITE(*,*) F
END

8.4. CYCLE

O comando CYCLE interrompe a execuo do restante do ciclo (loop),
retornando a execuo do programa para o incio do loop. Este comando tem
como estrutura lgica:
Incio
<var> < y
<var> = x
No
Sim
Fim
PROCESSO 1
<var> = <var> + z
<var> < y
Falso
Verdadeiro
PROCESSO 2

Figura 8.7. Fluxograma lgico de um loop usando o comando CYCLE.
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
57
Segundo a estrutura lgia do comando CYCLE, aps a execuo do
PROCESSO 1, uma comparao feita e se esta condio for satisfeita a
varivel de controle <var> incrementada e a execuo do programa volta para
o incio do loop. Caso a condio no seja satisfeita, o PROCESSO 2
executado.
Em termos de programao, a estrutura :

DO <var> = x,y,z
:
PROCESSO 1
:
IF (<comparao>) CYCLE
:
PROCESSO 2
:
ENDDO



EXERCCIOS

EXERCCIO 1
Os ciclones so projetados para remover partculas at um certo tamanho de
corte. Para o projeto do equipamento, a granulometria das partculas a serem
processadas deve ser conhecida.
A equao de granulometria dada pela equao de Rosin-Rammler-Bennett:

1
1
]
1

,
_


n
D
X
X E
*
exp 1 ) (
D* dimetro de corte (constante)
E distribuio acumulada do tamanho de
partculas
n parmetro da equao
X dimetro da partcula (varivel)

Desenvolva um algoritmo e programa para gerar 50 pontos para a curva de
granulometria do sistema (grfico E em funo de X).


58
EXERCCIO 2
Desenvolva um algoritmo e programa para gerar pontos para o grfico de
performance de um sedimentador, obtendo pontos de 50 em 50 unidades da
varivel X. Sendo que o fim da gerao de dados para o grfico for quando o
valor do fluxo de sedimentao (G) for 1000 vezes menor do que o valor
mximo da funo (Gmax).
A equao do sedimentador dada pela equao:

( ) B X A
X G
+
10

onde A = -0.0142
B = 0.370

G fluxo de sedimentao
X concentrao de slidos

O programa deve obter Gmax (maior valor da funo) usando a mesma funo
acima.




Programao Fortran para Engenharia
Fabiano A.N. Fernandes
59
9. VETORES E MATRIZES

Em Fortran, os vetores e matrizes comeam a ser contados a partir da
posio 1.

Um vetor com 5 posies tem forma:
1 2 3 4 5

Uma matriz 3x5 tem forma:
1,1 1,2 1,3 1,4 1,5
2,1 2,2 2,3 2,4 2,5
3,1 3,2 3,3 3,4 3,5

9.1. Ti pos de Vetores e Matri zes

Todos os tipos de variveis podem ser usados como vetores ou matrizes.
Portanto podemos ter os tipos: INTEGER, REAL, REAL*8, COMPLEX.

9.2. Decl arao de Vetores

Os vetores ou matrizes podem ser declarados de duas formas: atravs das
palavras chave de declarao de tipos de variveis, ou atravs do comando
DIMENSION.

v Atravs de declarao de tipo
REAL*8 A(10) vetor com 10 campos
REAL*8 B(3,5) matriz 3x5

v Atravs do comando DIMENSION
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION A(10), B(3,5)

9.3. Atri bui o de Val ores

Valores podem ser atribudos aos vetores e matrizes de forma individual,
por faixa e total.

60
v forma individual
A(2) = 10 atribui o valor 10 ao campo 2

v por faixa
A(2:5) = 10 atribui o valor 10 aos campos 2 at 5, ou seja,
A(2) = A(3) = A(4) = A(5) = 10
B(1:3,3:4) = 10 atribui o valor 10 aos campos
B(1,3) B(2,3) B(3,3)
B(1,4) B(2,4) B(3,4)

v total
A = 10 atribui o valor 10 a todos os campos da varivel A,
ou seja, A(1) = A(2) = ... = A(n) = 10

9.4. Operaes com Vetores e Matri zes

Vetores e matrizes podem ser somados, subtrados, multiplicados e
divididos entre si, desde que sejam de mesmo tamanho:

REAL A(10), B(10), C(10)
A = B o mesmo que fazer A(1) = B(1),
A(2) = B(2), etc...
A = B + C o mesmo que fazer A(1) = B(1) + C(1),
A(2) = B(2) + C(2), etc...

Quando os vetores ou matrizes forem e tamanhos diferentes, uma faixa
comum poder ser somada ou subtrada:

REAL A(10), B(5), C(20)
A(1:5) = B(1:5) o mesmo que fazer A(1) = B(1),
A(2) = B(2), at A(5) = B(5).
A(3:5) = B(3:5) + C(3:5) o mesmo que fazer A(3) = B(3) + C(3),
A(4) = B(4) + C(4) e A(5) = B(5) + C(5)

Se a faixa for diferente ou maior do que o tamanho do vetor ou matriz,
ocorrer um erro na execuo do programa:

REAL A(10), B(5), C(20)
A(1:3) = B(3:5) faixas diferentes
A(1:10) = B(1:10) + C(1:10) B no tem 10 campos

Programao Fortran para Engenharia
Fabiano A.N. Fernandes
61
Os vetores e matrizes tambm podem ser somados, subtrados, divididos
e multiplicados por nmero escalares:

REAL A(5), B(5)
A = B + 5 o mesmo que fazer A(1) = B(1) + 5,
A(2) = B(2) + 5, etc...
A(1:3) = 2*B(1:3) o mesmo que fazer A(1) = 2*B(1),
A(2) = 2*B(2), A(3) = 2*B(3)

Os campos individuais, por sua vez, podem sofrer qualquer tipo de
operao:

A(1) = B(3) + 2
A(2) = B(3)*C(5)*3 + C(1)
D(1,3) = E(1,3) + F(2,7)

9.5. Funes Intrnsecas

O Fortran possui um conjunto de funes matemticas para clculo com
matrizes. As principais funes esto listadas abaixo.

DOT_PRODUCT(A,B) calcula o produto vetorial entre A e B
A e B so dois vetores numricos de igual
tamanho

MATMUL (A,B) calcula o produto matricial entre A e B
A e B so duas matrizes numricas
se A tem tamanho (n,m) e B tem tamanho
(m,k), a matriz resultante ter tamanho (n,k)

MAXVAL (A) retorna o maior valor do vetor A
A um vetor numrico

MINVAL (A) retorna o menor valor do vetor A
A um vetor numrico

SUM(A) calcula o somatrio dos valor do vetor A
A um vetor numrico



62
9.6. Loops com Vetores e Matri zes

Os loops podem ser usados com vetores e matrizes da mesma forma
como foi abordado no Captulo 8. A diferena que os loops podem ser usados
para controlar o campo corrente do vetor ou matriz que ser usado em algum
processo ou calculo.

EXEMPLO 1
Um uso simples dos loops com vetores e matrizes pode ser para controlar o
campo do vetor ou matriz que ser usado em algum clculo.

DO I = 1,10
A(I) = B(I,2)*C(I)
SUM = SUM + C(I)
ENDDO


EXEMPLO 2
Quando se trabalha com anlise estatstica de dados experimentais, comum
ser necessrio calcular a mdia e desvio padro destes dados. O clculo da
mdia e desvio padro de um conjunto de dados pode ser feito seguindo o
fluxograma:

Incio
I < N
N
No
Sim
Fim
X(I)
I = I + 1
I < N
I = 1
No
Sim
MEDIA = MEDIA + X(I)
MEDIA = MEDIA / N
I = I + 1
I < N
I = 1
No
Sim
DP = DP + (X(I) - MEDIA)**2
DP = (DP/(N-1))**0.5
I = I + 1
1
2
1 2
MEDIA, DP
I = 1


Figura 9.1. Fluxograma para clculo da mdia e desvio padro de um conjunto
de dados


Programao Fortran para Engenharia
Fabiano A.N. Fernandes
63
O programa para em Fortran para realizar o clculo teria a forma:

PROGRAM ESTAT
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION X(10)

! LEITURA DE VARIVEIS
WRITE(*,*) NUMERO DE DADOS A SEREM LIDOS: (MAXIMO = 10)
READ(*,*) N
WRITE(*,*) ENTRE COM OS DADOS DO CONJUNTO
DO I = 1,N
READ(*,*) X(I)
ENDDO

! CALCULO DA MDIA
DO I = 1,N
MEDIA = MEDIA + X(I)
ENDDO
MEDIA = MEDIA/N

! CALCULO DO DESVIO PADRO
DO I = 1,N
DP = DP + (X(I) MEDIA)**2.0D0
ENDDO
DP = (DP/(N 1.0D0))**0.5D0

! IMPRESSO DOS RESULTADOS
WRITE(*,*) MEDIA = , MEDIA
WRITE(*,*) DESVIO PADRAO = , DP
END


9.7. Processos Deci sri os com Vetores e Matri zes

Assim como para variveis escalares, os campos individuais dos vetores e
matrizes podem ser usados pelos comandos IF..THEN..ELSE e SELECT
CASE.

EXEMPLO 3
Em processos de estimativa de parmetros, os valores dos parmetros podem
ser armazenados em vetores e estes valores podem estar sujeitos a limites
superiores e inferiores.
No caso, os valores dos parmetros esto armazenados no vetor THETA, os
limites superiores no vetor TMAX e os limites inferiores no vetor TMIN.
64
O fluxograma a ser seguido tem a seguinte estrutura:

Incio
I < NPARAM
I = 1
No
Sim
Fim
I = I + 1
THETA(I) >TMAX(I)
No
Sim
THETA(I) <TMIN(I)
No
Sim
THETA(I) = TMIN(I)
THETA(I) = TMAX(I)


Figura 9.2. Fluxograma lgico para controle de parmetros.

Segundo o fluxograma, primeiramente o valor de THETA(I) comparado com
TMAX(I), recebendo seu valor se THETA(I) for maior do que TMAX(I).
Posteriormente o valor de THETA(I) comparado com TMIN(I), recebendo seu
valor se THETA(I) for menor do que TMIN(I). Esta operao repetida para
todos os parmetros (de 1 at NPARAM onde NPARAM o nmero total de
parmetros).
Em termos de programao, a estrutura :

DO I = 1,NPARAM
IF (THETA(I) > TMAX(I)) THETA(I) = TMAX(I)
IF (THETA(I) < TMIN(I)) THETA(I) = TMIN(I)
ENDDO

Como apresentado no exemplo, o processo decisrio usa os valores
individuais dos campos do vetor e geralmente a ao tambm afeta somente os
valores individuais do vetor ou matriz. Isto ocorre com os comando
IF..THEN..ELSE e SELECT CASE.

Programao Fortran para Engenharia
Fabiano A.N. Fernandes
65
9.7.1. WHERE

O comando WHERE afeta todo o vetor ou matriz e geralmente usado
para realizar alguma operao matemtica com o vetor ou matriz.
Este comando tem a seguinte estrutura lgica:
Incio
I < n
I = 1
No
Sim
Fim
I = I + 1
comparao
Falso
Verdadeiro
PROCESSO 2
PROCESSO 1


Figura 9.3. Fluxograma lgico do comando WHERE. No fluxograma, n o
nmero de campos no vetor ou matriz.

O comando WHERE tem uma lgica parecida com a do comando
IF..THEN..ELSE. A diferena que a comparao afeta todos os campos do
vetor ou matriz e no somente um nico campo (como ocorreria com o
IF..THEN..ELSE).
Em termos de programao, a estrutura :

WHERE (<comparao>)
:
PROCESSO 1
:
ELSEWHERE
:
PROCESSO 2
:
ENDWHERE
66

onde <comparao> a expresso usada para testar a condio a ser verificada.

Caso o PROCESSO consista de somente uma linha de comando, o
comando WHERE pode ser escrito como:

WHERE (<comparao>) PROCESSO

O comando WHERE equivalente ao uso de um comando DO..ENDDO
com a comparao sendo feita por um comando IF..THEN..ELSE:

DO I = 1,N
IF (<comparao>) THEN
:
PROCESSO 1
:
ELSE
:
PROCESSO 2
:
ENDIF
ENDDO

Neste caso, a varivel I deve controlar o campo do vetor/matriz.


EXEMPLO 4
No caso de diviso dos elementos de dois vetores, a diviso no pode ocorrer
se o valor em alguma posio do vetor divisor for zero. O comando WHERE
pode ser usado para executar a diviso somente quando o valor divisor for
zero.
Em termos de programao, a estrutura :

PROGRAM DIVVET
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION A(5), B(5), C(5)

! LEITURA DAS VARIVEIS
DO I = 1,5
READ(*,*) A(I), B(I)
ENDDO

! CLCULO DA DIVISO
C = 0.0D0
WHERE (A /= 0.0D0) C = B/A
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
67

! IMPRESSO DOS RESULTADOS
DO I = 1,5
WRITE(*,*) I, C(I)
ENDDO
END

Se A e B fossem:
B 20 5 12 18 5
A 2 0 2 3 -1
O resultado da diviso seria:
C 10 0 6 6 -5

No caso, a diviso de B(2) com A(2) no ocorreria e C(2) permaneceria com o
seu valor inicial.


9.7.2. FORALL

O comando FORALL funciona como um loop DO..ENDDO, porm
pode ser usado com mais de uma varivel de controle, sendo til com operaes
com matrizes. Este comando tem a seguinte estrutura lgica:
Incio
J < n
I = 1
No
Sim
Fim
J = J + 1
PROCESSO
J = 1
I < m
No
Sim
I = I + 1

Figura 9.4. Fluxograma lgico do comando FORALL. No fluxograma, n e m se
referem ao nmero de campos da matriz (linha e coluna).
68

Em termos de programao, a estrutura :

FORALL (I = x:y, J = w:z)
:
PROCESSO
:
END FORALL


EXERCCIOS

EXERCCIO 1
Muitos programas para engenharia envolvem a normalizao de parte dos dados
de entrada, como por exemplo, programas para redes neurais. Desenvolva um
programa para normalizar um conjunto de dados. A normalizao feita usando
a frmula:

MIN MAX
MIN
NO RM
X X
X X
X

=

X dado original
X
MAX
maior valor do conjunto de dados
XMIN menor valor do conjunto de dados
X
NORM
dado normalizado

O programa deve perguntar ao usurio o nmero de valores que sero lidos.

Programao Fortran para Engenharia
Fabiano A.N. Fernandes
69
10. ARQUIVOS DE DADOS

As operaes com arquivos no Fortran, em geral, so simples
necessitando da abertura do arquivo, gravao ou leitura dos dados e o
fechamento do arquivo.
Quando trabalhando com arquivos, deve-se ter em mente que o tempo de
leitura e gravao em arquivos uma operao relativamente lenta se
comparada com as operaes matemticas. Portanto se um arquivo deve ser lido
vrias vezes durante a execuo do programa, uma boa idia ler todo o
arquivo de uma s vez, armazenando os dados em variveis.


10.1. Operaes com Arqui vos

Arquivos so abertos usando o comando OPEN que tem forma:

OPEN (<unit>, FILE = <arquivo>)

<unit> unidade de referncia para o arquivo
pode ser qualquer nmero inteiro

<arquivo> nome do arquivo a ser criado ou aberto.
o nome do arquivo deve vir entre aspas.

Para escrever dados no arquivo deve-se usar o comando WRITE usando
a unidade do arquivo:

WRITE (<unit> , <formato>) <variveis>

Para ler o arquivo de dados deve-se usar o comando READ, tambm
usando a unidade do arquivo:

READ (<unit> , <formato>) <variveis>

Antes do programa acabar deve-se fechar o arquivo de dados usando o
comando CLOSE:

CLOSE (<unit>)

70
Estes tipos de arquivo usados pelo Fortran so arquivos texto simples e
podem ser editados em qualquer editor de texto (desde que gravados no formato
texto). Em geral se opta pela extenso .TXT ou .DAT para os arquivos de
dados.

EXEMPLO 1
Para abrir o arquivo DATA01.DAT que contm dois nmeros reais, calcular o
produto destes dois nmero e gravar o resultado no arquivo RES01.DAT,
podemos usar o seguinte programa em Fortran:

PROGRAM PRODUTO
IMPLICIT REAL*8 (A-H,O-Z)
! ABERTURA DE ARQUIVOS
OPEN (2,FILE = DATA01.DAT)
OPEN (3,FILE = RES01.DAT)

! LEITURA DAS VARIVEIS
READ(2,*) A, B

! CLCULO
C = A*B

! IMPRESSO DO RESULTADO
WRITE(3,*) C

CLOSE(2)
CLOSE(3)
END


10.2. Arqui vos de Dados Lei tura

Deve-se tomar o devido cuidado para ler corretamente os dados do
arquivo. muito comum erros de arquivos com menos dados do que variveis a
serem lidas, ou de leitura errada dos dados (ler linha errada, ou deixar de ler
alguma varivel).
O comando READ l uma linha de arquivo por vez. Portanto se um
arquivo com trs linha de dados tiver que ser lido, sero necessrios 3 comandos
READ para ler todo o arquivo. Se quatro READ forem usados, um erro
indicando fim de arquivo ser gerado e a execuo do programa ser terminada.
Em cada linha de dados, cada valor dever ser separado por um espao ou
tabulaes.

Programao Fortran para Engenharia
Fabiano A.N. Fernandes
71
EXEMPLO 2
Um arquivo de dados pode ser usado para armazenar os dados de um reator
qumico, das condies iniciais de sua operao e dados cinticos da reao.
Uma linha do arquivo pode conter as dimenses do reator: altura e dimetro;
uma segunda linha pode conter os parmetros cinticos da reao: k
(constante cintica) e Ea (energia de ativao) e uma terceira linha pode conter
as condies operacionais iniciais do reator e reagentes: temperatura,
concentrao de reagente A e concentrao de reagente B, como mostrado
abaixo:

2.58 0.54
510.0 30100.5
342.5 0.015 9.3D-2

Um programa para ler estes dados do arquivo REAT.DAT seria:

PROGRAM LEARQ
IMPLICIT REAL*8 (A-H,O-Z)
OPEN(2, FILES = REAT.DAT)
READ(2,*) H,D
READ(2,*) AK, EA
READ(2,*) TEMP, CA, CB
END


10.2.1. EOF

O comando EOF (end of file) pode ser usado para auxiliar a leitura de
arquivos grandes. Este comando indica se a ltima linha do arquivo j foi lida
ou no. Se EOF for igual a verdadeiro, o final do arquivo foi atingido. Se for
igual a falso, o final do arquivo ainda no foi atingido.
O uso deste comando tem a forma:

EOF(<unit>)

onde <unit> a unidade do arquivo sendo lido.


EXEMPLO 3
Se o arquivo DADOS.TXT que contm duas colunas de nmeros reais, porm
com um nmero desconhecido de linhas tiver de ser lido, o comando EOF pode
ser usado para controlar quando o programa deve parar de ler o arquivo.

PROGRAM READDATA
IMPLICIT REAL*8 (A-H,O-Z)
72
DIMENSION A(1000)

! LEITURA DOS DADOS
OPEN(2, FILE = DADOS.TXT)
N = 0
DO WHILE(.NOT.EOF(2))
N = N + 1
READ(*,*) A(I)
ENDDO
END


10.3. Arqui vos de Dados Impresso

Podemos escrever dados em um arquivo usando o comando WRITE
podendo escolher entre escrever os valores com ou sem formato especfico.
Caso os dados sejam gravados sem especificar um formato, sero
gravados de dois a trs valores por linha. Se mais de 3 variveis forem escritas
por WRITE, esta impresso ocupar mais de uma linha, o que pode
comprometer posteriormente o entendimento da sequncia dos dados que forem
gravados.
A melhor opo para gravao de dados em arquivos usar o comando
WRITE com formato, de forma a ter uma melhor organizao dos dados no
arquivo. Neste caso no h o limite de at trs valores por linha.



EXERCCIOS

EXERCCIO 1
Desenvolva um programa que leia o arquivo DATA01.TXT abaixo:

8.12D0
0.15D0
4.88D3
1030.4D0

Os dados devem ser lidos na varivel X. O programa deve calcular X
2
e X
3
e
imprimir na tela e em um arquivo os valores de X, X
2
e X
3
, para cada um dos
quatro valores contidos no arquivo de leitura.
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
73


EXERCCIO 2
Desenvolva um programa para calcular o progresso da reao qumica de
decomposio do tolueno:

Concentrao de tolueno: ( ) T k C C
A A
= exp
0


=
T R
Ea
A k exp

CA concentrao de tolueno
C
A0
concentrao inicial de tolueno
A fator pr-exponencial
Ea energia de ativao
k taxa de reao
R constante dos gases
T temperatura

Converso de tolueno:
0
0
A
A A
A
C
C C
X

=

X
A
converso

O arquivo de entrada contm as condies operacionais iniciais, os parmetros
cinticos da reao (A e Ea) e a constante dos gases, na seguinte sequncia:

CA0 T
A Ea
R

Com os seguintes dados:

8,0 313,0
2.10
49
77500,0
1,987

O programa deve calcular a concentrao de tolueno e a converso de tolueno
para a reao, para tempos entre 0 e 200 minutos (20 pontos igualmente
74
espaados) e imprimir o tempo e a converso no arquivo RES1.DAT, e a
concentrao de reagente e produtos no arquivo RES2.DAT.

Programao Fortran para Engenharia
Fabiano A.N. Fernandes
73
11. ORGANIZAO DE PROGRAMAS EXTENSOS

Conforme a complexidade de um programa aumenta, o programa
necessita tambm de uma organizao mais complexa, visando uma melhor
organizao do cdigo e o compartilhamento de cdigos comuns a vrias etapas
do algoritmo.
Desta forma podemos dividir o programa em um mdulo de declarao
de variveis globais, programa principal, subrotinas e funes:

Declarao de Variveis Globais
Subrotinas
Programa Principal
Funes



11.1. Mdul o de Vari vei s Gl obai s

O mdulo de variveis globais deve conter as variveis que sero
utilizadas nas demais partes do programa. Declarar as variveis num mdulo de
variveis ajuda a no ter que passar as variveis entre o programa principal e as
subrotinas e funes.
A programao do mdulo tem estrutura:

MODULE <nome>
:
VARIVEIS
:
END MODULE


EXEMPLO 1
Um mdulo de variveis pode ser criado para resolver problemas de clculo de
reatores. Este tipo de problema geralmente necessita ser integrado e os dados
relativos ao processo deve ser compartilhados entre o programa principal e a
subrotina de integrao numrica.
74

MODULE GLOBAL
REAL*8 DENS, VISC, COND
REAL*8 TEMP, PRES
REAL*8 CONCA, CONCB
INTEGER NPARAM
END MODULE

11.2. Programa Pri nci pal

Um programa Fortran deve ter um programa principal em sua estrutura,
sendo ele tem a forma:

PROGRAM <nome>
:
PROCESSO
:
END

onde <nome> o nome que identifica o programa.
Deve-se ter o cuidado de no especificar nenhuma varivel no programa
contendo o mesmo nome do programa principal.

O programa principal controla todo o algoritmo que ser seguido pelo
programa, como declarao e inicializao de variveis, leitura de dados,
chamada de subrotinas e impresso dos resultados.


11.2.1. Use

As variveis globais definidas no mdulo de variveis podero ser
acessveis ao programa principal e s subrotinas e funes atravs do comando
USE.

PROGRAM <nome>
IMPLICIT REAL*8 (A-H,O-Z)
USE <modulo>
:
END

O comando USE deve vir sempre depois da declarao de variveis do
programa principal ou subrotina.
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
75
11.3. Subroti nas

As subrotinas so subprogramas que executam procedimentos
especficos. Uma subrotina pode ser chamada em vrios pontos do programa de
forma que ajuda a evitar a duplicao do mesmo cdigo em pontos diferentes do
programa.

SUBROUTINE <nome> (<variveis>)
:
PROCESSO
:
END SUBROUTINE

onde <nome> o nome que identifica a subrotina. Deve-se ter o cuidado de no
especificar nenhuma varivel no programa contendo o mesmo nome da
subrotina.

<variveis> a lista de variveis que so passadas do programa principal
ou outra subrotina para esta subrotina.


11.3.1. Cal l

As subrotinas so chamadas atravs do comando CALL, que tem a
forma:

CALL <nome da subrotina> (<variveis>)

onde <nome da subrotina> o nome que identifica a subrotina.

<variveis> a lista de variveis que so passadas para a subrotina que
est sendo chamada.


EXEMPLO 1
Um exemplo simples para ilustrar aplicao de subrotinas a criao de uma
subrotina para calcular o produto entre dois nmeros reais.

PROGRAM PROD1
IMPLICIT REAL*8 (A-H,O-Z)
READ(*,*) A,B
! CHAMADA DA SUBROTINA:
CALL PRODUTO (A,B,C)
76
WRITE(*,*) C
END

SUBROUTINE PRODUTO (A,B,C)
IMPLICIT REAL*8 (A-H,O-Z)
C = A*B
END SUBROUTINE


EXEMPLO 2
Se o mesmo exemplo fosse utilizado para multiplicar os campos de dois
vetores, teramos:

PROGRAM PROD2
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION A(10), B(10), C(10)
DO I = 1,10
READ(*,*) A(I), B(I)
ENDDO
CALL PRODUTO (A,B,C)
END

SUBROUTINE PRODUTO (A,B,C)
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION A(10), B(10), C(10)
DO I = 1,10
C(I) = A(I)*B(I)
ENDDO
END SUBROUTINE

Note que os vetores ou matrizes so passados usando somente seu nome. A
subrotina, porm, deve tambm dimensionar os vetores e matrizes que esto
sendo passados.
Para poder generalizar a subrotina para aceitar qualquer tamanho de vetor,
podemos passar na chamada da subrotina o tamanho do vetor:

PROGRAM PROD3
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION A(10), B(10), C(10)
N = 10
DO I = 1,N
READ(*,*) A(I), B(I)
ENDDO
CALL PRODUTO (N,A,B,C)
END
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
77

SUBROUTINE PRODUTO (N,V1,V2,V3)
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION V1(N), V2(N), V3(N)
DO I = 1,N
V3(I) = V1(I)*V2(I)
ENDDO
END SUBROUTINE

Neste caso, o tamanho do vetor (N) tambm passado para a subrotina e o
comando DIMENSION se utiliza deste valor para dimensionar o tamanho do
vetor.
Note tambm que as variveis declaradas na subrotina (V1,V2,V3) podem ter
nomes diferentes do que as variveis que so passadas pelo programa principal
(A,B,C). Porm quando a subrotina chamada V1 recebe o valor de A, V2
recebe o valor de B e V3 recebe o valor de C; e quando a subrotina acaba, A
recebe o valor de V1, B recebe o valor de V2 e C recebe o valor de V3.

O mesmo exemplo pode ser feito passando os valores das variveis do programa
principal para a subrotina definindo as variveis a serem usadas em um mdulo
de variveis globais:

MODULE GLOBAL
INTEGER N
REAL*8 A(10), B(10), C(10)
END MODULE

PROGRAM PROD4
USE GLOBAL
IMPLICIT REAL*8 (A-H,O-Z)
DO I = 1,N
READ(*,*) A(I), B(I)
ENDDO
CALL PRODUTO
END

SUBROUTINE PRODUTO ( )
USE GLOBAL
IMPLICIT REAL*8 (A-H,O-Z)
DO I = 1,N
C(I) = A(I)*B(I)
ENDDO
END SUBROUTINE

78
Neste caso, as variveis do programa principal e da subrotina devem ter o
mesmo nome (A,B,C) pois estas duas partes do programa utilizam-se das
variveis definidas no modulo GLOBAL.
Esta forma de passar variveis muito til quando subrotinas de mtodos
nmeros so usadas (veja no Captulo 12).

11.4. Funes

As funes so subprogramas que executam procedimentos especficos e
retornam um valor nico. Uma funo pode ser chamada em vrios pontos do
programa de forma que ajuda a evitar a duplicao do mesmo cdigo em pontos
diferentes do programa.

<tipo> FUNCTION <nome> (<variveis>)
:
PROCESSO
:
END FUNCTION

onde <nome> o nome que identifica a subrotina.

<variveis> a lista de variveis que so passadas do programa principal
ou outra subrotina para esta subrotina.

<tipo> o tipo de valor que ser retornado pela funo: REAL, REAL*8,
INTEGER, COMPLEX ou CHARACTER.


11.4.1. Chamando Funes

As funes so chamadas da seguinte forma:

<var> = <nome da funo> (<variveis>)

onde <nome da funo> o nome que identifica a funo

<variveis> a lista de variveis que so passadas para a funo que est
sendo chamada.

<var> a varivel que ir receber o valor retornado pela funo

Programao Fortran para Engenharia
Fabiano A.N. Fernandes
79
Esta forma de chamada da funo semelhante ao uso de qualquer
funo matemtica intrnseca do Fortran, como mostrado no Captulo 5.

EXEMPLO 3
Novamente, podemos usar o primeiro exemplo apresentado para multiplicar
dois nmeros reais e desenvolver um programa que se utilize de uma funo
para fazer este clculo.

PROGRAM PROD5
IMPLICIT REAL*8 (A-H,O-Z)
READ(*,*) A,B
! CHAMADA DA FUNO:
C = PRODUTO (A,B)
WRITE(*,*) C
END

REAL*8 FUNCTION PRODUTO (A,B)
IMPLICIT REAL*8 (A-H,O-Z)
PRODUTO = A*B
END FUNCTION

Note que o nome da funo (PRODUTO) deve ser igual ao nome da varivel
(PRODUTO) que ter o valor retornado para o programa principal.


80


Programao Fortran para Engenharia
Fabiano A.N. Fernandes
81
12. MTODOS MATEMTICOS

A resoluo de modelos matemticos de engenharia recai na utilizao de
mtodos numricos, como integrao numrica, regresso, obteno de razes
de funes, estimativa de parmetros, entre outros.
Durante muito anos, vrios pesquisadores e empresas desenvolveram
subrotinas para resoluo de mtodos numricos. Portanto, atualmente, cabe ao
profissional fazer uso destas subrotinas prontas, dedicando maior ateno ao
sistema a ser resolvido do que programao de mtodos numricos.

12.1. Organi zao Geral do Programa

Quando bibliotecas numricas ou subrotinas numricas so utilizadas, a
estrutura do programa segue uma forma semelhante estrutura do programa
apresentada no Captulo 11.
Sendo assim devemos dividir o programa em um mdulo de declarao
de variveis globais, programa principal, subrotinas numrica e subrotina que
conter o modelo matemtico a ser resolvido:

Declarao de Variveis Globais
Subrotina Numrica
Programa Principal
Subrotina do Modelo Matemtico


Quando usamos uma subrotina numrica, esta subrotina chamada pelo
programa principal, que por sua vez chama a subrotina do modelo matemtico.


Mdulo de Variveis Globais

O mdulo de variveis globais muito til quando se utiliza bibliotecas
numricas, pois a forma mais fcil e eficiente de passar os valores das
variveis entre o programa principal e a subrotina que contm o modelo
matemtico.
A programao do mdulo tem estrutura:


82
MODULE GLOBAL
:
VARIVEIS
:
END MODULE


Programa Principal e Chamada da Subrotina Numrica

O programa principal deve conter a leitura e/ou inicializao das
variveis as serem usadas, e a chamada para a subrotina do mtodo numrico:
Muitas subrotinas numricas tem como um dos parmetros de chamada, o
nome da subrotina que contm o modelo matemtico. Neste caso o nome da
subrotina do modelo deve ser declarada no comando EXTERNAL:

PROGRAM <nome>
USE <biblioteca>
USE GLOBAL
EXTERNAL <subrotina do modelo>
:
INICIALIZAES
:
CALL <subrotina numrica>
:
END

onde <nome> o nome que identifica o programa.
<biblioteca> o nome da biblioteca numrica usada. Este comando
usado somente se o cdigo da subrotina com o mtodo numrico
for intrnseco biblioteca numrica. O comando no deve ser
usado se o cdigo da subrotina numrica for inserido ao programa.
<subrotina do modelo> o nome da subrotina que contm o modelo
matemtico.
<subrotina numrica> o nome da subrotina do mtodo numrico e os
parmetros a serem passados para esta subrotina


Subrotina do Modelo Matemtico

A subrotina do modelo matemtico deve conter as equaes que
descrevem o modelo e clculos auxiliares necessrio para o clculo das
equaes do modelo.

Programao Fortran para Engenharia
Fabiano A.N. Fernandes
83

SUBROUTINE <nome> (<variveis>)
:
EQUAES DO MODELO MATEMTICO
:
END SUBROUTINE

onde <nome> o nome que identifica a subrotina. Deve-se ter o cuidado de
no especificar nenhuma varivel no programa contendo o mesmo
nome da subrotina.
<variveis> a lista de variveis que so passadas do programa principal
ou outra subrotina para esta subrotina.



12.1.1. Bi bl i ot ecas Numri cas

As bibliotecas numricas so um conjunto de subrotinas contendo vrios
tipos de mtodos numricos. Estas bibliotecas podem vir na forma de mdulos
ou na forma de cdigos individuais.
Quando a biblioteca est na forma de mdulo, no possvel visualizar o
cdigo da subrotina, e para usar uma subrotina em especfico deve-se declarar o
uso do mdulo (usando o comando USE) e depois chamar a subrotina usando o
comando CALL.
Quando a biblioteca est na forma de cdigo, deve-se copiar o cdigo da
subrotina para o programa ou deve-se adicionar o arquivo com a subrotina para
o projeto sendo desenvolvido. Neste caso no se utiliza o comando USE para
declarar o uso da biblioteca. Somente necessrio chamar a subrotina.

Bibliotecas na forma de mdulo:
IMSL (acompanha vrios compiladores Fortran)
NAG

Bibliotecas na forma de cdigo:
Numerical Recipes (pode ser lido em www.nr.com)
Outras






84
12.1.2. Usando Bi bl i ot ecas Numri cas I MSL

A biblioteca numrica IMSL uma das bibliotecas mais usadas pois
acompanha os compiladores Fortran: Compaq Fortran e Intel Fortran; e vem
como opcionais em vrios outros compiladores.
A estrutura geral de um programa que use alguma subrotina numrica do
IMSL :


MODULE GLOBAL
! DECLARAO DAS VARIVEIS GLOBAIS
INTEGER <variveis>
REAL*8 <variveis>
END MODULE

! PROGRAMA PRINCIPAL
PROGRAM <nome>
USE IMSL ! USA SUBROTINAS NUMRICAS DO IMSL
USE GLOBAL ! USA VARIVEIS GLOBAIS
IMPLICIT REAL*8(A-H,O-Z)
EXTERNAL <subrotina do modelo> ! SUBROTINA DO MODELO

! INICIALIZAO DAS VARIVEIS DO MODELO
<varivel> = <valor>

! INICIALIZAO DOS PARMETROS DA SUBROTINA
<parmetros> = <valor>

! CHAMA A SUBROTINA DO MTODO NUMRICO
CALL <subrotina do mtodo numrico>

! IMPRIME OS RESULTADOS PARCIAIS
WRITE <variveis>
END

! SUBROTINA QUE CONTM O MODELO MATEMTICO
SUBROUTINE <subrotina do modelo>
USE GLOBAL ! USA VARIVEIS GLOBAIS
IMPLICIT REAL*8(A-H,O-Z)

! EQUAES DO MODELO
<equaes>

END SUBROUTINE




Programao Fortran para Engenharia
Fabiano A.N. Fernandes
85
12.1.3. Usando Bi bl i ot ecas Numri cas Out r as

Quando bibliotecas numricas que vem na forma de cdigo so usadas, o
cdigo desta subrotina deve ser copiado para o final do programa. A estrutura
geral de um programa que use este tipo de subrotina numrica :

MODULE GLOBAL
! DECLARAO DAS VARIVEIS GLOBAIS
INTEGER <variveis>
REAL*8 <variveis>
END MODULE

! PROGRAMA PRINCIPAL
PROGRAM <nome>
USE GLOBAL ! USA VARIVEIS GLOBAIS
IMPLICIT REAL*8(A-H,O-Z)
EXTERNAL <subrotina do modelo> ! SUBROTINA DO MODELO

! INICIALIZAO DAS VARIVEIS DO MODELO
<varivel> = <valor>

! INICIALIZAO DOS PARMETROS DA SUBROTINA
<parmetros> = <valor>

! CHAMA A SUBROTINA DO MTODO NUMRICO
CALL <subrotina do mtodo numrico>

! IMPRIME OS RESULTADOS PARCIAIS
WRITE <variveis>
END

! SUBROTINA QUE CONTM O MODELO MATEMTICO
SUBROUTINE <subrotina do modelo>
USE GLOBAL ! USA VARIVEIS GLOBAIS
IMPLICIT REAL*8(A-H,O-Z)

! EQUAES DO MODELO
<equaes>

END SUBROUTINE

! SUBROTINA QUE CONTM O MTODO NUMRICO
! A SUBROTINA DEVE SER COPIADA NESTE PONTO DO PROGRAMA
! NO DEVE-SE FAZER NENHUMA ALTERAO NESTA SUBROTINA
SUBROUTINE <subrotina do mtodo numrico>
<cdigo da subrotina>
END SUBROUTINE


86
12.2. Funo de Zero

Grande parte das equaes que descrevem fenmenos qumicos, fsicos e
biolgicos so equaes no lineares, e portanto a resoluo deste tipo de
equaes parte integrante dos problemas de engenharia.
Diferentemente das equaes lineares em que possvel achar uma
soluo algbrica, nem sempre possvel obter uma soluo algbrica para
equaes no-lineares. Em geral de interesse resolver f(x) = 0 e portanto deve-
se achar as razes da equao. Os principais mtodos para obteno das raizes
da equao so: mtodo da bisseo, mtodo da secante, mtodo de Newton ou
mtodos que combinem as caractersticas de dois deste mtodos.
Uma das principais subrotinas numricas para o clculo das razes de uma
equao (FZERO) utiliza de um misto do mtodo da bisseo com o mtodo da
secante, aliando a certeza de resposta da primeira com a rapidez da segunda.


12.2.1. Usando I MSL

A subrotina mais comum para obteno de razes do IMSL a DZREAL.
A chamada desta subrotina tem a seguinte estrutura:

DZREAL (<modelo>,ATOL,RTOL,EPS,ETA,NRAIZ,ITMAX,XGUESS,X,INFO)

onde <modelo> nome da funo que contm a equao.
ATOL erro absoluto (primeiro critrio de parada)
RTOL erro relativo (segundo critrio de parada)
EPS distncia mnima entre os zeros da funo
ETA critrio de distanciamento. Se a distncia entre dois zeros da
funo for menor do que a distncia mnima definida em
EPS, ento um novo chute dado a uma distncia: ltima
raiz encontrada + ETA.
NRAIZ nmero de razes que devem ser obtidas
ITMAX nmero mximo de iteraes
XGUESS vetor que deve conter os chutes iniciais dos valores das
razes (tamanho do vetor = NRAIZ)
X vetor que conter as razes da funo (tamanho do vetor =
NRAIZ)
INFO vetor que conter o nmero de iteraes necessrias para
obter as razes (tamanho do vetor = NRAIZ)



Programao Fortran para Engenharia
Fabiano A.N. Fernandes
87
Funo da Equao Matemtica

A funo que contm o equao matemtica que se deseja obter as razes
tem a seguinte estrutura:

REAL*8 FUNCTION <modelo> (X)

onde X valor do ponto em que a funo esta sendo avaliada.


EXEMPLO 1
Considerando que se deseja obter as razes da equao:
6 2 ) (
2
+ X X X f
A equao que ser programada ser a seguinte:
<modelo> = X**2 + 2*X -6


Estrutura Geral do Programa

A estrutura geral de um programa de integrao usando a DZREAL tem
a forma:

MODULE GLOBAL
! DECLARAO DAS VARIVEIS GLOBAIS
INTEGER <variveis>
REAL*8 <variveis>
END MODULE

! PROGRAMA PRINCIPAL
PROGRAM <nome>
USE IMSL ! USA SUBROTINAS NUMRICAS DO IMSL
USE GLOBAL ! USA VARIVEIS GLOBAIS
IMPLICIT REAL*8(A-H,O-Z)
DIMENSION XGUESS(<nraiz>), X(<nraiz>), INFO(<nraiz>)
EXTERNAL <modelo> ! FUNO DO MODELO

! INICIALIZAO DAS VARIVEIS DO MODELO
NRAIZ = <nraiz> ! DEFINE O NMERO DE RAIZES PROCURADAS
<varivel> = <valor>

! DEFINIO DOS CHUTES INICIAS PARA AS RAZES
! DEVEM SER DEFINIDOS nraiz CHUTES
XGUESS(<campo>) = <valor>

! INICIALIZAO DOS PARMETROS DA SUBROTINA
88
EPS = 1.0D-5
ETA = 1.0D-2
ATOL = 1.0D-5
RTOL = 1.0D-5
ITMAX = 1000

! CHAMA A SUBROTINA DE OBTENO DAS RAIZES
CALL DZREAL(<modelo>,ATOL,RTOL,EPS,ETA,NRAIZ,ITMAX,XGUESS,X,INFO)

! IMPRIME AS RAIZES
WRITE <X>
END

! FUNO QUE CONTM A EQUAO
REAL*8 FUNCTION <modelo> (X)
USE GLOBAL
IMPLICIT REAL*8(A-H,O-Z)

! EQUAO
<modelo> = <equaes>

END FUNCTION


EXEMPLO 2
Se desejarmos obter as duas razes da equao apresentada no Exemplo 1,
devemos utilizar o seguinte programa:

! PROGRAMA PRINCIPAL
PROGRAM RAIZES01
USE IMSL ! USA SUBROTINAS NUMRICAS DO IMSL
IMPLICIT REAL*8(A-H,O-Z)
DIMENSION XGUESS(2), X(2), INFO(2)
EXTERNAL FCN ! FUNO DO MODELO

! INICIALIZAO DAS VARIVEIS DO MODELO
NRAIZ = 2 ! DEFINE O NMERO DE RAIZES PROCURADAS

! DEFINIO DOS CHUTES INICIAS PARA AS RAZES
! DEVEM SER DEFINIDOS nraiz CHUTES
XGUESS(1) = 4.5D0
XGUESS(2) = -100.0D0

! INICIALIZAO DOS PARMETROS DA SUBROTINA
EPS = 1.0D-5
ETA = 1.0D-2
ATOL = 1.0D-5
RTOL = 1.0D-5
ITMAX = 1000

Programao Fortran para Engenharia
Fabiano A.N. Fernandes
89
! CHAMA A SUBROTINA DE OBTENO DAS RAIZES
CALL DZREAL(FCN,ATOL,RTOL,EPS,ETA,NRAIZ,ITMAX,XGUESS,X,INFO)

! IMPRIME AS RAIZES
WRITE(*,*) X(1), X(2)
END

! FUNO QUE CONTM A EQUAO
REAL*8 FUNCTION FCN(X)
IMPLICIT REAL*8(A-H,O-Z)
! EQUAO
FCN = X**2.0D0 + 2.0D0*X - 6.0D0
END FUNCTION


Note que neste programa, no foi passado nenhuma varivel do programa
principal para a funo FCN. Portanto o mdulo de variveis globais no foi
necessrio.
Apenas a varivel X passada para FCN, mas esta varivel passada do
programa principal para a subrotina DZREAL e da subrotina para a funo
FCN.



12.2.2. Usando Numeri cal Reci pes

No Numerical Recipes encontram-se listadas vrias subrotinas para
obteno de zeros de funo. Abaixo mostramos o uso da subrotina RTBIS
(adaptada do Numerical Recipes), que usa o mtodo da bisseo para encontrar
a raiz de uma funo.
A chamada desta funo tem a seguinte estrutura:

RTBIS (<modelo>,X1,X2,TOL)

onde <modelo> nome da funo que contm a equao.
X1 valor inicial da faixa de valores onde a raiz ser procurada
X2 valor final da faixa de valores onde a raiz ser procurada
TOL erro absoluto (critrio de parada)
INFO vetor que conter o nmero de iteraes necessrias para
obter as razes (tamanho do vetor = NRAIZ)

Nesta subrotina, a raiz da funo procurada entre os valores de X1 e
X2.


90
Funo da Equao Matemtica

A funo que contm o equao matemtica que se deseja obter as razes
tem a seguinte estrutura:

REAL*8 FUNCTION <modelo> (X)

onde X valor do ponto em que a funo esta sendo avaliada.


Estrutura Geral do Programa

A estrutura geral de um programa de integrao usando a RTBIS tem a
forma:

MODULE GLOBAL
! DECLARAO DAS VARIVEIS GLOBAIS
INTEGER <variveis>
REAL*8 <variveis>
END MODULE

! PROGRAMA PRINCIPAL
PROGRAM <nome>
USE GLOBAL ! USA VARIVEIS GLOBAIS
IMPLICIT REAL*8(A-H,O-Z)
EXTERNAL <modelo> ! FUNO DO MODELO

! INICIALIZAO DAS VARIVEIS DO MODELO
<varivel> = <valor>

! DEFINIO DOS CHUTES INICIAS PARA AS RAZES
! DEVEM SER DEFINIDOS OS LIMITES INFERIOR E SUPERIOR DE BUSCA
X1 = <valor inferior>
X2 = <valor superior>

! INICIALIZAO DOS PARMETROS DA FUNO
TOL = 1.0D-5

! CHAMA A FUNO DE OBTENO DA RAIZ
XRAIZ = RTBIS(<modelo>,X1,X2,TOL)

! IMPRIME A RAIZ
WRITE <XRAIZ>
END

! FUNO QUE CONTM A EQUAO
REAL*8 FUNCTION <modelo> (X)
USE GLOBAL
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
91
IMPLICIT REAL*8(A-H,O-Z)

! EQUAO
<modelo> = <equao>

END FUNCTION

! FUNO COM O MTODO DA BISSEO PARA
! OBTENO DA RAIZ DE UMA FUNO
REAL*8 FUNCTION RTBIS(FUNC,X1,X2,XACC)
IMPLICIT REAL*8(A-H,O-Z)

JMAX = 1000
FMID = FUNC(X2)
F = FUNC(X1)
IF (F*FMID >= 0.0D0) THEN
WRITE(*,*) ' NAO EXISTE RAIZ ENTRE ', X1, ' E ', X2
RETURN
ENDIF
IF (F < 0.0D0) THEN
RTBIS = X1
DX = X2 - X1
ELSE
RTBIS = X2
DX = X1 - X2
ENDIF
DO J = 1,JMAX
DX = DX*0.5D0
XMID = RTBIS + DX
FMID = FUNC(XMID)
IF (FMID <= 0.0D0) RTBIS = XMID
IF ((ABS(DX) < XACC).OR.(FMID == 0.0D0)) RETURN
ENDDO
WRITE(*,*) ' NUMERO MAXIMO DE ITERACOES FOI ULTRAPASSADO '
END FUNCTION


EXEMPLO 3
A funo RTBIS apenas retorna uma nica raiz no intervalo especificado. Se
duas ou mais razes tiverem de ser obtidas, o programa deve chamar a funo
RTBIS, especificando um intervalo de busca diferente.
Se desejarmos obter as duas razes da equao apresentada no Exemplo 1,
devemos utilizar o seguinte programa:

! PROGRAMA PRINCIPAL
! OBTENO DE RAIZES PELO MTODO DA BISSEO
PROGRAM RAIZES03
IMPLICIT REAL*8(A-H,O-Z)
EXTERNAL FCN ! FUNO DO MODELO

92
! DEFINIO DOS CHUTES INICIAS PARA AS RAZES
! DEVEM SER DEFINIDOS OS LIMITES INFERIOR E SUPERIOR DE BUSCA
X1 = 0.0D0
X2 = 5.0D0

! INICIALIZAO DOS PARMETROS DA SUBROTINA
TOL = 1.0D-4

! CHAMA A FUNO DE OBTENO DAS RAIZES
XRAIZ1 = RTBIS(FCN,X1,X2,TOL)

! OBTENO DA SEGUNDA RAIZ
X1 = -10.0D0
X2 = 0.0D0
XRAIZ2 = RTBIS(FCN,X1,X2,TOL)

! IMPRIME AS RAIZES
WRITE(*,*) XRAIZ1, XRAIZ2
END

! FUNO QUE CONTM A EQUAO
REAL*8 FUNCTION FCN(X)
IMPLICIT REAL*8(A-H,O-Z)
! EQUAO
FCN = X**2.0D0 + 2.0D0*X - 6.0D0
END FUNCTION

! INSERIR NESTE PONTO A FUNO DO MTODO NUMRICO (RTBIS)


12.3. Integrao Numri ca

Programa que envolvem integrao numrica so muito comuns em
engenharia, principalmente em aplicaes de controle de processos, dinmica de
processos, clculo de reatores, leitos fixos e fluidizados, processos de absoro
e adsoro, filtrao, secagem, entre outros.
As subrotinas mais utilizadas para integrao numrica so as subrotinas
baseadas no mtodo de Runge-Kutta e DASSL.


12.3.1. Usando I MSL

A subrotina mais comum para integrao numrica do IMSL a
DIVPRK, baseada no mtodo de Runge-Kutta.
A chamada desta subrotina tem a seguinte estrutura:

Programao Fortran para Engenharia
Fabiano A.N. Fernandes
93
DIVPRK(IDO, NEQ, <modelo>, T, TOUT, ATOL, PARAM, Y)

onde <modelo> nome da subrotina que contm o modelo matemtico.
IDO varivel de controle da integrao e de erro
NEQ nmero de equaes do modelo matemtico
T tempo inicial de integrao
TOUT tempo final de integrao
ATOL tolerncia
PARAM vetor com as opes de configurao da subrotina
Y varivel sendo integrada

A varivel IDO controla a entrada e sada da subrotina, modificando seu
valor dependendo se ocorreu algum erro durante a execuo da subrotina. A
varivel IDO deve ser inicializada com o valor 1 antes de entrar pela primeira
vez na subrotina. Quando a execuo da subrotina DIVPRK termina sua
execuo, a varivel IDO pode conter os valores: 2 quando no houve erro de
execuo, ou 4, 5 ou 6 quando houve algum erro. Em caso de erro, a integrao
deve ser interrompida. Se no houve erro (IDO = 2) a subrotina de integrao
pode ser chamada novamente dando continuidade integrao. Aps o termino
do uso da subrotina DIVPRK, a varivel IDO deve receber o valor 3 e a
subrotina deve ser chamada pela ltima vez, para liberar memria e indicar o
fim da integrao.
A varivel PARAM um vetor com 50 campos, que contm opes de
como a subrotina DIVPRK deve conduzir a integrao. Se a varivel PARAM
for inicializada com o valor 0.0D0 em todos os seus campos, isto indicar que a
subrotina deve ser conduzida em sua forma padro (funcionamento bom para a
grande maioria dos casos). Para integraes mais complicadas (stiff),
necessrio modificar algumas opes da integrao:

PARAM(1) passo inicial da integrao
PARAM(2) passo mnimo de integrao
PARAM(3) passo mximo de integrao
PARAM(4) aumenta o nmero de iteraes (normal: 500)


Subrotina do Modelo Matemtico

A subrotina que contm o modelo matemtico a ser integrado tem a
seguinte estrutura:

SUBROUTINE <modelo> (N,T,Y,YPRIME)

94
onde N nmero de equaes diferenciais
T tempo
Y varivel
YPRIME derivada de Y


EXEMPLO 4
Considerando um sistema de equaes diferencias contendo trs equaes:

2
2 3 X X
dt
dC
+
C X
dt
dT
2
) / 5 exp( 3 T
dt
dX

Para construir um modelo matemtico para ser usado com a subrotina
DIVPRK, temos que renomear as variveis C, T e X tornando-as campos da
varivel Y. Portanto Y(1) = C, Y(2) = T e Y(3) = X.
A mesma analogia deve ser seguida para as derivadas de C, T e X, que se
tornaram campos da varivel YPRIME. Portanto YPRIME(1) = dC/dt,
YPRIME(2) = dT/dt e YPRIME(3) = dX/dt.
Ateno: A varivel YPRIME(1) deve conter a derivada da varivel Y(1) e assim
por diante.
O sistema de equaes que ser programado ser o seguinte:

2
) 3 ( 2 ) 3 ( 3 ) 1 ( Y Y YPRIME +
) 1 ( ) 3 ( 2 ) 2 ( Y Y YPRIME
)) 2 ( / 5 exp( 3 ) 3 ( Y YPRIME


Estrutura Geral do Programa

A estrutura geral de um programa de integrao usando a DIVPRK tem a
forma:

MODULE GLOBAL
! DECLARAO DAS VARIVEIS GLOBAIS
INTEGER <variveis>
REAL*8 <variveis>
END MODULE

Programao Fortran para Engenharia
Fabiano A.N. Fernandes
95
! PROGRAMA PRINCIPAL
PROGRAM <nome>
USE IMSL ! USA SUBROTINAS NUMRICAS DO IMSL
USE GLOBAL ! USA VARIVEIS GLOBAIS
IMPLICIT REAL*8(A-H,O-Z)
! Y = VARIVEL, YPRIME = DERIVADA DE Y
REAL*8 Y(<tamanho>), YPRIME(<tamanho>)
DIMENSION PARAM(50) ! OBRIGATRIO PARA DIVPRK
EXTERNAL <modelo> ! SUBROTINA DO MODELO

! INICIALIZAO DAS VARIVEIS DO MODELO
NEQ = <tamanho> ! NMERO DE EQUAES DIFERENCIAIS
Y(<campo>) = <valor> ! VALORES INICIAIS DAS VARIVEIS A
! SEREM INTEGRADAS
<varivel> = <valor>

! DEFINIO DA FAIXA DE INTEGRAO
T = 0.0D0 ! TEMPO INICIAL
TFINAL = <tempo> ! TEMPO FINAL
TIMPR = <intervalo> ! INVERVALO DE IMPRESSO
! DEVE SER MENOR OU IGUAL A TFINAL

! INICIALIZAO DOS PARMETROS DA SUBROTINA
IDO = 1 ! INICIALIZAO DA SUBROTINA
ATOL = 1.0D-4 ! TOLERNCIA
PARAM = 0.0D0 ! USA A SUBROTINA DIVPRK NA SUA CONFIG.PADRO
PARAM(4) = 1000000 ! AUMENTA O NMERO DE ITERAES POSSVEIS

! IMPRIME AS CONDIES INICIAIS
WRITE(*,*) <variveis>

DO WHILE (T < TFINAL)
! FAZ INTEGRAO AT O PROXIMO PONTO DE IMPRESSO
TOUT = T + TIMPR

! CHAMA A SUBROTINA DE INTEGRAO
CALL DIVPRK (IDO, NEQ, <modelo>, T, TOUT, ATOL, PARAM, Y)

! IMPRIME OS RESULTADOS PARCIAIS
WRITE(*,*) <variveis>
ENDDO

! TERMINA A INTEGRAO E LIBERA ESPAO NA MEMRIA
! (OBRIGATRIO PARA DIVPRK)
CALL DIVPRK (3, NEQ, FCNMOD, T, TOUT, ATOL, PARAM, C)
END

! SUBROTINA QUE CONTM O MODELO MATEMTICO
SUBROUTINE <modelo> (NEQ, T, Y, YPRIME)
USE GLOBAL ! USA VARIVEIS GLOBAIS
IMPLICIT REAL*8(A-H,O-Z)
DIMENSION Y(NEQ), YPRIME(NEQ)
96

! EQUAES DIFERENCIAIS DO MODELO
YPRIME(<campo>) = <equao>

END SUBROUTINE


EXEMPLO 5
Compostos clorados derivados do benzeno so produzidos, geralmente, em
reatores do tipo semi-batelada, que um reator em que parte dos reagentes
introduzida antes do incio da reao e outra parte dos reagentes
continuamente alimentada ao longo do processo.
No caso da clorao do benzeno, uma carga inicial de benzeno introduzida
no reator e cloro alimentado um fluxo contnuo no reator de forma que a
concentrao de cloro no reator seja igual a sua concentrao de saturao no
benzeno e seus derivados.
Trs reaes ocorrem simultaneamente no reator, produzindo trs diferentes
derivados do benzeno: monoclorobenzeno, diclorobenzeno e triclorobenzeno.

C6H6 + Cl2 C6H5Cl + HCl
C6H5Cl + Cl2 C6H4Cl2 + HCl
C6H4Cl2 + Cl2 C6H3Cl3 + HCl

No reator a concentrao de benzeno e seus derivados variam constantemente
com relao ao tempo de reao, de acordo com as equaes:

Cl B
B
C C k
dt
dC

1


Cl MCB Cl B
MCB
C C k C C k
dt
dC
+
2 1


Cl DCB Cl MCB
DCB
C C k C C k
dt
dC
+
3 2


Cl DCB
TCB
C C k
dt
dC
+
3


CB concentrao de benzeno
CMCB concentrao de monoclorobenzeno
CDCB concentrao de diclorobenzeno
CTCB concentrao de triclorobenzeno
CCl concentrao de cloro
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
97
k1 constante de reao = 24,08 L/mol.min
k2 constante de reao = 3,02 L/mol.min
k3 constante de reao = 0,10 L/mol.min

A carga inicial de benzeno no reator de 8850 kg (peso molecular 78 g/mol e
densidade 0.8731 kg/L). A concentrao de cloro permanece constante em
0.12 mol de cloro por mol de benzeno alimentado inicialmente (devido a
alimentao contnua de cloro no reator). A concentrao de HCl
praticamente zero, pois o HCl vaporiza e deixa o reator.

O perfil de concentraes do benzeno e derivados do benzeno em funo do
tempo de reao pode ser obtido pelo seguinte programa:


MODULE GLOBAL
REAL*8 B0,ANB0,AK1,AK2,AK3
REAL*8 CL,V
END MODULE


! PROGRAMA PARA CLCULO DE UM REATOR PARA PRODUO DE
CLOROBENZENOS
PROGRAM CLBENZ
USE IMSL ! USA SUBROTINAS NUMRICAS DO IMSL
USE GLOBAL ! USA VARIVEIS GLOBAIS
IMPLICIT REAL*8(A-H,O-Z)
REAL*8 Y(4), YPRIME(4) ! Y = VARIVEL, YPRIME = DERIVADA DE Y
DIMENSION PARAM(50) ! OBRIGATRIO PARA DIVPRK
EXTERNAL FCNMOD ! SUBROTINA DO MODELO

! INICIALIZAO DOS PARMETROS E CONSTANTES DO MODELO
B0 = 8850.0D0
ANB0 = B0/0.078D0

AK1 = 28.08D0
AK2 = 3.02D0
AK3 = 0.10D0

V = 0.8731D0*B0

! INICIALIZAO DAS VARIVEIS DO MODELO
NEQ = 4
Y(1) = ANB0/V ! CONC.BENZENO
Y(2) = 0.0D0 ! CONC.CLOROBENZENO
Y(3) = 0.0D0 ! CONC.DICLOROBENZENO
Y(4) = 0.0D0 ! CONC.TRICLOROBENZENO
CL = 0.012D0*ANB0/V ! CONC.CLORO

! DEFINIO DA FAIXA DE INTEGRAO
T = 0.0D0 ! TEMPO INICIAL
98
TFINAL = 10.0D0 ! TEMPO FINAL
TIMPR = 0.5D0 ! INVERVALO DE IMPRESSO

! INICIALIZAO DOS PARMETROS DA SUBROTINA
IDO = 1 ! INICIALIZAO DA SUBROTINA
ATOL = 1.0D-4 ! TOLERNCIA
PARAM = 0.0D0 ! USA A SUBROTINA DIVPRK NA SUA CONFIG.PADRO
PARAM(4) = 1000000 ! AUMENTA O NMERO DE ITERAES POSSVEIS

! IMPRIME AS CONDIES INICIAIS
WRITE(*,*) 'TEMPO BENZENO CLBENZ DICLBENZ TRICLBENZ'
WRITE(*,'(F4.1,4(F10.2))') T,Y(1),Y(2),Y(3),Y(4)

DO WHILE (T < TFINAL)
! FAZ INTEGRAO AT O PROXIMO PONTO DE IMPRESSO
TOUT = T + TIMPR

! CHAMA A SUBROTINA DE INTEGRAO
CALL DIVPRK (IDO, NEQ, FCNMOD, T, TOUT, ATOL, PARAM, Y)

! IMPEDE CONCENTRAES NEGATIVAS
WHERE(Y < 0.0D0) Y = 0.0D0

! IMPRIME OS RESULTADOS PARCIAIS
WRITE(*,'(F4.1,4(F10.2))') T,Y(1),Y(2),Y(3),Y(4)

ENDDO

! TERMINA A INTEGRAO E LIBERA ESPAO NA MEMRIA
! (OBRIGATRIO PARA DIVPRK)
CALL DIVPRK (3, NEQ, FCNMOD, T, TOUT, ATOL, PARAM, C)

END


! SUBROTINA QUE CONTM O MODELO MATEMTICO A SER INTEGRADO
SUBROUTINE FCNMOD(NEQ,T,Y,YPRIME)
USE GLOBAL
IMPLICIT REAL*8(A-H,O-Z)
DIMENSION Y(NEQ), YPRIME(NEQ)

YPRIME(1) = - AK1*Y(1)*CL
YPRIME(2) = AK1*Y(1)*CL - AK2*Y(2)*CL
YPRIME(3) = AK2*Y(2)*CL - AK3*Y(3)*CL
YPRIME(4) = AK3*Y(3)*CL

END SUBROUTINE



Programao Fortran para Engenharia
Fabiano A.N. Fernandes
99
12.3.2. Usando Numeri cal Reci pes

No Numerical Recipes encontram-se listadas vrias subrotinas para
integrao numrica. Abaixo mostramos o uso da subrotina RK4 (adaptada do
Numerical Recipes), que usa o mtodo de Runge-Kutta para integrao
numrica
A chamada desta funo tem a seguinte estrutura:

RK4(NEQ,Y,YPRIME,T,H,YOUT,<modelo>)

onde <modelo> nome da subrotina que contm o modelo matemtico.
NEQ nmero de equaes do modelo
Y valor inicial da varivel sendo integrada
YPRIME valor da derivada da varivel sendo integrada
T tempo inicial de integrao
H passo de integrao. Recomenda-se que seja pelo igual ou
menor do que 10
-3
.TIMPR (onde TIMPR o intervalo de
impresso dos valores de Y)
YOUT valor final da varivel sendo integrada (aps ser integrada
entre T e T+H)


Subrotina do Modelo Matemtico

A subrotina que contm o modelo matemtico a ser integrado tem a
seguinte estrutura:

SUBROUTINE <modelo> (NEQ, T, Y, YPRIME)

onde NEQ nmero de equaes diferenciais
T tempo
Y varivel sendo integrada
YPRIME derivada de Y

A forma de programar o modelo matemtico igual ao mostrado no
Exemplo 4.


Estrutura Geral do Programa

A estrutura geral de um programa de integrao usando a RK4 tem a
forma:
100

MODULE GLOBAL
! DECLARAO DAS VARIVEIS GLOBAIS
INTEGER <variveis>
REAL*8 <variveis>
END MODULE

! PROGRAMA PRINCIPAL
PROGRAM <nome>
USE GLOBAL ! USA VARIVEIS GLOBAIS
IMPLICIT REAL*8(A-H,O-Z)
! Y = VARIVEL, YPRIME = DERIVADA DE Y, YOUT = VARIVEL AUXILIAR
REAL*8 Y(<tamanho>), YPRIME(<tamanho>), YOUT(<tamanho>)
EXTERNAL <modelo> ! SUBROTINA DO MODELO

! INICIALIZAO DAS VARIVEIS DO MODELO
NEQ = <tamanho> ! NMERO DE EQUAES DIFERENCIAIS
Y(<campo>) = <valor> ! VALORES INICIAIS DAS VARIVEIS A
! SEREM INTEGRADAS
<varivel> = <valor>

! DEFINIO DA FAIXA DE INTEGRAO
T = 0.0D0 ! TEMPO INICIAL
TFINAL = <tempo> ! TEMPO FINAL
TIMPR = <intervalo> ! INVERVALO DE IMPRESSO
! DEVE SER MENOR OU IGUAL A TFINAL

! INICIALIZAO DOS PARMETROS DA SUBROTINA
H = 1.0D-3 ! PASSO DE INTEGRAO

DO WHILE (T < TFINAL)
! FAZ INTEGRAO AT O PROXIMO PONTO DE IMPRESSO
TOUT = T + TIMPR

! CHAMA A SUBROTINA DE INTEGRAO
DO WHILE (T < TOUT)
CALL RK4(NEQ,Y,YPRIME,T,H,YOUT,<modelo>)
Y = YOUT
T = T + H
ENDDO

! IMPRIME OS RESULTADOS PARCIAIS
WRITE(*,*) <variveis>
ENDDO

END

! SUBROTINA QUE CONTM O MODELO MATEMTICO
SUBROUTINE <modelo> (NEQ, T, Y, YPRIME)
USE GLOBAL ! USA VARIVEIS GLOBAIS
IMPLICIT REAL*8(A-H,O-Z)
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
101
DIMENSION Y(NEQ), YPRIME(NEQ)

! EQUAES DIFERENCIAIS DO MODELO
YPRIME(<campo>) = <equao>
END SUBROUTINE


! SUBROTINA QUE CONTM O MTODO DE INTEGRAO NUMRICA
SUBROUTINE RK4(N,Y,DYDX,X,H,YOUT,DERIVS)
IMPLICIT REAL*8(A-H,O-Z)
DIMENSION Y(N), YOUT(N), DYDX(N)
DIMENSION DYM(N), DYT(N), YT(N)
HH = 0.5D0*H
H6 = H/6.0D0
XH = X + HH
DO I=1,N
YT(I) = Y(I) + HH*DYDX(I)
ENDDO
CALL DERIVS(N,XH,YT,DYT)
DO I = 1,N
YT(I) = Y(I) + HH*DYT(I)
ENDDO
CALL DERIVS(N,XH,YT,DYM)
DO I = 1,N
YT(I) = Y(I) + H*DYM(I)
DYM(I) = DYT(I) + DYM(I)
ENDDO
CALL DERIVS(N,X+H,YT,DYT)
DO I = 1,N
YOUT(I) = Y(I) + H6*(DYDX(I) + DYT(I) + 2.0D0*DYM(I))
ENDDO
END SUBROUTINE


EXEMPLO 6
Se desejarmos integrarmos o modelo matemtico apresentado no Exemplo 5,
usando a subrotina RK4, devemos utilizar o seguinte programa:

MODULE GLOBAL
! DECLARAO DAS VARIVEIS GLOBAIS
REAL*8 B0,ANB0,AK1,AK2,AK3
REAL*8 CL,V
END MODULE

! PROGRAMA PRINCIPAL
PROGRAM CLBENZ02
USE GLOBAL ! USA VARIVEIS GLOBAIS
IMPLICIT REAL*8(A-H,O-Z)
! Y = VARIVEL, YPRIME = DERIVADA DE Y, YOUT = VARIVEL AUXILIAR
REAL*8 Y(4), YPRIME(4), YOUT(4)
102
EXTERNAL FCNMOD ! SUBROTINA DO MODELO

! INICIALIZAO DOS PARMETROS E CONSTANTES DO MODELO
B0 = 8849.5D0
ANB0 = B0/0.078D0
AK1 = 24.08D0
AK2 = 3.02D0
AK3 = 0.10D0
V = 0.8731D0*B0

! INICIALIZAO DAS VARIVEIS DO MODELO
NEQ = 4
Y(1) = ANB0/V ! CONC.BENZENO
Y(2) = 0.0D0 ! CONC.CLOROBENZENO
Y(3) = 0.0D0 ! CONC.DICLOROBENZENO
Y(4) = 0.0D0 ! CONC.TRICLOROBENZENO
CL = 0.012D0*ANB0/V ! CONC.CLORO

! DEFINIO DA FAIXA DE INTEGRAO
T = 0.0D0 ! TEMPO INICIAL
TFINAL = 10.0D0 ! TEMPO FINAL
TIMPR = 0.5D0 ! INVERVALO DE IMPRESSO

! INICIALIZAO DOS PARMETROS DA SUBROTINA
H = 1.0D-3 ! PASSO DE INTEGRAO

! IMPRIME AS CONDIES INICIAIS
WRITE(*,*) 'TEMPO BENZENO CLBENZ DICLBENZ TRICLBENZ'
WRITE(*,'(F4.1,4(F10.2))') T,Y(1),Y(2),Y(3),Y(4)

DO WHILE (T < TFINAL)
! FAZ INTEGRAO AT O PROXIMO PONTO DE IMPRESSO
TOUT = T + TIMPR

! CHAMA A SUBROTINA DE INTEGRAO
DO WHILE (T < TOUT)
CALL RK4(NEQ,Y,YPRIME,T,H,YOUT,FCNMOD)
Y = YOUT
T = T + H
! IMPEDE CONCENTRAES NEGATIVAS
WHERE(Y < 0.0D0) Y = 0.0D0
ENDDO

! IMPRIME OS RESULTADOS PARCIAIS
WRITE(*,'(F4.1,4(F10.2))') T,Y(1),Y(2),Y(3),Y(4)
ENDDO
END

! SUBROTINA QUE CONTM O MODELO MATEMTICO
SUBROUTINE FCNMOD (NEQ, T, Y, YPRIME)
USE GLOBAL ! USA VARIVEIS GLOBAIS
IMPLICIT REAL*8(A-H,O-Z)
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
103
DIMENSION Y(NEQ), YPRIME(NEQ)

YPRIME(1) = - AK1*Y(1)*CL
YPRIME(2) = AK1*Y(1)*CL - AK2*Y(2)*CL
YPRIME(3) = AK2*Y(2)*CL - AK3*Y(3)*CL
YPRIME(4) = AK3*Y(3)*CL
END SUBROUTINE

12.4. Regresso No- Li near

A regresso no-linear muito usado em engenharia, pois muitas vezes
necessrio achar os coeficientes (ou parmetros) de uma equao ou modelo
para um conjunto de observaes.
As subrotinas mais utilizadas para integrao numrica so as subrotinas
baseadas no mtodo de


12.4.1. Usando I MSL

A subrotina mais comum para integrao numrica do IMSL a
DRNLIN, baseada no mtodo de
A chamada desta subrotina tem a seguinte estrutura:

DRNLIN (<modelo>, NPRM, IDERIV, THETA, R, LDR, IRANK, DFE, SSE)

onde <modelo> nome da subrotina que contm o modelo matemtico
NPRM nmero de parmetros a serem estimados
IDERIV opo de derivada da funo: 0 derivadas so calculadas
por diferenas finitas, 1 derivada fornecida pelo usurio
THETA vetor com os NPRM parmetros
R matriz triangular NPRM x NPRM que contm a matriz
resultante da decomposio do jacobiano.
LDR dimenso de R
IRANK ordem da matriz de R
DFE grau de liberdade do erro
SSE soma dos quadrados do erro


Subrotina do Modelo Matemtico

A subrotina que contm o modelo matemtico a ser integrado tem a
seguinte estrutura:
104

SUBROUTINE <modelo> (NPRM,THETA,IOPT,IOBS,FRQ,WT,E,DE,IEND)

onde NPRM nmero de parmetros
THETA vetor com os parmetros
IOPT opo de avaliao: 0 calcula a funo, 1 calcula a
derivada
IOBS nmero da observao
FRQ frequncia para a observao
WT peso da observao
E erro da observao IOBS
DE vetor que contm as derivadas parciais do resduo para a
observao IOBS
IEND indicador de finalizao: 0 menor ou igual ao nmero de
observaes, 1 maior que o nmero de observaes.

Esta subrotina deve ser programa de forma a retornar o erro da
observao sendo analisada (E), ou seja a diferena entre o valor observado e o
valor estimado pelo modelo.

EXEMPLO 7
A taxa de reao qumica geralmente dada pela lei de Arrhenius:

,
_


T R
Ea
A k exp
A fator pr-exponencial (parmetro)
Ea energia de ativao (parmetro)
k taxa de reao
R constante dos gases
T temperatura

Pode-se estimar o valor do fator pr-exponencial (A) e da energia de ativao
(Ea) obtendo-se valores experimentais de k e T. Por uma questo de maior
facilidade matemtica, o logaritmo desta equao avaliado.


,
_


T R
Ea
A k ln ln

Para ser usada na subrotina, o erro entre o k observado e o k calculado deve
ser obtido, e portanto a subrotina deve calcular a seguinte equao:


1
]
1

,
_


T R
Ea
A k E ln ln
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
105

Neste caso, A e Ea so os parmetros da equao e k e T so as variveis
conhecidas. Podemos transformar A em THETA(1) e Ea em THETA(2) de
forma que possam ser avaliadas pela subrotina. k e T, por sua vez sero
transformados em Y(1) e Y(2). Como existem vrias observaes, cada par de
observaes de k e T, sero armazenadas em Y(1,IOBS) e Y(2,IOBS).
Portanto a equao a ser programada dever ser:

{ } { }
1
]
1

,
_


) , 2 (
) 2 (
) 1 ( ln ) , 1 ( ln
IO BS Y R
THETA
THETA IO BS Y E

ou em Fortran:

E = DLOG(Y(1,IOBS)) - (DLOG(THETA(1)) - THETA(2)/(R*Y(2,IOBS)))



Estrutura Geral do Programa

A estrutura geral de um programa de integrao usando a DRNLIN tem a
forma:

MODULE GLOBAL
REAL*8 Y(10,1000), <variveis>
! SE TIVER MAIS QUE 10 VARIVEIS, MUDAR O NMERO DE
! Y(<campo>,1000)
! SE TIVER MAIS QUE 1000 OBSERVAES, MUDAR O NMERO DE
! Y(10,<observaes>)
INTEGER NOBS, <variveis>
END MODULE

! PROGRAMA REGRESSO NO LINEAR USANDO BIBLIOTECA IMSL
PROGRAM <programa>
USE GLOBAL
USE IMSL
IMPLICIT REAL*8 (A-H,O-Z)
PARAMETER (NPRM = <nmero de parmetros>)
DIMENSION THETA(NPRM), R(NPRM,NPRM)
EXTERNAL FCNMOD

! ABERTURA DE ARQUIVO DE DADOS
OPEN(2,FILE='<arquivo de dados>')

! INICIALIZAAO DAS VARIVEIS
<variveis> = <valor>


106
! LEITURA DE DADOS DO ARQUIVO
NOBS = 0
DO WHILE (.NOT.(EOF(2)))
NOBS = NOBS + 1
READ(2,*) Y(1,NOBS), Y(2,NOBS), Y(<campo>,NOBS)
! Y(<campo>,i) = SO AS VARIVEIS CUJOS VALORES SO CONHECIDOS
! PARA CADA OBSERVAO
ENDDO

! "CHUTE" INICIAL PARA OS PARMETROS
THETA(<parametro>) = <valor> ! PARMETRO DA EQUAO

! INICIALIZAO DAS CONDIES DA REGRESSO LINEAR
IOPT = 0 ! OPO DE AVALIAO DA FUNO

CALL DRNLIN(FCNMOD, NPRM, IOPT, THETA, R, NPRM, IRANK, DFE, SSE)

! IMPRESSO DOS RESULTADOS
WRITE(*,*) <parametros>
END


! SUBROTINA COM A FUNO DA TAXA DE REAO
SUBROUTINE FCNMOD(NPRM, THETA, IOPT, IOBS, FRQ, WT, E, DE, IEND)
USE GLOBAL
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION THETA(NPRM), R(NPRM,NPRM)

IEND = 0
IF (IOBS <= NOBS) THEN
WT = 1.0D0 ! PESO DA OBSERVAO
FRQ = 1.0D0
E = <funo>
ELSE
! ACABARAM-SE AS OBSERVAES
IEND = 1
END IF
END SUBROUTINE



EXEMPLO 8
Um programa para estimar as constantes da equao da lei de Arrhenius,
apresentada no Exemplo 7 teria a forma:


MODULE GLOBAL
REAL*8 CTEGAS, Y(10,1000)
INTEGER NOBS
END MODULE
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
107

! PROGRAMA PARA CALCULO DA ENERGIA DE ATIVAO E
! FATOR PR-EXPONENCIAL DE UMA REAO QUMICA
PROGRAM CINET01
USE GLOBAL
USE IMSL
IMPLICIT REAL*8 (A-H,O-Z)
PARAMETER (NPRM = 2) ! NPRM = NMERO DE PARMETROS
DIMENSION THETA(NPRM), R(NPRM,NPRM)
EXTERNAL FCNMOD

! ABERTURA DE ARQUIVO DE DADOS
OPEN(2,FILE='CINET.DAT')

! INICIALIZAAO DAS VARIVEIS
CTEGAS = 8.314D0 ! CONSTANTE DOS GASES

! LEITURA DE DADOS DO ARQUIVO
NOBS = 0
DO WHILE (.NOT.(EOF(2)))
NOBS = NOBS + 1
READ(2,*) Y(1,NOBS), Y(2,NOBS)
! Y(1,i) = K - TAXA DE REAO
! Y(2,i) = T - TEMPERATURA
ENDDO

! "CHUTE" INICIAL PARA OS PARMETROS
THETA(1) = 4.6D16 ! FATOR PR-EXPONENCIAL
THETA(2) = 100000.0D0 ! ENERGIA DE ATIVAO

! INICIALIZAO DAS CONDIES DA REGRESSO LINEAR
IOPT = 0 ! OPO DE AVALIAO DA FUNO

CALL DRNLIN(FCNMOD, NPRM, IOPT, THETA, R, NPRM, IRANK, DFE, SSE)

! IMPRESSO DOS RESULTADOS
WRITE(*,*) 'K = ', THETA(1)
WRITE(*,*) 'EA = ', THETA(2)
WRITE(*,*)
WRITE(*,*) 'SSE = ', SSE
END

! SUBROTINA COM A FUNO DA TAXA DE REAO
SUBROUTINE FCNMOD(NPRM, THETA, IOPT, IOBS, FRQ, WT, E, DE, IEND)
USE GLOBAL
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION THETA(NPRM), R(NPRM,NPRM)

IEND = 0
IF (IOBS <= NOBS) THEN
WT = 1.0D0 ! PESO DA OBSERVAO
FRQ = 1.0D0
108
E = DLOG(Y(1,IOBS)) - (DLOG(THETA(1)) - THETA(2)/(CTEGAS*Y(2,IOBS)))
ELSE
! ACABARAM-SE AS OBSERVAES
IEND = 1
END IF

END SUBROUTINE


12.5. Esti mati va de Parmetros

As tcnicas de regresso so teis para estimar parmetros de uma nica
equao, mas quando se deseja estimar parmetros de um sistema de equaes,
deve-se utilizar de tcnicas mais avanadas de estimativa de parmetros, sendo
que as mais comuns so baseadas na tcnica de Levenberg-Marquardt que
estima parmetros usando o mtodo de mnimos quadrados no linear.


12.5.1. Usando I MSL

A subrotina mais comum para estimar parmetros no IMSL a DBCLSF,
baseada na tcnica de Levenberg-Marquardt.
A chamada desta subrotina tem a seguinte estrutura:

DBCLSF(<modelo>, NOBS*NEQ, NPRM, THETA0, IBTYPE, XLB, XUB,
XSCALE, FSCALE, IPARAM, RPARAM, THETA, FVEC,
FJAC, LDFJAC)

onde <modelo> nome da subrotina que contm a funo a ser minimizada
NOBS nmero de observaes
NEQ nmero de equaes no modelo matemtico
NPRM nmero de parmetros a ser estimados
THETA0 chute inicial para os parmetros
IBTYPE tipo de restrio aplicado aos parmetros: 0 limites so
especificados pelo usurio via XLB e XUB; 1 os
parmetros so todos positivos; 2 os parmetros so todos
negativos.
XLB vetor com os limites inferiores para os parmetros
XUB vetor com os limites superiores para os parmetros
XSCALE vetor com o valor de escalonamento dos parmetros
FSCALE vetor com o valor de escalonamento para as funes
IPARAM vetor com as opes de configurao da subrotina
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
109
RPARAM vetor com as opes de configurao da subrotina
THETA vetor com os parmetros que foram estimados pela subrotina
FVEC vetor que contm os resduos da soluo
FJAC matriz que contm o Jacobiano da soluo
LDFJAC dimenso de FJAC


Subrotina do Modelo Matemtico

A subrotina que contm o modelo matemtico a ser integrado tem a
seguinte estrutura:

SUBROUTINE <modelo> (M, NPRM, THETA, ERRO)

onde M nmero de observaes * nmero de equaes
NPRM nmero de parmetros
THETA vetor com o valor dos parmetros
ERRO vetor que retorna o valor do erro entre a varivel dependente
observada e a varivel dependente calculada com os valores
atuais dos parmetros sendo estimados.

Esta subrotina deve ser programa de forma a retornar o erro da
observao sendo analisada (E), ou seja a diferena entre o valor observado e o
valor estimado pelo modelo. Em geral, para estimativa de parmetros se utiliza
a diferena ao quadrado.

ERRO(<obs>) = (YOBS(I,<obs>) - YSIM(J,<obs>)**2.0D0

onde YOBS valor observado
YSIM valor calculado com o valor atual dos parmetros sendo
estimados pela subrotina.



Estrutura Geral do Programa

A estrutura geral de um programa de integrao usando a DBCLSF tem a
forma:


MODULE GLOBAL
INTEGER NRUN,NEQT,NOBT,IMOD
REAL*8 XOBS(1000), YOBS(10,1000), YSIM(10,1000)
110
! SE TIVER MAIS QUE 10 VARIVEIS DEPENDENTES,
! MUDAR O NMERO DE Y(<campo>,1000)
! SE TIVER MAIS QUE 1000 OBSERVAES, MUDAR O NMERO DE
! Y(10,<observaes>) E X(<observaes>)
REAL*8 TTA(50)
END MODULE


! PROGRAMA PARA ESTIMATIVA DE PARMETROS
PROGRAM DEXPRM
USE IMSL
USE GLOBAL
IMPLICIT REAL*8 (A-H,O-Z)

! NPRM = NMERO DE PARMETROS
! NOBS = NMERO DE OBSERVAES
! NEQ = NMERO DE EQUAES DO MODELO
PARAMETER (NPRM = <valor>, NOBS = <valor>, NEQ = <valor>)

DIMENSION THETA(NPRM), THETA0(NPRM), R(NPRM,NPRM)
DIMENSION XLB(NPRM), XUB(NPRM), XSCALE(NPRM)
DIMENSION IPARAM(6), RPARAM(7)
DIMENSION FSCALE(NOBS*NEQ),FVEC(NOBS*NEQ),FJAC(NOBS*NEQ,NPRM)

EXTERNAL FCNPRM ! SUBROTINA QUE IR CONTROLAR
! QUAL OBSERVAO SER USADA NA
! ESTIMATIVA DE PARMETROS
! TRANSFERE OS VALORES DO NMERO DE EQUAES DO MODELO E DO
! NMERO DE OBSERVAES QUE SER USADO NA ESTIMATIVA DOS
! PARMETROS. ISTO FEITO POIS AS VARIVEIS NEQ E NOBS
! NO PODEM SER PASSADAS DIRETAMENTE PARA A SUBROTINA FCNPRM E
! PARA A SUBROTINA <MODELO>
NEQT = NEQ
NOBT = NOBS

! ABRE O ARQUIVO QUE CONTM OS DADOS
OPEN(2, FILE = '<arquivo>')

! CHUTE INICIAL DOS PARMETROS
THETA0(<param>) = <valor>

! LEITURA DOS PONTOS EXPERIMENTAIS
DO I = 1,NOBS
! INSIRA O NMERO DE VARIVEIS QUE FOR NECESSRIO
! XOBS - VARIVEL INDEPENDENTE
! YOBS - VARIVEL DEPENDENTE
READ(3,*) XOBS(I),YOBS(<campo>,I),YOBS(<campo>,I)
ENDDO

! DEFINE O TIPO DE MODELO MATEMTICO
IMOD = 1 ! IMOD = 1 SE MODELO DIFERENCIAL
! NECESSITA SER INTEGRADO
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
111
! IMOD = 2 SE MODELO ALGBRICO

! CHAMA SUBROTINA QUE INICIALIZA AS CONDIES PARA O
! MTODO DE ESTIMATIVA DE PARMETROS
FSCALE = 1.0D0
XSCALE = 1.0D0
NRUN = 0
LDFJAC = NOBS*NEQ
CALL DU4LSF(IPARAM,RPARAM) ! INICIALIZA CONFIGURAO DA DBCLSF

IPARAM(1) = 1
IPARAM(3) = 10000
IPARAM(4) = 1000
IPARAM(5) = 1000

! CHAMA SUBROTINA PARA ESTIMATIVA DOS PARMETROS DO MODELO
CALL DBCLSF(FCNPRM,NOBS*NEQ,NPRM,THETA0,1,XLB,XUB,XSCALE, &
FSCALE,IPARAM,RPARAM,THETA,FVEC,FJAC,LDFJAC)

! IMPRIME OS PARMETROS QUE FORAM ESTIMADOS
DO I = 1,NPRM
WRITE(*,*) THETA(I)
ENDDO
END


! SUBROTINA DE MINIMIZAO
SUBROUTINE FCNPRM(NPTS, NPRM, THETA, ERRO)
USE GLOBAL
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION THETA(NPRM), R(NPRM,NPRM)
DIMENSION PARAM(50) ! USADO PELA INTEGRAO
DIMENSION C(NPTS), ERRO(NPTS)

EXTERNAL FCNMOD

! TRANSFERE OS VALORES DOS PARMETROS SENDO ESTIMADOS PARA
! A VARIVEL GLOBAL QUE SER PASSADA PARA A SUBROTINA
! QUE CONTM O MODELO. ISTO FEITO POIS A VARIVEL THETA
! NO PODE SER PASSADA DIRETAMENTE PARA A SUBROTINA <MODELO>
DO I = 1,NPRM
TTA(I) = THETA(I)
ENDDO

IF (IMOD == 1) THEN
! MODELO DIFERENCIAL
! FAZ INTEGRAO DO MODELO
DO I = 1,NOBT
IF (XOBS(I) == 0.0D0) THEN
! PEGA O VALOR INICIAL PARA A INTEGRAO NUMRICA
DO J = 1,NEQT
C(J) = YOBS(J,I)
112
YSIM(J,I) = YOBS(J,I)
ENDDO

! INICIALIZA PARMETROS PARA A INTEGRAO NUMRICA
ATOL = 1.0D0
IDO = 1
PARAM = 0.0D0
PARAM(4) = 1000000
T = 0.0D0
ENDIF

! CHAMA SUBROTINA DE INTEGRAO NUMRICA
IF (XOBS(I+1) /= 0.0D0) THEN
TOUT = XOBS(I+1)
CALL DIVPRK (IDO, NEQT, FCNMOD, T, TOUT, ATOL, PARAM, C)
DO J = 1,NEQT
YSIM(J,I+1) = C(J)
ENDDO
ELSE
CALL DIVPRK (3, NEQT, FCNMOD, T, TOUT, ATOL, PARAM, C)
ENDIF
ENDDO
ELSE

! MODELO ALGBRICO
! ESCREVA AQUI AS EQUAES ALGBRICAS DO MODELO
! YSIM(<campo>,I) A VARIVEL INDEPENDENTE SENDO CALCULADA
DO I = 1,NOBT
YSIM(<campo>,I) = <equao>
ENDDO
ENDIF

! CALCULO O ERRO DO MODELO
PESO = 1.0D0
I = 0
DO K = 1,NOBT
DO J = 1,NEQT
I = I + 1
ERRO(I) = (YOBS(J,K) - YSIM(J,K))**2.0D0
ENDDO
ENDDO
END SUBROUTINE


! SUBROTINA QUE CONTM AS EQUAES DIFERENCIAIS
SUBROUTINE FCNMOD(NEQ,T,Y,YPRIME)
USE GLOBAL
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION Y(NEQ), YPRIME(NEQ)

! INICIALIZAO DAS VARIVEIS
<variaveis> = <valor>
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
113

! MODELO DIFERENCIAL
! ESCREVA AQUI AS EQUAES DIFERENCIAIS ONDE
! YPRIME(<campo>) = DIFERENCIAL DA VARIAVEL Y(<campo>)
YPRIME(<campo>) = <equao>

END SUBROUTINE

A subrotina DBCLSF estima parmetros com base no erro de cada
observao, independente do nmero de equaes do modelo. por isso que
deve-se prestar ateno na diferena entre as variveis NPTS e NOBT na
subrotina FCNPRM. Nesta subrotina, a varivel NOBT controla o nmero de
conjuntos de observaes, enquanto que NPTS controla o total de observaes,
ou seja NOBT*NEQT (nmero de conjunto de observaes * nmero de
equaes do modelo).
Se tivermos dados de uma varivel independente X e duas variveis
dependentes Y1 e Y2 (portanto duas equaes). Ento um conjunto de
observao composto dos valores de X, Y1, Y2. J uma observao o valor
individual de Y1 ou Y2.

A varivel IMOD controla o tipo de modelo matemtico: 1 para modelo
diferencial e 2 para modelo algbrico.
Se o modelo for diferencial (IMOD = 1), o programa ir integrar o
modelo diferencial de forma a obter os resultados dos modelo para as variveis
dependente. O arquivo de dados deve conter em cada linha os valores para as
observaes feitas para a varivel independente e variveis dependentes na
sequncia em que foram obtidos. Pode-se ter vrias corridas experimentais para
a integrao, deste que a condio inicial seja marcada com X = 0. O quadro
12.1. mostra um exemplo de arquivo de dados para modelo diferencial, onde a
primeira coluna se refere varivel independente X, e a segunda e terceira
colunas s variveis dependentes Y(1) e Y(2).

Quadro 12.1. Exemplo de arquivo de dados para modelo diferencial.
0.0 12.1 0.0
1.0 11.9 2.1
2.0 10.5 3.5
3.0 9.4 4.4
0.0 13.9 0.0
1.5 12.3 2.5
1.9 12.1 2.9
3.0 10.3 4.0
4.0 9.0 5.4

X = 0.0 marca o incio de um novo
experimento e portanto de o incio de
uma nova integrao.
114
Se o modelo for algbrico (IMOD = 2), o arquivo de dados no necessita
ter as condies iniciais do sistema. O quadro 12.2. mostra um exemplo de
arquivo de dados para modelo algbrico, onde a primeira coluna se refere
varivel independente X, e a segunda e terceira colunas s variveis
dependentes Y(1) e Y(2).

Quadro 12.2. Exemplo de arquivo de dados para modelo algbrico.
1.0 11.9 2.1
2.0 10.5 3.5
3.0 9.4 4.4
1.5 12.3 2.5
1.9 12.1 2.9
3.4 10.3 4.0
4.2 9.0 5.4

Dependendo do modelo utilizado, pode-se modificar o programa acima,
acrescentando mais variveis independentes e dependentes. O nico cuidado
que se deve ter saber qual varivel independente ir controlar a integrao no
caso de modelo diferencial.


EXERCCIOS

EXERCCIO 1
Um experimento para obter a presso parcial de tolueno obteve os seguinte
dados:

Presso de Vapor Temperatura
1
5
10
20
40
60
100
200
400
760
-26.7
-4.4
6.4
18.4
31.8
40.3
51.9
69.5
89.5
110.6


Programao Fortran para Engenharia
Fabiano A.N. Fernandes
115
Desenvolva um programa para calcular os parmetros da equao de Antoine
para os dados acima.

,
_

+
+
273
exp
T
B
A P
vap


A e B parmetros
Pvap presso de vapor (mmHg)
T temperatura em C


EXERCCIO 2
Uma reao de hidrogenao do benzeno realizada em um reator tubular
operando de forma adiabtica.

O balano de massa (adimensionalizado) dado por:
y
T dx
dy

,
_


*
21 , 3
exp 1744 , 0

O balano de energia (adimensionalizado) dado por:
y
T dx
dT

,
_


*
21 , 3
exp 06984 , 0
*



0
*
T
T
T
T temperatura em K
T0 temperatura inicial = 423 K
T* temperatura adimensional
y concentrao de benzeno adimensional
x comprimento do reator adimensional

Condies iniciais:
em x = 0 y = 1 e T* = 1

Calcular a temperatura real e a concentrao adimensional em funo do
comprimento do reator (x entre 0 e 1, com intervalo de impresso de 0,1).

Programao Fortran para Engenharia
Fabiano A.N. Fernandes
117
13. ERROS DE COMPILAO

Muitos erros podem ocorrer durante a compilao do programa (gerao
do programa executvel), sendo que a maioria se deve a falta de algum
comando ou erro de digitao.
Durante a compilao do programa, os erros aparecem em uma janela
separada do cdigo do programa (Figura 13.1).


Figura 13.1. Tela do programa e local onde as mensagens de erro so listadas.

As mensagens que aparecem tem a forma:

C:\Arquivos\Arq.f90(6) : Warning: Variable A is used before its
value has been defined
C = B/A
------^

onde: C:\Arquivos\Arq.f90 o diretrio e arquivo onde ocorreu o erro
(6) linha do programa onde ocorreu o erro
118
Warning tipo de erro. Pode ser Warning (o compilador
cria o programa executvel, mas poder ocorrer
algum erro durante sua execuo) ou Error
(erro grave compilador no cria o programa
executvel)
Variable A is Descrio do erro

C = B/A
------^ Cpia da linha do erro e indicao onde o erro
foi detectado



Abaixo listamos as principais mensagens de erro de compilao, a causa
provvel do erro e como consertar o problema.


Error: A logical data type is required in this context.
IF (C = 0) THEN
------^
Operador lgico est incorreto (falta um =). O certo ==.


Error: A logical data type is required in this context.
IF ((C == 0) OR (A == 0)) THEN
-------------^
Operador lgico est incorreto (OR). O certo .OR.
Pode ocorrer com .AND. tambm.


Error: An ENDIF occurred without a corresponding IF THEN or ELSE
statement.
ENDIF
^
Falta o comando THEN na estrutura IF..THEN..ELSE


Error: An unterminated block exists.
IF (C == 0.0D0) THEN
^
Falta um ENDIF no bloco IF..THEN..ELSE.
Correo:
Procure o final do IF..THEN..ELSE e insira o comando ENDIF.



Programao Fortran para Engenharia
Fabiano A.N. Fernandes
119
Error: An unterminated block exists.
DO I = 1,100
^
Falta um ENDDO no bloco DO..ENDDO
Correo:
Procure o final do DO..ENDDO e insira o comando ENDDO.


Error: Syntax error, found '=' when expecting one of: ( * :: ,
<END-OF-STATEMENT> ; : ) + . - % (/ [ ] /) . ** / > ...
IF (C = 0) THEN
------^
Operador lgico est incorreto (falta um =). O certo ==.


Error: Syntax error, found '.' when expecting one of: <LABEL>
<END-OF-STATEMENT> ; BLOCK BLOCKDATA PROGRAM TYPE COMPLEX BYTE
CHARACTER ...
.
^
Tem um ponto final perdidoem alguma linha do programa.
Correo:
Verifique a linha do problema e remova o ponto final.


Error: Syntax error, found ',' when expecting one of: <END-OF-
STATEMENT> ;
A = 2,0D0
-----^
Nmero foi digitado errado (2,0D0). O certo 2.0D0 (com ponto ao invs
de vrgula).


Error: Syntax error, found END-OF-FILE when expecting one of:
<LABEL> <END-OF-STATEMENT> ; BLOCK BLOCKDATA PROGRAM TYPE COMPLEX
BYTE CHARACTER ...
Falta um END no final do programa principal.


Error: Syntax error, found END-OF-STATEMENT when expecting one
of: , )
C = ((B + A)/A
--------------^
Falta um parnteses na equao.
Correo:
Verifique em que ponto da equao est faltando um parnteses.

120

Error: The number of subscripts is incorrect. [A]
A(10) = 2.0D0
^
A varivel A foi definida como uma matriz A(x,y) e foi usada como um
vetor A(x).


Error: The statement following the Logical IF statement is
invalid.
IF (C == 0.0D0)
^
Falta o comando THEN na estrutura IF..THEN..ELSE


Error: This DO variable has already been used as an outer DO
variable in the same nesting structure. [I]
DO I = 1,50
-----------^
A varivel de controle (I) do DO..ENDDO j est sendo usada por outro
DO..ENDDO.
Correo:
D outro nome para a varivel de controle deste DO..ENDDO.


Warning: In the call to SOMA, actual argument #1 does not match
the type and kind of the corresponding dummy argument.
CALL SOMA(I,A,B,C)
^
A subrotina SOMA foi definida como:
SUBROUTINE SOMA(I,A,B,C)
A varivel I (argumento #1) por sua vez foi declarada como inteiro no
programa principal e como real na subrotina.
Correo:
Modifique o tipo da varivel I no programa principal ou na subrotina,
pois as variveis passadas para a subrotina devem ser de mesmo tipo no
programa principal e na subrotina.


Warning: In the call to SOMA, there is no actual argument
corresponding to the dummy argument C.
CALL SOMA(A,B)
^
A subrotina SOMA foi definida como:
SUBROUTINE SOMA(A,B,C)
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
121
porm a subrotina foi chamada somente com os parmetros A e B,
faltando o parmetro C.
Correo:
Procure o parmetro que est faltando e insira-o na chamada da subrotina.


Warning: This statement function has not been used. [A]
A(1) = 2.0D0
^
A varivel A no foi declarada como um vetor ou matriz.
Correo:
Declare a varivel A como um vetor usando o comando DIMENSION.


Warning: Variable A is used before its value has been defined
C = B/A
------^
A varivel A, usada no clculo da varivel C no foi inicializada antes de
ser usada para calcular C, e a primeira vez que A aparece no programa.
A varivel A portanto contm o valor zero, podendo ser um fator que
causar erro no clculo da varivel C.
Correo:
Verifique se o nome da varivel foi digitado corretamente.
Inicialize a varivel com o valor apropriado.


13.1. Erros de Execuo

A maioria dos erros de execuo dependem de uma anlise mais profunda
de sua causa, e sero explicados no Captulo 14.
Quando um erro de execuo ocorre, a tela apresentada geralmente
parecida com a mostrada na Figura 13.2.


Figura 3.2. Tela do programa quando ocorre erro de execuo
erro
ocorrido
linha do
erro
122
No caso acima, o erro se deve a um erro de programao.

Severe(161): Program Exception array bounds exceeded
Ocorre quando tenta-se usar um campo inexistente do vetor ou matriz.
Por exemplo: um vetor dimensionado como A(5), mas em algum lugar
do programa tenta-se usar o valor de A(6), sendo que o campo 6 no
existe.

Programao Fortran para Engenharia
Fabiano A.N. Fernandes
123
14. DEBUG

Debugar significa remover erros de programao que ocorrem durante a
execuo de um programa.


14.1. Quando Debugar

v quando o programa parece no sair do lugar.
v quando ocorre diviso por zero ou outro erro matemtico grave.
v quando o resultado numrico NAN (Not a Number)
v quando o resultado retornado estranho.


14.2. Antes de Debugar

Debugar toma tempo, principalmente quando no se sabe o que se est
procurando. A primeira coisa antes de debugar, parar, pensar e refletir em qual
a causa mais provvel do erro.


14.3. Probl emas que Causam Probl emas

14.3.1. Programa Parece No Sai r do Lugar

geralmente causado por loop infinito.
Procure todos os DO..ENDDO e DO WHILE e reveja a condio de
sada do loop. Verifique se ela esta correta. Caso esteja, procure a varivel
usada na comparao e veja porque seu valor no muda.
As vezes necessrio repensar a condio de sada. Ela pode ser muito
radical sendo que o processo pode no gerar tal valor esperado para a
varivel. Ocorre muito quando se estabelece uma tolerncia muito rgida ou
pequena demais.


124
14.3.2. Ocorre Di vi so por Zero / Erro em Logari t mo

Quando ocorre diviso por zero, erro em logaritmo ou exponencial
geralmente o programa exibe uma mensagem informando a linha onde o
problema ocorreu (Figura 14.1).
V at esta linha de programa e procure qual varivel pode ter valor zero
(divisor). Procure no programa o porque ela tem valor zero. Em geral devido
ao uso de uma varivel no inicializada (quer portanto tem valor zero). Ou uma
falha na sua inicializao ou clculo.
Quando ocorre erro em logaritmo, o procedimento o mesmo.


Figura 14.1. Exemplo da tela com a mensagem de erro devido a erro no
logaritmo.


14.3.3. Overf l ow ou Nmero I nf i ni t o

Ocorre quando uma varivel ou clculo retorna um valor muito maior do
que a varivel consegue armazenar (overflow). Alguns compiladores param a
execuo quando h overflow, e outros atribuem o nome Infinity para a
varivel, sendo que a partir deste momento nenhum clculo pode ser realizado
com esta varivel.
Geralmente, o overflow ocorre com clculo com exponenciais (a
exponencial de um nmero grande um nmero maior ainda) ou em clculos
com somatrios que no so inicializados corretamente.

problema ocorrido
(tipo de erro)
nmero da linha do
programa onde o erro
ocorreu
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
125
Quando o problema ocorre com a exponencial. Procure pela varivel que
causa o problema e veja porque esta varivel est com um valor to grande.

Quando o problema com o somatrio, verifique se o clculo do
somatrio foi inicializado.

Certo Errado
SUM = 0.0D0
DO I = 1,100
SUM = SUM + X(I)
ENDDO
DO I = 1,100
SUM = SUM + X(I)
ENDDO

Se um somatrio deste tipo existe num programa, no caso Certo, a
varivel SUM comea com zero e ento realizado o somatrio. Se o programa
reutiliza este cdigo, no caso Certo, SUM comea com o valor zero; e no caso
Errado, SUM comea com um nmero grande (resultado do ltimo somatrio)
podendo resultar num futuro overflow.


14.3.4. Resul t ado NAN

Quando subrotinas numricas do IMSL ou outras so usadas, elas podem
conter internamente um sistema de deteco de erro que no deixa que divises
por zero ou erros simples de clculo causem a interrupo do programa.
Neste caso, quando existe a diviso por zero ou outro erro, esta subrotina
intercepta o erro e atribui o cdigo NAN (Not A Number) para a varivel. Aps
esta varivel receber o cdigo NAN, qualquer outra varivel que se utilize do
valor NAN em seu clculo, passa automaticamente a ter o valor NAN.
Para saber onde est a causa do erro, deve-se debugar o modelo
matemtico utilizado linha por linha. Primeiro, ao entrar na subrotina do
modelo, verifique se todas as variveis esto com o valor correto (as vezes pode
haver problema na passagem dos valores do programa principal para a subrotina
do modelo pouco provvel se o sistema de mdulo de variveis globais
usado). Depois procure em todas as equaes qual gera o primeiro NAN. Pode
estar em alguma diviso por zero, exponencial, seno, co-seno ou logaritmo. No
primeiro NAN, veja na equao qual a varivel que tem um valor que possa
gerar o erro matemtico.
Finalmente procure o que ocorre com esta varivel (clculo errado da
varivel, falta de inicializao, erro na leitura, etc.).


126
14.3.5. Resul t ado Ret ornado Est ranho

Pior problema a ser resolvido, pois a fonte do problema desconhecido.
Primeiro revise suas equaes matemticas (se ela foi digitada corretamente,
problemas de sinal, etc.). Esta a fonte de grande parte dos erros de clculo.
Se as equaes esto corretas, divida o programa em sees debugando
uma seo de cada vez. Execute o programa at o final da primeira seo e veja
se os valores calculados at ento esto corretos. Caso estejam, execute o
programa at o final da segunda seo e assim por diante. Quando achar um
valor estranho, o problema pode estar dentro daquela regio do programa.
Verifique se os valores passados para e da subrotina esto corretos.
Depois verifique se existe algum IF..THEN..ELSE ou DO..ENDDO ou DO
WHILE que est sendo ignorado (condio pode estar falhando).


14.4. Usando o Debug do Compaq Fortran

Antes de iniciar comear o debug de um programa, necessrio definir
uma linha na qual a execuo do programa ir parar. Para selecionar uma linha,
posicione o cursor na linha desejada e pressione no boto Stop (boto em forma
de mo) (Figura 14.2).


Figura 14.2. Selecionando a linha de parada.

Pode-se definir quanto pontos de parada se desejar.
linha selecionada para parar a
execuo do programa. Aps
pressionar o boto Stop,
aparecer uma bola ao lado da
linha.
boto Stop
Programao Fortran para Engenharia
Fabiano A.N. Fernandes
127
Para iniciar a sesso de debug, selecione a opo Build no menu
principal, e depois selecione as opes Start Debug e Go (Figura 14.3). O
programa ir iniciar sua execuo e ir parar no ponto escolhido anteriormente.


Figura 14.3. Iniciado a seo de debug.




Figura 14.4. Tela de um programa sendo debugado.
128
Quando o programa para no ponto escolhido para ser debugado, a tela
apresentada pelo compilador ser semelhante apresentada na Figura 14.4. Na
parte superior da tela ser apresentado o cdigo do programa. Na parte inferior
sero apresentados, uma relao com todas as variveis usadas no programa e
seus valores (do lado esquerdo), uma lista com variveis especificadas pelo
usurio (do lado direito). No lado direito pode-se escrever qual varivel se
deseja saber o valor. Passando o cursor em alguma varivel no cdigo do
programa ir mostrar um pequeno quadrado com o valor desta varivel.
Para passar a execuo do programa para a prxima linha, tecle F10. Para
continuar a execuo do programa at o prximo ponto de parada, tecle F5.

Programao Fortran para Engenharia
Fabiano A.N. Fernandes

Você também pode gostar