Petrucci, Aron L. - Metodologia para Seleção de Configuração de Sistemas Prediais de Água em Edificações Que Abriguem Múltiplas Economias
Petrucci, Aron L. - Metodologia para Seleção de Configuração de Sistemas Prediais de Água em Edificações Que Abriguem Múltiplas Economias
Petrucci, Aron L. - Metodologia para Seleção de Configuração de Sistemas Prediais de Água em Edificações Que Abriguem Múltiplas Economias
São Paulo
2001
ii
ARON LOPES PETRUCCI
(Volume 1)
Área de Concentração:
Engenharia de Construção Civil e Urbana
Orientador:
Orestes Marraccini Gonçalves
São Paulo
2001
iii
AGRADECIMENTOS
SUMÁRIO
1 INTRODUÇÃO ..................................................................................................... 1
2 OBJETIVOS .......................................................................................................... 9
4 APARELHOS ...................................................................................................... 23
4.1. Curvas de Descarga dos Aparelhos.................................................................. 24
6 SISTEMAS .......................................................................................................... 52
6.1. Grafos............................................................................................................... 52
7 CARACTERIZAÇÃO DO USUÁRIO................................................................ 77
7.1. Necessidades Básicas dos Usuários. ................................................................ 78
7.2. Dados sobre o Usuário. .................................................................................... 79
viii
12 APLICAÇÃO................................................................................................... 159
12.1. Análise de resultados ................................................................................... 161
APÊNDICE I...........................................................................................................I-1
I.1 Questionário.......................................................................................................I-1
APÊNDICE III.....................................................................................................III-1
III.1. Utilização da Fórmula Universal. ...............................................................III-1
III.2. Biblioteca Matemática Básica...................................................................III-19
APÊNDICE IV.....................................................................................................IV-1
IV.1. Solução para o Sistema de Equações não Lineares.....................................IV-1
IV.1.1 Fundamentação..........................................................................................IV-1
xii
APÊNDICE VI.....................................................................................................VI-1
VI.1. Função Gama (Γ•) ......................................................................................VI-2
LISTA DE FIGURAS
LISTA DE TABELAS
LISTA DE SIMBOLOS
γ Peso específico;
α Expoente característico da curva vazão x pressão de aparelhos;
σ Desvio padrão;
ρ Massa específica;
ε Rugosidade relativa;
λ Parâmetro descritor da função Gama;
ν Viscosidade cinemática;
σ2 Variança;
χ2 “Qui-quadrado”;
Γ• Função Gama;
∆H (ou DH) Perda de carga;
∆H(Q) Perda de carga provocada pela vazão “Q”;
Cd Coeficiente de descarga;
D, d Diâmetro;
Dg Desnível geométrico;
E Conjunto de arestas de grafo;
F Frequência diária de uso per capita de aparelhos;
f Fator de atrito;
g Aceleração da gravidade;
H Altura manométrica;
He Altura manométrica na entrada;
Hs Altura manométrica na saída;
I Intervalo;
J Perda de carga unitária;
J Matriz jacobiana
k Rugosidade absoluta;
L Comprimento;
LD Comprimento direto;
xxii
LL Comprimento lateral;
M Massa total;
m Massa de componente;
n Número de elementos ou classes;
NF Número de “faces” ou número de eventos equiprováveis;
p Pressão;
p Probabilidade de ocorrência de evento;
pki Propriedade “k” do componente “i”;
Pn “N-ésima” população amostral;
Q Vazão;
q Probabilidade de não ocorrência de evento;
q Vazão média;
Qe Vazão de entrada;
Qs Vazão de saída;
r Parâmetri descritor da função Gama;
R Conjunto de relações entre componentes;
Re Número de Reynolds;
rij Relação entre componente “i” e componente “j”;
t Tempo de duração de evento;
T Intervalo de tempo entre eventos;
v Velocidade;
V Volume; velocidade;
V Conjunto de vértices de grafo;
vi Elemento de V; valor característico para classe de eventos;
w Largura ou dimensão horizontal;
x Média;
x Vetor solução;
y Altura de lâmina d’água;
z Altura;
Z Nível;
xxiii
RESUMO
ABSTRACT
1.1
Normas técnicas de organismos normativos, empresas, companhias
concessionárias de serviços públicos, ou outras fontes.
1.2
Engenheiros projetistas e consultores de sistemas prediais de distribuição de
água e empreendedores de edificações que abriguem múltiplas economias.
5
2 OBJETIVOS
Com isso, será possível uma escolha mais segura e objetiva entre
diversas hipóteses de topologia, dimensionamento, materiais e técnicas
construtivas, de maneira que se possa satisfazer, no maior grau possível, as
necessidades e expectativas dos usuários quanto a desempenho, custos de
implantação e metas ligadas ao uso racional da água.
3.1
No presente trabalho, o termo “carga” ou “carga dinâmica” é utilizado para
p v2
designar toda a energia hidráulica disponível, correspondendo à soma + + z ; já o termo
γ 2⋅ g
pressão refere-se exclusivamente a “p” ou “p/γ”.
15
3.2
Aqui utiliza-se o termo “modelo fechado” em contraposição aos “modelos
abertos”, mesmo que não tenham sido assim definidos por seus mentores.
17
para que os mesmos possam operar de forma satisfatória; além do fato de que esses
modelos não contemplam as especificidades relativas ao tipo de ocupação, à
disponibilidade e característica dos equipamentos sanitários, a diferenças
climáticas e culturais, assim como diversas outras características específicas de um
determinado sistema, grupo de usuários ou ambiente.
3.3
Nesse trabalho, o termo “aparelho” é utilizado segundo o contexto explanado no
Capítulo 4.
21
4 APARELHOS
Qs = f ( H e , C d ) (4.1)
Qs = C d ⋅ H e α (4.2)
1,4
1,2
1,0
Q [L/s]
0,8
0,6
0,4
0,2
0,0
0 45 90 135 180 225 270 315 360
H [KPa]
1,4
1,2
1,0
Q [L/s]
0,8
0,6
0,4
0,2
0,0
0 45 90 135 180 225 270 315 360
H [KPa]
Fig. 4.2 Campo de curvas de descarga para aparelho hipotético, de ajuste contínuo
pelo usuário.
4.1
Para efeito desse estudo, o aparelho é considerado acionado, e em operação
quando, mesmo não apresentando vazão, cumpre algum ciclo característico resultante de ação do
usuário ou ambiente.
28
do volume desejado4.2).
4.2
Como se pode observar, para esse caso, assim como para as torneiras de
lavagem operando com baldes, em que pese tenha sido o usuário a acionar a parada do aparelho, esse
age somente como mecanismo de controle e acionamento, uma vez que o momento de sua ação é
determinado não por sua vontade ou presença, mas pelo preenchimento de um volume pré-estabelecido.
De fato, o usuário pode se afastar do aparelho durante sua operação.
30
t
p= (4.3)
T
q = 1− p (4.4)
32
0,25
0,2
vazão [L/s]
0,15
0,1
0,05
0
0
0
0
40
80
12
16
20
24
28
32
36
40
tempo [s]
Fig. 4.3 Curva tempo x vazão típica para aparelho que exige a presença contínua
do usuário durante a operação.
(t), do aparelho.
70 65
60
Freqüência [%] 50
40
30
19
20 11
10 1 1 2 1
0
5-32 32-59 59-86 86-113 113-140 140-167 167-194
20 18
16
15
Frequência [%]
15
11
10
6 6 6
5 4 4
3
2 22 2 2
1
0
10
12
14
16
18
20
22
24
0
2
4
6
8
Hora do dia
Fig. 4.5 Número de usos de água quente por hora – lavatório (ILHA, 1991).
V
t= 1
(4.5)
Cd ⋅ H 2
1 V dv
t = 1/ 2 ∫ (4.6)
H 0 Cd (v)
4.3
Marca Brastemp, modelo Luxo, Línea Veneza, adquirida em 1988, operando
nível 3, ciclo completo com cerca de 4Kg de roupas.
39
deve-se determinar quais fases acionam esse sistema, quando ocorrem e como são
controladas.
Qe = 1,688 ×10 −2 ⋅ H
1
2
(4.7)
3199
t= 1
(4.8)
H 2
c) análise de dados:
4.4
Não se trata de 2 minutos de vazão, mas alguns segundos iniciais de descarga
para o volume de água, seguido do acionamento da bomba por algum tempo para o esgotamento de
sobras; portanto não se pode utilizar tais dados para a avaliação da vazão de esgotamento.
41
57’58”;
• conjunto de 8 “pulsos” com duração de 6 segundos, espaçados
de 25 segundos, com vazão dada pela equação 4.7 e volume de
consumo de cada “pulso” dado pela equação 4.9.
Vcp = 1,013 × 10 −1 ⋅ H
1
2
(4.9)
0,1 0,12
0,08 0,1
Vazão [L/s]
Vazão [L/s]
0,06 0,08
0,06
0,04
0,04
0,02 0,02
0 0
0:00:00
0:10:00
0:20:00
0:30:00
0:40:00
0:50:00
1:00:00
1:10:00
1:20:00
1:30:00
0:00:00
0:10:00
0:20:00
0:30:00
0:40:00
0:50:00
1:00:00
1:10:00
1:20:00
1:30:00
Tempo Tempo
0,2 0,25
0,2
Vazão [L/s]
Vazão [L/s]
0,15
0,15
0,1 0,1
0,05 0,05
0 0 0:00:00
0:10:00
0:20:00
0:30:00
0:40:00
0:50:00
1:00:00
1:10:00
1:20:00
1:30:00
0:00:00
0:10:00
0:20:00
0:30:00
0:40:00
0:50:00
1:00:00
1:10:00
1:20:00
1:30:00
Tempo Tempo
H=320Kpa H=400Kpa
0,35 0,4
0,3
Vazão [L/s]
0,3
Vazão [L/s]
0,25
0,2 0,2
0,15
0,1 0,1
0,05
0 0
0:00:00
0:10:00
0:20:00
0:30:00
0:40:00
0:50:00
1:00:00
1:10:00
1:20:00
1:30:00
0:00:00
0:10:00
0:20:00
0:30:00
0:40:00
0:50:00
1:00:00
1:10:00
1:20:00
1:30:00
Tempo Tempo
Fig. 4.6 Prováveis perfis de consumo e operação para máquina de lavar roupas
submetidas a diversas alturas de carga na entrada da torneira.
0,7
0,6
0,5
Vazão [L/s]
0,4
0,3
0,2
0,1
0
15:50
16:00
16:10
16:20
16:30
16:40
16:50
17:00
17:10
17:20
17:30
17:40
17:50
18:00
18:10
Tempo
Fig. 4.7 Curva tempo x vazão para aparelho acionado por temporizador.
ii) sistemas onde a vazão pode ser ajustada pelo usuário, durante o
período de operação. Esse tipo de operação proporciona uma vazão ditada pelas
condições de altura de carga presentes, mas, sofrendo correções, mais ou menos
precisas de vazão, conforme a sensibilidade e as preferências do usuário que
amiúde acompanha a operação do aparelho;
5.1
Aqui citado em um sentido completamente amplo, e não especificamente o
espaço sideral com seu conteúdo.
47
5.1. Conceituação.
níveis: ações sobre si mesmos, sobre outros componentes, sobre outras partes do
sistema em que se insere, sobre o meio ambiente.
5.2
Nem tanto complexidade conceitual mas no sentido de ser necessário o estudo
simultâneo de milhares de componentes.
51
tubos e joelhos, “kits” misturadores para chuveiros e outros como será visto no
Capítulo 6.
52
6 SISTEMAS
6.1. Grafos.
V = {a, b, c, d , e, f , g , h} (6.1.a)
E = { a , b , a , c , b, e , c , d , d , e , d , f , f , g , g , g , g , e } (6.1.b)
6.1
Esse sentido de influência pode ser de orientação única, ou bi-orientado. Não se
pode ainda descartar que, em alguns casos, realmente esse sentido de relação coincide com sentidos de
fluxos físicos.
54
a) Árvores.
a b
c d g e f
b) Listas.
h b c d e f
6.2
São denominados folhas os “vértices” , ou “nós”, da árvore que não se ligam a
nenhum nó subseqüente, constituindo assim o final de um possível caminho.
56
lista como a árvore de um único elemento são definidas, assim como a lista vazia.
Água Reservatório
1 2
Registro de gaveta
Entrada de borda
4
3
Tubo
5 Torneira
Tubo Luva 9
Joelho 7 8
6
6.2
Sistemas estruturais ideais, pois sempre existem características dinâmicas nas
estruturas como fluência, deformações lentas, etc.
60
6.3
Estruturas adequadas para armazenamento convencional (gráfico)
freqüentemente não são as mais adequadas para armazenamento eletrônico, ou em sistemas de fichários;
o mesmo ocorre com relação a processamento dos cálculos por meio manual ou eletrônico.
61
1 2 3 4 5 6 7 8 9
1 1 1 1 1 1 1 1 1 1
2 1 1 1 0 0 0 0 0 0
3 0 0 1 1 0 0 0 0 0
4 0 0 0 1 1 0 0 0 0
5 0 0 0 0 1 1 0 0 0
6 0 0 0 0 0 1 1 0 0
7 0 0 0 0 0 0 1 1 0
8 0 0 0 0 0 0 0 1 1
9 0 0 0 0 0 0 0 0 1
Fig. 6.6 Matriz de relação para o sistema apresentado na Figura 6.4.
Como não se pode criar mais de uma aresta com o mesmo sentido
entre dois vértices, pois haveria indução de séria ambigüidade na matriz de
adjacência, uma solução possível seria a associação, como elemento dessa matriz,
não mais de um rótulo do tipo lógico ou um par (x;y) denotando uma relação única,
mas um vetor de pares (x;y), denotando todas as propriedades do componente
“mestre” e sua correspondente, sob uma relação de igualdade no componente
escravo.
1 2 3 4 5 6 7 8 9
2 1 3
3 4
4 5
5 6
6 7
7 8
8 9
9
6.4
Elemento encadeáveis podem ser fichas que trazem apontadores para outras
fichas, ou elementos de dados em computador que trazem apontadores para outros da mesma espécie.
64
6.5
Para efeito da presente discussão toma-se como componente “mestre” aquele
quer exerce determinada influência, e “escravo” aquele que a sofre.
66
a) para que haja uma relação, cada componente “mestre” deve ter
ao menos uma propriedade que se relacione, em igualdade ou simetria, com ao
menos uma de seu “escravo”, podendo ser denominada propriedade de entrada
neste, e de saída naquele;
n
n
R ≡ U {rij } (6.3)
i =1
j =1
( A = B ) ∧ (B = C ) ∴ ( A = C ) (6.4)
Fig. 6.9 Grafo para relações hidráulicas do sistema apresentado na Figura 6.4.
Dado que, para esse caso, assim como para muitos outros casos
práticos, existe um grande número de igualdades, especialmente de vazões, nas leis
internas que regem os componentes, e tanto de vazões como de alturas
manométricas, na descrição das relações, é vantajoso aplicar-se o silogismo
70
6.6
Esse expediente satisfaz a todas as proposições do conjunto de relações, uma
vez que são, por definição, igualdades diretas.
71
x2 = y2
x = x 2 − ∆H 3 ( x1 )
3
x4 = x3 − ∆H 4 ( x1 )
x5 = x4 − ∆H 5 ( x1 ) + Dg 5
x = x5 − ∆H 6 ( x1 ) (6.5)
6
x7 = x6 − ∆H 7 ( x1 ) + Dg 7
x8 = x7 − ∆H 8 ( x1 )
1
x α
x8 = 1
Cd
onde: Dg 5 = Z e5 − Z s 5
Dg 7 = Z e7 − Z s 7
1
x1 α
= y2 − ∆H 3 ( x1 ) − ∆H 4 (x1 ) − ∆H 5 ( x1 ) − ∆H 6 ( x1 ) − ∆H 7 ( x1 ) − ∆H 8 ( x1 ) + Dg5 + Dg8 (6.6)
Cd
possível, que para cada valor de “H” seja calculado um valor de “Q”.
Q=
( H + 24,39871)
0 , 5255217
(6.8)
4,752383
H B 1 = H A1 − ∆ H 1 + 10 ( Z A1 − Z B 1 )
H = H
B1 A2
(6.9)
M
H B (i −1 ) = H Ai
H = H − ∆ H + 10 ( Z − Z )
Bi Ai i Ai Bi
H Bi = H A (i +1 )
M
H Bn = H An − ∆ H n + 10 ( Z An − Z Bn )
76
n
H Beq = H Aeq − ∑ [∆H i + 10 ⋅ ( Z Ai − Z Bi )] (6.10)
i =1
7 CARACTERIZAÇÃO DO USUÁRIO
Os sistemas objeto desse estudo têm sua criação, e por vezes sua
existência, condicionadas à existência de, no mínimo, um usuário.
7.1
Em outros sistemas hidráulicos, como por exemplo aqueles destinados a fins
industriais, pode-se definir como usuário máquinas ou mesmo processos.
79
do usuário, que também deve ser elemento do sistema de informações para projeto
dos sistemas hidráulicos prediais, em especial para as redes de distribuição de
água, é necessário que se faça a sistematização de uma série de dados sobre o
comportamento e preferências do mesmos.
7.2
Aqui, o conceito de plenitude não trata de alcance da ocorrência, mas sim do
fato de que eventos ocorrem ou não ocorrem, independentemente do grau de suas conseqüências, que
depende de estudo específico.
81
uma vez que tenta quantificar aspectos por vezes subjetivos, não tem a capacidade
de gerar valores determinísticos e que possam ser tomados com “status”
semelhante ao de constantes físicas, pois apresentam dispersão, muitas vezes
acentuada.
7.3
Esses valores máximos aparecem exagerados provavelmente por não se tratar de
distribuição normal. Mas, infelizmente, a distribuição de freqüências não está presente no trabalho
consultado.
83
será visto para as vazões mínimas, seria então necessário uma faixa de distribuição
ainda maior.
7.4.
Grandezas associadas ao sistema podem ter suas conseqüências de desrespeito a
limites mais facilmente determináveis, p.e. ao menos teoricamente, ao se exceder a pressão máxima
suportada por um tubo esse apresentará ruptura, não existindo, via de regra, nenhum estado de
tolerância que se deva considerar.
85
reformas ou alterações, visando atingir uma forma em que este possa atender a uma
nova necessidade, um novo nível de necessidade ou uma mudança de hierarquia
dessas necessidades que, até então, não era capaz;
7.5
Ato de acionar, e não fato de estar acionado.
87
8 SIMULAÇÃO DO SISTEMA
máquina (CPU), tampouco com o tempo real, indicado pelo relógio do sistema.
8.1
Visual Component Library.
91
8.2
Existem geradores que não retornam números realmente aleatórios, mas
seqüências caóticas, a partir de determinada semente, de forma que, repetindo-se tal semente, a
seqüência se repete. Para o presente caso é recomendável a utilização de geradores randômicos que
tomem, como semente, eventos ligados ao “hardware” computacional, como tempo entre toque de
teclas, acesso a discos, ou outros eventos similares.
92
8.3
Freqüência esperada para a faixa “i” em “NF” eventos.
93
0,25
0,20
0,15 Distribuição de
base.
0,10 Distribuição
gerada.
0,05
0,00
1 2 3 4 5 6 7 8 9 10
Classes.
8.4
Como as probabilidades acumuladas não podem ser superior a 1, sugere-se
utilizar para “NF” o maior valor de tipo cardinal que a implementação específica da programação
permitir.
94
0,20
0,15
Distribuição de
base.
0,10 Distribuição
gerada.
0,05
0,00
1 2 3 4 5 6 7 8 9 10
Classes.
8.5
Mesmo na leitura de registradores analógicos, como os de agulha tintada sobre
discos de papel, faz-se uma discretização manual ao se determinar os parâmetros da distribuição.
98
0,02
Probabilidade de ocorrência
Sequência obtida
0,015
Sequência esperada
0,01
0,005
0
0 10 20 30 40 50 60 70 80 90 100
Idade [anos]
8.6
População brasileira segundo faixas etárias (0 a 100 anos), fonte: IBGE base
SIDRA ref. Censo-1991. Foram ignorados os classes correspondentes a idade desconhecida e idade
maior que 100 anos.
99
8.7
Há limite físico vinculado ao tamanho da memória disponível, além da restrição
de uma única seqüência por registrador. No entanto o número de registradores a serem utilizados limita-
se somente pela memória disponível.
8.8
O software MS-Excel deve estar instalado na máquina com suas classes OLE
devidamente registradas.
100
8.8
Isso é possível uma vez que se está tratando com tempo discretizado, e não
contínuo.
102
9 SIMULAÇÃO DA POPULAÇÃO
9.1
Esse alcance define as fronteiras de sistema para o presente trabalho.
104
9.2
Para todos os efeitos um conjunto unitário, a menos que alguma característica
específica não o permita, como o caso dos chamados “cortiços”. Pode ainda ser utilizado para designar
grupos que se alternam na ocupação de um sistema comercial ou industrial.
105
Edifício
1
n
Economia
1
n
Família
1
n
Pessoa
inicial estimada.
9.3
Nos dados originais, obtidos junto ao IBGE, não havia discriminação por
idades, entre 15 e 85 anos, mas por grupos de idades, como o trabalho com classes de amplitudes
diferentes introduziria um grau de complexidade desnecessário para a presente demonstração,
distribuiu-se a freqüência de cada grupo de idade uniformemente segundo as classes que o formam.
114
9.3.1. Óbitos.
9.3.2. Nascimentos.
9.4 Dados tomados da Tabela 9.2. Dessa forma, deve-se alertar que há uma inconsistência na tabela 9.4
.
que, embora não inviabilize sua utilização para a demonstração da técnica de simulação, objeto desse trabalho, inviabiliza sua
utilização para casos reais, ou seja, os dados do registro civil são referentes a 1994 e os dados populacionais a 1996.
116
9.5
Na categoria aqui apresentada como “não próprio”, estão somados os valores
correspondentes às categorias Alugado, e Cedido apresentadas pelo IBGE.
120
1,80E-03
1,60E-03
probabilidade de saída
1,40E-03
1,20E-03
1,00E-03
8,00E-04
6,00E-04
4,00E-04
2,00E-04
0,00E+00
1 201 401 601 801 1001 1201 1401 1601 1801 2001
tempo decorrido [dias]
a) o instante de acionamento;
b) o tempo de duração desse acionamento;
c) a vazão determinada pelo usuário
25
20
Percentagem
15
10
0
0 2 4 6 8 10 12 14 16 18 20 22
Horas do dia
Fig. 10.1 Número de usos por hora – chuveiro – dias de semana (ILHA, 1991).
distribuição normal, com média sobre cada hora determinada na Figura 10.1, e
desvio padrão de 30 minutos10.1. A área dessa curva é ajustada para a percentagem
indicada do número de usos em cada classe horária.
5
4,5
4
3,5
Percentagem
3
2,5
2
1,5
1
0,5
0
0 2 4 6 8 10 12 14 16 18 20 22 24 26
Horas do dia
Fig. 10.2 Número de usos por hora – chuveiro – como números nebulosos.
10.1
Valor adotado por considerar-se que o usuário “atrasado” em mais de 1/2 hora,
na realidade é um usuário “adiantado” da hora seguinte. Essa consideração se deve à modularização
adotada no trabalho original (ILHA, 1991), em uma hora.
128
semana;
5
Percentagem
0
0 2 4 6 8 10 12 14 16 18 20 22 24 26
Horas do dia
0,35
0,30
0,25
Probabilidade [%]
0,20
0,15
0,10
0,05
0,00
0 24 48 72 96 120
Horas (5 dias)
0,35
0,30
Probabilidade [%]
0,25
0,20
0,15
0,10
0,05
0,00
0 2 4 6 8 10 12 14 16 18 20 22 24
Hora do dia
Um exemplo dessa correção, para 1,5 usos por dia, com valores já
apresentados em probabilidades, pode ser visto na Figura 10.6
6,00E-03
5,00E-03
4,00E-03
Probabilidade
3,00E-03
2,00E-03
1,00E-03
0,00E+00
0 2 4 6 8 10 12 14 16 18 20 22 24
Hora do dia
10.2
De fato, na implementação utilizada neste trabalho, a curva da Figura 10.6 é
armazenada a cada minuto, e a probabilidade de acionamento é avaliada a cada segundo, tomando-se
como probabilidade de ocorrer acionamento em tal segundo, 1/60 da probabilidade de ocorrer
acionamento no minuto que contém o segundo sob análise. Esse expediente foi necessário para poupar
memória e tempo de execução do sistema.
132
40
35
30
Percentagem
25
20
15
10
5
0
277-512
512-748
748-983
1219-1454
1454-1690
41-277
983-1219
Duração de Uso [s]
0,20
probabilidade [%]
0,15
0,10
0,05
0,00
0
1000
1200
1400
1600
1800
2000
200
400
600
800
50,00
45,00
40,00
probabilidade [% ]
35,00
30,00
25,00
20,00
15,00
10,00
5,00
0,00
1219-1454
1454-1690
277-512
512-748
748-983
983-1219
41-277
0-41
0,15
0,10
0,05
0,00
0
200
400
600
800
1000
1200
1400
1600
1800
2000
35,00
30,00
probabilidade [%]
25,00
20,00
15,00
10,00
5,00
0,00
1219-1454
277-512
512-748
748-983
983-1219
41-277
0-41
Qdes
Cd = α
(10.2)
H disp
45
40
35
Percentagem
30
25
20
15
10
5
0
0,051 -
0,064 -
0,076 -
0,088 -
0,101 -
0,113 -
0,126 -
0,064
0,076
0,088
0,101
0,113
0,126
0,139
Vazão de mistura [L/s]
correto afirmar: ao menos duas populações, uma vez que pode haver mais de duas
populações, desde que todas essas populações se distribuam em somente duas
modas, com diferentes desvios.
P1 ⋅ q1 + P2 ⋅ q 2 = P ⋅ q
P1 + P2 = P
P ⋅ (q − q1 )
P2 = (10.3.a)
q 2 − q1
P1 = P − P2 (10.3.b)
138
5,0
4,0
Percentagem
3,0
2,0
1,0
0,0
0,000
0,020
0,040
0,060
0,080
0,100
0,120
0,140
0,160
Vazão [L/s]
6,00
5,00
4,00
Percentagem
3,00
2,00
1,00
0,00
0,050
0,070
0,090
0,110
0,130
0,150
Vazão [L/s]
4,00
3,50
3,00
Percentagem
2,50
2,00
1,50
1,00
0,50
0,00
0,050
0,070
0,090
0,110
0,130
0,150
Vazão [L/s]
se:
10.3
Os aspectos de bloqueio de usuário e de aparelhos são discutidos no Capítulo
11.
145
automático.
10.4
Esse “trasbordamento” deve-se ao fato do volume do aparelho não ser múltiplo
inteiro da vazão, e ao fato do tempo ser tomado em intervalos inteiros, provocando certa imprecisão na
integração de volumes como vazão x tempo.
146
10.5
Durante todo o presente trabalho, o termo aparelho é utilizado como referência
apenas à parte do aparelho sanitário responsável pelo abastecimento de água, mas não há impedimento
que se estendam os conceitos apresentados para o aparelho sanitário como um todo.
147
manutenção.
familiar
irrestrito
Grupo de
Prédio Aparelhos
Apartamento Usuário
Aposentos pessoais
Para que a simulação possa cobrir tais casos deve ser definido,
para cada aparelho sanitário que possa se apresentar como “inicial” de seqüências
semelhantes, uma lista de aparelhos que serão acionados seqüencialmente à sua
utilização.
Esta abordagem se faz necessária uma vez que não são todos os
153
Processo Gerador
de necessidades.
Despachante
executado a cada intervalo de tempo simulado (segundo a segundo), uma vez que,
dessa forma, para efeito de tempo simulado, o núcleo é executado no intervalo
entre dois “quanta” de tempo, permitindo simular tanto a continuidade de tempo
como a simultaniedade de eventos.
11.2.2. Fila
11.2.3. Despachante.
11.1
O conceito de usuário bloqueado se aplica se o mesmo já estiver na fila por
outra necessidade ou estiver em processo de atendimento por algum aparelho.
156
11.2
Observe que a fila deve ser avaliada para cada necessidade em cada domínio, e
não para cada aparelho; esses conceitos às vezes se confundem especialmente quando, em determinado
domínio, há apenas um aparelho de determinado tipo.
157
11.3
As razões pelas quais esses pontos não são apresentados e incorporados nesse
trabalho advêm principalmente da falta de dados específicos e do fato de não serem essenciais para o
objetivo principal do presente.
11.4
No caso de adultos inválidos a invalidez de acionamento de aparelhos pode se
aplicar a alguns tipos e modelos não se aplicando a todos os disponíveis.
158
aperfeiçoamento, assim como outros que possam surgir, constituam partida para
futuros trabalhos.
159
12 APLICAÇÃO
12.1
Os instantes de acionamento das bacias sanitárias, por falta de dados
específicos, foi tomado igual ao lavatório, corrigindo-se apenas o número de usos diários por pessoa.
162
3,00E-03
2,50E-03
2,00E-03
vazao m3/s
1,50E-03
1,00E-03
5,00E-04
0,00E+00
00:00:00
01:00:00
02:00:00
03:00:00
04:00:00
05:00:00
06:00:00
07:00:00
08:00:00
09:00:00
10:00:00
11:00:00
12:00:00
13:00:00
14:00:00
15:00:00
16:00:00
17:00:00
18:00:00
19:00:00
20:00:00
21:00:00
22:00:00
23:00:00
24:00:00
horas
Como se pode observar, a vazão máxima ocorre por volta das 8:00
horas, e atinge cerca de 2,84 L/s, conduzindo a uma velocidade de 2,92 m/s.
0,00E+00
5,00E-05
1,00E-04
1,50E-04
2,00E-04
2,50E-04
3,00E-04
0,00E+00
5,00E-05
1,00E-04
1,50E-04
2,00E-04
2,50E-04
3,00E-04
1,00E-05
2,00E-05
3,00E-05
4,00E-05
5,00E-05
6,00E-05
1,00E-05
2,00E-05
3,00E-05
4,00E-05
5,00E-05
6,00E-05
0,00E+00
0,00E+00
00:00:00 00:00:00 00:00:00 00:00:00
01:00:00 01:00:00 01:00:00 01:00:00
02:00:00 02:00:00 02:00:00 02:00:00
03:00:00 03:00:00 03:00:00 03:00:00
04:00:00 04:00:00 04:00:00 04:00:00
05:00:00 05:00:00 05:00:00 05:00:00
06:00:00 06:00:00 06:00:00 06:00:00
07:00:00 07:00:00 07:00:00 07:00:00
08:00:00 08:00:00 08:00:00 08:00:00
09:00:00 09:00:00 09:00:00 09:00:00
10:00:00 10:00:00 10:00:00 10:00:00
11:00:00 11:00:00 11:00:00 11:00:00
12:00:00 12:00:00 12:00:00 12:00:00
horas
horas
horas
horas
13:00:00 13:00:00 13:00:00 13:00:00
Apartamento 3
Apartamento 1
Apartamento 27
Apartamento 25
15:00:00 15:00:00 15:00:00 15:00:00
16:00:00 16:00:00 16:00:00 16:00:00
17:00:00 17:00:00 17:00:00 17:00:00
0,00E+00
5,00E-05
1,00E-04
1,50E-04
2,00E-04
2,50E-04
3,00E-04
0,00E+00
5,00E-05
1,00E-04
1,50E-04
2,00E-04
2,50E-04
3,00E-04
1,00E-05
2,00E-05
3,00E-05
4,00E-05
5,00E-05
6,00E-05
1,00E-05
2,00E-05
3,00E-05
4,00E-05
5,00E-05
6,00E-05
0,00E+00
0,00E+00
00:00:00 00:00:00 00:00:00 00:00:00
01:00:00 01:00:00 01:00:00 01:00:00
02:00:00 02:00:00 02:00:00 02:00:00
03:00:00 03:00:00 03:00:00 03:00:00
04:00:00 04:00:00 04:00:00 04:00:00
05:00:00 05:00:00 05:00:00 05:00:00
06:00:00 06:00:00 06:00:00 06:00:00
07:00:00 07:00:00 07:00:00 07:00:00
08:00:00 08:00:00 08:00:00 08:00:00
09:00:00 09:00:00 09:00:00 09:00:00
apartamentos do 1o. andar e para os 4 localizados no 7o. andar.
horas
horas
13:00:00 13:00:00 13:00:00 13:00:00
Apartamento 4
Apartamento 2
Apartamento 28
Apartamento 26
15:00:00 15:00:00 15:00:00 15:00:00
16:00:00 16:00:00 16:00:00 16:00:00
17:00:00 17:00:00 17:00:00 17:00:00
18:00:00 18:00:00 18:00:00 18:00:00
19:00:00 19:00:00 19:00:00 19:00:00
20:00:00 20:00:00 20:00:00 20:00:00
21:00:00 21:00:00 21:00:00 21:00:00
22:00:00 22:00:00 22:00:00 22:00:00
23:00:00 23:00:00 23:00:00 23:00:00
24:00:00 24:00:00 24:00:00 24:00:00
A Figura 12.5 apresenta os gráficos de vazão para os 4
163
164
12.2
Entendeu-se que, no presente estágio de estudo, seria mais esclarecedor
apresentar e comentar tal distorção ao invés de meramente efetuar sua correção e apresentar os
resultados sem o efeito da mesma.
12.3
De fato, utilizando-se a 2a. Lei da Termodinâmica, e tomando-se um chuveiro
com cerca de 4500W de potência útil, a máxima vazão possível para se obter um acréscimo de 18°C na
temperatura, estaria em torno de 6 x 10-5 m3/s.
165
7,00E-04 2,50E-04
6,00E-04
2,00E-04
vazão [m3/s]
vazão [m3/s]
5,00E-04
4,00E-04 1,50E-04
3,00E-04 1,00E-04
2,00E-04
1,00E-04 5,00E-05
0,00E+00 0,00E+00
00:00:00
01:00:00
02:00:00
03:00:00
04:00:00
05:00:00
06:00:00
07:00:00
08:00:00
09:00:00
10:00:00
11:00:00
12:00:00
13:00:00
14:00:00
15:00:00
16:00:00
17:00:00
18:00:00
19:00:00
20:00:00
21:00:00
22:00:00
23:00:00
24:00:00
00:00:00
01:00:00
02:00:00
03:00:00
04:00:00
05:00:00
06:00:00
07:00:00
08:00:00
09:00:00
10:00:00
11:00:00
12:00:00
13:00:00
14:00:00
15:00:00
16:00:00
17:00:00
18:00:00
19:00:00
20:00:00
21:00:00
22:00:00
23:00:00
24:00:00
horas horas
3,00E-04 7,00E-05
2,50E-04 6,00E-05
vazão [m3/s]
vazão [m3/s]
2,00E-04 5,00E-05
4,00E-05
1,50E-04
3,00E-05
1,00E-04
2,00E-05
5,00E-05 1,00E-05
0,00E+00 0,00E+00
00:00:00
01:00:00
02:00:00
03:00:00
04:00:00
05:00:00
06:00:00
07:00:00
08:00:00
09:00:00
10:00:00
11:00:00
12:00:00
13:00:00
14:00:00
15:00:00
16:00:00
17:00:00
18:00:00
19:00:00
20:00:00
21:00:00
22:00:00
23:00:00
24:00:00
00:00:00
01:00:00
02:00:00
03:00:00
04:00:00
05:00:00
06:00:00
07:00:00
08:00:00
09:00:00
10:00:00
11:00:00
12:00:00
13:00:00
14:00:00
15:00:00
16:00:00
17:00:00
18:00:00
19:00:00
20:00:00
21:00:00
22:00:00
23:00:00
24:00:00
horas horas
12.5
Para o presente exemplo, se forem tomados somente as vazões e pressões na
entrada dos aparelhos e na entrada dos ramais, mesmo deixando as vazões de entrada de ramais
implícitas nas de entrada de aparelhos, seriam gerados, para cada dia, tomando-se leituras médias a cada
minuto, um total de 564.480 “leituras”. Caso tal simulação se prolongasse pelo período de 1 ano, para
que ocorressem situações sazonais e feriados, seriam geradas cerca de 206.305.200 leituras,
correspondendo a um arquivo de dados com mais de 1,9 Gbytes de tamanho.
167
13 CONCLUSÃO
registro sistemático da simulação das ações dos usuários e das reações dos sistemas
ser adotada.
implementação adotadas;
questão;
171
levantados em laboratório;
oferecida;
trabalho, mas também pelo seu aperfeiçoamento através dos pontos apresentados
desses sistemas, e por estes, da Construção Civil como um todo, tendo sempre,
como objetivo maior, a melhoria, mesmo que por pequenos passos, da qualidade de
vida do Homem.
174
ANEXO A
∆H = J⋅L (A.2.)
1 L ρ ⋅V 2
∆H = ⋅ f ⋅ ⋅ (A.3.a)
1000 d 2
1 8 ⋅ f ⋅ L ⋅ ρ ⋅ Q2
∆H = ⋅ (A.3.b)
10 9 π
2
⋅d
5
A.1.
Um melhor condicionamento de sistemas de equações é obtido com a
utilização de pressões e perdas expressas em MPa e vazões expressas em L/s. No entanto, para manter
conerência com a NBR 5626/98, e pelo fato dos sistemas de equações utilizados não serem
demasiadamente sensíveis a “desintegrações numéricas”, optou-se por expressar essas grandezas em
kPa e L/s.
177
a) Moody.
b) Souza
Fig. A.2 Fluxograma para determinação do fator de atrito (f) a ser utilizado na
fórmula Universal para problemas do tipo F1. (Unidades SI).
180
Início
Dados
∆ H ; L; d ; k ; ρ ;ν
Incógnita
Q
Regime crítico
D 2⋅ d ⋅ ∆H
2⋅ (Re f − 400 )
Re⋅ f =
ε = − 1
ν L⋅ ρ
400
Laminar
(ε − 1) ⋅ (ε
2
+ 2)
φ1 = 2
4 64
Re f ≤ 400 f =
− (ε + 1) ⋅ (ε − 2 )
2
φ2 = Re f
4
− (Re f 128 ) N
Lm = 10
T. Liso N
Re f ≥ 800
d 800 S T = 2,51
≥
k 14 Re f
S
Turbulento Liso
N −2
T. Rugoso Re f S 2,51
≤ 14 f = − 2 log10
d k d Re f
S k
k
≤ 4 T=
3,71 ⋅ d
N Turbulento Rugoso
N −2
T. Misto Re f S k
≥ 200 f = − 2 log10
k 2,51 d
k 3,71 ⋅ d
T= +
3,71 ⋅ d Re f
N Turbulento Misto
−2
k 2,51
f = − 2 log10 +
3, 71 ⋅d Re f
f = [- 2log 10 (φ 1 ⋅ Lm + φ 2 ⋅ T )]
−2
2
π ⋅d 2 ⋅ d ⋅ ∆H
Q=
4 f ⋅ L⋅ ρ
final
Fig. A.3 Fluxograma para determinação do fator de atrito (f) a ser utilizado na
fórmula Universal para problemas do tipo F2. (Unidades SI).
181
Início
Dados
Q ; ∆ H ; L ; ρ ;ν
Incógnita
d
4⋅Q
M=
k ⋅ π ⋅ν
15
Regime crítico 128 ⋅ Q 3 ⋅ ∆ H
2 ⋅ ( N − 1200 ) π 3 ⋅ L⋅ ρ
ε = −1 N=
900 ν
(ε − 1)2 ⋅ (ε + 2 ) Laminar
φ1 =
4
S 181
− (ε + 1) ⋅ (ε − 2 )
2
φ2 =
N ≤ 1200 f =
4 N 1, 25
− (N 26,907 )
0 , 625
Lm = 10 N
T. Liso N
N ≥ 2100
2100
2
S 4,15
M ≥ T = 0,937
17 N S Turbulento Liso
N −2
T. Rugoso N2 S 4,15
≤ 17 f = − 2 log 10
0,937
2100
2 S 0,38 ⋅ N 1,042 M N
M≤ T=
236 M
N Turbulento Rugoso
N −2
T. Misto N2 S 0,38 ⋅ N 1, 042
≥ 236 f = − 2 log10
M M
0,38 ⋅ N 1,042 4,15
T= +
M N 0,937 N Turbulento Misto
−2
0 , 38 ⋅ N 1, 042 4 ,15
f = − 2 log 10 +
M 0 , 937
N
f = [- 2log10 (φ 1 ⋅ Lm + φ 2 ⋅ T )]− 2
1
8 ⋅ f ⋅ ρ ⋅Q2 ⋅ L 5
d =
2
π ⋅ ∆H
final
Fig. A.4 Fluxograma para determinação do fator de atrito (f) a ser utilizado na
fórmula Universal para problemas do tipo F3. (Unidades SI).
182
Início
Dados
V ; ∆ H ; L; k ; ρ ;ν
Incógnita
d
V3 ⋅ L⋅ ρ
Regime crítico E=
2 ⋅ ∆ H ⋅ν
2 ⋅ (E − 312) V ⋅k
ε = −1 G=
4 ν
(ε − 1) ⋅ (ε
+ 2)
2
Laminar
φ1 =
4
S 8
− (ε + 1) ⋅ (ε − 2)
2
φ2 =
E ≤ 312 f =
4 E
L = 10 − ( E 4⋅ 2 ) N
T. Liso N
E ≥ 316
S 18,83
T= 3
1
G ≤ 27 ⋅ 316 6
E 2 S Turbulento Liso
N −2
T. Rugoso G S 18,83
≤
f = − 2 log10
1
27
S 1,03 ⋅ G E 6
32
E
1
G ≥ 393 ⋅ 316 6 T=
5
E 3 N Turbulento Rugoso
N 1,03 ⋅ G
−2
T. Misto G S
1
≥ 393 f = − 2 log 10
1,03 ⋅ G 18,83 E 6 5
T= + E 3
5 3
E 3 E 2
N Turbulento Misto
−2
1,03 ⋅ G 18,83
f = − 2 log 10 +
5 3
2
E 3 E
f = [- 2log 10 (φ 1 ⋅ Lm + φ 2 ⋅ T )] −2
L ρ ⋅V 2
d= f⋅ ⋅
∆H 2
final
Fig. A.5 Fluxograma para determinação do fator de atrito (f) a ser utilizado na
fórmula Universal para problemas do tipo F4. (Unidades SI).
183
c) Swamee.
0,125
8 k 6 − 16
64 5,74 2500
f = + 9,5 ⋅ ln + − (A.4.)
Re 3, 7 ⋅ d Re 0 ,9
Re
4⋅ Q
onde: Re =
π ⋅ d ⋅ν
A.2.
No presente caso as unidades básicas “Pa” e “m3/s” para pressões e vazões
respectivamente. Ajustes devem ser procedidos para contemplar as unidades expressas na equação A.3.
184
0,125
16 6 −16
64 k 2,51 400
f =
+ 9,5 ⋅ Ln + −
(A.5)
Re f
3,71 ⋅ d Re f Re f
d 2⋅ d ⋅ ∆H
onde: Re f =
ν ρ ⋅L
0,125
8 0,38 ⋅ N 1,042 6 − 16
181 4,15 1200
f = + 9,5 Ln + −
0,937 N
(A.6)
N 1, 25
M N
1,5
128 ⋅ Q 3 ⋅ ∆ H
3
4⋅Q π ⋅ρ ⋅L
onde: M = ; N=
k ⋅ π ⋅ν ν
A.3.
Anotações da disciplina PHD-5012 – Tópicos complementares de Hidráulica I
– aula de 17/03/1998.
185
0,125
8 1,03 ⋅ G 18,83 312 6 −16
8
f = + 9,5 Ln + − (A.7)
E E
53
E 3 2 E
V3⋅ρ ⋅L V ⋅k
onde: E = ; G=
2 ⋅ ∆ H ⋅ν ν
A.4.
Para as determinações de vazões reais, os limites superiores de “Re” podem
exceder ovalor de 293 000 apresentado na Tabela A.2., no entanto, as formulações apresentam-se
bastante adequadas para valores altos desse adimensional.
188
Q 6 1, 75 − 4 , 75
∆H = ⋅ 8,63 × 10 ⋅ Q ⋅d ⋅L (A.8)
Q
Q 8 × 10 − 9 ⋅ f ⋅ L ⋅ ρ ⋅ Q 2
∆H = ⋅ (A.10.)
Q 2
π ⋅d
5
x
s(x ) = (A.11)
x
1, 75 − 4 , 75
∆H = s (Q ) ⋅ 8,63 × 10 6 ⋅ Q ⋅d ⋅L (A.12)
2
8 × 10 − 9 ⋅ f ⋅ L ⋅ ρ ⋅ Q
∆H = s (Q) ⋅ (A.13)
2 5
π ⋅d
A B
A
Fig. A.6 Convenção de sinais para as vazõesB ou outras grandezas de fluxo.
190
A.5. Tês.
A B A B A B
C C C
(a) (b) (c)
A B A B A B
C C C
(d) (e) (f)
Fig. A.7. Configurações de entradas e saídas para conexões tês. (a) passagem
direta e lateral; (b) passagem direta e lateral inverso; (c) saída bi-lateral; (d)
misturador central; (e) misturador lateral; (f) misturador lateral inverso.
A.5.
Aquela em que todas as vazões afluem à peça e aquela em todas efluem da
mesma.
193
saída direta e lateral, para utilização em redes ramificadas, pode ser encontrada na
Tabela A.9.
ou
2
H e = − s (Qe ) ⋅ 250 ⋅ Qe
m = 0,150 Kg
ρ ⋅g⋅ y
H sF =
1000
V
y=
w⋅ L
(Qe − Qs )
V f = Vi + ⋅t
1000
ANEXO B
B.1.
As chamadas referem-se às tabelas do Anexo A, utilizando-se a fórmula de
perda de carga recomendada pela NBR5626/98 (equação A.1.).
201
Tabela A.4.
L=0,40 ; Qe13 = Qs13
13 Ze=0 ; Zs=0
DN 20
H s13 = H e13 − 4,936720 ⋅ Qs131, 75
Tabela A.6. Qe14 = Qs14
14 DN 20
H s14 = H e14 − 1,357598 × 101 ⋅ Qs141,75
Tabela A.4.
L=0,20 ; Qe15 = Qs15
15 Ze=0 ; Zs=0
DN 20
H s15 = H e15 − 2,468360 ⋅ Qs151, 75
Tabela A.4.
L=0,20 ; Qe16 = Qs16
16 Ze=0 ; Zs=0
DN 20
H s16 = H e16 − 2,468360 ⋅ Qs161,75
Tabela A.4.
L=0,20 ; Qe17 = Qs17
17 Ze=0 ; Zs=0
DN 20
H s17 = H e17 − 2,468360 ⋅ Qs171,75
Tabela A.4.
L=0,20 ; Qe18 = Qs18
18 Ze=0 ; Zs=0
DN 20
H s18 = H e18 − 2,468360 ⋅ Qs181, 75
Tabela A.4.
L=0,20 ; Qe19 = Qs19
19 Ze=0 ; Zs=0
DN 20
H s19 = H e19 − 2,468360 ⋅ Qs191,75
Qe 20 = Qs 20
20 item A.6.
H e 20 = 250 ⋅ Qs 20 2
Qe 21 = Qs 21
21 item A.6.
H e 21 = 250 ⋅ Qs 212
Qe 22 = Qs 22
22 item A.6.
H e 22 = 250 ⋅ Qs 22 2
Qe 23 = Qs 23
23 item A.6.
H e 23 = 250 ⋅ Qs 23 2
Qe 24 = Qs 24
24 item A.6.
H e 24 = 250 ⋅ Qs 24 2
209
Fig. B.3 Determinação de pontos e trechos referidos na Tabela B-5
210
H = a + b ⋅ Qc (B.2)
fatores “a”, “b” e “c” são utilizados com toda a precisão disponível.
n
M = ∑ mi (B.4)
i =1
ANEXO C
13
Tabela A.8. Q A13 + QB13 + QC13 = 0
DN – 40 2 equações da Tabela A.7.
Tabela A.4. Q A15 = − QB15
15 1, 75
DN – 32 H B15 = H A15 − 1,193433 ⋅ 5,0 ⋅ s(Q B15 ) ⋅ Q B15
19
Tabela A.8. Q A19 + QB19 + QC19 = 0
DN – 32 2 equações da Tabela A.7.
Tabela A.4. Q A18 = − QB18
18 1, 75
DN – 32 H B18 = H A18 − 1,193433 ⋅ 4,0 ⋅ s (QB18 ) ⋅ QB18
17
Tabela A.8. Q A17 + QB17 + QC17 = 0
DN – 32 2 equações da Tabela A.7.
C.1
Ver Anexo A.
216
23
Tabela A.8. Q A23 + QB 23 + QC 23 = 0
DN – 32 2 equações da Tabela A.7
item B.5. QE 38 = − QS 38
38 1, 902871
eq. B.3 H E 38 = − 24,39871 + 19,41222 ⋅ s (QS 38 ) ⋅ QS 38
26
Tabela A.8 Q A26 + QB 26 + QC 26 = 0
DN – 32 2 equações da Tabela A.7
Tabela A.4. Q A25 = − QB 25
25 1, 75
DN – 32 H B 25 = H A25 − 1,193433 ⋅ 4,0 ⋅ s (QB 25 ) ⋅ QB 25
24
Tabela A.8. Q A24 + QB 24 + QC 24 = 0
DN – 32 2 equações da Tabela A.7
27
Tabela A.8. Q A27 + QB 27 + QC 27 = 0
DN – 32 2 equações da Tabela A.7
Tabela A.4 Q A28 = − QB 28
28 1, 75
DN – 32 H B 28 = H A 28 − 1,193433 ⋅ 5,0 ⋅ s(QB 28 ) ⋅ QB 28
31
Tabela A.8 Q A31 + QB31 + QC 31 = 0
DN – 32 2 equações da Tabela A.7
item B.5. QE 37 = − QS 37
37
eq. B.3 H E 37 = − 24,39871 + 19,41222 ⋅ s (QS 37 ) ⋅ QS 37
1, 902871
Q A43 = − QB 43
43 1, 75
Tabela.C.1 H B 43 = H A 43 − 1,432120 × 101 ⋅ s (Q B 43 ) ⋅ Q B 43
r r r r r r r r r r
1 S 1,40 a 40 b 40,10c 10 b 10,42a 42 b 42,16a 16 b 16,19b 19 a 19,21a 21 b 21,23a 23 b 23,26a26 b 26,28a 28 b 28,31a 31 b
a c c c c c
r16,39 r19,18 r23,38 r26,25 r31,37
e b e b e
r10,41 39 18 38 25 37 r31,43
a a
r18,17 r25,24
a r r13,15 r15,17 c r17,20 r20,22 r22,24 c r24,27 r27,43
41,13
41 b b 13 a a 15 b b 17 a b 20 a a 22 b b 24 a b 27 a b 43 a
c c c
do Anexo A.
X 18 − 5,0 = 0
1,75
X 18 − X 19 − 2,318137 ⋅ s ( − X 1 ) ⋅ − X 1 + 65 = 0
− X + (− X ) + X = 0
3 2 1
" T "− DN 50 H A10 = X 24 ; H B10 = X 20 ; H C10 = X 19
Tabela A7 Q A10 = − X 3 ; Q B10 = − X 2 QC10 = X 1
1,75
X 20 − X 21 − 3,500868 ⋅ s ( − X 2 ) ⋅ − X 2 =0
1,75
X 24 − X 25 − 1,555942 ⋅ s ( − X 3 ) ⋅ − X 3 =0
2
X + X 17 + (− X 4 ) = 0
" T "− DN 40 H A16 = X 21 ; H B16 = X 23 ; H C16 = X 22
Tabela A7 Q
A16 = X 2 ; Q B16 = X 17 ; QC16 = − X 4
X 1,902871
22 + 24,39871 − 19,41222 ⋅ s (− X 4 ) ⋅ − X 4 =0
X 3 + (− X 5 ) = 0
" T "− DN 40 H A13 = X 26 ; H B13 = X 25 ; H C13 = X 46
Tabela A7 Q A13 = − X 5 ; Q B13 = X 3 ; QC13 = 0
1,75
X 26 − X 27 − 5,967165 ⋅ s ( − X 5 ) ⋅ − X 5 =0
− X 8 + ( − X 17 ) + X 6 = 0
" T "− DN 32 H A19 = X 30 ; H B19 = X 23 ; H C19 = X 29
Tabela A7 Q A19 = − X 8 ; Q B19 = − X 17 ; QC19 = X 6
1,75
X 28 − X 29 − 4,773732 ⋅ s ( − X 6 ) ⋅ − X 6 =0
X + X 5 + (− X 6 ) = 0
15
" T "− DN 32 H A17 = X 38 ; H B17 = X 27 ; H C17 = X 28
Tabela A7 Q
A17 = − X 15 ; Q B17 = X 5 ; QC17 = − X 6
− X 7 + (− X 5 ) = 0
H = X 37 ; H B 20 = X 38 ; H C 20 = X 45
" T "− DN 32 A20 C.1
Tabela A7 Q A20 = − X 7 ; Q B 20 = − X 15 ; QC 20 = 0
222
X − X − 5,967165 ⋅ s (− X ) ⋅ − X 1,75 = 0
37 36 7 7
1, 75
X 30 − X 31 − 5,967165 ⋅ s ( − X 8 ) ⋅ − X 8 = 0
X 8 + X 14 + ( − X 9 ) = 0
"T "− DN 32 H A23 = X 31 ; H B 23 = X 32 ; H C 23 = X 33
Tabela A5 Q A23 = X 8 ; QB 23 = X 14 ; QC 23 = − X 9
1,902871
X 33 + 24,39871 − 19,41222 ⋅ s ( − X 9 ) ⋅ − X 9 = 0
( − X 14 ) + ( − X 11 ) + X 10 = 0
"T "− DN 32 H A26 = X 32 ; H B 26 = X 39 ; H C 26 = X 34
Tabela A7 Q A 26 = − X 14 ; QB 26 = − X 11 ; QC 26 = X 10
1,75
X 35 − X 34 − 4,773732 ⋅ s ( − X 10 ) ⋅ − X 10 = 0
X 16 + X 7 + ( − X 10 ) = 0
"T "− DN 32 H A24 = X 44 ; H B 24 = X 36 ; H C 24 = X 35
Tabela A7 Q A24 = X 16 ; QB 24 = X 7 ; QC 24 = − X 10
X + (− X ) = 0
13 16
"T "− DN 32 H A27 = X 43 ; H B 27 = X 44 ; H C 27 = X 47
Tabela A7 Q A27 = X 13 ; QB 27 = − X 16 ; QC 27 = 0
1, 75
X 39 − X 40 − 5,967165 ⋅ s ( − X 11 ) ⋅ − X 11 = 0 C.1(cont)
X + (− X 13 ) + (− X 12 ) = 0
11
"T "− DN 32 H A31 = X 40 ; H B 31 = X 42 ; H C 31 = X 41
Tabela A7 Q
A31 = X 11 ; QB 31 = − X 13 ; QC 31 = − X 12
X + 24,39871 − 19,41222 ⋅ s( − X ) ⋅ − X 1,902871 = 0
41 12 12
X − X − 1,432120 × 101 ⋅ s (− X ) ⋅ − X 1,75 = 0
42 43 13 13
C.2.
O termo “experiências anteriores” refere-se a outras aproximações para a mesma
rede. Todas as aproximações testadas convergiram ao mesmo resultado, variando apenas na velocidade
dessa convergência.
224
ANEXO D
D.1
De fato a distribuição de probabilidades se estende ao infinito, mas deve ser
imposto um limite para efeitos práticos.
228
120
130
140
150
160
170
180
120
130
140
150
160
170
180
120
130
140
150
160
170
180
120
130
140
150
160
170
180
01/01/01 01/01/01 01/01/01 01/01/01
01/01/02 01/01/02 01/01/02 01/01/02
01/01/03 01/01/03 01/01/03 01/01/03
01/01/04 01/01/04 01/01/04 01/01/04
01/01/05 01/01/05 01/01/05 01/01/05
01/01/06 01/01/06 01/01/06 01/01/06
01/01/07 01/01/07 01/01/07 01/01/07
01/01/08 01/01/08 01/01/08 01/01/08
01/01/09 01/01/09 01/01/09 01/01/09
01/01/10 01/01/10 01/01/10 01/01/10
01/01/11 01/01/11 01/01/11
vistos no Apêndice VII.
01/01/11
Datas
01/01/12
Datas
Datas
01/01/12 01/01/12
Datas
01/01/12
D.3 Resultados Obtidos.
Simulação No. 7
01/01/13
Simulação No. 5
Simulação No. 3
01/01/13 01/01/13
Simulação No. 1
01/01/13
01/01/14 01/01/14 01/01/14 01/01/14
120
130
140
150
160
170
180
120
130
140
150
160
170
180
120
130
140
150
160
170
180
120
130
140
150
160
170
180
01/01/01 01/01/01 01/01/01 01/01/01
01/01/02 01/01/02 01/01/02 01/01/02
Datas
01/01/12
Datas
Datas
Datas
01/01/12 01/01/12 01/01/12
01/01/13
Simulação No. 4
Simulação No. 8
01/01/13
Simulação No. 2
01/01/13
Simulação No. 6
01/01/13
01/01/14 01/01/14 01/01/14 01/01/14
01/01/15 01/01/15 01/01/15 01/01/15
01/01/16 01/01/16 01/01/16 01/01/16
01/01/17 01/01/17 01/01/17 01/01/17
01/01/18 01/01/18 01/01/18 01/01/18
01/01/19 01/01/19 01/01/19 01/01/19
01/01/20 01/01/20 01/01/20 01/01/20
01/01/21 01/01/21 01/01/21 01/01/21
230
A Figura D.1 nos permite observar que a cada vez que se executa
uma simulação populacional obtém-se uma distribuição temporal diferente da
população, no entanto, se efetuarmos testes de aderência apropriados, entre as
distribuições, tomando-se como parâmetros representativos algumas estatísticas de
cada uma delas, pode-se observar, dentre outras coisas que:
respectivamente;
Em vista disso, não se pode afirmar igualdade entre dois dias que
tenham apresentado o mesmo número de habitantes, mas apenas entre dois dias que
tenham apresentado o mesmo número de habitantes no prédio, com a mesma
distribuição populacional dentre as economias.
ANEXO E
Figura E.2.
Variável
Variáveis específicas
Genérica
X1 Qe1/Qs1/Qs2/Qe2/Qs3/Qe3/Qsa4
X2 Qe5/Qs5/Qsb4/Qe6
X3 Qe7/Qs7/QsL6
X4 Qe8/Qs8/Qsd6/Qe9/Qs9/Qe10/Qs10
X5 Qe11/Qs11/Qe4/Qs12/Qe12/Qs13/Qe13/Qs14/Qe14
X6 Hs14/He13
X7 Hs13/He12
X8 Hs12/He11
X9 Hs11/He4
X10 HsLa4/He3
X11 Hs3/He2
X12 Hs2/He1
X13 HSLb4/He5
X14 Hs5/He6
X15 HSd6/He8
X16 Hs8/He9
X17 Hs9/He10
X18 HsL6/He7
Variáveis
Variáveis específicas
genéricas
X1 Qe1/Qs1/Qe2/Qs2/Qs3/Qe3/Qsd4
X2 Qe5/Qs5/QsL4
X3 Qe6/Qs6/Qe4/Qsd7
X4 Qe8/Qs8/QsL7
X5 Qe9/Qs9/Qe7/Qsd10
X6 Qe11/Qs11/QsL10
X7 Qe12/Qs12/Qe10/Qsd13
X8 Qe14/Qs14/QsL13
X9 Qe15/Qs15/Qe13/Qsd16
X10 Qe17/Qs17/QsL16
X11 Qe18/Qs18/Qe16/Qsd19
X12 Qe20/Qs20/QsL19
X13 Qe21/Qs21/Qe19
X14 Hs21/He19
X15 HsL19/He20
X16 Hsd19/He18
X17 Hs18/He16
X18 HsL16/He17
X19 Hsd16/He15
X20 Hs15/He13
X21 HsL13/He14
X22 Hsd13/He12
X23 Hs12/He10
X24 HsL10/He11
X25 Hsd10/He9
X26 Hs9/He7
X27 HsL7/He8
X28 Hsd7/He6
X29 Hs6/He4
X30 HsL4/He5
X31 Hsd4/He3
X32 Hs3/He1
X33 Hs1/He2
Sistema de equações
f1 X1+X2-X3=0
f2 X3+X4-X5=0
f3 X5+X6-X7=0
f4 X7+X8-X9=0
f5 X9+X10-X11=0
f6 X11+X12-X13=0
f7 X32-DH1-X33=0
f8 X1-fq(X33;Tipo de RH1-2)=0
f9 X31-DH3-X32+2,9*g*ro=0
f10 X29-DH(Lat)4-X30=0
f11 X2-fq(X30;Tipo de RH1-5)=0
f12 X28-DH6-X29+2,9*g*ro=0
f13 X26-DH(Lat)7-X27=0
f14 X4-fq(X27;Tipo de RH1-8)=0
f15 X25-DH9-X26+2,9*g*ro=0
f16 X23-DH(Lat)10-X24=0
f17 X6-fq(X24;Tipo de RH1-11)=0
f18 X22-DH12-X23+2,9*g*ro=0
f19 X20-DH(Lat)13-X21=0
f20 X8-fq(X21;Tipo de RH1-14)=0
f21 X19-DH15-X20+2,9*g*ro=0
f22 X17-DH(Lat)16-X18=0
f23 X10-fq(X18;Tipo de RH1-17)=0
f24 X16-DH18-X17+2,9*g*ro=0
f25 X14-DH(Lat)19-X15=0
f26 X12-fq(X15;Tipo de RH1-20)=0
f27 X34-DH21-X14+1,1*g*ro=0
f28 X29-DH(Dir)4-X31=0
f29 X26-DH(Dir)7-X28=0
f30 X23-DH(Dir)10-X25=0
f31 X20-DH(Dir)13-X22=0
f32 X17-DH(Dir)16-X19=0
f33 X14-DH(Dir)19-X16=0
E.1.5. Barrilete.
seguir.
Variáveis
Variáveis específicas
genéricas
X1 Qs1/Qe2/Qe1/Qs2/Qe3/Qs3/Qe4/Qs4/Qe5/Qs5/Qe18
X2 Qsb18/Qe17/Qs17/Qe16
X3 Qsd16/Qe14/Qs14/Qe12
X4 Qsd12/Qe11/Qs11/Qe10
X5 Qsd10/Qe8/Qs8/Qe6/Qs6/Qe7
X6 QsL10/Qe9
X7 QsL12/Qe13
X8 QsL16/Qe15
X9 Qsa18/Qe19/Qs19/Qe20
X10 Qsd20/Qe22/Qs22/Qe24
X11 Qsd24/Qe25/Qs25/Qe26
X12 Qsd26/Qe28/Qs28/Qe30/Qs30/Qe29
X13 QsL26/Qe27
X14 QsL24/Qe23
X15 QSL20/Qe21
X16 HsL20/He21
X17 Hs2/He3
X18 Hs3/He4
X19 Hs4/He5
X20 Hs5/He18
X21 Hsb18/He17
X22 Hs17/He16
X23 Hsd16/He14
X24 Hs14/He12
X25 Hsd12/He11
X26 Hs11/He10
X27 Hsd10/He8
X28 Hs8/He6
X29 Hs6/He7
X30 HsL10/He9
X31 HsL12/He13
X32 HsL16/He15
X33 Hsa18/He19
X34 Hs19/He20
X35 Hsd20/He22
X36 Hs22/He24
X37 Hsd24/He25
X38 Hs25/He26
X39 Hsd26/He28
X40 Hs28/He30
X41 Hs30/He29
X42 HsL26/He27
X43 HsL24/He23
E.3 Usuário.
REFERÊNCIAS BIBLIOGRÁFICAS
.
ARON LOPES PETRUCCI
São Paulo
2001
ii
(Volume 2)
Área de Concentração:
Engenharia de Construção Civil e Urbana
Orientador:
Orestes Marraccini Gonçalves
São Paulo
2001
iii
LISTA DE SIMBOLOS
γ Peso específico;
α Expoente característico da curva vazão x pressão de aparelhos;
σ Desvio padrão;
ρ Massa específica;
ε Rugosidade relativa;
λ Parâmetro descritor da função Gama;
ν Viscosidade cinemática;
σ2 Variança;
χ2 “Qui-quadrado”;
Γ• Função Gama;
∆H (ou DH) Perda de carga;
∆H(Q) Perda de carga provocada pela vazão “Q”;
Cd Coeficiente de descarga;
D, d Diâmetro;
Dg Desnível geométrico;
E Conjunto de arestas de grafo;
F Frequência diária de uso per capita de aparelhos;
f Fator de atrito;
g Aceleração da gravidade;
H Altura manométrica;
He Altura manométrica na entrada;
Hs Altura manométrica na saída;
I Intervalo;
J Perda de carga unitária;
J Matriz jacobiana
k Rugosidade absoluta;
L Comprimento;
iv
LD Comprimento direto;
LL Comprimento lateral;
M Massa total;
m Massa de componente;
n Número de elementos ou classes;
NF Número de “faces” ou número de eventos equiprováveis;
p Pressão;
p Probabilidade de ocorrência de evento;
pki Propriedade “k” do componente “i”;
Pn “N-ésima” população amostral;
Q Vazão;
q Probabilidade de não ocorrência de evento;
q Vazão média;
Qe Vazão de entrada;
Qs Vazão de saída;
r Parâmetri descritor da função Gama;
R Conjunto de relações entre componentes;
Re Número de Reynolds;
rij Relação entre componente “i” e componente “j”;
t Tempo de duração de evento;
T Intervalo de tempo entre eventos;
v Velocidade;
V Volume; velocidade;
V Conjunto de vértices de grafo;
vi Elemento de V; valor característico para classe de eventos;
w Largura ou dimensão horizontal;
x Média;
x Vetor solução;
y Altura de lâmina d’água;
z Altura;
Z Nível;
.
I-1
APÊNDICE I
I.1 Questionário
I.1
Grupo de engenheiros responsáveis técnicos pelos escritórios de projetos
hidráulico-sanitários que atendem à grande maioria dos empreendimentos da cidade de Londrina e região
adjacente.
I-2
Resp. 3 - São raros. Tive um cliente que fez estudos de custo direto
sobre algumas alternativas.
I.2
Resultado da soma das notas dadas pelos 4 respondentes.
I-5
Resp. 3 - Não.
Resp. 4 - Não.
13) Caso você disponha de uma ferramenta desse tipo você acha
que efetivamente aprimoraria a base de decisões para suas configurações de projeto?
Por quê?
Resp. 3 - Sim. Para tirar essas dúvidas que hoje são decididas de
forma subjetiva.
Resp. 1 - Sim, mas talvez não quisessem pagar a mais por isso. Mas
tendo a ferramenta já seria um serviço a mais.
I-9
APÊNDICE II
II.1 Questionário
II.1
Resultado da soma das notas dadas pelos 4 respondentes.
II-5
II.2
Válvulas redutoras de pressão.
II-7
Resp. 3 - Sim.
empresa.
APÊNDICE III
// Parâmetro a calcular
uses FUniv;
{$APPTYPE CONSOLE}
var E:TEscoamento;
A:Tagua;
Lc:TPlanetaTerra;
begin;
// Cria o objeto escoamento
E:=TEscoamento.Create;
// Cria o objeto fluido. No caso um tipo específico de fluido: "Água"
A:=Tagua.Create;
// Cria o objeto ambiente. No caso um tipo específico: a Terra
// Define o ambiente
Lc:=TPlanetaTerra.Create;
Lc.nome:='Ambiente padrão';
E.Local:=Lc;
// Define vazão
E.Q:=0.5E-3; // vazão [m3/s]
If FormUniv(E,PC_Perda,FPC_Swamee)=FU_Ok Then
Begin;
Writeln('Perda de Carga igual a: ',E.DH:8:2,' Pa.');
Writeln('Perda de Carga igual a: ',E.DH/1000:8:2,' kPa.');
Writeln('Perda de Carga igual a: ',
E.DH/(E.Fluido.MassaEsp*E.Local.g):8:2,' mH2O.');
Writeln;
Writeln('Rugosidade relativa: ',E.Tubo.RugAbs/E.Tubo.Diam:6:5);
Writeln('Reynolds: ',4*E.Q/(3.1416*E.Tubo.Diam*E.Fluido.ViscCin):8:2);
Writeln('Fator de Atrito: ',E.F:4:3);
End
Else Writeln('Ocorreu um erro no cálculo da Fórmula Universal.');
Writeln;
Writeln('Tecle <enter> para prosseguir...');
Readln;
end.
III-6
unit FUniv;
interface
uses Classes,SysUtils;
//**************************************************************************
//
// Constantes globais e tipos de dados
//
//**************************************************************************
// Formulação a utilizar
// Parâmetro a calcular
// Regime de escoamento
RE_Indefinido = 0;
RE_Laminar = 1;
RE_Critico = 2;
RE_Turbulento = 4;
RE_Liso = 8;
RE_Misto = 16;
RE_Rugoso = 32;
RE_SemEscoamento = 64;
// Tipos de dados
type
EFisicalException = Class (Exception); // impossibilidade física
implementation
III-9
Begin;
Inherited Create;
g:=0;
nome:='';
End;
//--------------------------------------------------------------------------
destructor TAmbiente.Destroy;
Begin;
inherited destroy;
end;
//--------------------------------------------------------------------------
procedure TAmbiente.SetAcelGrav(gx: extended);
Begin;
_AcelGrav:=gx;
End;
//==========================================================================
Begin;
Inherited Create;
Nome:='Terra';
g:=9.81;
End;
//==========================================================================
begin;
Inherited Create;
Nome:= '';
End;
//--------------------------------------------------------------------------
destructor TFluido.Destroy;
Begin;
inherited destroy;
end;
//--------------------------------------------------------------------------
procedure TFluido.SetTemp(Tpt: Extended);
Begin;
_Temper:=Tpt;
_MassaEsp:=MassaEspecificaXTemperatura(Tpt);
_ViscCin:=ViscCinematicaXTemperatura(Tpt);
End;
//--------------------------------------------------------------------------
function TFluido.MassaEspecificaXTemperatura(Tpt: Extended):Extended;
Begin;
result:=0;
End;
//--------------------------------------------------------------------------
III-10
Begin;
result:=0;
End;
//==========================================================================
Begin;
inherited create;
Nome:='água';
Temper:=273.15+20; // 20C expresso em [K]
End;
//--------------------------------------------------------------------------
function TAgua.MassaEspecificaXTemperatura(Tpt: Extended):Extended;
// interpolação linear a partir de dados obtidos de VENNARD E STREET, 1978.
Begin;
T:=Tpt-273.15;
I:=0;
Repeat inc(I) Until (I>10) or (A[I,1]>=T);
If (I>10) or (T<0) Then
Begin;
raise EFisicalException.CreateFmt('Erro no cálculo da massa ' +
'específica da água!',['%']);
Exit;
End;
Result:=A[I-1,2]-(((A[I-1,2]-A[I,2])/10)*(T-A[I-1,1]));
End;
//--------------------------------------------------------------------------
function TAgua.ViscCinematicaXTemperatura(Tpt: Extended):Extended;
//interpolação linear a partir de dados obtidos de VENNARD E STREET, 1978.
Begin;
T:=Tpt-273.15;
I:=0;
Repeat inc(I) Until (I>10) or (A[I,1]>=T);
If (I>10) or (T<0) Then
Begin;
raise EFisicalException.CreateFmt('Erro no cálculo da viscosidade '+
'cinemática da água!',['%']);
Exit;
End;
Result:=A[I-1,2]-(((A[I-1,2]-A[I,2])/10)*(T-A[I-1,1]));
End;
//==========================================================================
III-11
begin;
Inherited Create;
Tipo:='';
Diam:=0;
Comprim:=1;
RugAbs:=0;
End;
//--------------------------------------------------------------------------
destructor TTubo.Destroy;
Begin;
inherited destroy;
end;
//==========================================================================
Begin;
inherited Create;
_Tubo:= TTubo.Create;
_Fluido:= TFluido.Create;
_Local:= TAmbiente.Create;
_Vazao:=0;
_DeltaH:=0;
_CoefAtrito:=0;
_Regime:=RE_Indefinido;
End;
//--------------------------------------------------------------------------
destructor TEscoamento.Destroy;
Begin;
_Tubo.Free;
_Fluido.Free;
_Local.Free;
inherited destroy;
end;
//--------------------------------------------------------------------------
procedure TEscoamento.SetRegime(Reg: Cardinal);
Begin;
RegOk:=(Reg=RE_Laminar) or (Reg=RE_Critico) or (Reg=RE_Turbulento) or
(Reg=(RE_Turbulento+RE_Liso)) or (Reg=(RE_Turbulento+RE_Misto)) or
(Reg=(RE_Turbulento+RE_Rugoso)) or (Reg=(RE_SemEscoamento));
If RegOk Then _Regime:=Reg
Else
Begin;
_Regime:=RE_Indefinido;
raise EFisicalException.CreateFmt('Regime de escoamento '+
'indefinido',['%']);
Exit;
End;
End;
//--------------------------------------------------------------------------
function TEscoamento.GetReynolds;
begin;
result:=(4*_Vazao)/(PI*_Tubo.Diam*_Fluido.ViscCin);
III-12
//
// Implementação das funções de cálculo para os quatro problemas
// propostos: F1 a F4, segundo cada formulação cotada para a determinação
// do fator de atrito "f"
//
Begin;
Re:=4*Q/(PI*D*Ni);
Ex:=Elev(Re,0.9)/(D/K);
If Re<=2500 Then
Begin;
F:=64/Re;
Regime:=RE_Laminar;
End
Else
If Re>=4000 Then
If Ex<=31 Then
Begin;
F:=Elev(-2*Log(5.62/Elev(Re,0.9),10),-2);
Regime:=RE_Turbulento+RE_Liso;
End
Else
If Ex>=448 Then
Begin;
F:=Elev((-2*Log(k/(3.71*D),10)),-2);
Regime:=RE_Turbulento+RE_Rugoso;
End
Else
Begin;
F:=Elev((-2*Log(k/(3.71*D)+5.62/Elev(Re,0.9),10)),-2);
Regime:=RE_Turbulento + RE_Misto;
End
Else
Begin;
Regime:=RE_Critico;
Ep:=2*(Re-2500)/1500-1;
Fi1:=Elev(Ep-1,2)*(Ep+2)/4;
Fi2:=-Elev(Ep+1,2)*(Ep-2)/4;
Lm:=Elev(10,-(Sqrt(Re)/16));
Ex:=Elev(4000,0.9);
If (D/k)>=(Ex/31) Then T:=5.62/Elev(Re,0.9)
III-13
F:=Elev(-2*Log(Fi1*Lm+Fi2*T,10),-2);
End;
Result:=8*F*Ro*L*Q*Q/(PI*PI*Elev(D,5));
End;
//--------------------------------------------------------------------------
function SouzaF2(DH,L,D,K,Ni,Ro:Extended;var F:Extended;var Regime:Cardinal)
:Extended;
// calcula a vazão "Q" em [m3/s]
// dados: DH [Pa]
// L [m]
// D [m]
// K [m]
// Ni [m2/s]
// Ro [Kg/m3]
Begin;
Ref:=(D/Ni)*Sqrt(2*D*DH/(L*Ro));
Ex:=Ref/(D/K);
If Ref<=400 Then
Begin;
F:=Elev(64/Ref,2);
Regime:=RE_Laminar;
End
Else
If Ref>=800 Then
If Ex<=14 Then
Begin;
F:=Elev(-2*Log(2.51/Ref,10),-2);
Regime:=RE_Turbulento+RE_Liso;
End
Else
If Ex>=200 Then
Begin;
F:=Elev((-2*Log(k/(3.71*D),10)),-2);
Regime:=RE_Turbulento + RE_Rugoso;
End
Else
Begin;
F:=Elev((-2*Log(k/(3.71*D)+2.51/Ref,10)),-2);
Regime:=RE_Turbulento + RE_Misto;
End
Else
Begin;
Regime:=RE_Critico;
Ep:=2*(Ref-400)/400-1;
Fi1:=Elev(Ep-1,2)*(Ep+2)/4;
Fi2:=-Elev(Ep+1,2)*(Ep-2)/4;
Lm:=Elev(10,-(Ref/128));
Ex:=800/14;
If (D/k)>=Ex Then T:=2.51/Ref
Else
III-14
F:=Elev(-2*Log(Fi1*Lm+Fi2*T,10),-2);
End;
Result:=(PI*D*D/4)*Sqrt(2*D*DH/(F*L*Ro));
End;
//--------------------------------------------------------------------------
function SouzaF3(Q,DH,L,K,Ni,Ro:Extended;var F:Extended;var Regime:Cardinal)
:Extended;
// calcula o diâmetro "D" em [m]
// dados: Q [m3/s]
// DH [Pa]
// L [m]
// K [m]
// Ni [m2/s]
// Ro [Kg/m3]
Begin;
M:=4*Q/(K*PI*Ni);
N:=Elev((128*Elev(Q,3)*DH)/(Elev(PI,3)*L*Ro),(1/5))/Ni;
If N<=1200 Then
Begin;
F:=181/Elev(N,1.25);
Regime:=RE_Laminar;
End
Else
If N>=2100 Then
If (N*N/M)<=17 Then
Begin;
F:=Elev(-2*Log(4.15/Elev(N,0.937),10),-2);
Regime:=RE_Turbulento + RE_liso;
End
Else
If (N*N/M)>=236 Then
Begin;
F:=Elev((-2*Log(0.38*Elev(N,1.042)/M,10)),-2);
Regime:=RE_Turbulento + RE_Rugoso;
End
Else
Begin;
F:=Elev((-2*Log(4.15/Elev(N,0.937)+0.38*Elev(N,1.042)/M,10)),-2);
Regime:=RE_Turbulento + RE_Misto;
End
Else
Begin;
Regime:=RE_Critico;
Ep:=2*(N-1200)/900-1;
Fi1:=Elev(Ep-1,2)*(Ep+2)/4;
Fi2:=-Elev(Ep+1,2)*(Ep-2)/4;
Lm:=Elev(10,-(Elev(N,0.625)/26.907));
Ex:=2100*2100;
If M>=(Ex/17) Then T:=4.15/Elev(N,0.937)
Else
III-15
F:=Elev(-2*Log(Fi1*Lm+Fi2*T,10),-2);
End;
Result:=Elev(8*F*Ro*Q*Q*L/(PI*PI*DH),(1/5));
End;
//--------------------------------------------------------------------------
function SouzaF4(V,DH,L,K,Ni,Ro:Extended;var F:Extended;var Regime:Cardinal)
:Extended;
// calcula o diâmetro "D" em [m]
// dados: V [m/s]
// DH [Pa]
// L [m]
// K [m]
// Ni [m2/s]
// Ro [Kg/m3]
Begin;
E:=Sqrt(Elev(V,3)*L*Ro/(2*DH*Ni));
G:=V*k/Ni;
Ex:=G/Elev(E,1/6);
If E<=312 Then
Begin;
F:=8/E;
Regime:=RE_Laminar;
End
Else
If E>=316 Then
If Ex<=27 Then
Begin;
F:=Elev(-2*Log(18.83/Elev(E,3/2),10),-2);
Regime:=RE_Turbulento + RE_Liso;
End
Else
If Ex>=393 Then
Begin;
F:=Elev((-2*Log(1.03*G/Elev(E,5/3),10)),-2);
Regime:=RE_Turbulento + RE_Rugoso;
End
Else
Begin;
F:=Elev((-2*Log(1.03*G/Elev(E,5/3) + 18.83/Elev(E,3/2),10)),-2);
Regime:=RE_Turbulento + RE_Misto;
End
Else
Begin;
Regime:=RE_Critico;
Ep:=2*(E-312)/4-1;
Fi1:=Elev(Ep-1,2)*(Ep+2)/4;
Fi2:=-Elev(Ep+1,2)*(Ep-2)/4;
Lm:=Elev(10,-Sqrt(E)/4*Sqrt(2));
Ex:=Elev(316,1/6);
III-16
F:=Elev(-2*Log(Fi1*Lm+Fi2*T,10),-2);
End;
Result:=F*L*Ro*V*V/(2*DH);
End;
//==========================================================================
Begin;
If Q=0 then
Begin;
result:=0;
Regime:=RE_SemEscoamento;
end
else
Begin;
Re:=4*Q/(PI*D*Ni);
Regime:=RE_Laminar;
If Re>2500 Then Regime:=RE_Critico;
If RE>=4000 Then Regime:=RE_Turbulento;
F:=Elev(Elev(64/Re,8)+9.5*Elev(Ln(k/(3.71*D)+5.62/Elev(Re,0.9))
-Elev(2500/Re,6),-16),1/8);
Result:=8*F*L*Ro*Q*Q/(PI*PI*Elev(D,5));
end;
End;
//--------------------------------------------------------------------------
function SwameeF2(DH,L,D,K,Ni,Ro:Extended;var F:Extended;var Regime:Cardinal)
:Extended;
// calcula a vazão "Q" em [m3/s]
// dados: DH [Pa]
// L [m]
// D [m]
// K [m]
// Ni [m2/s]
// Ro [Kg/m3]
Begin;
M:=4*Q/(K*PI*Ni);
N:=Elev(128*Elev(Q,3)*DH/(Elev(PI,3)*Ro*L),1/5)/Ni;
F:=Elev(Elev(181/Elev(N,1.25),8)
+9.5*Elev(Ln(0.38*Elev(N,1.042)/M+4.15/Elev(N,0.937))
-Elev(1200/N,6),-16),1/8);
Result:=Elev(8*F*Ro*Q*Q*L/(PI*PI*DH),1/5);
Re:=4*Q/(PI*Result*Ni);
Regime:=RE_Laminar;
If Re>2500 Then Regime:=RE_Critico;
If RE>=4000 Then Regime:=RE_Turbulento;
End;
//--------------------------------------------------------------------------
function SwameeF4(V,DH,L,K,Ni,Ro:Extended;var F:Extended;
var Regime:Cardinal):Extended;
// calcula o diâmetro "D" em [m]
// dados: V [m/s]
// DH [Pa]
// L [m]
// K [m]
// Ni [m2/s]
// Ro [Kg/m3]
Begin;
E:=Sqrt(Elev(V,3)*Ro*L/(2*DH*Ni));
G:=V*K/Ni;
F:=Elev(Elev(8/E,8)+9.5*Elev(Ln(1.03*G/Elev(E,5/3)+18.83/Elev(E,3/2))
-Elev(312/E,6),-16),1/8);
III-18
//
// função de cálculo para caracterização quantitativa de escoamento
//
Type
TFuncao = function(P1,P2,P3,P4,P5,P6:extended; var P7:extended;
var P8:Cardinal): Extended;
Begin;
result:=FU_Ok;
case ProcessodeCalculo of
FPC_Souza: Begin;
FCalc1:=SouzaF1;
FCalc2:=SouzaF2;
End;
FPC_Swamee: Begin;
FCalc1:=SwameeF1;
FCalc2:=SwameeF2;
End;
else
begin;
result:=FU_ProcessoInvalido;
exit;
end;
End;
Case ParametroDesejado of
PC_Vazao: With Escoamento Do
Begin;
If DH<=0 Then result:=FU_PerdaInvalida;
If Tubo.Diam<=0 Then result:=FU_DiamInvalido;
If Tubo.Comprim<=0 Then result:=FU_ComprimentoInvalido;
If Tubo.RugAbs<=0 Then result:=FU_RugosidadeInvalida;
III-19
Y0:=DH;
X0:=FCalc2(DH,Tubo.Comprim,Tubo.Diam,Tubo.RugAbs,
Fluido.ViscCin,Fluido.MassaEsp,_CoefAtrito,
Rg);
Regime:=Rg;
X1:=0;
X2:=2*X0;
Repeat
X0:=(X1+X2)/2;
Y1:=FCalc1(X0,Tubo.Comprim,Tubo.Diam,Tubo.RugAbs,
Fluido.ViscCin,Fluido.MassaEsp,_CoefAtrito,
Rg);
Regime:=Rg;
If Y1>Y0 Then X2:=X0;
If Y1<Y0 Then X1:=X0;
Until Abs(Y1-Y0)<=Erro_Q;
Q:=X0;
End;
DH:=FCalc1(Q,Tubo.Comprim,Tubo.Diam,Tubo.RugAbs,
Fluido.ViscCin,Fluido.MassaEsp,_CoefAtrito,Rg);
Regime:=Rg;
End;
Else
begin;
result:=FU_ParametroInexistente;
exit;
end;
End;
End;
//--------------------------------------------------------------------------
end.
Interface
Implementation
uses SysUtils;
{--------------------------------------------------------------------------}
Function ArcCos(X:Extended):Extended;
Begin;
If (X>1) Or (X<-1) Then
Begin;
raise EMathError.CreateFmt('Função ArcCos(x) com argumento fora'+
' de faixa.',[]);
exit;
End
Else If X=1 Then ArcCos:=0
Else ArcCos:=Pi/2 - ArcTan(X/Sqrt(-X*X+1));
End;
{--------------------------------------------------------------------------}
Function Pi: Extended;
Begin;
Pi:=4*ArcTan(1);
End;
{--------------------------------------------------------------------------}
Function Elev (A,B: Extended): Extended;
var S: Integer;
Begin;
result:=0; // só para que não dê erro: retorno pode ser indefinido...
If (A>0) and (B<>0) then Elev:=Exp(B*Ln(A)); {no caso do Ln ser definido}
If A=0 then
If (B>0) Then Elev:=0 Else //o Ln não é definido mas a potência é def.
If (B<>0) Then
Begin;
raise EMathError.CreateFmt('Expoente < 0 p/ base nula. Indefinido.',
[]);
Elev:=0;
Exit;
End;
BEGIN;
IF (A<0) OR (B<=0) THEN
Begin; {erro de Runtime, argumento <0 não é definido o logarítimo}
raise EMathError.CreateFmt('Argumento de Logarítimo < 0.',[]);
exit;
End
Else Log:=(ln(A)/ln(B)); {fórmula de Transformação de Base}
End;
{--------------------------------------------------------------------------}
Procedure Gauss(Var A:TMatriz_Gauss;Var B,X:TVetor_Gauss;N:Integer;
Var SL:Boolean);
{--------------------------------------------------------------------------'
' Subrrotina para calculo de sistemas lineares pelo método de eliminação de'
' "GAUSS". A - matriz dos coeficientes '
' B - vetor dos termos independentes '
' X - vetor solução '
' N - grau do sistema '
'--------------------------------------------------------------------------}
{..........................................................................}
{..........................................................................'
' Esta subrotina executa pivotamento parcial do sistema de equações. '
' onde: LP = linha do pivo '
' TP = bandeira de necessidade de pivotamento '
' SL = bandeira de sistema de equações linearmente/ dependentes '
' N = grau do sistema '
' K = coluna sob análise de pivo '
' A = matriz dos coeficientes '
' B = vetor dos termos independentes '
' PV = valor do pivo atual '
' '
'..........................................................................}
VAR LP,I,J : INTEGER;
AUX,PV: EXTENDED;
TP:BOOLEAN;
BEGIN;
LP:=K;
TP:=FALSE;
PV:=A[LP,K];
FOR I:=K+1 TO N DO
IF( ABS (A[I,K]) > ABS (PV)) THEN
BEGIN;
PV:=A[I,K];
LP:=I;
TP:=TRUE;
END;
IF TP THEN
III-23
{..........................................................................}
BEGIN;
FOR K:=1 TO N-1 DO
BEGIN;
PIVOTAMENTO (A,B,K,N,SL);
If Not SL Then
FOR I:=K+1 TO N DO
BEGIN;
M:=A[I,K]/A[K,K];
A[I,K]:=0 ;
FOR J:= K+1 TO N DO A[I,J]:=A[I,J]-M*A[K,J];
B[I]:=B[I]-M*B[K];
END;
END;
Begin;
Tan:=Sin(X)/Cos(X);
End;
{--------------------------------------------------------------------------}
Procedure Eq2G(A,B,C: Extended; var X1,X2:Extended;var Erro:Word);
var Delta:Extended;
Begin;
Delta:=B*B-4*A*C;
If Delta<0 Then
Begin
Erro:=1;
X1:=0;
X2:=0;
III-24
Begin;
Arredonda:=Int(Elev(10,D)*(V+5*Elev(10,-(D+1)))+1E-8)/Elev(10,D);
// esse 1E-8 é para neutralizar um erro no cálculo do INT.
// por exemplo: V=0,465; D=2;
End;
//--------------------------------------------------------------------------
Function Trunca(V:Extended;D:Integer):Extended;
// Retorna "V" truncado "D" decimais
Begin;
Trunca:=Int(Elev(10,D)*V)/Elev(10,D);
End;
//--------------------------------------------------------------------------
Function Fat(N:Cardinal):Extended;
// Calcula fatorial de "N": N! para N<=1754.
Begin;
result:=0; // só para não dar o erro de retorno indefinido
If N=0 Then Fat:=1 // se N=0 então N!=1
Else // se N>0
Try // tenta calcular
Fat:=N*Fat(N-1); // pela regra N!=N*(N-1)!
except // se ouver "estouro" emite mensagem
on EOverflow do
raise EMathError.CreateFmt('Não há capacidade para fatorial '+
'desse porte!',[]);
on EInvalidOp do ;
end;
End;
//--------------------------------------------------------------------------
Function Arranjo(N,P:Cardinal):Extended;
// calcula o número de arranjos de N elementos p a p
Begin;
If P>N Then // se não existe o arranjo
Begin;
raise EMathError.CreateFmt('Não existe arranjo de N elementos P'+
' a P se N<P!',[]);
// emite mensagem de erro e levanta excessão
End
Else // se o arranjo existe
Result:=Fat(N)/Fat(N-P); // calcula Ar(N,P)=N!/(N-P)!
End;
//--------------------------------------------------------------------------
Function Comb(N,P: Cardinal): Extended;
// calcula o número de combinações de N elementos P a P
Begin;
If P>N Then // se não existe a combinação
Begin;
raise EMathError.CreateFmt('Não existe combinação de N elementos'+
' P a P se N<P!',[]);
// emite mensagem de erro e levanta excessão
III-25
Begin;
Dado:=Trunc(Random(NF)+1); // do programa "jogo de dados" da TI-57
End;
//--------------------------------------------------------------------------
Function Sinal (X: Extended): Extended;
{ Retorna um multiplicador que espelha o sinal algébrico do argumento "x" }
{ se X<0 retorna -1 }
{ X=0 retorna +1 (por convenção) }
{ X>0 retorna +1 }
Begin;
If X<0 Then Sinal:=-1 Else Sinal:=1; // a implementação é feita dessa
// forma para evitar erros na
// função módulo ou imprecisões de
End; // divisão.
{--------------------------------------------------------------------------}
// inicialização da biblioteca.
Begin
Randomize; // inicializa semente para rotina de dado.
End.
IV-1
APÊNDICE IV
IV.1.1 Fundamentação
não linear composto por “n” equações, todas arranjadas para a forma:
f i (x ) = f i ( x1 , x 2 ,L , x n ) = 0, i = 1,2,L, n (IV.1)
cada vez mais do valor nulo, até que, ao se atingir tal valor para todas as equações,
dentro da faixa de erro tida como admissível, assume-se que a aproximação tomada
neste momento corresponde ao conjunto solução.
f i ( x k + dx ) = 0, i = 1,2,K, n (IV.2)
∂f i (x k ) ∂f (x ) ∂f (x )
f i (x k ) + ⋅ dx1 + i k ⋅ dx2 + L + i k ⋅ dxn = 0
∂x1 ∂x 2 ∂xn (IV.3)
para i = 1,2,K, n
x k +1 = x k + dx k (IV.5)
IV.1.2. Implementação
Observa-se ainda que, cada linha (i) da matriz “J”, traz todas as
derivadas parciais da i-ésima equação, onde cada coluna (j), traz sua derivada parcial
segundo a j-ésima variável. Dessa forma, pode-se escrever a matriz “J’ como na
equação IV.6.
∂f (x )
J = f ′(x k ) = i k i = 1, n; j = 1, n (IV.6)
∂x j n×n
forma a permitir que, em seu corpo, possam chamar outras funções, proceder
IV-5
IV.1.
Como, pelo fato de se tolerar diversos mecanismos no cálculo de cada função
(fi(x)), torna-se muito difícil estabelecer uma análise de sua continuidade, assim como de sua derivada
primeira, sugere-se que as funções e suas derivadas se mantenham contínuas em todo o espaço de solução
“fisicamente” possível.
IV.2.
Problema Polinomial de Wiggle: se a função y(x) que gera os pontos para
interpolação não tem característica polinomial, então uma tentativa de ajuste de curva polinomial
resultará em oscilações entre sucessivos pontos de y(x) tomados. Tais oscilações tornam-se maiores à
medida em que o grau do polinômio interpolador cresce. (MARON, 1987).
IV-6
∆u k = u k +1 − u k (IV.7)
∆2 u k = ∆(∆u k ) = ∆u k +1 − ∆u k = u k + 2 − 2 ⋅ u k +1 + u k
( )
∆3u k = ∆ ∆2 u k = u k +3 − 3 ⋅ u k + 2 + 3 ⋅ u k +1 − u k
n n
∆n u k = u k + n − u k + n−1 + u k + n−2 − K + (− 1)n u k (IV.8)
1 2
u
M ∆u
u −2 ∆2 u
∆u −2 ∆3u
u −1 ∆2 u −2
∆u −1 ∆3u −2
u0 ∆2 u −1 (IV.9)
∆u 0 ∆3u −1
u1 ∆2 u 0
∆u1 ∆3u 0
u2 ∆2 u1
∆u 2
u3
M
1 1 3s 2 − 6s + 2 3 2s 3 − 9s 2 + 11s − 3 4
P ′( x ) = ∆y 0 + s − ∆2 y 0 + ∆ y0 + ∆ y 0 + K (IV.11)
h 2 6 12
x − x0
onde: s =
h
IV.3.
Na equação IV.11 os termos do triângulo de Pascal foram substituídos por
números de Stirling.
IV-8
mas do valor dessa derivada primeira em um ponto específico, pode-se fazer x = x0,
avaliando-se a derivada primeira da função pela equação IV.12.
1 1 1 1
y (′x0 ) = ∆y ( x0 ) − ∆2 y ( x0 ) + ∆3 y( x0 ) − ∆4 y ( x0 ) + K (IV.12)
h 2 3 4
interface
// Tipos de Dados.
Type TVetor = array[1..MaxDim] of Extended; // vetor de números reais
// Variáveis globais
var IntCont: Integer;
implementation
{Implementação dos protótipos acima definidos}
{---------------------------------------------------------------------------}
Function D1x (F:TFdeX;X0:Extended):Extended;
{............................................................................
' Calcula a derivada primeira de f(x), no ponto X0
' onde: F - funcao f(x) (escalar)
' X0 - ponto de avaliacao da derivada
'
'............................................................................}
var
A: Array [0..8,0..9] of Extended; { Tabela de Diferenças}
H,DX,X: Extended;
I,J,N,S: Integer;
Begin;
For I:=0 To N Do
Begin;
X:=(X0+I*H); {calcula os valores dos xi}
A[I,0]:=F(X);
End;
For I:=1 To N Do
For J:=0 To N-1 Do
A[J,I]:=A[J+1,I-1]-A[J,I-1]; // constroi a tabela de diferenças
DX:=0;
For I:=1 To N Do // efetua a soma correspondente ao interior do
Begin; // parênteses da equação IV.12.
S:=(I Mod 2)*2-1; // determina o sinal de cada termo
DX:=DX+S*A[0,I]/I;
End;
DX:=DX/H; // completa a avaliação da euação IV.12
result:=DX; // retorna o valor da derivada
End;
{---------------------------------------------------------------------------}
Function FvXcte (X:TVetor;IV:Integer;X0:Extended): Extended;
{calcula o valor da funcao a ser derivada, com o vetor X, substituindo
o valor da variavel a ser derivada (indicado por IV), pelo valor de
X0. Isso como que transforma a funcao vetorial em uma funcao de f(x)}
Begin;
X[IV]:=X0;
FvXcte:=Fx(X);
End;
IV-10
Begin;
Fxa:=FvXcte(Xv,IV,X0);
End;
{---------------------------------------------------------------------------}
Function DPar(F:TFvet; XY:TVetor; IV1:Integer):Extended;
{Funcao principal. Coloca nas variaveis globais aquelas passadas por valor e
pede o calculo da derivada primeira da funcao "F" no ponto indicado pelo
valor constante do vetor XY, na posicao da variavel derivativa, indicada
por IV}
Begin;
XV:=XY;
IV:=IV1;
Fx:=F;
Dpar:=D1x(Fxa,XV[IV]);
End;
{---------------------------------------------------------------------------}
Procedure NRaph1 (M:TmFvx; var X1:TVetor; N:Integer; Err:Extended);
{...........................................................................
' Resolve um sistema não linear de equações, de grau "N", propostas como
' funções no vetor M[].
' onde: M[] - vetor com as funções do tipo:
' "function f1 (X:TVetor): Extended;"
' X1[] - vetor solução, entra com a aproximação inicial e, ao final,
' contém a solução
' N - grau do sistema
' Err - erro absoluto máximo estabelecido para parada das iterações
............................................................................}
var A: TMatriz_Gauss;
DX,V: TVetor_Gauss;
T,SL: Boolean;
I,J: Integer;
X: TVetor;
Begin;
X:=X1; // copia o vetor da primeira aproximação para um vetor auxiliar
For I:=1 To N Do For J:=1 To N Do A[I,J]:=0; // cria uma matriz NxN "nula"
// para conter a matriz "Jacobiana"
IV.5.
Tecnicamente são passados “ponteiros” ou “endereços”, onde o sistema pode
encontrar a verdadeira implementação das mesmas.
IV-12
interface
implementation
// implementação de cada uma das funções, tendo X[1] a X[n] como sendo as
// incógnitas procuradas
{---------------------------------------------------------------------------}
function f1 (X:TVetor): Extended;
Begin;
f1:=X[10]-2;
End;
{.........................}
function f2 (X:TVetor): Extended;
Begin;
f2:=X[10]-X[11]-1.432120*Elev(X[1],1.75);
End;
{.........................}
function f3 (X:TVetor): Extended;
Begin;
f3:=X[11]-X[12]-2.983583*Elev(X[1],1.75) + 25;
End;
{........................}
function f4 (X:TVetor): Extended;
Begin;
f4:=X[12]-X[13]-1.790149*Elev(X[1],1.75);
End;
{.........................}
function f5 (X:TVetor): Extended;
Begin;
IV-13
Listagem IV.2. – Funções do sistema não linear para exemplo do Anexo B.(cont.)
f5:=X[13]-X[14]-7.160598E-1*Elev(X[1],1.75);
End;
{.........................}
function f6 (X:TVetor): Extended;
Begin;
f6:=X[2]+X[6]-X[1];
End;
{........................}
function f7 (X:TVetor): Extended;
Begin;
f7:=X[14]-X[15]-1.074090*Elev(X[2],1.75);
End;
{.........................}
function f8 (X:TVetor): Extended;
Begin;
f8:=X[14]-X[25]-3.699642*Elev(X[6],1.75);
End;
{.........................}
function f9 (X:TVetor): Extended;
Begin;
f9:=X[15]-X[16]-4.773732E-1*Elev(X[2],1.75);
End;
{........................}
function f10 (X:TVetor): Extended;
Begin;
f10:=X[3]+X[7]-X[2];
End;
{........................}
function f11 (X:TVetor): Extended;
Begin;
f11:=X[16]-X[17]-1.074090*Elev(X[3],1.75);
End;
{.........................}
function f12 (X:TVetor): Extended;
Begin;
f12:=X[16]-X[27]-3.699642*Elev(X[7],1.75);
End;
{.........................}
function f13 (X:TVetor): Extended;
Begin;
f13:=X[17]-X[18]-1.582762*Elev(X[3],1.75);
End;
{........................}
function f14 (X:TVetor): Extended;
Begin;
f14:=X[4]+X[8]-X[3];
End;
{.........................}
function f15 (X:TVetor): Extended;
Begin;
f15:=X[18]-X[19]-3.165523*Elev(X[4],1.75);
End;
{.........................}
function f16 (X:TVetor): Extended;
IV-14
Listagem IV.2. – Funções do sistema não linear para exemplo do Anexo B.(cont.)
Begin;
f16:=X[18]-X[29]-9.496569*Elev(X[8],1.75);
End;
{........................}
function f17 (X:TVetor): Extended;
Begin;
f17:=X[19]-X[20]-4.936720*Elev(X[4],1.75);
End;
{.........................}
function f18 (X:TVetor): Extended;
Begin;
f18:=X[5]+X[9]-X[4];
End;
{.........................}
function f19 (X:TVetor): Extended;
Begin;
f19:=X[20]-X[21]-8.639258*Elev(X[5],1.75);
End;
{........................}
function f20 (X:TVetor): Extended;
Begin;
f20:=X[20]-X[31]-2.838613E1*Elev(X[9],1.75);
End;
{........................}
function f21 (X:TVetor): Extended;
Begin;
f21:=X[21]-X[22]-4.936720*Elev(X[5],1.75);
End;
{.........................}
function f22 (X:TVetor): Extended;
Begin;
f22:=X[22]-X[23]-1.357598E1*Elev(X[5],1.75);
End;
{.........................}
function f23 (X:TVetor): Extended;
Begin;
f23:=X[23]-X[24]-2.468360*Elev(X[5],1.75);
End;
{........................}
function f24 (X:TVetor): Extended;
Begin;
f24:=X[25]-X[26]-2.468360*Elev(X[6],1.75);
End;
{.........................}
function f25 (X:TVetor): Extended;
Begin;
f25:=X[27]-X[28]-2.468360*Elev(X[7],1.75);
End;
{.........................}
function f26 (X:TVetor): Extended;
Begin;
f26:=X[29]-X[30]-2.468360*Elev(X[8],1.75);
End;
IV-15
Listagem IV.2. – Funções do sistema não linear para exemplo do Anexo B.(cont.)
{........................}
function f27 (X:TVetor): Extended;
Begin;
f27:=X[31]-X[32]-2.468360*Elev(X[9],1.75);
End;
{.........................}
function f28 (X:TVetor): Extended;
Begin;
f28:=250*X[6]*X[6]-X[26];
End;
{.........................}
function f29 (X:TVetor): Extended;
Begin;
f29:=250*X[7]*X[7]-X[28];
End;
{........................}
function f30 (X:TVetor): Extended;
Begin;
f30:=250*X[8]*X[8]-X[30];
End;
{........................}
function f31 (X:TVetor): Extended;
Begin;
f31:=250*X[9]*X[9]-X[32];
End;
{........................}
function f32 (X:TVetor): Extended;
Begin;
f32:=250*X[5]*X[5]-X[24];
End;
{........................}
{---------------------------------------------------------------------------}
initialization
Listagem IV.2. – Funções do sistema não linear para exemplo do Anexo B.(cont.)
A[23]:=f23;
A[24]:=f24;
A[25]:=f25;
A[26]:=f26;
A[27]:=f27;
A[28]:=f28;
A[29]:=f29;
A[30]:=f30;
A[31]:=f31;
A[32]:=f32;
end.
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
//============================================================================
procedure TForm1.Button1Click(Sender: TObject);
Var I: Integer;
X: TVetor;
T1,T2: TDateTime;
R:TTimeStamp;
IV-17
interface
implementation
{--------------------------------------------------------------------------}
// rotina auxiliar para proporcionar redução de código na implementação do
// componente "Tê".
Begin;
Case DN of
50: Begin;
DHAB:=2.965058E-1*Elev(Abs(Qb),1.75);
DHAC:=9.838603E-1*Elev(Abs(Qc),1.75);
DHBA:=2.965058E-1*Elev(Abs(Qa),1.75);
DHBC:=9.838603E-1*Elev(Abs(Qc),1.75);
DHCA:=9.838603E-1*Elev(Abs(Qa),1.75);
DHCB:=9.838603E-1*Elev(Abs(Qb),1.75);
End;
40: Begin;
DHAB:=5.834779E-1*Elev(Abs(Qb),1.75);
DHAC:=1.789332*Elev(Abs(Qc),1.75);
DHBA:=5.834779E-1*Elev(Abs(Qa),1.75);
DHBC:=1.789332*Elev(Abs(Qc),1.75);
DHCA:=1.789332*Elev(Abs(Qa),1.75);
DHCB:=1.789332*Elev(Abs(Qb),1.75);
End;
32: Begin;
DHAB:=1.074090*Elev(Abs(Qb),1.75);
IV-19
Listagem IV.4. – Funções do sistema não linear para exemplo do Anexo C. (cont)
DHAC:=3.699642*Elev(Abs(Qc),1.75);
DHBA:=1.074090*Elev(Abs(Qa),1.75);
DHBC:=3.699642*Elev(Abs(Qc),1.75);
DHCA:=3.699642*Elev(Abs(Qa),1.75);
DHCB:=3.699642*Elev(Abs(Qb),1.75);
End;
End;
// parte f1
Case Round(Sinal(Qa)) of
1:Case Round(Sinal(Qb)) of
1:Case Round(Sinal(Qc)) of
1:ShowMessage('Erro na Lei dos nós Tê No. 4');
-1:f1:=Hc-DHCA-Ha;
End;
-1:Case Round(Sinal(Qc)) of
1:f1:=Hb-DHBA-Ha;
-1:f1:=Hb-DHAB-Ha;
End;
End;
-1:Case Round(Sinal(Qb)) of
1:Case Round(Sinal(Qc)) of
1:f1:=Ha-DHAB-Hb;
-1:f1:=Ha-DHBA-Hb;
End;
-1:Case Round(Sinal(Qc)) of
1:f1:=HB-DHCB-Hc;
-1:ShowMessage('Erro na Lei dos nós Tê No. 4');
End;
End;
End;
// parte f2
Case Round(Sinal(Qa)) of
1:Case Round(Sinal(Qb)) of
1:Case Round(Sinal(Qc)) of
1:ShowMessage('Erro na Lei dos nós Tê No. 4'); // + + +
-1:f2:=Hc-DHCB-Hb; // + + -
End;
-1:Case Round(Sinal(Qc)) of
1:f2:=Hb-DHBC-HC; // + - +
-1:f2:=HC-DHAC-Ha; // + - -
End;
End;
-1:Case Round(Sinal(Qb)) of
1:Case Round(Sinal(Qc)) of
1:f2:=Ha-DHAC-Hc; // - + +
-1:f2:=Hc-DHBC-Hb; // - + -
End;
-1:Case Round(Sinal(Qc)) of
1:f2:=HA-DHCA-Hc; // - - +
-1:ShowMessage('Erro na Lei dos nós Tê No. 4'); // - - -
End;
End;
End;
End;
{---------------------------------------------------------------------------)
// implementação de cada uma das funções, tendo X[1] a X[n] como sendo as
// incógnitas procuradas; os números em comentário sob a declaração
// indicam o número do componente a que se referem.
{---------------------------------------------------------------------------}
function f1 (X:TVetor): Extended;
// -1-
Begin;
f1:=X[18]-5;
IV-20
Listagem IV.4. – Funções do sistema não linear para exemplo do Anexo C. (cont)
End;
{.........................}
function f2 (X:TVetor): Extended;
// -40-
Begin;
f2:=X[18]-X[19]-2.318137*Sinal(-X[1])*Elev(Abs(-X[1]),1.75)+65;
End;
{.........................}
function f3 (X:TVetor): Extended;
// -10-
Begin;
f3:=-X[3]+(-X[2])+X[1];
End;
{........................}
function f4 (X:TVetor): Extended;
// -10-
var R,R1:Extended;
Begin;
CalcTe(R,R1,50,-X[3],-X[2],X[1],X[24],X[20],X[19]);
f4:=R;
End;
{.........................}
function f5 (X:TVetor): Extended;
// -10-
var R,R1:Extended;
Begin;
CalcTe(R,R1,50,-X[3],-X[2],X[1],X[24],X[20],X[19]);
f5:=R1;
End;
{.........................}
function f6 (X:TVetor): Extended;
// -42-
Begin;
f6:=X[20]-X[21]-3.500868*Sinal(-X[2])*Elev(Abs(-X[2]),1.75);
End;
{.........................}
function f7 (X:TVetor): Extended;
// -41-
Begin;
f7:=X[24]-X[25]-1.555941*Sinal(-X[3])*Elev(Abs(-X[3]),1.75);
End;
{.........................}
function f8 (X:TVetor): Extended;
// -16-
Begin;
f8:=X[2]+X[17]+(-X[4]);
End;
{........................}
function f9 (X:TVetor): Extended;
// -16-
var R1,R2: Extended;
Begin;
CalcTe(R1,R2,40,X[2],X[17],-X[4],X[21],X[23],X[22]);
f9:=R1;
End;
{.........................}
function f10 (X:TVetor): Extended;
// -16-
var R1,R2: Extended;
Begin;
IV-21
Listagem IV.4. – Funções do sistema não linear para exemplo do Anexo C. (cont)
CalcTe(R1,R2,40,X[2],X[17],-X[4],X[21],X[23],X[22]);
f10:=R2;
End;
{.........................}
function f11 (X:TVetor): Extended;
// -39-
Begin;
f11:=X[22]+24.39871-19.41222*Sinal(-X[4])*Elev(Abs(-X[4]),1.902871);
End;
{........................}
function f12 (X:TVetor): Extended;
// -13-
Begin;
f12:=X[3]+(-X[5]);
End;
{........................}
function f13 (X:TVetor): Extended;
// -13-
var R1,R2: Extended;
Begin;
CalcTe(R1,R2,40,-X[5],X[3],0,X[26],X[25],X[46]);
f13:=R1;
End;
{.........................}
function f14 (X:TVetor): Extended;
// -13-
var R1,R2: Extended;
Begin;
CalcTe(R1,R2,40,-X[5],X[3],0,X[26],X[25],X[46]);
f14:=R2;
End;
{.........................}
function f15 (X:TVetor): Extended;
// -15-
Begin;
f15:=X[26]-X[27]-5.967165*Sinal(-X[5])*Elev(Abs(-X[5]),1.75);
End;
{........................}
function f16 (X:TVetor): Extended;
// -19-
Begin;
f16:=-X[8]+(-X[17])+X[6];
End;
{........................}
function f17 (X:TVetor): Extended;
// -19-
var R1,R2: Extended;
Begin;
CalcTe(R1,R2,32,-X[8],-X[17],X[6],X[30],X[23],X[29]);
f17:=R1;
End;
{.........................}
function f18 (X:TVetor): Extended;
// -19-
var R1,R2: Extended;
Begin;
CalcTe(R1,R2,32,-X[8],-X[17],X[6],X[30],X[23],X[29]);
f18:=R2;
End;
{.........................}
IV-22
Listagem IV.4. – Funções do sistema não linear para exemplo do Anexo C. (cont)
function f19 (X:TVetor): Extended;
// -18-
Begin;
f19:=X[28]-X[29]-4.773732*Sinal(-X[6])*Elev(Abs(-X[6]),1.75);
End;
{.........................}
function f20 (X:TVetor): Extended;
// -17-
Begin;
f20:=X[15]+X[5]+(-X[6]);
End;
{........................}
function f21 (X:TVetor): Extended;
// -17-
var R1,R2: Extended;
Begin;
CalcTe(R1,R2,32,X[15],X[5],-X[6],X[38],X[27],X[28]);
f21:=R1;
End;
{.........................}
function f22 (X:TVetor): Extended;
// -17-
var R1,R2: Extended;
Begin;
CalcTe(R1,R2,32,X[15],X[5],-X[6],X[38],X[27],X[28]);
f22:=R2;
End;
{.........................}
function f23 (X:TVetor): Extended;
// -20-
Begin;
f23:=-X[7]+(-X[15]);
End;
{........................}
function f24 (X:TVetor): Extended;
// -20-
var R1,R2: Extended;
Begin;
CalcTe(R1,R2,32,-X[7],-X[15],0,X[37],X[38],X[45]);
f24:=R1;
End;
{.........................}
function f25 (X:TVetor): Extended;
// -20-
var R1,R2: Extended;
Begin;
CalcTe(R1,R2,32,-X[7],-X[15],0,X[37],X[38],X[45]);
f25:=R2;
End;
{.........................}
function f26 (X:TVetor): Extended;
// -22-
Begin;
f26:=X[37]-X[36]-5.967165*Sinal(-X[7])*Elev(Abs(-X[7]),1.75);
End;
{.........................}
function f27 (X:TVetor): Extended;
// -21-
Begin;
f27:=X[30]-X[31]-5.967165*Sinal(-X[8])*Elev(Abs(-X[8]),1.75);
IV-23
Listagem IV.4. – Funções do sistema não linear para exemplo do Anexo C. (cont)
End;
{........................}
function f28 (X:TVetor): Extended;
// -23-
Begin;
f28:=X[8]+X[14]+(-X[9]);
End;
{........................}
function f29 (X:TVetor): Extended;
// -23-
var R1,R2: Extended;
Begin;
CalcTe(R1,R2,32,X[8],X[14],-X[9],X[31],X[32],X[33]);
f29:=R1;
End;
{.........................}
function f30 (X:TVetor): Extended;
// -23-
var R1,R2: Extended;
Begin;
CalcTe(R1,R2,32,X[8],X[14],-X[9],X[31],X[32],X[33]);
f30:=R2;
End;
{.........................}
function f31 (X:TVetor): Extended;
// -38-
Begin;
f31:=X[33]+24.39871-19.41222*Sinal(-X[9])*Elev(Abs(-X[9]),1.902871);
End;
{........................}
function f32 (X:TVetor): Extended;
// -26-
Begin;
f32:=-X[14]+(-X[11])+X[10];
End;
{........................}
function f33 (X:TVetor): Extended;
// -26-
var R1,R2: Extended;
Begin;
CalcTe(R1,R2,32,-X[14],-X[11],X[10],X[32],X[39],X[34]);
f33:=R1;
End;
{.........................}
function f34 (X:TVetor): Extended;
// -26-
var R1,R2: Extended;
Begin;
CalcTe(R1,R2,32,-X[14],-X[11],X[10],X[32],X[39],X[34]);
f34:=R2;
End;
{.........................}
function f35 (X:TVetor): Extended;
// -25-
Begin;
f35:=X[35]-X[34]-4.773732*Sinal(-X[10])*Elev(Abs(-X[10]),1.75);
End;
{.........................}
function f36 (X:TVetor): Extended;
// -24-
Begin;
IV-24
Listagem IV.4. – Funções do sistema não linear para exemplo do Anexo C. (cont)
f36:=X[16]+X[7]+(-X[10]);
End;
{........................}
function f37 (X:TVetor): Extended;
// -24-
var R1,R2: Extended;
Begin;
CalcTe(R1,R2,32,X[16],X[7],-X[10],X[44],X[36],X[35]);
f37:=R1;
End;
{.........................}
function f38 (X:TVetor): Extended;
// -24-
var R1,R2: Extended;
Begin;
CalcTe(R1,R2,32,X[16],X[7],-X[10],X[44],X[36],X[35]);
f38:=R2;
End;
{.........................}
function f39 (X:TVetor): Extended;
// -27-
Begin;
f39:=X[13]+(-X[16]);
End;
{........................}
function f40 (X:TVetor): Extended;
// -27-
var R1,R2: Extended;
Begin;
CalcTe(R1,R2,32,X[13],-X[16],0,X[43],X[44],X[47]);
f40:=R1;
End;
{.........................}
function f41 (X:TVetor): Extended;
// -27-
var R1,R2: Extended;
Begin;
CalcTe(R1,R2,32,X[13],-X[16],0,X[43],X[44],X[47]);
f41:=R2;
End;
{.........................}
function f42 (X:TVetor): Extended;
// -28-
Begin;
f42:=X[39]-X[40]-5.967165*Sinal(-X[11])*Elev(Abs(-X[11]),1.75);
End;
{.........................}
function f43 (X:TVetor): Extended;
// -31-
Begin;
f43:=X[11]+(-X[13])+(-X[12]);
End;
{........................}
function f44 (X:TVetor): Extended;
// -31-
var R1,R2: Extended;
Begin;
CalcTe(R1,R2,32,X[11],-X[13],-X[12],X[40],X[42],X[41]);
f44:=R1;
IV-25
Listagem IV.4. – Funções do sistema não linear para exemplo do Anexo C. (cont)
End;
{.........................}
function f45 (X:TVetor): Extended;
// -31-
var R1,R2: Extended;
Begin;
CalcTe(R1,R2,32,X[11],-X[13],-X[12],X[40],X[42],X[41]);
f45:=R2;
End;
{.........................}
function f46 (X:TVetor): Extended;
// -37-
Begin;
f46:=X[41]+24.39871-19.41222*Sinal(-X[12])*Elev(Abs(-X[12]),1.902871);
End;
{........................}
function f47 (X:TVetor): Extended;
// -43-
Begin;
f47:=X[42]-X[43]-1.432120E1*Sinal(-X[13])*Elev(Abs(-X[13]),1.75);
End;
{........................}
{---------------------------------------------------------------------------}
initialization
Listagem IV.4. – Funções do sistema não linear para exemplo do Anexo C. (cont)
A[37]:=f37;
A[38]:=f38;
A[39]:=f39;
A[40]:=f40;
A[41]:=f41;
A[42]:=f42;
A[43]:=f43;
A[44]:=f44;
A[45]:=f45;
A[46]:=f46;
A[47]:=f47;
end.
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
//===========================================================================
procedure TForm1.Button1Click(Sender: TObject);
Var I: Integer;
X: TVetor;
T1,T2: TDateTime;
R:TTimeStamp;
IV-27
APÊNDICE V
V.1. Relógio-calendário.
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
MyDelphiUnit02, MyDelphiUnit04,ExtCtrls;
protected
{ Protected declarations }
procedure MudaData; dynamic; // dispara se houve mudança de data
procedure MudaHora; dynamic; // dispara se houve mudança de hora
public
{ Public declarations }
property RData:TData read FDia; // data atual
property RHora:THora read FHora; // hora atual
property AutomLig: Boolean Read GetAutomLig; // estado doautomático
published
V-3
end;
procedure Register;
//=========================================================================
implementation
//-------------------------------------------------------------------------
procedure Register;
// Registra o componente no ambiente
begin
RegisterComponents('Samples', [TRelCalend]);
end;
//=========================================================================
constructor TRelCalend.Create(AOwner: TComponent);
Begin;
inherited Create(AOwner);
Sdata:='15/10/1582'; // início do calendário Gregoriano
SHora:='00:00:00.000';
Incdata:='01/00/00'; // incrementos mais comuns
IncHora:='0:00:01.000';
FDia.LeData(Sdata,Err);
FHora.LeHora(SHora,Err);
FTimerInterno:=TTimer.Create(Self);
FTimerInterno.Enabled:=False;
FTimerInterno.OnTimer:=IncrementoAutomatico;
End;
//-------------------------------------------------------------------------
destructor TRelCalend.Destroy;
Begin;
FTimerInterno.enabled:=False;
FTimerInterno.Destroy;
inherited Destroy;
V-4
Begin;
GetDataS:=FDia.TextoData(1);
End;
//-------------------------------------------------------------------------
procedure TRelCalend.SetDataS(S:String);
var D:Tdata;
Err: Boolean;
Begin;
D.LeData(S,Err);
If not Err Then
Begin;
FDia:=D;
MudaData;
MudaHora;
End;
End;
//-------------------------------------------------------------------------
procedure TRelCalend.ProxData(DD,MM,AA:word);
// avança, o relógio de: AA - anos, MM - meses e DD - dias
var D,D1:TData;
N: word;
Begin;
D:=FDia;
D1:=FDia;
D.Ano:=D.Ano+AA;
D1:=D;
N:=D.Mes+MM;
If N>12 Then
Begin;
D.Ano:=D.Ano+(N div 12);
D1:=D;
D1.UltimDiaMes;
If D.Dia=D1.Dia Then
Begin;
D.Mes:=(N mod 12);
D.UltimDiaMes;
End
Else D.Mes:=(N mod 12);
End
Else
begin;
D.Mes:=N;
D1.UltimDiaMes;
If D.Dia=D1.Dia Then D.UltimDiaMes;
End;
D.NovaData(DD);
If D.ValeData Then
Begin;
FDia:=D;
MudaData;
MudaHora;
End;
End;
//-------------------------------------------------------------------------
V-5
Begin;
GetHoraS:=FHora.TextoHora(0);
End;
//-------------------------------------------------------------------------
procedure TRelCalend.SetHoraS(S:String);
var H:THora;
Err: Boolean;
Begin;
H.LeHora(S,Err);
If not Err Then
Begin;
FHora:=H;
MudaHora;
End;
End;
//-------------------------------------------------------------------------
procedure TRelCalend.ProxHora(HH,MM:word;SS:Extended);
// avança o relógio de:
// HH - horas, MM - minutos e SS - segundos
var H:Thora;
HR,MR: word;
SR: Extended;
Erro,HouveMudancadeData: Boolean;
begin;
If SS<0 Then
Begin;
ShowMessage('Não é permitido retroceder o relógio!');
Exit;
End;
HouveMudancadeData:=False;
H:=FHora;
HR:=H.Hora + HH; // soma a hora
MR:=H.Minuto + MM; // soma os minutos
SR:=H.Segundo + H.MiliSegundo/1000 + SS; // soma os segundos
MR:=MR + Trunc(SR/60);
SR:=60*Frac(SR/60);
H.PoeHora(HR,MR,SR,Erro);
If Not Erro Then
Begin;
FHora:=H;
MudaHora;
If HouveMudancadeData Then MudaData;
End;
End;
//-------------------------------------------------------------------------
procedure TRelCalend.MudaData;
V-6
Begin;
If assigned(FMudaHora) Then FMudaHora(self);
End;
//-------------------------------------------------------------------------
function TRelCalend.GetSegundo:Extended;
Begin;
GetSegundo:=FHora.Segundo+FHora.Milisegundo/1000;
End;
//-------------------------------------------------------------------------
function TRelCalend.EhFeriado: Boolean;
Begin;
Fer[1].Poedata(1,1,FDia.Ano,B);
Fer[2]:=FDia;
Fer[2].Carnaval;
Fer[3]:=FDia;
Fer[3].SextaSanta;
Fer[4]:=FDia;
Fer[4].Pascoa;
Fer[5].PoeData(21,4,FDia.Ano,B);
Fer[6].PoeData(1,5,FDia.Ano,B);
Fer[7]:=FDia;
Fer[7].CChristi;
Fer[8].PoeData(7,9,FDia.Ano,B);
Fer[9].PoeData(12,10,FDia.Ano,B);
Fer[10].PoeData(2,11,FDia.Ano,B);
Fer[11].PoeData(15,11,FDia.Ano,B);
Fer[12].PoeData(25,12,FDia.Ano,B);
B:=False;
For I:=1 To 12 Do B:= B or MyDelphiUnit02.Eq(Fer[I],FDia);
EhFeriado:=B;
End;
//-------------------------------------------------------------------------
function TRelCalend.GetIncDataS:String;
Begin;
Str(FIncData.IDia:3,DD); Fillzero(DD);
Str(FIncData.IMes:3,MM); Fillzero(MM);
Str(FIncData.IAno:3,AA); Fillzero(AA);
Result:=DD+'/'+MM+'/'+AA;
End;
//-------------------------------------------------------------------------
function TRelCalend.GetIncHoraS: String;
Begin;
Str(FIncHora.IHora:3,HH); Fillzero(HH);
Str(FIncHora.IMin:2,MM); Fillzero(MM);
Str(FIncHora.ISeg:6:3,SS); Fillzero(SS);
V-7
Begin;
Err:=False;
For J:=1 To 3 Do SA[J]:='';
SX:=S;
NoSpace(SX);
J:=1;
I:=1;
Repeat
If (SX[I] in TCjAlg) Then SA[J]:=SA[J]+SX[I] Else Inc(J);
inc(I);
Until I>Length(SX);
Val(SA[1],DD,I);
Err:=Err or (I<>0);
Val(SA[2],MM,I);
Err:=Err or (I<>0);
Val(SA[3],AA,I);
Err:=Err or (I<>0);
If not Err Then
Begin;
FIncdata.IDia:=DD;
FIncData.IMes:=MM;
FIncdata.IAno:=AA;
End
Else ShowMessage('Erro no incremento de data do relógio de simulação!');
End;
//--------------------------------------------------------------------------
Procedure TRelCalend.SetIncHoraS(S:String);
Begin;
Err:=False;
For J:=1 To 3 Do SA[J]:='';
SX:=S;
NoSpace(SX);
J:=1;
I:=1;
Repeat
If (SX[I] in (TCjAlg + ['.'])) Then
SA[J]:=SA[J]+SX[I] Else Inc(J);
inc(I);
Until I>Length(SX);
Val(SA[1],HH,I);
Err:=Err or (I<>0);
Val(SA[2],MM,I);
Err:=Err or (I<>0);
Val(SA[3],SS,I);
Err:=Err or (I<>0);
V-8
Begin;
Result:=FTimerInterno.Interval;
End;
//--------------------------------------------------------------------------
Procedure TRelCalend.SetInterval(T: Cardinal);
Begin;
FTimerInterno.Interval:=T;
End;
//--------------------------------------------------------------------------
procedure TRelCalend.StartAutom;
begin;
FTimerInterno.Enabled:=True;
End;
//--------------------------------------------------------------------------
procedure TRelCalend.StopAutom;
begin;
FTimerInterno.Enabled:=False;
End;
//--------------------------------------------------------------------------
procedure TRelCalend.IncrementoAutomatico(Sender:TObject);
Begin;
With FIncData Do
If (IDia+IMes+IAno)<>0 Then ProxData(IDia,IMes,IAno);
With FIncHora Do
If (IHora+IMin+ISeg)<>0 Then ProxHora(IHora,IMin,ISeg);
End;
//--------------------------------------------------------------------------
function TRelCalend.GetAutomLig: Boolean;
begin;
Result:=FTimerInterno.Enabled;
End;
//--------------------------------------------------------------------------
procedure TRelCalend.Incrementa;
Begin;
If not GetAutomLig Then
Begin;
With FIncData Do
If (IDia+IMes+IAno)<>0 Then ProxData(IDia,IMes,IAno);
With FIncHora Do
If (IHora+IMin+ISeg)<>0 Then ProxHora(IHora,IMin,ISeg);
End;
End;
//--------------------------------------------------------------------------
End.
V-9
interface
TPTClaDistDisc = ^TClaDistDisc;
TPTRegInterv = ^TRegInterv;
constructor Create;
destructor Destroy; override;
implementation
uses MyDelphiUnit01;
Begin;
inherited create;
ListaClasses:=TList.create;
NumClasses:=0;
End;
//-------------------------------------------------------------------------
destructor TListaDistClasses.Destroy;
Begin;
Limpar;
ListaClasses.Free;
inherited destroy;
end;
//-------------------------------------------------------------------------
procedure TListaDistClasses.InsereClasse (R:TClaDistDisc);
Begin;
New(RX);
RX^:=R;
ListaClasses.Add(RX);
Inc(NumClasses);
End;
//-------------------------------------------------------------------------
procedure TListaDistClasses.Limpar;
Begin;
NumClasses:=0;
With ListaClasses Do
Begin;
While Count>0 Do
Begin;
RX:=Items[0];
V-12
var F: Text;
S: String;
SI: Array[1..2] of string;
I: Integer;
R: TClaDistDisc;
Err: Boolean;
Begin;
If FileExists(Arq) Then
Begin;
AssignFile(F,Arq);
Try
Self.Limpar;
Reset(F);
Repeat
Readln(F,S);
If (S<>'') and (S[1]<>'/') and (S[1]<>'#') Then
Begin;
ChangeCar(S,',','.');
SI[1]:=Copy(S,1,9);
SI[2]:=Copy(S,11,8);
For I:=1 To 2 Do NoSpace(SI[I]);
Val(SI[1],R.Prob,I);
Err:=I<>0;
Val(SI[2],R.ValRet,I);
Err:=Err or (I<>0);
If not Err then InsereClasse(R)
Else raise exception.Create(Msg1+#13+Msg2);
End;
Until EOf(F);
finally
CloseFile(F);
end;
End
Else
raise Exception.Create(Msg1+#13+Arq);
End;
//-------------------------------------------------------------------------
procedure TListaDistClasses.GravaArquivoClasses(Arq:string);
var F: Text;
S,S1: String;
I: Integer;
R: TPTClaDistDisc;
Begin;
AssignFile(F,Arq);
Rewrite(F);
For I:=0 To NumClasses-1 Do
Begin;
R:=ListaClasses.Items[I];
Str(R^.Prob:9:7,S);
Str(R^.ValRet:8,S1);
ChangeCar(S,'.',',');
Writeln(F,S+#32+S1);
V-13
Begin;
Self.Limpar;
N:=L.NumClasses-1;
If N>0 Then
Begin;
For I:=0 To N Do
Begin;
RY:=L.ListaClasses.Items[I];
R:=RY^;
Self.InsereClasse(R);
End;
End;
End;
//--------------------------------------------------------------------------
Begin;
inherited create;
ListaIntervalos:=TList.create;
NumIntervalos:=0;
End;
//-------------------------------------------------------------------------
destructor TListaIntervalos.Destroy;
Begin;
Limpar;
ListaIntervalos.Free;
inherited destroy;
end;
//-------------------------------------------------------------------------
procedure TListaIntervalos.InsereIntervalo(R:TRegInterv);
var RX:TPTRegInterv;
Begin;
New(RX);
RX^:=R;
ListaIntervalos.Add(RX);
Inc(NumIntervalos);
End;
//-------------------------------------------------------------------------
procedure TListaIntervalos.Limpar;
Begin;
NumIntervalos:=0;
With ListaIntervalos Do
Begin;
While Count>0 Do
Begin;
Z:=Items[0];
Dispose(Z);
Delete(0);
V-14
ListaIntervalos.Clear;
End;
//-------------------------------------------------------------------------
procedure TListaIntervalos.GeraIntervalos(T:TListaDistClasses);
begin;
N:=T.NumClasses;
If N>0 Then
Begin;
Limpar;
X:=T.ListaClasses.Items[0];
R.LimInf:=0;
R.LimSup:=X^.Prob;
R.ValRet:=X^.ValRet;
InsereIntervalo(R);
For I:=1 To N-1 Do
Begin;
X:=T.ListaClasses.Items[I];
R.LimInf:=R.LimSup+1E-7;
R.LimSup:=R.LimInf+X^.Prob-1E-7;
R.ValRet:=X^.ValRet;
InsereIntervalo(R);
End;
Z:=ListaIntervalos[NumIntervalos-1];
Z^.LimSup:=1;
End
Else raise Exception.Create(Msg3);
End;
//-------------------------------------------------------------------------
procedure TListaIntervalos.GravaArqIntervalos(Arq:string);
var F: Text;
S,S1,S2: String;
I: Integer;
Begin;
AssignFile(F,Arq);
Rewrite(F);
For I:=0 To NumIntervalos-1 Do
Begin;
Z:=ListaIntervalos.Items[I];
Str(Z^.LimInf:9:7,S); ChangeCar(S,'.',',');
Str(Z^.LimSup:9:7,S1); ChangeCar(S1,'.',',');
Str(Z^.ValRet:8,S2);
Writeln(F,S+#32+S1+#32+S2);
End;
CloseFile(F);
End;
//-------------------------------------------------------------------------
function TListaIntervalos.GetClasse(Rx:extended):Integer;
Begin;
N:=NumIntervalos;
V-15
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
MyDelphiUnit02, MyDelphiUnit04, ComObj;
TPTRegPonto = ^TRegPonto;
TRegVal = class(TComponent)
private
{ Private declarations }
RX: TPTRegPonto;
protected
{ Protected declarations }
function CalcMedia: Extended;
function CalcVar: extended;
function CalcMax: extended;
V-17
public
{ Public declarations }
property Lista: TList read FLista; // A própria lista
property n: integer read CalcNumElem; // número de elementos
property Soma: extended read CalcSoma; // soma dos valores
property Max: extended read CalcMax; // valor máximo
property Min: extended read CalcMin; // valor mínimo
property Amplitude: extended read CalcAmplit; // amplitude
property Media: extended read CalcMedia; // média aritmética
property MediaGeom: extended read CalcMedGeom; // média geométrica
property MediaHarm: extended read CalcMedHarm; // média harmônica
property PtoMed: extended read CalcPtoMedio; // ponto médio
property Varianca: extended read CalcVar; // variança
property DesvPad: extended read CalcDesvioPadrao;// desvio padrão
property DesvMedio: extended read CalcDesvMed; // desvio médio
property CoefVar: extended read CalcCoefVar; // coef. de variação
published
{ Published declarations }
property Caption: string read FLegenda write FLegenda;
property TipoUniv: TTipoUniv read FTipoUniv write FTipoUniv;
end;
implementation
//-------------------------------------------------------------------------
procedure Register;
begin
RegisterComponents('Samples', [TRegVal]);
V-18
Begin;
New(RX);
RX^.Data:=D;
RX^.Hora:=H;
RX^.Valor:=V;
FLista.Add(RX);
End;
//-------------------------------------------------------------------------
function TRegVal.calcmedia: Extended;
begin;
Cont:=CalcNumElem;
If Cont<>0 Then Result:=CalcSoma/Cont
Else
Begin;
raise ERegValError.CreateFmt('Msg2'+#13+Msg3,[]);
result:=0;
End;
End;
//-------------------------------------------------------------------------
procedure TRegVal.GravaArquivo(Arq: String; Sep: Char);
Begin;
Txt:=TStringList.Create;
Try
For I:=0 To FLista.Count-1 Do
Begin;
RX:=FLista.Items[I];
If RX<> nil Then
Begin;
Str(I+1,S);
With RX^ Do
Txt.Add(S+Sep+Data.TextoData(1)+Sep+Hora.TextoHora(1)+
Sep+FloatToStr(Valor));
End;
End;
Try
Txt.SaveToFile(Arq);
except
V-19
Begin;
result:=0;
Media:=CalcMedia;
N:=CalcNumElem;
If N>0 Then
Begin;
Case FTipoUniv of
UnivAmostral: N:=CalcNumElem-1;
UnivPopulacional: N:=CalcNumElem;
End;
For I:=0 To FLista.Count-1 Do
Begin;
RX:=FLista.Items[I];
Result:=Result+(RX^.Valor-Media)*(RX^.Valor-Media)/N;
End;
End
Else
raise ERegValError.Create(Msg2+#13+Msg3);
End;
//-------------------------------------------------------------------------
function TRegVal.CalcMax: extended;
var I: Integer;
RX: TPTRegPonto;
Begin;
Result:=0;
If CalcNumElem<>0 Then
Begin;
RX:=FLista.Items[0];
If RX<>nil Then Result:=RX^.Valor;
For I:=0 To FLista.Count-1 Do
Begin;
RX:=FLista.Items[I];
If (RX<>nil) and (Result<RX^.Valor) Then Result:=RX^.Valor;
End;
End
Else
raise ERegValError.Create(Msg2+#13+Msg3);
End;
//-------------------------------------------------------------------------
function TRegVal.CalcMin: extended;
var I: Integer;
RX: TPTRegPonto;
Begin;
Result:=0;
If CalcNumElem<>0 Then
Begin;
RX:=FLista.Items[0];
V-20
var I: Integer;
RX: TPTRegPonto;
Begin;
result:=0;
For I:=0 To FLista.Count-1 Do
Begin;
RX:=FLista.items[0];
If RX<>nil then Inc(Result);
End;
End;
//-------------------------------------------------------------------------
function TRegVal.CalcAmplit: extended;
Begin;
Try
result:=Self.calcmax-Self.calcmin;
Except
on ERegValError do raise ERegValError.Create(Msg2+#13+Msg3);
End;
End;
//-------------------------------------------------------------------------
function TRegVal.CalcDesvioPadrao: extended;
Begin;
result:=Sqrt(CalcVar);
End;
//-------------------------------------------------------------------------
function TRegVal.CalcCoefVar: extended;
Begin;
Try
result:=CalcVar/CalcMedia;
Except
on ERegValError do raise ERegValError.Create(Msg2+#13+Msg3);
End;
End;
//-------------------------------------------------------------------------
function TRegVal.CalcPtoMedio: extended;
Begin;
Try
result:=(CalcMax-CalcMin)/2;
Except
on ERegValError do raise ERegValError.Create(Msg2+#13+Msg3);
End;
End;
//-------------------------------------------------------------------------
function TRegVal.CalcSoma: extended;
begin;
result:=0;
If CalcNumElem<>0 Then
For I:=0 To FLista.Count-1 Do
Begin;
RX:=FLista.Items[I];
If RX<> nil Then result:=result+RX^.Valor;
End
Else
raise ERegValError.Create(Msg2+#13+Msg3);
End;
//-------------------------------------------------------------------------
function TRegVal.CalcDesvMed: extended;
Begin;
result:=0;
Try
Media:=CalcMedia;
N:=CalcNumElem;
For I:=0 To FLista.Count-1 Do
Begin;
RX:=FLista.Items[I];
Result:=Result+Abs(RX^.Valor-Media)/N;
End;
Except
on ERegValError do raise ERegValError.Create(Msg2+#13+Msg3);
End;
End;
//-------------------------------------------------------------------------
function TRegVal.CalcMedGeom: extended;
Begin;
result:=0;
N:=CalcNumElem;
If N<>0 Then
For I:=0 To FLista.Count-1 Do
Begin;
RX:=FLista.Items[I];
Result:=Result*Elev(RX^.Valor,1/N);
End
Else
raise ERegValError.Create(Msg2+#13+Msg3);
End;
//-------------------------------------------------------------------------
function TRegVal.CalcMedHarm: extended;
Begin;
result:=0;
N:=CalcNumElem;
If N<>0 Then
Begin;
For I:=1 To FLista.Count-1 Do
V-22
begin;
FLista.Clear;
End;
//-------------------------------------------------------------------------
procedure TRegVal.ExportaExcel(Arq:string);
begin;
try
Ap:=CreateOleObject('Excel.Application');
except
raise Exception.Create('Não foi possível abrir o servidor OLE.'+#13+
'Verifique se o MS-Excel está corretamente'+
' instalado.');
end;
Try
FNome:=ChangeFileExt(Arq,'.xls');
NPlan:=AlinhaEsq(FLegenda);
NPlan:=AlinhaDir(NPlan);
If NPlan='' Then NPLan:='Plan1';
Ap.WorkBooks.Add[xlWBatWorkSheet];
// Ap.Visible:=True; // retirar coment. para ver operar no Excel.
Ap.WorkBooks[1].WorkSheets[1].Name:=NPlan;
Plan:=Ap.WorkBooks[1].WorkSheets[NPlan];
N:=CalcNumElem;
Plan.Range['B1:B'+IntToStr(N)].Select;
Ap.Selection.NumberFormat:='dd/mm/aaaa';
V-23
Plan.Range['A1:D'+IntToStr(N)].Select;
Ap.Selection.Columns.Autofit;
Plan.Range['A1'].select;
Plan.Range['A1'].activate;
Ap.WorkBooks[1].Sheets.Add(,,,xlChart);
Gr:=Ap.WorkBooks[1].Charts[1];
Gr.Name:='Gráfico';
Gr.ChartType:=xlLine;
Gr.SeriesCollection.Add(Plan.Range['D1:D'+IntToStr(N)]);
Gr.SeriesCollection[2].Border.ColorIndex:=1;
Gr.SeriesCollection[2].Border.Weight:=xlThick;
Gr.PlotArea.Select;
Ap.Selection.Border.LineStyle:=xlNone;
Ap.Selection.Interior.ColorIndex:=xlNone;
Gr.Legend.Select;
Ap.Selection.Delete;
Gr.Deselect;
Ap.ActiveWindow.Zoom:=50;
Ap.Workbooks[1].SaveAs(FNome,,,,,,);
Ap.DisplayAlerts:=False;
Ap.Quit;
Except
Ap.DisplayAlerts:=False;
Ap.Quit;
raise Exception.Create('Erro ao exportar para arquivo do MS-Excel.');
end;
End;
//--------------------------------------------------------------------------
end.
interface
V.2
Razão pela qual implementam algumas funções disponíveis na biblioteca do
ambiente Delphi 4.0; mas que não estavam disponíveis em versões mais antigas: desde o Turbo Pascal 5.0
até o Delphi 3.0.
V-25
TCjNotNum:TCjChar = ['0'..'9','.','+','-','E','e',Chr(Ord(','))];
//conjunto de caracteres utilizados para notação numérica
TCjLetrasAnsi:TCjChar = ['a'..'z','A'..'Z'];
//conjunto de letras ANSI
TCjAlg:TCjChar = ['0'..'9'];
//conjunto de algarismos
implementation
end.
{$H+}
interface
uses MyDelphiUnit00;
implementation
{--------------------------------------------------------------------------}
procedure FillZero(var S:String);
var I: Longint;
Ps: pointer;
Pa: TStringPointer;
begin;
Ps:=Pchar(S); //passa o valor do ponteiro de S para o ponteiro
Pa:=Ps; //de Pa que é o vetor, usando o macete do Pchar
I:=0; //inicializa o contador
If Pa^[i]=' ' Then //testa se o primeiro (zerézimo) caract. é espaço
Repeat //se for espaço
Pa^[I]:='0'; //põe '0' no seu lugar e
Inc(I); //avança para o próximo substituindo-o por '0'
Until Pa^[I]<>' '; //até que o próximo não seja um espaço, ou seja o
//byte '00' que é o final da string
end; //retorna sem atribuir valor pois já trabalhou
//sobre a área de memória da variável "S"
{--------------------------------------------------------------------------}
function Comp(Car:Char; N:Longint): String;
var I: Longint;
S: String;
Begin;
S:=''; {Inicializa uma string vazia para buffer}
For I:=1 to N do {corre o contador de 1 até 'N'}
S := S + Car; {acrescentando caracteres em 'Car' na String}
Comp:=S; {atribui à função e sai}
End;
{--------------------------------------------------------------------------}
procedure NoSpace (var S:String);
begin;
S1:=S; {resguarda o valor de 'S' em 'S1'}
S:=''; {inicializa 'S' como string vazia}
Ps:=Pchar(S1); {passa o valor do ponteiro de S p/ o ponteiro}
Pa:=Ps; {de Pa que é o vetor, usando Pchar}
I:=0; {inicializa o contador}
If Byte(Pa^[i])<>0 then {testa o primeiro (zerésimo) byte de 'S1'}
Repeat {se for diferente de 00}
If not(Pa^[i] in C) Then {verifica se não é caracter proibido}
S:=S+Pa^[i]; {se não for copia para 'S'}
inc(i); {adianta o contador de bytes}
Until (Byte(Pa^[i])=0); {repete até encontrar o fim da string}
end;
{--------------------------------------------------------------------------}
procedure OnlySet (var S:string; C:TCjChar);
begin;
S1:=S; {resguarda o valor de 'S' em 'S1'}
S:=''; {inicializa 'S' como string vazia}
Ps:=Pchar(S1); {passa o valor do ponteiro de S para o }
Pa:=Ps; {ponteiro de Pa que é o vetor, usando Pchar}
I:=0; {inicializa o contador}
If Byte(Pa^[i])<>0 then {testa o primeiro (zerésimo) byte de 'S1'}
Repeat {se for diferente de 00}
If (Pa^[i] in C) Then {verifica se é caracter permitido}
S:=S+Pa^[i]; {se for copia para 'S'}
inc(i); {adianta o contador de bytes}
Until (Byte(Pa^[i])=0); {repete até encontrar o fim da string}
end;
{--------------------------------------------------------------------------}
function AjustaInt(N:Integer; Nc:Integer): String;
{transforma um número inteiro "N" p/ uma string de comprimento "Nc", pondo}
{zeros à esquerda. Se o comprimento de "N" seja maior que "Nc", só retorna}
{"N" em forma de string. }
var S: String;
V-28
Begin;
S1:=S; // resguarda o valor de "S" em "S1"
Sr:=''; // Inicializa "Sr" (String Resultado)
Ps:=PChar(S1); // passa o valor do ponteiro de "S"
Pa:=Ps; // para o ponteiro de Pa que é o vetor.
I:=Length(S1)-1; // Testa o último caracter de "S1"
If Pa^[i]<>'\' Then // Se não for a barra ("\")
Repeat
Sr:=Pa^[i]+Sr; // anexa ao início de "Sr"
Dec(i); // move para o caracter anterior
Until (I<=0) or (Pa^[i]='\'); // repete até encontar a barra ou o
ExtraiNome:=Sr; // início de S1; atribui o resultado
End;
{--------------------------------------------------------------------------}
function UpStr(S:String):String;
{retorna a string "S" convertida toda para caixa alta, só processa os }
{caracteres ASCII e aqueles das línguas portuguesa e espanhola }
Begin;
CarCxBaixo:=[#97..#122,#224..#255];
S1:=S; // resguarda o valor de "S" em "S1"
Sr:=''; // Inicializa "Sr" (String Resultado)
Ps:=PChar(S1); // passa o valor do ponteiro de "S"
Pa:=Ps; // para o ponteiro de Pa que é o vetor.
For I:=0 to Length(S1)-1 Do // percorre os caracteres de "S1"
If Pa^[i] in CarCxBaixo Then // verifica se são caixa baixa
Sr:=Sr+Char(Byte(Pa^[i])-32) // se são converte para caixa alta
Else Sr:=Sr+Pa^[i]; // se não copia para o resultado.
UpStr:=Sr; // de S1; atribui o resultado
End;
//--------------------------------------------------------------------------
function AlinhaEsq (S:String): String;
Begin;
S1:=S; // resguarda o valor de "S" em "S1"
Sr:=''; // Inicializa "Sr" (String Resultado)
V-29
AlinhaEsq:=Sr;
End;
//--------------------------------------------------------------------------
function LeftStr(S:String; N:Longint):String;
//retorna os "N" primeiros caracteres da string;
// S - string original;
// N - número de caracteres a partir da esquerda;
Begin;
If Length(S)>=N Then // se a string "S" tem "N" ou mais caracteres
LeftStr:= Copy(S,1,N) // retorna os primeiros "N" caracteres da mesma
Else LeftStr:=S; // se não, retorna a própria string "S"
End;
//--------------------------------------------------------------------------
function RightStr(S:String; N:Longint):String;
//retorna os "N" últimos caracteres da string;
// S - string original;
// N - número de caracteres a partir da direita;
Begin;
If Length(S)>=N Then // se a string "S" tem "N" ou mais caracteres
RightStr:= Copy(S,Length(S)-N+1,N) // retorna os últimos "N"
// caracteres da mesma
Else RightStr:=S; // se não, retorna a própria string "S"
End;
//--------------------------------------------------------------------------
procedure ChangeCar (var S:String; C1,C2:Char);
// substitui todas as ocorrências do caracter "C1" pelo caracter "C2"
Begin;
S1:=S; // resguarda o valor de "S" em "S1"
Sr:=''; // Inicializa "Sr" (String Resultado)
Ps:=PChar(S1); // passa o valor do ponteiro de "S" para o
Pa:=Ps; // ponteiro de Pa que é o vetor.
For I:=0 to Length(S1)-1 Do // percorre os caracteres de "S1"
If Pa^[i] = C1 Then // verifica se é o caracter indesejado
Begin;
If C2<>#0 Then Sr:=Sr + C2 // se é converte para o desejado
End
Else Sr:=Sr+Pa^[i]; // se não copia o original para o resultado.
V-30
var S:String;
PS:^String;
P:PChar;
N:DWord;
begin
New(P);
N:=1000; // cria um buffer
Err:=not GetUserName(P,N); // chama a função do sistema
If not Err Then // se não houver erro
Begin;
PS:=@P; // acerta os tipos e
S:=PS^; // copia o buffer para a string "S"
NoSpace(S); // reconstroi o resultado
NomeUsuario:=S; // retorna o valor da função
End
Else NomeUsuario:=''; // se houver erro retorna string vazia
Dispose(P); // e libera o buffer
end;
//--------------------------------------------------------------------------
function NomeUsuarioAtual: String;
// idem à anterior, mantida por "compatibilidade histórica"
begin;
P:=@L.b; //aponta "P" para o primeiro caracter do buffer de
//forma indireta
X:=256; //define o tamanho do buffer
Erro:= not GetUserName(P,X); //chama o sistema e pega o nome do usuário
S1:=L.a; //atribui o valor do buffer para S1.
If Erro Then S1:='????????';
NoSpace(S1); // corrige um problema que deu ao somar o resultado a
// outra string;
NomeUsuarioAtual:=S1; //atribui o resultado da função
end;
{--------------------------------------------------------------------------}
function Spc(N: Longint): String;
// retorna uma string de "N" espaços (#32)
Begin;
Spc:=Comp(#32,N); // essa rotina é um caso particular de "Comp"
End;
{--------------------------------------------------------------------------}
function ByteToBin(N:Byte):String;
// retorna a representação binária de "N"
Begin;
P:=1;
For K:=1 To I Do P:=2*P;
Pot2:=P;
End;
//................................
Begin;
S:='';
For I:=7 DownTo 0 Do // verifica a existencia de cada um dos bits,
// assinalando o resultado
If (Pot2(I) and N)<>0 Then S:=S+'1' else S:=S+'0';
ByteToBin:=S;
End;
//--------------------------------------------------------------------------
function AlinhaDir (S:String): String;
var I: Longint;
S1,Sr: String;
Begin;
S1:=S; // resguarda o valor de "S" em "S1"
Sr:=''; // Inicializa "Sr" (String Resultado)
I:=Length(S1); // verifica tamanho da string
result:=Sr;
End;
//--------------------------------------------------------------------------
procedure Esperar(Tempo:cardinal);
// introduz uma pausa no processamento do fluxo em que está inserida
// mantém o processamento das mensagens.
// Tempo - tempo da pausa aproximado [ms]
var T:TDateTime;
Begin;
T:=Now; // pega o momento atual
T:=T+Tempo/(24*60*60*1000); // calcula o momento do final da pausa
Repeat
Application.ProcessMessages // fica processando mensagens
Until T <= Now; // até chegar o final da pausa
End;
//--------------------------------------------------------------------------
end.
V-32
interface
Dia: Word;
Mes: Word;
Ano: Word;
{--------------------------------------------------------------------------}
function TData.TextoData (Tipo:Byte):string;
{Fornece as propriedades relativas a dia mês e ano em forma de string, no }
{formato: }
{ dd/mm/aa ---> Tipo=0 }
{ dd/mm/aaaa ---> Tipo=1 }
{ mm/dd/aaaa ---> Tipo=2
}
begin;
var Dx:TData;
Dias: Longint;
I: Word;
DM: Array [1..12] of Word;
begin;
DM[1]:=31; DM[7]:=31;
DM[2]:=28; DM[8]:=31;
DM[3]:=31; DM[9]:=30;
DM[4]:=30; DM[10]:=31; // assinala o número de dias dos meses
DM[5]:=31; DM[11]:=30;
DM[6]:=30; DM[12]:=31;
Dx.Ano:=0; //
Dx.Mes:=0; // Inicializa um novo objeto TData
Dx.Dia:=0; //
Dias:=EntreDatas(Dx,Self); // Número de dias entre a data do objeto
Dias:=Dias+N; // e o dia 00/00/0000, somando o "N" solicitado
Dx.Ano:=Trunc(Dias/365.25); // Calcula o ano da nova data
If (Dx.Ano mod 4)=0 Then
Begin;
DM[2]:=29; // se o ano é bissexto corrige fevereiro
If ((Self.Ano mod 100)=0) and ((Self.Ano mod 400)<>0) Then DM[2]:=28;
// mas se é a passagem do século, Fevereiro só tem 29 dias a cada
// 4 séculos.
End
Else Dm[2]:=28; // se o ano for bissexto corrige fevereiro
V-34
begin;
DecodeDate(Date,Ano,Mes,Dia); // Pega a data do sistema (função Date e a
end; // quebra em dia, mês e ano
{--------------------------------------------------------------------------}
function TData.ValeData: Boolean;
{Verifica se a data do objeto é válida (TRUE), ou inválida (FALSE) }
{Atua como se todo o tempo D.C. estivesse no calendário Gregoriano. }
begin
DM[1]:=31; DM[7]:=31;
DM[2]:=28; DM[8]:=31;
DM[3]:=31; DM[9]:=30;
DM[4]:=30; DM[10]:=31; // atribui o número de dias dos mêses
DM[5]:=31; DM[11]:=30;
DM[6]:=30; DM[12]:=31;
begin;
DOld:=Self; // Salva a data anterior
Dia:=D;
Mes:=M; // Atribui as novas propriedades
Ano:=A;
Erro:=Not ValeData; // testa a validade da nova data
If Erro Then Self:=DOld; // se houve erro volta a data anterior
end;
{--------------------------------------------------------------------------}
procedure TData.LeData(S:String; var Erro:Boolean);
{Põe a data no objeto a partir de uma definição tipo STRING dd/mm/aa ou }
{dd/mm/aaaa se a data for válida, volta erro e não atribui caso a data seja}
{inválida }
var I: integer;
K: Word;
DD: Array [1..3] of String;
DN: Array [1..3] of Word;
Begin;
Erro:=False; // parte do princípio que a data é válida
For K:=1 to 3 do DD[k]:=''; // Inicialida vetor de 3 strings
NoSpace(S); // remove todos os espaços da string de entrada
I:=1; // inicializa o contador de caracteres
K:=1; // inicializa o índice do vetor de strings para aponta o dia
S:=S+'*'; // marca o final de "S' com "*" para garantir que o último
Repeat // caracter não é algarismo, e percorre todos os caracteres
If S[I] in Alg Then // se é algarismo
Begin;
DD[K]:=DD[K]+S[I]; //põe na posição adequada do vetor de strings
Inc (I); // vai para o próximo caracter
End
Else // se o caracter não é algarismo, significa que de dia se passa
Begin; // para mês, ou de mês para ano
Inc(I); // vai para o próximo caracter
Inc(K); // vai para a próxima posição do vetor de string
End;
Until (I>Length(S)) or (K>3); // Até que corre ao último caracter ou
I:=0; // encontre o "*".
For K:=1 to 3 Do If Not Erro Then // Se não há erro, testa os valores
Begin; // de dia, mês e ano em DD[],
Val(DD[K],DN[K],I); // para saber se são válidos como Word
Erro:=Erro or (I<>0);
End;
var D2:TData;
Err: Boolean;
A,B,C,D,E,F,G,H,I,J: Integer;
Begin;
Result:=0;
D2.PoeData(15,10,1582,Err);
Erro:=(not Self.ValeData) or Lt(Self,D2);
If Erro Then Exit
Else
Begin;
A:=(12-Self.Mes) div 10;
B:=Self.Ano-A;
C:=Self.Mes+12*A;
D:=B div 100;
E:=D div 4;
F:=2-D+E;
G:=Trunc(365.25*B);
H:=Trunc(30.6001*(C+1));
I:=F+G+H+Self.Dia+5;
J:=I mod 7;
If J=0 Then J:=7;
DiaDaSemana:=J;
Case J Of
1: S:='Domingo';
2: S:='Segunda-Feira';
3: S:='Terça-Feira';
4: S:='Quarta-Feira';
5: S:='Quinta-Feira';
6: S:='Sexta-Feira';
7: S:='Sábado';
End;
End;
//--------------------------------------------------------------------------
function Lt (D1,D2:TData):Boolean;
begin;
Menor:=D1.Ano < D2.Ano;
Igual:=D1.Ano = D2.Ano;
If Igual Then
begin;
Menor:=D1.Mes < D2.Mes;
Igual:=D1.Mes = D2.Mes;
end;
Lt:=Menor;
End;
{--------------------------------------------------------------------------}
function Gt (D1,D2:TData):Boolean;
V-37
begin;
Maior:=D1.Ano > D2.Ano;
Igual:=D1.Ano = D2.Ano;
If Igual Then
begin;
Maior:=D1.Mes > D2.Mes;
Igual:=D1.Mes = D2.Mes;
end;
Gt:=Maior;
End;
{--------------------------------------------------------------------------}
function Eq (D1,D2:TData):Boolean;
begin;
Eq:= (D1.Ano=D2.Ano) And (D1.Mes=D2.Mes) And (D1.Dia=D2.Dia);
end;
{--------------------------------------------------------------------------}
function Le (D1,D2:TData):Boolean;
begin;
Le:=Lt(D1,D2) Or Eq(D1,D2);
end;
{--------------------------------------------------------------------------}
function Ge (D1,D2:TData):Boolean;
begin;
Ge:=Gt(D1,D2) Or Eq(D1,D2);
end;
{--------------------------------------------------------------------------}
function EntreDatas(D1,D2:TData): Longint;
begin;
Dm[1]:=31; Dm[7]:=31;
Dm[2]:=28; Dm[8]:=31;
Dm[3]:=31; Dm[9]:=30;
Dm[4]:=30; Dm[10]:=31;
Dm[5]:=31; Dm[11]:=30;
Dm[6]:=30; Dm[12]:=31;
D[1]:=D1;
D[2]:=D2;
For I:=1 to 2 do
begin;
Dt[I]:=Trunc(D[I].Ano * 365.25);
Biss:=False;
If (D[I].Ano mod 4)=0 Then
Begin;
DM[2]:=29; // se o ano é bissexto corrige fevereiro
V-38
Begin;
Self.Dia:=01;
End;
{--------------------------------------------------------------------------}
procedure TData.UltimDiaMes;
begin;
Dm[1]:=31; Dm[7]:=31;
Dm[2]:=28; Dm[8]:=31;
Dm[3]:=31; Dm[9]:=30;
Dm[4]:=30; Dm[10]:=31;
Dm[5]:=31; Dm[11]:=30;
Dm[6]:=30; Dm[12]:=31;
MM:=Self.Mes;
AA:=Self.Ano;
DD:=Dm[MM];
Self.Dia:=DD;
End;
{--------------------------------------------------------------------------}
procedure TData.SomaMes(N: Integer);
Begin;
Dm[1]:=31; Dm[7]:=31;
Dm[2]:=28; Dm[8]:=31;
V-39
DD:=Self.Dia;
MM:=Self.Mes;
AA:=Self.Ano;
MM1:=MM;
MM:=MM+N;
If DD=Dm[MM1] Then
Begin;
If (AA mod 4)=0 Then
Begin;
DM[2]:=29; // se o ano é bissexto corrige fevereiro
If ((Self.Ano mod 100)=0) and ((Self.Ano mod 400)<>0) Then DM[2]:=28;
// mas se é a passagem do século, Fevereiro só tem 29 dias a cada
// 4 séculos.
End
Else Dm[2]:=28;
DD:=Dm[MM];
End;
Dia:=DD;
Mes:=MM;
Ano:=AA;
End;
{--------------------------------------------------------------------------}
procedure TData.Pascoa; // calcula a data de páscoa de um dado ano
// calcula a páscoa para o ano passado em "Ano", para o calendário
// Gregoriano, segundo as regras da Igreja (há uma pequena diferença com
// as regrasastronômicas. Se o valor de "Ano" passado for de 4 dígitos,
// verifica a validade e efetua o cálculo, se for de 3 dígitos, soma 1000
// (p.e. "789" passa a ser "1789", uma vez que nao há calendário gregoriano
// antes de 15/10/1582. Se o ano for passado com 2 dígitos, soma 1900 para
// anos de 54 a 99, e 2000 para anos de 00 a 53
Begin;
If (Self.Ano>99) and (Self.Ano<=999) Then Self.Ano:=Self.Ano+1000;
If (Self.Ano<=99) and (Self.Ano>=54) Then Self.Ano:=Self.Ano+1900;
If (Self.Ano<54) Then Self.Ano:=Self.Ano+2000;
If Self.Ano<=1582 Then
Begin;
ShowMessage('A data da Páscoa, e conseqüentemenete as demais '+
'festas móveis, só pode ser calculada para o '+
'calendário Gregoriano, ou seja, datas a partir de '+
V-40
Self.Mes:=Q;
Self.Dia:=S;
End;
//-------------------------------------------------------------------------
procedure TData.Carnaval;
// calc. a Terça-feira de carnaval p/ o ano
// 47 dias antes da páscoa;
Begin;
Self.Pascoa;
Self.NovaData(-47);
End;
//-------------------------------------------------------------------------
procedure TData.CChristi;
// calula Corpus Christi p/ um dado ano
// 60 dias após a páscoa
Begin;
Self.Pascoa;
Self.NovaData(60);
End;
//-------------------------------------------------------------------------
procedure TData.SextaSanta;
// calcula Sexta-feira Santa p/ um dado ano
// 2 dias antes da páscoa
Begin;
Self.Pascoa;
Self.NovaData(-2);
End;
//-------------------------------------------------------------------------
function AnosdeIdade (DNasc,D:TData):Word;
// calcula a idade, em anos completos
// DNasc - data de nascimento;
// D - data de avaliação da idade;
// no dia do aniversário ainda não tem a idade completa
//--------------------------------------------------------------------------
end.
interface
uses MyDelphiUnit00;
// comparação de horários
function Lt (H1,H2:THora):Boolean; // True se H1 < H2
function Gt (H1,H2:THora):Boolean; // True se H1 > H2
function Eq (H1,H2:THora):Boolean; // True se H1 = H2
function Le (H1,H2:THora):Boolean; // True se H1 <= H2
function Ge (H1,H2:THora):Boolean; // True se H1 >= H2
implementation
{--------------------------------------------------------------------------}
Procedure THora.AtualHora;
Begin;
DecodeTime(Time, H, M, S, MS);
With Self Do
Begin;
Hora:=H;
Minuto:=M;
Segundo:=S;
MiliSegundo:=MS;
End;
End;
{--------------------------------------------------------------------------}
function THora.TextoHora(Tipo:Byte): String;
Begin;
With Self Do
begin;
Str(Hora:2,SH); FillZero(SH);
Str(Minuto:2,SM); FillZero(SM);
Str(Segundo:2,SS); FillZero(SS);
Str(MiliSegundo:3,SMS); FillZero(SMS);
End;
Case Tipo of
0: Begin;
SR:=SH + ':' + SM + ':' + SS + ',' + SMS;
End;
1: Begin;
SR:=SH + ':' + SM + ':' + SS;
End;
2: Begin;
SR:=SH + ':' + SM;
End;
End;
V-43
End;
{--------------------------------------------------------------------------}
function THora.ValeHora: Boolean;
Begin;
Erro:=False;
Erro:=Erro or (Hora>24);
Erro:=Erro or (Minuto>59);
Erro:=Erro or (Segundo>59);
Erro:=Erro or (Milisegundo>999);
ValeHora:=not Erro;
End;
{--------------------------------------------------------------------------}
procedure THora.PoeHora(H,M:Word; S:Extended; var Erro:Boolean);
Begin;
Ha.Hora:=H;
Ha.Minuto:=M;
Ha.Segundo:=Trunc(S);
Ha.MiliSegundo:=Round(1000*Frac(S));
If Ha.ValeHora Then
begin;
Self:=Ha;
Erro:=False;
End
Else Erro:=True;
End;
{--------------------------------------------------------------------------}
procedure THora.LeHora(S:String; var Erro:Boolean);
Var I: Integer;
K: Word;
Seg: Extended;
HS: Array [1..3] of String;
HN: Array [1..4] of Word;
Begin;
Seg:=0;
Erro:=False;
For K:=1 to 3 do HS[k]:='';
NoSpace(S);
I:=1;
K:=1;
S:=S+'*';
Repeat
If S[i] in Alg Then
Begin;
HS[K]:=HS[K]+S[I];
Inc(I);
End
Else
Begin;
Inc(i);
Inc(k);
End;
Until (I>Length(S)) or (K>3);
V-44
begin;
HR:=Self.Hora + H; // soma a hora
MR:=Self.Minuto + M; // soma os minutos
SR:=Self.Segundo + Self.MiliSegundo/1000 + S; // soma os segundos
MR:=MR + Int(SR/60);
SR:=60*Frac(SR/60);
HR:=HR + Int(MR/60);
MR:=60*Frac(MR/60);
HR:=24*Frac(HR/24);
Self.PoeHora(Trunc(HR),Trunc(MR),SR,Erro);
End;
{--------------------------------------------------------------------------}
function THora.HoraParaSegundo: Extended;
Begin;
V-45
{--------------------------------------------------------------------------}
procedure THora.SegundoParaHora(S: Extended);
Begin;
S:=Abs(S);
H:=Trunc(S/3600);
S:=3600*Frac(S/3600);
M:=Trunc(S/60);
S:=60*Frac(S/60);
Sg:=Trunc(S);
X:=Round(1000*(S-Sg));
E:=X;
MS:=Trunc(E);
Self.Hora:=H;
Self.Minuto:=M;
Self.Segundo:=Sg;
Self.MiliSegundo:=MS;
End;
{--------------------------------------------------------------------------}
function EntreHoras(H1,H2:THora): Extended;
Begin;
EntreHoras:=H1.HoraParaSegundo - H2.HoraParaSegundo;
End;
{--------------------------------------------------------------------------}
function Lt (H1,H2:THora):Boolean;
Begin;
Lt:=H1.HoraParaSegundo < H2.HoraParaSegundo;
End;
{--------------------------------------------------------------------------}
function Gt (H1,H2:THora):Boolean;
Begin;
Gt:=H1.HoraParaSegundo > H2.HoraParaSegundo;
End;
{--------------------------------------------------------------------------}
function Eq (H1,H2:THora):Boolean;
Begin;
Eq:=H1.HoraParaSegundo = H2.HoraParaSegundo;
End;
{--------------------------------------------------------------------------}
function Le (H1,H2:THora):Boolean;
Begin;
Le:=H1.HoraParaSegundo <= H2.HoraParaSegundo;
End;
{--------------------------------------------------------------------------}
function Ge (H1,H2:THora):Boolean;
Begin;
Ge:=H1.HoraParaSegundo >= H2.HoraParaSegundo;
End;
{--------------------------------------------------------------------------}
end.
VI-1
APÊNDICE VI
λ
f x ( x; r , λ ) = (λ ⋅ x )r −1 e −λx I [0,∞ ) ( x) (VI.1)
Γ(r )
onde: fx(x; r,λ) – probabilidade de ocorrência de “x” para uma distribuição Gama
com parâmetros “r” e “λ” conhecidos;
“λ” e “r” – parâmetros descritores da forma da curva de distribuição;
Γ• - função Gama, discutida no item VI.1;
x – variável aleatória;
e – base dos logaritmos naturais;
I – intervalo de validade para a variável aleatória.
r
x= (VI.2)
λ
r
σ2 = (VI.3)
λ2
VI-2
x
λ= (VI.4)
σ2
x2
r= (VI.5)
σ2
Γ•)
VI.1. Função Gama (Γ
∞
Γ(t ) = ∫ x t −1 ⋅ e − x dx para t>0 (VI.6)
0
∞
Γ(t + 1) = ∫ x t ⋅ e − x dx
0
∞ t
x
Γ(t + 1) = t ∫ ⋅ e − x dx
0 t
xt
u= → du = x t −1dx
t
dv = e − x dx → v = −e − x
∞
xt −x
Γ(t + 1) = t ⋅ − e + ∫ e − x ⋅ x t −1dx
0
t
∞t 0 t ∞
Γ(t + 1) = t. − e + e + t ⋅ ∫ x t −1 ⋅ e − x dx
−∞ 0
14t24 3 1 t23
0
0 0
∞
Γ(t + 1) = t ∫ x t −1 ⋅ e − x dx
0
Γ(t + 1) = t ⋅ Γ(t )
por analogia
Γ(t ) = (t − 1) ⋅ Γ(t − 1)
portanto
Γ(t + 1) = t ⋅ (t − 1) ⋅ Γ(t − 1)
Γ(t ) = (t − 1) ! (VI.7)
VI-4
interface
// tipos de dados
Type
VI-5
implementation
//-------------------------------------------------------------------------
Function Gama(x: Extended): Extended;
// função adaptada de programa legado a domínio público por:
// Bent Nielsen
// Nuffield College, Oxford OX1 1NF, UK
// http://www.nuff.ox.ac.uk/users/nielsen
{ 21-8-97
VI-6
//.........................................................................
//.........................................................................
begin;
r:=Elev(med/desv,2);
lb:=med/(Desv*desv);
end;
//--------------------------------------------------------------------------
function ProbNormal(x,m,s: extended): extended;
begin;
result:=(1/(S*Sqrt(2*Pi)))*Exp(-0.5*Elev((X - M)/S,2));
end;
//--------------------------------------------------------------------------
function UpIntNormal(x,m,s: extended): extended;
// retorna a área da curva normal à direita de "x"
// x - limitação dada da curva à esquerda
// m - média da distribuição
// s - desvio padrão da distribuição
begin;
BigNum:=m+15*s; // produz probabilidades irrisórias
N:=500; // permite precisão aceitável
Dx:=(BigNum-x)/N;
Xr:=x;
Soma:=0;
Yant:=ProbNormal(Xr,m,s);
Repeat
Xr:=Xr+Dx;
Ypost:=ProbNormal(Xr,m,s);
Soma:=Soma+((Yant+Ypost)/2)*Dx;
Yant:=Ypost;
Until Xr>=BigNum;
result:=Soma;
end;
//--------------------------------------------------------------------------
function DnIntNormal(x,m,s: extended): extended;
// retorna a área da curva normal à esquerda de "x"
// x - limitação dada da curva à direita
// m - média da distribuição
// s - desvio padrão da distribuição
begin;
LitNum:=m-15*s;
N:=500;
Dx:=(x-LitNum)/N;
VI-8
Begin;
result:=1-DnIntNormal(m-a,m,s)-UpIntNormal(m+a,m,s);
end;
//--------------------------------------------------------------------------
function LimCentralNormal(abr,m,s: extended): extended;
// retorna os limites, equidistantes da média, que, em uma curva normal
// caracterizada por média e desvio padrão, contenham a área de abrangência
// dada em "abr": [m-result;m+result]
// abr - área de abrangência [0,1] correspondendo a [0;100%]
// m - média
// s - desvio padrão
begin;
Err:=1E-8;
Yant:=0;
Ypost:=100*s;
Y:=m+s;
Yold:=m-s;// um valor que nunca possa ser igual a "Y";
While Abs(Y-Yold)>Err Do
Begin;
A:=CenIntNormal(Y,m,s);
Yold:=Y;
If A>Abr then Ypost:=Y;
If A<Abr then Yant:=Y;
Y:=(Yant+Ypost)/2;
end;
result:=Y;
end;
//--------------------------------------------------------------------------
function NormalMultiModal(X: extended; const A: array of TCaractDist;
esc:extended; Int: extended): extended;
// A - matriz que contém as características de cada distribuição parcial
// (média, desvio padrão e peso com que entra na soma)
// esc - fator de escala correspondente a 1/n (ou 1/Xmáx), pois a rotina
// utiliza a normal reduzida. Se igual a 1 retorna sob a reduzida.
// Int - intervalo de classe para aquele valor "X";
Begin;
S:=0;
PesoTot:=0;
VI-9
APÊNDICE VII
interface
Type
private
FId: Cardinal; // identificador
FDataNasc: TData; // data de nascimento;
FDataObito: TData; // data de óbito
public
property Id:Cardinal read FId write FId;
property DataNasc: TData read FDataNasc write FdataNasc;
property DataObito: TData read FDataObito write FDataObito;
THomem = class(TPessoa)
private
FSexo: Byte; // 1-masc
public
Property Sexo: Byte read FSexo;
TMulher = class(TPessoa)
private
FSexo: Byte; // 2 - feminino
FGravida: Boolean; // estado de gravidez
FDataNascFilho: TData; // data rojetada para o nascimento de filho
protected
procedure SetDataNascFilho(DNx:TData);
public
property Sexo: Byte read FSexo;
property Gravida: Boolean read FGravida;
property DataNascFilho: TData read FDataNascFilho write SetDataNascFilho;
constructor Create (Ident: Cardinal); override;
destructor Destroy; override;
end;
TFamilia = class(TObject)
private
FId: Cardinal;
FMembros: TList; // contém apontadores para TPessoa
VII.1
Para o exemplo mais complexo apresentado no Capítulo 12, esses objetos foram
divididos em dois módulos: “TiposPop” e “Dominios”, como se vê no Apêndice VIII.
VII-3
TEconomia = class(TObject)
private
FId: Cardinal; // identificação
FFamilia: TFamilia; // família que a ocupa
FVincJur: byte; // tipo de contrato: 1-imóvel próprio; 2-alugado
FDataEntr: TData; // data de entrada (início do contrato). Se
// "FOcupado" é falseo, contém a data de
// reocupação
FDataSaida: TData; // data projetada para saída
FOcupado: Boolean; // estado de ocupação
public
property Id: cardinal read FId;
property Familia: TFamilia read FFamilia;
property VincJur: byte read FVincJur write FVincJur;
property DataEntr: TData read FDataEntr write FDataEntr;
property DataSaida: TData read FDataSaida write FDataSaida;
property Ocupado: Boolean read FOcupado;
procedure Limpar;
procedure EntraFamilia(F:TFamilia; D:Tdata; VJ:Byte);
procedure SaiFamilia;
end;
private
FEconomias: TList; // lista das economias que compõem o prédio
FNumEcon: Cardinal; // número de economias
implementation
Begin;
Id:=Ident;
End;
//--------------------------------------------------------------------------
destructor TPessoa.Destroy;
Begin;
inherited Destroy;
End;
//========================== THomem ========================================
constructor THomem.Create(Ident:Cardinal);
Begin;
inherited create (Ident);
FSexo:=1;
End;
//--------------------------------------------------------------------------
destructor THomem.Destroy;
Begin;
inherited destroy;
End;
//========================== TMulher =======================================
constructor TMulher.Create (Ident: Cardinal);
Begin;
inherited Create (Ident);
FGravida:=False;
FSexo:=2;
end;
//--------------------------------------------------------------------------
destructor TMulher.Destroy;
Begin;
inherited destroy;
End;
//--------------------------------------------------------------------------
procedure TMulher.SetDataNascFilho(DNx:TData);
Begin;
FGravida:=True;
FDataNascFilho:=DNx;
End;
//========================== TFamilia ======================================
VII-5
begin;
FId:=Ident;
FMembros:=TList.Create;
FNumPess:=0;
End;
//--------------------------------------------------------------------------
destructor TFamilia.Destroy;
var R: ^TPessoa;
I: cardinal;
Begin;
If FMembros.Count>0 Then
For I:=0 To FMembros.Count-1 Do
begin;
R:=FMembros[I];
R^.free;
End;
FMembros.Free;
inherited destroy;
End;
//--------------------------------------------------------------------------
procedure TFamilia.AdicionaPessoa (P:TPessoa);
Begin;
New(R);
R^:=P;
FMembros.Add(R);
Inc(FNumPess);
End;
//--------------------------------------------------------------------------
function TFamilia.RemovePessoa(Ident: Cardinal): Boolean;
var I: Cardinal;
Begin;
result:=false;
I:=0;
While (I<FNumPess) and (not Result) Do
begin;
R:=Fmembros[I];
result:=R^.FId=Ident;
inc(I);
End;
If result then
begin;
Dec(I);
Fmembros.Delete(I);
Dec(FNumPess);
End;
End;
//========================== TEconomia =====================================
constructor TEconomia.Create (Ident: Cardinal);
Begin;
FId:=Ident;
FFamilia:=TFamilia.Create(0);
FOcupado:=False;
FDataEntr.Atualdata;
FVincJur:=0;
End;
//--------------------------------------------------------------------------
VII-6
Begin;
FFamilia.Destroy;
FOcupado:=False;
End;
//--------------------------------------------------------------------------
destructor TEconomia.Destroy;
Begin;
FFamilia.Destroy;
inherited destroy;
End;
//---------------------------------------------------------------------------
procedure TEconomia.EntraFamilia(F:TFamilia; D:Tdata; VJ:Byte);
begin;
If not FOcupado Then
begin;
FFamilia:=F;
FVincJur:=VJ;
FDataEntr:=D;
FOcupado:=True;
End
Else
raise exception.create('Não foi possível inserir essa família!');
End;
//--------------------------------------------------------------------------
procedure TEconomia.SaiFamilia;
Begin;
FOcupado:=False;
End;
//=========================== TPredio ======================================
constructor TPredio.Create;
Begin;
FEconomias:=TList.Create;
FNumEcon:=0;
End;
//--------------------------------------------------------------------------
procedure TPredio.Limpar;
var I: Cardinal;
R: ^TEconomia;
Begin;
If FEconomias.Count>0 Then
For I:=0 To FEconomias.Count-1 Do
begin;
R:=FEconomias[I];
R^.Limpar;
Dispose(R);
End;
FEconomias.Count:=0;
End;
//--------------------------------------------------------------------------
destructor TPredio.Destroy;
var I: Cardinal;
R: ^TEconomia;
Begin;
If FEconomias.Count<>0 Then
VII-7
// A variável "R" não pode ser local à procedure. se assim for a procedure
// cria a mesnma na pilha ("Stack"), liberando e sobrescrevendo sua
// área na saída. Especialmente porque, se local, será criada no segmento
// de dados da procedure ("stack"), não "vivendo" tanto quanto o
// objeto prédio.
Begin;
New(R);
R^:=E;
FEconomias.Add(R);
Inc(FNumEcon);
End;
//--------------------------------------------------------------------------
procedure TPredio.PopularInicial(Di:Tdata;NEcon:Cardinal;TxEcDes:Extended);
var E:TEconomia;
F: TFamilia;
Pes: TPessoa;
Hom: THomem;
Mul: TMulher;
I,J: Cardinal;
D,D1: TData;
NumHab: Cardinal;
VJ: Byte;
begin
Self.Limpar;
If NEcon=0 Then Exit;
For I:=1 To NEcon Do
Begin;
E:=TEconomia.Create(I); // cria uma economia
F:=TFamilia.Create(100*I+1); // cria uma família por economia
If dado(10000000)>=Round(TxEcDes*1E7) Then // determina se
NumHab:=DetermNumHab // a economia começa ocupada
Else NumHab:=0; // ou desocupada
D:=Di; // a familia entra ocupa a economia na data de hoje
For J:=1 To NumHab Do // se NumHab>0 cria as pessoas
Begin;
Pes:=TPessoa.Create(10000*I+100*1+J);
Pes.DataNasc:=DetermDataNasc(D);
case DetermSexoExistente(Pes.DataNasc,D) of
1: Begin;
Hom:=THomem.Create(Pes.Id);
Hom.DataNasc:=Pes.DataNasc;
Hom.DataObito:=DetermObito(Hom.Sexo,Hom.DataNasc,D);
F.AdicionaPessoa(Hom);
End;
2: Begin;
Mul:=TMulher.Create(Pes.Id);
Mul.DataNasc:=Pes.DataNasc;
VII-8
Self.InsereEconomia(E);
// não se pode destruir "E" se não a área da variável cujo ponteiro
// está na lista de economias do prédio será liberada e sobrescrita.
// mas pode criar outra sobre esta variável, que será alocada em
// outra área. Lembrar que a área anterior está "lembrada" na lista
// de economias do Prédio.
End;
end;
//--------------------------------------------------------------------------
procedure TPredio.ListaDetalhes(ArqSai,Titulo:String);
begin
AssignFile(F,ArqSai);
Rewrite(F);
Writeln(F, Titulo);
Writeln(F);
Writeln(F,'Num. de economias: '+IntToStr(Self.NumEcon));
For I:=1 To Self.NumEcon Do
Begin;
PE:=Self.Economias[I-1];
Str(PE^.Id:2,S);
Fillzero(S);
Writeln(F,SPC(3),'Economia '+S);
If PE^.Ocupado Then
Begin;
S:='Data de Entrada: '+PE^.DataEntr.Textodata(1);
S1:='Saida determinada para: '+PE^.DataSaida.Textodata(1);
case PE^.VincJur of
1: S2:='Trata-se de imóvel próprio';
2: S2:='Trata-se de imóvel alugado';
end;
Writeln(F,SPC(4),S);
Writeln(F,SPC(4),S1);
Writeln(F,SPC(4),S2,#13,#10);
Str(PE^.Familia.Ident:4,S);
Fillzero(S);
Writeln(F,SPC(6),'Família: ' + S);
Writeln(F,SPC(7),'Número de Pessoas: '+
VII-9
IF PP^.ClassName='TMulher' Then
Begin;
S3:='Sexo Feminino';
If (PP^ as TMulher).Gravida Then
S4:='Grávida, filho esperado para '+
(PP^ as TMulher).DataNascFilho.Textodata(1)+
'.'+#13+#10
Else S4:='';
End;
IF PP^.ClassName='THomem' Then
Begin;
S3:='Sexo Masculino';
End;
Writeln(F,SPC(10),S);
Writeln(F,SPC(11),S3);
Writeln(F,SPC(11),S1);
Writeln(F,SPC(11),S2);
Writeln(F,SPC(11),S4);
End;
end
Else
Begin;
S:='Data de futura ocupação: '+PE^.DataEntr.Textodata(1);
S1:='';
S2:='';
Writeln(F,SPC(4),S);
Writeln(F,SPC(4),S1);
Writeln(F,SPC(4),S2,#13,#10);
end;
End;
CloseFile(F);
end;
//--------------------------------------------------------------------------
procedure TPredio.ProcessaEntradaSaida(DHoje:Tdata);
var DParto:TData;
F: TFamilia;
Pes:TPessoa;
NumHab,I,J: Cardinal;
PE: ^TEconomia;
Hom: THomem;
Mul: TMulher;
VJ: Byte;
begin
For I:=1 To Self.NumEcon Do
Begin;
PE:=Self.Economias[I-1];
If PE^.Ocupado Then
Begin; // se ocupado verifica hipótese de saída naquele dia
If MyDelphiUnit02.Eq(DHoje,PE^.DataSaida) Then
VII-10
case DetermSexoExistente(Pes.DataNasc,DHoje) of
1: Begin;
Hom:=THomem.Create(Pes.Id);
Hom.DataNasc:=Pes.DataNasc;
Hom.DataObito:=DetermObito(Hom.Sexo,Hom.DataNasc,DHoje);
F.AdicionaPessoa(Hom);
End;
2: Begin;
Mul:=TMulher.Create(Pes.Id);
Mul.DataNasc:=Pes.DataNasc;
Mul.DataObito:=DetermObito(Mul.Sexo,Mul.DataNasc,DHoje);
If DetermGravidez(Mul.DataNasc,DHoje,DParto) Then
Mul.DataNascFilho:=DParto;
F.AdicionaPessoa(Mul);
End;
end;
Pes.Destroy;
End;
VJ:=DetermVincJur(NumHab);
PE^.EntraFamilia(F,DHoje,VJ);
PE^.DataSaida:=DetermdataSaida(VJ,PE^.DataEntr);
End;
End;
End;
End;
//--------------------------------------------------------------------------
procedure TPredio.ProcessaNasceMorre(DHoje:Tdata);
var DParto,D1:TData;
Pes:TPessoa;
PP,PP1: ^TPessoa;
I,J,K,W: Cardinal;
PE: ^TEconomia;
Hom: THomem;
Mul: TMulher;
begin
For I:=1 To Self.NumEcon Do // percorre todas as economias
Begin;
PE:=Self.Economias[I-1];
If PE^.Ocupado Then
Begin;
J:=1;
Repeat // percorre cada pessoa de cada economia
Begin;
VII-11
2: Begin;
Mul:=TMulher.Create(Pes.Id);
Mul.DataNasc:=DHoje;
Mul.DataObito:=DetermObito(Mul.Sexo,Mul.DataNasc,DHoje);
PE^.Familia.AdicionaPessoa(Mul);
End;
end;
Pes.Destroy;
end;
end;
end;
End;
Inc(J);
Until J>PE^.Familia.NumPess;
End;
End;
End;
//--------------------------------------------------------------------------
end.
interface
const
// "pasta" onde se encontram os arquivos descritores das distribuições
// de probabilidades observadas
DirBase: String = 'D:\Doutorado\Tese\Programas dos Exemplos\Anexo D\';
implementation
RCla:TClaDistDisc;
PDistDisc: TPTClaDistDisc;
IntervNumHab: TListaIntervalos;
IdadeCla: TListaIntervalos;
IntervSexoIdade: Array[0..100] of TListaIntervalos;
IntervVincJur: Array[1..7] of TListaIntervalos;
IntervTempoPermProprio: TListaIntervalos;
IntervTempoPermAlug: TListaIntervalos;
IntervTempoRehab: TListaIntervalos;
_I: Integer;
_S: String;
_med,_dev,_r,_lb:extended;
_NDias: Cardinal;
//-------------------------------------------------------------------------
function DetermNumHab: Cardinal;
Begin;
result:=IntervNumHab.GetClasse(Dado(1000000)/1000000);
End;
//-------------------------------------------------------------------------
function DetermDataNasc(Hoje: TData):TData;
var D:TData;
Idade: Integer;
Begin;
D:=Hoje;
Idade:=IdadeCla.GetClasse(Dado(1000000)/1000000);
D.NovaData(-Dado(365));
D.Ano:=D.Ano-Idade;
Result:=D;
End;
//-------------------------------------------------------------------------
function DetermSexoExistente(DNasc, Hoje: TData):Byte;
Begin;
Id:=AnosDeIdade(DNasc,Hoje);
VII-14
Begin;
Result:=Dado(2);
End;
//-------------------------------------------------------------------------
function DetermObito(Sexo: Byte; DNasc, DHoje: TData): TData;
var D: TData;
IM: Word;
II,N: Integer;
Soma: Extended;
IntervObitos: TListaIntervalos;
begin;
IntervObitos:=TListaIntervalos.create;
D:=DNasc;
Case Sexo of
1: LClasses.CopiaDeListaDistClasses(LClaObMasc);
2: LClasses.CopiaDeListaDistClasses(LClaObFem);
else
raise exception.create('Não existe sexo de código "'+
IntToStr(Sexo)+'".');
end;
Soma:=0;
IM:=AnosDeIdade(DNasc,DHoje);
N:=LClasses.NumClasses-1;
For II:=0 To N Do
Begin;
PDistDisc:=LClasses.ListaClasses.Items[II];
If PDistDisc^.ValRet<IM Then PDistDisc^.Prob:=0;
PDistDisc^.Prob:=1E7*PDistDisc^.Prob;
Soma:=Soma+PDistDisc^.Prob;
End;
For II:=0 To N Do
Begin;
PDistDisc:=LClasses.ListaClasses.Items[II];
PDistDisc^.Prob:=Round(1E7*PDistDisc^.Prob/Soma)*1E-7;
End;
IntervObitos.GeraIntervalos(LClasses);
IM:=IntervObitos.GetClasse(Dado(1000000)/1000000);
D.Ano:=D.Ano+IM;
D.NovaData(+(Dado(366)-1));
result:=D;
IntervObitos.Free;
end;
//-------------------------------------------------------------------------
function DetermGravidez(DNasc, DHoje: TData; var DatPart: TData): Boolean;
Begin;
Id:=AnosDeIdade(DNasc,DHoje);
If (Id<15) or (Id>50) Then
VII-15
Begin;
result:=IntervVincJur[NHab].GetClasse(Dado(1000000)/1000000);
End;
//-------------------------------------------------------------------------
function DetermDataSaida(VJ:Byte; DEntr: TData): Tdata;
Begin
D1:=DEntr;
case VJ of
1: begin; // próprio
DSaida:=IntervTempoPermProprio.GetClasse(Dado(1000000)/1000000);
D1.NovaData(DSaida);
end;
2: Begin; // alugado
DSaida:=IntervTempoPermAlug.GetClasse(Dado(1000000)/1000000);
D1.NovaData(DSaida);
end
Else
raise exception.Create ('Vínculo jurídico inválido.');
end;
result:=D1;
End;
//-------------------------------------------------------------------------
function DetermDataRehab(DDesoc: Tdata): TData;
Begin
D1:=DDesoc;
DRehab:=IntervTempoRehab.GetClasse(Dado(1000000)/1000000);
D1.NovaData(DRehab);
result:=D1;
End;
//-------------------------------------------------------------------------
initialization
IdadeCla:=TListaIntervalos.Create;
LCla.LeArquivoClasses(DirBase + 'Idade.ace');
IdadeCla.GeraIntervalos(LCla);
For _I:=1 To 7 Do
Begin;
IntervVincJur[_I]:=TListaIntervalos.Create;
Str(_I:1,_S);
_S:=DirBase+'VincJur'+_S+'.ace';
LCla.LeArquivoClasses(_S);
IntervVincJur[_I].GeraIntervalos(LCla);
End;
end.
uses
Forms,
Unit1 in '..\..\Anexo D\Testes dos Tipos\Unit1.pas' {Form1},
TiposPop in '..\..\Anexo D\Testes dos Tipos\TiposPop.pas',
DistrPop in '..\..\Anexo D\Testes dos Tipos\DistrPop.pas';
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Gauges, RelCalend, RegVal;
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
type
VII-21
implementation
{$R *.DFM}
//--------------------------------------------------------------------------
procedure TForm1.RegistraPopulacaoDoDia;
// registra estado populacional do dia apontado por "RC1"
Begin
Soma:=0;
For I:=1 To _P.NumEcon Do
Begin;
PE:=_P.Economias[I-1];
If PE^.Ocupado then N:=PE^.Familia.NumPess Else N:=0;
Soma:=Soma+N;
Registros[I].InserePonto(RC1.RData,RC1.RHora,N);
End;
RSoma.InserePonto(RC1.RData,RC1.RHora,Soma);
End;
VII-22
var I: Cardinal;
begin
_P.PopularInicial(RC1.RData,NumDeAptos,0.1); // 10% unidades desocupadas
RegistraPopulacaoDoDia;
G1.MaxValue:=Round(AnosDeSimulacao*365.25);
For I:=1 To G1.MaxValue Do
Begin;
RC1.Incrementa;
G1.Progress:=I;
End;
End;
//--------------------------------------------------------------------------
procedure TForm1.RC1MudaData(Sender: TObject);
// responde ao evento "mudar data" do relógio da simulação, comandando a
// dinâmica populacional do prédio para a nova data
begin
Label2.Caption:=RC1.SData;
Label2.Refresh;
_P.ProcessaEntradaSaida(RC1.RData);
_P.ProcessaNasceMorre(RC1.Rdata);
RegistraPopulacaoDoDia;
end;
//--------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
// cria objetos adicionados manualmente ao Form1
var I: Cardinal;
begin
For I:=1 To NumDeAptos Do Registros[I]:=TRegVal.Create(Self);
RSoma:=TRegval.Create(Self);
Edit1.Text:='8';
end;
//--------------------------------------------------------------------------
procedure TForm1.FormDestroy(Sender: TObject);
// destroi objetos acionados maualmente a Form1
var I: Cardinal;
begin
For I:=1 To NumDeAptos Do Form1.Registros[I].Destroy;
RSoma.Destroy;
end;
//--------------------------------------------------------------------------
procedure TForm1.Button3Click(Sender: TObject);
// Exporta os registros de cada unidade habitacional e o registro soma
// para arquivos do MS-Excel 97.
var I: cardinal;
S: String;
begin
G2.MaxValue:=NumDeAptos;
ShowMessage('Iniciando exportação.');
For I:=1 To NumDeAptos Do
Begin;
Str(I:2,S);
VII-23
begin
Label2.Caption:=RC1.Sdata;
end;
//--------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
// Grava resultado em arquivo texto, formato "Holerite", para leitura por
// qualquer tipo de programa. O formato utilizado é: "10H,(NumAptos)I1,I3"
// por exemplo: "10H,40I1,I3" => uma data, no formato dd/mm/aaaa seguido de
// 41 números de habitantes de cada apartamento no formato "0", e um número
// de habitantes total do prédio no formato "000". Cada linha corresponde a
// uma data.
begin
S:='F:\FormatoH.txt';
AssignFile(F,S);
Rewrite(F);
try
For I:=1 To RSoma.n Do
Begin;
P:=RSoma.Lista[I-1];
S:=P^.Data.TextoData(1);
For J:=1 To NumDeAptos Do
Begin;
P:=Registros[J].Lista[I-1];
Str(Round(P^.Valor):1,S1);
FillZero(S1);
S:=S+S1;
End;
P:=RSoma.Lista[I-1];
Str(Round(P^.Valor):3,S1);
FillZero(S1);
S:=S+S1;
Writeln(F,S);
End;
finally
CloseFile(F);
end;
ShowMessage('Gravação formato "H" concluída.');
end;
//--------------------------------------------------------------------------
procedure TForm1.Button4Click(Sender: TObject);
var S: String;
N,I: cardinal;
begin
VII-24
finalization
_P.destroy;
end.
VIII-1
APÊNDICE VIII
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TTipoAparelho = (apnone,apChuv,apLavat,apBacSanit,apPiaCoz,
apTqLR,apMaqLavRoup);
TAparelho = class(TComponent)
private
{ Private declarations }
FVazao: extended; // vazão em [m3/s]
FCd: extended; // Coeficiente de descarga [m3/(s.Pa^(1/Fn))]
FCdMax: extended; // Coeficiente de descarga máximo
FPressao: extended; // Pressão de entrada [Pa]
Fn: extended; // expoente da curva de descarga [0]
FOperando: Boolean; // estado de operação
FAvisaParada: TNotifyEvent; // manipula evento de parada de operação
FModelo: TCaption; // descrição de modelo
FTipo: TTipoAparelho;
protected
{ Protected declarations }
VIII-2
public
{ Public declarations }
published
{ Published declarations }
property n: extended read Fn write SetN;
property Cd: extended read GetCd write SetCd;
property CdMax: extended read FCdMax write FCdMax;
property Vazao: extended read GetVazao;
property Pressao: extended read GetPressao write SetPressao;
property Operando: Boolean read FOperando;
property OnParada: TNotifyEvent read FAvisaParada write FAvisaParada;
property Modelo: TCaption read FModelo write FModelo;
property Tipo: TTipoAparelho read FTipo;
end;
protected
public
constructor Create(AOwner:TComponent); override;
procedure IniciarOperacao(Tdur,UId:cardinal); reintroduce;
procedure IncrementarUmSegundo; override;
published
property UsAnt: cardinal read FUsAnt;
property UsId: cardinal read FUsId;
property TempoDecorrido: Cardinal read FTempoDecor;
property TempoDuracao: cardinal read FTempoDur write FTempoDur;
end;
protected
VIII-3
published
property VolEscoado: extended read FVolEscoado;
property VolTanque: extended read FVolTanque;
end;
protected
public
constructor Create(AOwner:TComponent); override;
procedure IniciarOperacao; reintroduce;
procedure IncrementarUmSegundo; override;
published
end;
TApChuveiro = class(TApTempoPresUser)
private
protected
public
constructor Create(AOwner: TComponent); override;
published
end;
TApLavatorio = class(TApTempoPresUser)
private
protected
public
constructor Create(AOwner: TComponent); override;
published
end;
TApBaciaSanitaria6L = class(TApVolume)
private
protected
public
constructor Create(AOwner:TComponent); override;
procedure IniciarOperacao; reintroduce;
published
end;
TApPiaDeCozinha = class(TApTempoPresUser)
private
VIII-4
public
constructor Create(AOwner:TComponent); override;
published
end;
TApTanque = class(TApTempoPresUser)
private
protected
public
constructor Create(AOwner:TComponent); override;
published
end;
private
FVolTanque: extended;
FVolEscoado: extended;
FTempoDecor: cardinal;
FNFase:cardinal;
protected
public
property Fase:cardinal read FNFase;
constructor Create(AOwner:TComponent); override;
procedure IniciarOperacao; reintroduce;
procedure IncrementarUmSegundo; override;
published
end;
implementation
uses MyDelphiUnit03;
Begin;
inherited create(AOwner);
FCdMax:=3E-6; // arbitrário. Mas deve ser > que FCd calculado
Fvazao:=2E-4; // arbitrário
FPressao:=5E3; // arbitrário
Fn:=2; // padrão mas pode ser alterado
FCd:=Abs(Fvazao)/Elev(Abs(FPressao),1/Fn);
FOperando:=False;
FModelo:='';
FTipo:=apNone;
End;
//--------------------------------------------------------------------------
function TAparelho.GetVazao: extended;
VIII-5
begin;
result:=self.FPressao;
end;
//--------------------------------------------------------------------------
procedure TAparelho.AssumeCd(Q,P: extended);
var R: extended;
begin;
If Q=0 Then
If P=0 Then
Begin;
raise exception.create('Coeficiente de descarga indefinido!');
R:=0;
End
Else R:=0
Else
If P=0 Then R :=BigNum
Else R:=Abs(Q)/Elev(Abs(P),1/Fn);
If R>FCdmax Then R:=FCdMax;
SetCd(R);
End;
//--------------------------------------------------------------------------
procedure TAparelho.SetCd(X:extended);
Begin;
FCd:=Abs(X);
If Fcd>FCdMax Then FCd:=FCdmax;
Fvazao:=FCd*Elev(FPressao,1/Fn);
End;
//--------------------------------------------------------------------------
function TAparelho.GetCd: extended;
Begin;
If FOperando then result:=FCd else result:=0;
End;
//--------------------------------------------------------------------------
procedure TAparelho.SetN(N:extended);
Begin;
Fn:=Abs(N);
Fvazao:=FCd*Elev(FPressao,1/Fn);
End;
//--------------------------------------------------------------------------
procedure TAparelho.SetPressao(P:extended);
Begin;
FPressao:=Abs(P);
FVazao:=FCd*Elev(FPressao,1/Fn);
End;
//--------------------------------------------------------------------------
procedure TAparelho.EncerrarOperacao;
begin;
FCd:=0;
FOperando:=False;
AvisaParada;
VIII-6
Begin;
AssumeCd(Abs(Q),FPressao);
FOperando:=True;
End;
//--------------------------------------------------------------------------
procedure TAparelho.IniciarOperacao;
Begin;
FOperando:=True;
End;
//--------------------------------------------------------------------------
procedure TAparelho.AbrirTotal;
Begin;
FCd:=FCdMax;
Fvazao:=FCd*Elev(FPressao,1/Fn);
FOperando:=True;
End;
//--------------------------------------------------------------------------
procedure TAparelho.IncrementarUmSegundo;
begin;
ShowMessage('"TAparelho.IncrementarUmSegundo" - Esse método não faz '+
'nada. Deve-se defini-lo sempre em uma classe "filha" de '+
'"TAparelho".');
end;
//--------------------------------------------------------------------------
procedure TAparelho.AvisaParada;
Begin;
If assigned(FAvisaParada) Then FAvisaParada(Self);
End;
//====================== TApTempoPresUser ==================================
constructor TApTempoPresUser.Create(AOwner:TComponent);
Begin;
inherited create(AOwner);
FTempoDur:=0;
FTempoDecor:=0;
FUsId:=0;
FModelo:='Aparelho que fecha por tempo e segura o usuário';
End;
//--------------------------------------------------------------------------
procedure TApTempoPresUser.IniciarOperacao(TDur,UId:cardinal);
Begin;
FTempoDur:=TDur;
FTempoDecor:=0;
FUsId:=UId;
inherited IniciarOperacao;
End;
//--------------------------------------------------------------------------
procedure TApTempoPresUser.IncrementarUmSegundo;
Begin;
If FOperando Then
Begin;
Inc(FTempoDecor);
If FTempoDecor >= FTempoDur Then
VIII-7
Begin;
inherited create(AOwner);
FVolTanque:=0;
FVolEscoado:=0;
FModelo:='aparelho de parada por volume';
End;
//--------------------------------------------------------------------------
procedure TApVolume.IniciarOperacao;
Begin;
FVolEscoado:=0;
inherited iniciarOperacao;
End;
//--------------------------------------------------------------------------
procedure TApVolume.IncrementarUmSegundo;
Begin;
If FOperando then
Begin;
FVolEscoado:=FVolEscoado+1*FVazao;
If FVolEscoado >= FVolTanque Then
Begin;
FVolEscoado:=0;
inherited EncerrarOperacao;
End;
End;
End;
//========================== TApCiclo ======================================
constructor TApCiclo.Create(AOwner: TComponent);
Begin;
inherited Create(AOwner);
FVolEscoado:=0;
FTempoDecor:=0;
FModelo:='aparelho que opera por ciclo automático';
End;
//--------------------------------------------------------------------------
procedure TApCiclo.IniciarOperacao;
Begin;
FVolEscoado:=0;
FTempoDecor:=0;
inherited IniciarOperacao;
End;
//--------------------------------------------------------------------------
procedure TApCiclo.IncrementarUmSegundo;
Begin;
ShowMessage('Esse método deve ser sobrescrito por um método específico'+
' que controle o ciclo de operação');
End;
//========================== TApChuveiro ===================================
VIII-8
begin;
inherited Create(AOwner);
FModelo:='chuveiro';
FTipo:=apChuv;
FCdMax:=7.82E-7;
end;
//========================== TApLavatorio ==================================
constructor TApLavatorio.Create(AOwner:TComponent);
begin;
inherited Create(AOwner);
FModelo:='lavatório';
FTipo:=apLavat;
FCdMax:=7.57E-7;
end;
//========================== TApBaciaSanitaria6L ===========================
constructor TApBaciaSanitaria6L.Create(AOwner:TComponent);
begin;
inherited Create(AOwner);
FModelo:='bacia sanitária 6 litros';
FVolTanque:=7E-3;
FTipo:=apBacSanit;
FCdMax:=3.53E-7;
end;
//--------------------------------------------------------------------------
procedure TApBaciaSanitaria6L.IniciarOperacao;
Begin;
inherited IniciarOperacao;
AbrirTotal;
End;
//========================== TApPiaDeCozinha ===============================
constructor TApPiaDeCozinha.Create(AOwner:TComponent);
begin;
inherited Create(AOwner);
FModelo:='pia de cozinha';
FTipo:=apPiaCoz;
FCdMax:=1.26E-6;
end;
//========================= TApTanque ======================================
constructor TApTanque.Create(AOwner:TComponent);
begin;
inherited Create(AOwner);
FModelo:='tanque de lavar roupas';
FTipo:=apTQLR;
FCdMax:=1.26E-6;
end;
//========================== TMaqLavarCap4 =================================
constructor TMaqLavarCap4.Create(AOwner:TComponent);
Begin;
inherited Create(AOwner);
FVolTanque:=53E-3;
FTempoDecor:=0;
FVolEscoado:=0;
FNFase:=0;
FTipo:=apMaqLavRoup;
FModelo:='máquina de lavar roupas 4 Kg';
End;
VIII-9
begin;
FTempoDecor:=0;
FVolEscoado:=0;
FNFase:=0;
FCd:=5.338E-7;
inherited IniciarOperacao;
End;
//--------------------------------------------------------------------------
procedure TMaqLavarCap4.IncrementarUmSegundo;
var X: Cardinal;
Begin;
If FOperando Then
Case FNFase of
0: Begin;
FVolEscoado:=FVolEscoado+1*FVazao;
If FVolEscoado >= FVolTanque Then
Begin;
FCd:=0;
FNFase:=1;
End;
End;
1: Begin;
Inc(FTempoDecor);
If FTempoDecor >= 54*60 Then
FNFase:=2;
End;
2: Begin;
Inc(FTempoDecor);
X:=FTempoDecor-54*60-1;
X:=X mod 25;
Case X of
0..5: FCd:=5.338E-7;
6..24: FCd:=0;
End;
If FTempoDecor >=54*60+8*25 Then
Begin;
FNFase:=3;
FVolEscoado:=0;
End;
End;
3: Begin;
FCd:=5.338E-7;
FVolEscoado:=FVolEscoado+1*FVazao;
If FVolEscoado >= FVolTanque Then
Begin;
FCd:=0;
FTempoDecor:=0;
FNFase:=4;
End;
End;
4: Begin;
Inc(FTempoDecor);
If FTempoDecor >=4*60 Then
FNFase:=5;
End;
VIII-10
6: Begin;
Inc(FTempoDecor);
If FTempoDecor >= 4*60+6*60 Then
EncerrarOperacao;
End;
End;
End;
//--------------------------------------------------------------------------
end.
interface
Type
TDespachante = class(TComponent)
private
FFila: TFilaCardinal;
procedure MontaNecessidade(var User:TPessoa);
protected
public
property Fila:TFilaCardinal read FFila;
procedure VerificaNecessidades;
procedure AtendeNecessidades;
procedure LiberaAparelho(Send:TObject);
published
VIII-11
implementation
//--------------------------------------------------------------------------
constructor TDespachante.Create(AOwner:TComponent);
Begin;
inherited Create(AOwner);
FFila:=TFilaCardinal.Create;
With (Self.Owner as TPredio) Do
For K:=0 To NumEcon-1 Do
Begin;
PE:=Economias[K];
With PE^ Do
For I:=0 To NumGrupos-1 Do
For J:=0 To NumApaGrupo[I]-1 Do
GruposAp[I,J].OnParada:=LiberaAparelho;
End;
End;
//--------------------------------------------------------------------------
destructor TDespachante.Destroy;
Begin;
FFila.Free;
inherited Destroy;
End;
//--------------------------------------------------------------------------
procedure TDespachante.VerificaNecessidades;
begin;
With (Self.Owner as TPredio) Do
Begin;
For I:=0 To NumEcon-1 Do
Begin;
PE:=Economias[I];
With PE^ Do
Begin;
With Familia Do
Begin;
If NumPess<>0 Then
For J:=0 To NumPess-1 Do
Begin;
PP:=Membros[J];
With PP^ Do
Begin;
IF (EstadoDeAtendimento=eaLivre) and
not FFila.JaEstaNaFila(Id) Then
Begin;
MontaNecessidade(PP^);
end;
End;
End;
VIII-12
var T: Cardinal;
EscolheuAparelho: Boolean;
Apar:TTipoAparelho;
Begin;
// verifica se vai usar algum aparelho naquele momento.
// Se vai, registra que está em espera e põe na fila.
// ao encontrar o primeiro aparelho não mais
// procura por outro.
Apar:=apNone;
T:=Trunc(Form1.RelPrincipal.RHora.HoraParaSegundo);
Repeat
Apar:=Succ(Apar);
EscolheuAparelho:=DetermInicioAcion(Ord(Apar),T);
Until EscolheuAparelho or (Apar=High(Apar));
If EscolheuAparelho Then
Begin;
If User.RegistraNecessidade(Apar) Then
Begin;
FFila.PoeNaFila(User.Id);
End
Else
ShowMessage('Erro. Tentativa de por na fila usuário já ocupado.');
End;
End;
//--------------------------------------------------------------------------
procedure TDespachante.AtendeNecessidades;
Begin;
I:=0;
While I <= FFila.NumElem-1 Do
Begin;
Atendeu:=False;
PUid:=FFila.Items[I];
Apto:=PUId^ div 10000;
PE:=(Self.Owner as TPredio).Economias[Apto-1];
F:=PE^.Familia;
UsuarioAchado:=False;
If F.NumPess<>0 Then
For J:=0 To F.NumPess-1 Do
Begin;
VIII-13
GrupoBloqueado:=False;
Case PU^.NecessidadeAtual of
apChuv: Begin;
For J:=0 To PE^.NumApaGrupo[0]-1 Do
GrupoBloqueado:=GrupoBloqueado
or (PE^.GruposAp[0,J].Operando);
If not GrupoBloqueado Then
Begin;
Q:=Determvazao(Ord(apChuv));
T:=DetermTempoDur(Ord(apChuv));
With (PE^.GruposAp[0,0] as TApChuveiro) Do
begin;
IniciarOperacao(T,PU^.Id);
AbrirAteQ(Q);
end;
PU^.IniciaAtend;
Atendeu:=True;
End;
End;
apLavat:Begin;
For J:=0 To PE^.NumApaGrupo[0]-1 Do
GrupoBloqueado:=GrupoBloqueado
or (PE^.GruposAp[0,J].Operando);
If not GrupoBloqueado Then
Begin;
Q:=Determvazao(Ord(apLavat));
T:=DetermTempoDur(Ord(apLavat));
With (PE^.GruposAp[0,1] as TApLavatorio) Do
begin;
IniciarOperacao(T,PU^.Id);
AbrirAteQ(Q);
End;
PU^.IniciaAtend;
Atendeu:=True;
End;
End;
apBacSanit:Begin;
For J:=0 To PE^.NumApaGrupo[0]-1 Do
GrupoBloqueado:=GrupoBloqueado
or (PE^.GruposAp[0,J].Operando);
If not GrupoBloqueado Then
Begin;
(PE^.GruposAp[0,2] as TApBaciaSanitaria6L).IniciarOperacao;
PU^.IniciaAtend;
PU^.EncerraAtend;
VIII-14
apPiaCoz:Begin;
For J:=0 To PE^.NumApaGrupo[1]-1 Do
GrupoBloqueado:=GrupoBloqueado
or (PE^.GruposAp[1,J].Operando);
If not GrupoBloqueado Then
Begin;
Q:=Determvazao(Ord(apPiaCoz));
T:=DetermTempoDur(Ord(apPiaCoz));
With (PE^.GruposAp[1,0] as TApPiaDeCozinha) Do
Begin;
IniciarOperacao(T,PU^.Id);
AbrirAteQ(Q);
End;
PU^.IniciaAtend;
Atendeu:=True;
End;
End;
apTqLR:Begin;
For J:=0 To PE^.NumApaGrupo[2]-1 Do
GrupoBloqueado:=GrupoBloqueado
or (PE^.GruposAp[2,J].Operando);
If not GrupoBloqueado Then
Begin;
Q:=Determvazao(Ord(apTqLR));
T:=DetermTempoDur(Ord(apTQLr));
With (PE^.GruposAp[2,0] as TApTanque) Do
Begin;
IniciarOperacao(T,PU^.Id);
AbrirAteQ(Q);
End;
PU^.IniciaAtend;
Atendeu:=True;
End;
End;
apMaqLavRoup:begin;
If not PE^.GruposAp[3,0].Operando Then
(PE^.GruposAp[3,0] as TMaqLavarCap4).IniciarOperacao;
PU^.IniciaAtend;
PU^.EncerraAtend;
Atendeu:=true;
End;
else
begin;
ShowMessage('Aparelho inválido no "despachante".');
exit;
end;
end;
If Atendeu Then
Begin;
FFila.Delete(I);
MostraEstadoAparelhos(Form1.SG2);
End
Else
Inc(I);
End;
End;
VIII-15
Begin;
Tp:=(Send as TAparelho).Tipo;
If (Tp>=apChuv) and (Tp<=apTqLR) and (Tp<>apBacSanit) Then
With (Send as TApTempoPresUser) Do
Begin;
Apto:=UsAnt div 10000;
Ind:=(UsAnt mod 10000) mod 100;
PE:=(Self.Owner as TPredio).Economias[Apto-1];
F:=PE^.Familia;
PU:=F.Membros[Ind-1];
PU^.EncerraAtend;
End;
MostraEstadoAparelhos(Form1.SG2);
End;
//--------------------------------------------------------------------------
end.
interface
private
FHentrada: extended;
FQentrada: extended;
FPC: TAparelho;
FTQ: TAparelho;
FML: TAparelho;
protected
function GetQentrada:extended;
public
FEsc: Array [1..13] of TEscoamento;
// 1-T2; 2-T3; 3-T4a; 4-T4b; 5-T5; 6-T6d
// 7-T6L; 8-T8; 9-T9; 10-T11; 11-T12;
// 12-T13; 14-T14
FX: TVetor; // 1 a 18 - variáveis;
// 19 - 'H'entrada
VIII-16
// pressão de entrada
property HEntrada: extended read FHentrada write FHentrada;
// vazão de entrada calculada
property Qentrada: extended read GetQentrada;
property PC:TAparelho read FPC write FPC;
property TQ:TAparelho read FTQ write FTQ;
property ML:TAparelho read FML write FML;
procedure ResolverRede;
constructor Create;
destructor Destroy; override;
published
end;
implementation
uses unit1;
var RH1: TRamalH1; // variável global para que os dados do ramal possam
// estar visíveis para as funções f1 a fn, que não
// podem ser "locais".
//--------------------------------------------------------------------------
function DeltaH(E:TEscoamento):extended;
Begin;
begin;
result:=X[1]+X[2]-X[5];
end;
//..........................................................................
function f2(X:TVetor):extended;
begin;
result:=X[4]+X[3]-X[2];
end;
//..........................................................................
function f3(X:TVetor):extended;
VIII-17
begin;
RH1.FEsc[1].Q:=X[1];
result:=X[11]-DeltaH(RH1.Fesc[1])-X[12];
end;
//..........................................................................
function f5(X:TVetor):extended;
begin;
RH1.FEsc[2].Q:=X[1];
result:=X[10]-DeltaH(RH1.Fesc[2])-X[11];
end;
//..........................................................................
function f6(X:TVetor):extended;
begin;
RH1.FEsc[3].Q:=X[1];
result:=X[9]-DeltaH(RH1.Fesc[3])-X[10];
end;
//..........................................................................
function f7(X:TVetor):extended;
begin;
RH1.FEsc[5].Q:=X[2];
result:=X[13]-DeltaH(RH1.Fesc[5])-X[14];
end;
//..........................................................................
function f8(X:TVetor):extended;
begin;
RH1.FEsc[7].Q:=X[3];
result:=X[14]-DeltaH(RH1.Fesc[7])-X[18];
end;
//..........................................................................
function f9(X:TVetor):extended;
begin;
RH1.FTQ.Pressao:=X[18];
result:=X[3]-RH1.FTQ.Vazao;
end;
//..........................................................................
function f10(X:TVetor):extended;
begin;
RH1.FEsc[8].Q:=X[4];
result:=X[15]-DeltaH(RH1.Fesc[8])-X[16];
end;
//..........................................................................
function f11(X:TVetor):extended;
begin;
RH1.FEsc[9].Q:=X[4];
result:=X[16]-DeltaH(RH1.Fesc[9])-X[17];
end;
//..........................................................................
function f12(X:TVetor):extended;
begin;
VIII-18
begin;
RH1.FEsc[10].Q:=X[5];
result:=X[8]-DeltaH(RH1.Fesc[10])-X[9]
+0.6*RH1.Fesc[10].Local.g*RH1.Fesc[10].fluido.MassaEsp;
end;
//..........................................................................
function f14(X:TVetor):extended;
begin;
RH1.FEsc[11].Q:=X[5];
result:=X[7]-DeltaH(RH1.Fesc[11])-X[8];
end;
//..........................................................................
function f15(X:TVetor):extended;
begin;
RH1.FEsc[12].Q:=X[5];
result:=X[6]-DeltaH(RH1.Fesc[12])-X[7];
end;
//..........................................................................
function f16(X:TVetor):extended;
begin;
RH1.FEsc[13].Q:=X[5];
result:=X[19]-DeltaH(RH1.Fesc[13])-X[6];
end;
//..........................................................................
function f17(X:TVetor):extended;
begin;
RH1.FEsc[4].Q:=X[2];
result:=X[9]-DeltaH(RH1.Fesc[4])-X[13];
end;
//..........................................................................
function f18(X:TVetor):extended;
begin;
RH1.FEsc[6].Q:=X[4];
result:=X[14]-DeltaH(RH1.Fesc[6])-X[15];
end;
//..........................................................................
//--------------------------------------------------------------------------
procedure ResolveRamalH1(var R:TRamalH1);
((1,1),(1,2),(1,5),(2,3),(2,4),(2,2),(3,1),(3,12),(4,11),(4,1),(4,12),
(5,10),(5,1),(5,11),(6,9),(6,1),(6,10),(7,13),(7,2),(7,14),(8,14),(8,3),
(8,18),(9,3),(9,18),(10,15),(10,4),(10,16),(11,16),(11,4),(11,17),(12,4),
(12,17),(13,8),(13,5),(13,9),(14,7),(14,5),(14,8),(15,6),(15,5),(15,7),
(16,5),(16,6),(17,9),(17,2),(17,13),(18,14),(18,4),(18,15)
);
begin;
VIII-19
RH1:=R;
RH1.FX[19]:=RH1.HEntrada;
RH1.FX[6]:=RH1.FX[19];
RH1.FX[7]:=RH1.FX[19];
RH1.FX[8]:=RH1.FX[19];
RH1.FX[9]:=RH1.FX[19]+0.6*RH1.FEsc[10].Fluido.MassaEsp*RH1.FEsc[10].Local.g;
RH1.FX[10]:=RH1.Fx[9];
RH1.FX[11]:=RH1.Fx[9];
RH1.FX[12]:=RH1.Fx[9];
RH1.FX[13]:=RH1.Fx[9];
RH1.FX[14]:=RH1.Fx[9];
RH1.FX[15]:=RH1.Fx[9];
RH1.FX[16]:=RH1.Fx[9];
RH1.FX[17]:=RH1.Fx[9];
RH1.FX[18]:=RH1.Fx[9];
RH1.FPC.Pressao:=RH1.FX[12];
RH1.FTQ.Pressao:=RH1.FX[18];
RH1.FML.Pressao:=RH1.FX[17];
RH1.FX[1]:=RH1.FPC.Vazao;
RH1.FX[3]:=RH1.FTQ.Vazao;
RH1.FX[4]:=RH1.FML.Vazao;
RH1.FX[2]:=RH1.FX[3]+RH1.FX[4];
RH1.FX[5]:=RH1.FX[2]+RH1.FX[1];
with RH1 Do
Begin;
For I:=1 To 33 Do For J:=1 To 25 Do TabDep[I,J]:=False;
For I:=1 To 50 Do TabDep[Aux[I,1],Aux[I,2]]:=True;
End;
var I:Cardinal;
Begin;
inherited create;
For I:=1 To 13 Do
VIII-20
var i: cardinal;
Begin;
For I:=1 To 13 Do FEsc[I].free;
inherited destroy;
end;
//--------------------------------------------------------------------------
function TRamalH1.GetQentrada: extended;
begin;
If Abs(FQEntrada)<1E-35 Then result:=0 else result:=FQEntrada;
End;
//--------------------------------------------------------------------------
procedure TRamalH1.ResolverRede;
Begin;
ResolveRamalH1(Self);
End;
//--------------------------------------------------------------------------
initialization
RH1:=TRamalH1.Create;
end.
private
FHentrada: extended;
FQentrada: extended;
FCH: TAparelho;
FLV: TAparelho;
FBS: TAparelho;
protected
public
FEsc: Array [1..20] of TEscoamento;
// 1-T2; 2-T3; 3-T4; 4-T5; 5-T6L; 6-T8
// 7-T9; 8-T10; 9-T11a; 10-T12; 11-T13;
// 12-T14; 13-T16; 14-T17; 15-T18; 16-T19;
// 17-T20; 18-T21; 19-T6d; 20-T11b;
FX: TVetor; // 1 a 25 - variáveis;
// 26 - 'H'entrada
TabDep: TTabDep;
procedure ResolverRede;
constructor Create;
destructor Destroy; override;
published
end;
implementation
uses unit1;
//--------------------------------------------------------------------------
function DeltaH(E:TEscoamento):extended;
Begin;
begin;
result:=X[1]+X[2]-X[3];
end;
//..........................................................................
function f2(X:TVetor):extended;
begin;
result:=X[4]+X[3]-X[5];
end;
//..........................................................................
function f3(X:TVetor):extended;
begin;
RH2.FBS.Pressao:=X[25];
result:=X[1]-RH2.FBS.Vazao;
end;
//..........................................................................
function f4(X:TVetor):extended;
begin;
RH2.FEsc[1].Q:=X[1];
result:=X[24]-DeltaH(RH2.Fesc[1])-X[25];
end;
//..........................................................................
function f5(X:TVetor):extended;
begin;
RH2.FEsc[2].Q:=X[1];
result:=X[23]-DeltaH(RH2.Fesc[2])-
X[24]+0.4*RH2.Fesc[2].Local.g*RH2.Fesc[2].fluido.MassaEsp;
end;
//..........................................................................
function f6(X:TVetor):extended;
begin;
RH2.FEsc[3].Q:=X[1];
result:=X[22]-DeltaH(RH2.Fesc[3])-X[23];
end;
//..........................................................................
function f7(X:TVetor):extended;
begin;
RH2.FEsc[4].Q:=X[1];
result:=X[21]-DeltaH(RH2.Fesc[4])-X[22];
end;
//..........................................................................
function f8(X:TVetor):extended;
begin;
RH2.FEsc[5].Q:=X[2];
result:=X[19]-DeltaH(RH2.Fesc[5])-X[20];
end;
//..........................................................................
function f9(X:TVetor):extended;
begin;
VIII-23
begin;
RH2.FEsc[6].Q:=X[3];
result:=X[18]-DeltaH(RH2.Fesc[6])-X[19];
end;
//..........................................................................
function f11(X:TVetor):extended;
begin;
RH2.FEsc[7].Q:=X[3];
result:=X[17]-DeltaH(RH2.Fesc[7])-X[18];
end;
//..........................................................................
function f12(X:TVetor):extended;
begin;
RH2.FEsc[8].Q:=X[3];
result:=X[16]-DeltaH(RH2.Fesc[8])-X[17]
+0.5*RH2.Fesc[8].Local.g*RH2.Fesc[10].fluido.MassaEsp;
end;
//..........................................................................
function f13(X:TVetor):extended;
begin;
RH2.FEsc[9].Q:=X[4];
result:=X[11]-DeltaH(RH2.Fesc[9])-X[12];
end;
//..........................................................................
function f14(X:TVetor):extended;
begin;
RH2.FEsc[10].Q:=X[4];
result:=X[12]-DeltaH(RH2.Fesc[10])-X[13]
-0.1*RH2.Fesc[10].Local.g*RH2.Fesc[10].fluido.MassaEsp;
end;
//..........................................................................
function f15(X:TVetor):extended;
begin;
RH2.FEsc[11].Q:=X[4];
result:=X[13]-DeltaH(RH2.Fesc[11])
-X[14]-1.0*RH2.Fesc[11].Local.g*RH2.Fesc[11].fluido.MassaEsp;
end;
//..........................................................................
function f16(X:TVetor):extended;
begin;
RH2.FEsc[12].Q:=X[4];
result:=X[14]-DeltaH(RH2.Fesc[12])-X[15];
end;
//..........................................................................
function f17(X:TVetor):extended;
begin;
RH2.FCH.Pressao:=X[15];
result:=X[4]-RH2.FCH.Vazao;
end;
//..........................................................................
function f18(X:TVetor):extended;
VIII-24
begin;
RH2.FEsc[14].Q:=X[5];
result:=X[9]-DeltaH(RH2.Fesc[14])-X[10];
end;
//..........................................................................
function f20(X:TVetor):extended;
begin;
RH2.FEsc[15].Q:=X[5];
result:=X[8]-DeltaH(RH2.Fesc[15])-X[9]
+0.7*RH2.Fesc[15].Local.g*RH2.Fesc[15].fluido.MassaEsp;
end;
//..........................................................................
function f21(X:TVetor):extended;
begin;
RH2.FEsc[16].Q:=X[5];
result:=X[7]-DeltaH(RH2.Fesc[16])-X[8];
end;
//..........................................................................
function f22(X:TVetor):extended;
begin;
RH2.FEsc[17].Q:=X[5];
result:=X[6]-DeltaH(RH2.Fesc[17])-X[7];
end;
//..........................................................................
function f23(X:TVetor):extended;
begin;
RH2.FEsc[18].Q:=X[5];
result:=X[26]-DeltaH(RH2.Fesc[18])-X[6];
end;
//..........................................................................
function f24(X:TVetor):extended;
begin;
RH2.FEsc[19].Q:=X[1];
result:=X[19]-DeltaH(RH2.Fesc[19])-X[21];
end;
//..........................................................................
function f25(X:TVetor):extended;
begin;
RH2.FEsc[20].Q:=X[3];
result:=X[11]-DeltaH(RH2.Fesc[20])-X[16];
end;
//..........................................................................
//--------------------------------------------------------------------------
procedure ResolveRamalH2(var R:TRamalH2);
((1,1),(1,2),(1,3),(2,3),(2,4),(2,5),(3,1),(3,25),(4,24),(4,1),(4,25),
(5,23),(5,1),(5,24),(6,22),(6,1),(6,23),(7,21),(7,1),(7,22),(8,19),(8,2),
VIII-25
begin;
FVF[1]:=f1;
FVF[2]:=f2;
FVF[3]:=f3;
FVF[4]:=f4;
FVF[5]:=f5;
FVF[6]:=f6;
FVF[7]:=f7;
FVF[8]:=f8;
FVF[9]:=f9;
FVF[10]:=f10;
FVF[11]:=f11;
FVF[12]:=f12;
FVF[13]:=f13;
FVF[14]:=f14;
FVF[15]:=f15;
FVF[16]:=f16;
FVF[17]:=f17;
FVF[18]:=f18;
FVF[19]:=f19;
FVF[20]:=f20;
FVF[21]:=f21;
FVF[22]:=f22;
FVF[23]:=f23;
FVF[24]:=f24;
FVF[25]:=f25;
RH2:=R;
RH2.FX[26]:=RH2.HEntrada;
RH2.FX[6]:=RH2.FX[26];
RH2.FX[7]:=RH2.FX[26];
RH2.FX[8]:=RH2.FX[26];
RH2.FX[9]:=RH2.FX[26]+
0.7*RH2.FEsc[15].Fluido.MassaEsp*RH2.FEsc[15].Local.g;
RH2.FX[10]:=RH2.Fx[9];
RH2.FX[11]:=RH2.Fx[9];
RH2.FX[12]:=RH2.Fx[9];
RH2.FX[16]:=RH2.FX[9];
RH2.FX[13]:=RH2.Fx[9]
-0.1*RH2.FEsc[10].Fluido.MassaEsp*RH2.FEsc[10].Local.g;
RH2.FX[14]:=RH2.Fx[13]
-1*RH2.FEsc[11].Fluido.MassaEsp*RH2.FEsc[11].Local.g;
RH2.FX[15]:=RH2.Fx[14];
RH2.FX[17]:=RH2.Fx[16]
+0.5*RH2.FEsc[8].Fluido.MassaEsp*RH2.FEsc[8].Local.g;
RH2.FX[18]:=RH2.Fx[17];
RH2.FX[19]:=RH2.Fx[17];
RH2.FX[20]:=RH2.Fx[17];
RH2.FX[21]:=RH2.Fx[17];
RH2.FX[22]:=RH2.Fx[17];
RH2.FX[23]:=RH2.Fx[17];
RH2.FX[24]:=RH2.Fx[23]
+0.4*RH2.FEsc[2].Fluido.MassaEsp*RH2.FEsc[2].Local.g;
VIII-26
RH2.FCH.Pressao:=RH2.FX[15];
RH2.FLV.Pressao:=RH2.FX[20];
RH2.FBS.Pressao:=RH2.FX[25];
RH2.FX[1]:=RH2.FBS.Vazao;
RH2.FX[2]:=RH2.FLV.Vazao;
RH2.FX[4]:=RH2.FCH.Vazao;
RH2.FX[3]:=RH2.FX[1]+RH2.FX[2];
RH2.FX[5]:=RH2.FX[3]+RH2.FX[4];
with RH2 Do
Begin;
For I:=1 To 33 Do For J:=1 To 25 Do TabDep[I,J]:=False;
For I:=1 To 71 Do TabDep[Aux[I,1],Aux[I,2]]:=True;
End;
If RH2.FX[5]<>0 Then
NRaphEsparso (FvF,RH2.FX,25,1E-8,RH2.TabDep);
RH2.FQentrada:=RH2.FX[5];
R:=RH2;
end;
//======================= TRamalH2 =========================================
constructor TRamalH2.Create;
var I:Cardinal;
Begin;
inherited create;
For I:=1 To 20 Do
begin;
FEsc[I]:=TEscoamento.create;
FEsc[I].Fluido:=TAgua.create;
FEsc[I].Local:=TPlanetaTerra.create;
FEsc[I].Tubo.RugAbs:=0.015E-3;
FEsc[I].Tubo.Diam:=17E-3;
end;
FEsc[1].Tubo.Comprim:=1.1;
FEsc[2].Tubo.Comprim:=0.4;
FEsc[3].Tubo.Comprim:=1.1;
FEsc[4].Tubo.Comprim:=0.7;
FEsc[5].Tubo.Comprim:=2.3;
FEsc[6].Tubo.Comprim:=1.0;
FEsc[7].Tubo.Comprim:=1.1;
FEsc[8].Tubo.Comprim:=0.5;
FEsc[9].Tubo.Comprim:=2.3;
FEsc[10].Tubo.Comprim:=11.1;
FEsc[11].Tubo.Comprim:=1.1;
FEsc[12].Tubo.Comprim:=1.1;
FEsc[13].Tubo.Comprim:=0.2;
FEsc[14].Tubo.Comprim:=1.1;
FEsc[15].Tubo.Comprim:=0.7;
FEsc[16].Tubo.Comprim:=1.1;
FEsc[17].Tubo.Comprim:=0.1;
FEsc[18].Tubo.Comprim:=0.25;
FEsc[19].Tubo.Comprim:=0.7;
FEsc[20].Tubo.Comprim:=2.3;
End;
//--------------------------------------------------------------------------
destructor TRamalH2.Destroy;
var i: cardinal;
VIII-27
Begin;
ResolveRamalH2(Self);
End;
//--------------------------------------------------------------------------
initialization
RH2:=TRamalH2.Create;
end.
interface
Type
TColunaAF1 = class(TObject)
private
FHentrada: extended;
FQentrada: extended;
FRamais: TRamaisH1;
protected
public
FEsc: Array [1..20] of TEscoamento;
// 1-T1; 2-T3; 3-T4L; 4-T6; 5-T7L; 6-T9
// 7-T10L; 8-T12; 9-T13L; 10-T15; 11-T16L;
// 12-T18; 13-T19L; 14-T21; 15-T4d; 16-T7d;
// 17-T10d; 18-T13d; 19-T16d; 20-T19d;
TabDep: TTabDep;
procedure ResolverRede;
constructor Create;
destructor Destroy; override;
published
end;
implementation
uses unit1;
//--------------------------------------------------------------------------
function DeltaH(E:TEscoamento):extended;
Begin;
begin;
result:=X[1]+X[2]-X[3];
end;
//..........................................................................
function f2(X:TVetor):extended;
begin;
result:=X[3]+X[4]-X[5];
end;
//..........................................................................
function f3(X:TVetor):extended;
begin;
result:=X[5]+X[6]-X[7];
end;
//..........................................................................
function f4(X:TVetor):extended;
begin;
VIII-29
begin;
result:=X[9]+X[10]-X[11];
end;
//..........................................................................
function f6(X:TVetor):extended;
begin;
result:=X[11]+X[12]-X[13];
end;
//..........................................................................
function f7(X:TVetor):extended;
begin;
AF1.FEsc[1].Q:=X[1]/1000;
result:=X[32]-DeltaH(AF1.Fesc[1])/1000-X[33];
end;
//..........................................................................
function f8(X:TVetor):extended;
begin;
AF1.Ram[1].HEntrada:=X[33]*1000;
AF1.Ram[1].ResolverRede;
result:=X[1]-AF1.Ram[1].Qentrada*1000;
end;
//..........................................................................
function f9(X:TVetor):extended;
begin;
AF1.FEsc[2].Q:=X[1]/1000;
result:=X[31]-DeltaH(AF1.Fesc[2])/1000-X[32]
+2.9*AF1.Fesc[2].Local.g*AF1.Fesc[2].fluido.MassaEsp/1000;
end;
//..........................................................................
function f10(X:TVetor):extended;
begin;
AF1.FEsc[3].Q:=X[2]/1000;
result:=X[29]-DeltaH(AF1.Fesc[3])/1000-X[30];
end;
//..........................................................................
function f11(X:TVetor):extended;
begin;
AF1.Ram[2].HEntrada:=X[30]*1000;
AF1.Ram[2].ResolverRede;
result:=X[2]-AF1.Ram[2].Qentrada*1000;
end;
//..........................................................................
function f12(X:TVetor):extended;
begin;
AF1.FEsc[4].Q:=X[3]/1000;
result:=X[28]-DeltaH(AF1.Fesc[4])/1000-X[29]
+2.9*AF1.Fesc[4].Local.g*AF1.Fesc[4].fluido.MassaEsp/1000;
end;
//..........................................................................
function f13(X:TVetor):extended;
begin;
VIII-30
begin;
AF1.Ram[3].HEntrada:=X[27]*1000;
AF1.Ram[3].ResolverRede;
result:=X[4]-AF1.Ram[3].Qentrada*1000;
end;
//..........................................................................
function f15(X:TVetor):extended;
begin;
AF1.FEsc[6].Q:=X[5]/1000;
result:=X[25]-DeltaH(AF1.Fesc[6])/1000-X[26]
+2.9*AF1.Fesc[6].Local.g*AF1.Fesc[6].fluido.MassaEsp/1000;
end;
//..........................................................................
function f16(X:TVetor):extended;
begin;
AF1.FEsc[7].Q:=X[6]/1000;
result:=X[23]-DeltaH(AF1.Fesc[7])/1000-X[24];
end;
//..........................................................................
function f17(X:TVetor):extended;
begin;
AF1.Ram[4].HEntrada:=X[24]*1000;
AF1.Ram[4].ResolverRede;
result:=X[6]-AF1.Ram[4].Qentrada*1000;
end;
//..........................................................................
function f18(X:TVetor):extended;
begin;
AF1.FEsc[8].Q:=X[7]/1000;
result:=X[22]-DeltaH(AF1.Fesc[8])/1000-X[23]
+2.9*AF1.Fesc[8].Local.g*AF1.Fesc[8].fluido.MassaEsp/1000;
end;
//..........................................................................
function f19(X:TVetor):extended;
begin;
AF1.FEsc[9].Q:=X[8]/1000;
result:=X[20]-DeltaH(AF1.Fesc[9])/1000-X[21];
end;
//..........................................................................
function f20(X:TVetor):extended;
begin;
AF1.Ram[5].HEntrada:=X[21]*1000;
AF1.Ram[5].ResolverRede;
result:=X[8]-AF1.Ram[5].Qentrada*1000;
end;
//..........................................................................
function f21(X:TVetor):extended;
begin;
AF1.FEsc[10].Q:=X[9]/1000;
result:=X[19]-DeltaH(AF1.Fesc[10])/1000-X[20]
+2.9*AF1.Fesc[10].Local.g*AF1.Fesc[10].fluido.MassaEsp/1000;
VIII-31
begin;
AF1.FEsc[11].Q:=X[10]/1000;
result:=X[17]-DeltaH(AF1.Fesc[11])/1000-X[18];
end;
//..........................................................................
function f23(X:TVetor):extended;
begin;
AF1.Ram[6].HEntrada:=X[18]*1000;
AF1.Ram[6].ResolverRede;
result:=X[10]-AF1.Ram[6].Qentrada*1000;
end;
//..........................................................................
function f24(X:TVetor):extended;
begin;
AF1.FEsc[12].Q:=X[11]/1000;
result:=X[16]-DeltaH(AF1.Fesc[12])/1000-X[17]
+2.9*AF1.Fesc[12].Local.g*AF1.Fesc[12].fluido.MassaEsp/1000;
end;
//..........................................................................
function f25(X:TVetor):extended;
begin;
AF1.FEsc[13].Q:=X[12]/1000;
result:=X[14]-DeltaH(AF1.Fesc[13])/1000-X[15];
end;
//..........................................................................
function f26(X:TVetor):extended;
begin;
AF1.Ram[7].HEntrada:=X[15]*1000;
AF1.Ram[7].ResolverRede;
result:=X[12]-AF1.Ram[7].Qentrada*1000;
end;
//..........................................................................
function f27(X:TVetor):extended;
begin;
AF1.FEsc[14].Q:=X[13]/1000;
result:=X[34]-DeltaH(AF1.Fesc[14])/1000-X[14]
+1.1*AF1.Fesc[14].Local.g*AF1.Fesc[14].fluido.MassaEsp/1000;
end;
//..........................................................................
function f28(X:TVetor):extended;
begin;
AF1.FEsc[15].Q:=X[1]/1000;
result:=X[29]-DeltaH(AF1.Fesc[15])/1000-X[31];
end;
//..........................................................................
function f29(X:TVetor):extended;
begin;
AF1.FEsc[16].Q:=X[3]/1000;
result:=X[26]-DeltaH(AF1.Fesc[16])/1000-X[28];
end;
//..........................................................................
function f30(X:TVetor):extended;
VIII-32
begin;
AF1.FEsc[18].Q:=X[7]/1000;
result:=X[20]-DeltaH(AF1.Fesc[18])/1000-X[22];
end;
//..........................................................................
function f32(X:TVetor):extended;
begin;
AF1.FEsc[19].Q:=X[9]/1000;
result:=X[17]-DeltaH(AF1.Fesc[19])/1000-X[19];
end;
//..........................................................................
function f33(X:TVetor):extended;
begin;
AF1.FEsc[20].Q:=X[11]/1000;
result:=X[14]-DeltaH(AF1.Fesc[20])/1000-X[16];
end;
//..........................................................................
//--------------------------------------------------------------------------
procedure ResolveColunaAF1(var R:TColunaAF1);
((1,1),(1,2),(1,3),(2,3),(2,4),(2,5),(3,5),(3,6),(3,7),(4,7),(4,8),(4,9),
(5,9),(5,10),(5,11),(6,11),(6,12),(6,13),(7,32),(7,1),(7,33),(8,1),(8,33),
(9,31),(9,1),(9,32),(10,29),(10,2),(10,30),(11,2),(11,30),(12,28),(12,3),
(12,29),(13,26),(13,4),(13,27),(14,4),(14,27),(15,25),(15,5),(15,26),
(16,23),(16,6),(16,24),(17,6),(17,24),(18,22),(18,7),(18,23),(19,20),(19,8),
(19,21),(20,8),(20,21),(21,19),(21,9),(21,20),(22,17),(22,10),(22,18),
(23,10),(23,18),(24,16),(24,11),(24,17),(25,14),(25,12),(25,15),(26,12),
(26,15),(27,13),(27,14),(28,29),(28,1),(28,31),(29,26),(29,3),(29,28),
(30,23),(30,5),(30,25),(31,20),(31,7),(31,22),(32,17),(32,9),(32,19),
(33,14),(33,11),(33,16));
begin;
FVF[1]:=f1;
FVF[2]:=f2;
FVF[3]:=f3;
FVF[4]:=f4;
FVF[5]:=f5;
FVF[6]:=f6;
FVF[7]:=f7;
FVF[8]:=f8;
FVF[9]:=f9;
FVF[10]:=f10;
FVF[11]:=f11;
FVF[12]:=f12;
FVF[13]:=f13;
FVF[14]:=f14;
FVF[15]:=f15;
VIII-33
AF1:=R;
AF1.FX[34]:=AF1.HEntrada;
If AF1.PrimCalculo Then
Begin;
AF1.FX[14]:=AF1.FX[34]
+1.1*AF1.FEsc[14].Fluido.MassaEsp*AF1.FEsc[14].Local.g;
AF1.FX[15]:=AF1.FX[14];
AF1.FX[16]:=AF1.FX[14];
AF1.FX[17]:=AF1.FX[14]
+2.9*AF1.FEsc[12].Fluido.MassaEsp*AF1.FEsc[12].Local.g;
AF1.FX[18]:=AF1.Fx[17];
AF1.FX[19]:=AF1.Fx[17];
AF1.FX[20]:=AF1.Fx[17]
+2.9*AF1.FEsc[10].Fluido.MassaEsp*AF1.FEsc[10].Local.g;
AF1.FX[21]:=AF1.FX[20];
AF1.FX[22]:=AF1.Fx[20];
AF1.FX[23]:=AF1.Fx[20]
+2.9*AF1.FEsc[8].Fluido.MassaEsp*AF1.FEsc[8].Local.g;
AF1.FX[24]:=AF1.Fx[23];
AF1.FX[25]:=AF1.Fx[23];
AF1.FX[26]:=AF1.Fx[23]
+2.9*AF1.FEsc[6].Fluido.MassaEsp*AF1.FEsc[6].Local.g;
AF1.FX[27]:=AF1.Fx[26];
AF1.FX[28]:=AF1.Fx[26];
AF1.FX[29]:=AF1.Fx[26]
+2.9*AF1.FEsc[4].Fluido.MassaEsp*AF1.FEsc[4].Local.g;
AF1.FX[30]:=AF1.Fx[29];
AF1.FX[31]:=AF1.Fx[29];
AF1.FX[32]:=AF1.Fx[29]
+2.9*AF1.FEsc[2].Fluido.MassaEsp*AF1.FEsc[2].Local.g;
AF1.FX[33]:=AF1.Fx[32];
AF1.PrimCalculo:=False;
end;
AF1.Ram[1].Hentrada:=AF1.FX[33];
AF1.Ram[1].ResolverRede;
AF1.FX[1]:=AF1.Ram[1].Qentrada;
VIII-34
AF1.Ram[3].Hentrada:=AF1.FX[27];
AF1.Ram[3].ResolverRede;
AF1.FX[4]:=AF1.Ram[3].Qentrada;
AF1.Ram[4].Hentrada:=AF1.FX[24];
AF1.Ram[4].ResolverRede;
AF1.FX[6]:=AF1.Ram[4].Qentrada;
AF1.Ram[5].Hentrada:=AF1.FX[21];
AF1.Ram[5].ResolverRede;
AF1.FX[8]:=AF1.Ram[5].Qentrada;
AF1.Ram[6].Hentrada:=AF1.FX[18];
AF1.Ram[6].ResolverRede;
AF1.FX[10]:=AF1.Ram[6].Qentrada;
AF1.Ram[7].Hentrada:=AF1.FX[15];
AF1.Ram[7].ResolverRede;
AF1.FX[12]:=AF1.Ram[7].Qentrada;
AF1.FX[3]:=AF1.FX[1]+AF1.FX[2];
AF1.FX[5]:=AF1.FX[3]+AF1.FX[4];
AF1.FX[7]:=AF1.FX[5]+AF1.FX[6];
AF1.FX[9]:=AF1.FX[7]+AF1.FX[8];
AF1.FX[11]:=AF1.FX[9]+AF1.FX[10];
AF1.FX[13]:=AF1.FX[11]+AF1.FX[12];
with AF1 Do
Begin;
For I:=1 To 33 Do For J:=1 To 33 Do TabDep[I,J]:=False;
For I:=1 To 91 Do TabDep[Aux[I,1],Aux[I,2]]:=True;
End;
AF1.FQentrada:=AF1.FX[13];
R:=AF1;
end;
//======================= TColunaAF1 =======================================
constructor TColunaAF1.Create;
var I:Cardinal;
Begin;
inherited create;
PrimCalculo:=True;
FEsc[1].Tubo.Comprim:=1.1;
FEsc[2].Tubo.Comprim:=2.9;
FEsc[3].Tubo.Comprim:=2.3;
FEsc[4].Tubo.Comprim:=2.9;
FEsc[5].Tubo.Comprim:=2.4;
FEsc[6].Tubo.Comprim:=2.9;
FEsc[7].Tubo.Comprim:=2.4;
FEsc[8].Tubo.Comprim:=2.9;
FEsc[9].Tubo.Comprim:=2.4;
FEsc[10].Tubo.Comprim:=2.9;
FEsc[11].Tubo.Comprim:=2.4;
FEsc[12].Tubo.Comprim:=2.9;
FEsc[13].Tubo.Comprim:=3.2;
FEsc[14].Tubo.Comprim:=1.1;
FEsc[15].Tubo.Comprim:=0.7;
FEsc[16].Tubo.Comprim:=0.8;
FEsc[17].Tubo.Comprim:=0.8;
FEsc[18].Tubo.Comprim:=0.8;
FEsc[19].Tubo.Comprim:=0.8;
FEsc[20].Tubo.Comprim:=0.9;
End;
//--------------------------------------------------------------------------
destructor TColunaAF1.Destroy;
var i: cardinal;
Begin;
For I:=1 To 20 Do FEsc[I].free;
For I:=1 To 7 Do FRamais[I].free;
inherited destroy;
end;
//--------------------------------------------------------------------------
procedure TColunaAF1.ResolverRede;
Begin;
ResolveColunaAF1(Self);
End;
//--------------------------------------------------------------------------
initialization
AF1:=TColunaAF1.Create;
end.
VIII-36
interface
Type
TColunaAF2 = class(TObject)
private
FHentrada: extended;
FQentrada: extended;
FRamais: TRamaisH2;
protected
public
FEsc: Array [1..20] of TEscoamento;
// 1-T1; 2-T3; 3-T4L; 4-T6; 5-T7L; 6-T9
// 7-T10L; 8-T12; 9-T13L; 10-T15; 11-T16L;
// 12-T18; 13-T19L; 14-T21; 15-T4d; 16-T7d;
// 17-T10d; 18-T13d; 19-T16d; 20-T19d;
FX: TVetor; // 1 a 33 - variáveis;
// 34 - 'H'entrada
TabDep: TTabDep;
PrimCalculo: Boolean;
procedure ResolverRede;
constructor Create;
destructor Destroy; override;
published
end;
implementation
uses unit1;
//--------------------------------------------------------------------------
function DeltaH(E:TEscoamento):extended;
Begin;
begin;
result:=X[1]+X[2]-X[3];
end;
//..........................................................................
function f2(X:TVetor):extended;
begin;
result:=X[3]+X[4]-X[5];
end;
//..........................................................................
function f3(X:TVetor):extended;
begin;
result:=X[5]+X[6]-X[7];
end;
//..........................................................................
function f4(X:TVetor):extended;
begin;
result:=X[7]+X[8]-X[9];
end;
//..........................................................................
function f5(X:TVetor):extended;
begin;
result:=X[9]+X[10]-X[11];
end;
//..........................................................................
function f6(X:TVetor):extended;
begin;
result:=X[11]+X[12]-X[13];
end;
//..........................................................................
function f7(X:TVetor):extended;
begin;
AF2.FEsc[1].Q:=X[1]/1000;
result:=X[32]-DeltaH(AF2.Fesc[1])/1000-X[33];
end;
//..........................................................................
function f8(X:TVetor):extended;
VIII-38
begin;
AF2.FEsc[2].Q:=X[1]/1000;
result:=X[31]-DeltaH(AF2.Fesc[2])/1000-X[32]
+2.9*AF2.Fesc[2].Local.g*AF2.Fesc[2].fluido.MassaEsp/1000;
end;
//..........................................................................
function f10(X:TVetor):extended;
begin;
AF2.FEsc[3].Q:=X[2]/1000;
result:=X[29]-DeltaH(AF2.Fesc[3])/1000-X[30];
end;
//..........................................................................
function f11(X:TVetor):extended;
begin;
AF2.Ram[2].HEntrada:=X[30]*1000;
AF2.Ram[2].ResolverRede;
result:=X[2]-AF2.Ram[2].Qentrada*1000;
end;
//..........................................................................
function f12(X:TVetor):extended;
begin;
AF2.FEsc[4].Q:=X[3]/1000;
result:=X[28]-DeltaH(AF2.Fesc[4])/1000-X[29]
+2.9*AF2.Fesc[4].Local.g*AF2.Fesc[4].fluido.MassaEsp/1000;
end;
//..........................................................................
function f13(X:TVetor):extended;
begin;
AF2.FEsc[5].Q:=X[4]/1000;
result:=X[26]-DeltaH(AF2.Fesc[5])/1000-X[27];
end;
//..........................................................................
function f14(X:TVetor):extended;
begin;
AF2.Ram[3].HEntrada:=X[27]*1000;
AF2.Ram[3].ResolverRede;
result:=X[4]-AF2.Ram[3].Qentrada*1000;
end;
//..........................................................................
function f15(X:TVetor):extended;
begin;
AF2.FEsc[6].Q:=X[5]/1000;
result:=X[25]-DeltaH(AF2.Fesc[6])/1000-X[26]
+2.9*AF2.Fesc[6].Local.g*AF2.Fesc[6].fluido.MassaEsp/1000;
end;
//..........................................................................
function f16(X:TVetor):extended;
begin;
AF2.FEsc[7].Q:=X[6]/1000;
VIII-39
begin;
AF2.Ram[4].HEntrada:=X[24]*1000;
AF2.Ram[4].ResolverRede;
result:=X[6]-AF2.Ram[4].Qentrada*1000;
end;
//..........................................................................
function f18(X:TVetor):extended;
begin;
AF2.FEsc[8].Q:=X[7]/1000;
result:=X[22]-DeltaH(AF2.Fesc[8])/1000-X[23]
+2.9*AF2.Fesc[8].Local.g*AF2.Fesc[8].fluido.MassaEsp/1000;
end;
//..........................................................................
function f19(X:TVetor):extended;
begin;
AF2.FEsc[9].Q:=X[8]/1000;
result:=X[20]-DeltaH(AF2.Fesc[9])/1000-X[21];
end;
//..........................................................................
function f20(X:TVetor):extended;
begin;
AF2.Ram[5].HEntrada:=X[21]*1000;
AF2.Ram[5].ResolverRede;
result:=X[8]-AF2.Ram[5].Qentrada*1000;
end;
//..........................................................................
function f21(X:TVetor):extended;
begin;
AF2.FEsc[10].Q:=X[9]/1000;
result:=X[19]-DeltaH(AF2.Fesc[10])/1000-X[20]
+2.9*AF2.Fesc[10].Local.g*AF2.Fesc[10].fluido.MassaEsp/1000;
end;
//..........................................................................
function f22(X:TVetor):extended;
begin;
AF2.FEsc[11].Q:=X[10]/1000;
result:=X[17]-DeltaH(AF2.Fesc[11])/1000-X[18];
end;
//..........................................................................
function f23(X:TVetor):extended;
begin;
AF2.Ram[6].HEntrada:=X[18]*1000;
AF2.Ram[6].ResolverRede;
result:=X[10]-AF2.Ram[6].Qentrada*1000;
end;
//..........................................................................
function f24(X:TVetor):extended;
begin;
AF2.FEsc[12].Q:=X[11]/1000;
result:=X[16]-DeltaH(AF2.Fesc[12])/1000-X[17]
+2.9*AF2.Fesc[12].Local.g*AF2.Fesc[12].fluido.MassaEsp/1000;
end;
VIII-40
begin;
AF2.FEsc[13].Q:=X[12]/1000;
result:=X[14]-DeltaH(AF2.Fesc[13])/1000-X[15];
end;
//..........................................................................
function f26(X:TVetor):extended;
begin;
AF2.Ram[7].HEntrada:=X[15]*1000;
AF2.Ram[7].ResolverRede;
result:=X[12]-AF2.Ram[7].Qentrada*1000;
end;
//..........................................................................
function f27(X:TVetor):extended;
begin;
AF2.FEsc[14].Q:=X[13]/1000;
result:=X[34]-DeltaH(AF2.Fesc[14])/1000-X[14]
+1.1*AF2.Fesc[14].Local.g*AF2.Fesc[14].fluido.MassaEsp/1000;
end;
//..........................................................................
function f28(X:TVetor):extended;
begin;
AF2.FEsc[15].Q:=X[1]/1000;
result:=X[29]-DeltaH(AF2.Fesc[15])/1000-X[31];
end;
//..........................................................................
function f29(X:TVetor):extended;
begin;
AF2.FEsc[16].Q:=X[3]/1000;
result:=X[26]-DeltaH(AF2.Fesc[16])/1000-X[28];
end;
//..........................................................................
function f30(X:TVetor):extended;
begin;
AF2.FEsc[17].Q:=X[5]/1000;
result:=X[23]-DeltaH(AF2.Fesc[17])/1000-X[25];
end;
//..........................................................................
function f31(X:TVetor):extended;
begin;
AF2.FEsc[18].Q:=X[7]/1000;
result:=X[20]-DeltaH(AF2.Fesc[18])/1000-X[22];
end;
//..........................................................................
function f32(X:TVetor):extended;
begin;
AF2.FEsc[19].Q:=X[9]/1000;
result:=X[17]-DeltaH(AF2.Fesc[19])/1000-X[19];
end;
//..........................................................................
function f33(X:TVetor):extended;
begin;
AF2.FEsc[20].Q:=X[11]/1000;
result:=X[14]-DeltaH(AF2.Fesc[20])/1000-X[16];
VIII-41
((1,1),(1,2),(1,3),(2,3),(2,4),(2,5),(3,5),(3,6),(3,7),(4,7),(4,8),(4,9),
(5,9),(5,10),(5,11),(6,11),(6,12),(6,13),(7,32),(7,1),(7,33),(8,1),(8,33),
(9,31),(9,1),(9,32),(10,29),(10,2),(10,30),(11,2),(11,30),(12,28),(12,3),
(12,29),(13,26),(13,4),(13,27),(14,4),(14,27),(15,25),(15,5),(15,26),
(16,23),(16,6),(16,24),(17,6),(17,24),(18,22),(18,7),(18,23),(19,20),(19,8),
(19,21),(20,8),(20,21),(21,19),(21,9),(21,20),(22,17),(22,10),(22,18),
(23,10),(23,18),(24,16),(24,11),(24,17),(25,14),(25,12),(25,15),(26,12),
(26,15),(27,13),(27,14),(28,29),(28,1),(28,31),(29,26),(29,3),(29,28),
(30,23),(30,5),(30,25),(31,20),(31,7),(31,22),(32,17),(32,9),(32,19),
(33,14),(33,11),(33,16));
begin;
FVF[1]:=f1;
FVF[2]:=f2;
FVF[3]:=f3;
FVF[4]:=f4;
FVF[5]:=f5;
FVF[6]:=f6;
FVF[7]:=f7;
FVF[8]:=f8;
FVF[9]:=f9;
FVF[10]:=f10;
FVF[11]:=f11;
FVF[12]:=f12;
FVF[13]:=f13;
FVF[14]:=f14;
FVF[15]:=f15;
FVF[16]:=f16;
FVF[17]:=f17;
FVF[18]:=f18;
FVF[19]:=f19;
FVF[20]:=f20;
FVF[21]:=f21;
FVF[22]:=f22;
FVF[23]:=f23;
FVF[24]:=f24;
FVF[25]:=f25;
FVF[26]:=f26;
FVF[27]:=f27;
FVF[28]:=f28;
FVF[29]:=f29;
FVF[30]:=f30;
FVF[31]:=f31;
FVF[32]:=f32;
FVF[33]:=f33;
AF2:=R;
AF2.FX[34]:=AF2.HEntrada;
If AF2.PrimCalculo Then
Begin;
AF2.FX[14]:=AF2.FX[34]
VIII-42
AF2.PrimCalculo:=false;
end;
AF2.Ram[1].Hentrada:=AF2.FX[33];
AF2.Ram[1].ResolverRede;
AF2.FX[1]:=AF2.Ram[1].Qentrada;
AF2.Ram[2].Hentrada:=AF2.FX[30];
AF2.Ram[2].ResolverRede;
AF2.FX[2]:=AF2.Ram[2].Qentrada;
AF2.Ram[3].Hentrada:=AF2.FX[27];
AF2.Ram[3].ResolverRede;
AF2.FX[4]:=AF2.Ram[3].Qentrada;
AF2.Ram[4].Hentrada:=AF2.FX[24];
AF2.Ram[4].ResolverRede;
AF2.FX[6]:=AF2.Ram[4].Qentrada;
AF2.Ram[5].Hentrada:=AF2.FX[21];
AF2.Ram[5].ResolverRede;
AF2.FX[8]:=AF2.Ram[5].Qentrada;
AF2.Ram[6].Hentrada:=AF2.FX[18];
AF2.Ram[6].ResolverRede;
AF2.FX[10]:=AF2.Ram[6].Qentrada;
AF2.Ram[7].Hentrada:=AF2.FX[15];
AF2.Ram[7].ResolverRede;
AF2.FX[12]:=AF2.Ram[7].Qentrada;
AF2.FX[3]:=AF2.FX[1]+AF2.FX[2];
AF2.FX[5]:=AF2.FX[3]+AF2.FX[4];
AF2.FX[7]:=AF2.FX[5]+AF2.FX[6];
AF2.FX[9]:=AF2.FX[7]+AF2.FX[8];
AF2.FX[11]:=AF2.FX[9]+AF2.FX[10];
AF2.FX[13]:=AF2.FX[11]+AF2.FX[12];
VIII-43
with AF2 Do
Begin;
For I:=1 To 33 Do For J:=1 To 33 Do TabDep[I,J]:=False;
For I:=1 To 91 Do TabDep[Aux[I,1],Aux[I,2]]:=True;
End;
If AF2.FX[13]<>0 Then
NRaphEsparso (FvF,AF2.FX,33,1E-9,AF2.TabDep);
AF2.FQentrada:=AF2.FX[13];
R:=AF2;
end;
//======================= TColunaAF2 =======================================
constructor TColunaAF2.Create;
var I:Cardinal;
Begin;
inherited create;
PrimCalculo:=True;
For I:=1 To 20 Do
begin;
FEsc[I]:=TEscoamento.create;
FEsc[I].Fluido:=TAgua.create;
FEsc[I].Local:=TPlanetaTerra.create;
FEsc[I].Tubo.RugAbs:=0.015E-3;
end;
FEsc[1].Tubo.Comprim:=1.1;
FEsc[2].Tubo.Comprim:=2.9;
FEsc[3].Tubo.Comprim:=2.3;
FEsc[4].Tubo.Comprim:=2.9;
FEsc[5].Tubo.Comprim:=2.3;
FEsc[6].Tubo.Comprim:=2.9;
FEsc[7].Tubo.Comprim:=2.3;
FEsc[8].Tubo.Comprim:=2.9;
FEsc[9].Tubo.Comprim:=2.3;
FEsc[10].Tubo.Comprim:=2.9;
FEsc[11].Tubo.Comprim:=2.3;
FEsc[12].Tubo.Comprim:=2.9;
FEsc[13].Tubo.Comprim:=2.3;
FEsc[14].Tubo.Comprim:=1.1;
FEsc[15].Tubo.Comprim:=0.7;
FEsc[16].Tubo.Comprim:=0.7;
FEsc[17].Tubo.Comprim:=0.7;
FEsc[18].Tubo.Comprim:=0.7;
FEsc[19].Tubo.Comprim:=0.7;
FEsc[20].Tubo.Comprim:=0.7;
End;
VIII-44
var i: cardinal;
Begin;
For I:=1 To 20 Do FEsc[I].free;
For I:=1 To 7 Do FRamais[I].free;
inherited destroy;
end;
//--------------------------------------------------------------------------
procedure TColunaAF2.ResolverRede;
Begin;
ResolveColunaAF2(Self);
End;
//--------------------------------------------------------------------------
initialization
AF2:=TColunaAF2.Create;
end.
interface
Type
TBarrilete = class(TObject)
private
FYLamina: extended;
FQSaidaDeR: extended;
FColuna1: TColunas1;
FColuna2: TColunas2;
FUltConfigApar: string;
protected
function GetConfigAp:string;
public
FEsc: Array [1..28] of TEscoamento;
// 1-T1; 2-T3; 3-T4; 4-T5; 5-T6; 6-T8
// 7-T10L; 8-T11; 9-T12L; 10-T14; 11-T16L;
VIII-45
TabDep: TTabDep;
PrimCalculo:Boolean;
procedure ResolverRede;
constructor Create;
destructor Destroy; override;
published
end;
implementation
//--------------------------------------------------------------------------
function DeltaH(E:TEscoamento):extended;
Begin;
begin;
result:=X[5]+X[6]-X[4];
Application.processMessages;
end;
//..........................................................................
function f2(X:TVetor):extended;
begin;
VIII-46
begin;
result:=X[3]+X[8]-X[2];
end;
//..........................................................................
function f4(X:TVetor):extended;
begin;
result:=X[9]+X[2]-X[1];
end;
//..........................................................................
function f5(X:TVetor):extended;
begin;
result:=X[10]+X[15]-X[9];
end;
//..........................................................................
function f6(X:TVetor):extended;
begin;
result:=X[11]+X[14]-X[10];
end;
//..........................................................................
function f7(X:TVetor):extended;
begin;
result:=X[12]+X[13]-X[11];
end;
//..........................................................................
function f8(X:TVetor):extended;
begin;
Bar.FEsc[1].Q:=X[1]/1000;
result:=Bar.FYLamina
*(Bar.Fesc[1].Local.g*Bar.Fesc[1].fluido.MassaEsp)/1000
-DeltaH(Bar.Fesc[1])/1000-X[17];
end;
//..........................................................................
function f9(X:TVetor):extended;
begin;
Bar.FEsc[2].Q:=X[1]/1000;
result:=X[17]-DeltaH(Bar.Fesc[2])/1000-X[18]
+0.7*Bar.Fesc[2].Local.g*Bar.Fesc[2].fluido.MassaEsp/1000;
end;
//..........................................................................
function f10(X:TVetor):extended;
begin;
Bar.FEsc[3].Q:=X[1]/1000;
result:=X[18]-DeltaH(Bar.Fesc[3])/1000-X[19]
+0.1*Bar.Fesc[4].Local.g*Bar.Fesc[4].fluido.MassaEsp/1000;;
end;
//..........................................................................
function f11(X:TVetor):extended;
begin;
Bar.FEsc[4].Q:=X[1]/1000;
result:=X[19]-DeltaH(Bar.Fesc[4])/1000-X[20]
+3.7*Bar.Fesc[4].Local.g*Bar.Fesc[4].fluido.MassaEsp/1000;
VIII-47
begin;
Bar.FEsc[5].Q:=X[3]/1000;
result:=X[28]-DeltaH(Bar.Fesc[5])/1000-X[29];
end;
//..........................................................................
function f13(X:TVetor):extended;
begin;
Bar.FEsc[6].Q:=X[5]/1000;
result:=X[27]-DeltaH(Bar.Fesc[6])/1000-X[28];
end;
//..........................................................................
function f15(X:TVetor):extended;
begin;
Bar.FEsc[7].Q:=X[6]/1000;
result:=X[26]-DeltaH(Bar.Fesc[7])/1000-X[30];
end;
//..........................................................................
function f17(X:TVetor):extended;
begin;
Bar.FEsc[8].Q:=X[4]/1000;
result:=X[25]-DeltaH(Bar.Fesc[8])/1000-X[26];
end;
//..........................................................................
function f18(X:TVetor):extended;
begin;
Bar.FEsc[9].Q:=X[7]/1000;
result:=X[24]-DeltaH(Bar.Fesc[1])/1000-X[31];
end;
//..........................................................................
function f19(X:TVetor):extended;
begin;
VIII-48
begin;
Bar.FEsc[11].Q:=X[8]/1000;
result:=X[22]-DeltaH(Bar.Fesc[11])/1000-X[32];
end;
//..........................................................................
function f23(X:TVetor):extended;
begin;
Bar.FEsc[12].Q:=X[2]/1000;
result:=X[21]-DeltaH(Bar.Fesc[12])/1000-X[22];
end;
//..........................................................................
function f24(X:TVetor):extended;
begin;
Bar.FEsc[13].Q:=X[9]/1000;
result:=X[20]-DeltaH(Bar.Fesc[13])/1000-X[33];
end;
//..........................................................................
function f25(X:TVetor):extended;
begin;
Bar.FEsc[14].Q:=X[9]/1000;
result:=X[33]-DeltaH(Bar.Fesc[14])/1000-X[34];
end;
//..........................................................................
function f26(X:TVetor):extended;
begin;
Bar.FEsc[15].Q:=X[15]/1000;
result:=X[34]-DeltaH(Bar.Fesc[15])/1000-X[16];
end;
//..........................................................................
function f27(X:TVetor):extended;
begin;
Bar.FEsc[16].Q:=X[10]/1000;
result:=X[35]-DeltaH(Bar.Fesc[16])/1000-X[36];
end;
//..........................................................................
function f29(X:TVetor):extended;
VIII-49
begin;
Bar.FEsc[17].Q:=X[14]/1000;
result:=X[36]-DeltaH(Bar.Fesc[17])/1000-X[43];
end;
//..........................................................................
function f31(X:TVetor):extended;
begin;
Bar.FEsc[18].Q:=X[11]/1000;
result:=X[37]-DeltaH(Bar.Fesc[18])/1000-X[38];
end;
//..........................................................................
function f32(X:TVetor):extended;
begin;
Bar.FEsc[19].Q:=X[13]/1000;
result:=X[38]-DeltaH(Bar.Fesc[19])/1000-X[42];
end;
//..........................................................................
function f33(X:TVetor):extended;
begin;
Bar.FEsc[20].Q:=X[12]/1000;
result:=X[39]-DeltaH(Bar.Fesc[20])/1000-X[40];
end;
//..........................................................................
function f35(X:TVetor):extended;
begin;
Bar.FEsc[21].Q:=X[12]/1000;
result:=X[40]-DeltaH(Bar.Fesc[21])/1000-X[41];
end;
//..........................................................................
function f37(X:TVetor):extended;
begin;
Bar.FEsc[22].Q:=X[5]/1000;
result:=X[26]-DeltaH(Bar.Fesc[22])/1000-X[27];
end;
//..........................................................................
VIII-50
begin;
Bar.FEsc[23].Q:=X[4]/1000;
result:=X[24]-DeltaH(Bar.Fesc[23])/1000-X[25];
end;
//..........................................................................
function f39(X:TVetor):extended;
begin;
Bar.FEsc[24].Q:=X[3]/1000;
result:=X[22]-DeltaH(Bar.Fesc[24])/1000-X[23];
end;
//..........................................................................
function f40(X:TVetor):extended;
begin;
Bar.FEsc[25].Q:=X[2]/1000;
result:=X[20]-DeltaH(Bar.Fesc[25])/1000-X[21];
end;
//..........................................................................
function f41(X:TVetor):extended;
begin;
Bar.FEsc[26].Q:=X[10]/1000;
result:=X[34]-DeltaH(Bar.Fesc[26])/1000-X[35];
end;
//..........................................................................
function f42(X:TVetor):extended;
begin;
Bar.FEsc[27].Q:=X[11]/1000;
result:=X[36]-DeltaH(Bar.Fesc[27])/1000-X[37];
end;
//..........................................................................
function f43(X:TVetor):extended;
begin;
Bar.FEsc[28].Q:=X[12]/1000;
result:=X[38]-DeltaH(Bar.Fesc[1])/1000-X[39];
end;
//..........................................................................
//--------------------------------------------------------------------------
procedure ResolveBarrilete(var R:TBarrilete);
((1,5),(1,6),(1,4),(2,4),(2,7),(2,3),(3,3),(3,8),(3,2),(4,9),(4,2),(4,1),
(5,10),(5,15),(5,9),(6,11),(6,14),(6,10),(7,12),(7,13),(7,11),(8,17),
(8,1), (9,17),(9,18),(9,1),(10,18),(10,19),(10,1),(11,19),(11,20),(11,3),
(12,28),(12,5),(12,29),(13,5),(13,29),(14,28),(14,27),(14,5),(15,6),(15,30),
(16,26),(16,6),(16,30),(17,25),(17,26),(17,4),(18,24),(18,7),(18,31),(19,7),
(19,31),(20,23),(20,24),(20,3),(21,8),(21,32),(22,22),(22,32),(22,8),
(23,21),(23,22),(23,2),(24,20),(24,33),(24,9),(25,33),(25,34),(25,9),
(26,34),(26,15),(26,16),(27,15),(27,16),(28,35),(28,10),(28,36),(29,14),
(29,43),(30,36),(30,43),(30,14),(31,37),(31,38),(31,11),(32,38),(32,13),
(32,42),(33,13),(33,42),(34,39),(34,40),(34,12),(35,12),(35,41),(36,40),
(36,41),(36,12),(37,26),(37,5),(37,27),(38,24),(38,4),(38,25),(39,22),
(39,3),(39,23),(40,20),(40,21),(40,2),(41,34),(41,35),(41,10),(42,36),
(42,37),(42,11),(43,39),(43,38),(43,12));
VIII-51
begin;
FVF[1]:=f1;
FVF[2]:=f2;
FVF[3]:=f3;
FVF[4]:=f4;
FVF[5]:=f5;
FVF[6]:=f6;
FVF[7]:=f7;
FVF[8]:=f8;
FVF[9]:=f9;
FVF[10]:=f10;
FVF[11]:=f11;
FVF[12]:=f12;
FVF[13]:=f13;
FVF[14]:=f14;
FVF[15]:=f15;
FVF[16]:=f16;
FVF[17]:=f17;
FVF[18]:=f18;
FVF[19]:=f19;
FVF[20]:=f20;
FVF[21]:=f21;
FVF[22]:=f22;
FVF[23]:=f23;
FVF[24]:=f24;
FVF[25]:=f25;
FVF[26]:=f26;
FVF[27]:=f27;
FVF[28]:=f28;
FVF[29]:=f29;
FVF[30]:=f30;
FVF[31]:=f31;
FVF[32]:=f32;
FVF[33]:=f33;
FVF[34]:=f34;
FVF[35]:=f35;
FVF[36]:=f36;
FVF[37]:=f37;
FVF[38]:=f38;
FVF[39]:=f39;
FVF[40]:=f40;
FVF[41]:=f41;
FVF[42]:=f42;
FVF[43]:=f43;
Bar:=R;
Bar.FX[17]:=Bar.HLamina*Bar.FEsc[2].Fluido.MassaEsp*Bar.FEsc[2].Local.g;
If Bar.PrimCalculo Then
Begin;
Bar.FX[18]:=Bar.FX[17]
+0.7*Bar.FEsc[2].Fluido.MassaEsp*Bar.FEsc[2].Local.g;
Bar.FX[19]:=Bar.FX[18]
+0.1*Bar.FEsc[3].Fluido.MassaEsp*Bar.FEsc[3].Local.g;
Bar.FX[20]:=Bar.Fx[19]
+3.7*Bar.FEsc[4].Fluido.MassaEsp*Bar.FEsc[4].Local.g;
Bar.FX[16]:=Bar.FX[20];
For I:=21 To 44 Do Bar.FX[I]:=Bar.FX[20];
VIII-52
Bar.FX[19]:=Bar.FX[18]
+0.1*Bar.FEsc[3].Fluido.MassaEsp*Bar.FEsc[3].Local.g;
Bar.FX[20]:=Bar.Fx[19]
+3.7*Bar.FEsc[4].Fluido.MassaEsp*Bar.FEsc[4].Local.g;
Bar.FX[16]:=Bar.FX[20];
For I:=21 To 44 Do Bar.FX[I]:=Bar.FX[20];
Bar.PrimCalculo:=False;
End;
Bar.FColuna1[1].Hentrada:=Bar.Fx[29];
Bar.FColuna1[1].ResolverRede;
Bar.FX[5]:=Bar.FColuna1[1].Qentrada;
Bar.FColuna2[1].Hentrada:=Bar.Fx[30];
Bar.FColuna2[1].ResolverRede;
Bar.FX[6]:=Bar.FColuna2[1].Qentrada;
Bar.FColuna1[2].Hentrada:=Bar.Fx[31];
Bar.FColuna1[2].ResolverRede;
Bar.FX[7]:=Bar.FColuna1[2].Qentrada;
Bar.FColuna2[2].Hentrada:=Bar.Fx[32];
Bar.FColuna2[2].ResolverRede;
Bar.FX[8]:=Bar.FColuna2[2].Qentrada;
Bar.FColuna1[3].Hentrada:=Bar.Fx[41];
Bar.FColuna1[3].ResolverRede;
Bar.FX[12]:=Bar.FColuna1[3].Qentrada;
Bar.FColuna2[3].Hentrada:=Bar.Fx[42];
Bar.FColuna2[3].ResolverRede;
Bar.FX[13]:=Bar.FColuna2[3].Qentrada;
Bar.FColuna1[4].Hentrada:=Bar.Fx[43];
Bar.FColuna1[4].ResolverRede;
Bar.FX[14]:=Bar.FColuna1[4].Qentrada;
Bar.FColuna2[4].Hentrada:=Bar.Fx[16];
Bar.FColuna2[4].ResolverRede;
Bar.FX[15]:=Bar.FColuna2[4].Qentrada;
Bar.FX[11]:=Bar.FX[12]+Bar.FX[13];
Bar.FX[10]:=Bar.FX[11]+Bar.FX[14];
Bar.FX[9]:=Bar.FX[15]+Bar.FX[10];
Bar.FX[4]:=Bar.FX[5]+Bar.FX[6];
Bar.FX[3]:=Bar.FX[4]+Bar.FX[7];
Bar.FX[2]:=Bar.FX[3]+Bar.FX[8];
Bar.FX[1]:=Bar.FX[9]+Bar.FX[2];
with Bar Do
Begin;
For I:=1 To 43 Do For J:=1 To 43 Do TabDep[I,J]:=False;
For I:=1 To 120 Do TabDep[Aux[I,1],Aux[I,2]]:=True;
End;
VIII-53
Bar.FQSaidaDeR:=Bar.FX[1];
R:=Bar;
end;
//======================= TBarrilete =======================================
constructor TBarrilete.Create;
var I:Cardinal;
Begin;
inherited create;
FUltConfigApar:='';
PrimCalculo:=True;
For I:=1 To 28 Do
begin;
FEsc[I]:=TEscoamento.create;
FEsc[I].Fluido:=TAgua.create;
FEsc[I].Local:=TPlanetaTerra.create;
FEsc[I].Tubo.RugAbs:=0.015E-3;
end;
FEsc[1].Tubo.Comprim:=1.8;
FEsc[2].Tubo.Comprim:=0.7;
FEsc[3].Tubo.Comprim:=0.4;
FEsc[4].Tubo.Comprim:=3.7;
FEsc[5].Tubo.Comprim:=1.5;
FEsc[6].Tubo.Comprim:=1.5;
FEsc[7].Tubo.Comprim:=3.1;
FEsc[8].Tubo.Comprim:=5.5;
FEsc[9].Tubo.Comprim:=3.1;
FEsc[10].Tubo.Comprim:=1.5;
FEsc[11].Tubo.Comprim:=4.6;
FEsc[12].Tubo.Comprim:=2.5;
FEsc[13].Tubo.Comprim:=4.6;
FEsc[14].Tubo.Comprim:=2.5;
FEsc[15].Tubo.Comprim:=4.6;
FEsc[16].Tubo.Comprim:=1.5;
FEsc[17].Tubo.Comprim:=3.1;
FEsc[18].Tubo.Comprim:=5.5;
FEsc[19].Tubo.Comprim:=3.1;
FEsc[20].Tubo.Comprim:=1.5;
FEsc[21].Tubo.Comprim:=1.5;
FEsc[22].Tubo.Comprim:=0.9;
FEsc[23].Tubo.Comprim:=0.9;
FEsc[24].Tubo.Comprim:=1.5;
FEsc[25].Tubo.Comprim:=4.6;
FEsc[26].Tubo.Comprim:=1.5;
VIII-54
var i: cardinal;
Begin;
For I:=1 To 28 Do FEsc[I].free;
For I:=1 To 4 Do
begin;
FColuna1[I].free;
FColuna2[I].free;
end;
inherited destroy;
end;
//--------------------------------------------------------------------------
function Tbarrilete.GetConfigAp: string;
// essa função retorna uma "string" única para cada possível configuração
// de aparelhos, de modo que, caso uma próxima coniguração seja idêntica
// à anterior, "GetConfig" retornará o mesmo resultado e não haverá
// necessidade de novo cálculo, pois o objeto "Barrilete" estará ainda
// com o resultado correto
var s:string;
I,J: cardinal;
X: extended;
//..........................................................................
function CompCd(x:extended):string;
var s:string;
x1,e: integer;
m:extended;
Begin;
s:='';
Frexp(X,m,e);
X1:=Trunc(1000*m);
str(X1:4,s);
result:=s;
str(e:2,s);
result:=result+s;
end;
//..........................................................................
Begin;
s:='';
For I:=1 to 4 Do
For J:=1 to 7 Do
Begin;
with ColimPar[I].Ram[J] Do
Begin;
X:=PC.Cd*Ord(PC.Operando);
s:=s+CompCd(X);
X:=TQ.Cd*Ord(TQ.Operando);
s:=s+CompCd(X);
X:=ML.Cd*Ord(ML.Operando);
s:=s+CompCd(X);
end;
with ColPar[I].Ram[J] Do
Begin;
X:=CH.Cd*Ord(CH.Operando);
s:=s+CompCd(X);
VIII-55
Begin;
If ConfigAparelhos <> FUltConfigApar Then // só recalcula se os aparelhos
Begin; // se alteraram.
ResolveBarrilete(Self);
FUltConfigApar:=ConfigAparelhos;
end;
End;
//--------------------------------------------------------------------------
initialization
Bar:=TBarrilete.Create;
end.
interface
// Tipos de Dados.
Type TVetor = array[1..MaxDim] of Extended; // vetor de números reais
implementation
{Implementação dos protótipos acima definidos}
{--------------------------------------------------------------------------}
Function FvXcte (X:TVetor;IVa:Integer;X0:Extended): Extended;
{calcula o valor da funcao a ser derivada, com o vetor X, substituindo
o valor da variavel a ser derivada (indicado por IV), pelo valor de
X0. Isso como que transforma a funcao vetorial em uma funcao de f(x)}
Begin;
X[IVa]:=X0;
FvXcte:=Fx(X);
End;
{--------------------------------------------------------------------------}
Function Fxa (X0:Extended):Extended;
{arranja os argumentos e calcula o valor da funcao p/ x0, chamando "FvXcte"
Possivelmente este codigo poderia conter o codigo acima, de "FvXcte". Esta
funcao deve ficar nessa forma para compatibilidade com a funcao "D1x"}
Begin;
Fxa:=FvXcte(Xv,IV,X0);
End;
{--------------------------------------------------------------------------}
Function D1x (X0:Extended):Extended;
{...........................................................................
' Calcula a derivada primeira de f(x), no ponto X0
' onde: F - funcao f(x) (escalar)
' X0 - ponto de avaliacao da derivada
'
' utilizar esdsa forma para alta precisão e baixa velocidade
'..........................................................................}
var
A: Array [0..8,0..9] of Extended; { Tabela de Diferenças}
H,DX,X: Extended;
I,J,N,S: Integer;
Begin;
For I:=0 To N Do
Begin;
X:=(X0+I*H); {calcula os valores dos xi}
A[I,0]:=Fxa(X);
End;
For I:=1 To N Do
For J:=0 To N-1 Do
A[J,I]:=A[J+1,I-1]-A[J,I-1]; // constroi a tabela de diferenças
DX:=0;
For I:=1 To N Do // efetua a soma correspondente ao interior do
Begin; // parênteses da equação IV.12.
S:=(I Mod 2)*2-1; // determina o sinal de cada termo
DX:=DX+S*A[0,I]/I;
End;
DX:=DX/H; // completa a avaliação da euação IV.12
result:=DX; // retorna o valor da derivada
End;
{--------------------------------------------------------------------------}
Function D1xSimplif (X0:Extended):Extended;
{...........................................................................
' Calcula a derivada primeira de f(x), no ponto X0
' onde: F - funcao f(x) (escalar)
' X0 - ponto de avaliacao da derivada
' Opera de forma simplificada, só pode ser utilizada para curvas como
' as que serão aqui derivadas, ou seja, algo próximo de f(x)=k*X^(1/2)
' com valores de ordem de grandeza próximos aos aqui utilizados.
'
' utilizar essa forma para baixa precisão e maior velocidade
'..........................................................................}
var
X1,DX,X2: Extended;
Begin;
X1:=X0-1E-8;
X2:=X0+1E-8;
DX:=(Fxa(X2)-Fxa(X1))/2E-8;
result:=DX; // retorna o valor da derivada
End;
{--------------------------------------------------------------------------}
Begin;
XV:=XY;
IV:=IV1;
Fx:=F;
// Dpar:=D1x(XV[IV]);
Dpar:=D1xSimplif(XV[IV]);
End;
{--------------------------------------------------------------------------}
Procedure NRaph2 (M:TmFvx; var X1:TVetor; N:Integer; Err:Extended);
{...........................................................................
' Resolve um sistema não linear de equações, de grau "N", propostas como
VIII-58
var A: TMatriz_Gauss;
DX,V: TVetor_Gauss;
T,SL: Boolean;
I,J: Integer;
X: TVetor;
// IntCont: cardinal; // contador de iterações - útil na depuração
Begin;
X:=X1; // copia o vetor da primeira aproximação para um vetor auxiliar
For I:=1 To N Do For J:=1 To N Do A[I,J]:=0;// cria uma matriz NxN "nula"
// para conter a matriz "Jacobiana"
End;
mesmos, cada uma dessas leis internas é descrita utilizando-se apenas um pequeno
subconjunto de variáveis, tomado dentro do conjunto total de incógnitas, fazendo
com que várias colunas da matriz “jacobiana” apresente valor nulo, para cada linha
da mesma.
interface
Type
private
FId: Cardinal; // identificador
FDataNasc: TData; // data de nascimento;
FDataObito: TData; // data de óbito
FTipoNecessidade: TTipoAparelho; // tipo de necessidade
FEstadoAtend: TEstadoAtend; // estado de atendimento de necessidade
public
property Id:Cardinal read FId write FId;
property DataNasc: TData read FDataNasc write FdataNasc;
VIII-61
THomem = class(TPessoa)
private
FSexo: Byte; // 1-masc
public
Property Sexo: Byte read FSexo;
TMulher = class(TPessoa)
private
FSexo: Byte; // 2 - feminino
FGravida: Boolean; // estado de gravidez
FDataNascFilho: TData; // data rojetada para o nascimento de filho
protected
procedure SetDataNascFilho(DNx:TData);
public
property Sexo: Byte read FSexo;
property Gravida: Boolean read FGravida;
property DataNascFilho: TData read FDataNascFilho write SetDataNascFilho;
constructor Create (Ident: Cardinal); override;
destructor Destroy; override;
procedure ResolveGravidez;
end;
TFamilia = class(TObject)
private
FId: Cardinal;
FMembros: TList; // contém apontadores para TPessoa
FNumPess: Cardinal; // número de membros
implementation
Begin;
Id:=Ident;
FTipoNecessidade:=apnone;
FEstadoAtend:=eaLivre;
End;
//--------------------------------------------------------------------------
destructor TPessoa.Destroy;
Begin;
inherited Destroy;
End;
//--------------------------------------------------------------------------
function Tpessoa.RegistraNecessidade(N:TTipoAparelho): Boolean;
Begin;
result:=(FTipoNecessidade = apNone) and (FEstadoAtend = eaLivre);
If result then
begin;
FEstadoAtend:=eaEmEspera;
FTipoNecessidade:=N;
end
End;
//--------------------------------------------------------------------------
function TPessoa.IniciaAtend: Boolean;
Begin;
result:=(FTipoNecessidade <> apNone) and (FEstadoAtend = eaEmEspera);
If result then FEstadoAtend:=eaEmAtendimento;
End;
//--------------------------------------------------------------------------
function TPessoa.EncerraAtend: Boolean;
Begin;
result:=(FEstadoAtend = eaEmAtendimento);
If result then
begin;
FEstadoAtend:=eaLivre;
FTipoNecessidade:=apNone;
end
End;
//========================== THomem ========================================
constructor THomem.Create(Ident:Cardinal);
Begin;
inherited create (Ident);
FSexo:=1;
End;
//--------------------------------------------------------------------------
destructor THomem.Destroy;
Begin;
inherited destroy;
End;
//========================== TMulher =======================================
constructor TMulher.Create (Ident: Cardinal);
Begin;
VIII-63
Begin;
inherited destroy;
End;
//--------------------------------------------------------------------------
procedure TMulher.SetDataNascFilho(DNx:TData);
Begin;
FGravida:=True;
FDataNascFilho:=DNx;
End;
//--------------------------------------------------------------------------
procedure TMulher.ResolveGravidez;
Begin;
FGravida:=False;
End;
//========================== TFamilia ======================================
constructor TFamilia.Create (Ident: Cardinal);
begin;
FId:=Ident;
FMembros:=TList.Create;
FNumPess:=0;
End;
//--------------------------------------------------------------------------
destructor TFamilia.Destroy;
var R: ^TPessoa;
I: cardinal;
Begin;
If FMembros.Count>0 Then
For I:=0 To FMembros.Count-1 Do
begin;
R:=FMembros[I];
R^.free;
End;
FMembros.Free;
inherited destroy;
End;
//--------------------------------------------------------------------------
procedure TFamilia.AdicionaPessoa (P:TPessoa);
Begin;
New(R);
R^:=P;
FMembros.Add(R);
Inc(FNumPess);
End;
//--------------------------------------------------------------------------
function TFamilia.RemovePessoa(Ident: Cardinal): Boolean;
var I: Cardinal;
Begin;
result:=false;
I:=0;
While (I<FNumPess) and (not Result) Do
begin;
VIII-64
interface
Type
TEconomia = class(TComponent)
private
FId: Cardinal; // identificação
FFamilia: TFamilia; // família que a ocupa
FVincJur: byte; // tipo de contrato: 1-imóvel próprio; 2-alugado
FDataEntr: TData; // data de entrada (início do contrato). Se
// "FOcupado" é falseo, contém a data de
// reocupação
FDataSaida: TData; // data projetada para saída
FOcupado: Boolean; // estado de ocupação
FGrupos: TGrupoAparelhos; // 4 grupos de até 3 aparelhos cada
FNApGrupos: TNumAparelhosPorGrupo; // número de aparelhos em cada grupo
FNGrupos: cardinal; // número de grupos
public
property Id: cardinal read FId;
property Familia: TFamilia read FFamilia;
property VincJur: byte read FVincJur write FVincJur;
property DataEntr: TData read FDataEntr write FDataEntr;
property DataSaida: TData read FDataSaida write FDataSaida;
property Ocupado: Boolean read FOcupado;
VIII-65
procedure Limpar;
procedure EntraFamilia(F:TFamilia; D:Tdata; VJ:Byte);
procedure SaiFamilia;
end;
private
FEconomias: TList; // lista das economias que compõem o prédio
FNumEcon: Cardinal; // número de economias
FDep: TDespachante; // despachante da relação usuário-aparelho
implementation
Begin;
inherited Create(AOwner);
FId:=Ident;
FFamilia:=TFamilia.Create(0);
FOcupado:=False;
FDataEntr.Atualdata;
FVincJur:=0;
FNApGrupos[0]:=3;
VIII-66
FNGrupos:=4;
End;
//--------------------------------------------------------------------------
procedure TEconomia.Limpar;
Begin;
FFamilia.Destroy;
FOcupado:=False;
End;
//--------------------------------------------------------------------------
destructor TEconomia.Destroy;
var I,J:cardinal;
Begin;
FFamilia.Destroy;
For I:=0 To FNGrupos-1 Do
For J:=0 To FNapGrupos[I]-1 Do
FGrupos[I,J].Free;
inherited destroy;
End;
//--------------------------------------------------------------------------
procedure TEconomia.EntraFamilia(F:TFamilia; D:Tdata; VJ:Byte);
begin;
If not FOcupado Then
begin;
FFamilia:=F;
FVincJur:=VJ;
FDataEntr:=D;
FOcupado:=True;
End
Else
raise exception.create('Não foi possível inserir essa família!');
End;
//--------------------------------------------------------------------------
procedure TEconomia.SaiFamilia;
Begin;
FOcupado:=False;
End;
//=========================== TPredio ======================================
constructor TPredio.create(AOwner:TComponent;D:Tdata;NAp:Cardinal;
TxDesoc:extended);
Begin;
inherited Create(AOwner);
VIII-67
var I: Cardinal;
R: ^TEconomia;
Begin;
If FEconomias.Count>0 Then
For I:=0 To FEconomias.Count-1 Do
begin;
R:=FEconomias[I];
R^.Limpar;
Dispose(R);
End;
FEconomias.Count:=0;
End;
//--------------------------------------------------------------------------
destructor TPredio.Destroy;
var I: Cardinal;
R: ^TEconomia;
Begin;
If FEconomias.Count<>0 Then
For I:=0 To FEconomias.Count-1 Do
begin;
R:=FEconomias[I];
Dispose(R);
End;
FEconomias.Free;
FDep.Free;
inherited destroy;
end;
//--------------------------------------------------------------------------
procedure TPredio.InsereEconomia(E:TEconomia);
// A variável "R" não pode ser local à procedure. se assim for a procedure
// cria a mesnma na pilha ("Stack"), liberando e sobrescrevendo sua
// área na saída. Especialmente porque, se local, será criada no segmento
// de dados da procedure ("stack"), não "vivendo" tanto quanto o
// objeto prédio.
Begin;
New(R);
R^:=E;
FEconomias.Add(R);
Inc(FNumEcon);
End;
//--------------------------------------------------------------------------
procedure TPredio.PopularInicial(Di:Tdata;NEcon:Cardinal;TxEcDes:Extended);
var E:TEconomia;
F: TFamilia;
Pes: TPessoa;
Hom: THomem;
Mul: TMulher;
I,J: Cardinal;
D,D1: TData;
NumHab: Cardinal;
VIII-68
begin
Self.Limpar;
If NEcon=0 Then Exit;
For I:=1 To NEcon Do
Begin;
E:=TEconomia.Create(Self,I); // cria uma economia
F:=TFamilia.Create(100*I+1); // cria uma família por economia
If dado(10000000)>=Round(TxEcDes*1E7) Then // determina se
NumHab:=DetermNumHab // a economia começa ocupada
Else NumHab:=0; // ou desocupada
D:=Di; // a familia entra ocupa a economia na data de hoje
For J:=1 To NumHab Do // se NumHab>0 cria as pessoas
Begin;
Pes:=TPessoa.Create(10000*I+100*1+J);
Pes.DataNasc:=DetermDataNasc(D);
case DetermSexoExistente(Pes.DataNasc,D) of
1: Begin;
Hom:=THomem.Create(Pes.Id);
Hom.DataNasc:=Pes.DataNasc;
Hom.DataObito:=DetermObito(Hom.Sexo,Hom.DataNasc,D);
F.AdicionaPessoa(Hom);
End;
2: Begin;
Mul:=TMulher.Create(Pes.Id);
Mul.DataNasc:=Pes.DataNasc;
Mul.DataObito:=DetermObito(Mul.Sexo,Mul.DataNasc,D);
If DetermGravidez(Mul.DataNasc,D,D1) Then
Mul.DataNascFilho:=D1;
F.AdicionaPessoa(Mul);
End;
end;
Pes.Destroy;
End;
If F.NumPess>0 Then
begin;
VJ:=DetermVincJur(NumHab);
E.EntraFamilia(F,D,VJ);
E.DataSaida:=DetermdataSaida(VJ,E.DataEntr);
end
Else
Begin;
E.DataEntr:=DetermdataRehab(D);
E.FOcupado:=False;
End;
Self.InsereEconomia(E);
// não se pode destruir "E" se não a área da variável cujo ponteiro
// está na lista de economias do prédio será liberada e sobrescrita.
// mas pode criar outra sobre esta variável, que será alocada em
// outra área. Lembrar que a área anterior está "lembrada" na lista
// de economias do Prédio.
End;
end;
//--------------------------------------------------------------------------
procedure TPredio.ListaDetalhes(ArqSai,Titulo:String);
IF PP^.ClassName='TMulher' Then
Begin;
S3:='Sexo Feminino';
If (PP^ as TMulher).Gravida Then
S4:='Grávida, filho esperado para '+
(PP^ as TMulher).DataNascFilho.Textodata(1)+
'.'+#13+#10
Else S4:='';
End;
IF PP^.ClassName='THomem' Then
Begin;
S3:='Sexo Masculino';
End;
Writeln(F,SPC(10),S);
Writeln(F,SPC(11),S3);
Writeln(F,SPC(11),S1);
Writeln(F,SPC(11),S2);
Writeln(F,SPC(11),S4);
End;
end
Else
Begin;
S:='Data de futura ocupação: '+PE^.DataEntr.Textodata(1);
S1:='';
VIII-70
var DParto:TData;
F: TFamilia;
Pes:TPessoa;
NumHab,I,J: Cardinal;
PE: ^TEconomia;
Hom: THomem;
Mul: TMulher;
VJ: Byte;
begin
For I:=1 To Self.NumEcon Do
Begin;
PE:=Self.Economias[I-1];
If PE^.Ocupado Then
Begin; // se ocupado verifica hipótese de saída naquele dia
If MyDelphiUnit02.Eq(DHoje,PE^.DataSaida) Then
Begin;
PE^.Limpar;
PE^.DataEntr:=DetermdataRehab(DHoje);
End;
End
Else // se desocupado verifica hipótese de entrada naquele dia
Begin;
If MyDelphiUnit02.Eq(DHoje,PE^.DataEntr) Then
Begin;
F:=TFamilia.Create(100*I+1);
NumHab:=DetermNumHab;
For J:=1 To NumHab Do
Begin;
Pes:=TPessoa.Create(10000*I+100*1+J);
Pes.DataNasc:=DetermDataNasc(DHoje);
case DetermSexoExistente(Pes.DataNasc,DHoje) of
1: Begin;
Hom:=THomem.Create(Pes.Id);
Hom.DataNasc:=Pes.DataNasc;
Hom.DataObito:=DetermObito(Hom.Sexo,Hom.DataNasc,DHoje);
F.AdicionaPessoa(Hom);
End;
2: Begin;
Mul:=TMulher.Create(Pes.Id);
Mul.DataNasc:=Pes.DataNasc;
Mul.DataObito:=DetermObito(Mul.Sexo,Mul.DataNasc,DHoje);
If DetermGravidez(Mul.DataNasc,DHoje,DParto) Then
Mul.DataNascFilho:=DParto;
F.AdicionaPessoa(Mul);
End;
end;
Pes.Destroy;
End;
VJ:=DetermVincJur(NumHab);
VIII-71
var DParto,D1:TData;
Pes:TPessoa;
PP,PP1: ^TPessoa;
I,J,K,W: Cardinal;
PE: ^TEconomia;
Hom: THomem;
Mul: TMulher;
begin
For I:=1 To Self.NumEcon Do // percorre todas as economias
Begin;
PE:=Self.Economias[I-1];
If PE^.Ocupado Then
Begin;
J:=1;
Repeat // percorre cada pessoa de cada economia
Begin;
PP:=PE^.Familia.Membros[J-1];
// verifica se a pessoa morre hoje
If MyDelphiUnit02.Eq(PP^.DataObito,DHoje) Then
Begin;
PE^.Familia.RemovePessoa(PP^.Id);
Dec(J);
If PE^.Familia.NumPess=0 Then
Begin; // se morrer todos desocupa o imóvel
PE^.Limpar;
PE^.DataEntr:=DetermdataRehab(DHoje);
End;
End;
// verifica se é mulher
If (PP^.ClassName='TMulher') Then
Begin;
Mul:=(PP^ as TMulher);
// verifica se vai ser mãe com a presente idade
// isso só é verificado no dia seguinte ao seu
// aniversário
If not Mul.Gravida Then
begin;
D1:=DHoje;
D1.NovaData(1);
If MyDelphiUnit02.Eq(Mul.DataNasc,D1) and
DetermGravidez(Mul.DataNasc,D1,DParto) Then
Mul.DataNascFilho:=DParto;
end;
// verifica se vai dar a luz hoje
If Mul.Gravida and
MyDelphiUnit02.Eq(Mul.dataNascFilho,DHoje) Then
Begin;
Mul.ResolveGravidez;
// se o nascimento do filho ultrapassar o
// limite técnico de 7 pessoas por família
// mãe e filho "se mudam"
If PE^.Familia.NumPess=7 Then
PE^.Familia.RemovePessoa(Mul.Id)
Else // se estver tudo "Ok" insere o filho
Begin;
VIII-72
1: Begin;
Hom:=THomem.Create(Pes.Id);
Hom.DataNasc:=DHoje;
Hom.DataObito:=DetermObito(Hom.Sexo,Hom.DataNasc,DHoje);
PE^.Familia.AdicionaPessoa(Hom);
End;
2: Begin;
Mul:=TMulher.Create(Pes.Id);
Mul.DataNasc:=DHoje;
Mul.DataObito:=DetermObito(Mul.Sexo,Mul.DataNasc,DHoje);
PE^.Familia.AdicionaPessoa(Mul);
End;
end;
Pes.Destroy;
end;
end;
end;
End;
Inc(J);
Until J>PE^.Familia.NumPess;
End;
End;
End;
//--------------------------------------------------------------------------
procedure TPredio.IncrementaUmSegundoAparelhos;
Begin;
For I:=0 To NumEcon-1 Do
Begin;
PE:=Economias[I];
For J:=0 To PE^.NumGrupos-1 Do
For K:=0 To PE^.NumApaGrupo[J]-1 Do
(PE^.GruposAp[J,K] as TAparelho).IncrementarUmSegundo;
End;
End;
VIII-73
interface
uses Fila;
Type
TFilaCardinal = class(TFila)
private
P1: ^Cardinal;
protected
public
function JaEstaNaFila(P:Cardinal):Boolean; reintroduce; overload;
procedure PoeNaFila(P:cardinal); reintroduce;
function AtendeProximo:Cardinal; reintroduce;
end;
implementation
//--------------------------------------------------------------------------
function TFilaCardinal.JaEstaNaFila(P:Cardinal):Boolean;
var I: Integer;
Begin;
result:=False;
If not Self.Vazia Then
For I:=0 To Self.NumElem-1 Do
Begin;
P1:=Self.Items[I];
result:=result or (P1^=P);
End;
End;
//--------------------------------------------------------------------------
procedure TFilaCardinal.PoeNaFila(P: Cardinal);
Begin;
New(P1);
P1^:=P;
inherited PoeNaFila(P1);
end;
//--------------------------------------------------------------------------
function TFilaCardinal.AtendeProximo: Cardinal;
VIII-74
interface
Type
TFila = class(TList)
private
PP: pointer;
function GetNumElem: integer;
function GetVazia: Boolean;
protected
// essa implementação irá variar conforme o tipo de dado
// manipulado pela fila.
function JaEstaNaFila(P:pointer):Boolean; virtual; abstract;
public
property NumElem: integer read GetNumElem;
property Vazia: Boolean read GetVazia;
implementation
//--------------------------------------------------------------------------
constructor TFila.Create;
Begin;
inherited create;
End;
//--------------------------------------------------------------------------
destructor TFila.Destroy;
Begin;
While Self.Count<>0 Do
Begin;
PP:=Self.AtendeProximo;
Dispose(PP);
VIII-75
Begin;
Self.Add(P);
End;
//--------------------------------------------------------------------------
function TFila.AtendeProximo: pointer;
Begin;
result:=nil;
If Self.Count<>0 Then
Begin;
result:=Self.Items[0];
Self.Delete(0);
End;
End;
//--------------------------------------------------------------------------
function TFila.GetNumElem: integer;
Begin;
result:=Self.Count;
End;
//--------------------------------------------------------------------------
function TFila.GetVazia: Boolean;
begin;
result:=Self.count=0;
End;
//--------------------------------------------------------------------------
end.
interface
implementation
Begin;
FixCol:=SG.FixedCols;
SG.FixedCols:=0;
MaxLarg:=0;
With SG Do
Begin;
For I:=0 To SG.RowCount-1 Do
Begin;
S:=Cells[NCol,I];
W:=Canvas.TextWidth(S);
If MaxLarg < W then MaxLarg:=W;
End;
MaxLarg:=MaxLarg+5;
If MaxLarg<>5 Then ColWidths[NCol]:=MaxLarg;
End;
SG.FixedCols:=FixCol;
End;
//--------------------------------------------------------------------------
procedure AjustaTodasAsColunasDeStringGrid(var SG:TStringGrid);
var I: Integer;
VIII-77
var I:Integer;
LargTot: Integer;
Begin;
LargTot:=0;
For I:=0 To SG.ColCount-1 Do LargTot:=LargTot+SG.ColWidths[I];
LargTot:=LargTot+(SG.ColCount+1)*(SG.GridLineWidth);
If LargTot>500 Then LargTot:=500;
SG.ClientWidth:=LargTot+1;
End;
//--------------------------------------------------------------------------
procedure InsereColunaAEsquerda(var SG:TStringGrid);
var I,J:Integer;
Begin;
For I:=SG.FixedCols To SG.ColCount-2 Do
For J:=0 To SG.RowCount-1 Do
SG.Cells[I,J]:=SG.Cells[I+1,J];
For I:=0 To SG.RowCount-1 Do SG.Cells[SG.ColCount-1,I]:='';
End;
//--------------------------------------------------------------------------
procedure RegistraPopulacaoDoDia(P:TPredio;var RV:array of TRegVal;
var RS:TRegVal; D:TData;H:THora);
Begin
Soma:=0;
For I:=0 To P.NumEcon-1 Do
Begin;
PE:=P.Economias[I];
If PE^.Ocupado then N:=PE^.Familia.NumPess Else N:=0;
Soma:=Soma+N;
RV[I].InserePonto(D,H,N);
End;
RS.InserePonto(D,H,Soma);
End;
//--------------------------------------------------------------------------
procedure MostraUltimoRegDaPopulacao(RV:array of TRegVal; RS:TRegVal;
var SG:TStringGrid; var Soma:TLabel);
var P: TPtRegPonto;
I,N: Integer;
Begin;
N:=RS.n-1;
P:=RS.Lista[N];
Soma.Caption:=IntToStr(Round(P^.Valor));
InsereColunaAEsquerda(SG);
For I:=0 To Predio1.NumEcon-1 Do
Begin;
P:=RV[I].Lista[N];
VIII-78
var RC:TRect;
Begin;
If Ok Then
Begin;
RC:=SG.CellRect(C,R);
With SG.Canvas Do
Begin;
Pen.Width:=3;
Pen.Color:=clBlue;
MoveTo(RC.Left+2,RC.Top+2);
LineTo(RC.Right-2,RC.Bottom-2);
MoveTo(RC.Right-2,RC.Top+2);
LineTo(RC.Left+2,RC.Bottom-2);
End;
End
Else
SG.Cells[C,R]:='';
End;
//--------------------------------------------------------------------------
procedure MostraEstadoAparelhos(var SG:TStringGrid);
Begin;
With Predio1 Do
For I:=0 To NumEcon-1 Do
Begin;
R:=I+1;
C:=0;
PE:=Economias[I];
For J:=0 To PE^.NumGrupos-1 Do
For K:=0 To PE^.NumApaGrupo[J]-1 Do
Begin;
Inc(C);
If (PE^.GruposAp[J,K] as TAparelho).Operando Then
MarcaGrade(SG,True,C,R)
Else
MarcaGrade(SG,False,C,R);
End;
End;
End;
//--------------------------------------------------------------------------
procedure RegistraVazaoAparelhos(P:TPredio;var RV:TArrayRegVaz;
D:TData;H:THora);
var I,J,K,L:integer;
PE: ^TEconomia;
X: Extended;
TReg: integer;
W:Word;
H1:THora;
PR: TPTRegPonto;
VIII-79
0: Begin;
X:=(GruposAp[J,K] as TAparelho).vazao;
RV[I+1,L].InserePonto(D,H,X);
End;
1: begin;
W:=(H.Segundo mod 5);
If W <> 0 then
begin;
X:=(GruposAp[J,K] as TAparelho).vazao;
If W=1 then
begin;
H1:=H;
H1.Segundo:=H1.Segundo-1;
RV[I+1,L].InserePonto(D,H1,X);
end
Else
begin;
PR:=RV[I+1,L].Lista.Last;
PR^.Valor:=PR^.Valor+(GruposAp[J,K] as TAparelho).vazao;
End;
end
Else
begin;
PR:=RV[I+1,L].Lista.Last;
PR^.Valor:=PR^.Valor+(GruposAp[J,K] as
TAparelho).vazao;
PR^.Valor:=PR^.Valor/5;
end;
End;
2: begin;
W:=H.Segundo;
If W <> 0 then
begin;
X:=(GruposAp[J,K] as TAparelho).vazao;
If W=1 then
begin;
H1:=H;
H1.Segundo:=0;
RV[I+1,L].InserePonto(D,H1,X);
end
Else
begin;
PR:=RV[I+1,L].Lista.Last;
PR^.Valor:=PR^.Valor+(GruposAp[J,K] as TAparelho).vazao;
VIII-80
End;
End;
End;
End;
End;
End;
//--------------------------------------------------------------------------
procedure CalcularRede(var P:TPredio; var R:TBarrilete);
Begin;
For I:=0 To P.NumEcon-1 Do
Begin;
PE:=P.Economias[I];
EC:=PE^;
Pv:=(I div 4)+1;
Ap:=(I mod 4)+1;
With R.ColImpar[Ap].Ram[Pv] Do
Begin;
PC:=EC.GruposAP[1,0];
TQ:=EC.GruposAp[2,0];
ML:=EC.GruposAp[3,0];
End;
With R.ColPar[Ap].Ram[Pv] Do
Begin;
CH:=EC.GruposAP[0,0];
LV:=EC.GruposAP[0,1];
BS:=EC.GruposAP[0,2];
End;
End;
R.ResolverRede;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
RelCalend, StdCtrls, ExtCtrls, ComCtrls, Grids;
type
TForm1 = class(TForm)
RelPrincipal: TRelCalend;
DataDisp: TLabel;
TimeDisp: TLabel;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
DispHoraReal: TLabel;
DispDataReal: TLabel;
Timer1: TTimer;
PC1: TPageControl;
TS1: TTabSheet;
TS2: TTabSheet;
SG1: TStringGrid;
DispSomaPop: TLabel;
Label3: TLabel;
Bevel1: TBevel;
Button2: TButton;
SD1: TSaveDialog;
RG1: TRadioGroup;
SG2: TStringGrid;
Button3: TButton;
RG2: TRadioGroup;
RG3: TRadioGroup;
SD2: TSaveDialog;
CB1: TCheckBox;
CBox1: TComboBox;
Label4: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure RelPrincipalMudaHora(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure RelPrincipalMudaData(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure RG1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
VIII-82
var
Form1: TForm1;
implementation
{$R *.DFM}
//--------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
FirstAtivation:=True;
RelPrincipal.StopAutom; // relógio no modo "manual"
Button1.Caption:='Correr o Tempo.';
TempoParado:=True;
DataDisp.Caption:=RelPrincipal.SData;
TimeDisp.Caption:=RelPrincipal.RHora.TextoHora(1);
With Rede1 Do
Begin;
For I:=1 To 4 Do
For J:=1 To 7 Do
Begin;
ColImpar[I].Ram[J].PC:=TApPiaDeCozinha.create(Form1);
ColImpar[I].Ram[J].PC.Modelo:='Pia de cozinha, col:'+
IntToStr(1+(I-1)*2)+', pvto: '
+IntToStr(J)+'.';
ColImpar[I].Ram[J].TQ:=TApTanque.create(Form1);
ColImpar[I].Ram[J].TQ.Modelo:='Tanque, col:'+IntToStr(1+(I-1)*2)+
', pvto: '+IntToStr(J)+'.';
ColImpar[I].Ram[J].ML:=TMaqLavarCap4.create(Form1);
ColImpar[I].Ram[J].ML.Modelo:='Máquina de lavar roupas, col:'
+IntToStr(1+(I-1)*2)+', pvto: '
+IntToStr(J)+'.';
ColPar[I].Ram[J].CH:=TApChuveiro.create(Form1);
ColPar[I].Ram[J].CH.Modelo:='Chuveiro, col:'+IntToStr(2+(I-1)*2)+',
pvto: '+IntToStr(J)+'.';
ColPar[I].Ram[J].LV:=TApLavatorio.create(Form1);
ColPar[I].Ram[J].LV.Modelo:='Lavatório, col:'+IntToStr(2+(I-
1)*2)+', pvto: '+IntToStr(J)+'.';
ColPar[I].Ram[J].BS:=TApBaciaSanitaria6L.create(Form1);
ColPar[I].Ram[J].BS.Modelo:='Bacia sanitária, col:'+IntToStr(2+(I-
1)*2)+', pvto: '+IntToStr(J)+'.';
End;
end;
With SG1 Do
VIII-83
With SG2 Do
begin;
RowCount:=Predio1.NumEcon+1;
ColCount:=7;
Cells[0,0]:='Apto.';
For I:=1 To Predio1.NumEcon Do Cells[0,I]:=IntToStr(I);
Cells[1,0]:='Chuveiro';
Cells[2,0]:='Lavatório.';
Cells[3,0]:='Bacia Sanitária';
Cells[4,0]:='Pia de Cozinha';
Cells[5,0]:='Tanque';
Cells[6,0]:='Mq. Lavar Roupas';
For I:=1 To ColCount-1 Do
For J:=1 To RowCount-1 Do
Cells[I,J]:='';
AjustaTodasAsColunasDeStringGrid(SG2);
AjustaLarguraTotalDeStringGrid(SG2);
End;
RegistraPopulacaoDoDia(Predio1,RegPop,SomaPop,RelPrincipal.RData,RelPrincipal
.RHora);
MostraUltimoRegDaPopulacao(RegPop,SomaPop,SG1,DispSomaPop);
CBox1.ItemIndex:=0;
end;
//--------------------------------------------------------------------------
procedure TForm1.FormDestroy(Sender: TObject);
begin
For I:=1 To Predio1.NumEcon Do
For J:=1 To 6 Do RegVaz[I,J].Free;
For I:=1 To Predio1.NumEcon Do RegPop[I].Free;
SomaPop.Free;
Predio1.Free;
Rede1.Free;
end;
VIII-84
begin
DataDisp.Caption:=RelPrincipal.SData;
TimeDisp.Caption:=RelPrincipal.RHora.TextoHora(1);
Predio1.Despachante.VerificaNecessidades;
Predio1.Despachante.AtendeNecessidades;
Predio1.IncrementaUmSegundoAparelhos;
CalcularRede(Predio1,Rede1);
RegistraVazaoAparelhos(Predio1,RegVaz,RelPrincipal.RData,
RelPrincipal.RHora);
end;
//--------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
If TempoParado Then
Begin;
Button1.Caption:='Parar o Tempo.';
TempoParado:=False;
End
Else
Begin;
Button1.Caption:='Correr o Tempo.';
TempoParado:=True;
End;
var D:TData;
H:THora;
begin
D.AtualData;
H.AtualHora;
DispDataReal.Caption:=D.TextoData(0);
DispHoraReal.Caption:=H.TextoHora(1);
end;
//--------------------------------------------------------------------------
procedure TForm1.RelPrincipalMudaData(Sender: TObject);
begin
Predio1.ProcessaEntradaSaida(RelPrincipal.RData);
Predio1.ProcessaNasceMorre(RelPrincipal.RData);
RegistraPopulacaoDoDia(Predio1,RegPop,SomaPop,RelPrincipal.RData,
RelPrincipal.RHora);
MostraUltimoRegDaPopulacao(RegPop,SomaPop,SG1,DispSomaPop);
If (not TempoParado) and CB1.checked Then
Begin;
Button1Click(Button1);
ShowMessage('Parada ao final do dia efetuada.'+#13+
'Use o botão <Correr Tempo> para prosseguir.');
VIII-85
var FN,S:String;
F: TextFile;
I,J: Integer;
P: TPtRegPonto;
TPar: Boolean;
begin
TPar:=TempoParado;
If not TempoParado Then Button1.Click;
SD1.InitialDir:=DirRelat;
If SD1.Execute Then
begin;
FN:=SD1.FileName;
AssignFile(F,FN);
Rewrite(F);
S:='Aptos--->';
For I:=1 To Predio1.NumEcon Do S:=S+' '+IntToStr(I);
S:=S+' Soma';
Writeln(F,S);
CloseFile(F);
End;
0: Begin;
RelPrincipal.Incdata:='000/000/000';
RelPrincipal.IncHora:='000:00:01.000';
End;
1: Begin;
RelPrincipal.Incdata:='001/000/000';
RelPrincipal.IncHora:='000:00:00.000';
End;
end;
end;
//--------------------------------------------------------------------------
// fazer a parada para gravação.
procedure TForm1.Button3Click(Sender: TObject);
VIII-86
begin
If not TempoParado Then
Begin;
ShowMessage('O relógio deve estar parado para executar a gravação.');
Exit;
End;
TGrav:=RG3.ItemIndex;
SD2.InitialDir:=DirRelat;
Case TGrav of
End;
end;
//--------------------------------------------------------------------------
procedure TForm1.FormActivate(Sender: TObject);
var S:String;
begin
If FirstAtivation Then
Begin;
Button1.Enabled:=False;
Button2.Enabled:=False;
Button3.Enabled:=False;
Application.ProcessMessages;
S:=Form1.Caption;
Form1.Caption:=S+' - Inicializando Distribuições. Aguarde...';
InitDistrHidra;
Form1.Caption:=S;
FirstAtivation:=False;
VIII-88
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
DistrHidra in 'Bib_Aparelhos\DistrHidra.pas',
Aparelho in 'Bib_Aparelhos\Aparelho.pas',
GeraDistr in 'Bib_Geral\GeraDistr.pas',
InterClasses in 'Bib_Geral\InterClasses.pas',
EstatFunc in 'Bib_Geral\EstatFunc.pas',
TiposPop in 'Bib_Populacao\TiposPop.pas',
DistrPop in 'Bib_Populacao\DistrPop.pas',
Dominios in 'Bib_Dominios\Dominios.pas',
Unit0 in 'Unit0.pas',
Despachante in 'Bib_Relacionamentos\Despachante.pas',
FilaCardinal in 'Bib_Relacionamentos\FilaCardinal.pas',
Fila in 'Bib_Relacionamentos\Fila.pas',
Barrilete in 'Bib_Rede\Barrilete.pas',
ColunaAF1 in 'Bib_Rede\ColunaAF1.pas',
ColunaAF2 in 'Bib_Rede\ColunaAF2.pas',
RamalH1 in 'Bib_Rede\RamalH1.pas',
RamalH2 in 'Bib_Rede\RamalH2.pas',
FUniv in 'Bib_Rede\FUniv.pas',
SistNaoLinearEsparso in 'Bib_Geral\SistNaoLinearEsparso.pas';
{$R *.RES}
begin
Application.Initialize;
Application.Title := 'Exemplo do Capítulo 12';
Application.CreateForm(TForm1, Form1);
Application.Run;
end.