Escolar Documentos
Profissional Documentos
Cultura Documentos
PROGRAMAO
FORTRAN
PARA ENGENHARIA
1a Edio
2003
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.
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
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
Corrente 1 Corrente 2
Imprimir Resultados
Fim
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
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,
DP = 50 + (I-1)*DeltaDP
Calcula Ut
Imprime NNu
Dp, Ut
Fim
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
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 )
3. COMPILADOR FORTRAN
Figura 3.3. Abertura de um novo projeto no Fortran No esquea de gravar o arquivo com a extenso .f90 (Figura 3.6).
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).
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.
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.
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
C = (1,2)
C = (1.70,-8.948)
C = (+502348E5,.999)
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
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
<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
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
WRITE(*,(I2,2(3X,F5.2))) N, A, B
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
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:
CD coeficiente de arraste
Verdadeiro Re nmero de Reynolds
comparao PROCESSO
Falso
O fluxograma de deve ser seguido para este processo :
Fim
Incio . IF..THEN..ELSE
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
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)
64
EQ1: f= [eq. Dorey-Weisbach]
Re
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
(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
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]
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)
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
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]
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.
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
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)
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.
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
! CLCULO DO FATOR DE ATRITO VIA MTODO DA BISSEO Figura 8.7. Fluxograma lgico de um loop usando o comando CYCLE.
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)
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
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
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
O programa para em Fortran para realizar o clculo teria a forma: O fluxograma a ser seguido tem a seguinte estrutura:
! 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
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
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
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
CLOSE(2)
<arquivo> nome do arquivo a ser criado ou aberto. CLOSE(3)
o nome do arquivo deve vir entre aspas. END
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.
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)
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
CA0 T
A Ea
R
8,0 313,0
2.1049 77500,0
1,987
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.
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 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
Note que o nome da funo (PRODUTO) deve ser igual ao nome da varivel
(PRODUTO) que ter o valor retornado para o programa principal.
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:
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
! 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
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
! 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)
END FUNCTION
! 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
! 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
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 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
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)
! 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
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
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.
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
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
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)
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.
erro
ocorrido
linha do
erro
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.
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.