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

i

PROGRAMAO
FORTRAN
PARA ENGENHARIA

Fabiano A.N. Fernandes

1a Edio
2003

ii
Copyright by Fabiano Fernandes

Capa
Fabiano Fernandes
Reviso
Liliane Maria Ferrareso Lona
Sueli Rodrigues
Desenhos
Fabiano Fernandes

Ficha Catalogrfica
F391p

Fernandes, Fabiano Andr Narciso


Programao Fortran para engenharia / Fabiano Andr Narciso
Fernandes. So Carlos , SP: [s.n.], 2003.
135 p.: 23 x 16 cm.
1. Fortran. 2. Fortran 90. 3. Engenharia. 4. Aplicao de
Computadores. I. Ttulo.

ISBN 85-XXX

iii

SUMRIO
1. INTRODUO
1.1. O Curso

1
2

2. LGICA DE PROGRAMAO
2.1. Algoritmo
2.2. Fluxograma
Exerccios

3
3
4
9

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

11
11
18
18
19

4. TIPOS E DECLARAO DE VARIVEIS


4.1. Declarao de Variveis
4.2. Atribuio de Valores

21
21
23

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

25
25
26

6. LEITURA E IMPRESSO DE DADOS


6.1. Formatao dos Dados
Exerccios

29
30
32

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

33
33
33
36
38
38
41
44

iv

8. LOOPS
8.1. Loops Limitados
8.1.1. Forma Antiga
8.2. Loops por Deciso
8.3. Loops Infinitos
8.4. CYCLE
Exerccios

47
47
50
51
54
56
57

9. VETORES E MATRIZES
9.1. Tipos de Vetores e Matrizes
9.2. Declarao de Vetores
9.3. Atribuio de Valores
9.4. Operaes com Vetores e Matrizes
9.5. Funes Intrnsecas
9.6. Loops com Vetores e Matrizes
9.7. Processos Decisrios com Vetores e Matrizes
9.7.1. WHERE
9.7.2. FORALL
Exerccios

59
59
59
59
60
61
62
63
65
67
68

10. ARQUIVOS DE DADOS


10.1. Operaes com Arquivos
10.2. Arquivos de Dados - Leitura
10.2.1. EOF
10.3. Arquivos de Dados - Impresso
Exerccios

69
69
70
71
72
72

11. ORGANIZAO DE PROGRAMAS EXTENSOS


11.1. Mdulo de Variveis Globais
11.2. Programa Principal
11.2.1. USE
11.3. Subrotinas
11.3.1. CALL
11.4. Funes
11.4.1. Chamando Funes

75
75
76
76
77
77
80
80

12. MTODOS MATEMTICOS


12.1. Organizao Geral do Programa
12.1.1. Bibliotecas Numricas
12.1.2. Usando Bibliotecas Numricas - IMSL
12.1.3. Usando Bibliotecas Numricas - Outras

83
83
85
86
87

12.2. Funo de Zero


12.2.1. Usando IMSL
12.2.1. Usando Numerical Recipes
12.3. Integrao Numrica
12.3.1. Usando IMSL
12.3.1. Usando Numerical Recipes
12.4. Regresso No-Linear
12.4.1. Usando IMSL
12.5. Estimativa de Parmetros
12.5.1. Usando IMSL
Exerccios

88
88
91
94
94
101
105
105
109
109
115

13. ERROS
13.1. Erros de Execuo

119
123

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

125
125
125
125
125
126
126
127
128
128

1. INTRODUO

1.1. O Curso

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.

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.

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.

Fases de um Algoritmo
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

Processo

Impresso dos
Resultados

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: Media =

N1+ N2 + N3
3

3. Imprimir Mdia

2.2. Fluxograma
2.1. Algoritmo
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 Bsicas para Construo de um Algoritmo
Para escrever um algoritmo deve-se descrever a sequncia de instrues
de maneira simples e objetiva, podendo-se utilizar algumas tcnicas bsicas:
v
v
v
v

usar somente um verbo por frase


usar frases curtas e simples
ser objetivo
usar palavras que no tenham sentido dbio

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

EXEMPLO 2

Fi
Mi
i

O fluxograma para o exemplo 1 tomaria a forma:


Incio

fluxo volumtrico da corrente i


fluxo mssico da corrente i
densidade da corrente i

O fluxograma a ser seguido para clculo do tanque ser:

Ler N1, N2 e N3

Incio

Calcular Mdia

Ler Fluxo Volumtrico das


Correntes 1 e 2

Imprimir Mdia

Ler Densidades das


Correntes 1 e 2
Fim

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

Calcular Fluxo Volumtrico da Corrente 3

Calcular Fluxo Mssico da Corrente 3

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

Calcular Densidade da Corrente 3

Corrente 2

Imprimir Resultados

Fim

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


agitado.
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: F 3 = F1+ F 2
Fluxo Mssico:

M3 = F1 1+ F 2 2

Densidade:

3 =

F1 1+ F 2 2
F3

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: NNu = 0,153 NRe

0,8

NPr 0,33 0,14

para NRe < 2100

7
EQ2: NNu = 10,56 NRe

0,33

d
NPr 0,33
L

0,33

0,14

para NRe > 2100


d
L
NNu
NPr
NRe

dimetro do tubo
comprimento do tubo
nmero de Nusselt
nmero de Prandtl
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:

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:

ut =

0,524 Dp 2 ( s f )

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

Incio

s, f,
NRe, NPr, d, L,

DeltaDP = (1000 - 50)/100


NRe < 2100

Sim

Calcula NNu pela


equao EQ1

I=1
No
Calcula NNu pela
equao EQ2

DP = 50 + (I-1)*DeltaDP

Calcula Ut
Imprime NNu

Dp, Ut

Fim

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.

I = I +1
Sim

I <= 100
No
Fim

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

10

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.

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:

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

Posio
Valor

12

25 11 22 12 15

10

18

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:
Posio

I=I+1

Valor

12

25 11 22 12 15

10

18

J=I

J=J+1

A(I) < A(J)


No

Sim

Sim

B = A(I)
A(I) = A(J)
A(J) = B

J < 10
No

No

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:

I=9
Sim
Fim

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

Posio
Valor

25 9 12

11 22 12 15

10

18

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:

Dp =

ut
0,524 ( s f )

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

0 = ut

0,524 D p2 ( s f )

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:

Cp = A + B T + C T 2
para lquido:

A2
+ B 2 A C t A D t2
t
T
t = 1
Tc

Cp =

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.

14

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.

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).

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. Criando um Projeto


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).
Figura 3.2. Abertura de um novo projeto no Fortran

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.

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.


Figura 3.3. Abertura de um novo projeto no Fortran

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

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.6. Gravao de um novo arquivo de cdigo.


Figura 3.4. Abertura de um novo arquivo de cdigo.

17

18

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.

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.

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).

3.1.1. Usando um Cdigo Pronto em um Novo Projeto


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. Cdigo em FORTRAN 90

Figura 3.8. Compilao e criao do programa executvel.

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.

19

20

O programa comea com o comando PROGRAM e termina com o


comando END.

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:

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 !

colunas
1
5
A

Um programa em Fortran 77 teria a forma:


1

2.3. Cdigo 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

5 6 7
PROGRAM <NOME>
:
cdigo
:
END

72

A insero de comentrios deve ser feita colocando a letra C na primeira


coluna da linha:
1
C

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

72
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).

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.

6 7
B

5 6 7
PROGRAM EXEMPLO
PROGRAMA PARA CLCULO DE 2 + 2
A = 2 + 2
END

72

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
C

5 6 7
72
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

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 1045
v REAL*8
nmero real em dupla preciso
suporta valores entre 1.0 x 10-300 at 1.0 x 10300
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

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
INTEGER IDX

para densidade e viscosidade


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)

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. Declarao de Variveis


As variveis podem ser declaradas em grupo ou individualmente. Esta
declarao deve vir logo no incio do programa.

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

24

23

4.2. Atribuio de Valores


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

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

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 103


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 103


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)

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

25

5. CLCULOS MATEMTICOS

26

Deve-se sempre ter o cuidado com a hierarquia entre as diferentes


operaes matemticas, para se evitar erros de calculo.
EXEMPLO 1

5.1. Operaes Matemticas Bsicas


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

1.
2.
3.
4.

Uma hierarquia imposta a estas operaes:


parnteses
exponenciao
multiplicao e diviso (o que aparecer primeiro)
adio e subtrao (o que aparecer primeiro)

EXEMPLO
As equaes:

A = B + C D

A = BD + E
A=

B C + DE
F

seriam programadas como:


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

A equao:

(B C )E + A B
Z=

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:

Z = (B C )E +

AB
FG

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

5.2. Funes Matemticas


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

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

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

CEILING(4.8) retorna 5.0


CEILING(-2.5) retorna 2.0

SINH(A)

calcula o seno hiperblico de A


A pode ser somente real

COS(A)

calcula o coseno de A (A em radianos)


A pode ser somente real

TAN(A)

calcula a tangente de A (A em radianos)


A pode ser real ou complexo

COSD(A)

calcula o coseno de A (A em graus)


A pode ser somente real
Alguns compiladores podem no aceitar este comando

TAND(A)

calcula a tangente de A (A em graus)


A pode ser real ou complexo
Alguns compiladores podem no aceitar este comando

COSH(A)

calcula o coseno hiperblico de A


A pode ser somente real

TANH(A)

calcula a tangente hiperblica de A


A pode ser somente real

COTAN(A)

calcula a cotangente de A (resultado em radianos)


A pode ser somente real

CEILING(A)

retorna o menor nmero inteiro maior ou igual A


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

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

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

A distribuio granulomtrica pode ser representada pela equao:


N

D
X = 1 exp

D *

A programao desta equao dada por:


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

30

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 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).

<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

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
I5

inteiro com trs algarismos


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

31
F5.2

nmero real com 2 casas decimais e 2 algarismos antes da


virgula
nmero real com 4 casas decimais e 5 algarismos antes da
virgula
forma no vlida, pois no h espao para as 5 casas
decimais mais a virgula

F10.4
F5.5

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 E00, 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
E10.1

Ax
yX

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)

nmero real escrito na forma: aa.bbEcc


nmero real escrito na forma: aaaa.bEcc

campo alfanumrico com x caracteres


A5

32

EXERCCIOS

campo alfanumrico com 5 caracteres

y espaos

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.

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

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.

33

7. PROCESSOS DECISRIOS

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 :

7.1. Operadores Relacionais


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.

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

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

Tabela 7.1. Operadores Relacionais


Smbolo
Operador
==
igual
>
maior que
>=
maior ou igual que
<
menor que
<=
menor ou igual que
/=
diferente

Caso o PROCESSO consista somente de uma linha de comando, o


comando IF..THEN pode ser escrito como:
IF (<comparao>) PROCESSO

EXEMPLO 1

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.

O coeficiente de arraste (CD) de partculas slidas pode ser calculado pela


equao:

CD =

24
Re

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.2. IF..THEN
O comando IF..THEN tem a seguinte estrutura lgica:

CD =

24
1+ 0,14 Re 0,7
Re

vlido para Re > 0,1

Incio

comparao

Verdadeiro

PROCESSO

CD
Re

coeficiente de arraste
nmero de Reynolds

Falso

O fluxograma de deve ser seguido para este processo :

Fim

Figura 7.1. Fluxograma lgico do comando IF..THEN

35

36

. IF..THEN..ELSE

Incio

A estrutura do

Re

Incio

CD = 24/RE

Re > 0.1

tem a seguinte lgica:

Sim

CD = CD*(1 + 0.14*RE**0.7)

comparao

No

Verdadeiro

PROCESSO 1

Falso
PROCESSO 2

CD

Fim

Fim

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


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

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:

f=

64
Re

[eq. Dorey-Weisbach]

37

EQ2:

f =

2 log + 1,74
D

ELSE
[eq. Von Karman]

O fluxograma de deve ser seguido para este processo :

! 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.

Incio

Re, E, D

Re < 2100

38

Verdadeiro

Calcular EQ1

Falso
Calcular EQ2

7.3.1. Forma Antiga


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.

Imprime f

Fim

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

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 Conjunto


Algumas vezes, um processo s executado se duas ou mais condies
forem verdadeira (caso E) ou se pelo menos uma das condies for verdadeira

39

40

(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.

que o mesmo ocorra. Um fluxograma lgico para o clculo da rea de troca


trmica com predio de erros teria a estrutura:

Tabela 7.2. Resultado das Comparaes


Comparao
Verdadeiro .AND. Verdadeiro
Verdadeiro .AND. Falso
Falso .AND. Falso
Verdadeiro .OR. Verdadeiro
Verdadeiro .OR. Falso
Falso .OR. Falso
.NOT. Verdadeiro
.NOT. Falso

Incio

IRR = 0

Q, UC, DELTAT

Resultado
Verdadeiro
Falso
Falso
Verdadeiro
Verdadeiro
Falso
Falso
Verdadeiro

Sim

CD

No
IRR = 0
UC =/ 0 e
DELTAT =/ 0

"Erro no Clculo"
Sim

Calcula AC

No

Fim

IRR = 1

Em termos de programao, a estrutura a seguinte:


Figura 7.5. Fluxograma lgico para clculo do fator de atrito
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:

Ac =

Q
Uc T
Ac
Q
Uc
T

rea de troca trmica


calor trocado
coeficiente de troca trmica
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

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)

41

42

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 Decisrio por Faixa ou Classes


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

Verdadeiro

PROCESSO 1

Falso
comparao

Verdadeiro

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.

PROCESSO 2

EXEMPLO 4

Falso

.
.

comparao

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:

Verdadeiro

PROCESSO 3

Falso
PROCESSO 4

Fim

Figura 7.6. Fluxograma lgico do comando SELECT CASE.

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: q ADS =

QK C
1+ K C

EQ2: q ADS = K C

[eq. Langmuir]

[eq. Freundlich]

43
EQ3: q ADS =

QK p
(1+ K p + p / P ) (1 p / P )

[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

IDX = 1

Verdadeiro

Q, C, AK

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

Falso
Calcula EQ1

IDX = 2

Verdadeiro

AK, C, AN

EXERCCIOS

Falso
Calcula EQ2

IDX = 3

Verdadeiro

Q, AK, P, PTOT

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

Falso
Calcula EQ3

EQ1: PC = 0,00086

Q1,75
D 4,75

[para gua fria]

QADS

Fim

EQ2: PC = 0,0007

Q1,75
D 4,75

[para gua quente]

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)

D
L
PC
Q

dimetro do tubo
comprimento do tubo
perda de carga
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.

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:

A X + B X 1,5 + C X 3 + D X 6

1 X

EQ1: Pvap = PC exp

X = 1

T
TC

EQ2: Pvap = exp A


EQ3: Pvap =

B
T + C

PC

10 Z 3

Z1 = 5,808 + 4,93
Z2 =

36
35,0 TR 6 + 42 ln(TR )
TR

Z 3 = 0,118 Z 2 7 log(TR ) + ( Z1 7,0) (0,0364 Z 2 log(TR ))


TR =

T
TC
A,B,C,D
Pvap
PC
TC
TR

parmetros da equao
presso de vapor
presso crtica
temperatura crtica
temperatura relativa
fator acntrico

46

48

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.

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

x
y
z

8.1. Loops Limitados


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

valor inicial de <var>


valor final de <var>
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

<var> = x

PROCESSO

EXEMPLO 1

<var> = <var> + z

<var> < y

Quando so produzidos, os polmeros apresentam uma distribuio de pesos


moleculares. A distribuio pode ser calculada pela funo:
Sim

No

W(r ) = ( + ) + ( + ) (r 1)
2

(1+ + )r

Fim

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 :

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

ktc
kp [M]
kfm
kfx
kp
ktc
ktd
r

constante de transferncia para monmero


constante de transferncia para CTA
constante de propagao
constante de terminao por combinao
constante de term. por desproporcionamento
comprimento de cadeia

49
W
[M]

frao de cadeias produzidas


concentrao de monmero

[X]

concentrao de CTA

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

CM concentrao de monmero (no programa)


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

! 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

KP, KFM, KFX, KTC, KTD


R = I*DELTA
CM,CX
CALCULA W
CALCULA TAU e BETA
R, W
I=1

8.1.1. Forma Antiga

I=I+1
1
I < 100

Sim

No Fortran 77, os loops eram controlados


DO..CONTINUE, que tem como estrutura de programao:

pelo

comando

No
Fim

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. Calculase a frao de pesos moleculares (W) e R e W so impressos.
Em termos de programao, a estrutura a seguinte:

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:

100

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

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

51

52

8.2. Loops por Deciso

Esta equao pode ser rearranjada para:

Os loops podem ocorrer enquanto uma condio continue sendo atendida,


usando o comando DO WHILE. Este comando tem como estrutura lgica:

e=0=

1
f

0,5

2,5226
+ 2 log
+

3,7065 D Re f 0,5
f
/D
Re

Incio

comparao

[eq. 2]

fator de atrito
rugosidade relativa
nmero de Reynolds

Falso
Fim

Verdadeiro
PROCESSO

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

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

1
No

Re, Rug

ERRO > TOL

Sim
F1 = 0,1
F2 = 0,007

Fim

F = (F1 + F2)/2

Calcula ERRO pela EQ2


TOL = 0,001
ERRO = 1,0

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.

ERRO < 0
1

Sim

F1 = F
ERRO = - ERRO

No
F2 = F

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

1
f

0,5

2,5226
= 2 log
+

3
,
7065

Re f 0,5

[eq. Colebrook]
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

54

53
super ou subestimado e baseado neste resultado, define-se os novos limites
superior e inferior para o valor do fator de atrito.

8.3. Loops Infinitos

Em termos de programao, a estrutura a seguinte:

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:

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

Incio

! INICIALIZAO DAS VARIVEIS


F1 = 0.1D0
F2 = 0.007D0
ERRO = 1.0D0
TOL = 0.001D0

PROCESSO

comparao

! 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
que TOL, de forma que o programa entre
fosse inicializada, ou fosse inicializada com
loop uma vez que a condio de entrada
satisfeita.

inicializada com um valor maior do


no loop. Se a varivel ERRO no
zero, o programa no entraria no
e permanncia no loop no seria

Verdadeiro

Falso
Fim

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:

55
DO

Incio

Re, Rug

No
F = (F1 + F2)/2

F1 = 0,1
F2 = 0,007
Calcula ERRO pela EQ2
TOL = 0,001
ERRO = 1,0
1

56

ERRO < 0

Sim

F1 = F
ERRO = - ERRO

No
F2 = F

Sim
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
IF (ERRO < TOL) EXIT
ENDDO
! IMPRESSO DOS RESULTADOS
WRITE(*,*) F
END

No
Fim

8.4. CYCLE
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)

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> = x

PROCESSO 1
Verdadeiro

<var> < y
Falso
PROCESSO 2

! LEITURA DAS VARIVEIS


READ(*,*) RE, RUG
<var> = <var> + z

! INICIALIZAO DAS VARIVEIS


F1 = 0.1D0
F2 = 0.007D0
TOL = 0.001D0

<var> < y

Sim

No
Fim

! CLCULO DO FATOR DE ATRITO VIA MTODO DA BISSEO

Figura 8.7. Fluxograma lgico de um loop usando o comando CYCLE.

57

58

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 :

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:

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

G = X 10 ( A X + B)
onde A = -0.0142
B = 0.370
G
X

fluxo de sedimentao
concentrao de slidos

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

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:

X n
E( X ) = 1 exp

D *
D*
E
n
X

dimetro de corte (constante)


distribuio acumulada do
partculas
parmetro da equao
dimetro da partcula (varivel)

tamanho

de

Desenvolva um algoritmo e programa para gerar 50 pontos para a curva de


granulometria do sistema (grfico E em funo de X).

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. Tipos de Vetores e Matrizes


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

9.2. Declarao de Vetores

60

v forma individual
A(2) = 10

atribui o valor 10 ao campo 2

v por faixa
A(2:5) = 10
B(1:3,3:4) = 10

atribui o valor 10 aos campos 2 at 5, ou seja,


A(2) = A(3) = A(4) = A(5) = 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 Matrizes


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
A=B+C

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)
REAL*8 B(3,5)

vetor com 10 campos


matriz 3x5

v Atravs do comando DIMENSION

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)
A(3:5) = B(3:5) + C(3:5)

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


DIMENSION A(10), B(3,5)

9.3. Atribuio de Valores


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

o mesmo que fazer A(1) = B(1),


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

o mesmo que fazer A(1) = B(1),


A(2) = B(2), at A(5) = B(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)
A(1:10) = B(1:10) + C(1:10)

faixas diferentes
B no tem 10 campos

61

Os vetores e matrizes tambm podem ser somados, subtrados, divididos


e multiplicados por nmero escalares:
REAL A(5), B(5)
A=B+5
A(1:3) = 2*B(1:3)

o mesmo que fazer A(1) = B(1) + 5,


A(2) = B(2) + 5, etc...
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:

9.5. Funes Intrnsecas

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.

EXEMPLO 2

O Fortran possui um conjunto de funes matemticas para clculo com


matrizes. As principais funes esto listadas abaixo.

MATMUL (A,B)

9.6. Loops com Vetores e Matrizes

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

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

DOT_PRODUCT(A,B)

62

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:

calcula o produto vetorial entre A e B


A e B so dois vetores numricos de igual
tamanho

Incio

I=1

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)

I=1

retorna o maior valor do vetor A


A um vetor numrico

Sim

I=1

MEDIA = MEDIA + X(I)

DP = DP + (X(I) - MEDIA)**2

I=I+1

I=I+1

X(I)

I=I+1

MAXVAL (A)

Sim

I<N

Sim

I<N

No
I<N

No

MEDIA = MEDIA / N

DP = (DP/(N-1))**0.5

MEDIA, DP

No

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

Fim

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


de dados

64

63
O programa para em Fortran para realizar o clculo teria a forma:

O fluxograma a ser seguido tem a seguinte estrutura:

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

Incio

I=1

! 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

THETA(I) >TMAX(I)

! IMPRESSO DOS RESULTADOS


WRITE(*,*) MEDIA = , MEDIA
WRITE(*,*) DESVIO PADRAO = , DP
END

THETA(I) = TMAX(I)

No

THETA(I) <TMIN(I)

! 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

Sim

Sim

THETA(I) = TMIN(I)

No

I=I+1
Sim
I < NPARAM
No
Fim

Figura 9.2. Fluxograma lgico para controle de parmetros.

9.7. Processos Decisrios com Vetores e Matrizes

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 :

Assim como para variveis escalares, os campos individuais dos vetores e


matrizes podem ser usados pelos comandos IF..THEN..ELSE e SELECT
CASE.

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

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.

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.

65

66

9.7.1. WHERE
onde <comparao> a expresso usada para testar a condio a ser verificada.
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:

Caso o PROCESSO consista de somente uma linha de comando, o


comando WHERE pode ser escrito como:

Incio

WHERE (<comparao>) PROCESSO


I=1

comparao

O comando WHERE equivalente ao uso de um comando DO..ENDDO


com a comparao sendo feita por um comando IF..THEN..ELSE:
Verdadeiro

PROCESSO 1

Falso
PROCESSO 2

I=I+1
Sim
I<n

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

No
Fim

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

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

67
! IMPRESSO DOS RESULTADOS
DO I = 1,5
WRITE(*,*) I, C(I)
ENDDO
END
Se A e B fossem:
B
20
A
2
O resultado da diviso seria:
C
10

68

Em termos de programao, a estrutura :

5
0

12
2

18
3

5
-1

-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

I=1

J=1

PROCESSO

J=J+1
Sim
J<n
No
I=I+1
Sim
I<m
No
Fim

Figura 9.4. Fluxograma lgico do comando FORALL. No fluxograma, n e m se


referem ao nmero de campos da matriz (linha e coluna).

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:

X NORM =

X X MIN
X MAX X MIN
X
XMAX
XMIN
XNORM

dado original
maior valor do conjunto de dados
menor valor do conjunto de dados
dado normalizado

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

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 Arquivos

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

Arquivos so abertos usando o comando OPEN que tem forma:


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

! CLCULO
C = A*B

<unit>

unidade de referncia para o arquivo


pode ser qualquer nmero inteiro

! IMPRESSO DO RESULTADO
WRITE(3,*) C

<arquivo>

nome do arquivo a ser criado ou aberto.


o nome do arquivo deve vir entre aspas.

CLOSE(2)
CLOSE(3)
END

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>)

10.2. Arquivos de Dados Leitura


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.

72

71
DIMENSION A(1000)

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
510.0
342.5

0.54
30100.5
0.015

! LEITURA DOS DADOS


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

9.3D-2

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

10.3. Arquivos de Dados Impresso

10.2.1. EOF

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.

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:

EXERCCIOS

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

EOF(<unit>)

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

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)

8.12D0
0.15D0
4.88D3
1030.4D0
Os dados devem ser lidos na varivel X. O programa deve calcular X2 e X3 e
imprimir na tela e em um arquivo os valores de X, X2 e X3, para cada um dos
quatro valores contidos no arquivo de leitura.

73

74

espaados) e imprimir o tempo e a converso no arquivo RES1.DAT, e a


concentrao de reagente e produtos no arquivo RES2.DAT.
EXERCCIO 2
Desenvolva um programa para calcular o progresso da reao qumica de
decomposio do tolueno:

C A = C A0 exp( k t )

Concentrao de tolueno:

Ea
k = A exp

R T
CA
CA0
A
Ea
k
R
t
T

concentrao de tolueno
concentrao inicial de tolueno
fator pr-exponencial
energia de ativao
taxa de reao
constante dos gases
tempo
temperatura
XA =

Converso de tolueno:

XA

C A0 C A
C A0

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
A
R

T
Ea

Com os seguintes dados:


8,0
313,0
2.1049 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

75

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

Programa Principal

Subrotinas

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

11.2. Programa Principal


Um programa Fortran deve ter um programa principal em sua estrutura,
sendo ele tem a forma:
PROGRAM <nome>
:
PROCESSO
:
END

Funes

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.

11.1. Mdulo de Variveis Globais


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.

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.

78

77

11.3. Subrotinas

WRITE(*,*) C
END

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 PRODUTO (A,B,C)


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

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. Call
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)

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

79
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

80

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>)

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

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

81

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.

82

83

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. Organizao 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

Programa Principal

Subrotina Numrica

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:

84
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.

85

86

12.1.2. Usando Bibliotecas Numricas IMSL


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. Bibliotecas Numricas


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

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

87

88

12.1.3. Usando Bibliotecas Numricas Outras

12.2. Funo de Zero

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 :

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 devese 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.

MODULE GLOBAL
!
DECLARAO DAS VARIVEIS GLOBAIS
INTEGER <variveis>
REAL*8 <variveis>
END MODULE
! PROGRAMA PRINCIPAL
PROGRAM <nome>
USE GLOBAL
IMPLICIT REAL*8(A-H,O-Z)
EXTERNAL <subrotina do modelo>

! USA VARIVEIS GLOBAIS


! 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

12.2.1. Usando IMSL


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>
ATOL
RTOL
EPS
ETA

NRAIZ
ITMAX
XGUESS
X
INFO

nome da funo que contm a equao.


erro absoluto (primeiro critrio de parada)
erro relativo (segundo critrio de parada)
distncia mnima entre os zeros da funo
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.
nmero de razes que devem ser obtidas
nmero mximo de iteraes
vetor que deve conter os chutes iniciais dos valores das
razes (tamanho do vetor = NRAIZ)
vetor que conter as razes da funo (tamanho do vetor =
NRAIZ)
vetor que conter o nmero de iteraes necessrias para
obter as razes (tamanho do vetor = NRAIZ)

89

90
EPS = 1.0D-5
ETA = 1.0D-2
ATOL = 1.0D-5
RTOL = 1.0D-5
ITMAX = 1000

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:
2

f( X ) = X + 2 X 6

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)

A equao que ser programada ser a seguinte:


<modelo> = X**2 + 2*X -6

EQUAO
<modelo> = <equaes>

END FUNCTION

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

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

92

91
!

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 Numerical Recipes


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:

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

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
IMPLICIT REAL*8(A-H,O-Z)
EXTERNAL <modelo>

nome da funo que contm a equao.


valor inicial da faixa de valores onde a raiz ser procurada
valor final da faixa de valores onde a raiz ser procurada
erro absoluto (critrio de parada)
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.

! USA VARIVEIS GLOBAIS


! 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)

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

onde <modelo>
X1
X2
TOL
INFO

valor do ponto em que a funo esta sendo avaliada.

IMPRIME A RAIZ
WRITE <XRAIZ>
END
! FUNO QUE CONTM A EQUAO
REAL*8 FUNCTION <modelo> (X)
USE GLOBAL

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

94
!
!

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)

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:

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 Numrica


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 IMSL

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

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:

95
DIVPRK(IDO, NEQ, <modelo>, T, TOUT, ATOL, PARAM, Y)

onde <modelo>
IDO
NEQ
T
TOUT
ATOL
PARAM
Y

nome da subrotina que contm o modelo matemtico.


varivel de controle da integrao e de erro
nmero de equaes do modelo matemtico
tempo inicial de integrao
tempo final de integrao
tolerncia
vetor com as opes de configurao da subrotina
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)
PARAM(2)
PARAM(3)
PARAM(4)

passo inicial da integrao


passo mnimo de integrao
passo mximo de integrao
aumenta o nmero de iteraes (normal: 500)

96

onde N
T
Y
YPRIME

nmero de equaes diferenciais


tempo
varivel
derivada de Y

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

dC
= 3 X + 2 X2
dt
dT
= 2 X C
dt
dX
= 3 exp( 5 / T )
dt
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:

YPRIME(1) = 3 Y (3) + 2 Y(3)2

YPRIME(2) = 2 Y(3) Y(1)


YPRIME(3) = 3 exp(5 / Y(2))

Estrutura Geral do Programa


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

Subrotina do Modelo Matemtico

forma:

A subrotina que contm o modelo matemtico a ser integrado tem a


seguinte estrutura:

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

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

97
! 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)

98
!

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.
C 6H6 + Cl2 C6H5Cl + HCl
C 6H5Cl + Cl2 C6H4Cl2 + HCl
C 6H4Cl2 + 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:

dC B
= k1 C B C Cl
dt
dC MCB
= +k1 C B C Cl k 2 C MCB C Cl
dt
dC DCB
= +k 2 C MCB C Cl k 3 C DCB C Cl
dt
dC TCB
= + k 3 C DCB C Cl
dt
CB
CMCB
CDCB
CTCB
CCl

concentrao de benzeno
concentrao de monoclorobenzeno
concentrao de diclorobenzeno
concentrao de triclorobenzeno
concentrao de cloro

99
k1
k2
k3

100
T
= 0.0D0
TFINAL = 10.0D0
TIMPR = 0.5D0

constante de reao = 24,08 L/mol.min


constante de reao = 3,02 L/mol.min
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.

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)

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

! TEMPO INICIAL
! TEMPO FINAL
! INVERVALO DE IMPRESSO

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

101

102

12.3.2. Usando Numerical Recipes


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>
NEQ
Y
YPRIME
T
H

YOUT

nome da subrotina que contm o modelo matemtico.


nmero de equaes do modelo
valor inicial da varivel sendo integrada
valor da derivada da varivel sendo integrada
tempo inicial de integrao
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)
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:

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

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

DO WHILE (T < TFINAL)


FAZ INTEGRAO AT O PROXIMO PONTO DE IMPRESSO
TOUT = T + TIMPR

onde NEQ
T
Y
YPRIME

CHAMA A SUBROTINA DE INTEGRAO


DO WHILE (T < TOUT)
CALL RK4(NEQ,Y,YPRIME,T,H,YOUT,<modelo>)
Y = YOUT
T=T+H
ENDDO

nmero de equaes diferenciais


tempo
varivel sendo integrada
derivada de Y

A forma de programar o modelo matemtico igual ao mostrado no


Exemplo 4.

IMPRIME OS RESULTADOS PARCIAIS


WRITE(*,*) <variveis>
ENDDO

END

Estrutura Geral do Programa


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

! SUBROTINA QUE CONTM O MODELO MATEMTICO


SUBROUTINE <modelo> (NEQ, T, Y, YPRIME)
USE GLOBAL
! USA VARIVEIS GLOBAIS
IMPLICIT REAL*8(A-H,O-Z)

103

104

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

EXTERNAL FCNMOD
!

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)

!
!

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)

! SUBROTINA DO MODELO

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)

105

106

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-Linear


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 IMSL
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>
NPRM
IDERIV
THETA
R
LDR
IRANK
DFE
SSE

nome da subrotina que contm o modelo matemtico


nmero de parmetros a serem estimados
opo de derivada da funo: 0 derivadas so calculadas
por diferenas finitas, 1 derivada fornecida pelo usurio
vetor com os NPRM parmetros
matriz triangular NPRM x NPRM que contm a matriz
resultante da decomposio do jacobiano.
dimenso de R
ordem da matriz de R
grau de liberdade do erro
soma dos quadrados do erro

Subrotina do Modelo Matemtico


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

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

onde NPRM
THETA
IOPT
IOBS
FRQ
WT
E
DE
IEND

nmero de parmetros
vetor com os parmetros
opo de avaliao: 0 calcula a funo, 1 calcula a
derivada
nmero da observao
frequncia para a observao
peso da observao
erro da observao IOBS
vetor que contm as derivadas parciais do resduo para a
observao IOBS
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:

Ea
k = A exp

RT
A
Ea
k
R
T

fator pr-exponencial (parmetro)


energia de ativao (parmetro)
taxa de reao
constante dos gases
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.

Ea
ln k = ln A

RT
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:

Ea
E = ln k ln A

R T

107

108
!

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:

THETA(2)

E = ln{Y(1, IOBS)} ln{THETA(1)}


R Y(2, IOBS)

!
!

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

ou em Fortran:

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


E

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


!

IMPRESSO DOS RESULTADOS


WRITE(*,*) <parametros>
END

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>

! 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

109
! 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

110

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. Estimativa 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 IMSL
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)

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

onde <modelo>
NOBS
NEQ
NPRM
THETA0
IBTYPE

XLB
XUB
XSCALE
FSCALE
IPARAM

nome da subrotina que contm a funo a ser minimizada


nmero de observaes
nmero de equaes no modelo matemtico
nmero de parmetros a ser estimados
chute inicial para os parmetros
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.
vetor com os limites inferiores para os parmetros
vetor com os limites superiores para os parmetros
vetor com o valor de escalonamento dos parmetros
vetor com o valor de escalonamento para as funes
vetor com as opes de configurao da subrotina

111

RPARAM
THETA
FVEC
FJAC
LDFJAC

vetor com as opes de configurao da subrotina


vetor com os parmetros que foram estimados pela subrotina
vetor que contm os resduos da soluo
matriz que contm o Jacobiano da soluo
dimenso de FJAC

Subrotina do Modelo Matemtico


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

112
!
!
!
!

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>)

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

onde M
NPRM
THETA
ERRO

nmero de observaes * nmero de equaes


nmero de parmetros
vetor com o valor dos parmetros
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
YSIM

valor observado
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)

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

113

114

! IMOD = 2 SE MODELO ALGBRICO


!
!

YSIM(J,I) = YOBS(J,I)
ENDDO

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 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

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)

INICIALIZA PARMETROS PARA A INTEGRAO NUMRICA


ATOL = 1.0D0
IDO = 1
PARAM = 0.0D0
PARAM(4) = 1000000
T = 0.0D0
ENDIF

!
!
!

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>

115
!
!
!

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

116

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).

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
X = 0.0 marca o incio de um novo
3.0
9.4
4.4
experimento e portanto de o incio de
0.0
13.9
0.0
uma nova integrao.
1.5
12.3
2.5
1.9
12.1
2.9
3.0
10.3
4.0
4.0
9.0
5.4

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
1
5
10
20
40
60
100
200
400
760

Temperatura
-26.7
-4.4
6.4
18.4
31.8
40.3
51.9
69.5
89.5
110.6

117

Desenvolva um programa para calcular os parmetros da equao de Antoine


para os dados acima.
B

Pvap = exp A +

T + 273

AeB
Pvap
T

parmetros
presso de vapor (mmHg)
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:
dy
3,21
= 0,1744 exp
y
dx
T*
O balano de energia (adimensionalizado) dado por:
dT *
3,21
= 0,06984 exp
y
dx
T*
T* =

T
T0
T
T0
T*
y
x

Condies iniciais:
em x = 0

temperatura em K
temperatura inicial = 423 K
temperatura adimensional
concentrao de benzeno adimensional
comprimento do reator adimensional

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).

118

119

120
Warning

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).

Variable A is
C = B/A
------^

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)
Descrio do erro
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.

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

Error: An ENDIF occurred without a corresponding IF THEN or ELSE


statement.
ENDIF
^

Falta o comando THEN na estrutura IF..THEN..ELSE


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

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.

122

121
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: The number of subscripts is incorrect.


A(10) = 2.0D0
^

[A]

A varivel A foi definida como uma matriz A(x,y) e foi usada como um
vetor A(x).
Error: The statement
invalid.
IF (C == 0.0D0)
^

following

the

Logical

IF

statement

is

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.

Error: Syntax error, found ',' when expecting one of: <END-OFSTATEMENT> ;
A = 2,0D0
-----^

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)
^

Nmero foi digitado errado (2,0D0). O certo 2.0D0 (com ponto ao invs
de vrgula).

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.

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.

Warning: In the call to SOMA, there


corresponding to the dummy argument C.
CALL SOMA(A,B)
^

A subrotina SOMA foi definida como:


SUBROUTINE SOMA(A,B,C)

is

no

actual

argument

123

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(1) = 2.0D0
^

[A]

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.

erro
ocorrido

linha do
erro

Figura 3.2. Tela do programa quando ocorre erro de execuo

124

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.

126

125

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

14.1. Quando Debugar


v
v
v
v

quando o programa parece no sair do lugar.


quando ocorre diviso por zero ou outro erro matemtico grave.
quando o resultado numrico NAN (Not a Number)
quando o resultado retornado estranho.

14.3.2. Ocorre Diviso por Zero / Erro em Logaritmo


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.
problema ocorrido
(tipo de erro)

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. Problemas que Causam Problemas


14.3.1. Programa Parece No Sair 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.

nmero da linha do
programa onde o erro
ocorreu

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


logaritmo.
14.3.3. Overflow ou Nmero Infinito
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.

127

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
SUM = 0.0D0
DO I = 1,100
SUM = SUM + X(I)
ENDDO

Errado
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. Resultado 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.).

128

14.3.5. Resultado Retornado Estranho


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).

boto Stop

linha selecionada para parar a


execuo do programa. Aps
pressionar o boto Stop,
aparecer uma bola ao lado da
linha.

Figura 14.2. Selecionando a linha de parada.


Pode-se definir quanto pontos de parada se desejar.

129

130

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.

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.

Figura 14.3. Iniciado a seo de debug.

Figura 14.4. Tela de um programa sendo debugado.

Вам также может понравиться