Você está na página 1de 68

Programao Fortran para Engenharia

PROGRAMAO
FORTRAN
PARA ENGENHARIA

Fabiano A.N. Fernandes

1a Edio
2003

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
ii iii

SUMRIO 9. VETORES E MATRIZES


9.1. Tipos de Vetores e Matrizes
59
59
9.2. Declarao de Vetores 59
9.3. Atribuio de Valores 59
1. INTRODUO 1 9.4. Operaes com Vetores e Matrizes 60
1.1. O Curso 2 9.5. Funes Intrnsecas 61
9.6. Loops com Vetores e Matrizes 62
2. LGICA DE PROGRAMAO 3 9.7. Processos Decisrios com Vetores e Matrizes 63
2.1. Algoritmo 3 9.7.1. WHERE 65
2.2. Fluxograma 4 9.7.2. FORALL 67
Exerccios 9 Exerccios 68

3. COMPILADOR 11 10. ARQUIVOS DE DADOS 69


3.1. Criando um Projeto 11 10.1. Operaes com Arquivos 69
3.1.1. Usando um Cdigo Pronto em um Novo Projeto 18 10.2. Arquivos de Dados - Leitura 70
3.2. Cdigo em Fortran 90 18 10.2.1. EOF 71
3.4. Cdigo em Fortran 77 19 10.3. Arquivos de Dados - Impresso 72
Exerccios 72
4. TIPOS E DECLARAO DE VARIVEIS 21
4.1. Declarao de Variveis 21 11. ORGANIZAO DE PROGRAMAS EXTENSOS 73
4.2. Atribuio de Valores 23 11.1. Mdulo de Variveis Globais 73
11.2. Programa Principal 74
5. CALCULOS MATEMTICOS 25 11.2.1. USE 74
5.1. Operaes Matemticas Bsicas 25 11.3. Subrotinas 75
5.2. Funes Matemticas 26 11.3.1. CALL 75
11.4. Funes 78
6. LEITURA E IMPRESSO DE DADOS 29 11.4.1. Chamando Funes 78
6.1. Formatao dos Dados 30
Exerccios 32 12. MTODOS MATEMTICOS 81
12.1. Organizao Geral do Programa 81
7. PROCESSOS DECISRIOS 33 12.1.1. Bibliotecas Numricas 83
7.1. Operadores Relacionais 33 12.1.2. Usando Bibliotecas Numricas - IMSL 84
7.2. IF..THEN 33 12.1.3. Usando Bibliotecas Numricas - Outras 85
7.3. IF..THEN..ELSE 36 12.2. Funo de Zero 86
7.3.1. Forma Antiga 38 12.2.1. Usando IMSL 86
7.4. Comparao em Conjunto 38 12.2.1. Usando Numerical Recipes 89
7.5. Processo Decisrio por Faixa ou Classes 41 12.3. Integrao Numrica 92
Exerccios 44 12.3.1. Usando IMSL 92
12.3.1. Usando Numerical Recipes 99
8. LOOPS 47 12.4. Regresso No-Linear 103
8.1. Loops Limitados 47 12.4.1. Usando IMSL 103
8.1.1. Forma Antiga 50 12.5. Estimativa de Parmetros 108
8.2. Loops por Deciso 51 12.5.1. Usando IMSL 108
8.3. Loops Infinitos 54 Exerccios 114
8.4. CYCLE 56
Exerccios 57

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
iv

13. ERROS 117


13.1. Erros de Execuo 121

14. DEBUG 123


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

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
1 2

1. INTRODUO 1.1. O Curso

O Fortran tem sido usado por cientistas e engenheiros por muitos anos, Este curso, ir apresentar os principais comandos do Fortran 90 usados
sendo uma das principais linguagens de programao cientfica especialmente para fazer projetos de engenharia. Os exemplos e exerccios focam em
devido a sua capacidade em fazer clculos. Taxada de linguagem obsoleta pelas problemas tradicionais e de utilizao prtica.
pessoas que desconhecem as novas atualizaes na sua estrutura de Ao final do curso, alguns mtodos numricos mais utilizados so
programao, o Fortran hoje possui todos os elementos de linguagem que abordados, mostrando como criar programas usando bibliotecas numricas.
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.

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
3 4

Fases de um Algoritmo
2. LGICA DE PROGRAMAO
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
Programar em Fortran, assim como em qualquer outra linguagem de
dos resultados.
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 Entrada de Processo Impresso dos
Dados Resultados
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 EXEMPLO 1
vetores e matrizes so necessrios. Um algoritmo para calcular a mdia de trs nmeros tomaria a forma:
1. Ler N1, N2 e N3
Aps algum tempo de experincia, o processo de organizao da estrutura
N1+ N2 + N3
do programa passa de a ser lgico e fcil, no sendo necessrio fazer um 2. Calcular Mdia pela equao: Media =
algoritmo muito detalhado. Porm se o programa for utilizado por mais de uma 3
pessoa, o algoritmo ainda necessrio para facilitar o entendimento do 3. Imprimir Mdia
programa por outras pessoas, uma vez que ler um algoritmo bem mais fcil do
que ler o cdigo de um programa.

2.2. Fluxograma

2.1. Algoritmo O fluxograma uma forma padronizada e eficaz para representar os


passos lgicos de um determinado processo. Sua principal funo a de facilitar
Um algoritmo uma sequncia finita de passos que levam a execuo de a visualizao dos passos de um processo.
uma tarefa, ou seja, a receita que deve ser seguida para se chegar a uma meta O fluxograma constitudo por diversos smbolos que representam estes
especfica. O programa por sua vez, nada mais do que um algoritmo escrito elementos de programao (Tabela 2.1). No interior dos smbolos sempre
numa linguagem de computador. existir algo escrito denotando a ao a ser executada.

Regras Bsicas para Construo de um Algoritmo


Tabela 2.1. Elementos do fluxograma
Para escrever um algoritmo deve-se descrever a sequncia de instrues incio e fim
de maneira simples e objetiva, podendo-se utilizar algumas tcnicas bsicas: leitura de dados
impresso de dados
v usar somente um verbo por frase
ao
v usar frases curtas e simples
v ser objetivo deciso
v usar palavras que no tenham sentido dbio conexo

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
5 6

EXEMPLO 2 Fi fluxo volumtrico da corrente i


O fluxograma para o exemplo 1 tomaria a forma: Mi fluxo mssico da corrente i
i densidade da corrente i
Incio
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. Calcular Densidade da Corrente 3

Corrente 1 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 EXEMPLO 4
Se considerarmos os trocadores de calor, o coeficiente de troca trmica
Supondo que no h acmulo volumtrico no interior do tanque, e que as depende do tipo de escoamento (laminar ou turbulento) e pode ser calculado
densidade das correntes de entrada (1 e 2) so diferentes, o clculo do fluxo por meio de correlaes que so definidas para cada faixa de nmero de
volumtrico de sada do tanque (corrente 3), do fluxo mssico e da densidade Reynolds.
no tanque pode ser feito usando as equaes: Um programa que calcule o coeficiente de troca trmica deve conter um
processo decisrio que utilize a correlao correta em funo do valor do
Fluxo volumtrico: F 3 = F1+ F 2 nmero de Reynolds, conforme as equaes:

M3 = F1 1+ F 2 2 0,8
NPr 0,33 0,14
Fluxo Mssico:
EQ1: NNu = 0,153 NRe para NRe < 2100

F1 1+ F 2 2
Densidade: 3 =
F3

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
7 8

0,33 EXEMPLO 4
0,33 d
EQ2: NNu = 10,56 NRe NPr 0,33 0,14 muito comum em engenharia, termos que gerar dados para montar um
L grfico de uma determinada funo. A velocidade terminal de uma partcula
para NRe > 2100 funo do tamanho da partcula e das propriedades do fluido e do slido e pode
ser calculada pela equao:
d dimetro do tubo
L comprimento do tubo
0,524 Dp 2 ( s f )
NNu nmero de Nusselt
ut =
NPr nmero de Prandtl
NRe nmero de Reynolds
razo de viscosidade do fluido no centro e na parede
do tubo Se quisermos gerar 100 pontos para construir um grfico da velocidade
superficial em funo do dimetro de partcula, para partculas variando de 50 a
O fluxograma do programa para clculo do coeficiente de transferncia de calor 1000 m poderemos usar o seguinte fluxograma:
ser:
Incio
Incio

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

DeltaDP = (1000 - 50)/100


Sim Calcula NNu pela
NRe < 2100
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.


I = I +1

No fluxograma acima, aps a leitura das variveis necessrias, o programa


Sim
deve decidir qual das duas equaes ser usada para o clculo do nmero de I <= 100
Nusselt,. Esta deciso feita comparando o nmero de Reynolds lido com o
No
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 Fim
EQ2.
Figura 2.5. Fluxograma para clculo do coeficiente de transferncia de calor.

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
9 10

No fluxograma acima, um contador (I) utilizado para fazer a iterao de 1 at Neste fluxograma usamos o conceito de contadores (variveis I e J), que
100 que o nmero de pontos desejado para o grfico. Um valor de servem para contar o nmero de iteraes realizadas, ou simplesmente para
incremento definido para o dimetro das partculas (DeltaDP) e este usado marcar uma posio. Neste caso os contadores servem para indicar qual a
no clculo do dimetro da partcula (DP). Aps a velocidade terminal (UT) ser posio no vetor A que contm as temperaturas.
calculada, os valores de DP e UT so impressos. O contador incrementado Para organizar o vetor necessrio procurar pelo maior valor e coloc-lo na
em uma unidade e o processo continua at que 100 pontos sejam impressos. 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
EXEMPLO 5 estar em qualquer posio no interior do vetor, como por exemplo:
A tecnologia Pinch, usada para otimizar a troca de energia entre as diversas
correntes de um processo, requer a organizao das temperatura das diversas Posio 1 2 3 4 5 6 7 8 9 10
correntes em ordem decrescente, em uma de suas etapas. Valor 12 9 25 11 22 12 15 3 7 18
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 Para achar o maior valor e coloc-lo na primeira posio do vetor, podemos
ser seguido ser dado por: 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
Incio
desta posio com os valores contidos nas outras posies do vetor, ou seja
com as posies 2 at 10.
Ler Vetor A contendo as Para controlar qual a posio que ser comparada com a posio I, podemos
Temperaturas das Correntes 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
I=0 que o maior valor fique na primeira posio:

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

J=J+1

Sim
Uma vez que a primeira posio do vetor foi preenchida corretamente com o
A(I) < A(J) B = A(I)
A(I) = A(J)
maior valor do vetor, podemos repetir a mesma operao para achar o
No
A(J) = B 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
Sim J < 10 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
No
No
de forma que o maior valor fique na segunda posio:
I=9

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

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

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
11 12

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 EXERCCIO 2
posies, o valor do contador I varia de 1 a 9 e no de 1 a 10 pois no final do A correlao a ser utilizada para calcular as propriedades fisicoqumicas
processo, o valor contido na posio 10 j ser o menor valor contido no vetor. depende da fase em que a substncia se encontra: gs ou lquido. A deciso de
Alm disso no seria possvel comparar o valor A(10) com o valor A(11) pois
qual correlao deve ser utilizada pode ser feita com base na comparao entre
este ltimo no existe.
a temperatura de ebulio do composto e a temperatura do processo.
Desenvolva um fluxograma para calcular a capacidade calorfica de uma
Dos exemplos mostrados neste captulo, o exemplo 5 um dos problemas substncia.
mais complicados que se tem em lgica de programao para engenharia, pois As correlaes para o clculo da calorfica so:
envolve operao com vetores, controle de vetores, loops e comparaes. para gs:
Embora, a modelagem e a resoluo dos problemas de engenharia sejam Cp = A + B T + C T 2
muitas vezes complexos, a lgica de programao a ser utilizada ser na grande
maioria dos casos muito parecida com os exemplos mostrados neste captulo. para lquido:
Nos prximos captulo iremos abordar os comandos que nos permitem
A2
programar em Fortran. Cp = + B 2 A C t A D t2
t
T
t = 1
Tc
EXERCCIOS
Cp capacidade calorfica
EXERCCIO 1 T temperatura
Um procedimento muito comum em programao para engenharia a obteno Tb temperatura de ebulio
das razes de uma funo. Para uma funo de segundo grau, como a mostrada Tc temperatura crtica
A, B, C, D parmetros
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 EXERCCIO 3
velocidade terminal: O exemplo 5 apresentou como se organiza um vetor (contendo 10 valores) em
ordem decrescente. Desenvolva um algoritmo que organize um vetor, contendo
ut
Dp = N valores, em ordem crescente.
0,524 ( s f )

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


0,524 D p2 ( s f )
0 = ut

Desenvolva o fluxograma para calcular o dimetro da partcula a partir de cada


um destes dois processos.

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
13 14

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 Figura 3.1. Abertura de um novo projeto no Fortran
sua biblioteca numrica.
Este compilador capaz de criar vrios tipos de programas (programa
v GNU FORTRAN (GCC) executvel, subrotina DLL, programas com interface Windows, etc.). Neste
Devido a ser um programa livre (grtis). um compilador para Fortran curso abordaremos os programas executveis, portanto escolha a opo Fortran
77 mas contm a maioria dos comandos do Fortran 90 alm da Console Application (Figura 3.2).
possibilidade de formatao livre do cdigo. No cria aplicativos com
interface grfica e no contm mdulo de bibliotecas numricas.

Os programas a serem feitos neste curso podero ser executados em


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

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

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
15 16

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 Este arquivo texto poder ser editado e o cdigo do programa poder ser
o cdigo do programa em Fortran devero ser gravados (Figura 3.2). digitado nele. Aps editado, este arquivo deve ser gravado com a extenso .f90.
Escolha para criar um projeto vazio (Figura 3.3). Finalize a abertura do Para salvar o arquivo selecione File no menu principal e depois selecione a
projeto pressionando o boto Finish. 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.

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
17 18

Este arquivo por sua vez dever ser inserido no projeto. Para isto, Selecionar Rebuild All como mostrado na Figura 3.8 evita o trabalho de
selecione Project no menu principal e depois selecione a opo Add To Project ter que selecionar Compile e depois selecionar Build.
e Files (Figura 3.7). Selecione o arquivo f90 que foi criado. 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
3.1.1. Usando um Cdigo Pronto em um Novo Projeto
vinculado ao projeto. Isto s ocorre aps o usurio fazer a insero manual
deste arquivo ao projeto.
Se quiser comear um novo projeto e importar um arquivo de cdigo
existente para este novo projeto siga o seguinte procedimento:
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. Crie o novo projeto.
Aps pronto, o cdigo deve ser compilado para ento se tornar um Copie o arquivo de cdigo para o diretrio criado para o novo projeto.
programa executvel. A compilao feita selecionando Build no menu Vincule o arquivo de cdigo ao novo projeto.
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 Se o arquivo de cdigo no for copiado para o novo diretrio, este cdigo
impeam a criao do programa executvel, as mensagem de erro aparecero na ser compartilhado por dois ou mais projetos e uma modificao neste cdigo
janela abaixo do cdigo (Figura 3.8). 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

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
Figura 3.8. Compilao e criao do programa executvel. linha.

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
19 20

O programa comea com o comando PROGRAM e termina com o dificuldade em fazer alguns tipos de operaes com vetores e matrizes;
comando END. impossibilidade de criar DLLs; e ter que conviver com regras mais rgidas para
escrever o programa.
PROGRAM <nome> O Fortran 77 tem vrias regras de escrita do cdigo, sendo que as linhas
: de cdigo so divididas por sees:
cdigo
: colunas
END 1 5 6 7 72
A B C
onde <nome> o nome dado ao programa
Zona A contm comentrios e nmeros de linha de cdigo (linhas 1 a 5).
O comando PROGRAM na verdade opcional, mas pode vir a ser
Zona B contm o caracter que indica a continuao da linha anterior (linha 6).
importante para diferenciar o programa principal dos outros mdulos, subrotinas
Zona C cdigo do programa (linhas 7 a 72).
e funes (veremos estas estruturas no Captulo 11).
possvel inserir comentrios ao longo do programa de forma a
Um programa em Fortran 77 teria a forma:
identificar as diversas partes do programa e descrever o que est sendo realizado
em cada parte. O comentrio comea com o caracter ! 1 5 6 7 72
PROGRAM <NOME>
PROGRAMA EXEMPLO :
! PROGRAMA PARA CALCULO DE 2 + 2 cdigo
A=2+2 ! EQUAO :
END END

Muitas vezes as equaes so muito longa para caberem na tela, de forma A insero de comentrios deve ser feita colocando a letra C na primeira
que a linha do programa sairia do campo visual. Neste caso o caracter & pode coluna da linha:
ser usado para indicar que esta linha de cdigo continua na linha seguinte. O &
1 5 6 7 72
deve vir no final da linha. PROGRAM EXEMPLO
C PROGRAMA PARA CLCULO DE 2 + 2
PROGRAMA EXEMPLO A = 2 + 2
! CALCULO DE UM BALANO POPULACIONAL END
A = (TAU + BETA)*(TAU + BETA/2.0*(TAU + BETA)*(R 1.0))*R/ &
(1.0 + TAU + BETA)**R Qualquer linha de cdigo deve ser escrito at a coluna 72. Aps a coluna
END 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
2.3. Cdigo em FORTRAN 77 que aquela linha se trata da continuao da linha anterior.

O Fortran 77 a verso antiga da linguagem Fortran. Ainda hoje ela 1 5 6 7 72


PROGRAM EXEMPLO
bastante popular pois alguns programadores aprenderam a programar em C CALCULO DE BALANO POPULACIONAL
Fortran 77 e escolheram no se atualizar para o usar o Fortran 90. Portanto A = (TAU + BETA)*(TAU + BETA/2.0*(TAU + BETA)*(R 1.0)*R
muito comum ver programas novos sendo escritos em Fortran 77. * /(1.0 + TAU + BETA)**R
As desvantagens do Fortran 77 em relao ao Fortran 90 so: no poder END
usar alguns comandos novos que foram criados com o Fortran 90; maior

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
21 22

Individualmente, as variveis so declaradas listando seus nomes aps o


4. TIPOS E DECLARAO DE VARIVEIS tipo da varivel, como por exemplo:

INTEGER A, B, C
As variveis podem ser basicamente de quatro tipos: numricas, REAL D, E
caracteres ou lgicas. Os tipos de variveis do Fortran so: REAL*8 F, G, H
CHARACTER*10 I
v INTEGER COMPLEX J
nmeros inteiros
importante dar nomes representativos para as variveis, de forma que
v REAL se possa identificar facilmente sua funo no programa.
nmero real
suporta valores entre 1.0 x 10-45 at 1.0 x 1045 EXEMPLO
REAL*8 DENS, VISC para densidade e viscosidade
v REAL*8 INTEGER IDX para ndice
nmero real em dupla preciso
suporta valores entre 1.0 x 10-300 at 1.0 x 10300 comum esquecermos de declarar variveis no incio do programa
este tipo de varivel o tipo mais usado em engenharia e seu uso deve quando usamos a declarao individual das variveis. Para evitar este problema,
ser preferido dentre as duas formas de nmero reais podemos usar a funo IMPLICIT para declarar um grupo de variveis
programas mais antigos usavam a declarao: DOUBLE PRECISION para baseados em sua letra inicial:
este tipo de varivel
IMPLICIT REAL*8 (A-H,O-Z)
v CHARACTER*i
sequncia alfanumrica com um mximo de i caracteres esta declarao ir fazer com que todas as variveis iniciadas em A at H e em
no pode ser utilizada em operaes matemticas O at Z sejam nmero reais em dupla preciso. Como consequncia, as
variveis iniciadas em I at N sero nmero inteiros.
v COMPLEX Em geral, as letras I a N so utilizadas para denotar nmeros inteiros e as
nmero complexo 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.
v LOGICAL Utilizar o comando IMPLICIT no impede a declarao individual de
varivel lgica outras variveis, sendo que declaraes individuais se sobrepe declarao
possui dois valores: .FALSE. (falso) e .TRUE. (verdadeiro) feita pelo comando IMPLICIT.
este tipo de varivel tem sido gradativamente substitudo por nmero
inteiros onde 0 se refere a falso e 1 a verdadeiro. EXEMPLO
IMPLICIT REAL*8 (A-H,O-Z)
REAL*8 NSA
INTEGER P1
CHARACTER*20 ARQUIVO
4.1. Declarao de Variveis

As variveis podem ser declaradas em grupo ou individualmente. Esta


declarao deve vir logo no incio do programa.

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
23 24

4.2. Atribuio de Valores v Formas vlidas para varivel lgica:


L = .TRUE.
L = .FALSE.
v Formas vlidas para nmeros inteiros: estas so as duas nicas opes para a varivel lgica
I=0
I = 134
I = -23
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 S = Texto
A = -0.0012 S = texto
A = .236
A = +5.0E3 No caso do apostrofe ser necessrio no meio do texto, pode-se usar as
formas:
A atribuio 5.0E3 quer dizer: 5.0 x 103 S = textos texto
S = textos texto

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)

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
25 26

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


5. CLCULOS MATEMTICOS operaes matemticas, para se evitar erros de calculo.

EXEMPLO 1
A equao:
5.1. Operaes Matemticas Bsicas G
(B C )E + A B
Z=
As operaes bsicas de adio, subtrao, multiplicao, diviso e
F
exponenciao so feitas usando os smbolos da Tabela 5.1.
deve ser programada como:
Tabela 5.1. Smbolos usados para as operaes matemticas
Z = (((B-C)**E + A*B)/F)**G
Smbolo Operao
+ adio Se esta mesma equao fosse programada como:
- subtrao Z = (B-C)**E + A*B/F**G
* multiplicao
/ diviso a equao que estaria sendo calculada seria:
** exponenciao AB
Z = (B C )E +
FG
Uma hierarquia imposta a estas operaes: que por sua vez resultaria num valor muito diferente do que o valor desejado
1. parnteses inicialmente.
2. exponenciao
3. multiplicao e diviso (o que aparecer primeiro)
4. adio e subtrao (o que aparecer primeiro) 5.2. Funes Matemticas

O Fortran possui um conjunto de funes matemticas para clculo de


EXEMPLO
logaritmo, seno, tangente, e muitas outras. As principais funes esto listadas
As equaes:
abaixo.
A = B + C D
ABS(A) calcula o nmero absoluto de A
A = BD + E A pode ser um inteiro, real ou complexo

B C + DE ACOS(A) calcula o arco coseno de A (resultado em radianos)


A= A pode ser somente real
F
seriam programadas como: ACOSD(A) calcula o arco coseno de A (resultado em graus)
A = B + C*D A pode ser somente real

A = B**D + E ASIN(A) calcula o arco seno de A (resultado em radianos)


A pode ser somente real
A = (B*C + D**E)/F

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
27 28

ASIND(A) calcula o arco seno de A (resultado em graus) LOG(A) calcula o logaritmo natural de A
A pode ser somente real A pode ser real ou complexo
Alguns compiladores podem no aceitar este comando
LOG10(A) calcula o logaritmo de A
ATAN(A) calcula o arco tangente de A (resultado em radianos) A pode ser real ou complexo
A pode ser somente real
SIN(A) calcula o seno de A (A em radianos)
ATAND(A) calcula o arco tangente de A (resultado em graus) A pode ser real ou complexo
A pode ser somente real
Alguns compiladores podem no aceitar este comando SIND(A) calcula o seno de A (A em graus)
A pode ser real ou complexo
CEILING(A) retorna o menor nmero inteiro maior ou igual A Alguns compiladores podem no aceitar este comando
A pode ser somente real
CEILING(4.8) retorna 5.0 SINH(A) calcula o seno hiperblico de A
CEILING(-2.5) retorna 2.0 A pode ser somente real

COS(A) calcula o coseno de A (A em radianos) TAN(A) calcula a tangente de A (A em radianos)


A pode ser somente real A pode ser real ou complexo

COSD(A) calcula o coseno de A (A em graus) TAND(A) calcula a tangente de A (A em graus)


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

COSH(A) calcula o coseno hiperblico de A TANH(A) calcula a tangente hiperblica de A


A pode ser somente real A pode ser somente real

COTAN(A) calcula a cotangente de A (resultado em radianos)


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
COTAND(A) calcula a cotangente de A (resultado em graus) tangente ser DTAN(A), a exponencial ser DEXP(A) e assim por diante.
A pode ser somente real
Alguns compiladores podem no aceitar este comando
EXEMPLO 2
EXP(A) calcula a exponencial de A A distribuio granulomtrica pode ser representada pela equao:
A pode ser somente real
D
N
X = 1 exp
INT (A) converte o valor de A em um nmero inteiro D *
A pode ser real ou complexo
INT(7.8) retorna o valor 7
A programao desta equao dada por:
LEN(S) retorna o nmero de caracteres de um texto X = 1.0D0 DEXP(-(D/DSTAR)**N)
S pode ser somente um campo alfanumrico

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
29 30

6. LEITURA E IMPRESSO 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
A leitura e impresso de dados uma parte fundamental de muitos
estiver definido na linha de comando especificada
programas. Em Fortran, a leitura de dados feita pelo comando READ e a
se um formato, seguir o formato que estiver especificado
impresso de dados feito pelo comando WRITE.
Tanto o comando WRITE quanto o comando READ podem seguir um
<variveis> lista de variveis a serem impressos (separadas por vrgulas)
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:
EXEMPLO
WRITE(*,*) A,B,C escreve as variveis A, B e C na tela
READ(<unidade>,<formato>) <variveis>

<unidade> um ndice que indica de onde a leitura de dados ser feita: WRITE(2,*) A,B escreve as variveis A, B no arquivo
se *, ela ser feita pelo teclado especificado na unidade 2
se um nmero, ela ser feita a partir de um arquivo de dados
WRITE(6,100) A,B escreve as variveis A, B no arquivo
especificado na unidade 6, seguindo o formato
<formato> so as regras da formatao da leitura de dados
especificado na linha de comando 100.
se *, o formato livre (forma preferencial)
se uma linha de comando (nmero da linha), o formato ser o que esta forma de especificao usando linhas de
comando numerados tem cado em desuso e seu
estiver definido na linha de comando especificada
uso no mais recomendado
se um formato, seguir o formato que estiver especificado
WRITE(*,(2F5.2)) A,B escreve as variveis A, B na tela, seguindo o
<variveis> lista de variveis a serem lidas (separadas por vrgulas)
formato especificado (2F5.2).

EXEMPLO
READ (*,*) A,B,C l as variveis A, B e C a partir do teclado
6.1. Formatao dos Dados
READ(2,*) A,B l as variveis A, B a partir do arquivo
especificado na unidade 2 (veremos a O formato de impresso ou leitura especificado diretamente no
especificao de arquivos no captulo 10) comando WRITE ou READ ou atravs do comando FORMAT.
Os formatos podem ser:

O comando WRITE tem a forma: Ix inteiro, onde x o nmero de caracteres a ser impresso/lido
I3 inteiro com trs algarismos
WRITE(<unidade>,<formato>) <variveis> I5 inteiro com cinco algarismos

<unidade> um ndice que indica de onde a impresso dos dados ser Fx.y real com x algarismos, sendo y algarismos reservados para as casas
feita: decimais
se *, imprime as variveis na tela x deve ser pelo menos igual y+1, uma vez que o ponto decimal tambm
se um nmero, imprime as variveis em um arquivo de dados conta como um caracter

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
31 32

F5.2 nmero real com 2 casas decimais e 2 algarismos antes da


virgula WRITE(*,(I3,2X,F5.2,2X,E8.2)) I,C,A
F10.4 nmero real com 4 casas decimais e 5 algarismos antes da Imprimiria: 100__12.56__1.03E+03 (onde _ se refere a um espao)
virgula
F5.5 forma no vlida, pois no h espao para as 5 casas WRITE(*,(A8,F10.3,F10.1)) S,A,B
decimais mais a virgula Imprimiria: MEDIA_____1030.560_______5.6

Ex.y nmero real escrito em notao cientfica com x caracteres, sendo y WRITE(*,(I2,3F5.2)) N,A,B,C
algarismos reservados para as casas decimais. A parte exponencial ter a Imprimiria: _5XXXXX_5.5612.56 (a varivel A no ser impressa
pois o tamanho de sua parte
forma E00, ocupando 4 caracteres
inteira maior do que o reservado
x deve ser pelo menos igual y+5, uma vez que o ponto decimal e a parte para ela)
exponencial tambm contam como um caracteres
E9.2 nmero real escrito na forma: aa.bbEcc
E10.1 nmero real escrito na forma: aaaa.bEcc

Ax campo alfanumrico com x caracteres EXERCCIOS


A5 campo alfanumrico com 5 caracteres
EXERCCIO 1
yX y espaos 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
EXERCCIO 2
Incorporado ao comando WRITE: Escreva um programa para ler dois nmeros reais, calcular o logaritmo do
primeiro nmero, o coseno do segundo e imprimir o resultado destas duas
WRITE(*,(I2,3X,F5.2,3X,F5.2)) N, A, B operaes e o produto dos dois resultados.

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

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
33 34

7. PROCESSOS DECISRIOS 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
IF (<comparao>) THEN
Toda deciso no Fortran depende de uma comparao entre dois valores :
ou de um conjunto de comparaes. PROCESSO
Os operadores que podem ser usados para comparar duas variveis so :
mostradas na Tabela 7.1. END IF

Tabela 7.1. Operadores Relacionais onde <comparao> a expresso usada para testar a condio a ser verificada.
Smbolo Operador
== igual Caso o PROCESSO consista somente de uma linha de comando, o
> maior que comando IF..THEN pode ser escrito como:
>= maior ou igual que
IF (<comparao>) PROCESSO
< menor que
<= menor ou igual que
/= diferente
EXEMPLO 1
O coeficiente de arraste (CD) de partculas slidas pode ser calculado pela
Estes operadores servem para decidir o que ser feito dependendo equao:
do resultado da comparao. O comando mais utilizado para o processo
decisrio o IF..THEN e o IF..THEN..ELSE. 24
CD = vlida para Re < 0,1
Re
Para valores maiores do nmero de Reynolds (Re), a equao para clculo do
7.2. IF..THEN coeficiente de arraste dado pela equao:

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


CD =
24
Re
(
1+ 0,14 Re 0,7 ) vlido para Re > 0,1
Incio

CD coeficiente de arraste
Verdadeiro Re nmero de Reynolds
comparao PROCESSO

Falso
O fluxograma de deve ser seguido para este processo :

Fim

Figura 7.1. Fluxograma lgico do comando IF..THEN

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
35 36

Incio . IF..THEN..ELSE

Re A estrutura do tem a seguinte lgica:

CD = 24/RE Incio

Sim Verdadeiro
Re > 0.1 CD = CD*(1 + 0.14*RE**0.7) comparao PROCESSO 1

No 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 No comando IF..THEN..ELSE, se a comparao for verdadeira, o
processo 1 executado, caso contrrio o processo 2 executado.
a execuo do programa desviada para calcular o coeficiente de arraste Em termos de programao, a estrutura a seguinte:
baseado na segunda equao.
O programa em Fortran para clculo do coeficiente de arraste ser: IF (<comparao>) THEN
:
PROGRAM ARRASTE PROCESSO 1
IMPLICIT REAL*8 (A- -Z) :
! LEITURA DAS VARIVEIS ELSE
:
PROCESSO 2
:
CD = 24.0D0/RE END IF
IF (RE > 0.1D0) CD = CD*(1.0D0 + 0.14D0*RE**0.7D0)

! IMPRESSO DO RESULTADO EXEMPLO 2


No clculo da perda de carga, o fator de atrito calculado de acordo com o
END 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).

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

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
37 38

2 ELSE

1 ! RE > 2100 (ESCOAMENTO TURBULENTO)
EQ2: f = [eq. Von Karman]
FATR = (1.0D0/(2.0D0*LOG10(E/D) + 1.74D0))**2.0D0
ENDIF
2 log + 1,74
D ! IMPRESSO DOS RESULTADOS
WRITE(*,*) FATR
O fluxograma de deve ser seguido para este processo : END

Incio 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
Re, E, D para melhor visualizar o fluxo de informaes no programa, e til
principalmente quando o tamanho do cdigo grande.
Verdadeiro
Re < 2100 Calcular EQ1

Falso 7.3.1. Forma Antiga


Calcular EQ2 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
Tabela 7.2. Equivalncia entre os operadores relacionais no Fortran 90 (forma
Fim atual) e Fortran 77 (forma antiga)
Fortran 90 Fortran 77
Figura 7.4. Fluxograma lgico para clculo do fator de atrito == .EQ.
> .GT.
Segundo o fluxograma, aps a leitura do nmero de Reynolds (Re) feita uma >= .GE.
comparao para verificar o se Re menor do que 2100 (regio de < .LT.
escoamento laminar). Caso a condio for verdadeira, o fator de atrito <= .GE.
calculado usando a equao 1, caso contrrio o fator ser calculado usando a /= .NE.
equao 2. Posteriormente, o fator de atrito impresso.
O programa em Fortran para clculo do fator de atrito ser:
A forma usando palavras chaves tem cado em desuso e os novos compiladores
PROGRAM FATRITO tendem a no mais aceitar esta forma.
IMPLICIT REAL*8 (A-H,O-Z)
! LEITURA DAS VARIVEIS
READ(*,*) RE, E, D
7.4. Comparao em Conjunto
! CLCULO DO FATOR DE ATRITO
IF (RE < 2100.0D0) THEN
Algumas vezes, um processo s executado se duas ou mais condies
! RE < 2100 (ESCOAMENTO LAMINAR)
FATR = 64.0D0/RE forem verdadeira (caso E) ou se pelo menos uma das condies for verdadeira

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
39 40

(caso OU). No primeiro caso, o operador .AND. usado e no segundo caso, o que o mesmo ocorra. Um fluxograma lgico para o clculo da rea de troca
operador .OR. usado. trmica com predio de erros teria a estrutura:
A tabela 7.2. mostra quais sero os resultados finais das comparaes em
funo dos resultados das comparaes individuais. Incio 1

Sim
Tabela 7.2. Resultado das Comparaes Q, UC, DELTAT
IRR = 0 CD

Comparao Resultado No
Verdadeiro .AND. Verdadeiro Verdadeiro IRR = 0 "Erro no Clculo"
Verdadeiro .AND. Falso Falso
Falso .AND. Falso Falso UC =/ 0 e Sim
Calcula AC
DELTAT =/ 0
Verdadeiro .OR. Verdadeiro Verdadeiro
No
Verdadeiro .OR. Falso Verdadeiro Fim
Falso .OR. Falso Falso IRR = 1

.NOT. Verdadeiro Falso


.NOT. Falso Verdadeiro
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
Segundo o fluxograma, aps a leitura das variveis, uma varivel de controle
e 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
IF ((<comparao>).OR.(<comparao>)) THEN 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)
EXEMPLO 3 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
Um dos pontos que mais gera erro de execuo em programas a diviso por
valor diferente de zero, indicando a ocorrncia de um erro. Posteriormente,
zero. Um programa bem estruturado deve prevenir a ocorrncia de erros antes
uma nova comparao feita, verificando o valor da varivel de controle de
do erro ocorrer, alertando o usurio para o problema.
erro. Se o valor desta varivel for 0 (zero), a rea de troca trmica impressa,
O clculo da rea de troca trmica necessria em trocadores de calor dado
caso contrrio uma mensagem de erro apresentada.
pela equao:
O programa em Fortran para o clculo da rea de troca trmica ser:
Q
Ac = PROGRAM TROCTERM
Uc T IMPLICIT REAL*8 (A-H,O-Z)
! LEITURA DAS VARIVEIS
Ac rea de troca trmica READ(*,*) Q,UC,DELTAT
Q calor trocado
Uc coeficiente de troca trmica ! DEFINIO DA VARIVEL DE ERRO
T diferena de temperatura IRR = 0

! CLCULO DA REA DE TROCA TRMICA


No caso, uma diviso por zero pode ocorrer se Uc ou T forem iguais a zero. IF ((UC /= 0.0D0).AND.(DELTAT /= 0.0D0)) THEN
Um programa bem feito deve prever esta possibilidade e impedir o erro antes
AC = Q/(UC*DELTAT)

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
41 42

ELSE
! PODERIA OCORRER DIVISO POR ZERO No comando SELECT CASE, uma varivel comparada com vrios
IRR = 1 valores. Quando a comparao resultar em verdadeiro o processo relativo
ENDIF quela condio executado. Quando nenhuma comparao resultar em
verdadeiro, o processo relativo a condio CASE ELSE executado.
! IMPRESSO DOS RESULTADOS
IF (IRR == 0) THEN
Em termos de programao, a estrutura a seguinte:
WRITE(*,*) AC
ELSE SELECT CASE (<varivel>)
WRITE(*,*) ERRO NO CLCULO DIVISO POR ZERO CASE (a)
ENDIF PROCESSO 1
END CASE (b)
PROCESSO 2
:
CASE (n)
PROCESSO 3
7.5. Processo Decisrio por Faixa ou Classes CASE ELSE
PROCESSO 4
ndices podem ser usados para desviar a execuo do programa para END SELECT
diferentes processos, dependendo do valor deste ndice. Para esta forma de
processo decisrio usamos o comando SELECT CASE que tem a seguinte importante notar que o SELECT CASE s pode ser usado com
estrutura lgica: nmero inteiros. Tanto a varivel, quanto os valores de a, b, n devem ser
Incio
nmero inteiros.
Uma faixa de valores pode ser usada nos Cases, como por exemplo:
Verdadeiro
CASE (1:5) significa uma faixa de valores de 1 a 5.
comparao PROCESSO 1 A condio CASE ELSE opcional e pode ser omitida do comando
Falso
SELECT CASE.
Verdadeiro
comparao PROCESSO 2

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

PROCESSO 4 QK C
EQ1: q ADS = [eq. Langmuir]
1+ K C

n
Fim
EQ2: q ADS = K C [eq. Freundlich]

Figura 7.6. Fluxograma lgico do comando SELECT CASE.

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
43 44

QK p CASE (1) ! ISOTERMA DE LANGMUIR


EQ3: q ADS = [eq. BET]
(1+ K p + p / P ) (1 p / P ) READ(*,*) Q, C, AK
QADS = Q*C*AK/(1.0D0 + C*AK)
CASE (2) ! ISOTERMA DE FREUNDLICH
O fluxograma para a escolha da isoterma depende da escolha do tipo de READ(*,*) AK, C, AN
isoterma pelo usurio. Esta escolha armazenada em uma varivel de controle QADS = AK*C**(-AN)
(IDX) que ser usada na deciso para selecionar a equao que ser usada. CASE (3) ! ISOTERMA BET
READ(*,*) Q, AK, P, PTOT
Incio QADS = Q*P*AK/((1.0D0 + AK*P + P/PTOT)*(1.0D0 P/PTOT))
END SELECT
IDX
! IMPRESSO DO RESULTADO
WRITE(*,*) QADS
Verdadeiro END
IDX = 1 Q, C, AK

Falso
Calcula EQ1

Verdadeiro
EXERCCIOS
IDX = 2 AK, C, AN

Falso
Calcula EQ2
EXERCCIO 1
Verdadeiro Desenvolva um programa para calcular a perda de carga usando as frmulas de
IDX = 3 Q, AK, P, PTOT
Fair-Whipple-Hsiao.
Falso
Calcula EQ3
Q1,75
EQ1: PC = 0,00086 [para gua fria]
D 4,75
QADS

Q1,75
Fim
EQ2: PC = 0,0007 [para gua quente]
D 4,75
Figura 7.7. Fluxograma lgico para calculo da isoterma de adsoro
D dimetro do tubo
O programa em Fortran para clculo da isoterma ser: L comprimento do tubo
PC perda de carga
PROGRAM ISOTERMA
Q vazo de gua
IMPLICIT REAL*8 (A-H,O-Z)

! LEITURA DO TIPO DE ISOTERMA EXERCCIO 2


READ(*,*) IDX 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
! CLCULO DA ISOTERMA mensagem de erro indicando qual varivel apresentou o problema.
SELECT CASE (IDX)

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
45 46

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
EQ1: Pvap = PC exp
1 X
T
X = 1
TC

B
EQ2: Pvap = exp A
T + C

PC
EQ3: Pvap =
10 Z 3
Z1 = 5,808 + 4,93
36
Z2 = 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 ))
T
TR =
TC

A,B,C,D parmetros da equao


Pvap presso de vapor
PC presso crtica
TC temperatura crtica
TR temperatura relativa
fator acntrico

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
47 48

8. LOOPS DO <var> = x,y,z


:
PROCESSO
Loops so rotinas cclicas nas quais um processo executado por um :
nmero pr-determinado de vezes ou enquanto uma condio de permanncia ENDDO
no loop continue sendo satisfeita.
x valor inicial de <var>
y valor final de <var>
8.1. Loops Limitados z incremento em <var> a cada iterao

Um processo pode ser executado por um nmero limitado de vezes O passo de incremento da varivel de controle (<var>) pode ser maior
usando o comando DO..ENDDO. que 1 ou at mesmo negativo, porm deve ser um nmero inteiro. Caso o passo
Este comando tem a seguinte estrutura lgica: 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
Incio DO..ENDDO toma a forma:

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

EXEMPLO 1
<var> = <var> + z
Quando so produzidos, os polmeros apresentam uma distribuio de pesos
moleculares. A distribuio pode ser calculada pela funo:
Sim
r
W(r ) = ( + ) + ( + ) (r 1)
<var> < y

No 2 (1+ + )r
Fim
ktd ktm ktx [X ]
= + +
Figura 8.1. Fluxograma lgico do comando DO..ENDDO. kp [M] kp kp [M]

No comando DO..ENDDO, a varivel de controle (<var>) iniciada com ktc


=
kp [M]
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 kfm constante de transferncia para monmero
kfx constante de transferncia para CTA
controle seja maior que y.
kp constante de propagao
Em termos de programao, a estrutura : ktc constante de terminao por combinao
ktd constante de term. por desproporcionamento
r comprimento de cadeia

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
49 50

W frao de cadeias produzidas PROGRAM DPM


[M] concentrao de monmero IMPLICIT REAL*8 (A-H,K,O-Z)
CM concentrao de monmero (no programa)
[X] concentrao de CTA ! LEITURA DAS VARIVEIS
CX concentrao de CTA (no programa) READ(*,*) KP, KFM, KFX, KTC, KTD
READ(*,*) CM, CX
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 ! CLCULO DOS PARMETROS TAU E BETA
comprimento de cadeia do polmero. O fluxograma a ser seguido ser: TAU = KTD/(KP*CM) + KTM/KP + KTX*CX/(KP*CM)
BETA = KTC/(KP*CM)
Incio 1
! CLCULO DA DISTRIBUIO DE PESOS MOLECULARES
DO I = 1,100
KP, KFM, KFX, KTC, KTD R = I*1000.0D0
W = (TAU + BETA)*(TAU + BETA/2.0D0*(TAU + BETA)*(R 1.0D0))* &
R = I*DELTA
(R/(1.0D0 + TAU + BETA)**R)
CM,CX
WRITE(*,*) R,W
CALCULA W ENDDO
CALCULA TAU e BETA END
R, W
I=1
I=I+1 8.1.1. Forma Antiga
1
Sim No Fortran 77, os loops eram controlados pelo comando
I < 100 DO..CONTINUE, que tem como estrutura de programao:
No

Fim
DO <linha> <var> = x,y,z
:
PROCESSO
Figura 8.2. Fluxograma lgico para gerao de dados para a distribuio de :
pesos moleculares de polmeros. <linha> CONTINUE

Segundo o fluxograma, primeiramente os parmetros cinticos e as onde <linha> o nmero da identificao de linha onde o CONTINUE est
concentraes so lidas. Os parmetros e da equao so calculados e localizado
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
O loop do Exemplo 1 seria programado como:
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 DO 100 I = 1,100
R = I*1000.0D0
poder ser maior ou menor do que 1 dependendo do valor de DELTA. Calcula-
W=
se a frao de pesos moleculares (W) e R e W so impressos.
WRITE(*,*) R,W
100 CONTINUE
Em termos de programao, a estrutura a seguinte:
Esta forma de controle de loop caiu em desuso e no deve ser mais utilizada.

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
51 52

8.2. Loops por Deciso Esta equao pode ser rearranjada para:

1 2,5226
Os loops podem ocorrer enquanto uma condio continue sendo atendida, e=0= + 2 log + [eq. 2]
0,5
usando o comando DO WHILE. Este comando tem como estrutura lgica: f 3,7065 D Re f 0,5

f fator de atrito
Incio /D rugosidade relativa
Re nmero de Reynolds
Falso
comparao Fim
Analisando a equao tem-se que se chutarmos um valor inicial para f, se a
Verdadeiro
equao 2 for negativa, f estar superestimado, caso contrrio estar
PROCESSO 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
Figura 8.3. Fluxograma lgico do comando DO WHILE. 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.
No comando DO WHILE, o programa entra e continua em loop at que O fluxograma a ser seguido ser:
a condio responsvel pelo loop continue sendo atendida.
Em termos de programao, a estrutura :
Incio 1

DO WHILE (<comparao>) No
: Re, Rug ERRO > TOL F

PROCESSO Sim
: F1 = 0,1 F = (F1 + F2)/2 Fim
ENDDO F2 = 0,007

Calcula ERRO pela EQ2


TOL = 0,001
ERRO = 1,0
EXEMPLO 2 Sim
F1 = F
ERRO < 0
Sistemas de busca por mnimos e zeros de funes podem usar o esquema de 1 ERRO = - ERRO
loop por desio para determinar quando parar a busca do mnimo e/ou zero No
de funo. F2 = F
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.
Figura 8.4. Fluxograma lgico para clculo do fator de atrito.
1 2,5226
= 2 log + [eq. Colebrook]
0,5
f 3,7065 D Re f 0,5 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

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
53 54

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

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.
PROGRAM FATRITO Este tipo de loop tem estrutura lgica:
IMPLICIT REAL*8 (A-H,O-Z)

! LEITURA DAS VARIVEIS


Incio
READ(*,*) RE, RUG

! INICIALIZAO DAS VARIVEIS


F1 = 0.1D0
F2 = 0.007D0 PROCESSO
ERRO = 1.0D0
TOL = 0.001D0 Verdadeiro
comparao

! CLCULO DO FATOR DE ATRITO VIA MTODO DA BISSEO Falso


DO WHILE (ERRO > TOL) Fim
F = (F1 + F2)/2.0D0
ERRO = F**(-0.5D0) + 2.0D0*DLOG10(RUG/3.7065D0 & Figura 8.5. Fluxograma lgico do loop infinito.
+ 2.5226/(RE*F**0.5D0))
IF (ERRO < 0.0D0) THEN
F1 = F
ERRO = - ERRO Em termos de programao, a estrutura :
ELSE
F2 = F DO
ENDIF :
ENDDO PROCESSO
:
! IMPRESSO DOS RESULTADOS IF (<comparao>) EXIT
WRITE(*,*) F ENDDO
END

Note que no programa, a varivel ERRO inicializada com um valor maior do EXEMPLO 3
que TOL, de forma que o programa entre no loop. Se a varivel ERRO no Se o exemplo 2 for utilizado com um loop infinito, tem-se o seguinte
fosse inicializada, ou fosse inicializada com zero, o programa no entraria no fluxograma:
loop uma vez que a condio de entrada e permanncia no loop no seria
satisfeita.

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
55 56

Incio 1 DO
F = (F1 + F2)/2.0D0
ERRO = F**(-0.5D0) + 2.0D0*DLOG10(RUG/3.7065D0 &
Re, Rug No + 2.5226/(RE*F**0.5D0))
F = (F1 + F2)/2 IF (ERRO < 0.0D0) THEN
F1 = 0,1 F1 = F
F2 = 0,007
Calcula ERRO pela EQ2 ERRO = - ERRO
ELSE
TOL = 0,001
ERRO = 1,0 Sim
F1 = F
F2 = F
ERRO < 0
ERRO = - ERRO ENDIF
1 No IF (ERRO < TOL) EXIT
F2 = F ENDDO

! IMPRESSO DOS RESULTADOS


WRITE(*,*) F
Sim
ERRO < TOL F END
No
Fim
8.4. CYCLE
Figura 8.6. Fluxograma lgico para clculo do fator de atrito.
O comando CYCLE interrompe a execuo do restante do ciclo (loop),
Segundo o fluxograma, aps a leitura e inicializao das variveis, o algoritmo retornando a execuo do programa para o incio do loop. Este comando tem
entra no loop para clculo do fator de atrito. No loop, o fator de atrito como estrutura lgica:
calculado pelo mtodo de bisseo. O erro calculado e dependendo do valor Incio
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 <var> = x
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. PROCESSO 1

Em termos de programao, a estrutura a seguinte: Verdadeiro


<var> < y

PROGRAM FATRITO2 Falso

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

! LEITURA DAS VARIVEIS


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

! INICIALIZAO DAS VARIVEIS


Sim
F1 = 0.1D0 <var> < y
F2 = 0.007D0 No
TOL = 0.001D0
Fim

! CLCULO DO FATOR DE ATRITO VIA MTODO DA BISSEO Figura 8.7. Fluxograma lgico de um loop usando o comando CYCLE.

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
57 58

Segundo a estrutura lgia do comando CYCLE, aps a execuo do EXERCCIO 2


PROCESSO 1, uma comparao feita e se esta condio for satisfeita a Desenvolva um algoritmo e programa para gerar pontos para o grfico de
varivel de controle <var> incrementada e a execuo do programa volta para performance de um sedimentador, obtendo pontos de 50 em 50 unidades da
o incio do loop. Caso a condio no seja satisfeita, o PROCESSO 2 varivel X. Sendo que o fim da gerao de dados para o grfico for quando o
executado. valor do fluxo de sedimentao (G) for 1000 vezes menor do que o valor
Em termos de programao, a estrutura : mximo da funo (Gmax).
A equao do sedimentador dada pela equao:
DO <var> = x,y,z
G = X 10 ( A X + B)
:
PROCESSO 1
:
IF (<comparao>) CYCLE onde A = -0.0142
: B = 0.370
PROCESSO 2
: G fluxo de sedimentao
ENDDO X 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* dimetro de corte (constante)
E distribuio acumulada do tamanho de
partculas
n parmetro da equao
X dimetro da partcula (varivel)

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


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

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
59 60

v forma individual
9. VETORES E MATRIZES A(2) = 10 atribui o valor 10 ao campo 2

v por faixa
Em Fortran, os vetores e matrizes comeam a ser contados a partir da
A(2:5) = 10 atribui o valor 10 aos campos 2 at 5, ou seja,
posio 1.
A(2) = A(3) = A(4) = A(5) = 10
B(1:3,3:4) = 10 atribui o valor 10 aos campos
Um vetor com 5 posies tem forma:
B(1,3) B(2,3) B(3,3)
1 2 3 4 5
B(1,4) B(2,4) B(3,4)
Uma matriz 3x5 tem forma: v total
1,1 1,2 1,3 1,4 1,5 A = 10 atribui o valor 10 a todos os campos da varivel A,
2,1 2,2 2,3 2,4 2,5 ou seja, A(1) = A(2) = ... = A(n) = 10
3,1 3,2 3,3 3,4 3,5

9.4. Operaes com Vetores e Matrizes


9.1. Tipos de Vetores e Matrizes
Vetores e matrizes podem ser somados, subtrados, multiplicados e
Todos os tipos de variveis podem ser usados como vetores ou matrizes. divididos entre si, desde que sejam de mesmo tamanho:
Portanto podemos ter os tipos: INTEGER, REAL, REAL*8, COMPLEX.
REAL A(10), B(10), C(10)
A=B o mesmo que fazer A(1) = B(1),
9.2. Declarao de Vetores A(2) = B(2), etc...
A=B+C o mesmo que fazer A(1) = B(1) + C(1),
Os vetores ou matrizes podem ser declarados de duas formas: atravs das A(2) = B(2) + C(2), etc...
palavras chave de declarao de tipos de variveis, ou atravs do comando
DIMENSION. Quando os vetores ou matrizes forem e tamanhos diferentes, uma faixa
comum poder ser somada ou subtrada:
v Atravs de declarao de tipo
REAL*8 A(10) vetor com 10 campos REAL A(10), B(5), C(20)
REAL*8 B(3,5) matriz 3x5 A(1:5) = B(1:5) o mesmo que fazer A(1) = B(1),
A(2) = B(2), at A(5) = B(5).
v Atravs do comando DIMENSION A(3:5) = B(3:5) + C(3:5) o mesmo que fazer A(3) = B(3) + C(3),
IMPLICIT REAL*8 (A-H,O-Z) A(4) = B(4) + C(4) e A(5) = B(5) + C(5)
DIMENSION A(10), B(3,5)
Se a faixa for diferente ou maior do que o tamanho do vetor ou matriz,
ocorrer um erro na execuo do programa:
9.3. Atribuio de Valores
REAL A(10), B(5), C(20)
Valores podem ser atribudos aos vetores e matrizes de forma individual, A(1:3) = B(3:5) faixas diferentes
por faixa e total. A(1:10) = B(1:10) + C(1:10) B no tem 10 campos

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
61 62

Os vetores e matrizes tambm podem ser somados, subtrados, divididos 9.6. Loops com Vetores e Matrizes
e multiplicados por nmero escalares:
Os loops podem ser usados com vetores e matrizes da mesma forma
REAL A(5), B(5)
como foi abordado no Captulo 8. A diferena que os loops podem ser usados
A=B+5 o mesmo que fazer A(1) = B(1) + 5,
para controlar o campo corrente do vetor ou matriz que ser usado em algum
A(2) = B(2) + 5, etc...
processo ou calculo.
A(1:3) = 2*B(1:3) o mesmo que fazer A(1) = 2*B(1),
A(2) = 2*B(2), A(3) = 2*B(3)
EXEMPLO 1
Um uso simples dos loops com vetores e matrizes pode ser para controlar o
Os campos individuais, por sua vez, podem sofrer qualquer tipo de campo do vetor ou matriz que ser usado em algum clculo.
operao:
DO I = 1,10
A(1) = B(3) + 2 A(I) = B(I,2)*C(I)
A(2) = B(3)*C(5)*3 + C(1) SUM = SUM + C(I)
D(1,3) = E(1,3) + F(2,7) ENDDO

9.5. Funes Intrnsecas EXEMPLO 2


Quando se trabalha com anlise estatstica de dados experimentais, comum
O Fortran possui um conjunto de funes matemticas para clculo com 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
matrizes. As principais funes esto listadas abaixo.
fluxograma:
DOT_PRODUCT(A,B) calcula o produto vetorial entre A e B Incio 1 2
A e B so dois vetores numricos de igual
tamanho
N I=1 I=1

MATMUL (A,B) calcula o produto matricial entre A e B I=1 MEDIA = MEDIA + X(I) DP = DP + (X(I) - MEDIA)**2
A e B so duas matrizes numricas
se A tem tamanho (n,m) e B tem tamanho X(I) I=I+1 I=I+1
(m,k), a matriz resultante ter tamanho (n,k)
I=I+1 Sim Sim
I<N I<N
MAXVAL (A) retorna o maior valor do vetor A No No
Sim
A um vetor numrico I<N
MEDIA = MEDIA / N DP = (DP/(N-1))**0.5
No
MINVAL (A) retorna o menor valor do vetor A 1 2 MEDIA, DP
A um vetor numrico
Fim
SUM(A) calcula o somatrio dos valor do vetor A
A um vetor numrico Figura 9.1. Fluxograma para clculo da mdia e desvio padro de um conjunto
de dados

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
63 64

O programa para em Fortran para realizar o clculo teria a forma: O fluxograma a ser seguido tem a seguinte estrutura:

PROGRAM ESTAT Incio


IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION X(10)
I=1

! LEITURA DE VARIVEIS
WRITE(*,*) NUMERO DE DADOS A SEREM LIDOS: (MAXIMO = 10)
READ(*,*) N
Sim
WRITE(*,*) ENTRE COM OS DADOS DO CONJUNTO THETA(I) >TMAX(I) THETA(I) = TMAX(I)
DO I = 1,N No
READ(*,*) X(I)
ENDDO
Sim
THETA(I) <TMIN(I) THETA(I) = TMIN(I)
! CALCULO DA MDIA
DO I = 1,N No
MEDIA = MEDIA + X(I)
ENDDO
MEDIA = MEDIA/N I=I+1

! CALCULO DO DESVIO PADRO Sim


I < NPARAM
DO I = 1,N
DP = DP + (X(I) MEDIA)**2.0D0 No

ENDDO Fim
DP = (DP/(N 1.0D0))**0.5D0
Figura 9.2. Fluxograma lgico para controle de parmetros.
! IMPRESSO DOS RESULTADOS
WRITE(*,*) MEDIA = , MEDIA Segundo o fluxograma, primeiramente o valor de THETA(I) comparado com
WRITE(*,*) DESVIO PADRAO = , DP TMAX(I), recebendo seu valor se THETA(I) for maior do que TMAX(I).
END 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).
9.7. Processos Decisrios com Vetores e Matrizes Em termos de programao, a estrutura :

DO I = 1,NPARAM
Assim como para variveis escalares, os campos individuais dos vetores e IF (THETA(I) > TMAX(I)) THETA(I) = TMAX(I)
matrizes podem ser usados pelos comandos IF..THEN..ELSE e SELECT IF (THETA(I) < TMIN(I)) THETA(I) = TMIN(I)
CASE. ENDDO

EXEMPLO 3 Como apresentado no exemplo, o processo decisrio usa os valores


Em processos de estimativa de parmetros, os valores dos parmetros podem individuais dos campos do vetor e geralmente a ao tambm afeta somente os
ser armazenados em vetores e estes valores podem estar sujeitos a limites valores individuais do vetor ou matriz. Isto ocorre com os comando
superiores e inferiores. IF..THEN..ELSE e SELECT CASE.
No caso, os valores dos parmetros esto armazenados no vetor THETA, os
limites superiores no vetor TMAX e os limites inferiores no vetor TMIN.

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
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. Caso o PROCESSO consista de somente uma linha de comando, o
Este comando tem a seguinte estrutura lgica: comando WHERE pode ser escrito como:
Incio
WHERE (<comparao>) PROCESSO
I=1
O comando WHERE equivalente ao uso de um comando DO..ENDDO
com a comparao sendo feita por um comando IF..THEN..ELSE:

Verdadeiro DO I = 1,N
comparao PROCESSO 1
IF (<comparao>) THEN
Falso :
PROCESSO 2 PROCESSO 1
:
ELSE
:
I=I+1
PROCESSO 2
:
Sim ENDIF
I<n ENDDO
No

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

Figura 9.3. Fluxograma lgico do comando WHERE. No fluxograma, n o EXEMPLO 4


nmero de campos no vetor ou matriz. 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
O comando WHERE tem uma lgica parecida com a do comando pode ser usado para executar a diviso somente quando o valor divisor for
IF..THEN..ELSE. A diferena que a comparao afeta todos os campos do zero.
vetor ou matriz e no somente um nico campo (como ocorreria com o Em termos de programao, a estrutura :
IF..THEN..ELSE).
Em termos de programao, a estrutura : PROGRAM DIVVET
IMPLICIT REAL*8 (A-H,O-Z)
WHERE (<comparao>) DIMENSION A(5), B(5), C(5)
:
PROCESSO 1 ! LEITURA DAS VARIVEIS
: DO I = 1,5
ELSEWHERE READ(*,*) A(I), B(I)
: ENDDO
PROCESSO 2
: ! CLCULO DA DIVISO
ENDWHERE C = 0.0D0
WHERE (A /= 0.0D0) C = B/A

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
67 68

! IMPRESSO DOS RESULTADOS Em termos de programao, a estrutura :


DO I = 1,5
WRITE(*,*) I, C(I) FORALL (I = x:y, J = w:z)
ENDDO :
END PROCESSO
:
Se A e B fossem: END FORALL
B 20 5 12 18 5
A 2 0 2 3 -1
O resultado da diviso seria:
C 10 0 6 6 -5
EXERCCIOS
No caso, a diviso de B(2) com A(2) no ocorreria e C(2) permaneceria com o
seu valor inicial. EXERCCIO 1
Muitos programas para engenharia envolvem a normalizao de parte dos dados
de entrada, como por exemplo, programas para redes neurais. Desenvolva um
9.7.2. FORALL programa para normalizar um conjunto de dados. A normalizao feita usando
a frmula:
O comando FORALL funciona como um loop DO..ENDDO, porm
pode ser usado com mais de uma varivel de controle, sendo til com operaes X X MIN
X NORM =
com matrizes. Este comando tem a seguinte estrutura lgica: X MAX X MIN
Incio

X dado original
I=1 XMAX maior valor do conjunto de dados
XMIN menor valor do conjunto de dados
J=1 XNORM dado normalizado

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

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

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
69 70

Estes tipos de arquivo usados pelo Fortran so arquivos texto simples e


10. ARQUIVOS DE DADOS 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.
As operaes com arquivos no Fortran, em geral, so simples
necessitando da abertura do arquivo, gravao ou leitura dos dados e o
EXEMPLO 1
fechamento do arquivo.
Para abrir o arquivo DATA01.DAT que contm dois nmeros reais, calcular o
Quando trabalhando com arquivos, deve-se ter em mente que o tempo de produto destes dois nmero e gravar o resultado no arquivo RES01.DAT,
leitura e gravao em arquivos uma operao relativamente lenta se podemos usar o seguinte programa em Fortran:
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 PROGRAM PRODUTO
arquivo de uma s vez, armazenando os dados em variveis. IMPLICIT REAL*8 (A-H,O-Z)
! ABERTURA DE ARQUIVOS
OPEN (2,FILE = DATA01.DAT)
OPEN (3,FILE = RES01.DAT)
10.1. Operaes com Arquivos ! LEITURA DAS VARIVEIS
READ(2,*) A, B
Arquivos so abertos usando o comando OPEN que tem forma:
! CLCULO
OPEN (<unit>, FILE = <arquivo>) C = A*B

<unit> unidade de referncia para o arquivo ! IMPRESSO DO RESULTADO


pode ser qualquer nmero inteiro WRITE(3,*) C

CLOSE(2)
<arquivo> nome do arquivo a ser criado ou aberto. CLOSE(3)
o nome do arquivo deve vir entre aspas. END

Para escrever dados no arquivo deve-se usar o comando WRITE usando


a unidade do arquivo:
10.2. Arquivos de Dados Leitura
WRITE (<unit> , <formato>) <variveis>

Para ler o arquivo de dados deve-se usar o comando READ, tambm Deve-se tomar o devido cuidado para ler corretamente os dados do
usando a unidade do arquivo: 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
READ (<unit> , <formato>) <variveis> alguma varivel).
O comando READ l uma linha de arquivo por vez. Portanto se um
Antes do programa acabar deve-se fechar o arquivo de dados usando o arquivo com trs linha de dados tiver que ser lido, sero necessrios 3 comandos
comando CLOSE: 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.
CLOSE (<unit>) Em cada linha de dados, cada valor dever ser separado por um espao ou
tabulaes.

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
71 72

EXEMPLO 2 DIMENSION A(1000)


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. ! LEITURA DOS DADOS
Uma linha do arquivo pode conter as dimenses do reator: altura e dimetro; OPEN(2, FILE = DADOS.TXT)
uma segunda linha pode conter os parmetros cinticos da reao: k N=0
(constante cintica) e Ea (energia de ativao) e uma terceira linha pode conter DO WHILE(.NOT.EOF(2))
as condies operacionais iniciais do reator e reagentes: temperatura, N=N+1
concentrao de reagente A e concentrao de reagente B, como mostrado READ(*,*) A(I)
abaixo: ENDDO
END
2.58 0.54
510.0 30100.5
342.5 0.015 9.3D-2
10.3. Arquivos de Dados Impresso
Um programa para ler estes dados do arquivo REAT.DAT seria:

PROGRAM LEARQ Podemos escrever dados em um arquivo usando o comando WRITE


IMPLICIT REAL*8 (A-H,O-Z) podendo escolher entre escrever os valores com ou sem formato especfico.
OPEN(2, FILES = REAT.DAT) Caso os dados sejam gravados sem especificar um formato, sero
READ(2,*) H,D gravados de dois a trs valores por linha. Se mais de 3 variveis forem escritas
READ(2,*) AK, EA por WRITE, esta impresso ocupar mais de uma linha, o que pode
READ(2,*) TEMP, CA, CB comprometer posteriormente o entendimento da sequncia dos dados que forem
END 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
10.2.1. EOF 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

EOF(<unit>) EXERCCIO 1
Desenvolva um programa que leia o arquivo DATA01.TXT abaixo:
onde <unit> a unidade do arquivo sendo lido.
8.12D0
0.15D0
EXEMPLO 3 4.88D3
Se o arquivo DADOS.TXT que contm duas colunas de nmeros reais, porm 1030.4D0
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. 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
PROGRAM READDATA quatro valores contidos no arquivo de leitura.
IMPLICIT REAL*8 (A-H,O-Z)

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
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:

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

Ea
k = A exp
R T

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

C A0 C A
Converso de tolueno: XA =
C A0

XA converso

O arquivo de entrada contm as condies operacionais iniciais, os parmetros


cinticos da reao (A e Ea) e a constante dos gases, na seguinte sequncia:

CA0 T
A Ea
R

Com os seguintes dados:

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

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
73 74

11. ORGANIZAO DE PROGRAMAS EXTENSOS MODULE GLOBAL


REAL*8 DENS, VISC, COND
REAL*8 TEMP, PRES
Conforme a complexidade de um programa aumenta, o programa REAL*8 CONCA, CONCB
necessita tambm de uma organizao mais complexa, visando uma melhor INTEGER NPARAM
organizao do cdigo e o compartilhamento de cdigos comuns a vrias etapas END MODULE
do algoritmo.
Desta forma podemos dividir o programa em um mdulo de declarao
de variveis globais, programa principal, subrotinas e funes: 11.2. Programa Principal

Declarao de Variveis Globais Um programa Fortran deve ter um programa principal em sua estrutura,
sendo ele tem a forma:
Programa Principal
PROGRAM <nome>
:
Subrotinas 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 programa principal controla todo o algoritmo que ser seguido pelo
programa, como declarao e inicializao de variveis, leitura de dados,
O mdulo de variveis globais deve conter as variveis que sero
chamada de subrotinas e impresso dos resultados.
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: 11.2.1. Use

MODULE <nome>
As variveis globais definidas no mdulo de variveis podero ser
: acessveis ao programa principal e s subrotinas e funes atravs do comando
VARIVEIS USE.
:
END MODULE PROGRAM <nome>
IMPLICIT REAL*8 (A-H,O-Z)
USE <modulo>
EXEMPLO 1 :
Um mdulo de variveis pode ser criado para resolver problemas de clculo de END
reatores. Este tipo de problema geralmente necessita ser integrado e os dados
relativos ao processo deve ser compartilhados entre o programa principal e a O comando USE deve vir sempre depois da declarao de variveis do
subrotina de integrao numrica. programa principal ou subrotina.

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
75 76

11.3. Subrotinas WRITE(*,*) C


END
As subrotinas so subprogramas que executam procedimentos SUBROUTINE PRODUTO (A,B,C)
especficos. Uma subrotina pode ser chamada em vrios pontos do programa de IMPLICIT REAL*8 (A-H,O-Z)
forma que ajuda a evitar a duplicao do mesmo cdigo em pontos diferentes do C = A*B
programa. END SUBROUTINE

SUBROUTINE <nome> (<variveis>)


: EXEMPLO 2
PROCESSO Se o mesmo exemplo fosse utilizado para multiplicar os campos de dois
: vetores, teramos:
END SUBROUTINE
PROGRAM PROD2
onde <nome> o nome que identifica a subrotina. Deve-se ter o cuidado de no IMPLICIT REAL*8 (A-H,O-Z)
especificar nenhuma varivel no programa contendo o mesmo nome da DIMENSION A(10), B(10), C(10)
subrotina. DO I = 1,10
READ(*,*) A(I), B(I)
<variveis> a lista de variveis que so passadas do programa principal ENDDO
CALL PRODUTO (A,B,C)
ou outra subrotina para esta subrotina.
END

SUBROUTINE PRODUTO (A,B,C)


11.3.1. Call IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION A(10), B(10), C(10)
As subrotinas so chamadas atravs do comando CALL, que tem a DO I = 1,10
forma: C(I) = A(I)*B(I)
ENDDO
CALL <nome da subrotina> (<variveis>) END SUBROUTINE

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

EXEMPLO 1 PROGRAM PROD3


Um exemplo simples para ilustrar aplicao de subrotinas a criao de uma IMPLICIT REAL*8 (A-H,O-Z)
subrotina para calcular o produto entre dois nmeros reais. DIMENSION A(10), B(10), C(10)
N = 10
PROGRAM PROD1 DO I = 1,N
IMPLICIT REAL*8 (A-H,O-Z) READ(*,*) A(I), B(I)
READ(*,*) A,B ENDDO
! CHAMADA DA SUBROTINA: CALL PRODUTO (N,A,B,C)
CALL PRODUTO (A,B,C) END

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
77 78

Neste caso, as variveis do programa principal e da subrotina devem ter o


SUBROUTINE PRODUTO (N,V1,V2,V3) mesmo nome (A,B,C) pois estas duas partes do programa utilizam-se das
IMPLICIT REAL*8 (A-H,O-Z) variveis definidas no modulo GLOBAL.
DIMENSION V1(N), V2(N), V3(N) Esta forma de passar variveis muito til quando subrotinas de mtodos
DO I = 1,N
nmeros so usadas (veja no Captulo 12).
V3(I) = V1(I)*V2(I)
ENDDO
END SUBROUTINE
11.4. Funes
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 As funes so subprogramas que executam procedimentos especficos e
vetor. retornam um valor nico. Uma funo pode ser chamada em vrios pontos do
Note tambm que as variveis declaradas na subrotina (V1,V2,V3) podem ter programa de forma que ajuda a evitar a duplicao do mesmo cdigo em pontos
nomes diferentes do que as variveis que so passadas pelo programa principal diferentes do programa.
(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 <tipo> FUNCTION <nome> (<variveis>)
recebe o valor de V1, B recebe o valor de V2 e C recebe o valor de V3. :
PROCESSO
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 END FUNCTION
de variveis globais:
onde <nome> o nome que identifica a subrotina.
MODULE GLOBAL
INTEGER N <variveis> a lista de variveis que so passadas do programa principal
REAL*8 A(10), B(10), C(10) ou outra subrotina para esta subrotina.
END MODULE
<tipo> o tipo de valor que ser retornado pela funo: REAL, REAL*8,
PROGRAM PROD4 INTEGER, COMPLEX ou CHARACTER.
USE GLOBAL
IMPLICIT REAL*8 (A-H,O-Z)
DO I = 1,N
11.4.1. Chamando Funes
READ(*,*) A(I), B(I)
ENDDO
CALL PRODUTO As funes so chamadas da seguinte forma:
END
<var> = <nome da funo> (<variveis>)
SUBROUTINE PRODUTO ( )
USE GLOBAL onde <nome da funo> o nome que identifica a funo
IMPLICIT REAL*8 (A-H,O-Z)
DO I = 1,N <variveis> a lista de variveis que so passadas para a funo que est
C(I) = A(I)*B(I) sendo chamada.
ENDDO
END SUBROUTINE
<var> a varivel que ir receber o valor retornado pela funo

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
79 80

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.

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
81 82

MODULE GLOBAL
12. MTODOS MATEMTICOS :
VARIVEIS
:
A resoluo de modelos matemticos de engenharia recai na utilizao de END MODULE
mtodos numricos, como integrao numrica, regresso, obteno de razes
de funes, estimativa de parmetros, entre outros.
Durante muito anos, vrios pesquisadores e empresas desenvolveram Programa Principal e Chamada da Subrotina Numrica
subrotinas para resoluo de mtodos numricos. Portanto, atualmente, cabe ao
profissional fazer uso destas subrotinas prontas, dedicando maior ateno ao O programa principal deve conter a leitura e/ou inicializao das
sistema a ser resolvido do que programao de mtodos numricos. 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
12.1. Organizao Geral do Programa subrotina do modelo deve ser declarada no comando EXTERNAL:

Quando bibliotecas numricas ou subrotinas numricas so utilizadas, a PROGRAM <nome>


USE <biblioteca>
estrutura do programa segue uma forma semelhante estrutura do programa
USE GLOBAL
apresentada no Captulo 11. EXTERNAL <subrotina do modelo>
Sendo assim devemos dividir o programa em um mdulo de declarao :
de variveis globais, programa principal, subrotinas numrica e subrotina que INICIALIZAES
conter o modelo matemtico a ser resolvido: :
CALL <subrotina numrica>
Declarao de Variveis Globais :
END

Programa Principal
onde <nome> o nome que identifica o programa.
<biblioteca> o nome da biblioteca numrica usada. Este comando
Subrotina Numrica Subrotina do Modelo Matemtico usado somente se o cdigo da subrotina com o mtodo numrico
for intrnseco biblioteca numrica. O comando no deve ser
Quando usamos uma subrotina numrica, esta subrotina chamada pelo usado se o cdigo da subrotina numrica for inserido ao programa.
programa principal, que por sua vez chama a subrotina do modelo matemtico. <subrotina do modelo> o nome da subrotina que contm o modelo
matemtico.
<subrotina numrica> o nome da subrotina do mtodo numrico e os
Mdulo de Variveis Globais parmetros a serem passados para esta subrotina

O mdulo de variveis globais muito til quando se utiliza bibliotecas


numricas, pois a forma mais fcil e eficiente de passar os valores das Subrotina do Modelo Matemtico
variveis entre o programa principal e a subrotina que contm o modelo
matemtico. A subrotina do modelo matemtico deve conter as equaes que
A programao do mdulo tem estrutura: descrevem o modelo e clculos auxiliares necessrio para o clculo das
equaes do modelo.

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
83 84

12.1.2. Usando Bibliotecas Numricas IMSL


SUBROUTINE <nome> (<variveis>)
: A biblioteca numrica IMSL uma das bibliotecas mais usadas pois
EQUAES DO MODELO MATEMTICO acompanha os compiladores Fortran: Compaq Fortran e Intel Fortran; e vem
: como opcionais em vrios outros compiladores.
END SUBROUTINE
A estrutura geral de um programa que use alguma subrotina numrica do
IMSL :
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. MODULE GLOBAL
<variveis> a lista de variveis que so passadas do programa principal ! DECLARAO DAS VARIVEIS GLOBAIS
ou outra subrotina para esta subrotina. INTEGER <variveis>
REAL*8 <variveis>
END MODULE

! PROGRAMA PRINCIPAL
12.1.1. Bibliotecas Numricas PROGRAM <nome>
USE IMSL ! USA SUBROTINAS NUMRICAS DO IMSL
As bibliotecas numricas so um conjunto de subrotinas contendo vrios USE GLOBAL ! USA VARIVEIS GLOBAIS
IMPLICIT REAL*8(A-H,O-Z)
tipos de mtodos numricos. Estas bibliotecas podem vir na forma de mdulos EXTERNAL <subrotina do modelo> ! SUBROTINA DO MODELO
ou na forma de cdigos individuais.
Quando a biblioteca est na forma de mdulo, no possvel visualizar o ! INICIALIZAO DAS VARIVEIS DO MODELO
cdigo da subrotina, e para usar uma subrotina em especfico deve-se declarar o <varivel> = <valor>
uso do mdulo (usando o comando USE) e depois chamar a subrotina usando o ! INICIALIZAO DOS PARMETROS DA SUBROTINA
comando CALL. <parmetros> = <valor>
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 ! CHAMA A SUBROTINA DO MTODO NUMRICO
o projeto sendo desenvolvido. Neste caso no se utiliza o comando USE para CALL <subrotina do mtodo numrico>
declarar o uso da biblioteca. Somente necessrio chamar a subrotina. ! IMPRIME OS RESULTADOS PARCIAIS
WRITE <variveis>
Bibliotecas na forma de mdulo: END
IMSL (acompanha vrios compiladores Fortran)
! SUBROTINA QUE CONTM O MODELO MATEMTICO
NAG
SUBROUTINE <subrotina do modelo>
USE GLOBAL ! USA VARIVEIS GLOBAIS
Bibliotecas na forma de cdigo: IMPLICIT REAL*8(A-H,O-Z)
Numerical Recipes (pode ser lido em www.nr.com)
Outras ! EQUAES DO MODELO
<equaes>

END SUBROUTINE

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
85 86

12.1.3. Usando Bibliotecas Numricas Outras 12.2. Funo de Zero

Quando bibliotecas numricas que vem na forma de cdigo so usadas, o Grande parte das equaes que descrevem fenmenos qumicos, fsicos e
cdigo desta subrotina deve ser copiado para o final do programa. A estrutura biolgicos so equaes no lineares, e portanto a resoluo deste tipo de
geral de um programa que use este tipo de subrotina numrica : equaes parte integrante dos problemas de engenharia.
Diferentemente das equaes lineares em que possvel achar uma
MODULE GLOBAL
! DECLARAO DAS VARIVEIS GLOBAIS soluo algbrica, nem sempre possvel obter uma soluo algbrica para
INTEGER <variveis> equaes no-lineares. Em geral de interesse resolver f(x) = 0 e portanto deve-
REAL*8 <variveis> se achar as razes da equao. Os principais mtodos para obteno das raizes
END MODULE da equao so: mtodo da bisseo, mtodo da secante, mtodo de Newton ou
mtodos que combinem as caractersticas de dois deste mtodos.
! PROGRAMA PRINCIPAL
PROGRAM <nome> Uma das principais subrotinas numricas para o clculo das razes de uma
USE GLOBAL ! USA VARIVEIS GLOBAIS equao (FZERO) utiliza de um misto do mtodo da bisseo com o mtodo da
IMPLICIT REAL*8(A-H,O-Z) secante, aliando a certeza de resposta da primeira com a rapidez da segunda.
EXTERNAL <subrotina do modelo> ! SUBROTINA DO MODELO

! INICIALIZAO DAS VARIVEIS DO MODELO


<varivel> = <valor> 12.2.1. Usando IMSL
! INICIALIZAO DOS PARMETROS DA SUBROTINA A subrotina mais comum para obteno de razes do IMSL a DZREAL.
<parmetros> = <valor>
A chamada desta subrotina tem a seguinte estrutura:
! CHAMA A SUBROTINA DO MTODO NUMRICO
CALL <subrotina do mtodo numrico> DZREAL (<modelo>,ATOL,RTOL,EPS,ETA,NRAIZ,ITMAX,XGUESS,X,INFO)

! IMPRIME OS RESULTADOS PARCIAIS onde <modelo> nome da funo que contm a equao.
WRITE <variveis>
END
ATOL erro absoluto (primeiro critrio de parada)
RTOL erro relativo (segundo critrio de parada)
! SUBROTINA QUE CONTM O MODELO MATEMTICO EPS distncia mnima entre os zeros da funo
SUBROUTINE <subrotina do modelo> ETA critrio de distanciamento. Se a distncia entre dois zeros da
USE GLOBAL ! USA VARIVEIS GLOBAIS funo for menor do que a distncia mnima definida em
IMPLICIT REAL*8(A-H,O-Z)
EPS, ento um novo chute dado a uma distncia: ltima
! EQUAES DO MODELO raiz encontrada + ETA.
<equaes> NRAIZ nmero de razes que devem ser obtidas
ITMAX nmero mximo de iteraes
END SUBROUTINE
XGUESS vetor que deve conter os chutes iniciais dos valores das
! SUBROTINA QUE CONTM O MTODO NUMRICO razes (tamanho do vetor = NRAIZ)
! A SUBROTINA DEVE SER COPIADA NESTE PONTO DO PROGRAMA X vetor que conter as razes da funo (tamanho do vetor =
! NO DEVE-SE FAZER NENHUMA ALTERAO NESTA SUBROTINA NRAIZ)
SUBROUTINE <subrotina do mtodo numrico> INFO vetor que conter o nmero de iteraes necessrias para
<cdigo da subrotina>
END SUBROUTINE obter as razes (tamanho do vetor = NRAIZ)

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
87 88

Funo da Equao Matemtica EPS = 1.0D-5


ETA = 1.0D-2
ATOL = 1.0D-5
A funo que contm o equao matemtica que se deseja obter as razes RTOL = 1.0D-5
tem a seguinte estrutura: ITMAX = 1000

REAL*8 FUNCTION <modelo> (X) ! CHAMA A SUBROTINA DE OBTENO DAS RAIZES


CALL DZREAL(<modelo>,ATOL,RTOL,EPS,ETA,NRAIZ,ITMAX,XGUESS,X,INFO)
onde X valor do ponto em que a funo esta sendo avaliada. ! IMPRIME AS RAIZES
WRITE <X>
END
EXEMPLO 1
Considerando que se deseja obter as razes da equao: ! FUNO QUE CONTM A EQUAO
REAL*8 FUNCTION <modelo> (X)
2
f( X ) = X + 2 X 6 USE GLOBAL
IMPLICIT REAL*8(A-H,O-Z)
A equao que ser programada ser a seguinte:
! EQUAO
<modelo> = X**2 + 2*X -6 <modelo> = <equaes>

END FUNCTION

Estrutura Geral do Programa


EXEMPLO 2
A estrutura geral de um programa de integrao usando a DZREAL tem
Se desejarmos obter as duas razes da equao apresentada no Exemplo 1,
a forma: devemos utilizar o seguinte programa:
MODULE GLOBAL ! PROGRAMA PRINCIPAL
! DECLARAO DAS VARIVEIS GLOBAIS PROGRAM RAIZES01
INTEGER <variveis> USE IMSL ! USA SUBROTINAS NUMRICAS DO IMSL
REAL*8 <variveis> IMPLICIT REAL*8(A-H,O-Z)
END MODULE DIMENSION XGUESS(2), X(2), INFO(2)
EXTERNAL FCN ! FUNO DO MODELO
! PROGRAMA PRINCIPAL
PROGRAM <nome> ! INICIALIZAO DAS VARIVEIS DO MODELO
USE IMSL ! USA SUBROTINAS NUMRICAS DO IMSL NRAIZ = 2 ! DEFINE O NMERO DE RAIZES PROCURADAS
USE GLOBAL ! USA VARIVEIS GLOBAIS
IMPLICIT REAL*8(A-H,O-Z) ! DEFINIO DOS CHUTES INICIAS PARA AS RAZES
DIMENSION XGUESS(<nraiz>), X(<nraiz>), INFO(<nraiz>) ! DEVEM SER DEFINIDOS nraiz CHUTES
EXTERNAL <modelo> ! FUNO DO MODELO XGUESS(1) = 4.5D0
XGUESS(2) = -100.0D0
! INICIALIZAO DAS VARIVEIS DO MODELO
NRAIZ = <nraiz> ! DEFINE O NMERO DE RAIZES PROCURADAS ! INICIALIZAO DOS PARMETROS DA SUBROTINA
<varivel> = <valor> EPS = 1.0D-5
ETA = 1.0D-2
! DEFINIO DOS CHUTES INICIAS PARA AS RAZES ATOL = 1.0D-5
! DEVEM SER DEFINIDOS nraiz CHUTES RTOL = 1.0D-5
XGUESS(<campo>) = <valor> ITMAX = 1000
! INICIALIZAO DOS PARMETROS DA SUBROTINA

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
89 90
! CHAMA A SUBROTINA DE OBTENO DAS RAIZES Funo da Equao Matemtica
CALL DZREAL(FCN,ATOL,RTOL,EPS,ETA,NRAIZ,ITMAX,XGUESS,X,INFO)

! IMPRIME AS RAIZES A funo que contm o equao matemtica que se deseja obter as razes
WRITE(*,*) X(1), X(2) tem a seguinte estrutura:
END
REAL*8 FUNCTION <modelo> (X)
! FUNO QUE CONTM A EQUAO
REAL*8 FUNCTION FCN(X)
IMPLICIT REAL*8(A-H,O-Z) onde X valor do ponto em que a funo esta sendo avaliada.
! EQUAO
FCN = X**2.0D0 + 2.0D0*X - 6.0D0
END FUNCTION Estrutura Geral do Programa

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


Note que neste programa, no foi passado nenhuma varivel do programa forma:
principal para a funo FCN. Portanto o mdulo de variveis globais no foi
necessrio. MODULE GLOBAL
Apenas a varivel X passada para FCN, mas esta varivel passada do ! DECLARAO DAS VARIVEIS GLOBAIS
programa principal para a subrotina DZREAL e da subrotina para a funo INTEGER <variveis>
FCN. REAL*8 <variveis>
END MODULE

! PROGRAMA PRINCIPAL
PROGRAM <nome>
12.2.2. Usando Numerical Recipes USE GLOBAL ! USA VARIVEIS GLOBAIS
IMPLICIT REAL*8(A-H,O-Z)
No Numerical Recipes encontram-se listadas vrias subrotinas para EXTERNAL <modelo> ! FUNO DO MODELO
obteno de zeros de funo. Abaixo mostramos o uso da subrotina RTBIS
! INICIALIZAO DAS VARIVEIS DO MODELO
(adaptada do Numerical Recipes), que usa o mtodo da bisseo para encontrar <varivel> = <valor>
a raiz de uma funo.
A chamada desta funo tem a seguinte estrutura: ! DEFINIO DOS CHUTES INICIAS PARA AS RAZES
! DEVEM SER DEFINIDOS OS LIMITES INFERIOR E SUPERIOR DE BUSCA
X1 = <valor inferior>
RTBIS (<modelo>,X1,X2,TOL)
X2 = <valor superior>

onde <modelo> nome da funo que contm a equao. ! INICIALIZAO DOS PARMETROS DA FUNO
X1 valor inicial da faixa de valores onde a raiz ser procurada TOL = 1.0D-5
X2 valor final da faixa de valores onde a raiz ser procurada
! CHAMA A FUNO DE OBTENO DA RAIZ
TOL erro absoluto (critrio de parada) XRAIZ = RTBIS(<modelo>,X1,X2,TOL)
INFO vetor que conter o nmero de iteraes necessrias para
obter as razes (tamanho do vetor = NRAIZ) ! IMPRIME A RAIZ
WRITE <XRAIZ>
END
Nesta subrotina, a raiz da funo procurada entre os valores de X1 e
X2. ! FUNO QUE CONTM A EQUAO
REAL*8 FUNCTION <modelo> (X)
USE GLOBAL

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
91 92
IMPLICIT REAL*8(A-H,O-Z) ! DEFINIO DOS CHUTES INICIAS PARA AS RAZES
! DEVEM SER DEFINIDOS OS LIMITES INFERIOR E SUPERIOR DE BUSCA
! EQUAO X1 = 0.0D0
<modelo> = <equao> X2 = 5.0D0

END FUNCTION ! INICIALIZAO DOS PARMETROS DA SUBROTINA


TOL = 1.0D-4
! FUNO COM O MTODO DA BISSEO PARA
! OBTENO DA RAIZ DE UMA FUNO ! CHAMA A FUNO DE OBTENO DAS RAIZES
REAL*8 FUNCTION RTBIS(FUNC,X1,X2,XACC) XRAIZ1 = RTBIS(FCN,X1,X2,TOL)
IMPLICIT REAL*8(A-H,O-Z)
! OBTENO DA SEGUNDA RAIZ
JMAX = 1000 X1 = -10.0D0
FMID = FUNC(X2) X2 = 0.0D0
F = FUNC(X1) XRAIZ2 = RTBIS(FCN,X1,X2,TOL)
IF (F*FMID >= 0.0D0) THEN
WRITE(*,*) ' NAO EXISTE RAIZ ENTRE ', X1, ' E ', X2 ! IMPRIME AS RAIZES
RETURN WRITE(*,*) XRAIZ1, XRAIZ2
ENDIF END
IF (F < 0.0D0) THEN
RTBIS = X1 ! FUNO QUE CONTM A EQUAO
DX = X2 - X1 REAL*8 FUNCTION FCN(X)
ELSE IMPLICIT REAL*8(A-H,O-Z)
RTBIS = X2 ! EQUAO
DX = X1 - X2 FCN = X**2.0D0 + 2.0D0*X - 6.0D0
ENDIF END FUNCTION
DO J = 1,JMAX
DX = DX*0.5D0 ! INSERIR NESTE PONTO A FUNO DO MTODO NUMRICO (RTBIS)
XMID = RTBIS + DX
FMID = FUNC(XMID)
IF (FMID <= 0.0D0) RTBIS = XMID
IF ((ABS(DX) < XACC).OR.(FMID == 0.0D0)) RETURN
ENDDO 12.3. Integrao Numrica
WRITE(*,*) ' NUMERO MAXIMO DE ITERACOES FOI ULTRAPASSADO '
END FUNCTION
Programa que envolvem integrao numrica so muito comuns em
engenharia, principalmente em aplicaes de controle de processos, dinmica de
EXEMPLO 3 processos, clculo de reatores, leitos fixos e fluidizados, processos de absoro
A funo RTBIS apenas retorna uma nica raiz no intervalo especificado. Se e adsoro, filtrao, secagem, entre outros.
duas ou mais razes tiverem de ser obtidas, o programa deve chamar a funo As subrotinas mais utilizadas para integrao numrica so as subrotinas
RTBIS, especificando um intervalo de busca diferente. baseadas no mtodo de Runge-Kutta e DASSL.
Se desejarmos obter as duas razes da equao apresentada no Exemplo 1,
devemos utilizar o seguinte programa:
12.3.1. Usando IMSL
! PROGRAMA PRINCIPAL
! OBTENO DE RAIZES PELO MTODO DA BISSEO
A subrotina mais comum para integrao numrica do IMSL a
PROGRAM RAIZES03
IMPLICIT REAL*8(A-H,O-Z) DIVPRK, baseada no mtodo de Runge-Kutta.
EXTERNAL FCN ! FUNO DO MODELO A chamada desta subrotina tem a seguinte estrutura:

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
93 94

DIVPRK(IDO, NEQ, <modelo>, T, TOUT, ATOL, PARAM, Y) onde N nmero de equaes diferenciais
T tempo
onde <modelo> nome da subrotina que contm o modelo matemtico. Y varivel
IDO varivel de controle da integrao e de erro YPRIME derivada de Y
NEQ nmero de equaes do modelo matemtico
T tempo inicial de integrao
TOUT tempo final de integrao EXEMPLO 4
ATOL tolerncia Considerando um sistema de equaes diferencias contendo trs equaes:
PARAM vetor com as opes de configurao da subrotina dC
Y varivel sendo integrada = 3 X + 2 X2
dt
A varivel IDO controla a entrada e sada da subrotina, modificando seu dT
= 2 X C
valor dependendo se ocorreu algum erro durante a execuo da subrotina. A dt
varivel IDO deve ser inicializada com o valor 1 antes de entrar pela primeira
dX
vez na subrotina. Quando a execuo da subrotina DIVPRK termina sua = 3 exp( 5 / T )
execuo, a varivel IDO pode conter os valores: 2 quando no houve erro de dt
execuo, ou 4, 5 ou 6 quando houve algum erro. Em caso de erro, a integrao Para construir um modelo matemtico para ser usado com a subrotina
deve ser interrompida. Se no houve erro (IDO = 2) a subrotina de integrao DIVPRK, temos que renomear as variveis C, T e X tornando-as campos da
pode ser chamada novamente dando continuidade integrao. Aps o termino varivel Y. Portanto Y(1) = C, Y(2) = T e Y(3) = X.
do uso da subrotina DIVPRK, a varivel IDO deve receber o valor 3 e a A mesma analogia deve ser seguida para as derivadas de C, T e X, que se
subrotina deve ser chamada pela ltima vez, para liberar memria e indicar o tornaram campos da varivel YPRIME. Portanto YPRIME(1) = dC/dt,
fim da integrao. YPRIME(2) = dT/dt e YPRIME(3) = dX/dt.
A varivel PARAM um vetor com 50 campos, que contm opes de Ateno: A varivel YPRIME(1) deve conter a derivada da varivel Y(1) e assim
por diante.
como a subrotina DIVPRK deve conduzir a integrao. Se a varivel PARAM
O sistema de equaes que ser programado ser o seguinte:
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 YPRIME(1) = 3 Y (3) + 2 Y(3)2
grande maioria dos casos). Para integraes mais complicadas (stiff),
YPRIME(2) = 2 Y(3) Y(1)
necessrio modificar algumas opes da integrao:
YPRIME(3) = 3 exp(5 / Y(2))
PARAM(1) passo inicial da integrao
PARAM(2) passo mnimo de integrao
PARAM(3) passo mximo de integrao
PARAM(4) aumenta o nmero de iteraes (normal: 500) 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 MODULE GLOBAL
seguinte estrutura: ! DECLARAO DAS VARIVEIS GLOBAIS
INTEGER <variveis>
REAL*8 <variveis>
SUBROUTINE <modelo> (N,T,Y,YPRIME) END MODULE

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
95 96
! PROGRAMA PRINCIPAL
PROGRAM <nome> ! EQUAES DIFERENCIAIS DO MODELO
USE IMSL ! USA SUBROTINAS NUMRICAS DO IMSL YPRIME(<campo>) = <equao>
USE GLOBAL ! USA VARIVEIS GLOBAIS
IMPLICIT REAL*8(A-H,O-Z) END SUBROUTINE
! Y = VARIVEL, YPRIME = DERIVADA DE Y
REAL*8 Y(<tamanho>), YPRIME(<tamanho>)
DIMENSION PARAM(50) ! OBRIGATRIO PARA DIVPRK
EXTERNAL <modelo> ! SUBROTINA DO MODELO EXEMPLO 5
Compostos clorados derivados do benzeno so produzidos, geralmente, em
! INICIALIZAO DAS VARIVEIS DO MODELO reatores do tipo semi-batelada, que um reator em que parte dos reagentes
NEQ = <tamanho> ! NMERO DE EQUAES DIFERENCIAIS introduzida antes do incio da reao e outra parte dos reagentes
Y(<campo>) = <valor> ! VALORES INICIAIS DAS VARIVEIS A continuamente alimentada ao longo do processo.
! SEREM INTEGRADAS No caso da clorao do benzeno, uma carga inicial de benzeno introduzida
<varivel> = <valor> 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
! DEFINIO DA FAIXA DE INTEGRAO
T = 0.0D0 ! TEMPO INICIAL
benzeno e seus derivados.
TFINAL = <tempo> ! TEMPO FINAL Trs reaes ocorrem simultaneamente no reator, produzindo trs diferentes
TIMPR = <intervalo> ! INVERVALO DE IMPRESSO derivados do benzeno: monoclorobenzeno, diclorobenzeno e triclorobenzeno.
! DEVE SER MENOR OU IGUAL A TFINAL
C6H6 + Cl2 C6H5Cl + HCl
! INICIALIZAO DOS PARMETROS DA SUBROTINA
IDO = 1 ! INICIALIZAO DA SUBROTINA C6H5Cl + Cl2 C6H4Cl2 + HCl
ATOL = 1.0D-4 ! TOLERNCIA
PARAM = 0.0D0 ! USA A SUBROTINA DIVPRK NA SUA CONFIG.PADRO C6H4Cl2 + Cl2 C6H3Cl3 + HCl
PARAM(4) = 1000000 ! AUMENTA O NMERO DE ITERAES POSSVEIS
No reator a concentrao de benzeno e seus derivados variam constantemente
! IMPRIME AS CONDIES INICIAIS
WRITE(*,*) <variveis>
com relao ao tempo de reao, de acordo com as equaes:

DO WHILE (T < TFINAL) dC B


! FAZ INTEGRAO AT O PROXIMO PONTO DE IMPRESSO = k1 C B C Cl
dt
TOUT = T + TIMPR

! CHAMA A SUBROTINA DE INTEGRAO dC MCB


= +k1 C B C Cl k 2 C MCB C Cl
CALL DIVPRK (IDO, NEQ, <modelo>, T, TOUT, ATOL, PARAM, Y) dt
! IMPRIME OS RESULTADOS PARCIAIS
dC DCB
WRITE(*,*) <variveis> = +k 2 C MCB C Cl k 3 C DCB C Cl
ENDDO dt
! TERMINA A INTEGRAO E LIBERA ESPAO NA MEMRIA
dC TCB
! (OBRIGATRIO PARA DIVPRK) = + k 3 C DCB C Cl
CALL DIVPRK (3, NEQ, FCNMOD, T, TOUT, ATOL, PARAM, C) dt
END

! SUBROTINA QUE CONTM O MODELO MATEMTICO


CB concentrao de benzeno
SUBROUTINE <modelo> (NEQ, T, Y, YPRIME) CMCB concentrao de monoclorobenzeno
USE GLOBAL ! USA VARIVEIS GLOBAIS CDCB concentrao de diclorobenzeno
IMPLICIT REAL*8(A-H,O-Z) CTCB concentrao de triclorobenzeno
DIMENSION Y(NEQ), YPRIME(NEQ) CCl concentrao de cloro

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
97 98

k1 constante de reao = 24,08 L/mol.min TFINAL = 10.0D0 ! TEMPO FINAL


k2 constante de reao = 3,02 L/mol.min TIMPR = 0.5D0 ! INVERVALO DE IMPRESSO
k3 constante de reao = 0,10 L/mol.min
! INICIALIZAO DOS PARMETROS DA SUBROTINA
IDO = 1 ! INICIALIZAO DA SUBROTINA
A carga inicial de benzeno no reator de 8850 kg (peso molecular 78 g/mol e ATOL = 1.0D-4 ! TOLERNCIA
densidade 0.8731 kg/L). A concentrao de cloro permanece constante em PARAM = 0.0D0 ! USA A SUBROTINA DIVPRK NA SUA CONFIG.PADRO
0.12 mol de cloro por mol de benzeno alimentado inicialmente (devido a PARAM(4) = 1000000 ! AUMENTA O NMERO DE ITERAES POSSVEIS
alimentao contnua de cloro no reator). A concentrao de HCl
praticamente zero, pois o HCl vaporiza e deixa o reator. ! IMPRIME AS CONDIES INICIAIS
WRITE(*,*) 'TEMPO BENZENO CLBENZ DICLBENZ TRICLBENZ'
O perfil de concentraes do benzeno e derivados do benzeno em funo do WRITE(*,'(F4.1,4(F10.2))') T,Y(1),Y(2),Y(3),Y(4)
tempo de reao pode ser obtido pelo seguinte programa:
DO WHILE (T < TFINAL)
! FAZ INTEGRAO AT O PROXIMO PONTO DE IMPRESSO
TOUT = T + TIMPR
MODULE GLOBAL
REAL*8 B0,ANB0,AK1,AK2,AK3 ! CHAMA A SUBROTINA DE INTEGRAO
REAL*8 CL,V CALL DIVPRK (IDO, NEQ, FCNMOD, T, TOUT, ATOL, PARAM, Y)
END MODULE
! IMPEDE CONCENTRAES NEGATIVAS
WHERE(Y < 0.0D0) Y = 0.0D0
! PROGRAMA PARA CLCULO DE UM REATOR PARA PRODUO DE
CLOROBENZENOS ! IMPRIME OS RESULTADOS PARCIAIS
PROGRAM CLBENZ WRITE(*,'(F4.1,4(F10.2))') T,Y(1),Y(2),Y(3),Y(4)
USE IMSL ! USA SUBROTINAS NUMRICAS DO IMSL
USE GLOBAL ! USA VARIVEIS GLOBAIS ENDDO
IMPLICIT REAL*8(A-H,O-Z)
REAL*8 Y(4), YPRIME(4) ! Y = VARIVEL, YPRIME = DERIVADA DE Y ! TERMINA A INTEGRAO E LIBERA ESPAO NA MEMRIA
DIMENSION PARAM(50) ! OBRIGATRIO PARA DIVPRK ! (OBRIGATRIO PARA DIVPRK)
EXTERNAL FCNMOD ! SUBROTINA DO MODELO CALL DIVPRK (3, NEQ, FCNMOD, T, TOUT, ATOL, PARAM, C)

! INICIALIZAO DOS PARMETROS E CONSTANTES DO MODELO END


B0 = 8850.0D0
ANB0 = B0/0.078D0
! SUBROTINA QUE CONTM O MODELO MATEMTICO A SER INTEGRADO
AK1 = 28.08D0 SUBROUTINE FCNMOD(NEQ,T,Y,YPRIME)
AK2 = 3.02D0 USE GLOBAL
AK3 = 0.10D0 IMPLICIT REAL*8(A-H,O-Z)
DIMENSION Y(NEQ), YPRIME(NEQ)
V = 0.8731D0*B0
YPRIME(1) = - AK1*Y(1)*CL
! INICIALIZAO DAS VARIVEIS DO MODELO YPRIME(2) = AK1*Y(1)*CL - AK2*Y(2)*CL
NEQ = 4 YPRIME(3) = AK2*Y(2)*CL - AK3*Y(3)*CL
Y(1) = ANB0/V ! CONC.BENZENO YPRIME(4) = AK3*Y(3)*CL
Y(2) = 0.0D0 ! CONC.CLOROBENZENO
Y(3) = 0.0D0 ! CONC.DICLOROBENZENO END SUBROUTINE
Y(4) = 0.0D0 ! CONC.TRICLOROBENZENO
CL = 0.012D0*ANB0/V ! CONC.CLORO

! DEFINIO DA FAIXA DE INTEGRAO


T = 0.0D0 ! TEMPO INICIAL

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
99 100

12.3.2. Usando Numerical Recipes


MODULE GLOBAL
No Numerical Recipes encontram-se listadas vrias subrotinas para ! DECLARAO DAS VARIVEIS GLOBAIS
INTEGER <variveis>
integrao numrica. Abaixo mostramos o uso da subrotina RK4 (adaptada do REAL*8 <variveis>
Numerical Recipes), que usa o mtodo de Runge-Kutta para integrao END MODULE
numrica
A chamada desta funo tem a seguinte estrutura: ! PROGRAMA PRINCIPAL
PROGRAM <nome>
USE GLOBAL ! USA VARIVEIS GLOBAIS
RK4(NEQ,Y,YPRIME,T,H,YOUT,<modelo>) IMPLICIT REAL*8(A-H,O-Z)
! Y = VARIVEL, YPRIME = DERIVADA DE Y, YOUT = VARIVEL AUXILIAR
onde <modelo> nome da subrotina que contm o modelo matemtico. REAL*8 Y(<tamanho>), YPRIME(<tamanho>), YOUT(<tamanho>)
NEQ nmero de equaes do modelo EXTERNAL <modelo> ! SUBROTINA DO MODELO
Y valor inicial da varivel sendo integrada ! INICIALIZAO DAS VARIVEIS DO MODELO
YPRIME valor da derivada da varivel sendo integrada NEQ = <tamanho> ! NMERO DE EQUAES DIFERENCIAIS
T tempo inicial de integrao Y(<campo>) = <valor> ! VALORES INICIAIS DAS VARIVEIS A
H passo de integrao. Recomenda-se que seja pelo igual ou ! SEREM INTEGRADAS
menor do que 10-3.TIMPR (onde TIMPR o intervalo de <varivel> = <valor>
impresso dos valores de Y) ! DEFINIO DA FAIXA DE INTEGRAO
YOUT valor final da varivel sendo integrada (aps ser integrada T = 0.0D0 ! TEMPO INICIAL
entre T e T+H) TFINAL = <tempo> ! TEMPO FINAL
TIMPR = <intervalo> ! INVERVALO DE IMPRESSO
! DEVE SER MENOR OU IGUAL A TFINAL
Subrotina do Modelo Matemtico ! INICIALIZAO DOS PARMETROS DA SUBROTINA
H= 1.0D-3 ! PASSO DE INTEGRAO
A subrotina que contm o modelo matemtico a ser integrado tem a
DO WHILE (T < TFINAL)
seguinte estrutura:
! FAZ INTEGRAO AT O PROXIMO PONTO DE IMPRESSO
TOUT = T + TIMPR
SUBROUTINE <modelo> (NEQ, T, Y, YPRIME)
! CHAMA A SUBROTINA DE INTEGRAO
onde NEQ nmero de equaes diferenciais DO WHILE (T < TOUT)
T tempo CALL RK4(NEQ,Y,YPRIME,T,H,YOUT,<modelo>)
Y = YOUT
Y varivel sendo integrada T=T+H
YPRIME derivada de Y ENDDO

A forma de programar o modelo matemtico igual ao mostrado no ! IMPRIME OS RESULTADOS PARCIAIS


WRITE(*,*) <variveis>
Exemplo 4. ENDDO

END
Estrutura Geral do Programa
! SUBROTINA QUE CONTM O MODELO MATEMTICO
SUBROUTINE <modelo> (NEQ, T, Y, YPRIME)
A estrutura geral de um programa de integrao usando a RK4 tem a USE GLOBAL ! USA VARIVEIS GLOBAIS
forma: IMPLICIT REAL*8(A-H,O-Z)

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
101 102
DIMENSION Y(NEQ), YPRIME(NEQ) EXTERNAL FCNMOD ! SUBROTINA DO MODELO

! EQUAES DIFERENCIAIS DO MODELO ! INICIALIZAO DOS PARMETROS E CONSTANTES DO MODELO


YPRIME(<campo>) = <equao> B0 = 8849.5D0
END SUBROUTINE ANB0 = B0/0.078D0
AK1 = 24.08D0
AK2 = 3.02D0
! SUBROTINA QUE CONTM O MTODO DE INTEGRAO NUMRICA AK3 = 0.10D0
SUBROUTINE RK4(N,Y,DYDX,X,H,YOUT,DERIVS) V = 0.8731D0*B0
IMPLICIT REAL*8(A-H,O-Z)
DIMENSION Y(N), YOUT(N), DYDX(N) ! INICIALIZAO DAS VARIVEIS DO MODELO
DIMENSION DYM(N), DYT(N), YT(N) NEQ = 4
HH = 0.5D0*H Y(1) = ANB0/V ! CONC.BENZENO
H6 = H/6.0D0 Y(2) = 0.0D0 ! CONC.CLOROBENZENO
XH = X + HH Y(3) = 0.0D0 ! CONC.DICLOROBENZENO
DO I=1,N Y(4) = 0.0D0 ! CONC.TRICLOROBENZENO
YT(I) = Y(I) + HH*DYDX(I) CL = 0.012D0*ANB0/V ! CONC.CLORO
ENDDO
CALL DERIVS(N,XH,YT,DYT) ! DEFINIO DA FAIXA DE INTEGRAO
DO I = 1,N T = 0.0D0 ! TEMPO INICIAL
YT(I) = Y(I) + HH*DYT(I) TFINAL = 10.0D0 ! TEMPO FINAL
ENDDO TIMPR = 0.5D0 ! INVERVALO DE IMPRESSO
CALL DERIVS(N,XH,YT,DYM)
DO I = 1,N ! INICIALIZAO DOS PARMETROS DA SUBROTINA
YT(I) = Y(I) + H*DYM(I) H= 1.0D-3 ! PASSO DE INTEGRAO
DYM(I) = DYT(I) + DYM(I)
ENDDO ! IMPRIME AS CONDIES INICIAIS
CALL DERIVS(N,X+H,YT,DYT) WRITE(*,*) 'TEMPO BENZENO CLBENZ DICLBENZ TRICLBENZ'
DO I = 1,N WRITE(*,'(F4.1,4(F10.2))') T,Y(1),Y(2),Y(3),Y(4)
YOUT(I) = Y(I) + H6*(DYDX(I) + DYT(I) + 2.0D0*DYM(I))
ENDDO DO WHILE (T < TFINAL)
END SUBROUTINE ! FAZ INTEGRAO AT O PROXIMO PONTO DE IMPRESSO
TOUT = T + TIMPR

! CHAMA A SUBROTINA DE INTEGRAO


EXEMPLO 6 DO WHILE (T < TOUT)
Se desejarmos integrarmos o modelo matemtico apresentado no Exemplo 5, CALL RK4(NEQ,Y,YPRIME,T,H,YOUT,FCNMOD)
usando a subrotina RK4, devemos utilizar o seguinte programa: Y = YOUT
T=T+H
MODULE GLOBAL ! IMPEDE CONCENTRAES NEGATIVAS
! DECLARAO DAS VARIVEIS GLOBAIS WHERE(Y < 0.0D0) Y = 0.0D0
REAL*8 B0,ANB0,AK1,AK2,AK3 ENDDO
REAL*8 CL,V
END MODULE ! IMPRIME OS RESULTADOS PARCIAIS
WRITE(*,'(F4.1,4(F10.2))') T,Y(1),Y(2),Y(3),Y(4)
! PROGRAMA PRINCIPAL ENDDO
PROGRAM CLBENZ02 END
USE GLOBAL ! USA VARIVEIS GLOBAIS
IMPLICIT REAL*8(A-H,O-Z) ! SUBROTINA QUE CONTM O MODELO MATEMTICO
! Y = VARIVEL, YPRIME = DERIVADA DE Y, YOUT = VARIVEL AUXILIAR SUBROUTINE FCNMOD (NEQ, T, Y, YPRIME)
REAL*8 Y(4), YPRIME(4), YOUT(4) USE GLOBAL ! USA VARIVEIS GLOBAIS
IMPLICIT REAL*8(A-H,O-Z)

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
103 104
DIMENSION Y(NEQ), YPRIME(NEQ)
SUBROUTINE <modelo> (NPRM,THETA,IOPT,IOBS,FRQ,WT,E,DE,IEND)
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 onde NPRM nmero de parmetros
YPRIME(4) = AK3*Y(3)*CL THETA vetor com os parmetros
END SUBROUTINE IOPT opo de avaliao: 0 calcula a funo, 1 calcula a
derivada
IOBS nmero da observao
12.4. Regresso No-Linear FRQ frequncia para a observao
WT peso da observao
A regresso no-linear muito usado em engenharia, pois muitas vezes E erro da observao IOBS
necessrio achar os coeficientes (ou parmetros) de uma equao ou modelo DE vetor que contm as derivadas parciais do resduo para a
para um conjunto de observaes. observao IOBS
As subrotinas mais utilizadas para integrao numrica so as subrotinas IEND indicador de finalizao: 0 menor ou igual ao nmero de
baseadas no mtodo de observaes, 1 maior que o nmero de observaes.

Esta subrotina deve ser programa de forma a retornar o erro da


12.4.1. Usando IMSL observao sendo analisada (E), ou seja a diferena entre o valor observado e o
valor estimado pelo modelo.
A subrotina mais comum para integrao numrica do IMSL a
DRNLIN, baseada no mtodo de EXEMPLO 7
A chamada desta subrotina tem a seguinte estrutura: A taxa de reao qumica geralmente dada pela lei de Arrhenius:
Ea
k = A exp
DRNLIN (<modelo>, NPRM, IDERIV, THETA, R, LDR, IRANK, DFE, SSE) RT
A fator pr-exponencial (parmetro)
onde <modelo> nome da subrotina que contm o modelo matemtico Ea energia de ativao (parmetro)
NPRM nmero de parmetros a serem estimados k taxa de reao
IDERIV opo de derivada da funo: 0 derivadas so calculadas R constante dos gases
por diferenas finitas, 1 derivada fornecida pelo usurio T temperatura
THETA vetor com os NPRM parmetros
R matriz triangular NPRM x NPRM que contm a matriz Pode-se estimar o valor do fator pr-exponencial (A) e da energia de ativao
resultante da decomposio do jacobiano. (Ea) obtendo-se valores experimentais de k e T. Por uma questo de maior
LDR dimenso de R facilidade matemtica, o logaritmo desta equao avaliado.
IRANK ordem da matriz de R
DFE grau de liberdade do erro Ea
ln k = ln A
SSE soma dos quadrados do erro RT

Para ser usada na subrotina, o erro entre o k observado e o k calculado deve


Subrotina do Modelo Matemtico ser obtido, e portanto a subrotina deve calcular a seguinte equao:

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


seguinte estrutura: E = ln k ln A
R T

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
105 106
! LEITURA DE DADOS DO ARQUIVO
Neste caso, A e Ea so os parmetros da equao e k e T so as variveis NOBS = 0
conhecidas. Podemos transformar A em THETA(1) e Ea em THETA(2) de DO WHILE (.NOT.(EOF(2)))
forma que possam ser avaliadas pela subrotina. k e T, por sua vez sero NOBS = NOBS + 1
READ(2,*) Y(1,NOBS), Y(2,NOBS), Y(<campo>,NOBS)
transformados em Y(1) e Y(2). Como existem vrias observaes, cada par de
! Y(<campo>,i) = SO AS VARIVEIS CUJOS VALORES SO CONHECIDOS
observaes de k e T, sero armazenadas em Y(1,IOBS) e Y(2,IOBS). ! PARA CADA OBSERVAO
Portanto a equao a ser programada dever ser: ENDDO

THETA(2) ! "CHUTE" INICIAL PARA OS PARMETROS


E = ln{Y(1, IOBS)} ln{THETA(1)} THETA(<parametro>) = <valor> ! PARMETRO DA EQUAO
R Y(2, IOBS)
! 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
! SUBROTINA COM A FUNO DA TAXA DE REAO
A estrutura geral de um programa de integrao usando a DRNLIN tem a SUBROUTINE FCNMOD(NPRM, THETA, IOPT, IOBS, FRQ, WT, E, DE, IEND)
forma: USE GLOBAL
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION THETA(NPRM), R(NPRM,NPRM)
MODULE GLOBAL
REAL*8 Y(10,1000), <variveis> IEND = 0
! SE TIVER MAIS QUE 10 VARIVEIS, MUDAR O NMERO DE IF (IOBS <= NOBS) THEN
! Y(<campo>,1000) WT = 1.0D0 ! PESO DA OBSERVAO
! SE TIVER MAIS QUE 1000 OBSERVAES, MUDAR O NMERO DE FRQ = 1.0D0
! Y(10,<observaes>) E = <funo>
INTEGER NOBS, <variveis> ELSE
END MODULE ! ACABARAM-SE AS OBSERVAES
IEND = 1
! PROGRAMA REGRESSO NO LINEAR USANDO BIBLIOTECA IMSL END IF
PROGRAM <programa> END SUBROUTINE
USE GLOBAL
USE IMSL
IMPLICIT REAL*8 (A-H,O-Z)
PARAMETER (NPRM = <nmero de parmetros>)
DIMENSION THETA(NPRM), R(NPRM,NPRM) EXEMPLO 8
EXTERNAL FCNMOD Um programa para estimar as constantes da equao da lei de Arrhenius,
apresentada no Exemplo 7 teria a forma:
! ABERTURA DE ARQUIVO DE DADOS
OPEN(2,FILE='<arquivo de dados>')

! INICIALIZAAO DAS VARIVEIS MODULE GLOBAL


<variveis> = <valor> REAL*8 CTEGAS, Y(10,1000)
INTEGER NOBS
END MODULE

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
107 108
E = DLOG(Y(1,IOBS)) - (DLOG(THETA(1)) - THETA(2)/(CTEGAS*Y(2,IOBS)))
! PROGRAMA PARA CALCULO DA ENERGIA DE ATIVAO E ELSE
! FATOR PR-EXPONENCIAL DE UMA REAO QUMICA ! ACABARAM-SE AS OBSERVAES
PROGRAM CINET01 IEND = 1
USE GLOBAL END IF
USE IMSL
IMPLICIT REAL*8 (A-H,O-Z) END SUBROUTINE
PARAMETER (NPRM = 2) ! NPRM = NMERO DE PARMETROS
DIMENSION THETA(NPRM), R(NPRM,NPRM)
EXTERNAL FCNMOD

! ABERTURA DE ARQUIVO DE DADOS 12.5. Estimativa de Parmetros


OPEN(2,FILE='CINET.DAT')

! INICIALIZAAO DAS VARIVEIS As tcnicas de regresso so teis para estimar parmetros de uma nica
CTEGAS = 8.314D0 ! CONSTANTE DOS GASES equao, mas quando se deseja estimar parmetros de um sistema de equaes,
deve-se utilizar de tcnicas mais avanadas de estimativa de parmetros, sendo
! LEITURA DE DADOS DO ARQUIVO que as mais comuns so baseadas na tcnica de Levenberg-Marquardt que
NOBS = 0
DO WHILE (.NOT.(EOF(2)))
estima parmetros usando o mtodo de mnimos quadrados no linear.
NOBS = NOBS + 1
READ(2,*) Y(1,NOBS), Y(2,NOBS)
! Y(1,i) = K - TAXA DE REAO 12.5.1. Usando IMSL
! Y(2,i) = T - TEMPERATURA
ENDDO
A subrotina mais comum para estimar parmetros no IMSL a DBCLSF,
! "CHUTE" INICIAL PARA OS PARMETROS baseada na tcnica de Levenberg-Marquardt.
THETA(1) = 4.6D16 ! FATOR PR-EXPONENCIAL A chamada desta subrotina tem a seguinte estrutura:
THETA(2) = 100000.0D0 ! ENERGIA DE ATIVAO

! INICIALIZAO DAS CONDIES DA REGRESSO LINEAR


DBCLSF(<modelo>, NOBS*NEQ, NPRM, THETA0, IBTYPE, XLB, XUB,
IOPT = 0 ! OPO DE AVALIAO DA FUNO XSCALE, FSCALE, IPARAM, RPARAM, THETA, FVEC,
FJAC, LDFJAC)
CALL DRNLIN(FCNMOD, NPRM, IOPT, THETA, R, NPRM, IRANK, DFE, SSE)
onde <modelo> nome da subrotina que contm a funo a ser minimizada
! IMPRESSO DOS RESULTADOS NOBS nmero de observaes
WRITE(*,*) 'K = ', THETA(1)
WRITE(*,*) 'EA = ', THETA(2) NEQ nmero de equaes no modelo matemtico
WRITE(*,*) NPRM nmero de parmetros a ser estimados
WRITE(*,*) 'SSE = ', SSE THETA0 chute inicial para os parmetros
END IBTYPE tipo de restrio aplicado aos parmetros: 0 limites so
! SUBROTINA COM A FUNO DA TAXA DE REAO
especificados pelo usurio via XLB e XUB; 1 os
SUBROUTINE FCNMOD(NPRM, THETA, IOPT, IOBS, FRQ, WT, E, DE, IEND) parmetros so todos positivos; 2 os parmetros so todos
USE GLOBAL negativos.
IMPLICIT REAL*8 (A-H,O-Z) XLB vetor com os limites inferiores para os parmetros
DIMENSION THETA(NPRM), R(NPRM,NPRM) XUB vetor com os limites superiores para os parmetros
IEND = 0 XSCALE vetor com o valor de escalonamento dos parmetros
IF (IOBS <= NOBS) THEN FSCALE vetor com o valor de escalonamento para as funes
WT = 1.0D0 ! PESO DA OBSERVAO IPARAM vetor com as opes de configurao da subrotina
FRQ = 1.0D0

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
109 110

RPARAM vetor com as opes de configurao da subrotina ! SE TIVER MAIS QUE 10 VARIVEIS DEPENDENTES,
THETA vetor com os parmetros que foram estimados pela subrotina ! MUDAR O NMERO DE Y(<campo>,1000)
! SE TIVER MAIS QUE 1000 OBSERVAES, MUDAR O NMERO DE
FVEC vetor que contm os resduos da soluo ! Y(10,<observaes>) E X(<observaes>)
FJAC matriz que contm o Jacobiano da soluo REAL*8 TTA(50)
LDFJAC dimenso de FJAC END MODULE

! PROGRAMA PARA ESTIMATIVA DE PARMETROS


Subrotina do Modelo Matemtico PROGRAM DEXPRM
USE IMSL
A subrotina que contm o modelo matemtico a ser integrado tem a USE GLOBAL
seguinte estrutura: IMPLICIT REAL*8 (A-H,O-Z)

! NPRM = NMERO DE PARMETROS


SUBROUTINE <modelo> (M, NPRM, THETA, ERRO) ! NOBS = NMERO DE OBSERVAES
! NEQ = NMERO DE EQUAES DO MODELO
onde M nmero de observaes * nmero de equaes PARAMETER (NPRM = <valor>, NOBS = <valor>, NEQ = <valor>)
NPRM nmero de parmetros
DIMENSION THETA(NPRM), THETA0(NPRM), R(NPRM,NPRM)
THETA vetor com o valor dos parmetros DIMENSION XLB(NPRM), XUB(NPRM), XSCALE(NPRM)
ERRO vetor que retorna o valor do erro entre a varivel dependente DIMENSION IPARAM(6), RPARAM(7)
observada e a varivel dependente calculada com os valores DIMENSION FSCALE(NOBS*NEQ),FVEC(NOBS*NEQ),FJAC(NOBS*NEQ,NPRM)
atuais dos parmetros sendo estimados.
EXTERNAL FCNPRM ! SUBROTINA QUE IR CONTROLAR
! QUAL OBSERVAO SER USADA NA
Esta subrotina deve ser programa de forma a retornar o erro da ! ESTIMATIVA DE PARMETROS
observao sendo analisada (E), ou seja a diferena entre o valor observado e o ! TRANSFERE OS VALORES DO NMERO DE EQUAES DO MODELO E DO
valor estimado pelo modelo. Em geral, para estimativa de parmetros se utiliza ! NMERO DE OBSERVAES QUE SER USADO NA ESTIMATIVA DOS
a diferena ao quadrado. ! PARMETROS. ISTO FEITO POIS AS VARIVEIS NEQ E NOBS
! NO PODEM SER PASSADAS DIRETAMENTE PARA A SUBROTINA FCNPRM E
! PARA A SUBROTINA <MODELO>
ERRO(<obs>) = (YOBS(I,<obs>) - YSIM(J,<obs>)**2.0D0 NEQT = NEQ
NOBT = NOBS
onde YOBS valor observado
YSIM valor calculado com o valor atual dos parmetros sendo ! ABRE O ARQUIVO QUE CONTM OS DADOS
estimados pela subrotina. OPEN(2, FILE = '<arquivo>')

! CHUTE INICIAL DOS PARMETROS


THETA0(<param>) = <valor>

Estrutura Geral do Programa ! LEITURA DOS PONTOS EXPERIMENTAIS


DO I = 1,NOBS
! INSIRA O NMERO DE VARIVEIS QUE FOR NECESSRIO
A estrutura geral de um programa de integrao usando a DBCLSF tem a ! XOBS - VARIVEL INDEPENDENTE
forma: ! YOBS - VARIVEL DEPENDENTE
READ(3,*) XOBS(I),YOBS(<campo>,I),YOBS(<campo>,I)
ENDDO
MODULE GLOBAL
INTEGER NRUN,NEQT,NOBT,IMOD ! DEFINE O TIPO DE MODELO MATEMTICO
IMOD = 1 ! IMOD = 1 SE MODELO DIFERENCIAL
REAL*8 XOBS(1000), YOBS(10,1000), YSIM(10,1000)
! NECESSITA SER INTEGRADO

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
111 112
! 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 ! INICIALIZA PARMETROS PARA A INTEGRAO NUMRICA
FSCALE = 1.0D0 ATOL = 1.0D0
XSCALE = 1.0D0 IDO = 1
NRUN = 0 PARAM = 0.0D0
LDFJAC = NOBS*NEQ PARAM(4) = 1000000
CALL DU4LSF(IPARAM,RPARAM) ! INICIALIZA CONFIGURAO DA DBCLSF T = 0.0D0
ENDIF
IPARAM(1) = 1
IPARAM(3) = 10000 ! CHAMA SUBROTINA DE INTEGRAO NUMRICA
IPARAM(4) = 1000 IF (XOBS(I+1) /= 0.0D0) THEN
IPARAM(5) = 1000 TOUT = XOBS(I+1)
CALL DIVPRK (IDO, NEQT, FCNMOD, T, TOUT, ATOL, PARAM, C)
! CHAMA SUBROTINA PARA ESTIMATIVA DOS PARMETROS DO MODELO DO J = 1,NEQT
CALL DBCLSF(FCNPRM,NOBS*NEQ,NPRM,THETA0,1,XLB,XUB,XSCALE, & YSIM(J,I+1) = C(J)
FSCALE,IPARAM,RPARAM,THETA,FVEC,FJAC,LDFJAC) ENDDO
ELSE
! IMPRIME OS PARMETROS QUE FORAM ESTIMADOS CALL DIVPRK (3, NEQT, FCNMOD, T, TOUT, ATOL, PARAM, C)
DO I = 1,NPRM ENDIF
WRITE(*,*) THETA(I) ENDDO
ENDDO ELSE
END
! MODELO ALGBRICO
! ESCREVA AQUI AS EQUAES ALGBRICAS DO MODELO
! SUBROTINA DE MINIMIZAO ! YSIM(<campo>,I) A VARIVEL INDEPENDENTE SENDO CALCULADA
SUBROUTINE FCNPRM(NPTS, NPRM, THETA, ERRO) DO I = 1,NOBT
USE GLOBAL YSIM(<campo>,I) = <equao>
IMPLICIT REAL*8 (A-H,O-Z) ENDDO
DIMENSION THETA(NPRM), R(NPRM,NPRM) ENDIF
DIMENSION PARAM(50) ! USADO PELA INTEGRAO
DIMENSION C(NPTS), ERRO(NPTS) ! CALCULO O ERRO DO MODELO
PESO = 1.0D0
EXTERNAL FCNMOD I=0
DO K = 1,NOBT
! TRANSFERE OS VALORES DOS PARMETROS SENDO ESTIMADOS PARA DO J = 1,NEQT
! A VARIVEL GLOBAL QUE SER PASSADA PARA A SUBROTINA I=I+1
! QUE CONTM O MODELO. ISTO FEITO POIS A VARIVEL THETA ERRO(I) = (YOBS(J,K) - YSIM(J,K))**2.0D0
! NO PODE SER PASSADA DIRETAMENTE PARA A SUBROTINA <MODELO> ENDDO
DO I = 1,NPRM ENDDO
TTA(I) = THETA(I) END SUBROUTINE
ENDDO

IF (IMOD == 1) THEN ! SUBROTINA QUE CONTM AS EQUAES DIFERENCIAIS


! MODELO DIFERENCIAL SUBROUTINE FCNMOD(NEQ,T,Y,YPRIME)
! FAZ INTEGRAO DO MODELO USE GLOBAL
DO I = 1,NOBT IMPLICIT REAL*8 (A-H,O-Z)
IF (XOBS(I) == 0.0D0) THEN DIMENSION Y(NEQ), YPRIME(NEQ)
! PEGA O VALOR INICIAL PARA A INTEGRAO NUMRICA
DO J = 1,NEQT ! INICIALIZAO DAS VARIVEIS
C(J) = YOBS(J,I) <variaveis> = <valor>

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
113 114

Se o modelo for algbrico (IMOD = 2), o arquivo de dados no necessita


! MODELO DIFERENCIAL ter as condies iniciais do sistema. O quadro 12.2. mostra um exemplo de
! ESCREVA AQUI AS EQUAES DIFERENCIAIS ONDE
! YPRIME(<campo>) = DIFERENCIAL DA VARIAVEL Y(<campo>) arquivo de dados para modelo algbrico, onde a primeira coluna se refere
YPRIME(<campo>) = <equao> varivel independente X, e a segunda e terceira colunas s variveis
dependentes Y(1) e Y(2).
END SUBROUTINE
Quadro 12.2. Exemplo de arquivo de dados para modelo algbrico.
A subrotina DBCLSF estima parmetros com base no erro de cada 1.0 11.9 2.1
observao, independente do nmero de equaes do modelo. por isso que 2.0 10.5 3.5
deve-se prestar ateno na diferena entre as variveis NPTS e NOBT na 3.0 9.4 4.4
subrotina FCNPRM. Nesta subrotina, a varivel NOBT controla o nmero de 1.5 12.3 2.5
conjuntos de observaes, enquanto que NPTS controla o total de observaes, 1.9 12.1 2.9
ou seja NOBT*NEQT (nmero de conjunto de observaes * nmero de 3.4 10.3 4.0
equaes do modelo). 4.2 9.0 5.4
Se tivermos dados de uma varivel independente X e duas variveis
dependentes Y1 e Y2 (portanto duas equaes). Ento um conjunto de Dependendo do modelo utilizado, pode-se modificar o programa acima,
observao composto dos valores de X, Y1, Y2. J uma observao o valor acrescentando mais variveis independentes e dependentes. O nico cuidado
individual de Y1 ou Y2. que se deve ter saber qual varivel independente ir controlar a integrao no
caso de modelo diferencial.
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 EXERCCIOS
observaes feitas para a varivel independente e variveis dependentes na
sequncia em que foram obtidos. Pode-se ter vrias corridas experimentais para EXERCCIO 1
a integrao, deste que a condio inicial seja marcada com X = 0. O quadro Um experimento para obter a presso parcial de tolueno obteve os seguinte
12.1. mostra um exemplo de arquivo de dados para modelo diferencial, onde a dados:
primeira coluna se refere varivel independente X, e a segunda e terceira
colunas s variveis dependentes Y(1) e Y(2). Presso de Vapor Temperatura
1 -26.7
Quadro 12.1. Exemplo de arquivo de dados para modelo diferencial. 5 -4.4
0.0 12.1 0.0 10 6.4
1.0 11.9 2.1 20 18.4
2.0 10.5 3.5 40 31.8
3.0 9.4 4.4 X = 0.0 marca o incio de um novo 60 40.3
0.0 13.9 0.0 experimento e portanto de o incio de 100 51.9
uma nova integrao. 200 69.5
1.5 12.3 2.5
1.9 12.1 2.9 400 89.5
3.0 10.3 4.0 760 110.6
4.0 9.0 5.4

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
115

Desenvolva um programa para calcular os parmetros da equao de Antoine


para os dados acima.
B
Pvap = exp A +
T + 273

AeB parmetros
Pvap presso de vapor (mmHg)
T temperatura em C

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

O balano de massa (adimensionalizado) dado por:


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 temperatura em K
T0 temperatura inicial = 423 K
T* temperatura adimensional
y concentrao de benzeno adimensional
x comprimento do reator adimensional

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

Calcular a temperatura real e a concentrao adimensional em funo do


comprimento do reator (x entre 0 e 1, com intervalo de impresso de 0,1).

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
117 118

Warning tipo de erro. Pode ser Warning (o compilador


13. ERROS DE COMPILAO cria o programa executvel, mas poder ocorrer
algum erro durante sua execuo) ou Error
(erro grave compilador no cria o programa
Muitos erros podem ocorrer durante a compilao do programa (gerao
executvel)
do programa executvel), sendo que a maioria se deve a falta de algum
comando ou erro de digitao. Variable A is Descrio do erro
Durante a compilao do programa, os erros aparecem em uma janela C = B/A
separada do cdigo do programa (Figura 13.1). ------^ Cpia da linha do erro e indicao onde o erro
foi detectado

Abaixo listamos as principais mensagens de erro de compilao, a causa


provvel do erro e como consertar o problema.

Error: A logical data type is required in this context.


IF (C = 0) THEN
------^
Operador lgico est incorreto (falta um =). O certo ==.

Error: A logical data type is required in this context.


IF ((C == 0) OR (A == 0)) THEN
-------------^
Operador lgico est incorreto (OR). O certo .OR.
Pode ocorrer com .AND. tambm.

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


statement.
ENDIF
Figura 13.1. Tela do programa e local onde as mensagens de erro so listadas. ^
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 Error: An unterminated block exists.
value has been defined IF (C == 0.0D0) THEN
C = B/A ^
------^ Falta um ENDIF no bloco IF..THEN..ELSE.
Correo:
onde: C:\Arquivos\Arq.f90 o diretrio e arquivo onde ocorreu o erro Procure o final do IF..THEN..ELSE e insira o comando ENDIF.
(6) linha do programa onde ocorreu o erro

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
119 120
Error: An unterminated block exists.
DO I = 1,100 Error: The number of subscripts is incorrect. [A]
^ A(10) = 2.0D0
Falta um ENDDO no bloco DO..ENDDO ^
Correo: A varivel A foi definida como uma matriz A(x,y) e foi usada como um
Procure o final do DO..ENDDO e insira o comando ENDDO. vetor A(x).

Error: Syntax error, found '=' when expecting one of: ( * :: , Error: The statement following the Logical IF statement is
<END-OF-STATEMENT> ; : ) + . - % (/ [ ] /) . ** / > ... invalid.
IF (C = 0) THEN IF (C == 0.0D0)
------^ ^
Operador lgico est incorreto (falta um =). O certo ==. Falta o comando THEN na estrutura IF..THEN..ELSE

Error: Syntax error, found '.' when expecting one of: <LABEL> Error: This DO variable has already been used as an outer DO
<END-OF-STATEMENT> ; BLOCK BLOCKDATA PROGRAM TYPE COMPLEX BYTE variable in the same nesting structure. [I]
CHARACTER ... DO I = 1,50
. -----------^
^ A varivel de controle (I) do DO..ENDDO j est sendo usada por outro
Tem um ponto final perdidoem alguma linha do programa. DO..ENDDO.
Correo: Correo:
Verifique a linha do problema e remova o ponto final. D outro nome para a varivel de controle deste DO..ENDDO.

Error: Syntax error, found ',' when expecting one of: <END-OF- Warning: In the call to SOMA, actual argument #1 does not match
STATEMENT> ; the type and kind of the corresponding dummy argument.
A = 2,0D0 CALL SOMA(I,A,B,C)
-----^ ^
Nmero foi digitado errado (2,0D0). O certo 2.0D0 (com ponto ao invs A subrotina SOMA foi definida como:
de vrgula). 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.
Error: Syntax error, found END-OF-FILE when expecting one of:
<LABEL> <END-OF-STATEMENT> ; BLOCK BLOCKDATA PROGRAM TYPE COMPLEX Correo:
BYTE CHARACTER ... Modifique o tipo da varivel I no programa principal ou na subrotina,
Falta um END no final do programa principal. pois as variveis passadas para a subrotina devem ser de mesmo tipo no
programa principal e na subrotina.
Error: Syntax error, found END-OF-STATEMENT when expecting one
of: , ) Warning: In the call to SOMA, there is no actual argument
C = ((B + A)/A corresponding to the dummy argument C.
--------------^ CALL SOMA(A,B)
Falta um parnteses na equao. ^
Correo: A subrotina SOMA foi definida como:
Verifique em que ponto da equao est faltando um parnteses. SUBROUTINE SOMA(A,B,C)

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
121 122

porm a subrotina foi chamada somente com os parmetros A e B, No caso acima, o erro se deve a um erro de programao.
faltando o parmetro C.
Correo: Severe(161): Program Exception array bounds exceeded
Procure o parmetro que est faltando e insira-o na chamada da subrotina. 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
Warning: This statement function has not been used. [A] existe.
A(1) = 2.0D0
^
A varivel A no foi declarada como um vetor ou matriz.
Correo:
Declare a varivel A como um vetor usando o comando DIMENSION.

Warning: Variable A is used before its value has been defined


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

13.1. Erros de Execuo

A maioria dos erros de execuo dependem de uma anlise mais profunda


de sua causa, e sero explicados no Captulo 14.
Quando um erro de execuo ocorre, a tela apresentada geralmente
parecida com a mostrada na Figura 13.2.

erro
ocorrido

linha do
erro

Figura 3.2. Tela do programa quando ocorre erro de execuo

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
123 124

14.3.2. Ocorre Diviso por Zero / Erro em Logaritmo


14. DEBUG
Quando ocorre diviso por zero, erro em logaritmo ou exponencial
geralmente o programa exibe uma mensagem informando a linha onde o
Debugar significa remover erros de programao que ocorrem durante a
problema ocorreu (Figura 14.1).
execuo de um programa.
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.
14.1. Quando Debugar Quando ocorre erro em logaritmo, o procedimento o mesmo.

v quando o programa parece no sair do lugar.


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

14.2. Antes de Debugar


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

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


14.3. Problemas que Causam Problemas logaritmo.

14.3.1. Programa Parece No Sair do Lugar


14.3.3. Overflow ou Nmero Infinito
geralmente causado por loop infinito.
Procure todos os DO..ENDDO e DO WHILE e reveja a condio de Ocorre quando uma varivel ou clculo retorna um valor muito maior do
sada do loop. Verifique se ela esta correta. Caso esteja, procure a varivel que a varivel consegue armazenar (overflow). Alguns compiladores param a
usada na comparao e veja porque seu valor no muda. execuo quando h overflow, e outros atribuem o nome Infinity para a
As vezes necessrio repensar a condio de sada. Ela pode ser muito varivel, sendo que a partir deste momento nenhum clculo pode ser realizado
radical sendo que o processo pode no gerar tal valor esperado para a com esta varivel.
varivel. Ocorre muito quando se estabelece uma tolerncia muito rgida ou Geralmente, o overflow ocorre com clculo com exponenciais (a
pequena demais. exponencial de um nmero grande um nmero maior ainda) ou em clculos
com somatrios que no so inicializados corretamente.

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
125 126

Quando o problema ocorre com a exponencial. Procure pela varivel que 14.3.5. Resultado Retornado Estranho
causa o problema e veja porque esta varivel est com um valor to grande.
Pior problema a ser resolvido, pois a fonte do problema desconhecido.
Quando o problema com o somatrio, verifique se o clculo do Primeiro revise suas equaes matemticas (se ela foi digitada corretamente,
somatrio foi inicializado. 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
Certo Errado uma seo de cada vez. Execute o programa at o final da primeira seo e veja
SUM = 0.0D0 DO I = 1,100 se os valores calculados at ento esto corretos. Caso estejam, execute o
DO I = 1,100 SUM = SUM + X(I) programa at o final da segunda seo e assim por diante. Quando achar um
SUM = SUM + X(I) ENDDO valor estranho, o problema pode estar dentro daquela regio do programa.
ENDDO Verifique se os valores passados para e da subrotina esto corretos.
Depois verifique se existe algum IF..THEN..ELSE ou DO..ENDDO ou DO
Se um somatrio deste tipo existe num programa, no caso Certo, a WHILE que est sendo ignorado (condio pode estar falhando).
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.4. Usando o Debug do Compaq Fortran

14.3.4. Resultado NAN 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,
Quando subrotinas numricas do IMSL ou outras so usadas, elas podem posicione o cursor na linha desejada e pressione no boto Stop (boto em forma
conter internamente um sistema de deteco de erro que no deixa que divises de mo) (Figura 14.2).
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 boto Stop
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 linha selecionada para parar a
estar em alguma diviso por zero, exponencial, seno, co-seno ou logaritmo. No execuo do programa. Aps
primeiro NAN, veja na equao qual a varivel que tem um valor que possa pressionar o boto Stop,
gerar o erro matemtico. aparecer uma bola ao lado da
Finalmente procure o que ocorre com esta varivel (clculo errado da linha.
varivel, falta de inicializao, erro na leitura, etc.). Figura 14.2. Selecionando a linha de parada.

Pode-se definir quanto pontos de parada se desejar.

Fabiano A.N. Fernandes


Programao Fortran para Engenharia
127 128

Para iniciar a sesso de debug, selecione a opo Build no menu Quando o programa para no ponto escolhido para ser debugado, a tela
principal, e depois selecione as opes Start Debug e Go (Figura 14.3). O apresentada pelo compilador ser semelhante apresentada na Figura 14.4. Na
programa ir iniciar sua execuo e ir parar no ponto escolhido anteriormente. 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.

Fabiano A.N. Fernandes

Você também pode gostar