Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Petrucci, Aron L. - Metodologia para Seleção de Configuração de Sistemas Prediais de Água em Edificações Que Abriguem Múltiplas Economias

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 533

ARON LOPES PETRUCCI

METODOLOGIA PARA SELEÇÃO DE CONFIGURAÇÃO DE

SISTEMAS PREDIAIS DE ÁGUA EM EDIFICAÇÕES QUE

ABRIGUEM MÚLTIPLAS ECONOMIAS

Tese apresentada à Escola Politécnica da


Universidade de São Paulo para obtenção do
título de Doutor em Engenharia.

São Paulo
2001
ii
ARON LOPES PETRUCCI

METODOLOGIA PARA SELEÇÃO DE CONFIGURAÇÃO DE


SISTEMAS PREDIAIS DE ÁGUA EM EDIFICAÇÕES QUE
ABRIGUEM MÚLTIPLAS ECONOMIAS

(Volume 1)

Tese apresentada à Escola Politécnica da


Universidade de São Paulo para obtenção do
título de Doutor em Engenharia.

Área de Concentração:
Engenharia de Construção Civil e Urbana

Orientador:
Orestes Marraccini Gonçalves

São Paulo
2001
iii

Aos meus filhos Mariana e André e à


minha esposa Regina, que têm sido
minha fonte de inspiração e meu porto
seguro. Que Deus os guarde, e
recompense sua infinita compreensão.
iv

AGRADECIMENTOS

Primeiramente, agradeço a Deus, princípio e finalidade de toda a


caminhada humana. Senhor, que seja feita sempre a Sua vontade.

Ao meu pai, Braulio Petrucci, que acompanhou mais essa etapa de


minha vida escolar com o mesmo carinho e dedicação apresentados desde aquele
dia em que me ensinou a ler. Pai, quero ser para os meus filhos ao menos um pouco
do pai és para mim.

À minha mãe, Dirce Ap. Lopes Petrucci, que sempre, com


carinho, amor e muito senso de responsabilidade me levou pela mão em todas as
escolas da vida. Mãe, mais um diploma que também é seu.

Ao meu orientador, Prof. Dr. Orestes Marraccini Gonçalves, pela


segura orientação, e principalmente por nunca se contentar com um trabalho que
estivesse aquém de nossa máxima possibilidade. Prof. Orestes, espero ser para
meus alunos um professor como fostes para mim.

Ao casal, Hilda e Martim Gonçales, pelo comprometimento


conjunto e interesse por essa empreitada. Sr. Martim, Dna. Hilda, saibam que darei
sempre o melhor de mim para que esses conhecimentos adquiridos possam
melhorar, em todos os sentidos, a vida de todas as pessoas que nos são próximas.

Aos colegas de curso, pelo companheirismo e auxílios sempre


prontamente prestados. Vocês têm a verdadeira noção do que seja auxílio mútuo –
guardem isso sempre em seus corações.
v

À CAPES e à Universidade Estadual de Londrina, por terem


investido financeiramente em nossa formação. Num país em que recursos públicos
são muitas vezes drenados sem o correspondente retorno à sociedade, com a Graça
de Deus, não os decepcionarei.

A todos os docentes e funcionários do Departamento de


Engenharia da Construção Civil da Escola Politécnica, que, não somente pelo seu
senso de dever e responsabilidade, mas também por sua amizade e compreensão,
tanto colaboraram para a realização dessa nossa jornada. Espero passar às gerações
futuras a dedicação e alegria que sempre percebi em vocês.

Por fim, de maneira muito especial, à minha esposa, Regina


Soares Gonçalez Petrucci, a quem, se não posso agradecer por tudo, como devo,
agradeço em especial pelo exemplo de paciência e tolerância inesgotáveis. “Xão”,
me esforço a cada dia para aprender a ter sua paciência e compreensão.
vi

SUMÁRIO

1 INTRODUÇÃO ..................................................................................................... 1

2 OBJETIVOS .......................................................................................................... 9

3 O PROCESSO DE PROJETO DOS SISTEMAS HIDRÁULICOS PREDIAIS. 13


3.1. Aplicação de Evidências Empíricas................................................................. 15
3.2. Modelos de Cálculo Fechados e Abertos......................................................... 16

3.2.1. Modelos fechados. ........................................................................................ 17


3.2.2. Modelos Abertos. .......................................................................................... 18
3.3. Modelos de Simulação. .................................................................................... 19

4 APARELHOS ...................................................................................................... 23
4.1. Curvas de Descarga dos Aparelhos.................................................................. 24

4.1.1. Aparelhos de ajustes pré-determinados. ....................................................... 25


4.1.2. Aparelhos de ajuste contínuo. ....................................................................... 26
4.2. Formas de Acionamento de Aparelhos. ........................................................... 27

4.2.1. Aparelhos de operação em presença do usuário: .......................................... 28


4.2.2. Aparelhos de acionamento pelo usuário e parada automática. ..................... 28
4.2.3. Aparelhos de acionamento pelo usuário e parada após ciclo automático..... 29
4.2.4. Aparelhos de acionamento por ação indireta do usuário ou ambiente.......... 29
4.2.5. Aparelhos de acionamento e parada automáticos. ........................................ 30
4.2.6. Aparelhos de operação contínua. .................................................................. 30
4.3. Tempos Característicos de Operação dos Aparelhos ....................................... 31

4.3.1. Aparelhos de operação em presença do usuário. .......................................... 32


4.3.2. Aparelhos de acionamento pelo usuário e parada automática. ..................... 35
4.4. Aparelhos de Acionamento pelo Usuário e Parada após Ciclo Automático.... 37
vii

4.4.1. Aparelhos de acionamento e parada automáticos. ........................................ 43


4.4.2. Aparelhos de operação contínua. .................................................................. 44

5 COMPONENTES DOS SISTEMAS HIDRÁULICOS PREDIAIS ................... 46


5.1. Conceituação.................................................................................................... 47
5.2. Caracterização dos Componentes. ................................................................... 47
5.3. Caracterização Individual de Componente ...................................................... 48
5.4. Subsistema Tomado como Componente. ......................................................... 50

6 SISTEMAS .......................................................................................................... 52
6.1. Grafos............................................................................................................... 52

6.1.1. Casos especiais de grafos.............................................................................. 53


6.2. Representação de Sistemas Prediais de Distribuição de Água Através de
Grafos............................................................................................................... 56
6.3. Representações de Grafos. ............................................................................... 60

6.3.1. Matriz de adjacências.................................................................................... 61


6.3.2. Lista de adjacências. ..................................................................................... 62
6.3.3. Lista de adjacências reorientada. .................................................................. 64
6.4. Representação das Relações............................................................................. 65

6.4.1. Sistematização das relações. ......................................................................... 66


6.5. Sistemas Equivalentes...................................................................................... 72

6.5.1. Técnica da avaliação de características......................................................... 72


6.5.2. Técnica da lei equivalente............................................................................. 73
6.5.3. Componentes equivalentes intermediários. .................................................. 74

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

7.2.1. Preferências dos usuários. ............................................................................. 80


7.2.2. Ações dos usuários........................................................................................ 84
7.3. Diretrizes para a Simulação dos Usuários. ...................................................... 86

7.3.1. Restrição de presença.................................................................................... 86


7.3.2. Restrição de disponibilidade. ........................................................................ 87
7.3.3. Restrição de acesso. ...................................................................................... 87

8 SIMULAÇÃO DO SISTEMA ............................................................................. 89


8.1. Tempo de Simulação. ....................................................................................... 89
8.2. Geração das variáveis aleatórias. ..................................................................... 90

8.2.1. O gerador de números aleatórios .................................................................. 91


8.2.2. Retorno de características para dados tabelados. .......................................... 92
8.2.3. A função de retorno de características para distribuições............................. 96
8.3. Registro de Parâmetros. ................................................................................... 98
8.4. Operação da Simulação.................................................................................... 99

9 SIMULAÇÃO DA POPULAÇÃO .................................................................... 102


9.1. Geração de Distribuições de Características.................................................. 103

9.1.1. Objetos de Dados ........................................................................................ 103


9.2. Ocupação Inicial da Edificação...................................................................... 105
9.3. Dinâmica Populacional. ................................................................................. 114

9.3.1. Óbitos. ......................................................................................................... 114


9.3.2. Nascimentos. ............................................................................................... 115
9.3.3. Entrada e saída de famílias no edifício. ...................................................... 117

10 SIMULAÇÃO DE ACIONAMENTO DOS APARELHOS............................ 124


10.1. Atuação do Usuário sobre o Aparelho. ........................................................ 125

10.1.1. Caracterização do instante de acionamento do aparelho. ......................... 125


ix

10.1.2. Caracterização do tempo de acionamento................................................. 131


10.1.3. Caracterização da vazão de utilização. ..................................................... 134
10.2. Considerações sobre a Escolha da Distribuição........................................... 141
10.3. Simulação dos Ciclos de Operação dos Aparelhos...................................... 143

10.3.1. Aparelhos de operação em presença do usuário: ...................................... 144


10.3.2. Aparelhos de acionamento pelo usuário e parada automática. ................. 144
10.3.3. Aparelhos de acionamento pelo usuário e parada após ciclo automático. 145
10.3.4. Aparelhos de acionamento por ação indireta do usuário ou ambiente...... 145
10.3.5. Aparelhos de acionamento e parada automáticos. .................................... 146
10.3.6. Aparelhos de operação contínua. .............................................................. 147

11 ACESSO DOS USUÁRIOS AOS APARELHOS. .......................................... 148


11.1. Restrições de Utilização de Aparelhos......................................................... 148

11.1.1. Restrições de direito de utilização............................................................. 149


11.1.2. Restrições de acesso por disposição física. ............................................... 150
11.1.3. Uso associado............................................................................................ 152
11.2. Fluxo de Acesso de Usuários aos Aparelhos. .............................................. 153

11.2.1. Geração da necessidade do usuário........................................................... 154


11.2.2. Fila............................................................................................................. 155
11.2.3. Despachante. ............................................................................................. 155
11.3. Outros Aspectos do Acesso a Aparelhos. .................................................... 156

12 APLICAÇÃO................................................................................................... 159
12.1. Análise de resultados ................................................................................... 161

12.1.1. Vazões na saída do Reservatório............................................................... 161


12.1.2. Vazões nos Aparelhos. .............................................................................. 162
12.1.3. Vazão na entrada dos ramais. .................................................................... 165
12.2. Conclusão do Exemplo. ............................................................................... 166
x

13 CONCLUSÃO ................................................................................................. 168

ANEXO A............................................................................................................. 174


A.1. Perdas de Carga............................................................................................. 174

A.1.1. Determinação do fator de atrito (f) para a Fórmula Universal................... 176


A.2. Determinação do Sentido de Fluxo. .............................................................. 188
A.3. Tubos de PVC Soldável ................................................................................ 190
A.4. Joelhos de PVC soldável............................................................................... 191
A.5. Tês. ................................................................................................................ 192
A.5. Entrada de borda por adaptador de PVC soldável longo. ............................. 195
A.6. Torneira de Jardim......................................................................................... 196
A.7. Reservatório Prismático de Base Retangular. ............................................... 197

ANEXO B ............................................................................................................. 198


B.1 Enunciado e Considerações Iniciais. .............................................................. 198
B.2. Encaminhamento da Solução. ....................................................................... 199
B.3 Confirmação dos Resultados.......................................................................... 208
B.4 Considerações sobre o Exemplo..................................................................... 210
B.5 Determinação do Componente Equivalente. .................................................. 210

ANEXO C ............................................................................................................. 212


C.1 Enunciado e Considerações Iniciais. ............................................................. 212
C.2 Encaminhamento da Solução. ........................................................................ 213
C.3 Considerações sobre o Exemplo..................................................................... 225

ANEXO D............................................................................................................. 227


D.1 Enunciado e Considerações Iniciais.............................................................. 227
D.2 Encaminhamento da Solução. ........................................................................ 228
xi

D.3 Resultados Obtidos......................................................................................... 230


D.4 Considerações sobre o Exemplo. ................................................................... 231

ANEXO E ............................................................................................................. 234


E.1 Implementação da Rede de Distribuição. ....................................................... 236

E.1.1. Ramal H1.................................................................................................... 237


E.1.2. Ramal H2.................................................................................................... 240
E.1.3. Colunas AF-1-3-5-7.................................................................................... 243
E.1.4. Colunas AF-2-4-6-8.................................................................................... 247
E.1.5. Barrilete. ..................................................................................................... 251
E.2 Implementação dos Aparelhos........................................................................ 256
E.3 Usuário............................................................................................................ 257

REFERÊNCIAS BIBLIOGRÁFICAS.................................................................. 258

APÊNDICE I...........................................................................................................I-1
I.1 Questionário.......................................................................................................I-1

APÊNDICE II ....................................................................................................... II-1


II.1 Questionário ................................................................................................... II-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

IV.1.2. Implementação .........................................................................................IV-3


IV.2. Implementação dos Exemplos...................................................................IV-11

IV.2.1. Exemplo do Anexo B – rede aberta. ......................................................IV-12


IV.2.2. Exemplo do Anexo C – rede em anel.....................................................IV-18

APÊNDICE V ....................................................................................................... V-1


V.1. Relógio-calendário......................................................................................... V-1
V.2 Rotina Geradora de Distribuições................................................................... V-9
V.3. Componente para Registro de Valores......................................................... V-16
V.4. Demais Bibliotecas Utilizadas..................................................................... V-24

APÊNDICE VI.....................................................................................................VI-1
VI.1. Função Gama (Γ•) ......................................................................................VI-2

APÊNDICE VII ................................................................................................. VII-1


VII.1 Objetos de Dados e Rotinas Auxiliares – Exemplo do Anexo D............. VII-1
VII.2 Implementação para o Exemplo do Anexo D. ....................................... VII-17

APÊNDICE VIII ............................................................................................... VIII-1


xiii

LISTA DE FIGURAS

Fig. 4.1 Curva de descarga para aparelho hipotético, de ajuste pré-determinado,


com 2 estados (operação e parada)............................................................ 26
Fig. 4.2 Campo de curvas de descarga para aparelho hipotético, de ajuste contínuo
pelo usuário. .............................................................................................. 27
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. .................................................................. 32
Fig. 4.4 Duração de uso do lavatório – água quente (ILHA,1991). ....................... 33
Fig. 4.5 Número de usos de água quente por hora – lavatório (ILHA, 1991). ....... 34
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. ................. 42
Fig. 4.7 Curva tempo x vazão para aparelho acionado por temporizador. ............. 44
Fig. 6.1 Representação pictográfica de um grafo .................................................. 52
Fig. 6.2 Representação de uma árvore de raiz em “r”. ........................................... 54
Fig. 6.3. Representação de um grafo em forma de lista, onde “h” corresponde à
cabeça e “f” à cauda. ............................................................................... 55
Fig. 6.4 Exemplo de um sistema predial de distribuição de água........................... 57
Fig. 6.5 Representação em grafo do sistema apresentado na Figura 6.4. ............... 57
Fig. 6.6 Matriz de relação para o sistema apresentado na Figura 6.4.................... 61
Fig. 6.7 Representação do grafo da Figura 6.4 em forma de lista encadeada. ....... 63
Fig. 6.8 Lista de adjacências reorientada para o grafo da Figura 6.5. .................... 65
Fig. 6.9 Grafo para relações hidráulicas do sistema apresentado na Figura 6.4..... 68
Fig. 8.1 Comparativo de distribuições de freqüências (10 000 000 de pontos)...... 93
Fig. 8.2 Comparativo de distribuições de freqüências (1.000 pontos). .................. 95
Fig. 8.3 Comparativo entre população censitária e população gerada. .................. 98
Fig. 9.1 Diagrama relacional para população. ...................................................... 105
xiv

Fig. 9.2 Exemplo de curva de probabilidade para tempo de permanência em imóvel


alugado. ................................................................................................... 122
Fig. 10.1 Número de usos por hora – chuveiro – dias de semana (ILHA, 1991). 126
Fig. 10.2 Número de usos por hora – chuveiro – como números nebulosos........ 127
Fig. 10.3 Curva de densidade de probabilidades (em %) para acionamento de
chuveiros. .............................................................................................. 128
Fig. 10.4 Probabilidades de acionamento do chuveiro – 5 dias – 1 uso por dia... 129
Fig. 10.5 Probabilidades de acionamento do chuveiro. ........................................ 129
Fig. 10.6 Probabilidade de acionamento do chuveiro – 1,5 usos/pessoa.dia........ 130
Fig. 10.7 Duração de uso do chuveiro (ILHA, 1991)........................................... 132
Fig. 10.8 Probabilidades para tempo de acionamento de chuveiro. ..................... 132
Fig. 10.9 Probabilidade de acionamento de chuveiro – histograma. .................... 133
Fig. 10.10 Duração de acionamento para chuveiro – Gama – transladada.......... 133
Fig. 10.11 Probabilidade de acionamento de chuveiro sob distribuição Gama
transladada – histograma. ................................................................... 134
Fig. 10.12 Vazão para chuveiro (ILHA, 1991). .................................................... 136
Fig. 10.13 Vazão do chuveiro como distribuição bi-modal normal...................... 138
Fig. 10.14 Ajuste multimodal para vazão de chuveiro - σ = 1/4 da amplitude de
classe. .................................................................................................. 140
Fig. 10.15 Ajuste multimodal para vazão de chuveiro - σ = 1/2,5 da amplitude de
classe. .................................................................................................. 141
Fig. 11.1 Classes de acesso a aparelhos sanitários quanto ao direito de uso. ....... 150
Fig. 11.2 Diagrama de contenção de aparelhos e usuários no prédio. .................. 151
Fig. 11.3 Núcleo do sistema de requisição e distribuição de aparelhos................ 153
Fig. 12.1 Esquema isométrico dos ramais. ........................................................... 159
Fig. 12.2 Barrilete. ................................................................................................ 160
Fig. 12.3 Colunas de distribuição. ........................................................................ 160
Fig. 12.4 Vazão de saída do reservatório. ............................................................. 162
xv

Fig. 12.5 Vazão em chuveiros............................................................................... 163


Fig. 12.6 Vazão na entrada dos ramais.................................................................. 165
Fig. A.1. Ábaco de Moody (Fonte: FOX e MCDONALD, 1998)........................ 177
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). ............. 179
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). ............. 180
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). ............. 181
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). ............. 182
Fig. A.6 Convenção de sinais para as vazões ou outras grandezas de fluxo. ...... 189
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. .................................................................................................. 192
Fig. B.1 Esquema de Lavatório Coletivo com 5 torneiras................................... 198
Fig. B.2 Grafo de relações para o sistema da Figura B.1 .................................... 202
Fig. B.3 Determinação de pontos e trechos referidos na Tabela B-5.................... 209
Fig. C.1 Esquema da rede de distribuição para os lavatórios coletivos. .............. 212
Fig. C.2 Esquema da rede de distribuição com os componentes equivalentes.... 214
Fig. C.3 Grafo de relações para o sistema da Figura C.2 ..................................... 217
Fig. D.1. Resultado de 8 simulações populacionais. ............................................ 230
Fig. E.1.. Aspecto da tela do programa de aplicação. .......................................... 234
Fig. E.2. Aspecto da tela de população................................................................. 235
Fig. E.5. Ramal H1 - esquema.............................................................................. 237
Fig. E.6 Ramal H2 - esquema............................................................................... 240
Fig. E.7 Colunas AF-1-3-5-7 - esquema............................................................... 244
xvi

Fig. E.8 Colunas AF-2-4-6-8 - esquema. ............................................................ 248


Fig. E.9 Barrilete - esquema. ................................................................................ 252
xvii

LISTA DE TABELAS

TABELA 5.1 - CARACTERIZAÇÃO PARA TUBOS DE PVC DN 25. .............. 49


TABELA 6.1 - LEIS “INTERNAS” APLICÁVEIS AOS COMPONENTES DO
EXEMPLO DA FIGURA 6.4 ........................................................ 68
TABELA 6.2 - SIMBOLOGIA ADOTADA PARA O EXEMPLO. ...................... 69
TABELA 6.3 - DESCRIÇÃO DAS RELAÇÕES. ................................................. 69
TABELA 6.4 - REDUÇÃO E UNIFORMIZAÇÃO DAS VARIÁVEIS ATRAVÉS
DA APLICAÇÃO DO SILOGISMO EXPRESSO NA EQUAÇÃO
6.4................................................................................................... 70
TABELA 7.1 - ESTRUTURA DE BANCO DE DADOS SOBRE
PREFERÊNCIAS DO USUÁRIO ................................................. 81
TABELA 7.2. - RESPOSTAS SUBJETIVAS À EXPOSIÇÃO À ÁGUA, A 37°C,
NO VERÃO. .................................................................................. 83
TABELA 8.1 – PROBABILIDADE DE OCORRÊNCIA DE VALORES EM
FAIXAS ALVO.............................................................................. 92
TABELA 8.2 – VALORES DE BASE PARA A GERAÇÃO DA FIGURA 8.1. .. 94
TABELA 9.1 – PESSOAS RESIDENTES EM DOMICÍLIOS PARTICULARES.
ÁREA URBANA, BRASIL, 1991............................................... 106
TABELA 9.2 – POPULAÇÃO RESIDENTE. ÁREA URBANA, BRASIL, 1996.
...................................................................................................... 107
TABELA 9.3 – ÓBITOS OCORRIDO E REGISTRADOS. BRASIL. 1994........111
TABELA 9.4 - NASCIDOS VIVOS OCORRIDOS E REGISTRADOS - 1994 . 115
TABELA 9.5 - DOMICÍLIOS PARTICULARES PERMANENTES - 1991....... 119
TABELA 10.1 – CLASSES DE VAZÃO OBSERVADAS PARA CHUVEIRO . 139
TABELA A.1. – FORMULAÇÕES PARA PROBLEMAS QUE ENVOLVAM
PERDAS DE CARGAS. ........................................................... 177
xviii

TABELA A.2 – NÚMEROS DE REYNOLDS VERIFICÁVEIS EM SISTEMAS


PREDIAIS. ................................................................................ 186
TABELA A.3. - DESCRIÇÃO DE COMPONENTE PARA TUBOS DE PVC
SOLDÁVEIS ............................................................................. 190
TABELA A.4. - DESCRIÇÃO DE COMPONENTE PARA TUBOS DE PVC
SOLDÁVEIS SIMPLIFICADO PARA REDES RAMIFICADAS.
................................................................................................... 191
TABELA A.5. - DESCRIÇÃO DE COMPONENTE PARA JOELHOS DE PVC
SOLDÁVEIS ............................................................................. 191
TABELA A.6. - DESCRIÇÃO DE COMPONENTE PARA JOELHOS DE PVC
SOLDÁVEIS. SIMPLIFICADO PARA REDES
RAMIFICADAS........................................................................ 192
TABELA A.7 - DETERMINAÇÃO DO MODO DE OPERAÇÃO E LEIS
FUNDAMENTAIS DAS CONEXÕES TIPO “TÊ”. ................ 193
TABELA A.8.a - PERDAS DE CARGA, SEGUNDO A NBR5626, PARA AS
CONEXÕES TIPO “TÊ”. ....................................................... 194
TABELA A.8.b – DIÂMETROS INTERNOS E COMPRIMENTOS
EQUIVALENTES, PARA A APLICAÇÃO DA FÓRMULA
UNIVERSAL PARA AS CONEXÕES TIPO “TÊ”. (k =1,5 x
10-5 m)...................................................................................... 194
TABELA A.9. - DESCRIÇÃO DE COMPONENTE PARA “TÊ” DE PASSAGEM
DIRETA E LATERAL EM PVC SOLDÁVEL......................... 195
TABELA A.10 - DESCRIÇÃO DE COMPONENTE PARA ENTRADA DE
BORDA POR ADAPTADOR EM PVC SOLDÁVEL LONGO.
................................................................................................... 196
TABELA B.1 - VALORES E LEIS PARA OS COMPONENTES DO EXEMPLO.
................................................................................................... 200
xix

TABELA B.2 - DESCRIÇÃO DAS RELAÇÕES ENTRE OS COMPONENTES


DO SISTEMA EXEMPLO, DE ACORDO COM O GRAFO DA
FIGURA B.2.............................................................................. 202
TABELA B.3 - REDUÇÃO DO NÚMERO DE INCÓGNITAS ATRAVÉS DE
SILOGISMO.............................................................................. 203
TABELA B.4 - APROXIMAÇÃO INICIAL. ...................................................... 206
TABELA C.1 - DETERMINAÇÃO DOS COMPONENTES EQUIVALENTES214
TABELA C.2 - VALORES E LEIS PARA OS COMPONENTES DO EXEMPLO.
[Q]=L/s; [H]=kPa......................................................................... 215
TABELA C.3 - DESCRIÇÃO DAS RELAÇÕES ENTRE OS COMPONENTES
DO SISTEMA EXEMPLO, DE ACORDO COM O GRAFO DA
FIGURA C.3 ................................................................................ 217
TABELA C.4 - REDUÇÃO DO NÚMERO DE INCÓGNITAS ATRAVÉS DE
SILOGISMO................................................................................ 219
TABELA C.5 - APROXIMAÇÃO INICIAL. ...................................................... 223
TABELA E.1 – DESCRIÇÃO DE COMPONENTES PARA O RAMAL H-1. .. 238
TABELA E-2 – RELAÇÕES ENTRE COMPONENTES PARA RAMAL H-1. 239
TABELA E.3 – VARIÁVEIS GENÉRICAS. ....................................................... 239
TABELA E.4 – EQUAÇÕES SIMULTÂNEAS PARA RAMAL TIPO H1........ 240
TABELA E.5 – DESCRIÇÃO DE COMPONENTES PARA O RAMAL H-2. .. 241
TABELA E-6 – RELAÇÕES ENTRE COMPONENTES PARA RAMAL H-2. 241
TABELA E.7 – VARIÁVEIS GENÉRICAS. ....................................................... 242
TABELA E.8 – EQUAÇÕES SIMULTÂNEAS PARA RAMAL TIPO H2........ 243
TABELA E.9 – DESCRIÇÃO DE COMPONENTES PARA COLUNA IMPAR.
................................................................................................... 244
TABELA E.10 – RELAÇÕES ENTRE COMPONENTES PARA COLUNA
IMPAR..................................................................................... 245
TABELA E.11 – VARIÁVEIS GENÉRICAS PARA COLUNA IMPAR. .......... 246
xx

TABELA E.12 – EQUAÇÕES SIMULTÂNEAS PARA COLUNA IMPAR. ..... 247


TABELA E.13 – DESCRIÇÃO DE COMPONENTES PARA COLUNA PAR.. 248
TABELA E.14 – RELAÇÕES ENTRE COMPONENTES PARA COLUNA PAR.
................................................................................................... 249
TABELA E.15 – VARIÁVEIS GENÉRICAS PARA COLUNA PAR. ............... 250
TABELA E.16 – EQUAÇÕES SIMULTÂNEAS PARA COLUNA PAR. .......... 251
TABELA E.17 – DESCRIÇÃO DE COMPONENTES PARA O BARRILETE. 252
TABELA E.18 – RELAÇÕES ENTRE COMPONENTES PARA BARRILETE.
................................................................................................. 253
TABELA E.19 – VARIÁVEIS GENÉRICAS PARA O BARRILETE................ 254
TABELA E.20 – EQUAÇÕES SIMULTÂNEAS PARA O BARRILETE. ......... 255
TABELA III.1. – PROPRIEDADES DA VARIÁVEL “ESCOAMENTO”........III-2
TABELA III.2. – PROPRIEDADES DE OBJETOS DO TIPO “TTUBO” ........III-3
TABELA III.3. – PROPRIEDADES DE OBJETOS DO TIPO “TFLUIDO”.....III-3
xxi

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

O presente trabalho propõe uma metodologia para a seleção de configuração de


sistemas prediais de água fria, em edificações que abriguem múltiplas economias.
Essa metodologia opera através do teste e ajuste de possíveis configurações, em
ambiente de simulação computacional. Para tal foi desenvolvida uma ferramenta
para cálculo de redes de distribuição sob vazões reais. Essa ferramenta de cálculo
de redes, juntamente com a caracterização da operação e simulação dos aparelhos
sanitários, compõe o sistema sob análise. Paralelamente, são definidas, através da
geração de variáveis aleatórias que seguem distribuições estatísticas, preferências
e comportamentos dos usuários. Os hábitos de usuários, especialmente quanto à
forma de acionamento e preferências de ajustes sobre os aparelhos sanitários,
quando simulados, servem como “carga” à rede de distribuição, permitindo simular
a operação do sistema como um todo. Pelo registro dos parâmetros de interesse,
que posteriormente são comparados a padrões de desempenho, podem ser
detectadas situações de não conformidade. Submetendo-se diversas hipóteses de
configuração a tal procedimento, é possível selecionar aquela que melhor se ajuste
aos critérios de desempenho propostos. Através do mesmo processo, a
configuração selecionada pode ter seus pontos de alavancagem localizados e seu
desempenho afinado, de forma a otimizar o sistema.
xxiv

ABSTRACT

This work proposes a methodology to water building systems configuration


selection process, in buildings with multiple units. This methodology works by test
and tuning of possible configurations, in a computational simulated environment.
To this aim, a tool was developed, to afford the calculus of network under a real
flow approach. This tool, when joined with the operational characteristics of
appliances, constitutes the system under analyses. In a parallel way, the users habit
and preferences are achieved by random generation of values following a given
statistical distribution. The users' habits, in a special manner about the kind of
action and preferences over appliances, are the load to the water distribution
network. So, the system operation is simulated at all. By recording parameters for
later comparison with performance standards one can find no-conformity points.
By doing this procedure with many possibilities of configuration and size of
system, one can choose the configuration that has the best match with the
performance standards. By the same process, the selected configuration can have
the “hot spots” located. By action over these points, the selected configuration can
be tuned, searching for the best performance.
1 INTRODUÇÃO

Um projeto de Engenharia é, basicamente, o agrupamento


concatenado e coerente de diversos elementos que, unidos, descrevem um sistema
com funções e características determinadas.

Assim, o que um projeto de Engenharia transmite são idéias,


conceitos e definições.

A definição mais importante a ser tomada no âmbito de um


projeto de sistema predial de distribuição de água, assim como em qualquer
projeto, é, sem dúvida, quanto à concepção de sua configuração.

Especificamente no que diz respeito aos sistemas prediais de


distribuição de água em edificações que abriguem múltiplas economias, objeto
desse estudo, várias definições conceituais e posturas se fazem transparentes na
escolha das configurações a serem utilizadas, em cada subsistema componente
desse sistema de distribuição de água.

Desse modo, fica claro que a opção por determinada


configuração, de cada subsistema, acarreta conseqüências específicas no sentido de
termos um sistema mais próximo ou mais distante de determinado objetivo.

Dada a importância da definição da configuração a ser adotada,


essa etapa merece tratamento especial, tanto nas fases iniciais do projeto, onde via
de regra são tomadas as decisões globais e criadas as configurações gerais, como
nos diversos níveis de detalhes, tendo em vista objetivos gerais e específicos
2

previamente definidos dentro da concepção do empreendimento.

Tem-se ainda como claro o fato de que não há decisão ou


orientação técnica de configuração universalmente aceitável, apesar da existência
de diversas configurações tidas como tradicionais ou comuns, tanto na literatura
técnica como na normalização nacional ou internacional. Tal fato ocorre uma vez
que, as necessidades e expectativas dos usuários envolvidos sempre diferem entre
empreendimentos, sendo que essa diferenciação deveria levar a configurações
diferentes, com grau de similaridade menor ou maior entre si, à medida da
similaridade de exigências e expectativas dos citados usuários, ou seja, o
desempenho que determinado usuário necessita ou espera de um sistema.

WYLY e GALOWIN (1976) apud GRAÇA e GONÇALVES


(1986) nos traz o seguinte conceito de desempenho:

“o conceito de desempenho centraliza-se na idéia de que


produtos, dispositivos, sistemas ou serviços podem ser descritos e
que seus desempenhos podem ser medidos em termos das
exigências dos usuários, desconsiderando-se combinações
particulares de características físicas e químicas, de seus projetos
ou métodos de criação. A chave para o desenvolvimento de
padrões de desempenho é a identificação de critérios
significativos que caracterizem o desempenho esperado e a
subsequente geração de metodologias para medir como esses
produtos, processos e sistemas aderem aos critérios”(grifo
nosso).

Diante dessa definição e com base no exposto por GRAÇA e


3

GONÇALVES (1986), pode-se propor que a abordagem de sistemas,


especialmente na fase de projeto e concepção, através desse conceito de
desempenho, consiste em:

a) identificar os usuários do sistema;


b) caracterizar esses usuários do sistema;
c) definir suas necessidades, exigências e expectativas
hierarquizando-as segundo objetivos decorrentes das
características identificadas;
d) identificar as condições de exposição a que está submetido o
sistema, assim como sua influência e interação com o sistema
maior em que se encontra inserido e o meio considerado;
e) definir os critérios de desempenho do sistema, quantificando
as necessidades dos usuários;
f) prever, através de ferramentas de cálculo e simulações
adequadas, para cada configuração estudada ou cogitada, a
amplitude de satisfação aos critérios de desempenho adotados;
g) estabelecer os métodos para a avaliação do desempenho do
sistema;

Mesmo conhecida a seqüência acima, os sistemas de distribuição


de água em edificações que abrigam múltiplas economias são projetados, com
freqüência, sem a consideração de múltiplas alternativas, no que se refere à
resposta que cada qual teria no sentido de atender aos critérios de desempenho
propostos e, através desses, às necessidades e expectativas dos usuários, fato esse
já ressaltado por IOSHIMOTO (1990) para os sistemas prediais de gás
combustível.
4

É fato conhecido que, quando muito, devido a uma série de


fatores, há análise de um número limitado de alternativas, sendo ainda que, por
vezes, tais alternativas são analisadas sob único e exclusivo critério de se obter um
menor custo direto de execução do sistema entre aquelas que atendam a
determinada prescrição técnica aceita1.1.

Já observado de maneira semelhante por GRAÇA e


GONÇALVES (1987a) para os sistemas prediais de coleta de esgotos sanitários,
essa dificuldade encontrada pelos projetistas para a análise exaustiva de
alternativas tidas como “convencionais”, assim como para o exercício da
criatividade em busca de alternativas novas ou inovadoras, que por sua própria
característica traz a necessidade de análises mais apuradas, acaba conduzindo à
aceitação quase simples e imediata de configurações tradicionais e levando os
usuários à aceitação das limitações inerentes a tais configurações como inevitáveis
ou como “conseqüências de leis físicas ou econômicas irrevogáveis”, o que, de
fato, não são.

Diante desse quadro, ao se propor uma metodologia capaz de


contribuir para a escolha de uma configuração do sistema predial de distribuição de
água, para as edificações sob análise, é necessário, conhecer dos usuários dessa
metodologia1.2, os requisitos mínimos indispensáveis para que possa ser utilizada
na prática de projetos hidráulico-sanitários, com ganhos para os usuários
envolvidos, motivando-os a “maneiras mais adequadas de projetar através da
utilização de procedimentos racionais que possam, efetivamente, conduzir a
resultados mais adequados” (GRAÇA e GONÇALVES 1987a).

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

No intuito de verificar se experiências pessoais anteriores, na


elaboração de projetos de Engenharia de Sistemas Prediais, são compartilhadas por
outros profissionais e como uma tentativa de caracterizar, ainda que de forma
expedita, os anseios e dificuldades que os profissionais dessas áreas teriam, em
relação à utilização de uma metodologia que pudesse auxiliar nas decisões
conceituais e de configuração das redes de distribuição de água sob estudo,
procedeu-se a aplicação de um pequeno questionário entre alguns projetistas e
consultores da área (Apêndice I).

A observação das respostas obtidas, com a aplicação desse


questionário, nos permite, entre outras características, detectar, como pontos
predominantes na visão atual dos profissionais projetistas:

• as características principais das configurações dos sistemas


prediais são definidas pelos contratantes, com maior ou menor
influência do projetista;

• os contratantes de projetos são fortemente influenciados pelos


produtores e vendedores de componentes, e bastante presos às
soluções ditas “tradicionais”;

• as maiores preocupações, quanto a custos, fixam-se naqueles


que incidem diretamente sobre a implantação e manutenção.
Já os custos com consumo de água e energia são
preocupações menores quando comparados a esses;

• os contratantes querem os menores gastos iniciais possíveis


(projetos e execução de baixo custo) com desempenho que
6

lhes dê os menores gastos e desgastes possíveis durante a vida


útil da edificação (desempenho ótimo e baixa manutenção);

• novas tecnologias vêm das mais diversas fontes mas devem


superar um forte crivo de tradicionalismo, de forma até a se
tornarem tradicionais, através da experiência alheia, antes de
serem aceitas; sofrem uma espécie de estase coletiva no
aguardo de que alguém dê o primeiro passo;

• as ferramentas ou metodologias que permitam prever ou


apresentar comparativamente as características de diversas
configurações de sistema podem apresentar seus dados de
forma técnica, sem grande preocupação em ser coloquial mas,
devem apresentar, basicamente, rapidez na execução do
estudo, precisão de resultados e baixo custo de operação;

• a existência de uma metodologia desse tipo agregaria valor ao


projeto de sistemas prediais e ao produto final.

Para verificar se as assertivas acima encontravam respaldo, e


como ocorria esse respaldo, junto às empresas construtoras e incorporadoras,
procedeu-se, ainda de forma expedita, uma série de perguntas sobre o assunto junto
a um grupo representativo dessas empresas (Apêndice II).

Dessa tomada de impressões, pode-se observar, além da


confirmação, em essência, das assertivas acima:

• os clientes dos empreendedores, ou seja, os consumidores,


7

apresentam preocupações com economia de água e energia;

• sistemas de baixo consumo de água e energia têm apelo de venda.

Para ir ao encontro dos pontos abordados, e dos desejos de


mercado, devemos dispor de uma metodologia, ou um conjunto de métodos e
procedimento práticos, que permitam:

a) prever a operação hidráulica e energética do sistema da maneira


mais precisa possível, devendo ainda ter a capacidade de se ajustar a novas
tecnologias, como novos componentes, assim como a uma gama variada de formas
de solicitação por parte dos usuários;

b) avaliar o consumo de água e energia do sistema ao longo de sua


utilização;

c) avaliar a distribuição de custos do sistema ao longo de seu ciclo


de vida;

Com objetivo de apresentar uma metodologia nesse sentido, o


presente trabalho traz primeiramente uma proposta de modelo genérico para
caracterização dos sistemas de distribuição de água e seus componentes, seguido
de uma metodologia que, a partir de tais características, permite a avaliação e
projeção de como o sistema irá se comportar perante as exigências hidráulicas,
apresentadas pelo usuário, segundo as várias condições de exposição a que deverá
ser submetido ao longo de sua vida útil, permitindo uma avaliação da amplitude de
satisfação a critérios de desempenho que tenham sido adotados.
8

Desse modo, é de fundamental importância o conhecimento


apurado dos componentes e subsistemas que compõem o sistema de distribuição de
água, assim como das leis físicas que regem a interação desses entre si e com o
sistema maior tomado como ambiente.
9

2 OBJETIVOS

O desenvolvimento desse trabalho tem como premissa o


conhecimento prévio do comportamento de um sistema, segundo cada hipótese
cogitada de configuração, como forma mais adequada de subsidiar a opção por
uma destas.

Assim, a tese que motivou o desenvolvimento desta pesquisa é:

A utilização de técnicas de modelagem que permitam a simulação


da operação real de sistemas prediais de distribuição de água, permitirá o
conhecimento prévio do comportamento do sistema sob a ação do usuário, assim
como do comportamento apresentado pelo usuário diante do sistema.

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.

Pretende-se, portanto, alcançar os seguintes objetivos:

a) estudar os tipos mais comuns de aparelhos de consumo de


água, segundo sua forma de interação com o usuário e com a rede de distribuição
que os interliga, a fim de determinar quais características devem ser consideradas
nos mecanismos de simulação de seu uso;
10

b) estudar a distribuição dos aparelhos sanitários, segundo sua


disponibilidade, no tempo e espaço, à ação do usuário, a fim de propor regras de
correlação e dependência entre os mesmos, quanto à sua utilização;

c) propor as principais características que se deva conhecer a


respeito dos usuários e seus hábitos, a fim de estabelecer os padrões prováveis de
ação desses sobre o sistema;

d) apontar mecanismos que permitam avaliar a reação do sistema


frente à ação do usuário, e destas perante aquela, prevendo-se o processo de
realimentação a se formar nesse ciclo constituído por: ação do usuário - resposta
do sistema - nova ação do usuário, com vistas a determinar o grau de dificuldade
apresentado na busca do equilíbrio em torno dos padrões de desempenho aceitos ou
tolerados pelo usuário;

e) propor uma metodologia geral, sempre utilizando modelos


abertos ou de simulação, que permita, através da consecução do objetivo (d) acima
juntamente com análises de custo e construtivas, a opção pela configuração que
venha, da melhor forma, ao encontro das necessidades e interesses manifestados na
concepção do sistema, em sucessivas tentativas de otimização do mesmo.

Assim, espera-se, contribuir para a Engenharia de Sistemas


Prediais, com um enfoque metodológico sistêmico, que permita opções mais
seguras, através de um maior conhecimento da operação do sistema, se ainda em
fase de concepção essa operação puder ser simulada e avaliada, de maneira a
orientar ajustes finos, ou mesmo mudanças radicais, quanto à utilização de
determinada topologia de rede, dimensionamento, materiais ou técnicas
construtivas, permitindo uma melhor avaliação comparativa de diversas hipóteses
11

possíveis pela variação dessas características.

Essa abordagem poderá, então, proporcionar um elevado grau de


conformidade às necessidades do empreendedor, do usuário final, de posições
normativas e do meio ambiente, através da capacidade de permitir o
reconhecimento mais preciso de estreitos graus de compromisso entre essas
necessidades, que, por fim, definem a qualidade do produto sob a ótica de cada um
dos agentes citados.

Ao ser iniciada a leitura do presente deve-se ter em mente que o


mesmo se encontra estruturado segundo três níveis: nível conceitual (apresentado
nos capítulos), exemplos (nos anexos) e detalhes de implementação (nos
apêndices).

No Capítulo 3, é apresentada uma série de considerações sobre a


metodologia aqui proposta, passando-se à caracterização dos componentes
(Capítulo 4) e sistemas (Capítulo 5), com métodos de avaliação das redes operando
com vazões reais.

No Capítulo 6 é abordada a questão da interface usuário-sistema,


representada pelos aparelhos. Nesse Capítulo os aparelhos têm suas características
estudadas e estabelecidas.

No Capítulo 7 apresenta-se a caracterização do usuário e uma


introdução de diretrizes para a simulação de seu comportamento.

Na seqüência, Capítulos 8, 9 e 10, há a proposta dos mecanismos


de simulação para sistema, população e aparelhos.
12

Nos Capítulos 11 e 12, juntamente com os anexos e apêndices


correlatos, apresenta-se de forma detalhada um exemplo de simulação de sistema
de distribuição predial de água fria, a partir do qual é indicado o processo de
conhecimento e ajuste desses sistemas prediais pela metodologia aqui proposta.

Encerra-se o presente no Capítulo 13, com algumas conclusões,


considerações finais e sugestões para futuros trabalhos.
13

3 O PROCESSO DE PROJETO DOS SISTEMAS HIDRÁULICOS


PREDIAIS

O processo tradicional de projeto, utilizado para os sistemas


hidráulicos prediais, e portanto, para a rede de distribuição de água em edificações,
consiste basicamente nos seguintes passos:

a) posicionamento dos pontos de consumo (aparelhos) aos quais


os usuários terão acesso;

b) posicionamento das fontes de suprimento de água


(reservatórios);

c) definição e traçado de tubulações e demais órgãos acessórios


que conduzem a água desde as fontes de suprimento até os
aparelhos consumidores;

d) determinação das vazões máximas prováveis em cada trecho da


tubulação;

e) determinação dos diâmetros de cada trecho, a fim de


proporcionar a vazão necessária a cada aparelho, sob critérios
de limitação de velocidades ou perdas de carga;
14

f) verificação de cargas dinâmicas ou pressões3.1 nos pontos de


utilização e em outros pontos de interesse a fim de evitar
valores demasiadamente baixos ou altos;

Feito isso, e após as fases de detalhamentos construtivo, o sistema


é executado e posto em uso.

Dentre as fases acima descritas, aquela apontada no item “d”


assume grande importância, uma vez que, de sua resposta, depende diretamente o
resultado final da rede de distribuição em termos de custos diretos, diâmetros e
segurança de operação.

De forma não excludente quanto a outros aspectos mas com forte


ênfase no dimensionamento das partes constituintes, os projetos de sistemas
hidráulicos prediais, em sua evolução histórica, podem ser agrupados sob 4 fases:

a) aplicação de evidências empíricas;


b) modelos fechados;
c) modelos abertos;
d) modelos de simulação.

Esses 4 grupos, não têm, entre si, fronteiras estanques, mas se


mostram úteis para a caracterização principal de diversos modelos.

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.1. Aplicação de Evidências Empíricas.

Aqui se refere a evidências empíricas como sendo o


comportamento de fenômenos, aplicáveis a projetos de Engenharia, observados no
mundo real, sejam esses frutos da Natureza ou do engenho humano.

Nessas observações é possível verificar o que não funciona, o que


funciona e como funciona. Esse critério milenar de aceitação, liga-se, desde os
primórdios, aos critérios de desempenho e necessidades de usuários., mesmo que, à
época, de forma inconsciente ou não sistematizada.

A partir dessas observações, os sistemas são criados de forma a


replicar ou extrapolar as condições que foram observadas nos modelos de
desempenho satisfatório.

Mesmo sendo adequada, no que se refere à previsibilidade de


resultados, quando se utiliza a simples replicação de sistemas já conhecidos e
“aprovados”, essa técnica de abordagem traz dificuldades quando se deve
extrapolar conclusões para sistemas muito diferentes daqueles já conhecidos. Esse
fato se verifica uma vez que, para representar as variações de solicitação dos
sistemas e suas características físicas finais, poucas são as relações lineares ou
mesmo representáveis por uma curva simples.

É, até os dias atuais, uma técnica muito utilizada, nos sistemas


hidráulicos prediais, para a construção de pequenas edificações, edificações
provisórias e similares, apresentando bons resultados quando as exigências de
desempenho e custos do sistema se mantém dentro de patamares bastante modestos
16

e, os sistemas, por tal motivo, não fogem dos modelos já exaustivamente


observados.

3.2. Modelos de Cálculo Fechados3.2 e Abertos.

Inicialmente deve-se observar que os modelos de cálculo para


sistemas de distribuição de água em edificações, pertencem a dois grandes grupos
de trabalhos científicos:

a) aqueles de cunho físico;


b) aqueles ligados às determinações das necessidades dos
usuários;

Os primeiros, quando pertencentes ao âmbito da Mecânica dos


Fluídos e da Hidráulica, visam descrever as características do escoamento nos
tubos. Se pertencentes à Economia, descrevem custos, juros, taxas de retorno e
similares. Se à Mecânica das Estruturas, descrevem resistências físicas ou
deformações. E assim sucessivamente.

Já o segundo grupo de trabalhos busca respostas no sentido de,


dado um conjunto de usuários, aparelhos, ou outros parâmetros representativos,
fornecer os parâmetros físicos necessários para que se possa, a partir destes,
utilizando as leis físicas disponíveis, dimensionar os componentes dos sistemas
hidráulicos prediais de forma a satisfazê-los.

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

Dada a importância, e dificuldade, desse problema, muitos


pesquisadores, especialmente no século XX, se ocuparam do mesmo, através de
métodos empíricos ou probabilísticos, sempre ligados, de fato, à resposta da
pergunta formulada no item “d” acima, ou seja: quais as vazões máximas prováveis
em cada trecho da tubulação?”.

Um resumo conciso mas esclarecedor dos principais métodos para


tal finalidade pode ser encontrado em GRAÇA e GONÇALVES (1987b).

Os trabalhos nesse sentido podem, de uma maneira genérica, ser


classificados em dois grandes grupos: modelos fechados e modelos abertos.

3.2.1. Modelos fechados.

Os primeiros modelos visando a busca de tal resposta, surgem no


início do século XX, por pesquisadores como Timmis (1922), Dawson e Kalinske
(1932) ou ainda, mais tarde, Hunter (1940) ou Gallizio (1944) assim como diversos
outros métodos, apresentados por pesquisadores e textos normativos, cf. GRAÇA e
GONÇALVES (1987b).

Ainda segundo a mesma fonte bibliográfica, em que pese


existirem diversos métodos para tal abordagem, “não há, no entanto, o consenso
com relação a uma metodologia geral que possa atender de forma satisfatória às
necessidades dos projetistas de instalações hidráulicas prediais.”

A seguir, GRAÇA e GONÇALVES (1987b), pondera sobre a


fragilidade desses modelos teóricos, ou ainda, a insuficiência de dados de campo
18

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.

Nesse grupo de modelos, aqui denominados “fechados”, se


incluem aqueles que, mesmo tendo alguns parâmetros variáveis, utiliza ao menos
um destes de forma fixa, implícita e muitas vezes de tal forma encadeado no
modelo que não há como alterá-lo, a não ser pela reconstrução do método. Um
exemplo típico desse grupo de métodos é aquele apresentado na NBR 5626/98
(ABNT, 1998) que trata de forma idêntica cada aparelho, seja o mesmo equipado
com qualquer tipo de metal sanitário ou ligado a qualquer ponto do sistema de
distribuição, independente da disponibilidade física, temporal ou espacial do
mesmo, assim como da carga dinâmica ali disponível.

3.2.2. Modelos Abertos.

Os modelos abertos, surgidos principalmente durante as últimas


décadas, têm como característica principal o fato de permitirem a caracterização do
comportamento do sistema, sendo um modelo de caráter geral, no que diz respeito
ao relacionamento das variáveis intervenientes, mantendo, no entanto,
especificidades que permitam representar as características particulares de cada
situação de projeto (GONÇALVES, 1986).

Esses modelos, então, permitem que se contemple, à medida do


necessário, características como: tipo de edificação, tipo de aparelho, hábitos de
19

usuários e outras características, geralmente de forma condensada em variáveis


independentes como: tempo de duração de acionamento, intervalo entre
acionamentos, vazão característica dos aparelhos, número de acionamentos em
período de pico e outras.

3.3. Modelos de Simulação.

Os modelos acima apresentados, mesmo os mais elaborados,


permitem a determinação de vazões máximas prováveis nos trechos das
tubulações, e seu conseqüente dimensionamento a essas, através do conhecimento
de Hidráulica disponível.

No entanto, se essa técnica segue seu curso tal como proposto,


não existe como “afinar” as determinações obtidas, pois não há maneira econômica
e viável de monitorar a operação do sistema, não havendo ainda como aplicar,
àquele sistema especificamente, o resultado desse monitoramento.

Mesmo no caso, bastante raro, em que se poderia ter outros


edifícios absolutamente idênticos, não há maneira prática e econômica de
instrumentar o primeiro edifício, que serviria de protótipo, a fim de detectar-se
problemas de sub-dimensionamento ou super-dimensionamento; ainda que isso
fosse feito, não seria viável a alteração de trecho ou conjunto de aparelhos dado
como problemático, e a realização de novas medições para a avaliação do
resultado, voltando-se ao anterior, caso não houvesse nenhum tipo de ganho.

Tendo, sob hipótese bastante improvável, todo esse procedimento


20

como possível, um levantamento de medições com duração de 1 (um) ano, tomaria,


de fato, 1 (um) ano, tornando o tempo de “feedback” muito longo.

Diante do exposto, como um aperfeiçoamento às técnicas


tradicionais de projeto de sistemas de distribuição de água em edifícios, este
trabalho propõe que, após os passos de projeto acima apontados, o sistema seja
“construído”, em ambiente de simulação computacional, e exposto à “utilização”,
tendo todos os parâmetros de interesse determinados, registrados e avaliados,
permitindo ajustes finos no dimensionamento, em sucessivas reconstruções e
avaliações, até que se tenha um resultado satisfatório.

Para que se prossiga com tal abordagem, segundo a qual, através


de simulação computacional, o sistema é montado e posto em operação, criando-se
registros sobre cada parâmetro desejado, que, posteriormente, possam ser
comparados a padrões de desempenho, de satisfação ou insatisfação, e ainda
proceder tais registros por tempos de utilização, simulados, bastante longos, uma
vez que, no ambiente de simulação, é possível acelerar o passar do tempo, é
necessário um conhecimento tão apurado quanto possível sobre dois
comportamentos básicos: o do sistema, e o do usuário, além de que, merece
especial atenção, a maneira segundo a qual ocorre a influência mútua entre eles.

Para que tal processo de simulação se viabilize, além de um


eficiente método para cálculo de redes com vazões reais, seria necessário obter-se,
da melhor maneira possível, a determinação de quais aparelhos3.3, e em que grau,
poderiam ou não estar operando em um dado momento, o que é uma tarefa
bastante complexa.

3.3
Nesse trabalho, o termo “aparelho” é utilizado segundo o contexto explanado no
Capítulo 4.
21

Para se conseguir tal intento, com sucesso aceitável, é necessário


o conhecimento de, no mínimo, os seguintes pontos:

a) quais os padrões de comportamento do usuário e como este


interage com o sistema. Essa informação permite criar a
simulação do comportamento das pessoas no uso do sistema;

b) quais as características e regras através das quais os aparelhos


traduzem ao sistema uma ação do usuário. Essa informação
permite simular corretamente as novas condições de operação
do sistema, a cada ação do usuário;

c) como o sistema responde e se ajusta a uma alteração sofrida


em algum dos aparelhos. Esse conhecimento permite simular a
resposta do sistema, em termos de carga hidráulica e vazões
resultantes nos aparelhos, sob cada ação do usuário;

d) como o aparelho traduz para o usuário uma nova condição, ou


novo estado, apresentado pelo sistema;

e) e, por fim, fechando o ciclo de “feedback”, como o usuário


reage a esse novo estímulo;

Também se faz necessário a determinação de quais grandezas se


deseja acompanhar, e portanto registrar, nesse ciclo de vida simulado do sistema.
As grandezas mais indicadas para registro e monitoração são:
22

a) vazão nos aparelhos, em especial quando na presença do


usuário;

b) vazão e velocidade em cada trecho da tubulação;

c) altura de carga dinâmica em cada ponto de interesse;

d) atitudes tomadas pelo usuário frente a alterações do sistema,


refletidas a esses pelos aparelhos em uso;

e) consumo de água em cada momento de operação do sistema;

A comparação desses registros com padrões de desempenho ou


aceitabilidade, assim como o levantamento do número, freqüência e intensidade
das não conformidades com tais padrões, permitiriam, então, a localização dos
pontos de alavancagem, facilitando o ajuste do sistema, pela alteração de
diâmetros, traçados, tipos de aparelhos, por exemplo, ou outra característica,
conforme se mostrem as solicitações de cada trecho e cada aparelho.
23

4 APARELHOS

No presente trabalho, o termo aparelho sanitário (ou somente


aparelho) é utilizado para designar qualquer tipo de objeto componente do sistema
hidráulico predial que, sofrendo o acesso do usuário, altera, por conseqüência de
tal ação, parâmetros hidráulicos da rede de distribuição. Ou seja, é tratado com tal
designação, todo o objeto que sirva de interface entre o usuário e a rede de
distribuição de água da edificação.

Estabelecida tal premissa, pode-se afirmar que o acesso do


usuário ao recurso proporcionado pelo sistema, a água, no caso dos sistemas de
distribuição de água em edifícios, se faz sempre através de aparelhos sanitários.

Por esse motivo, o estudo dos aparelhos sanitários, quanto a suas


propriedades de interface, torna-se primordial, para o conhecimento da interação
usuário-sistema.

As propriedades de interface de um aparelho constituem-se nas


leis e regras que os mesmo segue, para estabelecer o elo entre o usuário e o sistema
como um todo, “traduzindo” a ação do usuário em mudança de estado para o
sistema e vice-versa. Como exemplo dessas regras temos: a curva pressão x vazão
dos aparelhos, existência e modo de atuação de automatismos e outras.

Além das propriedades de interface inerentes ao aparelho, há de se


observar a necessidade de estabelecimento das propriedades que regem a relação
usuário-aparelho, como por exemplo: presença de usuários, restrições de acesso,
forma de utilização, tempos de utilização, posicionamento relativo no ambiente de
24

“domínio” do usuário e outras, que serão tratadas nos capítulos subseqüentes,


especialmente Capítulos 7 e 11.

4.1. Curvas de Descarga dos Aparelhos.

Todo aparelho hidráulico tem a vazão em sua saída associada à


aplicação de carga hidráulica em sua entrada, de tal forma que se pode escrever:

Qs = f ( H e , C d ) (4.1)

onde Qs - vazão fornecida pelo aparelho;


He - altura de carga hidráulica na entrada;
Cd - coeficiente de descarga;

Para muitos desses aparelhos, a função proposta na equação 4.1


assume a forma apresentada em 4.2.

Qs = C d ⋅ H e α (4.2)

onde: Qs - vazão de saída do aparelho;


Cd - coeficiente de descarga;
He - altura de carga hidráulica na entrada do aparelho;
α - expoente (geralmente entre 0 e 1);

Em que pese a trivialidade, da equação 4.2, há que se considerar


que, com o intuito de permitir que o usuário varie a vazão segundo seu desejo ou
necessidade, a maior parte dos aparelhos sanitários disponíveis permite ao mesmo
25

a efetivação de ajustes de vazão.

De fato, esse ajuste se dá pela alteração dos parâmetros da


equação 4.2 que sejam característicos do aparelho (Cd e α), em especial o
coeficiente de descarga. A forma comum de se proceder tal ajuste é a atuação do
usuário sobre o volante da torneira, registro, misturador ou outro.

Quanto à capacidade de permitir ajustes de vazão pelo usuário, os


aparelhos podem ser classificados em dois grupos:

a) aparelhos de ajustes pré-determinados;


b) aparelhos de ajuste contínuo.

4.1.1. Aparelhos de ajustes pré-determinados.

Nesse tipo de aparelho, o usuário deve escolher um estado dentre


um número finito de estados possíveis. Esses aparelhos podem, então, ser ajustados
pela escolha de um determinado “Cd” a partir de um conjunto determinado de
possíveis valores.

Essa prática corresponde então à escolha de uma das curvas de


descarga, dentre o conjunto de curvas oferecidas.

Exemplos típico desse modo de atuar são as torneira e


misturadores com pastilha cerâmica e operação em 1/4 de volta, as torneiras
eletrônicas acionadas por solenóide e outros similares que apresentam somente 2
estados: parado (Cd=0) e operação (Cd>0).
26

Na Figura 4.1 pode ser vista uma curva de descarga hipotética


para um aparelho de ajuste pré-determinado, ou seja, caso o mesmo esteja
operando, o faz através da curva do gráfico, caso não, apresenta vazão nula (Q=0)
para qualquer valor de altura de carga na entrada.

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.1 Curva de descarga para aparelho hipotético, de ajuste pré-determinado,


com 2 estados (operação e parada).

4.1.2. Aparelhos de ajuste contínuo.

Nesse tipo de aparelho, o usuário pode variar continuamente o


valor do coeficiente de descarga (Cd), atuando no aparelho, desde a parada de
operação (Cd=0), até a máxima vazão disponível (Cd=Cdmáx).

A Figura 4.2 apresenta uma “família” de curvas de descarga


correspondentes a um aparelho, também hipotético, que permite ajuste contínuo.

De fato, essa “família” de curvas é constituída por infinitas curvas


que formam um “continum”; na Figura 4.2 estão apenas ressaltadas algumas delas
a fim de facilitar o entendimento, mas o usuário pode posicionar o aparelho em
qualquer uma das infinitas curvas contidas entre a parada e a curva de máxima
vazão.
27

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.2. Formas de Acionamento de Aparelhos.

Quanto à forma pela qual os usuários acionam os aparelhos 4.1, em


termos temporais, e supondo-se uma utilização racional dos mesmos, pode-se
propor a classificação dos aparelhos nos seguintes grupos:

a) aparelhos de operação em presença do usuário;


b) aparelhos de acionamento pelo usuário e parada automática;
c) aparelhos de acionamento pelo usuário e parada após ciclo
automático;
d) aparelhos de acionamento por ação indireta do usuário ou
ambiente;
e) aparelhos de acionamento e parada automáticos;
f) aparelhos de operação contínua.

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

4.2.1. Aparelhos de operação em presença do usuário:

São os aparelhos que operam somente com, e durante, a presença


do usuário, ou seja, iniciam sua operação por ação direta do usuário, este fica
presente e “vinculado” ao aparelho até o final da utilização, que ocorre por nova
ação direta do usuário.

Exemplos comuns dessa classe de aparelhos são: lavatórios, pias


de cozinha, chuveiros, duchas, bebedouros, ducha higiênica, bidês, mictórios com
detetores de presença, torneiras de jardim e de lavagem operando mangueiras ou
bombas de pressão.

4.2.2. Aparelhos de acionamento pelo usuário e parada automática.

São aqueles que dependem da presença do usuário para que


entrem em operação, mas encerram essa operação por meio de algum tipo de
controle físico automático, desencadeando sua ação de parada somente quando
algum parâmetro interno ao aparelho, como volume, tempo ou outro é atingido.

Exemplos dessa classe de aparelho são: bacia sanitária com


válvula de descarga (tem parada vinculada ao preenchimento interno de uma de
suas câmaras), bacia sanitária com caixa acoplada (tem parada vinculada à
reposição do volume da caixa), banheira e torneira de jardim ou lavagem geral
operando pelo preenchimento de baldes (têm parada vinculada ao preenchimento
29

do volume desejado4.2).

4.2.3. Aparelhos de acionamento pelo usuário e parada após ciclo automático.

São os aparelhos que operam seguindo ciclos automáticos, tendo,


no entanto, seu início determinado pela ação do usuário.

Diferenciam-se daqueles de “acionamento pelo usuário e parada


automática” pelo fato de que não realizam uma simples parada, mas seqüências de
paradas e acionamentos, ditadas por parâmetros como: programação prévia,
volumes, tempos ou temperaturas.

São exemplos típicos dessa categoria: lavadoras automáticas de


roupas (algumas com várias opções de ciclo, com diferentes relações entre tempos
e volumes, a serem programadas), lavadoras de pratos (com ciclos comandados por
temperatura e volume).

4.2.4. Aparelhos de acionamento por ação indireta do usuário ou ambiente.

São os aparelhos que têm sua operação comandada pela alteração


de alguma grandeza física que é monitorada pelo mesmo. De fato, essa grandeza
física depende também, mas não somente, do usuário.

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

Um exemplo característico dessa classe de aparelhos é o mictório


acionado por sensor de pH, onde a condição de acionamento depende,
basicamente, de sua efetiva utilização, pelo usuário, mas a parada depende do
volume de água adicionado, e seu poder de neutralização, ocorrendo pela elevação
do pH medido pelo aparelho. Também podem ser assim classificados os sistemas
de irrigação de jardins que operam pela avaliação das condições de umidade do
solo.

4.2.5. Aparelhos de acionamento e parada automáticos.

Nessa categoria se encontram os aparelhos sanitários que não


dependem do usuário para sua operação e não operam com base em grandezas
afetáveis pelo mesmo ou pelo ambiente, às vezes até utilizam a intervenção de
operadores humanos, mas estes somente desempenhando papel que poderia ser
delegado a controladores automáticos.

Nessa classe enquadramos aparelhos acionados e parados segundo


horários predeterminados (por ação humana ou de temporizadores), como por
exemplo regadores de jardim temporizados.

4.2.6. Aparelhos de operação contínua.

São aparelhos que operam continuamente, sob vazão fixa,


durante toda a vida do sistema. Essa classe é, de fato, uma idealização a que se
podem aproximar os aparelhos de acionamento e parada automáticos, quando têm
operação contínua por um espaço de tempo igual ou maior que o período de tempo
sob análise.
31

4.3. Tempos Característicos de Operação dos Aparelhos

O conhecimento dos tempos característicos de operação de cada


aparelho se fazem necessários a fim de permitir, durante o processo de simulação
de uso, uma previsão adequada da operação de cada inserção aparelho-sistema,
com vistas a se avaliar possíveis reações de satisfação, insatisfação ou tolerância
dos usuários durante a interação deste com os aparelhos.

Além da curva de descarga, que nos permite inserir o aparelho no


sistema, sob o ponto de vista hidráulico, é necessário o conhecimento do momento
em que determinado aparelho entra em operação, assim como as características
(tempos e curvas de descarga) que o aparelho deverá assumir após tal evento,
conforme sua natureza, caracterizando o desenrolar de seu ciclo de funcionamento,
em termos de tempos de operação ou seqüência de eventos associados à entrada em
operação.

O conhecimento desses tempos, segundo uma série de métodos,


apresentados em GRAÇA e GONÇALVES (1987b), permite a determinação da
probabilidade de um dado aparelho se encontrar, ou não, em funcionamento em um
dado instante.

Essas probabilidades de ocorrência são avaliadas pelas


tradicionais expressões (eq. 4.3 e 4.4):

t
p= (4.3)
T
q = 1− p (4.4)
32

onde: p - probabilidade de dado aparelho estar em operação;


t - tempo de duração da operação;
T - tempo entre inícios de operação durante o período de
pico;
q - probabilidade de determinado aparelho não estar e
operação.

A seguir, serão tratados os diversos tipos de aparelhos, segundo a


classificação proposta em 4.2.

4.3.1. Aparelhos de operação em presença do usuário.

A operação desse tipo de aparelho, do ponto de vista temporal,


ocorre como apresentado na Figura 4.3.

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.

Como se observa, seria bastante fácil, a partir de dados como o da


Figura 4.3, que pudessem ser tomados por meios estatísticos como típicos para um
determinado grupo de usuários, proceder-se a determinação do tempo de operação
33

(t), do aparelho.

ILHA (1991) procede tal empreendimento, obtendo, entre outros


resultados, o gráfico apresentado na Figura 4.4.

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

Duração do uso [s]

Fig. 4.4 Duração de uso do lavatório – água quente (ILHA,1991).

Como se pode observar, os resultados apresentados na Figura 4.4


são muito dispersos para permitirem uma caracterização precisa de tempo de
duração de operação do lavatório. De fato, no trabalho original (ILHA, 1991), foi
encontrado, para o tempo de duração da utilização desse aparelho, “o valor médio
correspondente a 32 s, com desvio padrão de 36 s”.

Se por um lado é difícil, a partir de conjunto de dados como o da


Figura 4.4, a determinação de um tempo de duração de operação (t), que possa ser
tomado como típico, ou ao menos característico, não é difícil a criação de um
ambiente de simulação que possa gerar “durações de utilização” em padrão similar
ao apresentado.

Pode-se inferir de tal tipo de resultados, especialmente quando


originados de um estudo longo aplicado a um grupo representativo de usuários, que
as freqüências com que ocorrem cada duração de uso indicam a probabilidade de
34

que um determinado acionamento ocorra com uma dada duração.

De forma semelhante é possível a determinação do momento de


início da operação (t0).

Ao se procederem estudos estatísticos em busca da determinação


do momento de acionamento de um dado aparelho da classe aqui estudada, por
exemplo um lavatório ou chuveiro, obtém-se uma distribuição de freqüência
semelhante à mostrada na Figura 4.5.

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

De forma semelhante ao proposto para a duração do uso, é


possível, especialmente como fruto de um estudo de monitoramento mais longo,
assimilar a freqüência de utilização de determinado aparelho a sua probabilidade
de acionamento em um dado horário.

Como observado para o tempo de duração, diante de dados dessa


natureza, também não há facilidade em caracterizar-se com precisão, os momentos
de acionamento dos aparelhos, e, consequentemente, os valores dos intervalos de
35

tempo entre utilizações (T).

Ainda aqui não há, no entanto, dificuldade na geração, por


simulação, de um perfil de início de utilização semelhante ao apresentado na
Figura 4.5.

As técnicas para tais simulações deverão ser apresentadas em


capítulos subsequentes.

4.3.2. Aparelhos de acionamento pelo usuário e parada automática.

Esse tipo de aparelho, que, na maioria dos casos, após acionado


pelo usuário tem sua parada condicionada ao preenchimento de determinado
volume, apresenta um tempo de operação (t) dependente do preenchimento desse
volume característico (V). Como o tempo de preenchimento desse volume depende
da vazão de entrada, podemos afirmar que o tempo de operação depende da curva
característica de descarga do aparelho e da altura de carga em sua entrada.

Seguindo-se tal raciocínio, o tempo de operação, por exemplo,


para o enchimento de uma banheira, caixa de descarga ou balde em torneira, pode
ser dado pela equação 4.5.

V
t= 1
(4.5)
Cd ⋅ H 2

onde: t - tempo de operação do aparelho;


V - volume do reservatório inerente ao aparelho;
36

Cd - coeficiente de descarga da entrada d’água;


H - altura manométrica disponível na entrada do aparelho.

Deve-se ressaltar que há, ainda, alguns aparelhos que, como


a bacia sanitária com caixa de descarga, apresentam variação em sua curva de
vazão, no sentido de diminuir seu coeficiente de descarga (e consequentemente a
vazão), à medida em que o volume em seu interior vai sendo preenchido. Para tais
casos o tempo de enchimento é dado pela equação 4.6.

1 V dv
t = 1/ 2 ∫ (4.6)
H 0 Cd (v)

onde: t - tempo de operação do aparelho;


V - volume total do reservatório do aparelho;
v - volume de água na caixa;
Cd(v)- coeficiente de descarga da entrada d’água, tomado
como função do volume já completado na caixa;
H - altura manométrica disponível na entrada do aparelho.

Deve-se, portanto, conhecer a variação de “Cd” em função do


volume já preenchido no aparelho.

O momento de entrada em operação, que deve ser determinado de


maneira semelhante àquele utilizado para os aparelhos de operação em presença do
usuário, apresenta os mesmos inconvenientes e facilidades daquela classe de
aparelhos.
Nos capítulos seqüentes será apresentada técnica de simulação
também para essa classe de aparelhos.
37

4.4. Aparelhos de Acionamento pelo Usuário e Parada após Ciclo Automático.

Para essa categoria de aparelhos, nos quais há um acionamento


inicial por parte do usuário mas, em operação não abortada, este não tem controle
sobre o restante do processo, como é o caso, por exemplo, das máquinas
automáticas de lavar roupas e das lavadoras de louça, é necessário, para o processo
de simulação, o conhecimento de dois padrões de ocorrência: o momento de
entrada em operação e a lógica de controle do ciclo de operação.

O primeiro parâmetro, o momento de entrada em operação, pode


ser avaliado da mesma forma apresentada nas classes de aparelhos anteriores.

Já a segunda informação necessária pode ser obtida pelo


levantamento, em condições laboratoriais, do ciclo de operação do aparelho.

Para tal levantamento deve-se seguir alguns passos básicos:

a) entender e resumir as fases do ciclo, na forma de passos


escritos;

b) quantificar as grandezas referenciadas nesses passos;

c) visualizar os ciclos e fases de operação em resumos ou


gráficos, conforme interesse;
38

Tal seqüência aplicada a uma máquina de lavar roupas4.3 se mostra


da seguinte forma:

a) resumo das fases do ciclo:

• abertura da válvula de admissão de água enchendo o tanque


até completar determinado volume;
• acionamento do agitador por um determinado tempo para
mistura do sabão;
• parada total, por um tempo mais longo, deixando a roupa de
molho;
• acionamento do agitador, por determinado tempo, para
lavagem;
• parada do agitador e descarga do conteúdo de água;
• acionamento da centrífuga com ocorrência de curtas aberturas
da válvula de admissão de água;
• parada do motor e acionamento da válvula de admissão de
água até completar determinado volume;
• acionamento do batedor por tempo determinado;
• parada e descarregamento da água;
• acionamento da centrífuga com ocorrência de curtas aberturas
da válvula de admissão de água;
• parada total: ocorrência do fim do ciclo.

Como se pode observar, o ciclo está dividido em várias fases, e o


sistema de suprimento de água é solicitado em apenas algumas delas. Portanto,

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.

Para tal passa-se, a seguir, para:

b) quantificação das grandezas de controle;

• a vazão de entrada de água no conjunto, conforme foi


levantada, é dada por:

Qe = 1,688 ×10 −2 ⋅ H
1
2
(4.7)

onde: Qe - vazão de entrada na máquina [L/s];


H - altura de carga na entrada da torneira [KPa].

• o volume no qual ocorre a parada do enchimento foi


caracterizado como sendo de 53 L;

Diante dessas duas constatações, é possível inferir que o tempo de


acionamento da válvula de admissão de água, assim como a vazão, são função da
altura manométrica disponível, e podem ser obtidos pelas equação 4.7 e 4.8:

3199
t= 1
(4.8)
H 2

onde: t - tempo de acionamento da válvula de admissão [s];


H - altura de carga disponível na entrada da torneira [KPa].

• o acionamento do batedor por cerca de 4 minutos;


40

• a parada para “molho” por cerca de 36 min;


• lavagem por agitação, com cerca de 12 min;
• descarga da água por cerca de 2 min4.4;
• acionamento da centrífuga. Durante o processo foram
registrados 8 aberturas da válvula de admissão de água, em
intervalos de cerca de 25 segundos, com tempo de duração
fixo em torno de 6 segundos.
• Novo enchimento da máquina, seguindo as mesmas regras
apontadas no primeiro enchimento;
• novo período de agitação por cerca de 2 min;
• descarga da água por cerca de 2 min;
• acionamento da centrífuga. Durante o processo foram
registrados 4 aberturas da válvula de admissão de água, em
intervalos de cerca de 25 segundos, com tempo de duração
fixo em torno de 6 segundos, seguidos do processo de
centrifugação sem mais aberturas de água, por cerca de 6 min.
no total;
• parada e término do ciclo.

c) análise de dados:

Como se pode observar, para efeito de conhecimento da ação do


aparelho sobre o sistema de suprimento de água, temos, por síntese:

• acionamento de água com vazão dado pela equação 4.7 e


tempo dado pela equação 4.8;
• fase sem acionamento de água com duração de cerca de

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)

• novo acionamento de água com vazão dado pela equação 4.7 e


tempo dado pela equação 4.8;
• intervalo sem acionamento da água com cerca de 2 min;
• conjunto de 4 “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.
• final do ciclo.

A Figura 4.6 apresenta vários possíveis ciclos de operação da


máquina de lavar roupas avaliada, no que se refere a tempos e vazões, para vários
valores de altura de carga disponíveis na entrada da torneira que alimenta o
equipamento.

Como se pode observar do exposto, aparelhos com tal modo de


operação têm seus tempos e vazões característicos bastante influenciados pela
altura de carga disponível em sua entrada de água, dessa forma, dentro de um
contexto de maior precisão, torna-se difícil tomar como iguais, por exemplo,
máquinas de lavar roupas instaladas em pavimentos de níveis muito diferentes
entre si.
42

H=21,5 KPa H=40 KPa

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

H=80 Kpa H=160Kpa

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.

Outras classes de máquinas, como as de lavar louças, têm ainda


ciclos de determinação mais complexa, uma vez que, por exemplo, algumas delas
têm suas fases de lavagem e enxágüe em ação até que a água atinja determinada
temperatura, fazendo com que o tempo entre sucessivos processos de enchimento
dependam, então, do tempo gasto para que se atinja tal temperatura, e, portanto,
43

indiretamente, em maior ou menor grau, da potência do elemento calefator interno,


da temperatura da água na entrada, da temperatura, massa e calor específico do
conteúdo a ser lavado, das características de condutibilidade térmica de suas
paredes, do local de instalação, da temperatura ambiente, entre outras.

No entanto, por simulação, é possível inserir tais aparelhos, com


suas características específicas, na operação do sistema.

4.4.1. Aparelhos de acionamento e parada automáticos.

Os momentos de acionamento e parada desse tipo de aparelhos


são facilmente conhecidos, uma vez que são, de fato, determinados pelo usuário,
não como inferência de probabilidade estatística mas como imposição ou
programação, registrada em um temporizador automático ou mesmo no proceder
diário de um operador.

Tem seus tempos de entrada em operação (t0) e seu tempo de


duração de operação (t) tão bem determinados que não há sentido em estudar-se
sua probabilidade de operação, uma vez que sabe-se, em um dado momento, se o
mesmo está ou não operando.

Têm uma característica tempo x vazão semelhante àquela


mostrada na Figura 4.6.
44

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.

Como se pode ver, fica claro que o aparelho em questão é


acionado às 16:00 horas, opera por 2 horas, parando às 18:00.

No entanto, em que pese tais aparelhos terem a determinação de


tempos muito simples, já a curva de descarga, que acompanha a equação 4.2, pode
ser selecionada tanto pelo critério da curva fixa, ou seja, uma vez acionado o
aparelho segue uma determinada curva de descarga preestabelecida, ou pelo ajuste
inicial em um campo de curvas, onde se escolhe qual curva o aparelho deve seguir
durante sua operação.

4.4.2. Aparelhos de operação contínua.

São aparelhos em que não há razão para estudo de tempos e


momentos de operação, ou seja, sempre estão vertendo água.

A vazão de descarga desses aparelhos pode seguir 3 (três) linhas


de operação:
45

i) a existência de uma regulagem, ou calibre, não acessível ao


usuário ou a automatismos, mantendo a vazão sob curva similar à equação 4.2,
com coeficiente de descarga fixo. Esse tipo de operação terá, portanto, sua vazão
ditada pelas condições de altura de carga presentes;

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;

iii) sistemas de vazão constante controlada automaticamente.


Nesses sistemas a vazão permanece constante, frente às variações de altura de
carga na entrada, pela atuação de algum tipo de mecanismo regulador ou válvula
que leve o expoente (α) da equação 4.2 a valores muito próximos de zero.

Esse tipo de aparelho, raro em ambiente residencial, mas comuns


em sanitários públicos, é de fácil caracterização tanto estatística como por
simulação, uma vez que sabe-se que o mesmo sempre está atuando.
46

5 COMPONENTES DOS SISTEMAS HIDRÁULICOS PREDIAIS

KAUFFMAN (1980) apresenta que todo sistema é composto de


sistemas menores, ou sub-sistemas, organizados de maneira adequada a tal
composição. Essa seqüência poderia se estender em pequenos saltos, com o nível
de síntese desejado, desde as partículas subatômicas elementares até o Universo
como um todo.

Diante dessa colocação, a proposição de que um determinado


sistema possa ser construído de elementos primordiais que não constituam sistemas
em si mesmo (componentes), se mostra inaplicável; a não ser talvez no mais
primordial dos níveis subatômicos.

Da mesma forma, pode-se agregar sistemas de mesmo nível, a fim


de se estudar a interação entre os mesmos, compreendendo então sistemas maiores,
e assim sucessivamente até a descrição do Universo5.1, tornando-se então
desnecessária a definição de um meio ambiente no qual se insere o sistema em
estudo.

No entanto, é necessário, para fins práticos, que sejam


posicionadas essas duas balizas: componente e meio ambiente.

No presente capítulo, procura-se posicionar a primeira delas, o


que seja “componente”, uma vez que tal será aqui o objeto de estudo.

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.

Para o presente trabalho, receberá o tratamento de componente


todo aquele subsistema tomado com características, leis físicas e regras de
interação com outros de mesmo nível, conhecidas; ao menos no que concerne aos
propósitos aqui expostos.

Esse conceito, na grande maioria das vezes, deverá coincidir com


as unidades padronizadas ou comerciais disponíveis, uma vez que o presente
trabalho não pretende alcançar o estudo dessas unidades, enquanto sistemas que
são, autorizando então seu tratamento como componente.

Fará referência ainda, como componente, a certos subsistemas


compostos por partes comerciais, que possuam suas características definidas como
se fossem unidades pré construídas.

5.2. Caracterização dos Componentes.

Para caracterizar um determinado componente é necessária a


descrição, sistematizada, de regras ou leis que permitam determinar o
comportamento do mesmo a partir de solicitações ou “estímulos” desencadeados
por alterações físicas em si mesmos, por outros componentes, por partes do sistema
em que se inserem, ou por ações do meio ambiente.

Essas reações também devem estar organizadas sob esses quatro


48

níveis: ações sobre si mesmos, sobre outros componentes, sobre outras partes do
sistema em que se insere, sobre o meio ambiente.

Faz-se necessário ainda tornar explícito que, para efeito desse


trabalho, o enfoque de componente não se aplica somente sobre as peças
industrializadas como tubos, conexões, “kits” hidráulicos previamente montados
ou similares, mas também, ocasionalmente, sobre a água ou mesmo sobre formas
de energia presentes no sistema, uma vez que, no presente trabalho, o termo
“componente” se refere a “componente do sistema predial de distribuição de água”,
e não a componentes comerciais como tubos ou conexões, sendo que o conjunto
destes está contido naqueles.

5.3. Caracterização Individual de Componente

A caracterização de cada componente pode ser feita através de


uma ficha (ou registro em banco de dados) que contenha, para o mesmo, todas as
características que lhe sejam pertinentes para a análise em curso ou necessárias e
oportunas para a característica de estado do sistema que se deseje determinar.

Essa abordagem poderá fazer com que diversas dessas


características determinadas não apresentem aplicação imediata, no entanto, pode-
se afirmar que o conhecimento que se venha a ter sobre um sistema está limitado,
entre outras coisas, pelo conhecimento que se disponha sobre seus subsistemas
componentes.

Muitas dessas características não são fornecidas pelo produtor do


49

componente, outras o são de maneira indireta, o que dificulta a caracterização total


dos mesmos, e portanto, a caracterização precisa dos sistemas.

Para permitir um maior conhecimento do objeto sob análise, dessa


maneira, seria de se esperar que as normas técnicas que regem a área
apresentassem a exigência de disponibilização, por parte dos produtores de
sistemas e componentes, em todos os níveis, de um elenco de características
consideradas como primordiais.

Mesmo na falta dessas características, deve-se evitar ao máximo a


prática da “adoção” de valores; é mais conveniente buscar a caracterização das
mesmas através de pesquisas, ensaios de laboratório ou outras técnicas adequadas.

Como exemplo de caracterização de componente tomamos o tubo


de PVC soldável, com algumas propriedades apresentadas na Tabela 5.1.

TABELA 5.1 - CARACTERIZAÇÃO PARA TUBOS DE PVC DN 25.


Característica “Valor”
Discriminação Tubo de PVC soldável DN25
Comprimento L [m]
Nível das extremidades Za; Zb [m]
Peso 1,94 x 10-1 x L [Kg](1)
Custo de Material 8 x 10-1 x L [R$]
Vida útil 50 anos(1)
DN - entrada #1 25 [mm](2)
DN - saída #1 25 [mm] (2)
Di - entrada #1 21,6 [mm] (2)
Di - saída #1 21,6 [mm] (2)
Temperatura de serviço máxima 60ºC
Superfície externa 7,854 x 10-2 x L [m2]
Coef. de condutibilidade térmica 0,15 W/m.K(1)
Coef. de dilatação térmica 7 x 10-5 ºC-1(1)
Módulo de elasticidade 3000 MPa(1)
Perda de carga (ver Anexo A)
(1) CPC, 1996; (2) NBR5648/77
50

Pode-se observar, pela ficha da Tabela 5.1, que a caracterização


do componente não é necessariamente exaustiva, e, de fato, nunca o será, mas deve
trazer as propriedades relevantes à determinação das características desejadas para
o sistema em que esse componente se insere, como pode ser visto no Apêndice III,
quando se refere às características hidráulicas.

5.4. Subsistema Tomado como Componente.

O grande número de componentes que forma o sistema de rede de


distribuição de água em um edifício, mesmo de pequeno porte, introduz uma
grande complexidade5.2 para a análise de seus aspectos, como poderá ser inferido a
partir do Capítulo 6.

No entanto, na tipologia de edifício aqui estudada, existe um alto


grau de repetitividade de subsistemas, como por exemplo os ramais ou, geralmente
por simetria, as colunas de distribuição.

Para tirar proveito desse fato e reduzir a complexidade da análise


do sistema como um todo, após devidamente estudados, esses subsistemas podem
ser rotulados e caracterizados, através de suas leis e valores, de modo que, a partir
de então, tais elementos passem a ser tratados como fossem simples componentes.

Com vistas a reduzir ainda mais a complexidade de análise,


também podem ser tratados como componentes as associações de peças, como

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

Segundo KAUFFMAN (1980), “um sistema é um conjunto de


partes que interagem entre si para funcionarem como um todo”, portanto, para
descrever um sistema, é necessário algum tipo de abstração que permita representar
como ocorrem as interações entre essas partes, e como esses componentes ou
subsistemas de interconectam, segundo a necessária organização que caracteriza o
sistema como tal.

Para tal representação, que pode ser considerada como “a


representação de relações arbitrárias entre objetos” (AHO et alli, 1987), recorre-se
a um tipo de abstração de dados conhecido como “grafo”.

6.1. Grafos.

Os grafos são estruturas de dados que permitem modelar o mundo


real (KINGSTON, 1995).

Os grafos são representados, de maneira pictográfica, por uma


série de “vértices”, que representam os componentes participantes dessas relações
e uma rede de “arestas”, que representam as relações entre os componentes. Na
Figura 6.1 podemos ver um exemplo pictográfico de grafo.
h
b e
a
d g
c f

Fig. 6.1 Representação pictográfica de um grafo


53

A notação de conjunto, apresentada nas equações 6.1.a e 6.1.b,


também é uma forma de representação do grafo apresentado na Figura 6.1.

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)

onde: V – conjunto de vértices do grafo (componentes);


E – conjunto de arestas do grafo (relações).

Quando o sentido da relação é de importância para a descrição


desejada do grafo, o mesmo é dito “orientado”.

Para a representação do sistema de distribuição de água em um


edifício é necessário observar que, ao contrário do que poderia sugerir uma
primeira visão, as “arestas” do grafo não representam tubos, tampouco as setas dos
grafos orientados representam, necessariamente, o sentido de fluxo de alguma
grandeza física, mas sim representam relações e sentido de influência6.1.

6.1.1. Casos especiais de grafos.

Alguns grafos são tratados de forma especial uma vez que


apresentam características especiais como o fato de terem somente uma direção
possível a seguir, de cada vértice estar ligado de modo a receber influência direta

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

de somente um outro vértice ou outra característica qualquer que os faça pertencer


a um subconjunto dentre os grafos.

Freqüentemente, esses grafos especiais podem modelar os


sistemas de maneira simplificada, proporcionando ganhos em termos de agilidade e
compreensão, em situações em que não se requer níveis de detalhes por demais
sofisticados, ou mesmo em sistemas mais simples, sem complexos ciclos de
“feedback” ou diversas opções de configuração em operação.

Também é possível, a partir de uma modelagem complexa em um


grafo, para fins de estudos específicos e com perda de precisão controlada, extrair-
se esses modelos simplificados de um grafo complexo que modela todo o sistema.

A seguir passamos a descrever sucintamente, em ordem


decrescente de complexidade, os casos mais freqüentes dessas simplificações.

a) Árvores.

As árvores são grafos orientados nos quais, a partir de um nó


inicial, denominado “raiz”, tem-se um e somente um caminho direto possível para
se chegar a qualquer outro nó. Uma representação pictográfica dessa estrutura de
abstração de dados se encontra na Figura 6.2.

a b

c d g e f

Fig. 6.2 Representação de uma árvore de raiz em “r”.


55

Assimilar a organização de um sistema de distribuição de água em


rede aberta a uma árvore, mostra-se adequado para o entendimento de uma série de
relacionamentos, como por exemplo, vazão e perda de carga, onde as “folhas”6.2
seriam os aparelhos, os “vértices” internos componentes como tubos, conexões ou
válvulas e a “raiz” um elemento de suprimento, como por exemplo um
reservatório.

b) Listas.

As listas são grafos que têm um único caminho possível a ser


percorrido, sendo que, para atingir o último dos vértices (“cauda”), a partir do
primeiro deles (“cabeça”), é necessário que se percorra todos os vértices presentes.
Na Figura 6.3 vemos a representação de uma lista.

h b c d e f

Fig. 6.3. Representação de um grafo em forma de lista, onde “h” corresponde à


cabeça e “f” à cauda.

Listas são adequadas para análises mais simples, ou de algumas


características isoladas de subsistemas, como por exemplo linhas de adução,
alimentadores ou tubulação de recalque, onde os componentes, para várias
características, guardam essa disposição em série assimilável a listas.

Deve-se observar que tanto as árvores como as listas não admitem


a existência de vértices avulsos, ou seja, que não guardem nenhum tipo de relação
com qualquer outro, como o caso do vértice “h”, na Figura 6.1. No entanto, tanto a

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.

Maiores definições, algoritmos e propriedades dessa classe de


estruturas de abstração de dados podem ser encontrados, dentre muitas fontes, em
AHO et alli (1987) e KINGSTON (1995).

6.2. Representação de Sistemas Prediais de Distribuição de Água Através de


Grafos.

Para a representação de um sistema através de um grafo é


necessário o conhecimento de dois grupos de elementos:

a) os componentes que formarão o sistema, que constituirão os


vértices do grafo;

b) as relações entre esses componentes, que constituirão as arestas


do mesmo.

Para uma determinada configuração inicial, portanto, deve ser


possível responder a duas perguntas:

a) quais os componentes que se acham presentes? Essa resposta


permite a construção do conjunto “V” apresentado na equação 6.1.a;

b) para cada elemento “vi” de “V”, existe algum tipo de influência


que o mesmo exerça sobre cada elemento “vi” de “V”? Essa resposta permite
57

determinar o conjunto “E”. De fato, para evitar um aumento de complexidade


provocado por um conjunto “E” repleto de elementos de pouca importância, deve-
se reformular a pergunta: para cada elemento “vi” de “V”, existe algum tipo de
influência, de interesse, que o mesmo exerça sobre cada elemento “vi” de “V”?

Segue-se um exemplo simples para auxílio à explanação dessa


abordagem.

A Figura 6.4 apresenta um reservatório, ligado a um tubo,


terminando em uma torneira, o conjunto conduz água.

Água Reservatório
1 2

Registro de gaveta
Entrada de borda
4
3

Tubo
5 Torneira
Tubo Luva 9
Joelho 7 8
6

Fig. 6.4 Exemplo de um sistema predial de distribuição de água.

Na Figura 6.5, tem-se uma possível representação, em grafo,


desse sistema.

Fig. 6.5 Representação em grafo do sistema apresentado na Figura 6.4.


58

As relações constantes da Figura 6.5 são as seguintes:

• 1-2 a 1-9 - as propriedades da água exercem influência sobre todos os


componentes. Por exemplo, se a temperatura da água aumenta, a pressão
máxima de trabalho para os tubos e conexões pode diminuir; se a água se
encontra contaminada, pode contaminar o reservatório, etc.;
• 2-1 - a qualidade da água depende do estado sanitário do reservatório, ou seja,
um reservatório contaminado pode fornecer contaminante à água;
• 2-3, 3-4, 4-5, 5-6, 6-7, 7-8, 8-9 - em cada uma dessas relações, da pressão e
vazão de saída do primeiro elemento depende a pressão e vazão de entrada do
segundo;

De fato, as arestas do grafo representado na Figura 6.5 não


correspondem a uma única relação, mas, por vezes, a “feixes” de relações, como
está explicito, por exemplo, na análise da relação 1-2 e 2-1, onde o termo
“contaminante” representa genericamente qualquer um, ou diversos, componentes
presentes na água.

Outro aspecto relevante é o fato de determinarmos no grafo a


existência de uma relação de influência somente quando esta nos pareça
importante. Observa-se que existem várias outras relações que poderiam ser
assinaladas, como por exemplo, o fato dos tubos e conexões poderem liberar
partículas ou compostos químicos, inerentes a sua composição, na água, alterando
propriedades químicas desta. Essa relação poderia se tornar importante, por
exemplo, no que se refere a liberação de íons, se o tubo “5” fosse de cobre e o tubo
“7” de aço galvanizado.
59

Não estão representadas as influências que um componente tem


sobre si mesmo, ou seja, a alteração de determinada característica do componente
em função de outra também sua, uma vez que esta relação é implícita para todos os
componentes.

A representação de um sistema predial de distribuição de água em


um grafo visa, sobretudo, facilitar a resposta para as seguintes perguntas:

a) ao calcular-se o valor de uma determinada propriedade, de um


determinado componente, quais os outros componentes do sistema que exercem
influência sobre o mesmo?

b) Através de qual propriedade está sendo exercida essa


influência, pelo componente que o faz?

É evidente que tal indagação deve gerar uma no sentido inverso,


ou seja: a alteração de determinada propriedade de determinado componente pode
provocar alteração em quais outras propriedades de quais outros componentes?

Essas duas características, aqui explicitadas em forma de


perguntas, evidenciam a dinamicidade dos sistemas hidráulicos prediais, que,
diferentemente de alguns outros sistemas (os sistemas estruturais6.2, por exemplo),
não encontram equilíbrio estático, ou seja, um estado final permanente. Mesmo que
se avalie a hipótese dos mesmos aparelhos permanecerem acionados de maneira
contínua e com regulagem fixa, de se estabelecerem todos os regimes permanentes
e ciclos automáticos que porventura existam, ainda assim existem propriedades,

6.2
Sistemas estruturais ideais, pois sempre existem características dinâmicas nas
estruturas como fluência, deformações lentas, etc.
60

como a deposição ou carreamento de resíduos, as incrustações ou corrosões, ou


outras, que estão indissociavelmente ligadas ao fato de existir fluxo de água no
sistema.

6.3. Representações de Grafos.

Se é possível a representação de um sistema predial de


distribuição de água através de um grafo, deve-se agora buscar a representação
mais adequada desse grafo, de acordo com a finalidade desejada ou com o meio de
armazenamento e processamento de dados disponível.6.3

Como se pode observar, na Figura 6.5, mesmo tomando-se um


sistema extremamente simples, como o apresentado na Figura 6.4, o grafo
correspondente pode apresentar um grande número de vértices e arestas, assim
como, ainda há a necessidade de se entender cada relação em cada “feixe” de
relações.

Com o intuito de melhorar a compreensão e o registro dessas


relações, apresenta-se, a seguir duas formas alternativas de representação de um
grafo.

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

6.3.1. Matriz de adjacências.

Uma matriz de adjacências, como definida em (AHO et alli,


1987), que para efeito do presente trabalho pode ser denominada matriz de relação,
é uma matriz quadrada (n x n), tendo como lado o número de vértices do grafo, e
contendo valores lógicos (do tipo FALSO | VERDADEIRO ou 0 | 1), indicando
haver ou não relação entre cada vértice “i” do grafo.

Para caracterizar a orientação do grafo deve-se convencionar uma


das dimensões da matriz como origem da relação (aquele vértice que exerce a
influência), por exemplo, as linhas. Uma matriz elaborada dessa forma, para o
grafo da Figura 6.5, pode ser vista na Figura 6.6.

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 se pode observar, essa matriz de relação apresenta uma


grande esparsidade, ou seja, contém um grande número de elementos nulos, o que
não a recomenda para armazenamento direto em computadores, especialmente para
a representação de sistemas com grande número de componentes.

Além disso, é possível apenas verificar se existe ou não alguma


relação entre dois componentes mas não sua natureza, se de energia, fluxo, massa
62

ou outra; tampouco qual propriedade do componente “mestre” (aquele que exerce a


influência) atua sobre qual propriedade do componente “escravo” (aquele que
recebe a influência).
Essa representação poderia, a princípio, ser melhorada com a
introdução de uma terceira dimensão “r” na matriz, tornando-a uma estrutura
tridimensional, onde cada plano “ri” corresponderia a uma possível relação:
transferência de massa, de energia, de força ou outra qualquer. No entanto tal
expediente, apesar de explicitar e permitir recuperar o tipo de relação, aumentaria
consideravelmente a esparsidade da matriz.

Já a representação da relação em si, ou seja, qual propriedade do


componente mestre atua sobre qual propriedade no componente escravo pode ser
expressa por um par coordenado (x;y), contendo referência e essas propriedades.

Essa notação, no entanto, ainda é frágil pois permitiria apenas a


notação de um par de propriedades “mestre-escravo” tomada para cada relação.

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.

6.3.2. Lista de adjacências.

Outra possível representação para um grafo orientado é conhecida


63

como lista de adjacências, ou para o presente estudo, lista de relações.

As listas de relações são constituídas por elementos encadeáveis6.4


cada qual representando um vértice do grafo. Uma representação dessa estrutura,
que toma como modelo o grafo da Figura 6.5, pode ser vista na Figura 6.7.

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

Fig. 6.7 Representação do grafo da Figura 6.4 em forma de lista encadeada.

A representação em forma de lista encadeada, como apresentado


na Figura 6.7, apresenta algumas características que devem ser mencionadas:

a) não apresenta esparsidade, ou seja, aloca espaço para a relação


somente quando esta existe;

b) apresenta duplicidade de vértices. Alguns vértices, por


sofrerem influência de vários outros, são apresentados várias vezes. Esse fato torna
desaconselhável que as informações de características e de estado dos componentes
representados nesses vértices sejam armazenadas nestas estruturas de dados, mas
sim em estruturas à parte, apontadas pelos nós da lista de relações, a fim, de
minimizar o risco de inconsistência, que aumenta na proporção direta do aumento
de redundâncias;

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

c) a lista de relações apresenta a existência de alguma relação e


não sua natureza. Esse inconveniente pode ser resolvido criando-se uma lista de
propriedades interrelacionadas para cada tipo de relação existente, o que não
implicaria em aumento de esparsidade uma vez que a estrutura básica não a
apresenta;

d) por fim, pode-se observar a grande limitação apresentada por


essa representação para nosso objetivo. Não é possível responder de forma direta à
questão: para calcular o estado desse componente deve-se saber previamente o
estado de quais componentes?

6.3.3. Lista de adjacências reorientada.

A lista de adjacências reorientada, aqui definida como sendo a


lista de adjacências de um grafo orientado, tendo como origem não o vértice que
exerce influência, mas sim aquele que recebe a influência de outro.

Esse expediente permite que se tenha de forma imediata a série de


componentes que influenciam aquele que se deseja determinar o estado, mantendo
as características e observações anteriormente feitas para as listas de adjacências.
Essa representação, para o grafo da Figura 6.5, pode ser visto na Figura 6.8.
65

Fig. 6.8 Lista de adjacências reorientada para o grafo da Figura 6.5.

Como se pode observar, nessa estrutura reorientada é bastante


fácil observar quais vértices (componentes) e quais arestas (relações) devemos
conhecer para que o estado de um dado componente, e portanto do sistema, seja
conhecido.

6.4. Representação das Relações.

As estruturas acima podem representar que existem relações entre


componentes e qual componente influencia a outro, mas não torna clara a natureza
dessa relação.

Mesmo em um sistema extremamente simples, como aquele


apresentado na Figura 6.4, ainda não há clareza sobre quais propriedades presentes
no componente “mestre”6.5 se relacionam com quais propriedades do componente
“escravo”6.5, e como ocorre este relacionamento.

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

Para a representação dessa relação, propõe-se aqui a seguinte


sistemática:

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;

b) cada componente deve trazer em si toda a descrição de como


suas propriedades se relacionam, ou seja, não há nenhuma lei física designada no
nível de relação, mas somente de componente;

Com base nessas duas premissas, pode-se inferir que a relação se


torna uma simples declaração de igualdade ou simetria entre propriedades de
componentes “mestre” e “escravo”.

Como declarações de igualdade, essas relações podem ser


sistematizadas como segue.

6.4.1. Sistematização das relações.

À medida em que cada componente mestre e escravo se


correspondam, através de ao menos uma propriedade em igualdade, podemos, para
cada relação, escrever um vetor correspondente ao conjunto de igualdades
denotado como equação 6.2.
67
rij ≡ U{p ki = p mj } (6.2)

Nesta proposição, “rij”, corresponde à relação entre os


componentes “i” e “j”, e é composta pelo conjunto formado por todas as igualdades
entre uma determinada propriedade “k” do componente “i” e uma determinada
propriedade “m” do componente “j”.

Ao criarmos o conjunto de relações “R” para todo o sistema,


como sendo a união de todos os conjuntos “rij”, como apresentado na equação 6.3,
encontraremos várias situações onde o tradicional silogismo, apresentado na
equação 6.4, concorre para a simplificação drástica do número de propriedades
envolvidas.

n
n
R ≡ U {rij } (6.3)
i =1
j =1

( A = B ) ∧ (B = C ) ∴ ( A = C ) (6.4)

Essa simplificação tende a fazer com que todo o estado de um


sistema, segundo as propriedades físicas buscadas, possa ser obtido através da
determinação de algumas poucas propriedades, que devem ter valores capazes de
atender, simultaneamente, às leis “internas” que regem os diversos componentes.

A fim de esclarecer melhor esse ponto, seja tomado como


exemplo o sistema apresentado na Figura 6.4, cujo grafo para relações hidráulicas,
de altura manométrica e vazão, pode ser visto na Figura 6.9.
68

Fig. 6.9 Grafo para relações hidráulicas do sistema apresentado na Figura 6.4.

As leis internas de cada componente para o sistema proposto


podem ser descritas como apresentado nas Tabelas 6.1. e 6.2.

TABELA 6.1 - LEIS “INTERNAS” APLICÁVEIS AOS COMPONENTES DO


EXEMPLO DA FIGURA 6.4
Componente
Leis aplicáveis
Número Tipo
2 reservatório H s2 = y
3
entrada
borda
de
Qe3 = Qs 3 ; H s 3 = H e3 − ∆H (Qs 3 )
Qe 4 = Q s 4 ; H s 4 = H e 4 − ∆H (Q s 4 )
válvula de
4
gaveta
5 tubo Qe5 = Qs 5 ; H s 5 = H e5 − ∆H (Qs 5 ) + Z e5 − Z s 5
6 joelho Qe6 = Qs 6 ; H s 6 = H e6 − ∆H (Qs 6 )
7 tubo Qe7 = Qs 7 ; H s 7 = H e7 − ∆H (Q s 7 ) + Z e7 − Z s 7
8 luva Qe8 = Qs8 ; H s8 = H e8 − ∆H (Qs8 )
1
α Q  α
9 torneira Qe9 = Qs 9 ; Qs 9 = Cd ⋅ H e9 ou H e9 =  s9 
 Cd 
69

TABELA 6.2 - SIMBOLOGIA ADOTADA PARA O EXEMPLO.


Símbolo Significado
Q e
vazão que entra no componente
Qs vazão que sai do componente
He altura manométrica na entrada do componente
Hs altura manométrica na saída do componente
y altura da lâmina d’água no reservatório
Cd coeficiente de descarga
Ze nível de entrada do componente
Zs nível de saída do componente
α expoente característico

Prossegue-se com a descrição das relações “rij”, como se vê na


Tabela 6.3.

TABELA 6.3 - DESCRIÇÃO DAS RELAÇÕES.


Relação Descrição
r2,3 Qs 2 = Qe3 ; H s 2 = H e3
r3, 4 Qs 3 = Qe 4 ; H s 3 = H e 4
r4,5 Qs 4 = Qe5 ; H s 4 = H e5
r5,6 Qs 5 = Qe 6 ; H s 5 = H e 6
r6,7 Qs 6 = Qe7 ; H s 6 = H e7
r7,8 Qs 7 = Qe8 ; H s 7 = H e8
r8,9 Qs8 = Qe9 ; H s8 = H e9

A solução para a rede apresentada consiste, portanto, na solução


simultânea das equações apresentadas nas Tabelas 6.1 e 6.3.

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

expresso na equação 6.4, como se pode observar na Tabela 6.4.

TABELA 6.4 - REDUÇÃO E UNIFORMIZAÇÃO DAS VARIÁVEIS ATRAVÉS


DA APLICAÇÃO DO SILOGISMO EXPRESSO NA EQUAÇÃO
6.4

Variável Variáveis dos


genérica componentes
x1 Qs 2 = Qe3 = Qs 3 = Qe 4 = Qs 4 = Qe5 = Qs 5 = Qe6 = Qs 6 =
Qe7 = Qs 7 = Qe8 = Qs8 = Qe9
x2 H s 2 = H e3
x3 H s3 = H e4
x4 H s4 = H e5
x5 H s5 = H e6
x6 H s6 = H e7
x7 H s7 = H e8
x8 H s8 = H e9

A construção da Tabela 6.4 mostra que houve uma redução


drástica do número de variáveis envolvidas, pela utilização de todas as relações de
igualdade disponíveis, ou seja, todo o conjunto de relações “rij”, e todas as leis
internas dos componentes, que expressam igualdades diretas entre as propriedades
de entrada e saída.

Por esse processo, pode-se, portanto, dar essas equações como


satisfeitas, restando encontrar solução que satisfaça àquelas que não correspondem
a relações ou a leis internas de igualdade direta6.6. Dessa forma resta-nos a solução
do sistema de equações apresentados como equação 6.5., já utilizando a notação
genérica proposta na Tabela 6.4.

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

Como o sistema proposto é bastante trivial, a solução pode ser


obtida pela aplicação da primeira linha na segunda, dessa na seguinte e assim
sucessivamente, obtendo-se a equação 6.6, cuja solução, para “x1”, pode ser
bastante fácil caso se adote uma fórmula empírica mais simples para a expressão
das funções “ ∆H (Q) ”.

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 

No entanto, quando existem derivações, ou seja, quando existem


várias vazões diferentes, em vários trechos, circulando no sistema, a solução leva a
um sistema de equações não lineares, mantendo-se, porém, a mesma estrutura.

Um exemplo mais complexo, para rede ramificada, com solução


numérica, pode ser visto no Anexo B.
72

6.5. Sistemas Equivalentes.

Como já citado anteriormente, os edifícios que abrigam múltiplas


economias, geralmente com vários apartamentos ou várias salas comerciais,
apresentam um índice de repetição bastante elevado em seus subsistemas. Tirando-
se proveito desse fato, é possível a redução do esforço de cálculo ou, mais
importante, a simplificação do processo de montagem das relações e descrição dos
componentes, através da escrita das leis que regem esses subsistemas que se
repetem, dando aos mesmos o enfoque de componentes.

Para transformar esses sistemas (ou subsistemas) em componentes


equivalentes, existem, a princípio, duas técnicas.

6.5.1. Técnica da avaliação de características

Essa técnica consiste na definição das propriedades e leis que


fazem a relação desse componente complexo (que a seguir será tratado apenas
como “componente”) com os outros pertencentes ao sistema, e a reavaliação das
características de tal componente, através de sua rotina de cálculo própria, para
cada valor de interesse assumido por essas variáveis de descrição de sua relação
com o sistema do qual faz parte.

Tem-se um exemplo de aplicação dessa técnica, se, para o


exemplo do Anexo B, tomar-se a definição da vazão de entrada no sistema “Qs1”
como vazão de entrada no componente (“Q”), e a definição da carga de saída do
reservatório ”Hs1”, como carga de entrada no componente (“H”), sendo então,
73

possível, que para cada valor de “H” seja calculado um valor de “Q”.

A principal vantagem dessa técnica é sua simplicidade, uma vez


que há o reaproveitamento de todas as equações, funções, relações e outros
elementos que tenham sido utilizados anteriormente.

Também é preciso citar que não é uma técnica aproximada, pois


efetivamente resolve o subsistema-componente.

Em contrapartida, o esforço computacional, quando avaliando o


valor de vazão provocada por determinada carga hidráulica, é considerável, uma
vez que para cada determinação de “Q” é necessário a solução de todo sistema, que
pode ser trabalhosa, se esse contiver muitos componentes, ou muitos subsistemas
tratados como componente, de forma que essa solução de sistemas, uns dentro dos
outros, torna-se onerosa.

Mais onerosa e complexa ainda se torna, se desejarmos, por


alguma particularidade, inverter a solução; seria como, se, para o exemplo do
Anexo B, fossem buscados os valores de carga “H” que provocam determinado
valor de vazão “Q”.

6.5.2. Técnica da lei equivalente.

Diferentemente da técnica apresentada no item 6.5.1, essa técnica


consiste na determinação de uma curva, ou propriedade equivalente, que possa
representar esse subsistema, a ser tratado como componente; de forma que possa, a
partir daí, de maneira desvinculada das funções de seus próprios componentes, ser
74

representado no conjunto de relações do sistema maior que integra.

As vantagens dessa abordagem residem no fato de ser possível


uma representação bastante simples do sistema, através de uma curva ou uma
variável equivalente.

A determinação de um exemplo de curva característica


equivalente, aqui apresentada na equação 6.7 com sua inversa em 6.8, assim como
a determinação da massa do sistema-componente, podem ser vistas no Anexo A.

H = −24,39871 + 19,41222 ⋅ Q1,902871 (6.7)

Q=
( H + 24,39871)
0 , 5255217
(6.8)
4,752383

O grande inconveniente dessa técnica é seu uso restrito para


subsistemas com aparelhos de regulagem fixa, uma vez que seria necessário um lei
equivalente diferente para cada configuração de acionamento possível.

6.5.3. Componentes equivalentes intermediários.

O presente trabalho trata como componente equivalente


intermediários aqueles que podem, ainda no âmbito da avaliação do
comportamento dos subsistemas mais elementares, serem reunidos em um único
componente, para fins da análise pretendida, com vistas a simplificar a análise do
sistema.
75

Esses componentes, que de fato são pequenos sistemas, têm suas


propriedades e leis determinadas por somas diretas ou outras operações igualmente
simples.

De fato, um exemplo dessa abordagem se observa na equação 6.6,


que representa a lei equivalente para o sistema da Figura 6.4.

Apesar dessa abordagem proporcionar uma grande simplificação


no processo, ela só se torna possível através da exploração de peculiaridades, como
no caso do exemplo da Figura 6.4 (e eq. 6.6), onde a vazão que percorre todo o
sistema é a mesma.

Para tais situações é possível, dada a definição dos componentes


como no Anexo B, determinar o componente equivalente a uma associação em
série de componentes de duas conexões, onde o terminal denotado como “b” do
componente mais à montante é conectado aquele denotado “a” de seu par próximo
a jusante.

Observando-se que o terminal “a” do primeiro componente


corresponde ao terminal “a” do componente equivalente, e o terminal “b” do
último componente àquele “b” do componente equivalente, permitindo que, de
modo análogo ao sistema de equações 6.5, possamos escrever, para uma associação
genérica de componente em série, seguindo as premissas assim explicadas:

 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

O sistemas de equações denotado em 6.9 é bastante direto, e pode


ser resolvido pela soma das equações, resultando na equação 6.10.

n
H Beq = H Aeq − ∑ [∆H i + 10 ⋅ ( Z Ai − Z Bi )] (6.10)
i =1

O Anexo C traz um exemplo de cálculo de rede em anel,


utilizando vários conceitos apresentados nos itens 6.5.2 e 6.5.3 acima.
77

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.

Mais que uma condição de existência, esses sistemas são


concebidos de forma a satisfazer seus usuários, segundo conceitos de qualidade e
desempenho, aceitos por esses, conforme o meio em que se inserem, em especial
sua cultura, época e local.

Uma definição amplamente aceita de qualidade diz que: “tem


qualidade aquele produto ou serviço que satisfaz às necessidades do usuário”.
Expandindo essa definição pode-se afirmar que: ”terá mais qualidade aquele
sistema que melhor atender às necessidades e desejos do usuário”.

De fato, GRAÇA e GONÇALVES (1986) traz:

“... objetiva-se na concepção de um sistema sanitário predial, a


sua adequação ao usuário e não o caso contrário, ou seja, do
usuário ao sistema.”

Uma visada ao passado nos mostra que, mesmo antes da difusão


de idéias como a Teoria dos Sistemas ou dos estudos sobre qualidade total, a
Engenharia de Sistemas Prediais, assim como toda a Engenharia, se fundamenta
em ser a arte e ciência que proporcione soluções para necessidades de usuários,
freqüentemente buscando otimizar variáveis de projeto, que muitas vezes
produzem efeitos antagônicos, de forma que a satisfação de um determinado grupo
78

de necessidades do usuário pode, com freqüência, afastar a satisfação de outro


conjunto de necessidades. O exemplo comum desse efeito é a onipresente
necessidade de equilíbrio entre desempenho e custo dos sistemas de Engenharia.

Dessa forma, uma das tarefas de toda a Engenharia, assim como


desse trabalho, é a busca e aplicação de conhecimento, neste caso através de
ferramentas de previsão e simulação, que permitam verificar e ajustar o grau de
satisfação, de cada uma das necessidades do usuário, da melhor forma possível.

A caracterização dos diversos tipos de usuários, suas interações


com o sistema e com o ambiente, de fato, não são objetos desse trabalho,
constituindo tema bastante explorado na literatura técnica da área, mas muito longe
da exaustão. Mesmo assim, serão propostos alguns grupos básicos de necessidades
a serem verificadas e determinadas, como essas necessidades podem ser
representadas ou transformadas em critérios de desempenho, detendo-se com mais
atenção no conhecimento que permita simular as atitudes dos usuários na busca de
satisfação para essas necessidades, assim como na avaliação de sucesso desse
intento.

7.1. Necessidades Básicas dos Usuários.

Para os sistemas hidráulicos prediais, o usuário básico é o ser


humano7.1, com todos seus aspectos culturais, pessoais e sua mobilidade de
desejos, com sua crescente geração de novas necessidades, calcadas em outras já

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

satisfeitas, sendo que, aquelas que anteriormente constituíram somente desejos


inatingíveis ou simpáticos complementos, passam, dentro de pouco tempo, a se
posicionarem como necessidades básicas. Exemplos interessantes desse processo
podem ser encontrados em LANDI (1993).

Portanto, o termo “necessidade básica” é válido, tão somente, para


uma determinada cultura, época e local de interpretação, fazendo com que, a
caracterização refinada das necessidades dos usuários tenha restrições geográficas
e temporais sérias, não autorizando, portanto, a transposição simples de dados e
resultados estatísticos obtidos em épocas muito distantes ou mesmo em países, ou
regiões brasileiras, de clima, cultura, formação étnica ou desenvolvimento social e
econômico diferentes .

Dessa discussão depreende-se que, mais estudos sobre as


necessidades e hábitos dos usuários, são tão necessários quanto indispensáveis,
assim como a sistematização desses resultados em bases homogêneas e acessíveis,
de forma similar ao apresentado por AMORIM (1997).

Dessa maneira, acompanhando a metodologia do supra citado


trabalho, passamos a caracterizar uma proposta de banco de dados sobre as
necessidades dos usuários, que devem ter seus valores preenchidos segundo cada
grupo identificável desses.

7.2. Dados sobre o Usuário.

Seguindo a proposição de AMORIM (1997), para a caracterização


80

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.

Os dados referentes ao usuário são, aqui, classificados segundo


duas categorias principais: a) preferências/necessidades; b) atitudes.

As preferências ou necessidades referem-se a valores de


utilização, como vazões, temperaturas e outros. Essas grandezas, devido a sua
variação e aspecto subjetivo podem, na medida do possível, ser tratadas como
números nebulosos (fuzzy), uma vez que o tratamento determinístico pode
conduzir a uma falsa idéia de precisão, que não se aplica, ou é, de fato, mais
indeterminado do que possa parecer. Esse assunto será tratado com mais detalhes
no item 7.2.1.

As atitudes referem-se às ações ou intervenções que o usuário


aplica sobre o sistema, como o acionamento de aparelhos, reformas, depredação e
outras. Como se tratam de eventos completos, que podem acontecer ou não, mas
quando ocorrem o fazem em plenitude7.2, podem ser tratados como tendências de
base probabilística, como pode ser visto no item 7.2.2.

7.2.1. Preferências dos usuários.

Como visto acima, uma das manifestações do usuário, em relação

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

ao sistema sob sua utilização, é conhecida através de suas preferências


quantitativas em relação a diversas grandezas, que têm seus valores associados a
esse sistema. A Tabela 7.1 apresenta algumas dessas características.

TABELA 7.1 - ESTRUTURA DE BANCO DE DADOS SOBRE


PREFERÊNCIAS DO USUÁRIO
Grupo I Grupo II .... Grupo “N”
vazão mínima no lavatório
vazão mínima no chuveiro
temperatura máxima no lavatório
altura do assento sanitário
altura do chuveiro
.
.
.
custo máximo de água admissível
custo final máximo do sistema
custo financeiro máximo suportado

Dessa forma, a Tabela 7.1 apresenta uma proposta de classificação


dos usuários segundo “n” grupos, e o conhecimento, da melhor forma possível, das
preferências desses usuários.

Para a classificação desses grupos, deve-se tomar como parâmetro


básico, quem são os usuários finais do empreendimento que contém o sistema
hidráulico predial (SHP). Pode-se ainda projetar quem seriam esses usuários,
dentro de horizontes de tempo predeterminado, constituindo novo grupo, e
verificando o SHP contra essas novas exigências.

A determinação de quais sejam esses grupos, e como se


caracterizam suas exigências, pode ser feito por métodos estatísticos apropriados,
cujo estudo foge ao objetivo deste trabalho.

A aplicação de métodos estatísticos a esses grupos caracterizados,


82

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.

O estudo apresentado em SAKAUE et alli. (1987) traz vários


resultados de pesquisa quanto a preferências de vazão e temperatura, em utilização
de água quente.

Esses resultados apresentam médias, com seus respectivos desvios


padrão, sendo que, entre resultados similares, destacam-se 2 pontos: o enxágüe em
pia de cozinha com torneira comum, no verão, apresentando temperatura média
preferida de 35,6°C, com desvio padrão de 4,3°C; na mesma situação, foi
registrada vazão preferida de 7,2 L/min com desvio padrão de 3,0 L/min, ambos
com amostragem de 53 pessoas.

Segundo ESPÍRITO SANTO (1987), o desvio padrão é um ótimo


indicador de quanto a média é representativa dos dados de qualquer estudo, Tendo
como base a distribuição normal, verificamos, segundo FERGUNSON (1976) que
cerca de 68% da área da curva normal se encontra no intervalo de ± 1 desvio
padrão ( x − σ ≤ x ≤ x + σ ).

Diante disso, podemos afirmar que, o sistema deve ser capaz de


fornecer água, com temperatura entre 31,3°C e 39,9°C, com vazão entre 4,2 L/s e
10,2 L/s7.3, para satisfazer a 68% dos usuários. Sendo que os padrões de satisfação
normalmente aceitos devem cobrir cerca de 90 a 99% do grupo analisado, como

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.

Observa-se que para a satisfação de 95% dos usuários, as faixas se


estenderiam para 27,2°C a 44,0°C para as temperaturas e 1,32 L/s a 13,1 L/s para
a vazão.

Na grande maioria dos sistemas, os valores inferiores dessa faixa


podem ser obtidos através do ajuste dos dispositivos de acionamento, quando se
referem a grandezas de utilização, mas, para os extremos superiores, os sistemas
devem ser capazes de proporcioná-los, o que pode trazer como resultado o super-
dimensionamento e o conseqüente afastamento da satisfação das necessidades
econômicas do usuário.

Diante disso, deve-se definir, não somente os valores das


grandezas ótimas, que satisfaçam plenamente, mas também o grau de satisfação
(ou de insatisfação) que se tenha diante de um determinado valor limite.

No mesmo estudo, SAKAUE et alli. (1987), há um enfoque


ligeiramente diferente e bastante útil: parte-se de temperaturas fixas, colhendo-se
informações subjetivas. A Tabela 7.2. apresenta o resultado de um desses
experimentos:

TABELA 7.2. - RESPOSTAS SUBJETIVAS À EXPOSIÇÃO À ÁGUA, A 37 °C,


NO VERÃO.
Resposta apresentada Número de respondentes
Quente 1
Um tanto quente 7
Ótima 40
Um tanto tépido 5

Fonte: SAKAUE et alli. (1987)


84

Como se pode observar pelas respostas, os extremos apresentam


um certo grau de desconforto, mas, talvez, não uma rejeição ou incômodo sério
pelo uso do sistema nessas condições.

Para o trabalho com grandezas como essas que, além de serem de


difícil determinação em si, também carregam uma característica de difícil
quantificação das conseqüências de seu desrespeito7.4., sugere-se, também aqui, a
aplicação de números nebuloso (fuzzy), cujos fundamentos podem ser encontrados
em PEDRYCZ (1993), entre outros, em especial nos trabalhos de L. A. Zadeh, tido
como introdutor dessa técnica.

7.2.2. Ações dos usuários.

Para se ter um banco de informações sobre usuários, é necessário


o conhecimento, além de suas preferências, de seus hábitos.

Esses hábitos podem ser traduzidos por ações, que o usuário


desencadeia, periodicamente, com diversos intuitos, que podem se desenvolver sob
quatro sentidos:

a) usufruir do sistema, tornando presente ao menos uma das


características desejadas para atender a suas necessidades;

b) melhorar, ou ajustar, a performance do sistema, através de

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;

c) manter o desempenho do sistema, promovendo intervenções


que compensem perdas de características, por desgaste ou tempo de existência,
restaurando quedas de desempenho a níveis semelhantes aos originais;

d) degradar ou interromper o desempenho do sistema, através de


atos de vandalismo ou da desativação total ou parcial do mesmo.

Salvo em raras exceções, não é possível precisar o momento,


tampouco a forma como tais atos serão levados a cabo, ou seja, não é possível
determinar com certeza e antecedência, quando e como serão acionados os
aparelhos, quando e qual alteração ocorrerá no conjunto de necessidades, quando e
qual componente apresentará defeito ou quando e qual parte do sistema será
atingida por vandalismo ou desativação.

No entanto, é perfeitamente possível simular, com base em dados


coletados, (cf. apresentado no Capítulo 4), padrões semelhantes de ocorrência de
tais eventos.

Dentre os 4 grupos acima relacionados, a Engenharia de Sistemas


Prediais tem voltado sua atenção especialmente para o primeiro, ou seja, os
padrões comportamentais do usuário relacionados ao acionamento de aparelhos.

Esses serão, também para o presente trabalho, o principal


elemento de caracterização do usuário, juntamente com suas preferências de vazão.
86

7.3. Diretrizes para a Simulação dos Usuários.

A simulação de atuação do usuário consiste em, a cada momento


do período de análise considerado (pe. a cada segundo de um ano), determinar qual
o número de aparelhos acionados, sob quais curvas de consumo.

Esse dado então, alimenta a simulação do sistema, que, através do


cálculo da rede sob vazões reais, permite determinar a vazão que efetivamente flui
do aparelho além de vários outros parâmetros.

Mas, para o presente tópico, a questão se coloca em “como


determinar, num dado momento, se há ou não acionamento de determinado
aparelho”.

Primeiramente são necessárias, então, algumas premissas básicas,


tomadas como restrições à ação do usuário, que se passa a comentar.

7.3.1. Restrição de presença.

Dado que não é possível a onipresença do usuário, pode-se


afirmar que: um usuário pode acionar7.5 somente um aparelho por vez.

Dessa forma, se, no momento sob análise, o mecanismo que


simula, segundo as probabilidades consideradas, o acionamento de aparelhos, já

7.5
Ato de acionar, e não fato de estar acionado.
87

tiver determinado que um dado usuário aciona, naquele instante, determinado


aparelho, esse mesmo usuário não mais deverá ser considerado como capaz de
acionar outro aparelho, até que se cumpra determinado intervalo de tempo.

Ainda mais, caso o aparelho acionado seja do tipo que exija a


presença do usuário, quem o aciona deverá ficar “bloqueado” até que se cumpra o
tempo de utilização determinado.

7.3.2. Restrição de disponibilidade.

Como, devido às divisões inerentes à posse de cada unidade


habitacional, o usuário não pode utilizar-se dos aparelhos sanitários de outrem,
então pode-se afirmar que: a um usuário está disponível, durante todo a simulação,
somente um subconjunto do conjunto total de aparelhos do sistema.

Esse subconjunto é composto, então, pelos aparelhos contidos


dentro de sua área de posse, unido ao subconjunto composto pelos aparelhos de uso
comum contidos no sistema.

7.3.3. Restrição de acesso.

Tomando-se como princípio que, em ambientes sanitários


residenciais, ou mesmo em certos setores de sanitários públicos, se faz uso de
privacidade absoluta, ao entrar em um desses ambientes sanitários, fato que
poderia ser caracterizado, na simulação, pelo acionar de um aparelho que pertença
a esse ambiente, o acesso aos demais aparelhos pertencentes a tal ambiente, por
outros usuários, fica bloqueado, diminuindo ainda mais, para os outros usuários, o
88

conjunto de aparelhos disponíveis.

Sob tal raciocínio, podemos então tomar como premissa que: os


ambientes sanitários privativos constituem áreas de restrição, onde a presença de
um usuário inibe o acesso de outros aos aparelhos ali contidos;

Dessa forma, sob essas restrições, considerando-se uma certa


distribuição populacional na edificação e utilizando-se um sistema gerador de
eventos, que ocorram de forma aleatória mas com distribuição de freqüência
similar aos parâmetros levantados para os usuários, é possível a simulação de
comportamento desses.
89

8 SIMULAÇÃO DO SISTEMA

Segundo PERIN FILHO (1995), a simulação de sistemas é um


método numérico de solução de problemas que consiste na observação, ao longo
do tempo, do desempenho de um modelo que representa um sistema, definido a
partir de um problema a ser resolvido.

PERIN FILHO (1995) traz ainda que: ”o modelo é usado como


uma ferramenta de experimentação que, em ambiente de tentativa e erro, permite
comparar diversos cenários, cada um representando uma política de operação do
sistema, configuração do sistema, ou uma possível solução do problema original.
Dentre aquelas que produzem melhores resultados, uma é escolhida para ser
implementada no sistema real.”

8.1. Tempo de Simulação.

Uma da grandes vantagens presentes na técnica de simulação de


sistemas é o fato do usuário, da técnica, dispor da possibilidade de manipular,
segundo sua necessidade, o tempo do sistema, ou seja, o tempo da simulação,
fazendo com que meses ou anos se processem em alguns segundos, minutos ou
horas.

Para tal, deve ser definido um mecanismo de controle de tempo, a


que passaremos a nos referir como “Relógio da Simulação” ou simplesmente
“Relógio”, contando com seu tempo próprio, não coincidindo com o tempo da
90

máquina (CPU), tampouco com o tempo real, indicado pelo relógio do sistema.

Para o presente trabalho, esse “Relógio” foi implementado através


do componente “TRelCalend”, acrescido à VCL 8.1 do ambiente Delphi 4.0, cujo
código pode ser visto no Apêndice V.

8.2. Geração das variáveis aleatórias.

Todo sistema simulado necessita de um mecanismo que permita


gerar variáveis aleatórias (independentes), ou seja, aquelas obtidas a partir de
dados históricos tabelados, histogramas ou distribuições, construídos com base em
tais dados.

Segundo PERIN FILHO (1995), a utilização direta de dados


históricos deve ser evitada, por ser um processo de alto consumo de recursos
computacionais.

Para as outras duas técnicas, segundo histograma ou distribuição,


deve ser gerado um número aleatório, contido em intervalo conhecido, sendo
posteriormente convertido, segundo função adequada, na variável aleatória
desejada.

Todas as simulações que envolvem distribuições de freqüência


segundo classes podem ser obtidas através da geração de valores, que sejam
aleatórios, mas que se distribuam segundo as características impostas, que nem

8.1
Visual Component Library.
91

sempre correspondem, ou encontram bom ajuste, com as distribuições de


freqüência tradicionalmente estudadas (normal, Poison, Student, etc.)

Tal intuito pode ser conseguido com a utilização de dois


procedimentos básicos: um gerador real de números aleatórios8.2 e uma função de
retorno de características.

8.2.1. O gerador de números aleatórios

O gerador de número aleatórios utilizado simula um dado, ou uma


roleta, de “NF” faces, numeradas de 1 a NF, onde cada face tem a mesma
probabilidade de ser exposta em cada jogada.

Para tal, um algoritmo adequado é tomado de um jogo para


calculadora (TEXAS, 1977), e, originalmente simulando o tradicional dado cúbico
(6 faces), é expandido para um número qualquer de faces. O código específico para
tal se encontra na listagem III.7, no Apêndice III.

O código ali apresentado foi exaustivamente testado para


distribuição uniforme, através da técnica do χ2 (PERIN FILHO, 1995), e
apresentou ausência de qualquer tendência específica na geração de valores, sendo
portanto, seguro admitir-se que existe uma probabilidade igual a 1/NF para que
surja cada uma das “faces” do dado como resultado.

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.2.2. Retorno de características para dados tabelados.

Dispondo-se então de um gerador de números inteiros, sem


tendência e com faixa programável, como aquele apresentado acima, é possível
ajustar-se, através de uma tabela de tradução específica, sua operação para que
passe a gerar, ou contribuir para a geração, de resultados que se assemelhem a uma
dada distribuição de freqüências.

Para uma distribuição de freqüências conhecida, assimilada a


probabilidades de ocorrência, composta de “n” classes, sendo que cada “i-ésima”
classe pode ser representada por um par ordenado (vi,pi), onde “vi” é o valor de
retorno característico da classe “i” e “pi” sua probabilidade de ocorrência, podemos
montar uma tabela semelhante à tabela 8.1.

TABELA 8.1 – PROBABILIDADE DE OCORRÊNCIA DE VALORES EM


FAIXAS ALVO.
i vi pi nfi8.3 Intervalos da faixa alvo
1 v1 p1 nf 1 = p1 ⋅ NF [1, nf1 ]
 2 
2 v2 p2 nf 2 = p 2 ⋅ NF nf 1 + 1, ∑ nf j 
 j =1 
 2 3 
3 v3 p3 nf 3 = p 3 ⋅ NF ∑ j nf + 1, ∑ nf j 
 j =1 j =1 
M M M M M
n −3 n− 2 
n-2 vn-2 pn-2 nf n − 2 = p n − 2 ⋅ NF ∑ j nf + 1, ∑ nf j 
 j =1 j =1 
 n − 2 n −1 
n-1 vn-1 pn-1 nf n −1 = p n −1 ⋅ NF ∑ nf j + 1, ∑ nf j 
 j =1 j =1 
 n − 1 n 
n vn pn nf n = p n ⋅ NF ∑ nf j + 1, ∑ nf j 
 j =1 j =1 

8.3
Freqüência esperada para a faixa “i” em “NF” eventos.
93

Uma vez disponibilizada a Tabela 8.1, um número inteiro, obtido


a partir do gerador de números aleatórios, com um valor de “NF” suficientemente
grande a fim de não provocar erros excessivos8.4, deve ser verificado contra os
intervalos de faixa alvo de cada possível classe, retornando, como resposta, o valor
representativo (“vi”) da classe correspondente àquela, em cujo intervalo de faixa
alvo o número inteiro gerado estiver compreendido.

A comparação entre uma determinada distribuição dada, através


de um histograma, e uma distribuição gerada sob o mesmo padrão probabilístico,
para um exemplo hipotético, pode ser vista na Figura 8.1.

Comparativo de distribuição de probabilidades.


Probabilidade de ocorrência.

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.

Fig. 8.1 Comparativo de distribuições de freqüências (10 000 000 de pontos).

Como se pode observar, não há erro apreciável entre as duas


distribuições.

A Tabela 8.2 traz os valores que serviram de base para a

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

construção da Figura 8.1.

TABELA 8.2 – VALORES DE BASE PARA A GERAÇÃO DA FIGURA 8.1.


f vi pi I
-2
146 1 9,352 x 10 [1 , 93515]
-2
73 2 5,119 x 10 [93516 , 144710]
-1
147 3 1,003 x 10 [144711 , 245051]
102 4 6,962 x 10-2 [245052 , 314676]
145 5 9,898 x 10-2 [314677 , 413652]
-1
220 6 1,502 x 10 [413653 , 563823]
-2
58 7 4,027 x 10 [563824 , 604096]
88 8 6,689 x 10-2 [604097 , 670990]
-1
190 9 1,297 x 10 [670991 , 800683]
-1
292 10 1,993 x 10 [800684 , 1000000]

Na Tabela 8.2, a coluna intitulada “f”, contém os dados de


freqüência obtidos por observação, por exemplo, em pesquisas de campo,
referentes ao número de indivíduos, ou eventos (pontos amostrais), que se
enquadram sob cada classe, identificadas pelos valores apontados em “vi”. A
coluna “pi” por sua vez, contém a taxa com que cada classe aparece no total
amostrado. Esse valor é então tomado, como a probabilidade de ocorrência de um
elemento de cada classe dada, no universo amostral.

Ainda na Tabela 8.2, a coluna “I” contém intervalos fechados de


inteiros positivos, gerados com base nas equações apresentadas na Tabela 8.1,
fazendo-se “NF=1 000 000”.

Por fim, foram gerados 10 000 000 de inteiros aleatórios (entre 1 e


1. 000.000) e verificados contra cada intervalo, retornando o valor apontado em
“vi”, como valor do ponto, e consequentemente indicando a classe em que se
encontrava cada um dos 10.000.000 de eventos gerados.
95

A freqüência de resultados em cada classe foi então levantada,


convertida em taxa de ocorrência, e lançada no gráfico da Figura 8.1.

A Figura 8.2 apresenta o mesmo gráfico comparativo entre uma


dada distribuição observada e sua geração, tendo sido tomados para tal somente
1.000 pontos (valor menor que a própria amostra). Pode-se observar então que há
uma margem maior de erro, mas mesmo assim a distribuição gerada segue muito
de perto aquela pretendida.

Comparativo de distribuição de probabilidades.


(1.000 pontos gerados)
0,25
Probabilidade de ocorrência.

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.

Fig. 8.2 Comparativo de distribuições de freqüências (1.000 pontos).

O conceito apresentado acima para uma variável independente,


denotada genericamente por sua freqüência “f”, pode ainda ser expandido para a
caracterização de indivíduos ou eventos através de “n” variáveis, posto que o valor
retornado para cada classe pode, além de determinar uma característica do ponto
amostral (indivíduo ou evento), conduzir a uma nova distribuição de freqüência,
diferente para cada classe precedente, que por sua vez determine uma nova
característica desse ponto amostral, e assim sucessivamente.
96

8.2.3. A função de retorno de características para distribuições.

A distribuição de probabilidades alvo para uma determinada


variável aleatória, que se deseja reproduzir, muitas vezes se mostra disponível sob
a forma de distribuição de probabilidades, caracterizada por seus parâmetros
específicos (p.e. distribuição normal; x = 67; σ = 35; n = 1000 ) .

Conhecendo-se o tipo de função de distribuição de probabilidades


e suas características, é possível a geração de seqüências aleatórias que
correspondam ou reproduzam, tal distribuição.

Para tanto, deve-se verificar a existência de dois casos:

a) distribuições contínuas: onde o parâmetro gerado, (p.e. altura


de uma pessoa, peso de um animal, etc.) se distribui continuamente em uma faixa
de valores, ou seja, sempre é possível a existência de um ponto amostral
posicionado no intervalo definido por dois outros pontos;

b) distribuições discretas: nas distribuições discretas, um dado


ponto amostral deve necessariamente se ajustar a uma dada classe. Aplica-se para
parâmetros que não variam de forma contínua (p.e. número de habitantes em um
local, aparelhos sanitários por residência, número de acionamentos diários de
aparelhos sanitários, etc.).

A distribuição discreta pode ainda, com erro controlável, servir de


aproximação para uma distribuição contínua, desde que se divida esta em um
número adequado de classes, de modo a proporcionar respostas aceitáveis em
termos de precisão. Por exemplo: o tempo decorrido entre dois acionamentos
97

sucessivos de determinado aparelho sanitário é um parâmetro contínuo, podendo


assumir qualquer valor pertencente a ℜ + , no entanto, se, sob a precisão desejada,
não se verificar erro apreciável na determinação das variáveis dependentes devido
a diferenças de ±1s, pode-se discretizar a distribuição dessa grandeza em classes de
intervalos correspondentes a 1s, uma vez que não haveria diferença sensível, se o
parâmetro correto, por exemplo, mesmo correspondendo a 245,5 s fosse tomado
como 246 s.

De fato, as amostras tomadas no mundo real, seja através de


avaliações manuais (questionários, medidas, etc.) seja através de registradores8.5
(registradores digitais de vazão, registradores de pressão, etc.) são sempre tomadas
de forma discretizada, sendo posteriormente assimiladas a distribuições contínuas.

Diante do exposto, o presente trabalho dará tratamento


discretizado a todas as distribuições de probabilidades, utilizando, algumas vezes,
funções contínuas para a definição da probabilidade de cada classe, na construção
da tabela de intervalos que irá determinar a freqüência gerada.

A implementação desse mecanismo se encontra na biblioteca


“InterClasses.pas”, apresentada na listagem V.2, do Apêndice V.

Conforme explanado no citado Apêndice, esta biblioteca


apresenta as funções necessárias para ler uma dada distribuição de probabilidades
(ou freqüência), e gerar pontos aleatórios segundo tal distribuição.

Na Figura 8.3 vemos a comparação entre uma distribuição

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

censitária real8.6 e uma distribuição gerada pelo método apresentado, distribuída em


classes etárias.

Comparativo entre distribuições de probabilidades.


0,025

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]

Fig. 8.3 Comparativo entre população censitária e população gerada.

Como se pode observar, visualmente há excelente


correspondência entre as mesmas, o que pôde ser confirmado através do teste χ2,
onde se obteve uma probabilidade de 1,00000 para aceitação da hipótese de que as
duas distribuições sejam idênticas.

8.3. Registro de Parâmetros.

Por fim, para que se possa analisar as ocorrências do período de


simulação, suas inter-relações e outros aspectos quantitativos, é necessário que

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

estas sejam registradas.

Com o objetivo de registrar e avaliar grandezas variáveis com o


tempo, desenvolveu-se um componente de software, intitulado “TRegVal”, cujo
código pode ser visto no Apêndice V, que permite o registro de pontos de data,
hora e valor, para tantas variáveis quantas se deseje8.7.

Além de proceder o registro dessas seqüências, os componentes


“TRegVal” executam funções estatísticas básicas e exportam suas seqüências para
planilhas MS-Excel8.8 ou arquivos de texto.

8.4. Operação da Simulação.

Com a disponibilidade das técnicas e ferramentas até aqui


descritas, o Sistema Hidráulico Predial de Distribuição de Água pode ser simulado
através da seguinte seqüência de passos:

a) estabelecimento de um estado inicial, através da geração de


variáveis independentes, posicionamento do “Relógio” em seu momento de
partida, definições iniciais de parâmetros vinculados à rede de distribuição, aos
aparelhos e aos usuários, posicionamento inicial (geralmente em zero) dos
registradores;

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

b) acréscimo de tempo do “Relógio”, em intervalos


determinados, como dias, horas, minutos ou segundos, provocando a geração de
eventos de periodicidade conhecida (dias, horas, minutos ou segundos);

c) resposta aos eventos de tempo gerados, onde se processam os


seguintes mecanismos:

i) geração de variáveis independentes, como: início de utilização


de aparelho, final de utilização de aparelho, vazão a ser utilizada, entrada de
usuário no sistema, saída de usuário do sistema e outras;

ii) estabelecimento de uma nova configuração de solicitação do


sistema de distribuição, através da caracterização de quais aparelhos se encontram
acionados e com qual intensidade;

iii) determinação das vazões reais, pressões disponíveis e outras


variáveis dependentes ligadas ao sistema, estabelecidas para tal padrão de
acionamento;

iv) registro dos parâmetros hidráulicos, populacionais ou


comportamentais de interesse;

d) verificação de término do período de simulação, que, se


positiva, grava ou analisa os registros obtidos, em caso contrário, segue com os
incrementos de tempo tratados pelo item c) acima.

e) análise dos registros, sob os pontos de vista conceitual e


quantitativo, assim como a geração de outros dados de interesse, que não tenham
101

sido coletados diretamente (p.e. a soma do produto obtido entre a vazão de


determinado aparelho e seu tempo de acionamento sob tal vazão, determina o
consumo do aparelho durante o tempo avaliado).

É importante que se observe que, pelo fato do tempo de “Relógio”


da simulação não guardar qualquer tipo de relação com o tempo físico real, os
passos indicados no item c) acima são efetuados como se o tempo houvesse
parado, o que de fato ocorre quanto ao tempo de simulação, onde os passos i) a iv)
como que ocorrem “em um lapso de tempo de duração nula, no interstício entre um
segundo e outro”8.8.

Os capítulos que seguem apresentam a implementação dessa


técnica nos Sistemas Prediais segundo o objeto do presente trabalho.

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

Uma vez que o sistema é ativado por usuários, e serve a esses, é


necessário, para qualquer avaliação quantitativa sobre o mesmo, que se conheça o
número de usuário, assim como sua distribuição na edificação.

Essa simulação populacional pode variar, conforme a


disponibilidade de dados ou a complexidade possível e desejada, desde um
posicionamento estático, como a simples alocação de uma população média ou
máxima, com distribuição uniforme entre as unidades habitacionais, até a geração
automática de variáveis independentes orientada por parâmetros os mais diversos
possíveis, caso em que se tem uma simulação populacional dinâmica.

Quando se utiliza uma simulação populacional dinâmica, deve-se


dispor de ferramentas que, conforme seu grau de complexidade, considerem um
maior ou menor número de fatores que influenciam no número e distribuição de
usuários. Mas, em qualquer caso, tal ferramenta deve ser capaz de gerar, com certa
aleatoriedade, distribuições de características populacionais que possam
corresponder a distribuições esperadas e tidas como parâmetros de entrada para o
cálculo.

Dessa forma, apresenta-se aqui uma possível simulação


populacional aplicável ao caso.

Deve-se ainda advertir que, os dados estatísticos ou estimados


apresentados neste capítulo, com a finalidade de ilustrar as técnicas utilizadas,
provavelmente não são adequados para nenhuma edificação específica, uma vez
103

que vários deles são tomados segundo características regionais ou nacionais, em


épocas divergentes, portanto prejudicando a coerência entre os mesmos e
inviabilizando sua extrapolação, uma vez que dificilmente seriam representativos
de uma classe específica de edificações.

Mesmo diante de tal problema, cuja solução demandaria vários


estudos estatísticos sobre o assunto, tais dados foram utilizados para que o
essencial, ou seja, a demonstração de uma possível dinâmica populacional
simulada em uma edificação, não fosse inviabilizado pela falta dos mesmos, em
especial no que se refere a determinadas características dessa dinâmica, o que
impediria a apreciação do modelo, que pode se mostrar útil se calcado em dados
confiáveis.

9.1. Geração de Distribuições de Características.

As características aleatórias são geradas utilizando-se as técnicas


e componentes de “software” apresentados no Capítulo 8, com base nas tabelas de
dados, considerações e objetos de dados que se seguem.

9.1.1. Objetos de Dados

Para a implementação do modelo proposto no presente trabalho,


se faz necessário a definição, quanto a sua estrutura lógica, de uma série de objetos
de dados, que vão desde o usuário até o edifício como um todo9.1.

9.1
Esse alcance define as fronteiras de sistema para o presente trabalho.
104

Inicialmente, define-se o objeto “pessoa”, como sendo a


representação abstrata de um ser humano, nas características pertinentes a nosso
objetivo.

A título de ilustração, algumas dessas características são: nome


(ou um identificador que permita unicidade de tratamento), data de nascimento,
sexo, estado de gravidez, data prevista para morte, dados, ou objetos de dados, que
descrevam hábitos sanitários e outros que se mostrem importantes no decorrer do
desenvolvimento.

Em um nível lógico (hierárquico) imediatamente superior,


encontra-se o agrupamento desses usuários, aqui denominado “objeto família”.
Esse objeto, além de trazer em si o conjunto de “pessoas”, traz ainda características
comuns a todas essas pessoas, e que não possam variar individualmente, como por
exemplo o número de pessoas, ou algum forte hábito familiar coletivo.

Por sua vez, o objeto “família” se encontra contido no objeto


“economia”, ou “apartamento”, que pode ser definido como sendo o conjunto de
famílias9.2, associado aos dados necessários à descrição das relações dessas
famílias com o imóvel (contratos de aluguel, horas de utilização em imóveis
comerciais, por exemplo). Esse objeto também traz em si um conjunto de objetos
do tipo “domínio” ou “grupo de aparelhos”, que será definido no Capítulo 11, e
traz a descrição física do imóvel, no que se refere aos interesses da presente
análise.

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

Por fim, o objeto “edifício” é definido como sendo um conjunto


de objetos do tipo “apartamento”, contendo ainda elementos comuns a todos os
apartamentos, como os objetos que mantêm o registro de tempo (data e hora),
número de apartamentos e outros.

A Figura 9.1 apresenta um diagrama relacional resumindo o


exposto.

Edifício
1

n
Economia
1

n
Família
1

n
Pessoa

Fig. 9.1 Diagrama relacional para população.

9.2. Ocupação Inicial da Edificação.

Para que se inicie o processo de simulação deve-se partir de uma


dada situação populacional inicial para o edifício.

Para tanto existem duas hipóteses: pode-se partir do edifício todo


vazio, ou seja, ainda inabitado, ou partir-se de uma distribuição populacional
106

inicial estimada.

No presente trabalho optamos pela segunda hipótese, tomando


como referência os parâmetros populacionais, disponíveis na base de dados do
Instituto Brasileiro de Geografia e Estatística – IBGE.

A Tabela 9.1 apresenta um fragmento dessa distribuição, tomada


como diretriz para ilustrar o presente trabalho.

TABELA 9.1 – PESSOAS RESIDENTES EM DOMICÍLIOS PARTICULARES.


ÁREA URBANA, BRASIL, 1991.
Número de componentes das famílias Número de habitantes nessa família
1 pessoa 1.888.941
2 pessoas 11.818.313
3 pessoas 19.621.472
4 pessoas 25.993.598
5 pessoas 21.967.003
6 pessoas 12.844.567
7 pessoas 7.234.429
8 pessoas 4.184.518
9 pessoas 2.420.296
10 pessoas 1.222.265
11 pessoas 643.447
12 pessoas 318.561
13 pessoas 150.897
14 pessoas 63.623
15 pessoas 27.791
16 pessoas 12.831
17 pessoas 5.754
18 pessoas 2.398
19 pessoas 1.950

Fonte: IBGE – Censo demográfico.

Nessa fase, é necessário a imposição de um limite técnico,


referente ao maior número de pessoas que poderia constituir a família a habitar o
apartamento que compõe o edifício sob estudo.
107

Para o exemplo apresentado no Anexo D admitiu-se uma família


máxima de 7 pessoas em um dado apartamento.

Uma vez implantada essa distribuição, resta determinar, para cada


pessoa, seus parâmetros inerentes, em especial idade, sexo e data de morte.

As características, idade e sexo, são determinadas com base na


distribuição levantada pelo IBGE, para o Brasil, no ano de 1996, aqui reproduzida
na Tabela 9.2.

TABELA 9.2 – POPULAÇÃO RESIDENTE. ÁREA URBANA, BRASIL, 1996.


Sexo
Idade Total
Feminino Masculino
Menos de 1 ano 1.142.138 1.182.533 2.324.671
1 ano 1.129.172 1.168.813 2.297.985
2 anos 1.142.039 1.176.336 2.318.375
3 anos 1.153.620 1.188.527 2.342.147
4 anos 1.138.119 1.176.518 2.314.637
5 anos 1.144.050 1.181.179 2.325.229
6 anos 1.190.140 1.223.524 2.413.664
7 anos 1.227.093 1.264.068 2.491.161
8 anos 1.215.473 1.246.789 2.462.262
9 anos 1.234.275 1.256.013 2.490.288
10 anos 1.290.252 1.318.049 2.608.301
11 anos 1.256.972 1.277.425 2.534.397
12 anos 1.278.468 1.283.586 2.562.054
13 anos 1.353.199 1.346.876 2.700.075
14 anos 1.414.088 1.389.868 2.803.956
15 anos 1.378.702 1.341.097 2.719.799
16 anos 1.379.375 1.332.744 2.712.119
17 anos 1.310.827 1.271.858 2.582.685
18 anos 1.292.290 1.250.453 2.542.743
19 anos 1.241.855 1.174.867 2.416.722
20 anos 1.232.458 1.164.137 2.396.595
21 anos 1.190.015 1.130.954 2.320.969
22 anos 1.173.563 1.119.627 2.293.190
23 anos 1.167.038 1.104.596 2.271.634
24 anos 1.132.110 1.072.957 2.205.067
25 anos 1.116.948 1.055.452 2.172.400
26 anos 1.118.979 1.053.937 2.172.916
108

TABELA 9.2 – POPULAÇÃO RESIDENTE. ÁREA URBANA, BRASIL, 1996.


(cont.)
Sexo
Idade Total
Feminino Masculino
27 anos 1.077.902 1.006.542 2.084.444
28 anos 1.048.326 976.809 2.025.135
29 anos 1.048.651 954.633 2.003.284
30 anos 1.112.151 1.029.654 2.141.805
31 anos 1.055.335 958.480 2.013.815
32 anos 1.092.393 998.873 2.091.266
33 anos 1.043.731 956.589 2.000.320
34 anos 977.669 892.940 1.870.609
35 anos 980.019 901.861 1.881.880
36 anos 988.308 906.192 1.894.500
37 anos 911.298 825.153 1.736.451
38 anos 903.907 829.231 1.733.138
39 anos 872.933 797.570 1.670.503
40 anos 885.012 813.932 1.698.944
41 anos 802.030 732.313 1.534.343
42 anos 806.540 761.311 1.567.851
43 anos 732.089 673.292 1.405.381
44 anos 709.291 653.829 1.363.120
45 anos 689.862 645.548 1.335.410
46 anos 672.878 621.392 1.294.270
47 anos 599.074 547.924 1.146.998
48 anos 594.222 543.618 1.137.840
49 anos 568.750 520.234 1.088.984
50 anos 554.659 511.560 1.066.219
51 anos 496.744 454.380 951.124
52 anos 482.864 443.281 926.145
53 anos 459.410 416.765 876.175
54 anos 447.106 398.755 845.861
55 anos 434.402 385.224 819.626
56 anos 454.566 399.945 854.511
57 anos 385.735 335.987 721.722
58 anos 374.340 321.378 695.718
59 anos 376.702 316.750 693.452
60 anos 406.534 339.225 745.759
61 anos 335.237 279.500 614.737
62 anos 327.164 273.706 600.870
63 anos 328.042 269.440 597.482
64 anos 325.203 269.466 594.669
65 anos 333.332 270.509 603.841
66 anos 322.088 255.811 577.899
67 anos 270.097 216.771 486.868
68 anos 255.344 202.601 457.945
69 anos 243.314 193.119 436.433
109

TABELA 9.2 – POPULAÇÃO RESIDENTE. ÁREA URBANA, BRASIL, 1996.


(cont.)
Sexo
Idade Total
Masculino Feminino
70 anos 245.066 190.948 436.014
71 anos 207.449 165.059 372.508
72 anos 200.052 158.269 358.321
73 anos 186.950 144.834 331.784
74 anos 169.643 133.255 302.898
75 anos 159.760 120.133 279.893
76 anos 154.382 112.812 267.194
77 anos 125.526 92.814 218.340
78 anos 119.312 87.048 206.360
79 anos 103.440 72.283 175.723
80 anos 107.852 72.030 179.882
81 anos 90.301 60.470 150.771
82 anos 82.324 54.471 136.795
83 anos 73.515 47.692 121.207
84 anos 66.271 42.511 108.782
85 anos 59.000 37.010 96.010
86 anos 49.558 29.811 79.369
87 anos 32.673 19.834 52.507
88 anos 27.568 16.163 43.731
89 anos 25.712 14.438 40.150
90 anos 23.903 12.170 36.073
91 anos 16.019 8.342 24.361
92 anos 13.096 6.498 19.594
93 anos 10.032 4.927 14.959
94 anos 8.364 4.044 12.408
95 anos 7.762 4.168 11.930
96 anos 6.260 3.652 9.912
97 anos 2.004 843 2.847
98 anos 1.728 718 2.446
99 anos 1.127 459 1.586
100 anos ou mais 3.946 1.948 5.894
Idade ignorada 151.335 141.859 293.194

Fonte: IBGE – Contagem da População.

Como se pode observar, existem duas características


interrelacionadas, uma vez que a distribuição de sexo não é igual para todas as
idades.
110

Assim, deve-se determinar primeiramente aquela com maior


número de classes, no caso a idade, e, a seguir, determinar-se o sexo escolhendo-se
a proporção adequada para a idade. Aqui também aplicou-se limite prático de 100
anos, e desprezou-se as pessoas com idade ignorada.

Uma vez determinada a idade, neste tratamento, esta é registrada


como data de nascimento, posto que tal forma de registro permite novo cálculo da
idade de cada pessoa assim que se deseje, em qualquer data que a simulação
requeira.

Para se proceder essa conversão, uma vez que não se dispõe da


distribuição de nascimentos segundo as épocas dos anos, subtrai-se a idade do ano
correspondente à data inicial da simulação, determinando-se então, a data inicial da
simulação para o ano de nascimento daquela pessoa, a seguir gera-se um número
inteiro aleatório, na faixa de 1 a 365, subtrai-se o mesmo da data então obtida,
obtendo-se, por fim a data de nascimento da pessoa.

Ainda com o valor da idade determinado, determina-se o sexo


correspondente segundo a distribuição aplicável àquela idade.

Uma vez determinados tais dados e posto que todas as projeções


para nascimento de filhos deverão ser iniciadas com valores nulos, resta-nos
determinar, qual a data de falecimento de cada pessoa.

O IBGE nos mostra, na Tabela 9.3, uma distribuição, segundo


sexo e idade, do número de óbitos registrados no Brasil, no ano de 1994.
111

TABELA 9.3 – ÓBITOS OCORRIDO E REGISTRADOS. BRASIL. 1994.


Sexo
Idade Total
Feminino Masculino
0 35.433 47.744 83.177
1 3.583 4.303 7.886
2 1.598 1.820 3.418
3 986 1.280 2.266
4 793 1.050 1.843
5 673 889 1.562
6 581 817 1.398
7 545 812 1.357
8 490 813 1.303
9 457 809 1.266
10 562 830 1.392
11 529 828 1.357
12 593 901 1.494
13 658 1.049 1.707
14 703 1.309 2.012
15 943 2680,2 3.623
16 943 2680,2 3.623
17 943 2680,2 3.623
18 943 2680,2 3.623
19 943 2680,2 3.623
20 1.098 3.892 4.990
21 1.098 3.892 4.990
22 1.098 3.892 4.990
23 1.098 3.892 4.990
24 1.098 3.892 4.990
25 1.335 4.304 5.640
26 1.335 4.304 5.640
27 1.335 4.304 5.640
28 1.335 4.304 5.640
29 1.335 4.304 5.640
30 1.628 4.586 6.214
31 1.628 4.586 6.214
32 1.628 4.586 6.214
33 1.628 4.586 6.214
34 1.628 4.586 6.214
35 2.000 4.844 6.843
36 2.000 4.844 6.843
37 2.000 4.844 6.843
38 2.000 4.844 6.843
39 2.000 4.844 6.843
40 2.440 5.160 7.601
41 2.440 5.160 7.601
42 2.440 5.160 7.601
43 2.440 5.160 7.601
112

TABELA 9.3 – ÓBITOS OCORRIDO E REGISTRADOS. BRASIL. 1994 (cont.)


Sexo
Idade Total
Feminino Masculino
44 2.440 5.160 7.601
45 2.826 5.371 8.197
46 2.826 5.371 8.197
47 2.826 5.371 8.197
48 2.826 5.371 8.197
49 2.826 5.371 8.197
50 3.367 6.070 9.437
51 3.367 6.070 9.437
52 3.367 6.070 9.437
53 3.367 6.070 9.437
54 3.367 6.070 9.437
55 4.259 7.036 11.295
56 4.259 7.036 11.295
57 4.259 7.036 11.295
58 4.259 7.036 11.295
59 4.259 7.036 11.295
60 5.337 8.261 13.598
61 5.337 8.261 13.598
62 5.337 8.261 13.598
63 5.337 8.261 13.598
64 5.337 8.261 13.598
65 6.393 9.291 15.684
66 6.393 9.291 15.684
67 6.393 9.291 15.684
68 6.393 9.291 15.684
69 6.393 9.291 15.684
70 7.039 9.573 16.612
71 7.039 9.573 16.612
72 7.039 9.573 16.612
73 7.039 9.573 16.612
74 7.039 9.573 16.612
75 7.877 9.031 16.909
76 7.877 9.031 16.909
77 7.877 9.031 16.909
78 7.877 9.031 16.909
79 7.877 9.031 16.909
80 7.817 7.505 15.323
81 7.817 7.505 15.323
82 7.817 7.505 15.323
83 7.817 7.505 15.323
84 7.817 7.505 15.323
85 6.104 5.320 11.424
86 6.285 5.121 11.406
87 6.072 4.929 11.001
88 5.759 4.296 10.055
113

TABELA 9.3 – ÓBITOS OCORRIDO E REGISTRADOS. BRASIL. 1994 (cont.)


Sexo
Idade Total
Feminino Masculino
89 5.101 3.425 8.526
90 3.993 2.696 6.689
91 3.306 2.115 5.421
92 2.834 1.800 4.634
93 2.666 1.639 4.305
94 2.009 1.138 3.147
95 1.107 642 1.749
96 958 543 1.501
97 722 350 1.072
98 560 253 813
99 558 616 1.174
100 ou mais 1.061 1.469 2.530

Fonte: IBGE – Registro Civil9.3

De posse dos dados da Tabela 8.5, há de se fazer a determinação,


para cada usuário, de sua “data de falecimento”, ou seja, determinar uma data na
qual este deveria deixar de existir no sistema, simulando seu óbito.

Usando-se técnica semelhante à descrita para a prescrição da data


de nascimento, determina-se a idade na qual esse usuário deve sair do sistema.

De posse desse dado, calcula-se, a data do óbito, avançando um


número aleatório de dias, compreendido entre 1 e 365, a partir de sua data de
aniversário para essa idade.

A utilização desse mecanismo deve então, contemplar duas


hipóteses:

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

a) a determinação dessa data deverá ser feita para um usuário que


adentra o sistema já com alguma idade (pe. ocupação inicial, mudança, etc.). Nesse
caso deve-se tomar somente o segmento da Tabela 9.3, com idades correspondentes
àquelas maiores ou iguais à do usuário no momento da análise; o que espelha bem
o fato de que se tem uma probabilidade nula de óbito em uma idade que já se
superou. Essa abordagem faz com que a idade de nenhum usuário possa
ultrapassar o limite superior da Tabela 9.3 (no caso 100 anos), o que é bastante
razoável, pois se necessita de um limite superior para tal avaliação;

b) a determinação da data deverá ser feita para um usuário nascido


dentro do sistema. Sob essa hipótese, que de fato é caso particular da anterior,
estabelece-se a idade do óbito utilizando-se toda a Tabela 9.3.

9.3. Dinâmica Populacional.

Uma vez determinada a situação inicial, a dinâmica populacional


ocorre, pela verificação e ajuste, a cada dia simulado, de determinadas variáveis de
estado do sistema, que se referem às pessoas.

9.3.1. Óbitos.

A cada dia verifica-se se é chegada a data de óbito de cada


usuário. Ao chegar tal data esse é eliminado do sistema, e as variáveis necessárias
são ajustadas para espelhar o novo estado.
115

9.3.2. Nascimentos.

Os nascimentos são processados tendo como base a Tabela 9.4.

TABELA 9.4 - NASCIDOS VIVOS OCORRIDOS E REGISTRADOS - 1994


Sexo Probabil. de
Idade da mãe no parto Número de
Total ser mãe
[anos] Feminino Masculino mulheres9.4
[%]
15 13.085 13.622 26.707 1.378.702 1,94
16 28.558 29.977 58.535 1.379.375 4,24
17 44.887 46.322 91.209 1.310.827 6,96
18 58.425 61.528 119.953 1.292.290 9,28
19 67.267 70.664 137.931 1.241.855 11,11
20 74.642 77.993 152.635 1.232.458 12,38
21 73.940 78.028 151.968 1.190.015 12,77
22 76.087 79.626 155.713 1.173.563 13,27
23 77.861 80.907 158.768 1.167.038 13,60
24 74.405 77.613 152.018 1.132.110 13,43
25 69.960 72.887 142.847 1.116.948 12,79
26 67.193 70.377 137.570 1.118.979 12,29
27 63.510 65.297 128.807 1.077.902 11,95
28 60.092 63.321 123.413 1.048.326 11,77
29 53.212 55.342 108.554 1.048.651 10,35
30 50.441 52.143 102.584 1.112.151 9,22
31 40.360 41.702 82.062 1.055.335 7,78
32 36.105 37.579 73.684 1.092.393 6,75
33 30.618 31.896 62.514 1.043.731 5,99
34 26.921 27.846 54.767 977.669 5,60
35 21.719 22.201 43.920 980.019 4,48
36 18.593 19.108 37.701 988.308 3,81
37 15.139 15.658 30.797 911.298 3,38
38 12.777 13.277 26.054 903.907 2,88
39 9.945 10.259 20.204 872.933 2,31
40 7.931 8.195 16.126 885.012 1,82
41 5.274 5.210 10.484 802.030 1,31
42 4.304 4.334 8.638 806.540 1,07
43 2.804 2.891 5.695 732.089 0,78

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

TABELA 9.4 - NASCIDOS VIVOS OCORRIDOS E REGISTRADOS – 1994


(cont)
Sexo Probabil. de
Idade da mãe no parto Número de
Total ser mãe
[anos] Feminino Masculino mulheres
[%]
44 1.832 1.885 3.717 709.291 0,52
45 1.071 1.152 2.223 689.862 0,32
46 615 668 1.283 672.878 0,19
47 400 385 785 599.074 0,13
48 288 272 560 594.222 0,09
49 177 183 360 568.750 0,06

FONTE: IBGE - Registro Civil.

De posse dos dados da Tabela 9.4, em especial da coluna


denominada “probabilidade de ser mãe” (psm), procede-se a simulação dos
nascimentos, de maneira um pouco diversa das anteriores, uma vez que não se trata
mais de posicionar um indivíduo em determinada classe, mas verificar se
determinado evento (no caso “ser mãe”) ocorrerá com o mesmo em sua idade atual.

Para tanto, determina-se, somente para os indivíduos do sexo


feminino, a cada data de aniversário, se haverá geração de filho por aquela pessoa
na dada idade.

Tal determinação é feita não pelo componente “TListaIntervalos”,


como explanado no Capítulo 8, mas diretamente, através da geração um número
aleatório na faixa de 1 a 10.000, e, para a respectiva faixa de idade em que se dá a
verificação, assinalando como positiva a ocorrência de maternidade caso o número
gerado esteja no intervalo entre 1 e 10 000.psm, caso contrário não haverá
maternidade daquele indivíduo com a dada idade.

A seguir, para os casos positivos, determina-se a data do


nascimento do novo indivíduo, fazendo-se uma projeção aleatória de dias, na faixa
117

entre 1 e 365, a partir da data de aniversário da mãe.

Conjuntamente com esse procedimento, acionado diariamente


(segundo o “Relógio” da simulação), verifica-se se há alguma data de “parto” que
se cumpre no dia indicado. Em caso positivo, procede-se a inclusão de um novo
usuário no sistema, determinando-se sua data de nascimento como aquela já
prevista, sua data de óbito, como explanado acima, e seu sexo, sendo que essa
última característica pode ser tomada pela simples geração aleatória com
distribuição de 50% para cada classe (gerando números inteiros na faixa de 1 a 2),
dado que não existe diferença significativa entre as taxas de nascimentos segundo o
sexo do recém nascido.

Também é necessário observar que, segundo a Tabela 9.4, as


mulheres só podem se tornar mães na faixa etária de 15 a 49 anos, o que não
corresponde essencialmente à verdade, mas, para tal simulação, este intervalo deve
estar confinado, ainda porque não há estatísticas detalhadas disponíveis para outras
faixas etárias, e as probabilidades de maternidade apresentam valores muito baixos
quando fora da faixa apresentada.

9.3.3. Entrada e saída de famílias no edifício.

Nesse tópico, são abordados os fatores de dinâmica populacional


relacionados à entrada e saída, por mudança, de famílias no edifício.

Primeiramente é necessário esclarecer que o presente trabalho


considera que uma família tenha um dentre dois tipos possíveis de vínculo com o
apartamento: pode haver um vínculo de propriedade ou um vínculo contratual de
118

posse e uso (aluguel, cessão, comodato, etc.) aqui genericamente denominado


aluguel.

Para qualquer um dos casos, deve-se determinar o momento da


entrada de uma família, e o momento de sua saída.

Esses momentos podem ser determinados com base em alguns


parâmetros básicos, como:

• a curva de distribuição do tempo de permanência no imóvel;


• a curva de distribuição do tempo de rehabitação do mesmo;
• a relação entre imóveis próprios e alugados para a
determinação da natureza do vínculo família-imóvel, e,
portanto, sob qual das curvas prever a desocupação e a
reocupação de cada unidade.

9.3.3.1. Tipo de vínculo com o imóvel.

Para a determinação do tipo de vínculo com o imóvel, pode-se


utilizar os dados da Tabela 9.5, almejando-se uma distribuição similar àquelas
adotadas anteriormente:
119

TABELA 9.5 - DOMICÍLIOS PARTICULARES PERMANENTES - 1991


Condição de ocupação
Moradores Próprio Não próprio9.5
Número [%] Número [%]
1 1.039.717 59,06 720.794 40,94
2 2.643.604 64,42 1.459.895 35,58
3 3.411.401 65,94 1.761.978 34,06
4 4.150.306 71,70 1.638.383 28,30
5 3.145.961 75,13 1.041.206 24,87
6 1.716.234 77,17 507.834 22,83
7 931.536 79,07 246.521 20,93
8 521.085 80,51 126.113 19,49
9 294.938 81,32 67.729 18,68
10 153.197 82,45 32.614 17,55

FONTE: IBGE - Censo Demográfico

De posse dos dados da Tabela 9.5, a geração do vínculo jurídico é


feita de forma análoga àquela apresentada para a determinação do sexo, após
conhecida a idade; de tal forma que aqui se determina o vínculo jurídico, após
conhecido o número de ocupantes da economia.

9.3.3.2. Tempo de permanência no imóvel.

Uma vez que não há, de forma organizada e amplamente


divulgada, estatísticas sobre o tempo de permanência de uma família em um
imóvel, neste tópico, limita-se a indicar a oportunidade de que se tome tal
parâmetro em consideração, e, portanto, se busque os dados necessários para sua
correta caracterização.

Com o objetivo principal de não ter a linha de trabalho


interrompida por falta de dados estatísticos, e também buscando uma certa

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

distância do formalismo matemático genérico, pois traria uma repetição inoportuna


de boa parte da teoria estatística, passa-se a tecer algumas suposições sobre tais
dados.

Acompanhando o pensar de MEYER, (1995), segundo a qual: “o


importante é, naturalmente, que se devemos supor alguma coisa a fim de
elaborarmos nosso modelo matemático, devemos admitir aquilo que seja plausível,
em lugar daquilo que seja menos plausível”, passamos a determinar os premissas
que dão base, ainda que de maneira deficiente, a tais suposições.

Em consulta informal a pessoas ligadas ao setor imobiliário,


determinou-se como razoável, a suposição de que o tempo de ocupação de imóveis
se situa em torno das seguintes médias:

• imóveis próprios: 10 anos;


• imóveis alugados: 2 anos.

No entanto, sabe-se que existem infinitas distribuições de


freqüência que apresentam tais média, de modo que, para o objetivo aqui proposto,
há pouco proveito em tais dados, a não ser, talvez, a orientação de valores
arbitrados que permitam prosseguir com a presente explanação, ao menos em
termos qualitativos.

Prosseguindo nesta linha, e tentando supor algo plausível, pode-se


levantar as seguintes hipóteses sobre tal distribuição de freqüências:

a) a distribuição de freqüências poderá ser assimétrica, positiva ou


negativa, conforme as leis de mercado vigentes, uma vez que há uma tendência
121

maior de saídas tardias (à direita da moda) sob contexto inflacionário, quando os


aluguéis perdem muito seu valor real, ou em épocas que apresentam menor oferta
de imóveis para locação, quando a troca de imóvel acarreta uma alta de preços no
aluguel. Por outro lado, em contexto estabilizado e com forte oferta de imóveis, o
valor modal sofre maior aproximação do prazo contratual, uma vez que, às vezes, é
possível uma troca para um imóvel melhor, com o mesmo custo. Por sua vez, o
número de saídas anteriores ao prazo contratual tende a ser pequeno devido a
multas contratuais ou taxas e transtornos ligados a uma nova locação; para o caso
dos imóveis próprios, onde não há a referência do prazo contratual, um modelo
plausível seria a curva assimétrica negativa (moda à direita da média), provocada
pelos transtornos de mudança, investimentos iniciais e tempo de pagamento de
financiamentos;

b) a probabilidade para que o imóvel seja desocupado de imediato


é pequena mas, tecnicamente, não nula, uma vez que há registro de diversos casos
de nesse sentido;

c) os prazos médios de permanência são diferentes para os casos


de imóvel alugado e próprio, sendo menores para aqueles e maiores para estes.

Desse modo, passamos a admitir, na seqüência, que tais


distribuições estariam bem caracterizadas através de uma função de densidade de
probabilidades do tipo Gama, cujas características principais estão descritas no
Apêndice VI, uma vez que, pela correta seleção de parâmetros é possível ajustar a
curva a uma série de situações possíveis.

A Figura 9.2 apresenta uma possível distribuição de


probabilidades para tempo de permanência em imóveis alugados, com prazo
122

contratual de 365 dias (1 ano).

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]

Fig. 9.2 Exemplo de curva de probabilidade para tempo de permanência em imóvel


alugado.

Uma vez que a distribuição Gama tem sua cauda direita


assintótica ao eixo das classes, também nesse caso há a necessidade de estabelecer
um limite técnico, ou seja, acima do qual nenhuma família permaneceria no
imóvel. Tal limite é estabelecido como sendo um número muito grande em
comparação com a média (p.e. 100 vezes a média).

9.3.3.3. Tempo de reocupação do imóvel.

Assim como o tópico anterior, também não há a disponibilidade


dos dados estatísticos mínimos necessários à simulação desse parâmetro. Contudo,
o SECOVI-SP informa que o IVL (índice de velocidade de locação) para a cidade
de São Paulo, se encontra no momento com valor médio de 3 meses.

Também aqui cabem algumas considerações genéricas:

a) pode-se esperar uma distribuição de freqüências assimétrica


negativa (com a moda localizada à direita da média), uma vez que há um tempo
inicial onde se faz alguma melhoria ou conservação no imóvel, negociações entre a
123

administradora e o proprietário e ainda um tempo necessário para que se inicie, e


surta efeito, o trabalho de “marketing” (anúncios, ação de corretores, etc..) ;

b) a probabilidade para que o imóvel seja reocupado de imediato é


pequena mas não tecnicamente nula, pois existem muitos relatos de casos onde a
unidade já se encontra realocada mesmo antes que seus ocupantes a deixem,
restando apenas alguns dias de desocupação para ajustes físicos na mesma;

c) essa distribuição pode ser semelhante àquela referente a uma


unidade própria, no caso de venda e não de locação, diferindo, obviamente, quanto
aos valores médios do tempo de reocupação;

Para tanto, utilizamo-nos, com valores e parâmetros diversos, da


mesma distribuição Gama apresentada no Apêndice VI.

Um exemplo de simulação populacional utilizando as premissas


aqui apresentadas pode ser visto no Anexo D.
124

10 SIMULAÇÃO DE ACIONAMENTO DOS APARELHOS

Uma vez introduzidas as técnicas de simulação do comportamento


hidráulico da rede de distribuição de água, e da população, com o número e
localização de cada usuário, resta ainda, para que se complete o modelo, descrever
as técnicas de simulação da atuação dos aparelhos, e a forma com que os usuários
interagem com estes. O presente capítulo trata, portanto, da simulação da atuação
dos aparelhos, sendo as características de dependência estatística da interação
usuário-aparelho, tratada no Capítulo 10.

Seguindo a linha até aqui exposta, ou seja, determinar-se o estado


de todo o sistema a cada instante de tempo simulado, a simulação da atuação dos
aparelhos deve informar, a cada instante, para cada aparelho, qual o coeficiente de
descarga que o mesmo apresenta, segundo seu intervalo de “0” (fechado), até
“Cdmáx” (completamente aberto).

Para que se possa gerar tal informação, bastante simples, é


necessário que a abstração computacional encarregada de simular aparelhos possa
manipular corretamente informações relativas ao tipo de aparelho (como
apresentado no Capítulo 4), além de algumas informações relativas à forma com
que o usuário age sobre tal aparelho.

É necessário ainda, em alguns tipos de aparelho, que, em nível


mais interno, a abstração aparelho (na seqüência tratada somente como aparelho)
possa manipular as informações necessárias para a correta simulação de seus
ciclos.
125

10.1. Atuação do Usuário sobre o Aparelho.

Para a caracterização do atuar do usuário sobre o aparelho é


necessário conhecer:

a) o instante de acionamento;
b) o tempo de duração desse acionamento;
c) a vazão determinada pelo usuário

Conforme visto no Capítulo 4, nem todos os tipos de aparelhos


utilizarão todos, ou algum, dos parâmetros relacionados, mas alguns tipos
utilizarão ao menos um destes, razão pela qual é necessária sua determinação.

10.1.1. Caracterização do instante de acionamento do aparelho.

Para o caso de aparelhos acionados sob comando do usuário,


define-se instante de acionamento do aparelho, o momento em que o mesmo entra
em operação, tomado em um determinado período cíclico de interesse, por
exemplo, 24 horas.

Não são comuns na literatura, levantamentos específicos de


instantes de acionamentos de aparelhos, mas sim de freqüência horária de
acionamentos, ou ainda, de percentagem horária de números de acionamentos,
como o caso da Figura 10.1 (ILHA, 1991).
126

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

Os dados apresentados na Figura 10.1, não são diretamente


utilizáveis como curva de densidade de probabilidades que permita determinar o
padrão de geração aleatória do instante de acionamento do aparelho, uma vez que,
se assim se procedesse, jamais haveria chance alguma de, por exemplo, termos um
acionamento do chuveiro às 12 horas, fato que, de senso comum, mesmo que
ocorra com pequena probabilidade se tomado um padrão como o apresentado na
Figura 10.1, tem probabilidade de ocorrência não nula.

Dessa forma, passamos a considerar os dados da Figura 10.1 sob a


ótica dos números nebulosos, o que leva a afirmativas como: “cerca de 23% dos
usos de chuveiro ocorrem por volta das 6:00 horas”.

Como se observa, as expressões: “cerca de” e “por volta das”


introduzem um grau de incerteza nos dados da Figura 10.1, que podem melhor
associa-los ao comportamento de pessoas.

Dentre as várias formas possíveis de representar um número


nebuloso, optou-se, para o presente caso, na utilização de uma curva de
127

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.

Aplicando-se tal enfoque sobre a Figura 10.1, gera-se a Figura


10.2.

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.

Dois aspectos devem ser destacados na Figura 10.2:

a) a probabilidade de acionamento, em cada momento, é a soma


das 24 distribuições de probabilidades consideradas, uma vez que o evento, em
qualquer momento, pode ser gerado pelo usuário de qualquer horário, atrasado,
adiantado ou no horário correto; a soma dessas probabilidades pode ser vista na
Figura 10.3, que corresponde à densidade de probabilidades utilizada para o dia da

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;

b) a Figura apresenta uma extensão para as horas de 24 a 26 (de


fato 0 a 2 horas do dia seguinte), para que se observe que existe um
“espalhamento” das características, especialmente das últimas horas do dia, para as
primeiras horas do dia seguinte.

A soma das probabilidades pode ser vista na Figura 10.3.

5
Percentagem

0
0 2 4 6 8 10 12 14 16 18 20 22 24 26

Horas do dia

Fig. 10.3 Curva de densidade de probabilidades (em %) para acionamento de


chuveiros.

A curva apresentada na Figura 10.3 apresenta área correspondente


a 100%, no entanto, não corresponde a 24 horas, parte dessa área se encontra
“espalhada” até as primeiras horas do dia seguinte.

Para contornar tal inconveniente, uma vez que o objetivo


perseguido é a distribuição de probabilidades em um único dia, fez-se a geração
contínua de 5 dias de distribuição de probabilidades, tomando-se o 3o. dia como
típico. A Figura 10.4 apresenta a distribuição de probabilidades para os 5 dias,
129

considerando-se uma utilização por 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)

Fig. 10.4 Probabilidades de acionamento do chuveiro – 5 dias – 1 uso por dia.

A Figura 10.5 apresenta o terceiro dia (entre 48 e 72 horas na


Figura 10.4), tomado como dia típico.

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

Fig. 10.5 Probabilidades de acionamento do chuveiro.

Pode-se observar na Figura 10.5 a presença de uma pequena área


130

entre 0h e 1h, correspondente à probabilidade do evento originalmente tomado em


um dia ocorrer nas primeiras horas do dia seguinte.

Devido ao fato da distribuição do primeiro dia ser diferente das


demais, e da área total da Figura 10.4 corresponder à probabilidade de 500% (5
dias a 100%), a área da Figura 10.5 é ligeiramente diferente de 100%, o que não
provoca erro, uma vez que a área deve ser ajustada ao número médio diário de
utilizações do aparelho por usuário.

Essa correção pode ser efetuada aplicando-se o fator de escala


“F”, da equação 10.1 a cada valor de abcissa da Figura 10.5.

Número de usos diários por pessoa


F= (10.1)
Área da Figura 10.5

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

Fig. 10.6 Probabilidade de acionamento do chuveiro – 1,5 usos/pessoa.dia.

Com os valores da curva apresentada na Figura 10.6 para cada


aparelho, o sistema verifica, de segundo a segundo, para cada usuário, se o mesmo
131

deseja acionar cada um dos aparelhos10.2. Essa verificação é feita através da


geração de um número aleatório, na faixa de 0 a 1, conduzindo a resposta positiva
de acionamento sempre que o número gerado for menor ou igual à probabilidade
de acionamento no intervalo de 1 segundo considerado.

10.1.2. Caracterização do tempo de acionamento.

Para o caso dos aparelhos que não têm seu momento de


fechamento controlados por volumes próprios ou ciclos automáticos, mas por
vontade do usuário, é necessário ter caracterizado a distribuição de probabilidades
para o tempo de acionamento, ou seja, para o lapso de tempo decorrido entre o
acionamento e a parada do mesmo.

Recorrendo-se à mesma fonte anterior (ILHA-1991), observa-se,


para o chuveiro, aqui tomado como exemplo, a distribuição de freqüência em
função das faixas de tempo de acionamento, ou tempo de duração de uso, são
apresentadas na Figura 10.7, correspondendo a uma média de 465 s com desvio
padrão de 359 s.

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]

Fig. 10.7 Duração de uso do chuveiro (ILHA, 1991).

Como não existe tempo de duração de uso inferior a 0 (zero) e


através da observação da distribuição esboçada na Figura 10.7 optou-se por utilizar
a distribuição tipo Gama para a caracterização da curva de densidade de
probabilidades de tempo de acionamento. Para os valores acima apresentados
pode-se ver a correspondente distribuição Gama na Figura 10.8.

0,20
probabilidade [%]

0,15

0,10

0,05

0,00
0

1000

1200

1400

1600

1800

2000
200

400

600

800

Tempo de utilização [s]

Fig. 10.8 Probabilidades para tempo de acionamento de chuveiro.

A distribuição gama utilizada se ajusta bem ao proposto, embora


não exatamente, como pode ser observado através da Figura 10.9, que traz uma
recomposição, da Figura 10.7 através da utilização da distribuição gama
apresentada.
133

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

Tempo de utilização [s]

Fig. 10.9 Probabilidade de acionamento de chuveiro – histograma.

Como se pode observar, as freqüências observadas (Figura 10.8) e


geradas (Figura 10.9) não coincidem exatamente, de fato, sob um teste χ2,
apresentam uma correspondência com significância igual a 34%.

Este fato chama a atenção para a necessidade de um tratamento


especial, uma vez que não há de fato, acionamento de chuveiros com tempos
inferiores a 41 s, ou algo próximo disto, como verificado. Tal tratamento consiste
no deslocamento da curva de probabilidades, ao longo do eixo dos tempos, no
sentido crescente, em cerca de 40 s. Como pode ser observado na Figura 10.10.
0,20
probabilidade [%]

0,15

0,10

0,05

0,00
0

200

400

600

800

1000

1200

1400

1600

1800

2000

Tempo de utilização [s]

Fig. 10.10 Duração de acionamento para chuveiro – Gama – transladada.


134

Essa nova curva de distribuição de probabilidades gera o


histograma apresentado na Figura 10.11, que, sob um teste χ2, apresenta
concordância com os dados observados por ILHA (1991), com nível de
significância superior a 95%, razão pela qual será utilizada na simulação aqui
apresentada.

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

Tempo de utilização [s]

Fig. 10.11 Probabilidade de acionamento de chuveiro sob distribuição Gama


transladada – histograma.

10.1.3. Caracterização da vazão de utilização.

Como discorrido no Capítulo 4, cada aparelho apresenta uma


curva vazão x pressão, característica.

Para os aparelhos que permitem a regulagem, por parte do


usuário, da vazão desejada, esse processo é feito através da variação do coeficiente
de descarga (Cd), entre o valor nulo (aparelho fechado) e o valor máximo (Cdmáx).

Dessa forma, conforme a disponibilidade de pressão na entrada do


aparelho, o usuário posicionará a regulagem do mesmo na vazão desejada,
135

permitindo o estabelecimento de um valor de coeficiente de descarga, que pode ser


calculado pela equação 10.2, originada da equação 4.2.

Qdes
Cd = α
(10.2)
H disp

onde: Qdes - vazão desejada pelo usuário;


Hdisp - altura de carga hidráulica disponível na entrada;
Cd - coeficiente de descarga selecionado;
α - expoente característico do aparelho;

Como a altura de carga disponível é fornecida pelo estado do


sistema, segundo a avaliação da rede apresentada no Capítulo 6, e o expoente “α” é
característico do aparelho sob análise, deve-se determinar o valor da vazão
desejada, para que se possa estabelecer o valor do coeficiente de descarga
selecionado pelo usuário.

Deve-se ainda observar que este coeficiente de descarga é


limitado ao seu valor máximo (Cdmáx), característico do aparelho, dessa forma,
deverá ser admitido que, caso a vazão desejada pelo usuário conduza a valores de
“Cd” superiores a “Cdmáx”, este último será tomado como estabelecido, e, caso se
julgue conveniente, tal situação poderá ser anotada como situação de não
conformidade no registro de parâmetros da simulação.

Mantendo-se a seqüência do apresentado acima, na Figura 10.12


se encontra a distribuição de freqüências para os valores de vazão de chuveiro
observados em ILHA (1991), com valor médio de 0,106 L/s e desvio padrão de
0,02 L/s.
136

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]

Fig. 10.12 Vazão para chuveiro (ILHA, 1991).

Qualquer uma das técnicas de simulação para distribuições vistas


até aqui pode ser utilizada para a determinação das vazões de acionamento. A
escolha de uma dentre as diversas técnicas depende do perfil escolhido como
“típico” ou “modelo”.

Para o caso do perfil da Figura 10.12, tem-se a peculiaridade de


do mesmo apresentar duas modas, na segunda e na sexta faixa de vazões
observadas.

Uma distribuição bi-modal tem dois picos, e indica que as


probabilidades estão divididas em duas faixas: alta e baixa. Uma distribuição bi-
modal implica na existência de duas populações em sua classe (INTERGRADE,
2001).

Pelo exposto acima, não se pode afirmar qual a natureza dessas


distribuições, ou seja, se são normais, gama, Poison, ou outra qualquer. Também
não se pode afirmar que se trata de somente duas distribuições, mas seria mais
137

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.

Há ainda muita incerteza sobre tais características, uma vez que,


para um número grande de usuários pesquisados, pode haver, de fato, muitas
populações diferentes, com número de usuários diferentes e vazões preferenciais
diferentes.

Para exemplificar o exposto, a análise da distribuição de vazões


da Figura 10.12 será feita através de duas técnicas, das mais simples dentre as
inúmeras possíveis:

a) como composição de duas distribuições normais centradas cada


qual em um dos picos apresentados.

Para que se posicionem dessa forma, as médias das distribuições


devem ser: q1 = 0,070 e q 2 = 0,1195 L / s .

Como a distribuição gerada deve, no mínimo, manter a média do


perfil original, é necessário determinar-se a contribuição percentual de cada uma
dessas populações, o que pode ser feito pelas equações 10.3.a e 10.3.b.

 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

onde: P1 – tamanho da população 1;


P2 – tamanho da população 2;
P – população global;
q1 - vazão média da população 1;
q 2 - vazão média da população P2;
q - vazão média global.

Aplicando-se os dados da Figura 10.2, e fazendo-se P=100%,


tem-se: P1 = 27,27% e P2 = 73,73% .

O desvio padrão de cada uma das distribuições deve ser ajustado


de forma a fazer com que, um histograma colhido a partir dessa distribuição ajuste-
se da melhor forma possível ao histograma correspondente à distribuição original
(Figura 10.12). No presente caso, os desvios de cada uma das distribuições normais
são: σ 1 = 0,0185 e σ 2 = 0,0075 .

A distribuição assim formada pode ser vista na Figura 10.13.

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]

Fig. 10.13 Vazão do chuveiro como distribuição bi-modal normal.

Ainda que apresentando um aspecto razoável, uma média


139

correspondente à distribuição original, e um desvio padrão de 0,024, comparado


com 0,021 da distribuição original, sob um teste χ2 apresenta somente 30,2 % de
similaridade com a mesma.

b) como composição de sete distribuições normais centradas cada


qual em uma das classes do histograma observado.

Tal abordagem é um tanto semelhante àquela assumida


anteriormente para a determinação do horário de acionamento, diferindo desta por
não apresentar enfoque em números nebulosos, e, portanto, estabelecerá o desvio
padrão da distribuição normal correspondente a cada classe, de forma que esta
contenha, ou não, a mesma proporção de população da respectiva classe na
distribuição inicial.

Assim, de forma semelhante à alínea (a), acima, a Tabela 10.1


apresenta, para cada faixa de distribuição, sua média e sua percentagem de
participação na formação da distribuição total. Esses valores garantem, então, que a
média da distribuição esperada corresponderá àquela da distribuição observada.

TABELA 10.1 – CLASSES DE VAZÃO OBSERVADAS PARA CHUVEIRO


Classe – Distribuição qi percentagem
0,000 – 0,051 0,0255 0,00
0,051 – 0,064 0,0575 4,12
0,064 – 0,076 0,0700 12,38
0,076 – 0 088 0,0820 6,26
0,088 – 0,101 0,0945 8,25
0,101 – 0,113 0,1070 14,52
0,113 – 0,126 0,1195 43,26
0,126 – 0,139 0,1323 11,21
0,139 – 0,250 0,1945 0,00

Para o propósito aqui descrito, ou seja, obter uma curva de


140

densidade de probabilidades que possa simular o comportamento de usuários


quanto à escolha de vazões, são possíveis algumas considerações quanto ao desvio
padrão a ser utilizado em cada classe.

Inicialmente, pode-se utilizar o desvio padrão correspondente a


1/4 da amplitude da classe, o que corresponderia a uma curva normal referente a
cada classe, mantendo, dentro dos limites da mesma, cerca de 99,997% de sua
população.

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]

Fig. 10.14 Ajuste multimodal para vazão de chuveiro - σ = 1/4 da amplitude de


classe.

Apesar de apresentar resultado de 99,985 % no teste de correlação


χ2, comparada em forma de histograma contra a correlação observada, é possível
notar que a curva não apresenta um aspecto natural, ou seja, apresenta pequenas
depressões entre picos de vazão, o que é pouco aceitável, em detrimento de uma
curva mais suave, que espelhe melhor a tendência geral ao lado da tendência local
de cada classe.

Uma curva elaborada com desvio padrão de cada distribuição de


classe tomado como 1/2,5 da amplitude de classe, apesar de apresentar uma
correspondência χ2 de cerca de 86,14%, ou seja, significativamente abaixo da
141

anterior, apresenta um perfil mais aceitável, do ponto de vista de uma análise


subjetiva pelo projetista, como pode ser visto na Figura 10.15.

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]

Fig. 10.15 Ajuste multimodal para vazão de chuveiro - σ = 1/2,5 da amplitude de


classe.

Desvios padrão maiores levam a curvas mais suaves e menos


correlacionadas à distribuição inicial, no entanto, ao utilizarmos desvios padrão
menores, obtemos melhor correspondência à distribuição observada, mas curvas de
aspecto pouco natural.

10.2. Considerações sobre a Escolha da Distribuição.

Sendo este o último tópico do presente trabalho a se ocupar da


simulação de distribuições observadas, deve-se expressar algumas considerações
sobre a escolha das distribuições a serem utilizadas para cada caso.

Dentre tantas possíveis considerações sobre o assunto destacam-


142

se:

a) deve-se conhecer profundamente a forma com que foi


executada a coleta de dados e a precisão desejada, ou seja, não é possível, a
princípio, obter precisão, na geração de números aleatórios, maior que aquela
contida nos dados disponíveis. Apesar de ser aceitável não há elementos que
possam afirmar que, no caso apresentado no item 10.1.3, dentro de cada classe, a
distribuição seja de fato normal.

b) as distribuições multimodais, e mesmo aquelas que não o são,


podem ser resultado do somatório de várias distribuições representativas de hábitos
diferentes relacionados com sexo, idade, e similares. Para modelos de simulação o
fato desses dados se encontrarem separados pode ser útil, uma vez que, como visto
no Capítulo 9, pode-se tratar os usuários de forma diferenciada em função de
características particulares, sendo portanto melhor trabalhá-las separadamente
aplicadas a cada grupo específico;

c) como sugestão para estudo posterior, é provável que seja


possível a substituição das distribuições compostas apresentadas acima por curvas
de outra natureza, que não distribuições estatísticas (como por exemplo splines),
uma vez que existem limites técnicos, especialmente quanto à vazão, que varia
entre 0 (zero) e a máxima possível para o aparelho totalmente aberto submetido à
máxima pressão. Dessa forma não há necessidade da curva ser assintótica.

Muitas outras técnicas podem ser utilizadas para gerar os “eventos


aleatórios”, tomados como variáveis independentes do processo de simulação aqui
apresentado, com resultados mais ou menos adequados ao processo global.
143

As rotinas computacionais que geraram as distribuições


apresentadas fazem parte da biblioteca “EstatFunc.pas”, apresentada no Apêndice
VI.

10.3. Simulação dos Ciclos de Operação dos Aparelhos.

Cada tipo de aparelho, conforme definido no Capítulo 4, segundo


seu modo de operação, deve ter um tratamento específico, uma vez que, na
simulação, são passados ao mesmo os parâmetros obtidos conforme o item 10.1,
cabendo a cada um deles, e não ao usuário, prosseguir no controle do ciclo durante
o tempo em que estiver acionado, até seu final de operação.

É necessário ainda que se defina previamente dois estados a serem


utilizados:

a) aparelho fechado: é o estado em que não há vazão circulando


no mesmo, ou seja, “Cd=0”;

b) aparelho parado: é o caso em que o ciclo operacional se


encerrou, ou seja, o aparelho está disponível para novo acionamento.

Os eventos que levam a esses dois estados coincidem na maioria


dos casos mas não são idênticos, especialmente no caso de aparelhos controlados
por ciclos automáticos, onde pode ocorrer fechamento diversas vezes durante o
ciclo de operação. Já o final do ciclo de operação implica, necessariamente, em
fechamento.
144

10.3.1. Aparelhos de operação em presença do usuário:

Para a simulação desse tipo de aparelho é necessário que o mesmo


mantenha dois registradores internos: um para a duração programada do
acionamento (TempoDurAcion) e outro para o tempo decorrido desde o
acionamento (TempoDecorr).

Ao iniciar a operação, o registro de “TempoDurAcion” é


posicionado com valores obtidos como descrito no item 10.2.2, e “TempoDecorr”
com valor nulo. O usuário é notificado para bloquear-se, ou seja, não é possível
para o mesmo usuário acionar outro aparelho10.3.

A cada intervalo de tempo simulado (i.e. a cada segundo


simulado), o aparelho é notificado a acrescentar um segundo a “TempoDecorr”,
promovendo sua parada de operação quando os dois registradores apresentarem
valores iguais.

10.3.2. Aparelhos de acionamento pelo usuário e parada automática.

Para essa classe de aparelhos, que geralmente têm sua parada


vinculada ao preenchimento de algum volume interno fixo, define-se também dois
registros: “VolLimite”, que é característico do aparelho, fixado durante a definição
deste, e “VolEscoado”, feito nulo no início da operação.

A cada notificação de transcurso de tempo, recebida do relógio de

10.3
Os aspectos de bloqueio de usuário e de aparelhos são discutidos no Capítulo
11.
145

tempo simulado, “VolEscoado” é acrescido do produto tempo x vazão, ou seja, o


volume escoado durante o intervalo de tempo transcorrido. Quando os volumes se
igualem, ou o volume escoado ultrapasse o volume limite10.4, é efetuada a parada
de operação.

Esse tipo de aparelho não provoca bloqueio de usuário.

10.3.3. Aparelhos de acionamento pelo usuário e parada após ciclo

automático.

Para esse tipo de aparelho é necessário a implementação de


rotinas específicas, que podem estar encapsuladas ao objeto aparelho, para o caso
de se utilizar linguagem de programação orientada a objeto.

Aqui também não há bloqueio do usuário, mas pode haver a


necessidade de chamar-lhe a atenção, bloqueando-o por algum tempo em alguma
fase do ciclo; este caso não se apresenta em aparelhos domésticos comuns.

10.3.4. Aparelhos de acionamento por ação indireta do usuário ou ambiente.

Para a simulação desse aparelho é necessário a existência de um


objeto acessório (interno ou externo ao próprio aparelho) que designaria seu início
e parada de operação, atuando conjuntamente com o mesmo.

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

Poderíamos ter como exemplos de tais objetos acessórios:

• sifão de um mictório, que levando em conta seu volume, o


volume e pH de urina ali depositado, e o volume e pH da água
escoado quando da operação do aparelho a ele vinculado10.5,
determinaria o acionamento e a parada do fluxo de água;

• a terra de um jardim ou floreira, para o caso de irrigadores


acionados por detetores de umidade, que operariam com
princípio similar aos sifões apresentados acima.

Muitos outros exemplos poderiam ser apresentados, quase


nenhum deles aplicáveis ao contexto residencial. Valem apenas as citações para
que, caso haja interesse futuro, se estendam os presentes conceitos a ambientes
comerciais, públicos, industriais, de saúde ou outros.

10.3.5. Aparelhos de acionamento e parada automáticos.

Neste caso, onde o acionamento e parada são determinados por


horários pré determinados, a simulação do aparelho deve prever uma lista de
horários de acionamento (“ListaHorAcion”) e uma lista de horários de parada
(“ListaHorPar”), contendo os horários de início e fim de operação. Esses registros
podem ser simplesmente horas, data-hora ou dia da semana-hora, uma vez que o
relógio de simulação do sistema pode informar todos esses parâmetros.

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

O controle deve ser feito através de um registro interno ao


aparelho, de tempo absoluto, copiado do relógio de simulação no início do
processo, e incrementado de 1 segundo sincronamente ao mesmo, verificando, a
cada acréscimo, se há necessidade de acionar ou parar o aparelho.

Acessoriamente, aos registros de momentos de partida e parada,


poderia ser agregado um registro de vazões desejadas, mas este expediente não é
comum nos aparelhos temporizados domésticos reais.

10.3.6. Aparelhos de operação contínua.

Para essa classe de aparelhos não há necessidade de simulação


como aparelho, basta que se acrescente sua equação de descarga de forma
apropriada na simulação da rede de distribuição.

No entanto, caso se deseje simular o mesmo como aparelho, para


que se mantenha a coerência e elegância global do modelo, estabelece-se o
coeficiente de descarga do mesmo no início da operação, não se efetuando nenhum
tipo de verificação durante seu ciclo.

Se, por algum motivo, se fizer necessário simular a existência de


vazamento na rede, pode-se assemelhar o mesmo a um aparelho dessa natureza.
148

11 ACESSO DOS USUÁRIOS AOS APARELHOS.

Os métodos mais comuns utilizados para a avaliação das


probabilidades de acionamento de aparelhos em edificações, não consideram, de
forma direta, as diversas situações de dependência estatística existentes no
contexto dos edifícios residenciais.

Alguns deles trazem tais considerações embutidas em tempos


característicos, como o tempo de acionamento e o intervalo entre acionamentos,
que posteriormente geram probabilidades de determinado aparelho estar ou não
acionado, sendo, na seqüência, tratadas tais probabilidades como dados
estatisticamente independentes.

De fato, esses métodos são adequados à medida em que o


conjunto de dados referentes aos tempos característicos tenha sido coletado em
situações onde tal dependência estatística estivesse presente, contendo, portanto,
sua influência.

No entanto, como será visto a seguir, a influência dessa


dependência estatística depende de uma série de fatores, (por exemplo a relação
entre a população, o número e a distribuição dos aparelhos) que tornam tais dados
de tempos mais específicos, em algumas situações, do que poderia ser desejado.

11.1. Restrições de Utilização de Aparelhos.

De forma diversa daquela apontada por alguns tipos de análise, a


149

independência estatística de operação dos aparelhos sanitários em uma edificação


não se verifica especialmente pelos seguintes motivos:

• restrições de acesso por direito de utilização;


• restrições de acesso por disposição física;
• usos associados.

11.1.1. Restrições de direito de utilização.

São as restrições de utilização vinculadas ao fato de que nem


todos os aparelhos sanitários do sistema estão disponíveis a todos os usuários,
mesmo que estejam fora de uso, ou seja, parados.

Essa restrição ocorre devido à divisão (conceitual e física) do


sistema em unidades autônomas, cada qual com seus aparelhos acessíveis apenas a
um pequeno grupo. O caso mais comum dessa situação está nas edificações multi-
familiares, onde os aparelhos de determinado apartamento não estão acessíveis aos
demais moradores da edificação.

Além desses aparelhos, que podem ser chamados como “de


acesso familiar”, ainda podem existir duas outras classes: os aparelhos “de acesso
irrestrito”, aos quais todos os moradores podem ter acesso, como aqueles
instalados nas áreas comuns; e aqueles “de acesso restrito”, aos quais somente uma
pessoa, ou grupo de pessoas pode ter acesso, sendo que esse grupo não coincide
necessariamente com os habitantes de uma unidade habitacional. É o caso, por
exemplo, de banheiros privativos em apartamentos de médio e grande porte, ou
certas torneiras de jardim de áreas comuns acessíveis apenas por pessoal de
150

manutenção.

A Figura 11.1 ilustra essa classificação.

familiar

Direitos de acesso restrito

irrestrito

Fig. 11.1 Classes de acesso a aparelhos sanitários quanto ao direito de uso.

Assim, para a simulação, é necessário que exista um mecanismo


de controle que considere o direito de acesso de cada usuário a cada aparelho. Tal
necessidade é suprida através de listas de aparelhos acessíveis, desenvolvidas para
cada usuário.

11.1.2. Restrições de acesso por disposição física.

Os aparelhos sanitários presentes em uma edificação residencial


se encontram agrupados em ambientes. A natureza e conteúdo desses
agrupamentos depende de fatores arquitetônicos, culturais ou mesmo temporais
(modismos) que fogem aos objetivos do presente trabalho.

O fato de estarem agrupados em ambientes definidos (cômodos),


pode criar uma dependência de bloqueio de uso entre os mesmos, especialmente no
caso dos banheiros residenciais onde, via de regra, ao se utilizar um único
aparelho, fecha-se o banheiro, bloqueando-se também o acesso aos demais
151

aparelhos ali contidos, que permanecem parados.

Já tal fato não ocorre, por exemplo, na cozinha, ou na área de


serviço, uma vez que seus aparelhos não exigem privacidade de utilização.

Portanto, nos mecanismos de simulação apresentados, é


necessário que se agrupe os aparelhos em grupos de bloqueio mútuo, segundo
essas características de disposição física dos mesmos.

A Figura 11.2 ilustra essa relação de direito de acesso, na forma


de um diagrama de contenção (Diagrama de Venn).

Grupo de
Prédio Aparelhos

Apartamento Usuário

Aposentos pessoais

Fig. 11.2 Diagrama de contenção de aparelhos e usuários no prédio.

Definindo-se como recursos os grupos de aparelhos, e como


domínios as áreas que contêm recursos e usuários (aposentos pessoais,
apartamentos, prédio), a regra para confecção e leitura do diagrama apresentado na
Figura 11.2 é única: um recurso somente se faz acessível a determinado usuário se
o domínio mais restrito que o contém for igual àquele que contém o usuário ou
contém este (o domínio).

Para facilidade de interpretação, e como, na prática, não há


152

usuário que tenha aceso somente a determinado aparelho de um grupo de bloqueio,


sem ter acesso a outro, os grupos de aparelhos para efeito de direitos de acesso são
definidos coincidentemente com os grupos de bloqueio mútuo.

11.1.3. Uso associado.

Para que o cenário de dependência de utilização se complete é


necessário levar em consideração a existência de grupos de aparelhos que, por forte
hábito cultural ou higiênico, têm utilização seqüencial.

Um exemplo comum dessa situação ocorre na utilização do


lavatório após o uso da bacia sanitária. Deve-se observar que a utilização do
lavatório após a utilização da bacia sanitária não é uma legítima e independente
ocorrência de necessidade de uso de lavatório, mas uma decorrência do uso da
bacia sanitária, este sim gerado diretamente pela necessidade do usuário.

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.

Caso se deseje mais precisão no modelo, deve-se trabalhar não


com seqüências de acionamento absolutas, mas com probabilidades diferenciadas
de acionamento para determinado aparelho quando estão em seqüência, ou ainda
com probabilidades de quebra de seqüência.

Esta abordagem se faz necessária uma vez que não são todos os
153

usuários que seguem as seqüências estabelecidas, dependendo as mesmas,


principalmente de hábitos pessoais, como mostrado por MURAKAWA et. alli,
(2000), onde se percebe acentuada quebra da seqüência bacia sanitária – lavatório
(ou mictório – lavatório) nos banheiros masculinos, com forte manutenção das
mesmas nos banheiros femininos.

11.2. Fluxo de Acesso de Usuários aos Aparelhos.

Para o bom andamento do mecanismo de simulação, é necessário


que se defina uma série de procedimentos a serem adotados no processo de
atendimento da necessidade do usuário a cada tipo de aparelho, a forma com que
aquele se vincula a este, e como esse vínculo desaparece após o uso.

De forma esquemática, o núcleo desse procedimento de requisição


e distribuição de aparelhos pode ser visto na Figura 11.3.

Processo Gerador
de necessidades.

Despachante

Fig. 11.3 Núcleo do sistema de requisição e distribuição de aparelhos.

O núcleo do sistema de requisição e distribuição de aparelhos é


154

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.1. Geração da necessidade do usuário.

Esse processo, que visa simular a geração de necessidade de uso,


consiste em lançar as verificação aleatória, segundo as distribuições de instante de
acionamento de aparelho, para cada elemento de uma matriz usuário x tipo de
aparelho, existente no sistema.

Esse enfoque, embora simplificado, uma vez que não pode


discernir sobre situações como, por exemplo, crianças pequenas acionando tanques
de lavar roupas, se mostra aceitável no momento, posto que não há disponibilidade
de dados estatísticos mais apurados sobre o acionamento de aparelhos segundo
perfis pessoais de usuários. No entanto, pode perfeitamente ser aperfeiçoado, se
utilizado sobre uma matriz usuário x tipos de aparelhos, na qual conste como “tipo
de aparelho” apenas aqueles para os quais o usuário em questão se encontra
habilitado.

O processo gerador, dessa forma, segue o seguinte “pseudo-


código”:
155

a. para cada usuário


a.1.1. se não está bloqueado11.1
a.1.1.1. até que se gere alguma necessidade ou esgote a lista de tipos de
aparelhos
a.1.1.1.1. seleciona um novo tipo de aparelho
a.1.1.1.2. verifica se será utilizado gerando evento como
apresentado no Capítulo 10.
a.1.1.1.3. se foi gerada a necessidade põe usuário na fila.

11.2.2. Fila

O elemento “fila” consiste na implementação de uma estrutura de


dados do tipo “first in first out – FIFO”, sem travamento, ou seja, o usuário sempre
entra na fila pelo final (cauda) e é atendido pelo início (cabeça), caso não haja
condições de atender determinado usuário, situação que será vista no item 11.2.3, o
processo de atendimento volta-se para o próximo da fila, percorrendo-a até o final,
mantendo os usuários não atendidos como prioritários para a próxima verificação,
mas não impedindo que o processo continue, atendendo outros usuários, mesmo
que usuários prioritariamente posicionados não possam ser atendidos.

11.2.3. Despachante.

O “despachante” é o processo que atua como o “consumidor” dos


itens postos na fila.

De fato, o “despachante” não atende às necessidades dos usuários,


o elemento que o faz é o aparelho. O despachante atende a fila, promovendo a

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

ligação aparelho usuário, dando-se início ao atendimento de usuário. O final do


atendimento ao usuário é gerenciado pelo próprio aparelho.

O processo despachante atua segundo o seguinte “pseudo-


código”:

b. aponta para o primeiro da fila


b.1. até processar o último da fila
b.1.1. para cada grupo ao qual o usuário tenha direito de acesso
b.1.1.1. se o grupo estiver livre
b.1.1.1.1. se há aparelho adequado para a necessidade do usuário
b.1.1.1.1.i. atende: inicializa a relação aparelho usuário e passa
o controle para o aparelho;
b.1.1.1.1.ii. retira o usuário da fila
b.1.2. segue para o próximo usuário

Sob tal mecanismo é possível simular o processo de acesso do


usuário a cada aparelhos.

11.3. Outros Aspectos do Acesso a Aparelhos.

No núcleo do distribuição ainda podem ser implementados


registradores, do tipo “TRegVal”, apresentados anteriormente, que permitem
registrar os tempos de permanência na fila, assim como determinar o comprimento
máximo de cada fila para cada necessidade em cada domínio11.2, o que seria de
grande utilidade para o dimensionamento do número de aparelhos, especialmente
em sistemas de atendimento público.

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

É necessário ainda que se aponte alguns pontos indefinidos pelo


modelo até aqui apresentado11.3, mas que podem ser implementados como
aperfeiçoamento:

a) a distância de acesso ao aparelho sanitário. Esse ponto diz


respeito à disposição, do usuário a se deslocar acima de determinada distância para
ser atendido (p.e. sair de seu apartamento para utilizar banheiros do térreo).
Aparentemente tal comportamento depende de três fatores: a distância e
dificuldade desses deslocamento, o tempo de espera pela liberação de aparelho no
domínio mais próximo desse usuário, a intensidade e urgência dessa necessidade;

b) os tempos de indisponibilidade sem acionamento dos


aparelhos: não há inclusão, no modelo apresentado, dos tempos em que os grupos
de aparelhos ficam bloqueados (especialmente banheiros) sem que exista ao menos
um aparelho do grupo em operação. Tal elemento, a princípio, não parece relevante
no comportamento hidráulico da rede, mas sem dúvida é relevante, para a
avaliação da eficiência dos atendimentos e comprimentos de filas de espera.

c) acionamentos indiretos de aparelhos: quando o usuário para o


qual surge a necessidade não é o mesmo que aciona o aparelho. Essa situação,
comum quando da presença de bebês ou pessoas doentes (acamados ou
inválidos11.4), devem considerar o bloqueio de dois usuários devido a uma única
necessidade e um único aparelho em uso.

Como se observa no Capítulo 13, espera-se que estes pontos de

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

Utilizando-se dos métodos e ferramentas apresentados nos


capítulos anteriores, construiu-se uma simulação, para uma edificação hipotética,
composta de 28 apartamentos, distribuídos em 7 pavimentos (4 aptos. por pvto.).

Cada apartamento, considerado uma "economia", conta com um


único banheiro, contendo chuveiro elétrico, lavatório e bacia sanitária com caixa;
uma cozinha com pia e uma área de serviços com tanque de lavar roupas e
maquina de lavar roupas automática

Para tal aplicação foi elaborado um traçado da rede de


distribuição, com diâmetros calculados através da NBR5626/98, limitando-se a
velocidade máxima em 3,0 m/s, sem verificações previas de perdas de carga.

Os ramais H1 (cozinha e área de serviços) e H2 (banheiro) podem


ser vistos na Figura 12.1, já com a numeração de componentes utilizada no
processo de cálculo.

Fig. 12.1 Esquema isométrico dos ramais.


160

Nas figuras 12.2 e 12.3 podem ser vistos os esquemas de


distribuição de água para os pavimentos, implementado através de 8 colunas, que
partem de um único barrilete ramificado, tendo como suprimento um reservatório
elevado.

Fig. 12.2 Barrilete.

Fig. 12.3 Colunas de distribuição.


161

O sistema hidráulico apresentado foi simulado utilizando-se, entre


outras, as seguintes premissas:

a) rede hidráulica: cálculo das perdas de carga através da fórmula


universal; tubulação de PVC soldável; água a 20°C; coeficientes de descarga
determinados por ensaio (ver Anexo E);

b) usuários: população conforme Capítulo 9; vazões e tempos de


acionamento obtidos de ILHA, 199112.1;

12.1. Análise de resultados

Uma vez implementado para simulação, conforme os detalhes


descritos acima e no Anexo E, o mesmo foi executado, gerando uma serie de dados
dos quais se obteve, dentre outras, as seguintes analises.

12.1.1. Vazões na saída do Reservatório

A Figura 12.4 apresenta a vazão de saída do reservatório, ou seja,


a vazão total do sistema durante a simulaçã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

Fig. 12.4 Vazão de saída do reservatório.

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.

A integração dessa curva fornece o consumo no período: cerca de


29,2 m3, para um total de 122 habitantes, ou seja, cerca de 258 L/hab.dia, valor
bastante elevado por razões apresentadas adiante.

12.1.2. Vazões nos Aparelhos.

Durante a simulação foram registrados a vazão, a cada minuto,


dos 168 aparelhos presentes no sistema, gerando um total de 242.088 pontos de
dados. Diante disso, escolheu-se um dos aparelhos para alvo de algumas
considerações. Essa escolha recai sobre os chuveiros por dois motivos: é um
aparelho que pode ser considerado como crítico para efeito de desconforto de
usuário quando em mau funcionamento e também pelo fato de estar apresentando
vazão [m3/s] vazão [m3/s] vazão [m3/s] vazão [m3/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

14:00:00 14:00:00 14:00:00 14:00:00

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

Fig. 12.5 Vazão em chuveiros.


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

vazão [m3/s] vazão [m3/s] vazão [m3/s] vazão [m3/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
apartamentos do 1o. andar e para os 4 localizados no 7o. andar.

10:00:00 10:00:00 10:00:00 10:00:00


11:00:00 11:00:00 11:00:00 11:00:00
consumo de água exagerado na simulação, como se verá a seguir.

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 4
Apartamento 2

14:00:00 14:00:00 14:00:00 14:00:00

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

Como pode ser observado as vazões nos chuveiros localizados no


1o. pavimento (aptos 1 a 4), atingem valores próximos a 5 vezes aquelas
verificadas nos chuveiros posicionados no 7o. pavimento (25 a 28).

Tal efeito, que constitui uma distorção12.2 na presente simulação,


ocorre pelas seguintes razões:

• os coeficiente de descarga dos chuveiros foi determinado em


uma unidade desprovida de obturador em sua entrada, ou seja,
em configuração adequada para os pavimentos mais altos, não
para aqueles mais baixos;

• os dados de vazões desejadas pelo usuário, tomados de ILHA,


(1991), foram obtidos, no trabalho original, a partir de
sistemas de duchas com aquecimento central, e não chuveiros
elétricos, portanto sem a presença de uma forte relação
limitante entre vazão e temperatura, como ocorre com
chuveiros elétricos. Portanto, seria de fato, desconfortável, ao
menos para a temperatura ambiente considerada (20°C), a
utilização de vazões elevadas como verificadas nos
apartamentos mais baixos12.3;

Tal conjunto de considerações, especialmente a última


apresentada, leva a concluir que uma vez que a vazão de água nos chuveiros

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

depende da temperatura ambiente, da temperatura preferida ou aceita para o banho,


e da potência do chuveiro, tais valores deveriam integrar o sistema de simulação
como variáveis de entrada (independentes), utilizando-se para tanto suas
distribuições específicas.

12.1.3. Vazão na entrada dos ramais.

Novamente devido à grande quantidade de dados e análise


possíveis, toma-se, como representativos, os gráficos de vazão de entrada x tempo,
nos ramais H-1 e H-2, tomados no último e no primeiro apartamento da edificação,
como pode ser visto na Figura 12.6.

Ramal H-1 - Apartamento 1 Ramal H-1 - Apartamento 28

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

Ramal H-2 - Apartamento 1 Ramal H-2 - Apartamento 28

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

Fig. 12.6 Vazão na entrada dos ramais.

Tais vazões, que assim como no caso dos chuveiros apresentam-se


maiores nos pavimentos inferiores por duas razões: a) nos ramais H-2, provocado
pelos chuveiros, conforme explanado acima; b) nos ramais H-1, tal efeito é
provocado pela máquina de lavar roupas, cuja vazão não é ajustável pelo usuário,
assumindo coeficiente de descarga fixo quando seu ciclo requer entrada de água.
166

Uma possível conclusão com base nos valores apresentados,


decorre do fato de que, como a máxima vazão observada no ramal H1 é cerca de
5,8 x 10-4 m3/s, o que corresponderia a uma velocidade de 1,58 m/s, para o tubo
DN 25 que constitui a entrada do ramal, causaria, em um tubo DN 20, uma
velocidade de 2,6 m/s, perfeitamente aceitável, os diâmetros de tubulação dos
ramais H-1 poderiam ser alterados, para DN20, ao menos nos 5 pavimentos
inferiores, e processada novamente a simulação verificando as conseqüências de tal
alteração.

Esse processo, que já se constituiria na utilização efetiva do


modelo proposto, não e aqui apresentado, mas não constitui grande dificuldade
caso se deseje efetivar a continuação do presente exemplo até sua completa
otimização.

12.2. Conclusão do Exemplo.

Um número muito elevado de dados é gerado durante o processo


de simulação12.5, de tal forma que uma análise apurada dos mesmos, por meios
convencionais (i.e. transformação em gráficos para análises visuais, pesquisa de
máximos e mínimos, etc.), constitui tarefa árdua e sujeita a erros.

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

Diante disso, deve ser necessário a implementação de rotinas e


programas computacionais que, integrados ou não ao programa simulador de
sistema, procedam a busca automática dos pontos de alavancagem.
168

13 CONCLUSÃO

Com o presente trabalho fica confirmada a viabilidade e

oportunidade do uso de técnicas de modelagem que permitam a simulação da

operação real de sistemas prediais de distribuição de água, a fim de determinar,

previamente, o comportamento do sistema sob a ação do usuário, assim como do

comportamento apresentado pelo usuário diante do sistema.

Ainda que, a cada implementação específica da presente

metodologia, as técnicas e detalhes utilizados para a simulação de cada elemento

envolvido possam variar, mantém-se sempre o conceito fundamental, ou seja, pelo

registro sistemático da simulação das ações dos usuários e das reações dos sistemas

a essas ações, seguido da posterior comparação de tais registros com critérios ou

padrões de desempenho, é possível optar-se por uma dentre várias configurações

de sistema de distribuição de água, assim como proceder o ajuste de diversos de

seus elementos a fim de otimizar a solução.

O presente trabalho contribui ainda pela apresentação de diversas

técnica de simulação computacional passíveis de aplicação, tanto no âmbito dos

sistemas hidráulicos prediais de distribuição de água, como de outros sistemas

prediais, no desenvolvimento de ferramentas de ajuste e verificação de

dimensionamento a critérios de desempenho e auxílio à opção por configuração a

ser adotada.

Quanto a resultados específicos, permite-se ainda uma série de


169

considerações e comentários finais, além daqueles já feitos no decorrer do trabalho:

• o modelo apresentado mostra-se viável, em termos conceituais

e estruturais, assim como viáveis se mostram as técnicas de

implementação adotadas;

• o modelo se apresenta capaz de avaliar conseqüências de

configuração que não seriam detectáveis através dos métodos

mais comuns de dimensionamento, como é o caso do consumo

excessivo para os chuveiros apresentado no Capítulo 12.

• os conceitos e fundamentos da metodologia apresentada

podem ser aplicados a outros sistema prediais, à medida de sua

similaridade, com os sistemas prediais de distribuição de água

fria, no que se refere a elementos como: usuários, redes,

bloqueios, prioridades, entre outros.

• o presente modelo pode ser aplicado a outras tipologias de

edificação, bastando, para tal, o ajuste dos dados estatísticos

referentes à população e aos hábitos de usuários de forma a

representar suas realidades;

• o método de cálculo de redes sob vazões reais, apresentada

nos capítulos 5 e 6, se mostra útil para outras avaliações de

redes hidráulicas, mesmo que desvinculadas de processos de

simulação, como redes de incêndio por hidrantes ou chuveiros


170

automáticos, sistemas de recalque simples ou com derivações,

redes públicas de distribuição de água e outras;

Para um maior sucesso e aplicação prática da metodologia

apresentada, no entanto, seria conveniente a elaboração de estudos adicionais,

especialmente com vistas a:

• reduzir a escassez de dados necessários ao processo de

simulação, especialmente levantamentos demográficos

específicos para cada tipologia de edifício considerado, uma

vez que há grande variação, por exemplo, entre classes sociais,

nas curvas de distribuição estatística de número de habitantes

por unidade habitacional, taxas de natalidade, mortalidade, e

outros dados representativos de características e preferências

dos usuários. Tal objetivo pode ser atingido através da

efetivação de uma ampla coleta de dados sobre população e

hábitos de usuários, quanto ao uso de aparelhos hidro-

sanitários, caracterizando assim suas preferências quanto a

horário de acionamento e vazões de utilização, segundo faixas

de renda, classes sociais, classes culturais, dias da semana,

feriados e seus prolongamentos, época do ano, fatores

climáticos e outros que podem ser controlados pelo processo

de simulação, permitindo um tratamento mais refinado da

questão;
171

• criar um banco de dados, ao menos no nível nacional, com

dados técnicos de aparelhos e componentes, em especial dados

hidráulicos e de ciclo de operação de aparelhos sanitários, para

que pudesse ser minimizada a escassez de dados técnicos

específicos, uma vez que poucos fabricantes fornecem dados

necessários ao processo de simulação, como coeficientes de

descarga, descrição de ciclos de operação e similares. No

entanto, para o caso dos aparelhos tais dados poderiam ser

levantados em laboratório;

• desenvolver uma interface interativa para o sistema proposto,

permitindo assim uma maior praticidade de aplicação da

metodologia apresentada, prestando-se mais a aplicações em

projetos que aquela implementada para o exemplo do Capítulo

12, que prestou-se somente ao objetivo de validar o modelo;

• efetuar a inclusão, no processo de simulação, de vários outros

efeitos como, por exemplo, presença de transitórios, tempo de

espera por aparelhos, preferência de usuários por

determinados aparelhos, relações entre modelo de aparelho e

hábito do usuário para tal aparelho, dentre outros;

• aumentar a velocidade de execução da simulação, com a

utilização de algoritmos de maior eficiência, processamento

distribuído ou paralelo ou mesmo utilizando

supercomputadores. Embora tal inconveniente possa se

apresentar como temporário, dada a escalada de aumento de


172

velocidade e queda de custos que se observa nos sistemas de

processamento de dados, sempre deverá ser considerado, uma

vez que, pela introdução de diversos outros elementos no

processo de simulação, como características mais precisas

sobre o usuário ou análise de parâmetros hidráulicos mais

complexos, assim como pela necessidade de registro de maior

número de grandezas, para comparação com padrões de

desempenho mais elevados, sempre se caminha no sentido do

consumo total de qualquer capacidade computacional

oferecida;

• criação de ferramentas específicas para auxiliar na análise dos

resultados, uma vez que os mesmos são gerados em grande

quantidade, implementando-se mecanismos que permitam,

automaticamente, buscar os pontos favoráveis ou

desfavoráveis, pela comparação dos padrões de desempenho

almejados com os conjuntos de resultados obtidos;

• elaborar, utilizando os conceitos, ferramentas e estruturas

apresentadas, simulações específicas quanto a outros

parâmetros do sistema e outras necessidades do usuário, como

por exemplo: custos diretos, custos indiretos, tempo médio

entre falhas, custos de manutenção e similares;

Espera-se assim, não somente pelo desenvolvimento do presente

trabalho, mas também pelo seu aperfeiçoamento através dos pontos apresentados

acima, proporcionar colaboração para um melhor conhecimento e desenvolvimento


173

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

Este Anexo contém a descrição de alguns componentes utilizados


nas redes de distribuição de água em edifícios que abrigam múltiplas economias.

Essa descrição não se encontra completa, e nem poderia estar, mas


traz apenas as propriedades que se fizeram necessárias para exemplos ou
desenvolvimentos apresentados neste trabalho.

A.1. Perdas de Carga.

A perda de carga nos tubos e conexões é apresentada sob duas


fórmulas de cálculo:

a) para cálculo das perdas de carga unitárias para escoamentos


hidraulicamente lisos é utilizada, a princípio, a fórmula da NBR 5626/98, que pode
ser vista na equação A.1, com as perdas calculadas pela equação A.2.

J = 8,63 × 10 6 ⋅ Q1,75 ⋅ d − 4,75 (A.1.)

∆H = J⋅L (A.2.)

onde: J - Perda de carga unitária [kPa/m];


Q - vazão [L/s];
d - diâmetro interno da tubulação [mm]
175

L - comprimento (real ou equivalente) [m];


∆ H - perda de carga [kPa].

b) para casos genéricos recomenda-se a utilização da Fórmula


Universal (Darcy-Weisbach), apresentada na equação A.3, com coeficiente de
atrito avaliado segundo o item A.1.1.

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

onde: ∆H – perda de carga [kPa];


f – fator de atrito;
L – comprimento total do trecho ou peça avaliada [m];
d – diâmetro interno [m];
V – velocidade média do escoamento [m/s];
ρ - massa específica do líquido [kg/m3];
Q – vazão [L/s].

A adoção das unidades de medida aqui apresentadas se faz por


três motivos: serem unidades SI ou aceitas pelo SI (INMETRO, 2000), guardarem
coerência com a NBR5626/98 e permitirem um condicionamento adequado de
sistemas de equações, uma vez que os valores de pressão e vazão, usualmente
encontrados nas redes de distribuição prediais, assumem valores numéricos de
ordem de grandeza mais próxima que aqueles que se obtém quando se usa medidas
176

tomadas em m3/s e mH2OA.1..

A.1.1. Determinação do fator de atrito (f) para a Fórmula Universal.

Mesmo apresentando resultados melhores em casos mais


genéricos, a utilização da Fórmula Universal esbarra, em termos de complexidade,
na determinação do coeficiente de atrito (f).

Inúmeros trabalhos, como relatado em PORTO (1998), SOUZA et


alli (1991) e FOX e MCDONALD (1998), têm sido elaborados no sentido de
proporcionar técnicas e fórmulas que permitam a determinação desse coeficiente.

Dentre esses, apresenta-se a seguir as linhas principais de três


desses trabalhos: o trabalho de Moody, por sua tradição e pioneirismo, o trabalho
de Souza, por sua generalidade e aplicabilidade computacional e o trabalho de
Swamee por sua simplicidade e aplicabilidade computacional.

Primeiramente, para a consideração desses três trabalhos, deve-se


estabelecer que os problemas práticos envolvendo equações de perdas de carga
podem ser, apresentados sob uma das quatro formulações da Tabela A.1. (SOUZA
et alli., 1991).

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

TABELA A.1. – FORMULAÇÕES PARA PROBLEMAS QUE ENVOLVAM


PERDAS DE CARGAS.
Tipo Dados Disponíveis Incógnita.
F1 Q;d;L; k;ν;g ∆H
F2 ∆H;L;d;k;ν;g Q
F3 Q;∆H;L;k;ν;g d
F4 V;∆H;L;k;ν;g d
onde: ∆H – perda de carga; L – comprimento; d – diâmetro; k – rugosidade
absoluta; ν - viscosidade cinemática; Q – vazão.

a) Moody.

Apresentado por Lewis Ferry Moody (1880-1953), em sua forma


final no ano de 1944, o conhecido gráfico em forma de diagrama de Stanton, com
eixos em graduação logarítmica, trazendo o fator de atrito (f), em função no
k
Número de Reynolds (Re), para diversos valores de rugosidade relativa ( ε = )
d
pode ser visto na Figura A.1.

Fig. A.1. Ábaco de Moody (Fonte: FOX e MCDONALD, 1998)


178

Através do ábaco de Moody, determina-se diretamente o valor do


coeficiente de atrito (f), conhecidos o Número de Reynolds (Re) e o valor da
rugosidade relativa, o que é bastante prático para os problemas do tipo F1,
exigindo, no entanto, uma série de iterações, quando da solução de problemas dos
demais tipos apresentados na Tabela A.1.

Outra limitação do ábaco de Moody é o fato de não haver


definição, ou mesmo indicação, sobre o fator de atrito na chamada “região crítica”,
correspondente à transição entre regimes de escoamento.

Ainda há de se considerar que, se por um lado a abordagem


gráfica resulta em processo prático para cálculos manuais, inviabiliza o cálculo
automatizado, uma vez que não é possível a programação direta de gráficos.

b) Souza

Uma das primeira abordagens analíticas do problema, em termos


sistematizados na literatura nacional, voltada para implementação computacional, e
que apresenta solução direta para as quatro classes de problema apresentados na
Tabela A1, pode ser encontrada em SOUZA et alli (1991).

Dessa abordagem, que consiste em determinar, a partir de valores


adimensionais adequados, qual o regime de escoamento presente (laminar,
turbulento liso, turbulento rugoso, turbulento misto ou regime crítico de transição),
determinando-se o valor do coeficiente de atrito (f), com base nos adimensionais
utilizados e na formulação adequada para cada regime.

Observa-se ainda que, para o caso do regime crítico, os autores


179

(SOUZA et alli, 1991) procedem a uma interpolação, utilizando polinômios de


Hermite, entre o final do regime laminar e o início do regime turbulento misto (no
sentido crescente do número de Reynolds). No entanto, como essa abordagem pode
provocar uma pequena descontinuidade da curva (Re x f), optou-se, no presente
trabalho, por determinar o ponto final do polinômio interpolador, como sendo
aquele inicial da curva descritora do regime de escoamento que realmente se inicia
após o regime crítico, que pode ser qualquer um dos três tipos de regime
turbulento. Fluxogramas para a solução dos quatro casos apresentados na Tabela
A.1, adaptado a partir de SOUZA et alli (1991), podem ser visto nas figuras A.2. a
A.5.

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

As equações constantes das figuras A.2. a A.5. foram adaptadas


de SOUZA et alli. (1991) de modo a adequarem-se à utilização das unidades SI A.2.
(INMETRO, 2000).

Tal formulação, no entanto, apresenta uma acentuada divergência,


para a zona de transição de regimes, quando se procura inverter a avaliação de
perda de carga, processada segundo a Figura A.2, buscando-se reconstituir a vazão
ou o diâmetro originais (formulação das figuras A.3 e A.4 respectivamente).

c) Swamee.

Mais recentemente, em 1993, Prabhata K. Swamee, propos nova


fórmula para determinação do coeficiente de atrito para problemas do tipo “F1”,
aqui apresentada na equação A.4. (PORTO, 1998).

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

Tal fórmula apresenta resultados excelentes, segundo PORTO


(1998), comparativamente ao ábaco de Moody.

Para os problemas do tipo “F2”, ou seja, nos quais se deseja


determinar a vazão, dispondo-se do valor da perda de carga e demais parâmetros

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

físicos, utiliza-se a equação A.5A.3..

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

Para os problemas do tipo “F3”, ou seja, nos quais se deseja


determinar o diâmetro, dispondo-se do valor da vazão e perda de carga, além dos
demais parâmetros físicos, utiliza-se a equação A.6.A.3.

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 ⋅ π ⋅ν ν

Para os problemas do tipo “F4”, ou seja, nos quais se deseja


determinar o diâmetro, dispondo-se do valor da perda de carga, da velocidade

A.3.
Anotações da disciplina PHD-5012 – Tópicos complementares de Hidráulica I
– aula de 17/03/1998.
185

média e demais parâmetros físicos, utiliza-se a equação A.7. A.3.

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

Assim como no processo anterior, todas as equações (A.4 a A7)


foram adaptadas para utilizarem exclusivamente unidades S.I. (ver nota A.2)

Pelo fato de se tratar de simples equações, e não de peça gráfica


ou mesmo de processo com diversos elementos de controle, a implementação
computacional da Fórmula Universal, através do proposto por Swamee, só não é
possível como também bastante simples.

No entanto, essa não deverá ser a forma utilizada pelo presente


trabalho, uma vez que as equações propostas, mesmo sendo funções contínuas,
para Re>0, o que é bastante adequado para a solução dos sistema de equações, não
apresentam bons resultados na região de transição, quando se deseja, por exemplo,
a inversão da equação A.4 através da equação A.5. e suas respectivas formas da
fórmula universal (indicadas nas figuras A.2 e A.3). Além disso, por cobrir toda a
faixa de regimes em única formulação, apresenta uma acentuada distorção na Lei
de Hagen-Poiseuille quando o número de Reynolds (Re) se aproxima de seu limite
superior para regime laminar (Re=2500).

Tais considerações, de forma alguma inviabilizam, ou


186

desaconselham a utilização da fórmula de Swamee para sistemas hidráulicos


prediais, uma vez que, como pode ser visto na Tabela A.2, os valores de números
de Reynolds presentes em sistemas prediais, por limites técnicos e econômicos, se
encontram em faixa bastante distante daqueles em que surgem problemas com tais
formulações.

TABELA A.2 – NÚMEROS DE REYNOLDS VERIFICÁVEIS EM SISTEMAS


PREDIAIS.
Q
Di
DN para V=3 m/s Remin Remáx
[mm]
[L/s]
20 17,0 0,68 --- 51000
25 21,6 1,10 40139 64800
32 27,8 1,82 50348 83400
40 35,2 2,92 65867 105600
50 44,0 4,56 84480 132000
60 53,4 6,72 108764 160200
75 66,6 10,45 128449 199800
85 75,6 13,47 176014 226800
110 97,8 22,54 175318 293400

Os valores de “Remáx” na Tabela A.2. são determinados com base


na prescrição de 3 m/s, como velocidade máxima em sistemas prediais, constante
na NBR5626/98. Já os valores de “Remín” são determinados com o valor da vazão
máxima permitida (segundo a velocidade máxima), para o tubo de diâmetro
nominal imediatamente inferior, pois, caso tal vazão venha a ocorrer, o critérios
econômicos apontariam para a diminuição do diâmetro.

Dessa maneira, verifica-se que o número de Reynolds presente


nas situações de máximas vazões (casos em que se procede a verificação das
perdas de carga para os métodos que não verificam vazões reais), corresponde
sempre a escoamentos turbulentos plenamente desenvolvidos
( 4 × 10 4 ≤ Re ≤ 2,9 × 10 5 ), faixa na qual as três formulações apresentadas
187

conduzem a resultados adequados.

No entanto, como o modelo apresentado neste trabalho propõe-se


a efetuar a verificação de vazões reais segundo padrões de acionamento de
aparelhos, é necessário ter em vista que existem padrões tais que podem provocar
velocidades suficientemente baixas para conduzir a regime laminar ou à região de
transição, sendo oportuno uma formulação que apresente boa coerência e
reversibilidade de função em uma faixa de Números de Reynolds que inclua tais
regimes de escoamentoA.4., mesmo podendo-se inferir, à primeira vista, que não
ocorrerá nenhum tipo de situação limite no sistema quando tais vazões de pequeno
porte se apresentarem.

Para atingir tal objetivo, o presente trabalho opta por proceder


uma determinação direta dos valores de perda de carga, através das abordagens de
Souza ou Swamee, utilizando-se o processo da Figura A.2 ou a equação A.4.,
respectivamente, procedendo iterações sobre estas para a determinação dos demais
parâmetros. Tal processo iterativo utiliza ainda as formulações da Figura A.3 a A.5,
para o caso apresentado por Souza, e das equações A.5. a A.7, para o caso
apresentado por Swamee, a título de avaliação do ponto de partida para as
iterações.

A implementação de uma biblioteca computacional para as


abordagens de Souza e Swamee pode ser vista no Apêndice III.

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

A.2. Determinação do Sentido de Fluxo.

Para a determinação dos parâmetros e estados associados à


operação do sistema, é fundamental o conhecimento do sentido de fluxo das
grandezas que assim atuam, em especial as vazões.

Nos problemas que envolvem redes ramificadas é possível saber,


“a priori”, o sentido da vazão; como tal não é possível em redes fechadas, as
equações A.1. e A.2. são transformadas, com apresentado em A.8, para refletirem
na perda de carga o sentido da vazão. Seu caso particular para redes ramificadas é
apresentado em A.9,.

Q 6 1, 75 − 4 , 75
∆H = ⋅ 8,63 × 10 ⋅ Q ⋅d ⋅L (A.8)
Q

∆H = 8,63 × 10 6 ⋅ Q 1,75 ⋅ d − 4, 75 ⋅ L (A.9)

O mesmo processo, quando aplicado em A.3.b conduz à equação


A.10, lembrando-se ainda que a determinação do coeficiente de atrito (f), é sempre
realizada com o valor absoluto da vazão ( Q ).

Q 8 × 10 − 9 ⋅ f ⋅ L ⋅ ρ ⋅ Q 2
∆H = ⋅ (A.10.)
Q 2
π ⋅d
5

Uma vez que não há significado, de fato, em vazões negativas ou


perdas de cargas negativas, tais sinais são aplicados somente como referência em
relação a uma convenção de sentidos de entrada e saída adotada, ou seja, quando
positivas, essas vazões realmente correspondem ao sentido convencional tomado,
189

correspondendo a sentido contrário quando negativas.

Por simplificação, pode-se ainda definir a função “sinal”, como


apresentado na equação A.11.

x
s(x ) = (A.11)
x

Pela aplicação de A.11 em A.9 e A.10 tem-se, respectivamente, as


equações A.12. e A.13.

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

Para a aplicação correta das equações nas redes fechadas, onde


não é possível a determinação “a priori” do sentido das vazões, é necessário a
definição de um sentido convencional. Para tal serão tomadas como positivas as
vazões efluentes e negativas aquelas afluentes ao componente. As entradas (ou
saídas) dos componentes são identificadas por letras, em seqüência alfabética,
diferentemente do que ocorre na simplificação para redes ramificadas onde fica
claro a utilização de identificadores de entrada, saída, saída direta, saída lateral,
etc.. Essa convenção se encontra ilustrada na Figura A.6.

A B

A
Fig. A.6 Convenção de sinais para as vazõesB ou outras grandezas de fluxo.
190

A seguir são apresentadas as descrições, em suas leis hidráulicas,


de alguns componentes, de forma geral e simplificada para as redes ramificadas,
onde se apresenta o cálculo de perdas de carga, segundo a NBR5626/98, e a
indicação dos elementos necessários para seu cálculo através da Fórmula
Universal.

É ainda indicado o cálculo da massa do componente, com o


objetivo de ressaltar que as perdas de carga constituem apenas uma das
características possíveis de serem avaliadas pelo processo apresentado.

A.3. Tubos de PVC Soldável

TABELA A.3. - DESCRIÇÃO DE COMPONENTE PARA TUBOS DE PVC


SOLDÁVEIS
DN De e Di m ∆ H (NBR5626) Leis que não Valores
[mm] [mm] [mm] (× L ) 1, 75 dependem do
(× s (Q B ) × Q B × L)
[kg] diâmetro
[kPa]
20 20 1,5 17,0 0,137 1,234180 x 101 - QA = QB ZA
25 25 1,7 21,6 0,194 3,956904 x 100 ZB
32 32 2,1 27,8 0,306 1,193433 x 100 HB=HA- ∆H L
40 40 2,4 35,2 0,446 3,889853 x 10-1 + ρ.g.(ZA-ZB)
50 50 3,0 44,0 0,696 1,347754 x 10-1
60 60 3,3 53,4 0,918 5,372666 x 10-2 k=1,5 x 10-5 m
75 75 4,2 66,6 1,467 1,881517 x 10-2
85 85 4,7 75,6 1,881 1,030463 x 10-2
110 110 6,1 97,8 3,112 3,033201 x 10-3
191

TABELA A.4. - DESCRIÇÃO DE COMPONENTE PARA TUBOS DE PVC


SOLDÁVEIS SIMPLIFICADO PARA REDES RAMIFICADAS.
DN De e Di m ∆ H (NBR5626) Leis que não Valores
[mm] [mm] [mm] (× L ) 1, 75
(Qs × L) dependem do
[kg] diâmetro
[kPa]
20 20 1,5 17,0 0,137 1,234180 x 101 Qe = Qs Ze
25 25 1,7 21,6 0,194 3,956904 x 100 Zs
32 32 2,1 27,8 0,306 1,193433 x 100 Hs=He- ∆H L
40 40 2,4 35,2 0,446 3,889853 x 10-1 + ρ.g.(Ze-Zs)
50 50 3,0 44,0 0,696 1,347754 x 10-1
60 60 3,3 53,4 0,918 5,372666 x 10-2 k=1,5 x 10-5 m
75 75 4,2 66,6 1,467 1,881517 x 10-2
85 85 4,7 75,6 1,881 1,030463 x 10-2
110 110 6,1 97,8 3,112 3,033201 x 10-3

A.4. Joelhos de PVC soldável

TABELA A.5. - DESCRIÇÃO DE COMPONENTE PARA JOELHOS DE PVC


SOLDÁVEIS
∆ H (NBR5626) Leis que não
m 1, 75 di L
DN
[kg] (× s (QB ) × Q B ) [mm] [m]
dependem do
[kPa] diâmetro
20 0,015 1,357598 x 101 17,0 1,1 - QA = QB
25 0,026 4,748284 x 100 21,6 1,2
32 0,043 1,790149 x 100 27,8 1,5 HB=HA-∆H
40 0,088 7,779705 x 10-1 35,2 2,0
-5
50 0,127 4,312812 x 10-1 44,0 3,2 k=1,5 x 10 m
60 0,186 1,826706 x 10-1 53,4 3,4
75 0,386 6,961614 x 10-2 66,6 3,7
85 0,566 4,018804 x 10-2 75,6 3,9
110 1,103 1,304277 x 10-2 97,8 4,3
192

TABELA A.6. - DESCRIÇÃO DE COMPONENTE PARA JOELHOS DE PVC


SOLDÁVEIS. SIMPLIFICADO PARA REDES
RAMIFICADAS.
DN m ∆ H (NBR5626) di L Leis que não dependem
[kg] × Qs
1, 75
[kPa] [mm] [m] do diâmetro
20 0,015 1,357598 x 101 17,0 1,1 Qe = Qs
25 0,026 4,748284 x 100 21,6 1,2
32 0,043 1,790149 x 100 27,8 1,5 Hs=He-∆H
40 0,088 7,779705 x 10-1 35,2 2,0
50 0,127 4,312812 x 10-1 44,0 3,2 k=1,5 x 10-5 m
60 0,186 1,826706 x 10-1 53,4 3,4
75 0,386 6,961614 x 10-2 66,6 3,7
85 0,566 4,018804 x 10-2 75,6 3,9
110 1,103 1,304277 x 10-2 97,8 4,3

A.5. Tês.

As conexões com três entradas (ou saídas), conhecidas como


“tês”, apresentam várias opções de entrada e saída de fluxo (de fato 8, sendo 2
delas inviáveisA.5., restando 6). Portanto, tal componente pode ser tratado, para seu
aspecto hidráulico, como 6 componentes diversos, como visto na Figura A.7.

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

Para redes ramificadas, quando se sabe “a priori” o sentido das


vazões, é bastante simples escolher um desses componentes e trabalhar com as leis
que o descreve. No entanto, para as redes fechadas não é possível tal determinação
uma vez que não há segurança para afirmar que os sentidos de vazão adotados na
aproximação inicial correspondam àqueles do conjunto solução.

Diante de tal constatação é necessário dispor de um mecanismo


que permita, a partir da análise de vazões, determinar qual desses componentes se
apresenta no momento.

É possível determinar qual configuração corresponde ao “tê” sob


análise através dos sinais das vazões (cf. equação A.11). A relação entre os sinais e
as leis de vazão e perda de carga, segundo cada forma de operação da conexão em
“tê”, se encontra na Tabela A.7.; os valores das perdas de carga para tais conexões
quando em PVC soldável, na Tabela A.8. (A.8a. segundo NBR5226/98 e A.8.b
para uso com a Fórmula Universal).

TABELA A.7 - DETERMINAÇÃO DO MODO DE OPERAÇÃO


E LEIS FUNDAMENTAIS DAS CONEXÕES TIPO “TÊ”.
194

TABELA A.8.a - PERDAS DE CARGA, SEGUNDO A NBR5626, PARA AS


CONEXÕES TIPO “TÊ”.
∆ H AB ∆ H AC ∆ H BA ∆ H BC ∆ H CA ∆ H CB
1, 75 1, 75 1, 75 1, 75 1, 75
DN m × QB × QC × QA × QC × QA
1, 75
× QB
[kg] [kPa] [kPa] [kPa] [kPa] [kPa] [kPa]
20 0,022 8,639258 x 2,838613 x 8,639258 x 2,838613 x 2,838613 x 2,838613 x
100 101 100 101 101 101
25 0,038 3,165523 x 9,496569 x 3,165523 x 9,496569 x 9,496569 x 9,496569 x
100 100 100 100 100 100
32 0,062 1,074090 x 3,699642 x 1,074090 x 3,699642 x 3,699642 x 3,699642 x
100 100 100 100 100 100
40 0,118 5,834779 x 1,789332 x 5,834779 x 1,789332 x 1,789332 x 1,789332 x
10-1 100 10-1 100 100 100
50 0,152 2,965058 x 9,838603 x 2,965058 x 9,838603 x 9,838603 x 9,838603 x
10-1 10-1 10-1 10-1 10-1 10-1
60 0,259 1,235713 x 4,083226 x 1,235713 x 4,083226 x 4,083226 x 4,083226 x
10-1 10-1 10-1 10-1 10-1 10-1
75 0,505 4,515641 x 1,467583 x 4,515641 x 1,467583 x 1,467583 x 1,467583 x
10-2 10-1 10-2 10-1 10-1 10-1
85 0,718 2,576157 x 8,243701 x 2,576157 x 8,243701 x 8,243701 x 8,243701 x
10-2 10-2 10-2 10-2 10-2 10-2
110 1,431 7,886323 x 2,517557 x 7,886323 x 2,517557 x 2,517557 x 2,517557 x
10-3 10-2 10-3 10-2 10-2 10-2

TABELA A.8.b – DIÂMETROS INTERNOS E COMPRIMENTOS


EQUIVALENTES, PARA A APLICAÇÃO DA FÓRMULA
UNIVERSAL PARA AS CONEXÕES TIPO “TÊ”. (k =1,5 x
10-5 m)
L AB L AC LBA L BC LCA LCB
di
m Q = QB Q = QC Q = QA Q = QC Q = QA Q = QB
DN [mm]
[kg] [m] [m] [m] [m] [m] [m]
20 0,022 17,0 0,7 2,3 0,7 2,3 2,3 2,3
25 0,038 21,6 0,8 2,4 0,8 2,4 2,4 2,4
32 0,062 27,8 0,9 3,1 0,9 3,1 3,1 3,1
40 0,118 35,2 1,5 4,6 1,5 4,6 4,6 4,6
50 0,152 44,0 2,2 7,3 2,2 7,3 7,3 7,3
60 0,259 53,4 2,3 7,6 2,3 7,6 7,6 7,6
75 0,505 66,6 2,4 7,8 2,4 7,8 7,8 7,8
85 0,718 75,6 2,5 8,0 2,5 8,0 8,0 8,0
110 1,431 97,8 2,6 8,3 2,6 8,3 8,3 8,3

Uma tabela individual, para o caso particular de conexão tê em


195

saída direta e lateral, para utilização em redes ramificadas, pode ser encontrada na
Tabela A.9.

TABELA A.9. - DESCRIÇÃO DE COMPONENTE PARA “TÊ” DE PASSAGEM


DIRETA E LATERAL EM PVC SOLDÁVEL.
∆ H d (NBR5226) ∆ H L (NBR5226) Leis que não
L d L L
m di dependem do
DN
[kg] [mm]
Q = Qd Q = Q L × Qd 1,75 × QL
1, 75
diâmetro
[m] [m]
[kPa] [kPa]
20 0,022 17,0 0,7 2,3 8,639258 x 100 2,838613 x 101 Qe = Qd+QL
25 0,038 21,6 0,8 2,4 3,165523 x 100 9,496569 x 100
32 0,062 27,8 0,9 3,1 1,074090 x 100 3,699642 x 100 Hsd=He- ∆Hd
40 0,118 35,2 1,5 4,6 5,834779 x 10-1 1,789332 x 100
50 0,152 44,0 2,2 7,3 2,965058 x 10-1 9,838603 x 10-1 HsL=He- ∆HL
60 0,259 53,4 2,3 7,6 1,235713 x 10-1 4,083226 x 10-1 -5
75 0,505 66,6 2,4 7,8 4,515641 x 10-2 1,467583 x 10-1 k=1,5 x 10 m
85 0,718 75,6 2,5 8,0 2,576157 x 10-2 8,243701 x 10-2
110 1,431 97,8 2,6 8,3 7,886323 x 10-3 2,517557 x 10-2

A.5. Entrada de borda por adaptador de PVC soldável longo.

Como as entradas de borda são utilizadas com sentido único de


escoamento, ou seja, com a vazão saindo do reservatório, apresenta-se na Tabela
A.10. as leis que regem esse tipo de componente.
196

TABELA A.10 - DESCRIÇÃO DE COMPONENTE PARA ENTRADA DE


BORDA POR ADAPTADOR EM PVC SOLDÁVEL LONGO.
∆H Leis que não
m di L 1, 75
DN ×Q dependem do
[kg] [mm] [m]
[kPa] diâmetro
0,9 1
20 0,126 17,0 1,110762 x 10 Qe = Qs
1,0 0
25 0,178 21,6 3,956904 x 10
32 0,276 27,8 1,2 1,432120 x 100 Hs=He- ∆H
1,8 -1
40 0,357 35,2 7,001735 x 10
50 0,409 44,0 2,3 3,099834 x 10-1 k=1,5 x 10-5 m
60 1,499 53,4 2,8 1,504346 x 10-1
75 1,976 66,6 3,3 6,209007 x 10-2
85 2,882 75,6 3,7 3,812712 x 10-2
110 1,103 97,8 4,0 1,213281 x 10-2

A.6. Torneira de Jardim.

As torneiras de jardim, assim como quaisquer outros aparelhos


sanitário, não admitem fluxo reverso em operação normal. As leis, para uma
torneira hipotética, apresentadas abaixo, no entanto, o permitem, para não haver
ruptura matemática nas equações e para que fique evidente que, caso haja vazão de
sinal positivo na entrada de um componente desse tipo, deve haver algo errado com
a rede ou com a solução.

Como esses componentes não podem ser montados de forma


invertida, ou seja, apresentam clara definição entre entrada e saída, usaremos a
notação “e” para entrada e “s” para saída. [H]=kPa; [Q]=L/s.
197
Qe = Qs
1
Qe = s ( H e ) ⋅ 6,324555 × 10 − 2 ⋅ H e 2

ou
2
H e = − s (Qe ) ⋅ 250 ⋅ Qe
m = 0,150 Kg

A.7. Reservatório Prismático de Base Retangular.

Para os reservatórios prismáticos de base retangular com uma


única saída, que opere somente como saída, as leis hidráulicas são dadas por:

ρ ⋅g⋅ y
H sF =
1000
V
y=
w⋅ L
(Qe − Qs )
V f = Vi + ⋅t
1000

onde: y - altura da lâmina d’água [m];


V - volume do reservatório [m3];
w - largura da base [m];
L - comprimento da base [m];
Vf - volume final em intervalo de tempo [m3];
Vi - volume inicial em intervalo de tempo [m3];
Qe - vazão de entrada [L/s];
Qs - vazão de saída [L/s];
t – tempo [s];
Hsf – pressão disponível em saída de fundo [kPa].
198

ANEXO B

Com o objetivo de esclarecer melhor a metodologia de


visualização e representação de um sistema de distribuição de água fria em
edifício, apresenta-se, neste Anexo, a solução para um exemplo, em suas
características de vazão e pressão, utilizando-se a metodologia apresentada no
Capítulo 6.

B.1 Enunciado e Considerações Iniciais.

O exemplo escolhido foi tomado a partir de um caso comum, que


é o lavatório coletivo, no caso com 5 torneiras, cujo esquema aparece na Figura
B.1.

Fig. B.1 Esquema de Lavatório Coletivo com 5 torneiras.


199

O objetivo do exemplo é determinar qual a vazão real, que verte


pelas torneiras, estando todas em funcionamento simultâneo; este objetivo visa
verificar se haveria disparidade acentuada entre as vazões e se as mesmas
permanecem acima de 0,2 L/s, valor adotado na NBR 5626/98 como mínimo para
torneira de lavagem em geral.

Os diâmetros dos tubos foram pré-dimensionados com base na


soma dessas vazões mínimas em cada trecho, limitando-se a velocidade máxima a
2,0 m/s, ou seja, um pouco abaixo daquela preconizada como máxima pela referida
Norma Técnica, pois objetivamos um bom equilíbrio de vazões. Posteriormente
poderiam se testados diâmetros menores, ou seja, levando-se a velocidade a 3,0
m/s, em busca de um melhor dimensionamento mas este não é o objetivo desse
exemplo.

B.2. Encaminhamento da Solução.

Uma vez identificados e numerados todos os componentes do


sistema, como se pode ver na Figura B.1, é possível, com base no Anexo A,
escrever as leis hidráulicas pertinentes a cada um deles, como se pode ver na
Tabela B.1.
200

TABELA B.1 - VALORES E LEIS PARA OS COMPONENTES DO EXEMPLO.


Componente ReferênciaB.1. Valores Leis
1 item A.7. y=0,20 H s1 = 2,0
Tabela A.10. Qe 2 = Qs 2
2 DN 32
H s 2 = H e 2 − 1,432120 ⋅ Qs 21, 75
Tabela A.4.
L=2,50 ; Qe3 = Qs 3
3 Ze=2,50;
DN 32 Zs=0 H s 3 = H e3 − 2,983583 ⋅ Qs 31,75 + 25
Tabela A.6. DN Qe 4 = Qs 4
4 32
H s 4 = H e 4 − 1,790149 ⋅ Qs 41,75
Tabela A.4.
L=0,60 ; Qe5 = Qs 5
5 Ze=0 ;
DN 32 Zs=0 H s 5 = H e5 − 7,160598 × 10 −1 ⋅ Qs 51,75
Qe6 = Qd 6 + QL 6
6
Tabela A.4.
DN 32
H sd 6 = H e 6 − 1,074090 ⋅ Qd 61,75
H sL 6 = H e 6 − 3,699642 ⋅ QL 61,75
Tabela A.4.
L=0,40 ; Qe7 = Qs 7
7 Ze=0 ;
DN 32 Zs=0 H s 7 = H e 7 − 4,773732 × 10 −1 ⋅ Qs 71,75
Qe8 = Qd 8 + QL8
8
Tabela A.6.
DN 32
H sd 8 = H e8 − 1,074090 ⋅ Qd 81, 75
H sL 8 = H e8 − 3,699642 ⋅ QL81,75
Tabela A.4.
L=0,40 ; Qe9 = Qs 9
9 Ze=0 ;
DN 25 Zs=0 H s 9 = H e9 − 1,582762 ⋅ Qs 91,75
Qe10 = Qd 10 + QL10
10
Tabela A.4.
DN 25
H sd 10 = H e10 − 3,165523 ⋅ Qd 101,75
H sL10 = H e10 − 9,496569 ⋅ Qs101, 75
Tabela A.4.
L=0,40 ; Qe11 = Qs11
11 Ze=0 ;
DN 20 Zs=0 H s11 = H e11 − 4,936720 ⋅ Qs111,75
Qe12 = Qd 12 + QL12
12
Tabela A.4.
DN 20
H sd 12 = H e12 − 8,639258 ⋅ Qd 121,75
H sL12 = H e12 − 2,838613 × 101 ⋅ QL121,75

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 B.1 - VALORES E LEIS PARA OS COMPONENTES DO EXEMPLO


(Cont.)
Componente Referência Valores Leis

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

A seguir, representa-se a influência de cada componente sobre os


outros, através do grafo, como visto na Figura B.2, transportando-se essas relações
para a tabela de relações (Tabela B.2).
202

Fig. B.2 Grafo de relações para o sistema da Figura B.1

TABELA B.2 - DESCRIÇÃO DAS RELAÇÕES ENTRE OS COMPONENTES


DO SISTEMA EXEMPLO, DE ACORDO COM O GRAFO DA
FIGURA B.2
No. da relação Leis contidas na relação
r1;2 Qs1 = Qe 2 | H s1 = H e 2
r2;3 Qs 2 = Qe3 | H s 2 = H e3
r3;4 Qs 3 = Qe 4 | H s3 = H e4
r4;5 Qs 4 = Qe5 | H s 4 = H e5
r5;6 Qs 5 = Qe6 | H s5 = H e6
r6;7 Qd 6 = Qe7 | H sd 6 = H e7
r7;8 Qs 7 = Qe8 | H s 7 = H e8
r8;9 Qd 8 = Qe9 | H sd 8 = H e9
r9;10 Qs 9 = Qe10 | H s 9 = H e10
r10;11 Qd 10 = Qe11 | H sd 10 = H e11
r11;12 Qs11 = Qe12 | H s11 = H e12
r12;13 Qd 12 = Qe13 | H sd 12 = H e13
r13;14 Qs13 = Qe14 | H s13 = H e14
r14;15 Qs14 = Qe15 | H s14 = H e15
r15;24 Qs15 = Qe 24 | H s15 = H e 24
r6;16 QL 6 = Qe16 | H sL 6 = H e16
r16;20 Qs16 = Qe 20 | H s16 = H e 20
r8;17 QL8 = Qe17 | H L8 = H e17
r17;21 Qs17 = Qe 21 | H s17 = H e 21
r10;18 QL10 = Qe18 | H L10 = H e18
r18;22 Qs18 = Qe 22 | H s18 = H e 22
r12;19 QL12 = Qe19 | H L12 = H e19
r19;23 Qs19 = Qe 23 | H s19 = H e 23
203

O conjunto de leis dos componentes (Tabela B.1), unido ao


conjunto de relações (Tabela B.2) formam um sistema de equações não lineares
que, uma vez resolvido, traz a solução desejada; no entanto, o número de
incógnitas e equações é bastante elevado (97 x 97).

Aproveitando-se do fato de que várias dessas equações são apenas


igualdade entre duas variáveis, aplica-se uma redução de seu número, através do
mecanismo de silogismo apresentado no Capítulo 6, como se vê na Tabela B.3

TABELA B.3 - REDUÇÃO DO NÚMERO DE INCÓGNITAS ATRAVÉS DE


SILOGISMO.
Variável genérica Variáveis equivalentes
X(1) Qs1 = Qe 2 = Qs 2 = Qe3 = Qs 3 = Qe 4 =
=Qs 4 = Qe5 = Qs 5 = Qe 6
X(2) Qe7 = Qs 7 = Qd 6 = Qe8
X(3) Qe9 = Qs 9 = Qd 8 = Qe10
X(4) Qe11 = Qs11 = Qd 10 = Qe12
X(5) Qd 12 = Qe13 = Qs13 = Qe14 = Qs14 =
=Qe15 = Qs15 = Qe 24 = Qs 24
X(6) QL 6 = Qe16 = Qs16 = Qe 20 = Qs 20
X(7) QL8 = Qe17 = Qs17 = Qe 21 = Qs 21
X(8) QL10 = Qe18 = Qs18 = Qe 22 = Qs 22
X(9) QL12 = Qe19 = Qs19 = Qe 23 = Qs 23
X(10) H s1 = H e 2
X(11) H s 2 = H e3
X(12) H s3 = H e4
X(13) H s 4 = H e5
X(14) H s5 = H e6
X(15) H sd 6 = H e7
X(16) H s 7 = H e8
X(17) H sd 8 = H e9
204

TABELA B.3 - REDUÇÃO DO NÚMERO DE INCÓGNITAS ATRAVÉS DE


SILOGISMO. (cont)
X(18) H s 9 = H e10
X(19) H sd 10 = H e11
X(20) H s11 = H e12
X(21) H sd 12 = H e13
X(22) H s13 = H e14
X(23) H s14 = H e15
X(24) H s15 = H e 24
X(25) H sL 6 = H e16
X(26) H s16 = H e 20
X(27) H sL8 = H e17
X(28) H s17 = H e 21
X(29) H sL10 = H e18
X(30) H s18 = H e 22
X(31) H sL12 = H e19
X(32) H s19 = H e 23

Na seqüência, as variáveis genéricas da Tabela B.3 são aplicadas,


segundo suas correspondentes, naquelas leis internas de componentes que não
tenham sido contempladas na aplicação do silogismo, geralmente as que não
apresentaram igualdade direta entre duas grandezas. Esse processo produz o
sistema de equações apresentado como equação B.1, a seguir, que para adequarem-
se ao algoritmo de solução devem ser arranjadas de forma a terem um de seus
membros nulos.
205
 X 10 − 2,0 = 0
 1, 75
 X 10 − X 11 − 1,432120 ⋅ X 1 =0
 1,75

X 11 − X 12 − 2,983583 ⋅ X 1 + 25 = 0
 X − X − 1,790149 ⋅ X 11, 75 = 0
12 13

 X 13 − X 14 − 7,160598 × 10 − 1 ⋅ X 1
1, 75
=0

X + X 6 − X1 = 0
 2
 X − X − 1,074090 ⋅ X 1,75 = 0
2
 14 15
 X 14 − X 25 − 3,699642 ⋅ X 61, 75 = 0

−1 1, 75
 X 15 − X 16 − 4,773732 × 10 ⋅ X 2 =0

X + X7 − X2 = 0
 3
 X − X − 1,074090 ⋅ X 31, 75 = 0
16 17

1, 75
 X 16 − X 27 − 3.699642 ⋅ X 7 =0
 1,75
 X 17 − X 18 − 1,582762 ⋅ X 3 =0
X + X − X = 0
 4 8 3
 X 18 − X 19 − 3,165523 ⋅ X 41, 75 = 0
 1, 75
 X 18 − X 29 − 9,496569 ⋅ X 8 =0
 1, 75
 X 19 − X 20 − 4,936720 ⋅ X 4 =0
X + X − X = 0
5 9 4

1,75
 X 20 − X 21 − 8,639258 ⋅ X 5 =0
 1 1, 75
 X 20 − X 31 − 2,838613 × 10 ⋅ X 9 =0

X − X 22 − 4,936720 ⋅ X 51,75 = 0
 21
 X − X − 1,357598 × 101 ⋅ X 1,75 = 0
5
 22 23
 X 23 − X 24 − 2,468360 ⋅ X 51, 75 = 0
 1, 75
 X 25 − X 26 − 2,468360 ⋅ X 6 =0 (B.1)
 1,75
 X 27 − X 28 − 2,468360 ⋅ X 7 =0
206
 X − X − 2,468360 ⋅ X 81,75 = 0
29 30

1,75
 X 31 − X 32 − 2,468360 ⋅ X 9 = 0
 2
 250 ⋅ X 6 − X 26 = 0
 2
 250 ⋅ X 7 − X 28 = 0 (B.1 cont..)
 2
 250 ⋅ X 8 − X 30 = 0
 250 ⋅ X 2 − X = 0
 9 32
 250 ⋅ X − X
2
 5 24 = 0

Para que se tenha a solução desse sistema de equações não


lineares, é necessário que se faça uma aproximação inicial dos resultados. Da
qualidade dessa aproximação inicial depende não somente a velocidade de
convergência mas também a própria ocorrência de convergência e se esta levará a
resultado correto ou sem sentido físico.

Para tal aproximação inicial tomaram-se, para vazão nos


aparelhos, aquelas mínimas indicadas na NBR5626/98 e para valores iniciais de
pressão, cerca de 70% daquela que corresponderia à altura estática.

Os valores da aproximação inicial podem ser vistos na Tabela B.4.

TABELA B.4 - APROXIMAÇÃO INICIAL.


Variável Valor Variável Valor Variável Valor Variável Valor
X1 1,00 X9 0,20 X17 19,00 X25 19,00
X2 0,80 X10 2,00 X18 19,00 X26 19,00
X3 0,60 X11 2,00 X19 19,00 X27 19,00
X4 0,40 X12 19,00 X20 19,00 X28 19,00
X5 0,20 X13 19,00 X21 19,00 X29 19,00
X6 0,20 X14 19,00 X22 19,00 X30 19,00
X7 0,20 X15 19,00 X23 19,00 X31 19,00
X8 0,20 X16 19,00 X24 19,00 X32 19,00
207

De posse das equações B.1 e das aproximações iniciais


apresentadas na Tabela B.4, pode-se determinar os valores de X1 a X32.

Tal tarefa foi executada em um microcomputador tipo PC,


Pentium 200mmx/200MHz, através do código apresentado no Apêndice IV.

Tal execução apresentou os resultados constantes da listagem B.1.

Listagem B.1 - Resultados obtidos.


Resultados...
Foram efetuadas 5 iterações.
Consumidos 1,522 segundos
X[ 1]= 1,178078E+000
X[ 2]= 9,158849E-001
X[ 3]= 6,637327E-001
X[ 4]= 4,255701E-001
X[ 5]= 2,131196E-001
X[ 6]= 2,621936E-001
X[ 7]= 2,521522E-001
X[ 8]= 2,381626E-001
X[ 9]= 2,124505E-001
X[10]= 2,000000E+000
X[11]= 9,219356E-002
X[12]= 2,111760E+001
X[13]= 1,873284E+001
X[14]= 1,777894E+001
X[15]= 1,685793E+001
X[16]= 1,644860E+001
X[17]= 1,592436E+001
X[18]= 1,515185E+001
X[19]= 1,444203E+001
X[20]= 1,333506E+001
X[21]= 1,275754E+001
X[22]= 1,242753E+001
X[23]= 1,151999E+001
X[24]= 1,135499E+001
X[25]= 1,742351E+001
X[26]= 1,718638E+001
X[27]= 1,611665E+001
X[28]= 1,589518E+001
X[29]= 1,438078E+001
X[30]= 1,418036E+001
X[31]= 1,144791E+001
X[32]= 1,128380E+001

Erros nas equações propostas...


f 1(X)= 0,000000000000
f 2(X)= 0,000000000000
f 3(X)= 0,000000000000
f 4(X)= 0,000000000000
f 5(X)= 0,000000000000
f 6(X)= 0,000000000000
f 7(X)= 0,000000000000
f 8(X)= 0,000000000000
f 9(X)= 0,000000000000
208

Listagem B.1 - Resultados obtidos. (cont)


f10(X)= 0,000000000000
f11(X)= 0,000000000000
f12(X)= 0,000000000000
f13(X)= 0,000000000000
f14(X)= 0,000000000000
f15(X)= 0,000000000000
f16(X)= 0,000000000000
f17(X)= 0,000000000000
f18(X)= 0,000000000000
f19(X)= 0,000000000000
f20(X)= 0,000000000000
f21(X)= 0,000000000000
f22(X)= 0,000000000000
f23(X)= 0,000000000000
f24(X)= 0,000000000000
f25(X)= 0,000000000000
f26(X)= 0,000000000000
f27(X)= 0,000000000000
f28(X)= 0,000000000000
f29(X)= 0,000000000000
f30(X)= 0,000000000000
f31(X)= 0,000000000000
f32(X)= 0,000000000000

B.3 Confirmação dos Resultados.

Como se pode observar, os valores se apresentaram com a ordem


de grandeza desejada, mas, para confirmá-los, foi construída uma planilha similar à
proposta na NBR5626/98, a fim de verificar se a pressão disponível nos pontos de
utilização correspondem àquelas necessárias para que as torneiras vertam a vazão
determinada no cálculo acima.

Para orientar essa planilha, apresentada na Tabela B.5, lançou-se


os pontos necessários na Figura B.3.

Como se pode observar, as pressões requeridas foram iguais


àquelas disponíveis, a menos de pequenos erros de aproximação, atestando a
correção das vazões e pressões encontradas.
TABELA B.5 - PLANILHA DE CÁLCULO SEGUNDO NBR5626/98

Diferença Comprimento da Pressão


Perda de Perda de Carga [KPa] Pressão
Diâmetro de cota Pressão Tubulação [m] requerida
Velocidade carga Disponível Diferença de
Trecho Vazão [L/s] interno (+ desce ; disponível no ponto de
[m/s] Unitária residual Pressões
[mm] - sobe) [Kpa] utilização
[Kpa/m] [KPa]
[m] Registros [Kpa]
Real Equivalente Tubulação Total
e Outros
I - T1 0,2131196 17 0,94 0,8250293 13,3350608 0,60 1,80 0,4950176 1,4850527 1,9800702 11,35499 11,354991 0,000000
I - T2 0,2124505 17 0,94 0,8205017 13,3350608 0,20 2,30 0,1641003 1,8871540 2,0512543 11,28381 11,283804 0,000003
G - T3 0,2381626 17 1,05 1,0020910 14,3807776 0,20 0,2004182 0,0000000 0,2004182 14,18036 14,180356 0,000003
D - T4 0,2521522 17 1,11 1,1073585 16,1166502 0,20 0,2214717 0,0000000 0,2214717 15,89518 15,895183 -0,000005
B - T5 0,2621936 17 1,16 1,1856788 17,4235133 0,20 0,2371358 0,0000000 0,2371358 17,18638 17,186371 0,000007
H-I 0,4255701 17 1,87 2,7674377 14,4420359 0,40 1,1069751 0,0000000 1,1069751 13,33506
F-G 0,2381626 21,6 0,65 0,3212804 15,1518505 2,40 0,0000000 0,7710729 0,7710729 14,38078
F-H 0,4255701 21,6 1,16 0,8872682 15,1518505 0,80 0,0000000 0,7098146 0,7098146 14,44204
E-F 0,6637327 21,6 1,81 1,9312727 15,9243596 0,40 0,7725091 0,0000000 0,7725091 15,15185
C-D 0,2521522 27,8 0,42 0,1070799 16,4485978 3,10 0,0000000 0,3319476 0,3319476 16,11665
C-E 0,6637327 27,8 1,09 0,5824869 16,4485978 0,90 0,0000000 0,5242382 0,5242382 15,92436
A-C 0,9158849 27,8 1,51 1,0233391 17,7789387 0,40 0,90 0,4093357 0,9210052 1,3303409 16,44860
A-B 0,2621936 27,8 0,43 0,1146533 17,7789387 3,10 0,0000000 0,3554253 0,3554253 17,42351
R-A 1,1780785 27,8 1,94 1,5898382 2,50 2,0000000 3,10 2,70 4,9284983 4,2925630 9,2210613 17,77894

209
Fig. B.3 Determinação de pontos e trechos referidos na Tabela B-5
210

B.4 Considerações sobre o Exemplo.

Os resultados mostram vazões acima do limite mínimo estabelecido


e também com bom equilíbrio.

Todas as pressões situam-se acima de 5 KPa exceto aquela


encontrada na saída do componente No. 2 (entrada do componente No. 3), sugerindo
que há necessidade de um pouco mais de altura de lâmina d’água para uma operação
mais adequada. Observa-se que esse dado não pode ser visto através da planilha
apresentada na Tabela B.5.

B.5 Determinação do Componente Equivalente.

Para o exemplo sob estudo, podemos observar que todas as curvas


de componentes, que representam relações entre vazão e pressão, se encontram na
forma exponencial apresentada na equação B.2.

H = a + b ⋅ Qc (B.2)

Diante disso, pode-se esperar que a equação equivalente do sistema


também apresente esse formato.

De fato, procedeu-se a geração de 500 pontos de dados Q x H, para


o exemplo, que foram ajustados a uma equação no formato de B.2. Tal curva foi
211

ajustada pelo método dos erros quadráticos mínimos, conforme descrito em


MARON (1987).

O exemplo foi ajustado à curva para a faixa de alturas de carga de 5


a 400 kPa. Desse ajuste obteve-se o resultado apresentado na equação B.3, com um
coeficiente de correlação “r2” praticamente unitário (1 − 4,69 × 10 − 8 ), quando os

fatores “a”, “b” e “c” são utilizados com toda a precisão disponível.

H = − 24,39871 + 19,41222 ⋅ Q1,902871 (B.3)

Também para o exemplo foi determinada a massa total, dada pela


equação B.4. obtendo-se o resultado de 2,663 Kg.

n
M = ∑ mi (B.4)
i =1

Da mesma forma, pelo processo adequado, pode-se encontrar


qualquer lei ou grandeza equivalente do sistema (p.e. custo, área de pintura, etc...)
para que se passe a tratá-lo como componente.
212

ANEXO C

Prosseguindo no objetivo de esclarecer melhor a metodologia de


visualização e representação de um sistema de distribuição de água fria e quente em
edifício, apresenta-se agora, de maneira semelhante à solução contida no Anexo B,
um exemplo, em suas características de vazão e altura manométrica, para rede
fechada, utilizando-se a metodologia apresentada no Capítulo 6.

C.1 Enunciado e Considerações Iniciais.

Dando continuidade ao exemplo do Anexo B, a Figura C.1


apresenta uma rede em anel, que alimenta 6 conjuntos de torneiras, cada qual como
descrito naquele Anexo.

Fig. C.1 Esquema da rede de distribuição para os lavatórios coletivos.

O objetivo do exemplo é determinar quais as condições de


213

operação, estando um dos lados em operação simultânea (todas as 15 torneiras); isto


visa verificar quais as vazões e cargas reais que surgem no sistema.

Os diâmetros dos tubos foram pré-dimensionados tomando-se por


premissa que cada lavatório opere com 50% da vazão total, limitando-se a
velocidade máxima a 3,0 m/s.

Dessa maneira, como a operação a ser verificada consta de 100%


de operação em somente um dos lados, supõe-se que o braço oposto da rede possa
prover a alimentação necessária a essa diferença.

C.2 Encaminhamento da Solução.

Uma vez identificados e numerados todos os componente do


sistema, como se pode ver na Figura C.1, é possível, com base no Anexo A, escrever
as leis hidráulicas pertinentes a cada um deles.

No entanto, para obtermos uma redução no número desses


componentes, definimos alguns componente intermediários, utilizando a técnica
apresentada no item 6.5.3, especificamente a equação 6.9.

A Tabela C.1 apresenta essas determinações.


214

TABELA C.1 - DETERMINAÇÃO DOS COMPONENTES EQUIVALENTES


Compo-
No.
nentes
Equiva-
agrega- ( Z Ai − Z Bi ) Lei equivalente
lente
dos ∆Hi (eq. 6.9)
2 3,099834 × 10 −1 s (Q ) ⋅ Q
1, 75 0,00
3 1,75 6,00
1,347754× 10−1 ⋅ 6,0 ⋅ s(Q) ⋅ Q
40 4 4,312812 × 10− 1 s (Q) ⋅ Q
1, 75 0,00 H B 40 = H A 40
5 1,347754× 10−1 ⋅ 2,0 ⋅ s(Q) ⋅ Q
1,75 0,00 1, 75
− 2,318137 ⋅ s (QB 40 ) Q B 40
6 4,312812 × 10− 1 s (Q) ⋅ Q
1, 75 0,00
+ 65
7 −1 1,75 0,50
1,347754× 10 ⋅ 0,5 ⋅ s(Q) ⋅ Q
41 8 7,779705 × 10 − 1 s (Q) ⋅ Q
1, 75 0,00 H B 41 = H A 41
1,75 1, 75
9 3,889853× 10−1 ⋅ 2,0 ⋅ s(Q) ⋅ Q 0,00 − 1,555941 ⋅ s (QB 41 ) ⋅ QB 41
11 3,889853× 10−1 ⋅ 2,0 ⋅ s(Q) ⋅ Q
1,75 0,00 H B 42 = H A 42
42 12 1, 75 0,00 1, 75
7,779705 × 10 − 1 s (Q) ⋅ Q − 3,500868 ⋅ s (QB 42 ) ⋅ QB 42
14 1,75 0,00
3,889853× 10−1 ⋅ 5,0 ⋅ s(Q) ⋅ Q
32 1, 75 0,00
1,790149 ⋅ s(Q) ⋅ Q
43 H B 43 = H A 43
33 1,193433 ⋅ 4 , 0 ⋅ s (Q ) ⋅ Q
1, 75 0,00
1
1, 75 − 1, 432120 × 10 ⋅ s (Q B 43 ) ⋅
30 1,790149 ⋅ s(Q) ⋅ Q 0,00
1, 75
29 1, 75 0,00 Q B 43
1,193433 ⋅ 5,0 ⋅ s (Q ) ⋅ Q

Com esse conjunto de componentes equivalentes, a Figura C.1


toma o aspecto apresentado em C.2.

Fig. C.2 Esquema da rede de distribuição com os componentes equivalentes.


215

A partir dessa nova representação da rede de distribuição, pode-se


iniciar a determinação das leis e valores de cada componente como visto na Tabela
C.2.

TABELA C.2 - VALORES E LEIS PARA OS COMPONENTES DO EXEMPLO.


[Q]=L/s; [H]=KPa.
Componente ReferênciaC.1 Leis
1 item A.7. H s1 = 5,0
Q A40 = − QB 40
1, 75
40
Tabela C.1 H B 40 = H A 40 − 2,318137 ⋅ s (Q B 40 ) Q B 40
+ 65
10
Tabela A.8. Q A10 + QB10 + QC10 = 0
DN - 50 2 equações da Tabela A.7.
Q A42 = − QB 42
42 Tabela C.1 1, 75
H B 42 = H A42 − 3,500868 ⋅ s(Q B 42 ) ⋅ QB 42
Q A41 = − QB 41
41 Tabela C.1 1, 75
H B 41 = H A41 − 1,555941⋅ s (QB 41 ) ⋅ QB 41
16
Tabela A.8. Q A16 + QB16 + QC16 = 0
DN - 40 2 equações da Tabela A.7.
Tabela B.5. Q E 39 = − Q S 39
39 1,902871
eq. B.3 H E 39 = − 24,39871+ 19,41222 ⋅ s(QS 39 ) ⋅ QS 39

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

TABELA C.2 - VALORES E LEIS PARA OS COMPONENTES DO EXEMPLO


[Q]=L/s; [H]=KPa.. (Cont.)
Componente Referência Leis
20
Tabela A.8. Q A20 + QB 20 + QC 20 = 0
DN – 32 2 equações da Tabela A.7
Tabela A.3. Q A22 = − QB 22
22 1, 75
DN – 32 H = H − 1,193433 ⋅ 5,0 ⋅ s(Q )⋅ Q
B 22 A 22 B 22 B 22

Tabela A.4. Q A21 = − QB 21


21 1, 75
DN – 32 H B 21 = H A21 − 1,193433 ⋅ 5,0 ⋅ s (Q B 21 ) ⋅ Q B 21

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

A seguir, representa-se a influência de cada componente sobre os


outros, através do grafo, como se vê na Figura C.3, transportando-se essas relações
para a tabela de relações (Tabela C.3).
217

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

Fig. C.3 Grafo de relações para o sistema da Figura C.2

TABELA C.3 - DESCRIÇÃO DAS RELAÇÕES ENTRE OS COMPONENTES


DO SISTEMA EXEMPLO, DE ACORDO COM O GRAFO DA
FIGURA C.3
No. da relação Leis contidas na relação
r1;40 Qs1 = − Q A40 | H s1 = H A40
r40;10 QB 40 = − QC10 | H B 40 = H C10
r10;42 QB10 = − Q A42 | H B10 = H A42
r42;16 QB 42 = − Q A16 | H B 42 = H A16
r16;39 QC16 = − QE 39 | H C19 = H E 39
r16;19 QB16 = − QB19 | H B16 = H B19
r10;41 Q A10 = − Q A41 | H A10 = H A41
r41;13 QB 41 = − QB13 | H B 41 = H B13
r13;15 Q A13 = − Q A15 | H A13 = H A15
r15;17 QB15 = − QB17 | H B15 = H B17
r17;18 QC17 = − Q A18 | H C17 = H A18
r18;19 QB18 = − QC19 | H B18 = H C19
r19;21 Q A19 = − Q A21 | H A19 = H A21
r21;23 QB 21 = − Q A23 | H B 21 = H A23
r23;26 QB 23 = − Q A26 | H B 23 = H A26
r23;38 QC 23 = − QE 38 | H C 23 = H E 38
r26;25 QC 26 = − QB 25 | H C 26 = H B 25
218

TABELA C.3 - DESCRIÇÃO DAS RELAÇÕES ENTRE OS COMPONENTES


DO SISTEMA EXEMPLO, DE ACORDO COM O GRAFO DA
FIGURA C.3 (cont.)

No. da relação Leis contidas na relação


r25;24 Q A25 = − QC 24 | H A25 = H C 24
r24;22 QB 24 = − QB 22 | H B 24 = H B 22
r22;20 Q A20 = − Q A22 | H A20 = H A22
r17;20 Q A17 = − QB 20 | H A17 = H B 20
r26;28 QB 26 = − Q A28 | H B 26 = H A28
r28;31 QB 28 = − Q A31 | H B 28 = H A31
r31;37 QC 31 = − QE 37 | H C 31 = H E 37
r31;43 QB 31 = − Q A43 | H B31 = H A43
r43;27 QB 43 = − Q A27 | H B 43 = H A27
r24;27 Q A24 = − QB 27 | H A24 = H B 27

O conjunto de Leis dos componentes (Tabela C.2), unido ao


conjunto de relações (Tabela C.3) formam um sistema de equações não lineares que,
uma vez resolvido traz a solução desejada; no entanto, o número de incógnitas e
equações é bastante elevado.

Aproveitando-se do fato de que várias dessas equações são apenas


igualdade entre duas variáveis (ou seus simétricos), aplica-se uma redução de seu
número, através do mecanismo de silogismo apresentado no Capítulo 6, como se vê
na Tabela C.4
219

TABELA C.4 - REDUÇÃO DO NÚMERO DE INCÓGNITAS ATRAVÉS DE


SILOGISMO.
Variável genérica Variáveis equivalentes
X(1) Q
A 40 = − QB 40 = Qs1 = QC10
X(2) Q A42 = − QB 42 = − QB10 = Q A16
X(3) Q A41 = − QB 41 = − Q A10 = QB13
X(4) QE 39 = − Qs 39 = − QC16
X(5) Q A15 = − QB15 = − Q A13 = QB17
X(6) Q A18 = − QB18 = − QC17 = QC19
X(7) Q A22 = − QB 22 = − Q A20 = QB 24
X(8) Q A21 = − QB 21 = − Q A19 = Q A23
X(9) QE 38 = − QS 38 = − QC 23
X(10) Q A25 = − QB 25 = QC 26 = − QC 24
X(11) Q A28 = − QB 28 = − QB 26 = Q A31
X(12) QE 37 = − QS 37 = − QC 31
X(13) Q A43 = − QB 43 = − QB 31 = Q A27
X(14) QB 23 = − Q A26
X(15) Q A17 = − QB 20
X(16) Q A24 = − QB 27
X(17) QB16 = − QB19
X(18) H S1 = H A40
X(19) H B 40 = H C10
X(20) H B10 = H A42
X(21) H B 42 = H A16
X(22) H C16 = H E 39
X(23) H B16 = H B19
X(24) H A10 = H A41
X(25) H B 41 = H B13
X(26) H A13 = H A15
X(27) H B15 = H B17
X(28) H C17 = H A18
X(29) H B18 = H C19
220

TABELA C.4 - REDUÇÃO DO NÚMERO DE INCÓGNITAS ATRAVÉS DE


SILOGISMO (cont.)
X(30) H A19 = H A21
X(31) H = HB 21 A 23
X(32) H B 23 = H A26
X(33) H C 23 = H E 38
X(34) H C 26 = H B 25
X(35) H A25 = H C 24
X(36) H B 24 = H B 22
X(37) H A20 = H A22
X(38) H A17 = H B 20
X(39) H B 26 = H A28
X(40) H B 28 = H A31
X(41) H C 31 = H E 37
X(42) H B31 = H A43
X(43) H B 43 = H A27
X(44) H A24 = H B 27
X(45) H C 20
X(46) H C13
X(47) H C 27

Na seqüência, as variáveis genéricas da Tabela C.4 são aplicadas,


segundo suas correspondentes, naquelas leis internas de componentes que não
tenham sido contempladas na aplicação do silogismo, geralmente as que não
apresentaram igualdade direta ou simetria entre duas grandezas. Esse processo
produz o sistema de equações apresentado como equação C.1, a seguir, que para
adequarem-se ao algoritmo de solução devem ser arranjadas de forma a terem um de
seus membros nulos.

Observa-se ainda que, como não se pode determinar, “a priori”, a


configuração de operação das conexões “tê”, suas equações estão apenas indicadas,
com sendo uma aquelas correspondentes a sua configuração, segundo a Tabela A.7,
221

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

De forma similar ao apresentado no Anexo B, para que se tenha a


solução desse sistema de equações não lineares, é necessário que se faça uma
aproximação inicial dos resultados. Da qualidade dessa aproximação inicial depende
não somente a velocidade de convergência mas também a própria ocorrência de
convergência e se esta levará a resultado correto ou sem sentido físico.
223

Para tal aproximação inicial, tomaram-se, com base em


experiências anterioresC.2., que cerca de 15% da carga estática estaria disponível na
entrada dos ramais, avaliando-se a vazão desses para esta carga.

A distribuição preliminar de vazões foi efetuada tendo como


critério que cerca de 60% dessa seguiria o caminho mais direto e 40% o alternativo
(fig. C.2).

Os valores da aproximação inicial podem ser vistos na Tabela C.5.

TABELA C.5 - APROXIMAÇÃO INICIAL.


Variável Valor Variável Valor Variável Valor Variável Valor
X1 -4,0521 X13 0,5403 X25 10,00 X37 10,00
X2 -2,2287 X14 0,4052 X26 10,00 X38 10,00
X3 -1,8234 X15 0,9455 X27 10,00 X39 10,00
X4 -1,3507 X16 0,5403 X28 10,00 X40 10,00
X5 -1,8234 X17 0,8780 X29 10,00 X41 10,00
X6 -0,8779 X18 5,00 X30 10,00 X42 10,00
X7 -0,9455 X19 10,00 X31 10,00 X43 10,00
X8 -1,7559 X20 10,00 X32 10,00 X44 10,00
X9 -1,3507 X21 10,00 X33 10,00 X45 10,00
X10 -0,4052 X22 10,00 X34 10,00 X46 10,00
X11 -0,8104 X23 10,00 X35 10,00 X47 10,00
X12 -1,3507 X24 10,00 X36 10,00

De posse das equações C.1 e das aproximações iniciais


apresentadas na Tabela C.5, pode-se determinar os valores de X1 a X47.

Tal tarefa foi executada no mesmo sistema de processamento


utilizado para o Anexo B.

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

As listagens do programa principal para solução do presente


exemplo, a descrição do formulário e da biblioteca para resolução do sistema não
linear de equações são apresentados no Apêndice IV.

A execução daquele código apresentou os resultados constantes da


listagem C.1, que devem ser conjugados às variáveis reais segundo a tabela de
silogismo.

ListagemC.1 - Resultados da execução do código apresentado.


Resultados...
Foram efetuadas 5 iterações.
Consumidos 3,975 segundos
X[ 1]= -4,012112E+000
X[ 2]= -2,446750E+000
X[ 3]= -1,565362E+000
X[ 4]= -1,516219E+000
X[ 5]= -1,565362E+000
X[ 6]= -4,503742E-001
X[ 7]= -1,114988E+000
X[ 8]= -1,380905E+000
X[ 9]= -1,239736E+000
X[10]= -5,112297E-001
X[11]= -6,523985E-001
X[12]= -1,256156E+000
X[13]= 6,037578E-001
X[14]= 1,411688E-001
X[15]= 1,114988E+000
X[16]= 6,037578E-001
X[17]= 9,305306E-001
X[18]= 5,000000E+000
X[19]= 4,363414E+001
X[20]= 3,892475E+001
X[21]= 2,216731E+001
X[22]= 1,846030E+001
X[23]= 2,165291E+001
X[24]= 4,147884E+001
X[25]= 3,807029E+001
X[26]= 3,679209E+001
X[27]= 2,372004E+001
X[28]= 2,280400E+001
X[29]= 2,162201E+001
X[30]= 2,070598E+001
X[31]= 1,020923E+001
X[32]= 1,017431E+001
X[33]= 4,820512E+000
X[34]= 1,128290E+001
X[35]= 1,275839E+001
X[36]= 1,390189E+001
X[37]= 2,112112E+001
X[38]= 2,242058E+001
X[39]= 1,013939E+001
X[40]= 7,313435E+000
X[41]= 5,561341E+000
X[42]= 7,091264E+000
X[43]= 1,301355E+001
225

Listagem C.1 - Resultados da execução do código apresentado. (cont.)


X[44]= 1,345772E+001
X[45]= 2,242058E+001
X[46]= 3,807029E+001
X[47]= 1,345772E+001

Erros nas equações propostas...


f 1(X)= 0,000000000000
f 2(X)= 0,000000000000
f 3(X)= 0,000000000000
... prosseguindo até...
f46(X)= 0,000000000000
f47(X)= 0,000000000000

C.3 Considerações sobre o Exemplo.

Os resultados obtidos foram verificados e contemplam tanto a “Lei


dos nós” como a “Lei das Malhas” para a rede estudada.

O tradicional método de solução para redes em malha, o método de


Hardy-Cross, (GILES, 1976) é, de fato, um método de solução para o sistema não
linear de equações formado pela aplicação da “Lei das malhas”, mas, diferentemente
do método apresentado no Capítulo 6, não possibilita o cálculo com vazões reais,
tampouco a consideração das conexões “tê” com seu modo real de operação.

Essas características fazem com que este tradicional método não


apresente resultados tão adequados, no cálculo de redes prediais de distribuição de
água, como aqueles apresentados para as redes de distribuição urbana de água, onde
as perdas de carga devidas às conexões são mínimas, quando comparadas com
aquelas originadas nos tubos, diferentemente do que ocorre nas redes prediais.

Por fim, a posse de resultados como esse apresentado, torna


possível uma série de análises, como a determinação das linhas piezométricas,
verificação de pressões muito baixas, localização de trechos e componentes
226

responsáveis por altas perdas de carga e outros, proporcionando um conhecimento


mais apurado sobre o sistema e sua operação.
227

ANEXO D

Apresenta-se a seguir uma possível aplicação de simulação


populacional desenvolvida utilizando-se a metodologia apresentada no Capítulo 9.

D.1 Enunciado e Considerações Iniciais.

Propõe-se a execução de simulações populacionais em um edifício


hipotético com as seguintes características:

• 40 apartamentos (10 pvtos x 4 aptos/pav.);


• 1 família por apartamento;
• máximo de 7 membros por família;
• cerca 10% de apartamentos desocupados no início da
simulação;
• distribuições populacionais apresentadas no Capítulo 9;
• tempo médio de desocupação para apartamentos próprios de 10
anos, com desvio de 3 anos, seguindo distribuição gama, até o
limite de 40 anosD.1;
• tempo médio de desocupação para apartamentos alugados de 2
anos, com desvio de 6 meses, seguindo distribuição gama, até o
limite de 10 anosD.1;

D.1
De fato a distribuição de probabilidades se estende ao infinito, mas deve ser
imposto um limite para efeitos práticos.
228

• tempo médio de rehabitação da unidade habitacional


(economia) de 90 dias, com desvio de 25 dias, seguindo
distribuição gama, até o limite de 1 anoD.1.

D.2 Encaminhamento da Solução.

A simulação efetivada baseia-se na implementação prática dos 4


objetos de dados apresentados na Figura 9.1, com as seguintes especificidades:

a) objeto “Pessoa”: implementado através de uma classe básica


“TPessoa”, que permite manipular as informações comuns a homens e mulheres,
como data de nascimento, data de óbito, e outras; dessa classe derivam-se
“THomem” e “TMulher” para a manipulação de dados específicos ligados ao
gênero, como gravidez, parto e outros;

b) objeto “Familia”: implementado através da classe “TFamilia”,


consta de um agrupameto de pessoas, limitado a conter 7 pessoas, por premissa da
simulação. Como há premissa de somente uma família por economia praticamente
se confunde com esta;

c) objeto “Economia”: implementado através da classe


“TEconomia”, contém, além de seu objeto “Família”, as propriedades referentes à
entrada e saída de famílias, tipo de vínculo contratual do imóvel e outras que atinjam
seus moradores como um todo. Como há, somente, por premissa, uma familia por
economia, conceitualmente se confunde com aquela.
229

d) objeto “Prédio”: implentado através da classe “TPredio”,


contém, além das economias consideradas, os métodos apropriados para se
estabelecer a dinâmica populacional, dentre os quais merecem destaque os seguintes:

• “PopularInicial”: determina uma posição inicial de população


para o edifício;
• “ProcessaEntradaSaida”: mantém a dinâmica populacional
quanto à habitação de cada economia como um todo,
removendo ou inserindo “Famílias” como um grupo, segundo
as distribuições pertinentes aos tipos de posse do imóvel;
• “ProcessaNasceMorre”: mantém a dinâmica populacional sob
a ótica do indivíduo, i.e. adiciona ou remove pessoas
individualmente dentro das “Famílias”, verificando e
estabelecendo datas de nascimento óbito, de maneira
individual; também mantém a dinâmica de “gravidez” e
“partos”, uma vez que os nascimentos são determinados
estatisticamente segundo a idade das mães;

O processo é controlado globalmente por um “Relógio de


Simulação” (descrito no Capítulo 8), que aciona o próximo “passo” da dinâmica
populacional a cada mudança de data.

Os valores são registrados por um vetor de 40 registradores, do tipo


“TRegVal” (ver cap. 8), com a função de registrar, a cada dia do “tempo de
simulação”, a população de cada uma das economias. Há ainda um outro registrador
cuja função é registrar, também a cada dia, a população total da edificação.

Os detalhes de programação e interface dessa simulação podem ser


População [hab] População [hab] População [hab] População [hab]

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

a cada variável independente.


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

População [hab] População [hab] População [hab] População [hab]

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

Fig. D.1. Resultado de 8 simulações populacionais.


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 01/01/11

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

os mesmos dados de entrada, variando somente segundo a “aleatoriedade” permitida


A Figura D.1 apresenta o resultado de 8 simulações efetuadas com
231

D.4 Considerações sobre o Exemplo.

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:

1) as médias populacionais das 8 distribuições se aproximam do


valor constante correspondente à média de todos os pontos calculados (8 x
7306=58448 pontos). Efetuando-se um teste χ2, entre as 8 médias e oito pontos
iguais à média geral, atesta-se tal afirmativa como correta em grau correspondente a
98% .

2) de maneira semelhante, os 8 valores máximos quando


comparados à seqüência constante formada pela média dentre os mesmo, também
por um teste χ2, apresenta-se com uma aderência de 99,6 %.

3) já a medida de aderência do desvio ao desvio médio revela-se de


grau relativamente baixo, cerca de 82,8%, indicando que as distribuições tendem a
apresentar-se de maneira diferente;

4) por fim, para que fique caracterizado que, apesar de médias e


máximos bem próximo, as distribuições apresentadas na Figura D.1. são bastante
diferentes, fez-se o teste χ2 para a assimetria e curtose das mesmas, em relação à
assimetria e curtose médias, obtendo-se graus de aderência de 15,6% e 0,31%
232

respectivamente;

Deve-se observar ainda que as diversas economias do edifício


foram tratadas como iguais, para efeito da simulação populacional, o que é bastante
razoável.

No entanto, ao ser integrada com a simulação do acionamento de


aparelhos e a conseqüente “resposta” do sistema hidráulico, podem ocorrer
diferenças decorrentes da distribuição populacional entre as economias,
especialmente pelo fato de não haver igualdade entre a operação de um determinado
aparelho instalado em pavimentos de níveis diferentes, e, portanto, sujeito a pressões
diferentes.

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.

Tal fato gera, desta maneira, um número muito grande de possíveis


distribuições populacionais, que podem divergir em muito de premissas mais
simplistas como por exemplo um número médio de habitantes em cada economia,
com distribuição uniforme.

Para se ter em conta tais efeitos, assim como verificar possíveis


ocorrências de pontos extremos que despertem interesse, deve-se proceder diversas
simulações no conjunto.
233

Observa-se ainda que há mais sentido em um número maior de


simulações de poucos anos, como aqui apresentado (8 simulações de 20 anos), do
que em uma simulação com um número maior de anos (p.e. uma única simulação de
160 anos), pois que o conjunto de dados de origem, tomados para a determinação da
probabilidade dos diversos eventos envolvidos, perde significância à medida em que
se afasta do tempo de sua coleta.
234

ANEXO E

Para a aplicação apresentada no Capítulo 12 foi desenvolvido um


programa de computador (listagens no Apêndice VIII), que integra os principais
mecanismos de simulação apresentados no presente trabalho: população,
comportamento de usuários, operação de aparelhos e operação de rede.

O aspecto da interface de tal programa pode ser visto na figura E.1.

Fig. E.1.. Aspecto da tela do programa de aplicação.

Através da mesma é possível a seleção do incremento de tempo


simulado, do intervalo de registro de parâmetros e da forma como é efetuada a
gravação dos resultados.

Na guia “população” é possível verificar a população simulada de


cada apartamento, em cada dia, e proceder o registro dessa população, conforme
235

Figura E.2.

Fig. E.2. Aspecto da tela de população.

Durante o processo de simulação podem ser acompanhados os


tempos simulado e real, assim como o acionamento de aparelhos, através da tabela
que pode ser vista na Figura E.3, onde a marca em forma de “X” significa “aparelho
em operação” e não necessariamente drenando água da rede.

Fig. E.3. Aspecto do acompanhamento visual; da simulação


236

E.1 Implementação da Rede de Distribuição.

A rede de distribuição foi implementada de forma hierárquica, ou


seja:

• ramais contendo aparelhos e respondendo a determinado valor


de pressão aplicado em sua entrada com a correspondente vazão
de entrada, resultante da soma das vazões dos aparelhos após o
cálculo de equilíbrio da rede;

• colunas de distribuição tendo ramais como aparelhos, também


respondendo com determinada vazão de entrada, dado uma
configuração desses ramais e determinado valor de pressão de
entrada;

• barrilete, que também pode ser enfocado como a rede geral,


tendo pressão constante em sua entrada (lâmina d’água do
reservatório), tendo as colunas como seus “aparelhos”,
respondendo com uma vazão de entrada às possíveis
configurações de todos os aparelhos em todos os ramais;

Essa abordagem se fez necessária por dois motivos: aproveitamento


do alto índice de repetição presente e devido ao fato de, se processada como um
todo, a matriz “jacobiana” do sistema de equações ficaria com mais de um milhão
(sic) de elementos, uma vez que o sistema total teria número de incógnitas superior a
1000.
237

Dessa forma, as equações tomadas a partir das leis dos aparelhos


(verdadeiros ou “equivalentes”), são expressas em termos de vazão, e não de
pressão, como feito nos Anexos B e C.

A seguir apresentamos, para cada estrutura considerada, de forma


simplificada, sua numeração de componentes, redução de variáveis e equações.
Também são apresentados, separadamente, os valores que concorrem para a
determinação das perdas de carga, uma vez que sendo estas determinadas através da
fórmula universal, seus parâmetros não podem compor diretamente as equações de
pressão no sistema de equações.

E.1.1. Ramal H1.

A Figura E.5 apresenta o esquema isométrico do ramal H-1.

Fig. E.5. Ramal H1 - esquema.

A Tabela E.1 apresenta a descrição dos componentes desse ramal,


utilizando-se da seguinte convenção:
238

Num - número do componente;


Desc – descrição;
LD – comprimento equivalente direto;
LL – comprimento equivalente lateral;
Di – diâmetro interno;
y – altura de carga na entrada;
Ze – nível da entrada;
Zs – nível da saída;
DH(..) – perda de carga no trecho;
Q – vazão;
H – altura de carga.

TABELA E.1 – DESCRIÇÃO DE COMPONENTES PARA O RAMAL H-1.


Num Desc LD LL Di y Ze Zs Lei 1 Lei 2 Lei 3
1 PC Qe1=Qs1 Qe1=fq(He1;Tipo de PC-1)
2 J 1,1 17 1,2 1,2 Qe2=Qs2 Hs2=He2-DH2
3 Tubo 0,8 17 1,2 1,2 Qe3=Qs3 Hs3=He3-DH3
4 T-bi 2,3 2,3 17 1,2 1,2 Qe4=QSa4+QSb4 HsLa4=He4-DH(Lat)4 HsLb4=He4-DH(Lat)4
5 Tubo 0,4 17 1,2 1,2 Qe5=Qs5 Hs5=He5-DH5
6 T-DL 0,7 2,3 17 1,2 1,2 Qe6=Qd6+QL6 HsL6=He6-DH(Lat)6 Hsd6=He6-DH(Dir)6
7 TQ Qe7=Qs7 Qe7=fq(He7;Tipo de TQ-7)
8 Tubo 0,8 17 1,2 1,2 Qe8=Qs8 Hs8=He8-DH8
9 J 1,1 17 1,2 1,2 Qe9=Qs9 Hs9=He9-DH9
10 ML Qe10=Qs10 Qe10=fq(He10;Tipo de ML-10)
11 Tubo 0,6 17 1,8 1,2 Qe11=Qs11 Hs11=He11-DH11+0,6*g*ro
12 J 1,1 17 1,8 1,8 Qe12=Qs12 Hs12=He12-DH12
13 RG 0,1 17 1,8 1,8 Qe13=Qs13 Hs13=He13-DH13
14 Tubo 0,2 17 1,8 1,8 Qe14=Qs14 Hs14=He14-DH14

As relações entre os componentes são apontadas pela Tabela E.2.


239

TABELA E-2 – RELAÇÕES ENTRE COMPONENTES PARA RAMAL H-1.


i j R Rel-1 Rel-2
14 13 R[14-13] Qs14=Qe13 Hs14=He13
13 12 R[13-12] Qs13=Qe12 Hs13=He12
12 11 R[12-11] Qs12=Qe11 Hs12=He11
11 4 R[11-4] Qs11=Qe4 Hs11=He4
4 3 R[4-3] Qsa4=Qe3 HsLa4=He3
3 2 R[3-2] Qs3=Qe2 Hs3=He2
2 1 R[2-1] Qs2=Qe1 Hs2=He1
4 5 R[4-5] Qsb4=Qe5 HsLb4=He5
5 6 R[5-6] Qs5-Qe6 Hs5=He6
6 8 R[6-8] Qsd6=Qe8 Hsd6=He8
8 9 R[8-9] Qs8=Qe9 Hs8=He9
9 10 R[9-10] Qs9=Qe10 Hs9=He10
6 7 R[6-7] QsL6=Qe7 HsL6=He7

A Tabela E.3, por sua vez, apresenta as variáveis já reduzidas por


silogismo, a partir da análise das leis e relações entre componentes.

TABELA E.3 – VARIÁVEIS GENÉRICAS.

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

O sistema de equações a ser resolvido para o ramal H-1 é


apresentado na Tabela E.4.
240

TABELA E.4 – EQUAÇÕES SIMULTÂNEAS PARA RAMAL TIPO H1.


Sistema de Equações
f1 X1+X2-X5=0
f2 X4+X3-X2=0
f3 X1-fq(X12;Tipo de PC-1)=0
f4 X11-DH2-X12=0
f5 X10-DH3-X11=0
f6 X9-DH(Lat)4-X10=0
f7 X13-DH5-X14=0
f8 X14--DH(Lat)6-X18=0
f9 X3-fq(X18;Tipo de TQ-7)=0
f10 X15-DH8-X16=0
f11 X16-DH9-X17=0
f12 X4-fq(X17;Tipo de ML-10)=0
f13 X8-DH11+0,6*g*ro-X9=0
f14 X7-DH12-X8=0
f15 X6-DH13-X7=0
f16 He14-DH14-X6=0
f17 X9-DH(Lat)4-X13=0
f18 X14-DH(Dir)6-X15=0

Deve-se observar sobre a variável “He14”, na implementação


assimilada a “X19”, que não se trata de uma das incógnitas, mas é utilizada para
conduzir, durante a solução do sistema de equações, a carga de entrada do ramal.

E.1.2. Ramal H2.

A Figura E.6 apresenta o esquema isométrico do ramal H-2.

Fig. E.6 Ramal H2 - esquema.


241

As tabela a seguir apresentam as características do ramal H-2,


seguindo a mesma seqüência e convenção utilizada para o ramal H-1.

TABELA E.5 – DESCRIÇÃO DE COMPONENTES PARA O RAMAL H-2.


Num Desc LD LL Di y Ze Zs Lei 1 Lei 2 Lei 3
1 BS Qe1=Qs1 Qe1=fq(He1;Tipo de BS-1)
2 J 1,1 17 0,2 0,2 Qe2=Qs2 Hs2=He2-DH2
3 Tubo 0.4 17 0,6 0,2 Qe3=Qs3 Hs3=He3-DH3+0,4*g*ro
4 J 1,1 17 0,6 0,6 Qe4=Qs4 Hs4=He4-DH4
5 Tubo 0,7 17 0,6 0,6 Qe5=Qs5 Hs5=He5-DH5
6 T-DL 0,7 2,3 17 0,6 0,6 Qe6=Qd6+QL6 HsL6=He6-DH(Lat)6 Hsd6=He6-DH(Dir)6
7 LV Qe7=Qs7 Qe7=fq(He7;Tipo de LV-7)
8 Tubo 1 17 0,6 0,6 Qe8=Qs8 Hs8=He8-DH8
9 J 1,1 17 0,6 0,6 Qe9=Qs9 Hs9=He9-DH9
10 Tubo 0,5 17 1,1 0,6 Qe10=Qs10 Hs10=He10-DH10+0,5*g*ro
11 T-bi 2,3 2,3 17 1,1 1,1 Qe11=QSa11+QSb11 HsLa11=He11-DH(Lat)11 HsLb11=He11-DH(Lat)11
12 RP 11,1 17 1,1 1,2 Qe12=Qs12 Hs12=He12-DH12+-0,1*g*ro
13 Tubo 1,1 17 1,2 2,2 Qe13=Qs13 Hs13=He13-DH13+-1*g*ro
14 J 1,1 17 2,2 2,2 Qe14=Qs14 Hs14=He14-DH14
15 CH Qe15=Qs15 Qe15=fq(He15;Tipo de CH-15)
16 Tubo 0,2 17 1,1 1,1 Qe16=Qs16 Hs16=He16-DH16
17 J 1,1 17 1,1 1,1 Qe17=Qs17 Hs17=He17-DH17
18 Tubo 0,7 17 1,8 1,1 Qe18=Qs18 Hs18=He18-DH18+0,7*g*ro
19 J 1,1 17 1,8 1,8 Qe19=Qs19 Hs19=He19-DH19
20 RG 0,1 17 1,8 1,8 Qe20=Qs20 Hs20=He20-DH20
21 Tubo 0,25 17 1,8 1,8 Qe21=Qs21 Hs21=He21-DH21

As relações entre os componentes são apontadas pela Tabela E.6.

TABELA E-6 – RELAÇÕES ENTRE COMPONENTES PARA RAMAL H-2.


i j R Rel-1 Rel-2
21 20 R[21-20] Qs21=Qe20 Hs21=He20
20 19 R[20-19] Qs20=Qe19 Hs20=He19
19 18 R[19-18] Qs19=Qe18 Hs19=He18
18 17 R[18-17] Qs18=Qe17 Hs18=He17
17 16 R[17-16] Qs17=Qe16 Hs17=He16
16 11 R[16-11] Qs16=Qe11 Hs16=He11
11 a 12 R[11-12] Qsa11=Qe12 Hsa11=He12
12 13 R[12-13] Qs12=Qe13 Hs12=He13
13 14 R[13-14] Qs13=Qe14 Hs13=He14
14 15 R[14-15] Qs14=Qe15 Hs14=He15
11 b 10 R[11-10] Qsb11=Qe10 Hsb11=He10
10 9 R[10-9] Qs10=Qe9 Hs10=He9
9 8 R[9-8] Qs9=Qe8 Hs9=He8
8 6 R[8-6] Qs8=Qe6 Hs8=He6
6 L 7 R[6-7] QsL6=Qe7 HsL6=He7
6 d 5 R[6-5] Qsd6=Qe5 Hsd6=He5
5 4 R[5-4] Qs5=Qe4 Hs5=He4
4 3 R[4-3] Qs4=Qe3 Hs4=He3
3 2 R[3-2] Qs3=Qe2 Hs3=He2
2 1 R[2-1] Qs2=Qe1 Hs2=He1
242

A Tabela E.7, por sua vez, apresenta as variáveis já reduzidas por


silogismo, a partir da análise das leis e relações entre componentes.

TABELA E.7 – VARIÁVEIS GENÉRICAS.


Variável
Variável específica
Genérica
X1 Qe1/Qs1/Qs2/Qe2/Qs3/Qe4/Qs4/Qs5/Qe5/Qsd6
X2 Qe7/Qs7/QsL6
X3 Qe8/Qs8/Qe6/Qs9/Qe9/Qs10/Qe10/Qsb11
X4 Qs12/Qe12/Qe13/Qsa11/Qs13/Qe14/Qs14/Qe15/Qs15
X5 Qe16/Qs16/Qe11/Qs17/Qe17/Qs18/Qe18/Qs19/Qe19/Qs20/Qe20/Qs21/Qe21
X6 Hs21/He20
X7 Hs20/He19
X8 Hs19/He18
X9 Hs18/He17
X10 Hs17/He16
X11 Hs16/He11
X12 Hs11/He12
X13 Hs12/He13
X14 Hs13/He14
X15 Hs14/He15
X16 Hsb11/He10
X17 Hs10/He9
X18 Hs9/He8
X19 Hs8/He6
X20 HsL6/He7
X21 Hsd6/He5
X22 Hs5/He4
X23 Hs4/He3
X24 Hs3/He2
X25 Hs2/He1

O sistema de equações a ser resolvido para o ramal H-2 é


apresentado na Tabela E.8.
243

TABELA E.8 – EQUAÇÕES SIMULTÂNEAS PARA RAMAL TIPO H2.


Sistema de Equações
f1 X1+X2-X3=0
f2 X4+X3-X5=0
f3 X1-fq(X25;Tipo de BS-1)=0
f4 X24-DH2-X25=0
f5 X23-DH3+0,4*g*ro-X24=0
f6 X22-DH4-X23=0
f7 X21-DH5-X22=0
f8 X19-DH(Lat)6-X20=0
f9 X2-fq(X20;Tipo de LV-7)=0
f10 X18-DH8-X19=0
f11 X17-DH9-X18=0
f12 X16-DH10+0,5*g*ro-X17=0
f13 X11-DH(Lat)a11-X12=0
f14 X12-DH12+-0,1*g*ro-X13=0
f15 X13-DH13+-1*g*ro-X14=0
f16 X14-DH14-X15=0
f17 X4-fq(X15;Tipo de CH-15)=0
f18 X10-DH16-X11=0
f19 X9-DH17-X10=0
f20 X8-DH18+0,7*g*ro-X9=0
f21 X7-DH19-X8=0
f22 X6-DH20-X7=0
f23 X26-DH21-X6=0
f24 X19-DH(Dir)6-X21=0
f25 X11-DH(Lat)b11-X16=0

Deve-se observar sobre a variável “X26” que não se trata de uma


das incógnitas, mas é utilizada para conduzir, durante a solução do sistema de
equações, a carga de entrada do ramal.

E.1.3. Colunas AF-1-3-5-7.

De forma análoga aos ramais, apresenta-se, a seguir, as tabelas E.9


a E.12, contendo os dados para a solução da rede hidráulica referente às colunas.
244

Fig. E.7 Colunas AF-1-3-5-7 - esquema.

TABELA E.9 – DESCRIÇÃO DE COMPONENTES PARA COLUNA IMPAR.


Num Desc LD LL Di Ze Zs Lei 1 Lei 2 Lei 3
1 J 1,1 17 0 0 Qe1=Qs1 Hs1=He1-DH1
2 RH1 Qe2=Qs2 Qe2=fq(He2;Tipo de RH1-2)
3 Tubo 2,9 17 2,9 0 Qe3=Qs3 Hs3=He3-DH3+2,9*g*ro
4 T-DL 0,7 2,3 17 2,9 2,9 Qe4=Qd4+QL4 HsL4=He4-DH(Lat)4 Hsd4=He4-DH(Dir)4
5 RH1 Qe5=Qs5 Qe5=fq(He5;Tipo de RH1-5)
6 Tubo 2,9 17 5,8 2,9 Qe6=Qs6 Hs6=He6-DH6+2,9*g*ro
7 T-DL 0,8 2,4 21,6 5,8 5,8 Qe7=Qd7+QL7 HsL7=He7-DH(Lat)7 Hsd7=He7-DH(Dir)7
8 RH1 Qe8=Qs8 Qe8=fq(He8;Tipo de RH1-8)
9 Tubo 2,9 21,6 8,7 5,8 Qe9=Qs9 Hs9=He9-DH9+2,9*g*ro
10 T-DL 0,8 2,4 21,6 8,7 8,7 Qe10=Qd10+QL10 HsL10=He10-DH(Lat)10 Hsd10=He10-DH(Dir)10
11 RH1 Qe11=Qs11 Qe11=fq(He11;Tipo de RH1-11)
12 Tubo 2,9 21,6 11,6 8,7 Qe12=Qs12 Hs12=He12-DH12+2,9*g*ro
13 T-DL 0,8 2,4 21,6 11,6 11,6 Qe13=Qd13+QL13 HsL13=He13-DH(Lat)13 Hsd13=He13-DH(Dir)13
14 RH1 Qe14=Qs14 Qe14=fq(He14;Tipo de RH1-14)
15 Tubo 2,9 21,6 14,5 11,6 Qe15=Qs15 Hs15=He15-DH15+2,9*g*ro
16 T-DL 0,8 2,4 21,6 14,5 14,5 Qe16=Qd16+QL16 HsL16=He16-DH(Lat)16 Hsd16=He16-DH(Dir)16
17 RH1 Qe17=Qs17 Qe17=fq(He17;Tipo de RH1-17)
18 Tubo 2,9 21,6 17,4 14,5 Qe18=Qs18 Hs18=He18-DH18+2,9*g*ro
19 T-DL 0,9 3,1 27,8 17,4 17,4 Qe19=Qd19+QL19 HsL19=He19-DH(Lat)19 Hsd19=He19-DH(Dir)19
20 RH1 Qe20=Qs20 Qe20=fq(He20;Tipo de RH1-20)
21 Tubo 1,1 27,8 18,5 17,4 Qe21=Qs21 Hs21=He21-DH21+1,1*g*ro

As relações entre os componentes são apontadas pela Tabela E.10.


245

TABELA E.10 – RELAÇÕES ENTRE COMPONENTES PARA COLUNA


IMPAR.
i j R Rel-1 Rel-2
21 19 R[21-19] Qs21=Qe19 Hs21=He19
19 L 20 R[19-20] QsL19=Qe20 HsL19=He20
19 d 18 R[19-18] Qsd19=Qe18 Hsd19=He18
18 16 R[18-16] Qs18=Qe16 Hs18=He16
16 L 17 R[16-17] QsL16=Qe17 HsL16=He17
16 d 15 R[16-15] Qsd16=Qe15 Hsd16=He15
15 13 R[15-13] Qs15=Qe13 Hs15=He13
13 L 14 R[13-14] QsL13=Qe14 HsL13=He14
13 d 12 R[13-12] Qsd13=Qe12 Hsd13=He12
12 10 R[12-10] Qs12=Qe10 Hs12=He10
10 L 11 R[10-11] QsL10=Qe11 HsL10=He11
10 d 9 R[10-9] Qsd10=Qe9 Hsd10=He9
9 7 R[9-7] Qs9=Qe7 Hs9=He7
7 L 8 R[7-8] QsL7=Qe8 HsL7=He8
7 d 6 R[7-6] Qsd7=Qe6 Hsd7=He6
6 4 R[6-4] Qs6=Qe4 Hs6=He4
4 L 5 R[4-5] QsL4=Qe5 HsL4=He5
4 d 3 R[4-3] Qsd4=Qe3 Hsd4=He3
3 1 R[3-1] Qs3=Qe1 Hs3=He1
1 2 R[1-2] Qs1=Qe2 Hs1=He2

A Tabela E.11, por sua vez, apresenta as variáveis já reduzidas por


silogismo, a partir da análise das leis e relações entre componentes.
246

TABELA E.11 – VARIÁVEIS GENÉRICAS PARA COLUNA IMPAR.


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

O sistema de equações a ser resolvido para as colunas de índice


impar é apresentado na Tabela E.12.
247

TABELA E.12 – EQUAÇÕES SIMULTÂNEAS PARA COLUNA IMPAR.


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

Deve-se observar sobre a variável “X34” que não se trata de uma


das incógnitas, mas é utilizada para conduzir, durante a solução do sistema de
equações, a carga de entrada da coluna

E.1.4. Colunas AF-2-4-6-8.

De forma análoga aos ramais, apresenta-se, a seguir, as tabelas E.13


248

a E.16, contendo os dados para a solução da rede hidráulica referente às colunas de


índice par.

Fig. E.8 Colunas AF-2-4-6-8 - esquema.

TABELA E.13 – DESCRIÇÃO DE COMPONENTES PARA COLUNA PAR.


Num Desc LD LL Di Ze Zs Lei 1 Lei 2 Lei 3
1 J 1,1 17 0 0 Qe1=Qs1 Hs1=He1-DH1
2 RH2 Qe2=Qs2 Qe2=fq(He2;Tipo de RH2-2)
3 Tubo 2,9 17 2,9 0 Qe3=Qs3 Hs3=He3-DH3+2,9*g*ro
4 T-DL 0,7 2,3 17 2,9 2,9 Qe4=Qd4+QL4 HsL4=He4-DH(Lat)4 Hsd4=He4-DH(Dir)4
5 RH2 Qe5=Qs5 Qe5=fq(He5;Tipo de RH2-5)
6 Tubo 2,9 17 5,8 2,9 Qe6=Qs6 Hs6=He6-DH6+2,9*g*ro
7 T-DL 0,7 2,3 17 5,8 5,8 Qe7=Qd7+QL7 HsL7=He7-DH(Lat)7 Hsd7=He7-DH(Dir)7
8 RH2 Qe8=Qs8 Qe8=fq(He8;Tipo de RH2-8)
9 Tubo 2,9 17 8,7 5,8 Qe9=Qs9 Hs9=He9-DH9+2,9*g*ro
10 T-DL 0,7 2,3 17 8,7 8,7 Qe10=Qd10+QL10 HsL10=He10-DH(Lat)10 Hsd10=He10-DH(Dir)10
11 RH2 Qe11=Qs11 Qe11=fq(He11;Tipo de RH2-11)
12 Tubo 2,9 17 11,6 8,7 Qe12=Qs12 Hs12=He12-DH12+2,9*g*ro
13 T-DL 0,7 2,3 17 11,6 11,6 Qe13=Qd13+QL13 HsL13=He13-DH(Lat)13 Hsd13=He13-DH(Dir)13
14 RH2 Qe14=Qs14 Qe14=fq(He14;Tipo de RH2-14)
15 Tubo 2,9 17 14,5 11,6 Qe15=Qs15 Hs15=He15-DH15+2,9*g*ro
16 T-DL 0,7 2,3 17 14,5 14,5 Qe16=Qd16+QL16 HsL16=He16-DH(Lat)16 Hsd16=He16-DH(Dir)16
17 RH2 Qe17=Qs17 Qe17=fq(He17;Tipo de RH2-17)
18 Tubo 2,9 17 17,4 14,5 Qe18=Qs18 Hs18=He18-DH18+2,9*g*ro
19 T-DL 0,7 2,3 17 17,4 17,4 Qe19=Qd19+QL19 HsL19=He19-DH(Lat)19 Hsd19=He19-DH(Dir)19
20 RH2 Qe20=Qs20 Qe20=fq(He20;Tipo de RH2-20)
21 Tubo 1,1 17 18,5 17,4 Qe21=Qs21 Hs21=He21-DH21+1,1*g*ro

As relações entre os componentes são apontadas pela Tabela E.14.


249

TABELA E.14 – RELAÇÕES ENTRE COMPONENTES PARA COLUNA PAR.


i j R Rel-1 Rel-2
21 19 R[21-19] Qs21=Qe19 Hs21=He19
19 L 20 R[19-20] QsL19=Qe20 HsL19=He20
19 d 18 R[19-18] Qsd19=Qe18 Hsd19=He18
18 16 R[18-16] Qs18=Qe16 Hs18=He16
16 L 17 R[16-17] QsL16=Qe17 HsL16=He17
16 d 15 R[16-15] Qsd16=Qe15 Hsd16=He15
15 13 R[15-13] Qs15=Qe13 Hs15=He13
13 L 14 R[13-14] QsL13=Qe14 HsL13=He14
13 d 12 R[13-12] Qsd13=Qe12 Hsd13=He12
12 10 R[12-10] Qs12=Qe10 Hs12=He10
10 L 11 R[10-11] QsL10=Qe11 HsL10=He11
10 d 9 R[10-9] Qsd10=Qe9 Hsd10=He9
9 7 R[9-7] Qs9=Qe7 Hs9=He7
7 L 8 R[7-8] QsL7=Qe8 HsL7=He8
7 d 6 R[7-6] Qsd7=Qe6 Hsd7=He6
6 4 R[6-4] Qs6=Qe4 Hs6=He4
4 L 5 R[4-5] QsL4=Qe5 HsL4=He5
4 d 3 R[4-3] Qsd4=Qe3 Hsd4=He3
3 1 R[3-1] Qs3=Qe1 Hs3=He1
1 2 R[1-2] Qs1=Qe2 Hs1=He2

A Tabela E.15, por sua vez, apresenta as variáveis já reduzidas por


silogismo, a partir da análise das leis e relações entre componentes.
250

TABELA E.15 – VARIÁVEIS GENÉRICAS PARA COLUNA PAR.

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

O sistema de equações a ser resolvido para as colunas de índice par


é apresentado na Tabela E.16.
251

TABELA E.16 – EQUAÇÕES SIMULTÂNEAS PARA COLUNA PAR.

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

Deve-se observar sobre a variável “X34” que não se trata de uma


das incógnitas, mas é utilizada para conduzir, durante a solução do sistema de
equações, a carga de entrada da coluna

E.1.5. Barrilete.

De modo análogo às estruturas anteriores, o barrilete se define a


252

seguir.

Fig. E.9 Barrilete - esquema.

TABELA E.17 – DESCRIÇÃO DE COMPONENTES PARA O BARRILETE.


Num Desc LD LL Di Ze Zs Lei 1 Lei 2 Lei 3
1 R 4,7 4,5 Qalimentação Hs1=y*g*ro
2 EB 1,8 35,2 4,5 4,5 Qe2=Qs2 Hs2=He2-DH2
3 Tubo 0,7 35,2 4,5 3,8 Qe3=Qs3 Hs3=He3-DH3+0,7*g*ro
4 RG 0,4 35,2 3,8 3,7 Qe4=Qs4 Hs4=He4-DH4+0,1*g*ro
5 Tubo 3,7 35,2 3,7 0 Qe5=Qs5 Hs5=He5-DH5+3,7*g*ro
6 J 1,5 27,8 0 0 Qe6=Qs6 Hs6=He6-DH6
7 AF-1 Qe7=Qs7 Qe7=fq(He7;Tipo de AF-1-7)
8 Tubo 1,5 27,8 0 0 Qe8=Qs8 Hs8=He8-DH8
9 AF-2 0 Qe9=Qs9 Qe9=fq(He9;Tipo de AF-2-9)
10 T-DL 0,9 3,1 27,8 0 0 Qe10=Qd10+QL10 HsL10=He10-DH(Lat)10 Hsd10=He10-DH(Dir)10
11 Tubo 5,5 27,8 0 0 Qe11=Qs11 Hs11=He11-DH11
12 T-DL 0,9 3,1 27,8 0 0 Qe12=Qd12+QL12 HsL12=He12-DH(Lat)12 Hsd12=He12-DH(Dir)12
13 AF-1 Qe13=Qs13 Qe13=fq(He13;Tipo de AF-1-13)
14 Tubo 1,5 27,8 0 0 Qe14=Qs14 Hs14=He14-DH14
15 AF-2 Qe15=Qs15 Qe15=fq(He15;Tipo de AF-2-15)
16 T-DL 1,5 4,6 35,2 0 0 Qe16=Qd16+QL16 HsL16=He16-DH(Lat)16 Hsd16=He16-DH(Dir)16
17 Tubo 2,5 35,2 0 0 Qe17=Qs17 Hs17=He17-DH17
18 T-bi 4,6 4,6 35,2 0 0 Qe18=QSa18+QSb18 HsLa18=He18-DH(Lat)18 HsLb18=He18-DH(Lat)18
19 Tubo 2,5 35,2 0 0 Qe19=Qs19 Hs19=He19-DH19
20 T-DL 1,5 4,6 35,2 0 0 Qe20=Qd20+QL20 HsL20=He20-DH(Lat)20 Hsd20=He20-DH(Dir)20
21 AF-2 Qe21=Qs21 Qe21=fq(He21;Tipo de AF-2-21)
22 Tubo 1,5 27,8 0 0 Qe22=Qs22 Hs22=He22-DH22
23 AF-1 Qe23=Qs23 Qe23=fq(He23;Tipo de AF-1-23)
24 T-DL 0,9 3,1 27,8 0 0 Qe24=Qd24+QL24 HsL24=He24-DH(Lat)24 Hsd24=He24-DH(Dir)24
25 Tubo 5,5 27,8 0 0 Qe25=Qs25 Hs25=He25-DH25
26 T-DL 0,9 3,1 27,8 0 0 Qe26=Qd26+QL26 HsL26=He26-DH(Lat)26 Hsd26=He26-DH(Dir)26
27 AF-2 Qe27=Qs27 Qe27=fq(He27;Tipo de AF-2-27)
28 Tubo 1,5 27,8 0 0 Qe28=Qs28 Hs28=He28-DH28
29 AF-1 Qe29=Qs29 Qe29=fq(He29;Tipo de AF-1-29)
30 J 1,5 27,8 0 0 Qe30=Qs30 Hs30=He30-DH30

As relações entre os componentes são apontadas pela Tabela E.18.


253

TABELA E.18 – RELAÇÕES ENTRE COMPONENTES PARA BARRILETE.


i j R Rel-1 Rel-2
1 2 R[1-2] Qs1=Qe2 Hs1=He2
2 3 R[2-3] Qs2=Qe3 Hs2=He3
3 4 R[3-4] Qs3=Qe4 Hs3=He4
4 5 R[4-5] Qs4=Qe5 Hs4=He5
5 18 R[5-18] Qs5=Qe18 Hs5=He18
18 b 17 R[18-17] Qsb18=Qe17 Hsb18=He17
17 16 R[17-16] Qs17=Qe16 Hs17=He16
16 d 14 R[16-14] Qsd16=Qe14 Hsd16=He14
14 12 R[14-12] Qs14=Qe12 Hs14=He12
12 d 11 R[12-11] Qsd12=Qe11 Hsd12=He11
11 10 R[11-10] Qs11=Qe10 Hs11=He10
10 d 8 R[10-8] Qsd10=Qe8 Hsd10=He8
8 6 R[8-6] Qs8=Qe6 Hs8=He6
6 7 R[6-7] Qs6=Qe7 Hs6=He7
10 L 9 R[10-9] QsL10=Qe9 HsL10=He9
12 L 13 R[12-13] QsL12=Qe13 HsL12=He13
16 L 15 R[16-15] QsL16=Qe15 HsL16=He15
18 a 19 R[18-19] Qsa18=Qe19 Hsa18=He19
19 20 R[19-20] Qs19=Qe20 Hs19=He20
20 d 22 R[20-22] Qsd20=Qe22 Hsd20=He22
22 24 R[22-24] Qs22=Qe24 Hs22=He24
24 d 25 R[24-25] Qsd24=Qe25 Hsd24=He25
25 26 R[25-26] Qs25=Qe26 Hs25=He26
26 d 28 R[26-28] Qsd26=Qe28 Hsd26=He28
28 30 R[28-30] Qs28=Qe30 Hs28=He30
30 29 R[30-29] Qs30=Qe29 Hs30=He29
26 L 27 R[26-27] QsL26=Qe27 HsL26=He27
24 L 23 R[24-23] QsL24=Qe23 HsL24=He23
20 L 21 R[20-21] QsL20=Qe21 HsL20=He21

A Tabela E.19, por sua vez, apresenta as variáveis já reduzidas por


silogismo, a partir da análise das leis e relações entre componentes.
254

TABELA E.19 – VARIÁVEIS GENÉRICAS PARA O BARRILETE

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

O sistema de equações a ser resolvido para o barrilete é apresentado


na Tabela E.20.
255

TABELA E.20 – EQUAÇÕES SIMULTÂNEAS PARA O BARRILETE.


Equações simultâneas
f1 X5+X6-X4=0
f2 X4+X7-X3=0
f3 X3+X8-X2=0
f4 X9+X2-X1=0
f5 X10+X15-X9=0
f6 X11+X14-X10=0
f7 X12+X13-X11=0
f8 y*g*ro-X17-DH2
f9 X17-X18-DH3+0,7*g*ro=0
f10 X18-DH4-X19+0,1*g*ro=0
f11 X19-X20-DH5+3,7*g*ro=0
f12 X28-DH6-X29=0
f13 X5-fq(X29;Tipo de AF-1-7)=0
f14 X27-DH8-X28=0
f15 X6-fq(X30;Tipo de AF-2-9)=0
f16 X26-DH(Lat)10-X30=0
f17 X25-DH11-X26=0
f18 X24-DH(Lat)12-X31=0
f19 X7-fq(X31;Tipo de AF-1-13)=0
f20 X23-DH14-X24=0
f21 X8-fq(X32;Tipo de AF-2-15)=0
f22 X22-DH(Lat)16-X32=0
f23 X21-DH17-X22=0
f24 X20-DH(Lat)a18-X33=0
f25 X33-DH19-X34=0
f26 X34-DH(Lat)20-X16=0
f27 X15-fq(X16;Tipo de AF-2-21)=0
f28 X35-DH22-X36=0
f29 X14-fq(X43;Tipo de AF-1-23)=0
f30 X36-DH(Lat)24-X43=0
f31 X37-DH25-X38=0
f32 X38-DH(Lat)26-X42=0
f33 X13-fq(X42;Tipo de AF-2-27)=0
f34 X39-DH28-X40=0
f35 X12-fq(X41;Tipo de AF-1-29)=0
f36 X40-DH30-X41=0
f37 X26-DH(Dir)10-X27=0
f38 X24DH(Dir)12-X25=0
f39 X22-DH(Dir)16-X23=0
f40 X20-DH(Lat)b18-X21=0
f41 X24-DH(Dir)20-X25=0
f42 X36-DH(Dir)24-X37=0
f43 X38-DH(Dir)26-X39=0

Deve-se atentar para o fato de que, uma vez que a rede é


implementada de forma hierárquica, ou seja, a solução das estruturas superiores
depende daquela para as estruturas inferiores, a solução do barrilete corresponde à
256

solução da rede como um todo.

E.2 Implementação dos Aparelhos.

Os aparelhos foram implementados a partir de dados obtidos do


levantamento experimental de características.

Dessa maneira, foram utilizados para a ilustração:

a) chuveiro: ensaio efetuado sobre uma unidade comercial de


chuveiro elétrico, da marca Corona, modelo Gorduchinha, sem instalação de “niple”
redutor de pressão;

b) lavatório: ensaio efetuado sobre uma torneira de lavatório


genérica de baixo custo, desprovida de qualquer tipo de dispositivo aerador ou
economizador;

c) bacia sanitária: ensaio efetuado sobre uma caixa de descarga


plástica, marca Astra, de fixar na parede;

d) pia de cozinha: ensaio efetuado sobre uma torneira de uso geral,


genérica, sem qualquer dispositivo de aperfeiçoamento de jato d’água;

e) tanque de lavar roupas: mesma torneira utilizada para a pia de


cozinha;
257

f) máquina de lavar roupas: ensaio efetuado sobre máquina de lavar


marca Brastemp, modelo “Línea Veneza”, conforme descrito no Capítulo 4.

E.3 Usuário.

Os usuários tiveram seus dados populacionais obtidos a partir de


dados censitários nacionais, através da base de dados “SIDRA” do IBGE.

O comportamento dos usuários foi obtido a partir dos dados de


ILHA, (1991).

No caso específico da utilização da bacia sanitária, foram adotados


dados de distribuição de freqüência de utilização ao longo do dia semelhantes ao
lavatório, corrigindo-se a freqüência de utilização per-capita diária, com o objetivo
de único de permitir a conclusão do exemplo proposto.
258

REFERÊNCIAS BIBLIOGRÁFICAS

ABNT - ASSOCIAÇÃO BRASILEIRA DE NORMAS TÉCNICAS. Instalação


Predial de Água Fria - NBR 5626. Rio de Janeiro, 1998.

ABNT - ASSOCIAÇÃO BRASILEIRA DE NORMAS TÉCNICAS. Tubos de PVC


Rígido para Instalações Prediais de Água Fria - Especificação - NBR5648.
Rio de Janeiro, 1977.

AHO, A. V.; HOPCROFT, J. E.; ULLMAN, J. D. Data Structures and


Algorithms. Massachusetts, Addison-Wesley, 1987.

AMORIM, S. V. Metodologia para Estruturação de Sistemas de Informação


para Projetos dos Sistemas Hidráulicos Prediais. São Paulo, 1997. 213p.
Tese (Doutorado) - Escola Politécnica da Universidade de São Paulo.

BARBOSA, R.M. Interpolação Polinomial e Tabelas Numéricas. 3a, ed. São


Paulo, Nobel, 1976.

CPC - COMPANHIA PETROQUÍMICA CAMAÇARÍ, Sistemas em PVC na


Construção Civil, 1a. Revisão. 1996.

ESPÍRITO SANTO, A. Essências Estatísticas Aplicadas às Ciências Sociais.


Secretaria de Planejamento - Prefeitura Municipal de Londrina, Londrina, 1987.

FERGUNSON, G. A. Statistical Analysis in Psychology & Education. 4. ed.


Tokyo, McGraw-Hill Kogakusha, 1976.

FOX, R.W.; MCDONALD, A. T. Introdução à Mecânica dos Fluídos. 4 ed. LTC.


Rio de Janeiro. 1998.

GILES, R. V. Mecânica dos Fluidos e Hidráulica. São Paulo. McGraw-Hill do


Brasil, 1976. (Coleção Schaum)

GONÇALVES, O. M. Formulação de Modelo para o Estabelecimento de Vazões


de Projeto em Sistemas Prediais de Distribuição de Água Fria. São Paulo,
1986. Tese (Doutorado) - Escola Politécnica da Universidade de São Paulo
259

GONÇALVES, O. M. ; GRAÇA, M. E. A. O usuário e as solicitações dos sistemas


prediais de distribuição de água fria: modelo para determinação das vazões de
projeto. In: SIMPÓSIO NACIONAL DE INSTALAÇÕES PREDIAIS, 1.
INSTALAÇÕES HIDRÁULICAS I: Anais. São Paulo, EPUSP, 1986. p.55-90.

GRAÇA, M. E. A.; GONÇALVES. O. M. Desempenho de sistemas sanitários


prediais: conceitos fundamentais. Revista de Engenharia Mackenzie, São
Paulo, v.70, n.177, p.7-13, jan-fev. 1986.

GRAÇA, M. E. A.; GONÇALVES, O. M. Sistemas Prediais de Coleta de Esgotos


Sanitários: Modelo Conceitual de Projeto. In: INSTALAÇÕES HIDRÁULICAS
E SANEAMENTO PARA REGIÕES EM DESENVOLVIMENTO. Anais. São
Paulo, CIB W 62, 1987a.

GRAÇA, M. E. A.; GONÇALVES, O. M. Sistemas Prediais de Distribuição de


Água Fria - Determinação das Vazões de Projeto. São Paulo. Departamento
de Engenharia da Construção Civil da Escola Politécnica da USP, 1987 b.
(BT/PCC/11.) 17 p.

ILHA, M. S. O. Estudo dos Parâmetros Relacionados com a Utilização de Água


Quente em Edifícios Residenciais. São Paulo, 1991. 204p. Dissertação
(Mestrado) - Escola Politécnica, Universidade de São Paulo.

INMETRO. Quadro geral de unidades de medida; resolução do CONMETRO


No. 12/1998. 2a. ed. Brasília, SENAI/DN, 2000.

INTEGRADE. Integrade Pro Statistics: Arcticles. Disponível em:


<http://www.integrade.com/articles/integradestats.html>. Acesso em: 06 de
Julho de 2001.

IOSHIMOTO, E. Formulação de Metodologia para Análise de Projetos de


Sistemas Prediais de Gás Combustível. São Paulo, 1990. Tese (Doutorado) -
Escola Politécnica da Universidade de São Paulo.

KAUFFMAN, D. L. Sistemas Um: Uma Introdução ao Pensamento Sistêmico.


Minneapolis, Future Systems, 1980.

KINGSTON, J. H. Algorithm and Data Structures. Workingham, Addison-


Wesley, 1995.
260

LANDI, F. R. A Evolução Histórica das Instalações Hidráulicas. São Paulo.


Departamento de Engenharia da Construção Civil da Escola Politécnica da USP,
1993. (BT/PCC/100). 64 p.

MARON, M. J. Numerical Analysis: a Practical Approach. 2.ed. New York,


Macmillan, 1987.

MEYER, P. L. Probabilidade: aplicações à estatística. 2 ed. Rio de Janeiro, Livros


Técnicos e Científicos, 1995.

MOOD, A. M.; GRAYBILL, F. A. ; BOES, D. C. Introduction to the Theory of


Statistics. 3rd. ed. Tokyo, McGraw-Hill Kogakusha, 1974.

MURAKAWA, S. SAKAUE, K. KOSHIKAWA, Y. TAKAKU, Y. NAKAGAWA, Y.


Analisys of Toilet Users and Their Behaviors in Railway Stations. In: WATER
SUPPLY AND DRAINAGE FOR BUILDINGS. Proceedings. Rio de Janeiro,
Brasil, CIB W62. 2000. p. A4, 1-12.

NIELSEN, B. SpecialF.PAS. (Código fonte para biblioteca de funções estatísticas).


http://www.nuff.ox.ac.uk/users/nielsen, Reino Unido, 1999,.

PEDRYCZ, W. Fuzzy Control and Fuzzy Systems. 2.ed. Taunton, Research


Studies Press, 1993.

PERIN FILHO, C. Introdução à Simulação de Sistemas. Campinas, Editora da


Unicamp, 1995.

PORTO, R. M. Hidráulica Básica. São Carlos. EESC-USP. 1998.

SAKAUE, K et alli. Experimental study on water temperature/flow rate preferred by


users in residential hot water supply system most popular in Japan. In: WATER
SUPPLY AND DRAINAGE FOR BUILDINGS. Proceedings. Gävle, Sweden,
CIB W62. 1987. p. 89-101.

SCHEID, F. Theory and Problems of Numerical Analysis. New York, McGraw-


Hill, 1968. (Schaum’s Outline Series)

SOUZA, P. A. et alli. Métodos Computacionais Aplicados à Engenharia


Hidráulica. São Paulo. CTH-EPUSP. 1991.
261

TEXAS INSTRUMENTS INCORPORATED. Abrindo Caminhos em


Programação. Campinas. Texas Instrumentos Eletrônicos do Brasil Ltda.
1977.

VENNARD, J. K. ; STREET, R. L. Elementos de Mecânica dos Fluidos. 5.ed.


Trad. de Adir M. Luiz e Maria Teresa B. Luiz. Rio de Janeiro, Guanabara Dois,
1978.

.
ARON LOPES PETRUCCI

METODOLOGIA PARA SELEÇÃO DE CONFIGURAÇÃO DE

SISTEMAS PREDIAIS DE ÁGUA EM EDIFICAÇÕES QUE

ABRIGUEM MÚLTIPLAS ECONOMIAS

Tese apresentada à Escola Politécnica da


Universidade de São Paulo para obtenção do
título de Doutor em Engenharia.

São Paulo
2001
ii

ARON LOPES PETRUCCI

METODOLOGIA PARA SELEÇÃO DE CONFIGURAÇÃO DE


SISTEMAS PREDIAIS DE ÁGUA EM EDIFICAÇÕES QUE
ABRIGUEM MÚLTIPLAS ECONOMIAS

(Volume 2)

Tese apresentada à Escola Politécnica da


Universidade de São Paulo para obtenção do
título de Doutor em Engenharia.

Á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

O questionário abaixo foi aplicado a um pequeno mas


representativoI.1 grupo de projetistas de sistemas hidráulico-sanitários prediais.

I.1 Questionário

Para os projetos de edifícios verticais que abrigam múltiplas


economias:

1) Quem são atualmente, os contratantes de projetos? São os


futuros proprietários, os futuros usuários finais, o incorporador? Quem?

Respondente. 1 - Os incorporadores, que não serão os usuários


finais, ou os proprietários, na condição de condomínio, que hoje são maioria uma
vez que não mais existe financiamento governamental para esse tipo de
empreendimento.

Resp. 2 - Normalmente o proprietário para as residências. Para o


edifício, o empreendedor.

Resp. 3 - Normalmente as construtoras ou as incorporadoras.

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. 4 - O incorporador ou o construtor.

2) Quem fornece as diretrizes técnicas de projeto quanto às


configurações e macro-soluções a serem adotadas? O contratante ou o projetista?
São adotadas soluções tradicionais de cada contratante ou são feitos estudos
específicos para cada empreendimento ou cada subsistema?

Resp. 1 - Alguns itens são definidos pelo contratante, outros pelos


projetistas. Na maior parte pelo contratante

Resp. 2 - Normalmente o contratante já tem características


próprias com as quais já está habituado.

Resp. 3 - Há muito peso do tradicionalismo, normalmente o


contratante segue o tradicional.

Resp. 4 - Decisão entre o projetista e o contratante. O critério de se


adotar essa ou aquela solução vem de experiências anteriores do contratante e do
“feedback” de outros clientes do projetista.

3) Como você quantificaria ou qualificaria a influência da área


comercial de produtos e componentes (os vendedores de aquecedores, aparelhos
sanitários, tubos, etc...) na escolha dessas configurações dos sistemas prediais?

Resp. 1 - Em alguns itens tem influência forte como nos materiais,


tubos e conexões, já nos equipamentos nem tanto.
I-3

Resp. 2 - Estão tendo uma influência crescente devido ao trabalho


de divulgação técnica junto aos construtores.

Resp. 3 - Se houver um contato prévio, o contratante vem ao


projetista muito influenciado. Às vezes fica-se em dificuldades para sugerir algo ao
contratante.

Resp. 4 - Pequena na discussão inicial e em especial na elaboração


do projeto que segue o padrão do incorporador. Em construtoras mais novas são
feitas avaliações melhores.

4) Em projetos de porte comum são feitos estudos sobre várias


alternativas, em termos de custo x benefício? Se sim, com qual metodologia e
quantas alternativas são analisadas? Se não. Por quê?

Resp. 1 - Não. Porque os contratantes não têm noção de que pagar


por esse tipo de avaliação pode resultar em um produto final melhor e mais
econômico.

Resp. 2 - Não. Se enxerga pouca opção confiável.

Resp. 3 - São raros. Tive um cliente que fez estudos de custo direto
sobre algumas alternativas.

Resp. 4 - Não, as construtoras já vêm com a definição do que será


utilizado.
I-4

5) Quando se verifica os custos de uma solução, como você


hierarquiza a importância que as pessoas envolvidas no processo decisivo dão aI.2:

(1 ) Custos diretos de implantação da solução.


(2 ) Custo de manutenção ao longo dos anos.
(4 ) Custo de consumo de insumos (água e energia)
(3 ) Custos técnicos para implementar essa solução

6) Existe, nessas edificações, preocupação explicita e expontânea


do contratante com economia de água, energia e intervenções de manutenção no
ciclo de utilização do sistema? Se sim, como se manifesta e que impacto essa
preocupação traz sobre as soluções adotadas nos projetos?

Resp. 1 - Preocupações com o consumo de água e energia não são


manifestadas. Em alguns casos existe a preocupação com manutenção, tendo essa
um impacto relativo, nada forte ou que demande soluções radicais. Geralmente esse
ponto fica mais restrito aos equipamentos.

Resp. 2 - Sim, algumas empresas já se preocupam com os sistemas


de medição. Já se começa a ter essa preocupação como argumento de venda.

Resp. 3 - De forma expontânea não.

Resp. 4 - Existe. Quando o cliente está muito preocupado com


manutenção se preocupa com o posicionamento de tubulações de forma a evitar
acidentes ou diminuir suas conseqüências.

I.2
Resultado da soma das notas dadas pelos 4 respondentes.
I-5

7) Como você faria a hierarquização dos desejos de um contratante


em relação ao projeto de sistemas hidráulicos prediais:

(1) Baixo custo de projeto.


(1) Baixo custo da instalações.
(2) Instalações que funcionem com desempenho ótimo.
(4) Rapidez de projeto.
(6) Sistemas que facilitem rapidez de execução.
(3) Projetos altamente precisos e de execução clara.
(5) Sistemas que tragam os menores custos globais durante a vida
do empreendimento.
(7) Preocupações com consumo de água e de energia.

8) Como ocorre, geralmente, a introdução da hipótese de se utilizar


uma nova tecnologia nesses projetos: sugerida pelo projetista ao contratante, trazida
pelo contratante, sugerida pelo produtor dessa tecnologia?

Resp. 1 - Sugerida pelo produtor ao projetista e ao contratante,


pelo projetista ou, em uma terceira hipótese, pelo contratante.

Resp. 2 - Mais pelo contratante; ou ainda se pesquisa por


solicitação deste.

Resp. 3 - Normalmente o produtor tenta passar tanto para o


contratante como para o projetista.
I-6

Resp. 4 - Do projetista e do construtor ou empreendedor. Os


empreendedores esperam que se implante determinada cultura antes de tomar a
frente.

9) Como ocorre, ou não, a aceitação dessa nova tecnologia: fatores


subjetivos (conversa de vendedor, experiência de conhecidos, tradicionalismo...), ou
são feitos testes, estudos e análises objetivos além daqueles que os próprios
vendedores trazem? Em caso afirmativo que tipo de estudos são efetuados?

Resp. 1 - A reação inicial é a não aceitação, a segunda é aceitar


baseado na conversa do vendedor.

Resp. 2 - Quando são aceitas o trabalho maior é do vendedor.


Quando não aceito é por receio ou por tradicionalismo.

Resp. 3 - São feitos testes, normalmente com a execução de alguns


pilotos. Falta ferramenta e pessoal para fazer esses estudos de forma mais objetiva.

Resp. 4 - O “feedback” daqueles que já utilizaram é o que mais


pesa.

10) Os contratantes dos projetos, no caso os tomadores de decisão,


para essas edificações, geralmente são pessoas de formação técnica em Arquitetura,
Engenharia, Economia, etc... ou seriam pessoas que teriam dificuldades para tirar o
máximo proveito de estudos de viabilidade mais complexos?
I-7

Resp. 1 - A maioria deles não teria dificuldades para analisar tais


estudos.

Resp. 2 - Têm o conhecimento técnico necessário. O nível técnico


do contratante tem melhorado na área.

Resp. 3 - São técnicos, mas às vezes com formação um pouco


deficiente.

Resp 4 - São pessoas com formação técnica.

11) Supondo que você tenha uma ferramenta ou metodologia que


permita a análise de vários parâmetros associados que orientariam a escolha por uma
ou outra configuração para os sistemas prediais. Como você hierarquizaria as
características desejáveis para esse instrumento:

(3) Facilidade de utilização;


(1) Rapidez de elaboração do estudo;
(2) Precisão de resultados;
(4) Baixo custo de operação da metodologia;
(5) Baixo custo de implantação da mesma dentro do seu escritório;
(6) Clareza na exibição de resultados;
(7) Impacto e beleza na exibição dos resultados;

12) Que outra característica você acharia importante em uma


metodologia desse gênero?
I-8

Resp. 1 - Basicamente essas.

Resp. 2 - Permitir a comparação entre soluções.

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. 1 - Sim, pois haveria condições de opções com parâmetros


palpáveis a serem apresentados aos clientes.

Resp. 2 - Sim. Porque independentemente do cliente solicitar você


poderia apresentar outras soluções.

Resp. 3 - Sim. Para tirar essas dúvidas que hoje são decididas de
forma subjetiva.

Resp. 4 - Sim. Daria uma “radiografia” da solução.

14) Você acredita que seus clientes (contratantes), apreciariam e


valorizariam mais seu trabalho (em todos os sentidos), desfrutando dos resultados de
tal metodologia?

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

Resp. 2 - Sim, é uma forma de valorizar o serviço.

Resp. 3 - Com certeza.

Resp. 4 - Sim. Porque toda vez que se apresentasse esses estudos


mostraria um interesse maior do projetista que faria com que se sentisse valorizado.
II-1

APÊNDICE II

O questionário abaixo foi aplicado a um pequeno mas


representativo grupo de construtores e incorporadores que trabalham com edifícios
de múltiplas economias.

Esse grupo foi selecionado de forma a cobrir as empresas


responsáveis pelo maior número de empreendimentos desse tipo na região de
Londrina, assim como pelo fato de algumas empresas escolhidas serem dirigidas por
profissionais que fizeram parte da diretoria de grandes empresas locais hoje não
mais existentes.

II.1 Questionário

Para os projetos de edifícios verticais que abrigam múltiplas


economias:

1) Quando sua empresa contrata um projeto de sistemas prediais


para esse tipo de edifício, as diretrizes quanto à solução a ser adotada, em termos de
configuração, são tomadas pelo seu pessoal? Pelo projetista? Em conjunto?
Utilizando-se qual processo?

Respondente 1 - As diretrizes são fornecidas pela construtora. São


baseadas em experiências anteriores (opinião de usuários, problemas, histórico de
II-2

manutenções, etc.); é analisado preponderantemente o custo direto de implantação


uma vez que, quando se encomenda o projeto dos sistemas hidráulicos prediais o
orçamento já se encontra pronto e aprovado.

Resp. 2 - Até algum tempo atrás, pelo projetista. De algum tempo


para cá pela construtora, baseado em problemas e sucessos apresentados por
soluções anteriores.

Resp. 3 - Em conjunto, respeitando o mercado. Por exemplo: ainda


hoje se usa válvula de descarga, mesmo sabendo-se de suas deficiências porque o
mercado assim o exige. O processo decisório é baseado no mercado e em
experiências anteriores.

Resp. 4 - É tomada pela construtora, ouvido o projetista, mas a


decisão é da empresa.

2) São adotadas soluções tradicionalmente utilizadas por


empreendimentos seus ou são feitos estudos específicos para cada empreendimento
ou cada subsistema?

Resp. 1 - As soluções tradicionais.

Resp. 2 - As soluções tradicionais.

Resp. 3 - São utilizadas as soluções padronizadas pela empresa


conforme o padrão do edifício. Em prédio de melhor padrão costuma-se fazer
algum estudo de opções. Como a empresa opera em outras regiões do país, é
II-3

comum a adoção de diferentes soluções a fim de respeitar a cultura de cada


mercado local.

Resp. 4 - Existe um padrão que algumas vezes sofre pequenas


modificações. As particularidades são orçadas em cada caso, no entanto, alguns
padrões são tidos como “imutáveis”, outros nem tanto.

3) Como você quantificaria ou qualificaria a influência da área


comercial de produtos e componentes (os vendedores de aquecedores, aparelhos
sanitários, tubos, etc...) na escolha dessas configurações dos sistemas prediais?

Resp. 1 - Se opta geralmente por aquelas tecnologias e vendedores


com quem se tem um histórico; prefere-se utilizar os fornecedores de marcas
conhecidas que trazem vantagens de atendimento, assistência técnica e relações
comerciais.

Resp. 2 - Pouca. Sempre esperamos o produto se solidificar no


mercado.

Resp. 3 - Existe influência dos vendedores sim. Sempre tentando


direcionar para seus produtos.

Resp. 4 - Têm um forte peso nas decisões, geralmente acabam


colocando algum produto conforme o estilo de projeto, mais econômico ou
direcionado para classes mais altas.
II-4

4) Em projetos de porte comum são feitos estudos sobre várias


alternativas, em termos de custo x benefício? Se sim, com qual metodologia, por
quem e quantas alternativas são analisadas? Se não. Por quê?

Resp. 1 - São adotadas as soluções tradicionais. Há pouco tempo


para planejamento.

Resp. 2 - Já foram feitos alguns estudos genéricos, mas não


individualizados para cada obra.

Resp. 3 - Sim, é feito. É fornecido o quantitativo estimado de cada


possível solução e sobre isso, feito o orçamento; a seguir calcula-se os diversos
preços finais que são submetidos à análise da área de “marketing”.

Resp. 4 - É feito, por alto. Em alguns casos são feitos estudos


específicos, especialmente nos edifícios de padrão intermediário, em função do
reflexo dos aumentos de custos no preço de venda.

5) Quando se verifica os custos de uma solução, como você


hierarquiza a importância que se deva dar a:II.1

(2) Custos diretos de implantação da solução.


(1) Custo de manutenção ao longo dos anos.
(3) Custo de consumo de insumos (água, energia, mão de obra de
operação, etc...)
(4) Custos técnicos para implementar essa solução

II.1
Resultado da soma das notas dadas pelos 4 respondentes.
II-5

6) Sua empresa tem, para com essas edificações, preocupações


explicitas com economia de água, energia e intervenções de manutenção no ciclo de
utilização do sistema? Se sim, como se manifesta e que impacto essa preocupação
traz sobre as soluções adotadas nos projetos?

Resp. 1 - A manutenção é preocupação constante devido à garantia


da edificação, onde os sistemas tradicionais têm dado bons resultados; objetiva-se
manutenção nula. Tem havido indicação aos clientes para aquisição de aparelhos
economizadores de água.

Resp. 2 - A nível de consumo de água não se tem grande


preocupação. É feito um estudo a nível de racionalização de materiais.

Resp. 3 - O mercado hoje busca segurança (patrimonial e pessoal)


e investe em automações nesse sentido. Isso é mais procurado que baixos consumos.
Os consumos, no entanto, tornam-se importantes à medida que estão ligados ao
valor da taxa de condomínio.

Resp. 4 - Sim. Na seleção dos componentes (de empresas


reconhecidas). Existe ainda programas de melhoria de mão de obra através de
palestras e cursos ofertados pelas empresas.

7) Sua empresa tem sido orientada pelos projetistas sobre as


diversas hipóteses de configurações dos sistemas prediais, suas relações custo x
benefício, etc.? Se sim, como? Se não, por quê você acha que não?
II-6

Resp. 1 - Não. Se limitam a acatar as soluções propostas pelo


contratante; infelizmente, pois deveriam propor as soluções.

Resp. 2 - Sim, algumas proposições e definições são acatadas


integralmente, outras com alterações e algumas não são acatadas pelo projetista.
As justificativas para tais decisões são geralmente apresentadas de maneira
informal.

Resp. 3 - Existe sugestões dos projetistas; por exemplo, como


construímos vários prédios altos as VRPII.2 têm representado alto custo tendo nossa
empresa recebido orientações para melhores soluções nesse sentido.

Resp. 4 - Sempre surgem opiniões e sugestões especialmente na


fase de anteprojeto.

8) Como você acredita que o mercado no qual sua empresa se


encontra inserida (seus clientes), faria a hierarquização de seus desejos em relação a
um sistema hidráulico predial:

(6) Baixo custo de projeto.


(5) Baixo custo da instalações.
(1) Instalações que funcionem com desempenho ótimo.
(6) Rapidez de projeto.
(5) Sistemas que facilitem rapidez de execução.
(4) Projetos altamente precisos e de execução clara.

II.2
Válvulas redutoras de pressão.
II-7

(3) Sistemas que tragam os menores custos globais durante a vida


do empreendimento.
(2) Preocupações com consumo d’água e de energia.

9) Como ocorre, geralmente a introdução da hipótese de se utilizar


uma nova tecnologia nesses projetos: sugerida pelo projetista ao contratante, trazida
pelo contratante, sugerida pelo produtor dessa tecnologia?

Resp. 1 - É sugerida pelo produtor dessa nova tecnologia.

Resp. 2 - O cliente, futuro comprador, não conhece as novas


tecnologias. Essas novas tecnologias geralmente são conhecidas em palestras ou
eventos técnicos como feiras congressos e outros.

Resp. 3 - Pelos vendedores e pelos projetistas.

Resp. 4 - A sugestão vem por todas essas formas. Tecnologias sem


efeito visível, como por exemplo a ecolha do tipo de tubulação, permite uma opção
mais simples; já tecnologias como válvulas de descarga “versus” caixas acopladas
exigem, para sua adoção, a auscutação do mercado.

10) Como ocorre, ou não, a aceitação dessa nova tecnologia: fatores


subjetivos (conversa de vendedor, experiência de conhecidos, tradicionalismo...), ou
são feitos testes, estudos e análises objetivos além daqueles que os próprios
vendedores trazem? Em caso afirmativo que tipo de estudos são efetuados?
II-8

Resp. 1 - Mais pelos aspectos subjetivos.

Resp. 2 - Experiências anteriores de conhecidos.

Resp. 3 - São feitos testes, às vezes até protótipos são testados. No


entanto sobre tecnologias muito revolucionárias são tomados, antes, dados de
experiência de terceiros.

Resp. 4 - Procura-se fazer introdução de tecnologias que não


afetem muito a parte visual, estética. A adoção de nova tecnologia é fruto da análise
de mercado e de seu custo direto.

11) Caso alguns dos escritórios de projeto contratados viesse a


oferecer algum tipo de análise clara e objetiva sobre prós e contras de se adotar
determinada solução ou tecnologia; você apreciaria isso a ponto de valorizar mais
(em todos os sentidos) aquele trabalho?

Resp. 1 - Sim. Pois estaria pagando a mais por um serviço que


traria vantagem futura.

Resp. 2 - Conforme o resultado sim. Até o ponto de pagar mais


caso haja resultado positivo.

Resp. 3 - Sim.

Resp. 4 - Esse tipo de trabalho ainda não faz parte da cultura da


II-9

empresa.

12) A economia de insumos como água ou energia pode ser


utilizada como um convincente argumento de vendas?

Resp. 1 - A economia de insumos, que gerem menores valores de


contas de água, energia elétrica, gás, condomínio e similares é um ponto muito forte
de vendas.

Resp. 2 - Seria um forte trunfo de vendas nos dias atuais.

Resp. 3 - Pode ser utilizada como tal. Será um forte argumento de


venda no futuro.

Resp. 4 - Existe problema ligado ao imediatismo do cliente, que


prefere de fato, um custo direto mais baixo; mas existem clientes que valorizam
essas questões
III-1

APÊNDICE III

Nesse Apêndice, apresentamos alguns detalhes da codificação


utilizada para o cálculo das perdas de carga através da Fórmula Universal, utilizando
as abordagens de Souza (SOUZA et. alli, 1991) e Swamee (PORTO, 1998); assim
como algumas considerações sobre a implantação computacional das mesmas.

Apresentamos ainda a implementação de algumas rotinas


matemáticas adicionais, que não fazem parte das bibliotecas padrão da linguagem
utilizada, mas se mostram úteis e necessárias para este e outros trechos de código
presentes neste trabalho.

Como se observa em outras partes do presente trabalho, foi


utilizado para a implementação de exemplos e testes, a linguagem de programação
Delphi, em sua versão 4.0. No entanto, devido a um forte enfoque de orientação a
objetos utilizado, sua transcrição para outras linguagens do gênero (como C++ ou
VisualBasic) não deverá apresentar maiores dificuldades.

III.1. Utilização da Fórmula Universal.

Do ponto de vista da utilização pura e simples da biblioteca aqui


apresentada, pode-se ater somente a uma função, cujo protótipo é apresentado na
listagem III.1.
III-2

Listagem III.1 – Protótipo da Função “FormUniv”.


function FormUniv(var Escoamento:TEscoamento;
ParametroDesejado,
ProcessodeCalculo: Cardinal): Cardinal;

Tal função retorna, como resultado, um código que indica se o


cálculo foi efetuado com sucesso. Esse código de retorno deve ser interpretado
através da listagem III.2.

Listagem III.2 – Resultados da Função “FormUniv”


FU_Ok = 0; // sem erro
FU_PerdaInvalida = 1; // entrada de perda inválida
FU_VazaoInvalida = 2; // entrada de vazão inválida
FU_DiamInvalido = 3; // entrada de diâmetro inválido
FU_RugosidadeInvalida = 4; // entrada de rugosidade inválida
FU_ComprimentoInvalido = 5; // entrada de comprimento inválido
FU_ProcessoInvalido = 6; // processo de cálculo não implementado
FU_ParametroInexistente = 7; // cálculo de parâmetro não implementado

Os valores dos dados para cálculo, e os valores retornados pelo


mesmo, estão acessíveis através das propriedades da variável “Escoamento”, que é
um objeto do tipo “TEscoamento”, com as propriedades descritas na Tabela III.1.

TABELA III.1. – PROPRIEDADES DA VARIÁVEL “ESCOAMENTO”.


Propriedade Tipo Observações.
Regime Cardinal Somente leitura. Retorna o regime do escoamento
segundo a listagem III.3
Tubo TTubo Objeto “tubo” descrito abaixo.
Fluido TFluido Objeto “fluido” descrito abaixo.
Local TAmbiente Objeto “Ambiente” descrito abaixo.
Q Extended Vazão. Valor real maior ou igual a “0” (zero).
DH Extended Perda de carga. Valor real maior que “0” (zero).
F Extended Somente leitura. Retorna o fator de atrito “f”.

Observa-se, na Tabela III.1, que o objeto “Escoamento” traz todas


as propriedades necessárias para sua caracterização, ou seja, responde às questões
básicas: o que escoa? onde escoa? com que vazão (ou perda de carga) escoa?. Além
III-3

disso apresenta ainda outras informações úteis, como o regime de escoamento, o


fator de atrito, e os dados sobre o ambiente, sendo esses últimos bastante úteis, por
exemplo, na conversão de valores de carga dados em altura de líquidos, para
unidades de pressão, e vice versa.

Dentre essas propriedades, por serem objetos abstratos de dados,


necessitam de maior explicação as propriedades “Tubo”, “Fluido” e “Local”.

As propriedades para o objeto “Tubo” constam da Tabela III.2.

TABELA III.2. – PROPRIEDADES DE OBJETOS DO TIPO “TTUBO”


Propriedade Tipo Observações
Tipo string Identificação textual do tipo de tubo
Diam extended Diâmetro do tubo. Deve ser maior que “0” (zero)
Comprimento do tubo. Deve ser maior ou igual a
Comprim extended
“0” (zero).
Rugosidade absoluta do material. Deve ser maior
RugAbs extended
ou igual a “0” (zero).

As propriedades características do objeto “Fluido”, por sua vez.,


podem ser observadas na Tabela III.3.

TABELA III.3. – PROPRIEDADES DE OBJETOS DO TIPO “TFLUIDO”


Propriedade Tipo Observações
Nome string Descrição textual do fluido utilizado
Temper extended Temperatura do fluido.
Somente leitura. Apresenta o valor da massa
específica do fluido em função da temperatura
MassaEsp extended
determinada pela propriedade “Temper”, segundo
implementação específica para cada tipo de fluido.
Somente leitura. Apresenta o valor da viscosidade
cinemática do fluido em função da temperatura
ViscCin extended
determinada pela propriedade “Temper”, segundo
implementação específica para cada tipo de fluido.
III-4

A propriedade “Ambiente” não apresenta relação direta com o


escoamento, uma vez que todos os cálculos e valores são expressos em unidades SI,
no entanto, apresenta sua importância e utilidade, quando se deseja convertes valores
de altura em pressão e vice-versa, o que é comum nos casos que exigem a
determinação da variação de pressão com a variação do desnível geométrico de
tubos ou componente, assim como quando da expressão de pressões em unidades
não SI, como por exemplo, mH2O.

Como não é objetivo do presente trabalho esgotar as possibilidades


de representação para tais objetos, mas somente indicá-las, implementou-se, a título
de exemplo, somente o valor da aceleração da gravidade. Lembra-se ainda que seria
de utilidade a implementação, por exemplo, da pressão atmosférica em função da
altitude, de forma semelhante à apresentada para as propriedades físicas da água em
relação à temperatura.

Por fim, as entradas “ParametroDesejado” e “ProcessodeCalculo”,


determinam, respectivamente, qual a propriedade do escoamento que se deseja
avaliar, e qual o processo de cálculo a ser utilizado. Os valores válidos para esses
dois parâmetros estão indicados na listagem III.3.

Listagem III.3 – Formulações a Parâmetros a Calcular Validos.


// Formulação a utilizar

const FPC_Souza = 0; // Souza et alli, 1991


FPC_Swamee = 1; // Swamee apud Porto, 1998

// Parâmetro a calcular

PC_Perda = 0; // calcular a perda de carga


PC_Vazao = 1; // calcular a vazão

Um exemplo de utilização da biblioteca aqui apresentada pode ser


III-5

visto na listagem III.4, onde se propõe a simples questão da determinação da perda


de carga em um tubo de 35 m, feito em PVC Soldável DN-25, conduzindo água a
20°C, sob vazão de 0,5 L/s.

Listagem III.4 – Exemplo de utilização da biblioteca “FUniv.pas”.


program TesteConsole1;

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 parâmetros do tubo


E.Tubo.Tipo:='PVC DN25';
E.Tubo.Diam:=21.6E-3; // Diâmetro interno em [m]
E.Tubo.Comprim:=35; // Comprimento em [m]
E.Tubo.RugAbs:=0.015E-3; // Rugosidade Absoluta em [m]

// Define parâmetros do Fluido


A.Temper:=20+273.15; // Temperatura [K]
E.Fluido:=A;

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

Como se pode observar na listagem III.4, as unidades utilizadas


pertencem exclusivamente ao SI, no entanto, para exemplificar a utilização do objeto
“Ambiente”, também se apresenta o resultado em mH2O.

Os resultados do exemplo acima podem ser vistos na listagem III.5.

Listagem III.5 – Dados de saída do programa da listagem III.4.


Perda de Carga igual a: 38105.27 Pa.
Perda de Carga igual a: 38.11 kPa.
Perda de Carga igual a: 3.89 mH2O.

Rugosidade relativa: 0.00069


Reynolds: 29473.07
Fator de Atrito: 0.025

Tecle <enter> para prosseguir...

A listagem III.6 apresenta a biblioteca “FUniv.pas” na íntegra.

Listagem III.6 – Código fonte completo da biblioteca “FUniv.pas”.


{**************************************************************************}
{ }
{ Biblioteca Delphi }
{ "unit" de implementação da }
{ Fórmula Universal de Perda de Carga (FU) }
{ }
{**************************************************************************}

unit FUniv;

interface

uses Classes,SysUtils;

//**************************************************************************
//
// Constantes globais e tipos de dados
//
//**************************************************************************

// Formulação a utilizar

const FPC_Souza = 0; // Souza et alli, 1991


FPC_Swamee = 1; // Swamee apud Porto, 1998

// Parâmetro a calcular

PC_Perda = 0; // calcular a perda de carga


PC_Vazao = 1; // calcular a vazão
III-7

Listagem III.6 – Código fonte completo da biblioteca “FUniv.pas” (cont.).


// Tipo de erro ocorrido no cálculo

FU_Ok = 0; // sem erro


FU_PerdaInvalida = 1; // entrada de perda inválida
FU_VazaoInvalida = 2; // entrada de vazão inválida
FU_DiamInvalido = 3; // entrada de diâmetro inválido
FU_RugosidadeInvalida = 4; // entrada de rugosidade inválida
FU_ComprimentoInvalido = 5; // entrada de comprimento inválido
FU_ProcessoInvalido = 6; // processo de cálculo não implementado
FU_ParametroInexistente = 7; // cálculo de parâmetro não implementado

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

// Erro numérico máximo


Erro_Q: Extended = 1E-12;

// Tipos de dados
type
EFisicalException = Class (Exception); // impossibilidade física

TAmbiente = class(TPersistent) // contém propriedades relativas ao


// ambiente físico no qual se encontra o
private // sistema avaliado
_nome: String; // nome do ambiente
_AcelGrav: Extended; // aceleração de gravidade presente
protected
procedure SetAcelGrav(gx: extended); virtual;
public
property g: extended read _AcelGrav write SetAcelGrav;
property nome: string read _nome write _nome;
constructor Create;
destructor Destroy; override;
end;

TPlanetaTerra = class(TAmbiente) //Um tipo específico e comum de ambiente


private
protected
public
constructor Create;
end;

TFluido = class(TPersistent)//define propriedades do fluído em escoamento


private
_Temper: Extended; // temperatura
_MassaEsp: Extended; // massa específica
_ViscCin: Extended; // viscosidade cinemática
protected
procedure SetTemp(Tpt: Extended); virtual;
function MassaEspecificaXTemperatura(Tpt: Extended):Extended; virtual;
function ViscCinematicaXTemperatura(Tpt: Extended):Extended; virtual;
public
Nome: String;
property MassaEsp: Extended read _MassaEsp;
III-8

Listagem III.6 – Código fonte completo da biblioteca “FUniv.pas” (cont.).


property ViscCin: Extended read _ViscCin;
property Temper: Extended read _Temper write SetTemp;
constructor Create;
destructor Destroy; override;
end;

TAgua = class(TFluido) // tipo específico e comum de fluido


private
protected
public
function MassaEspecificaXTemperatura(Tpt: Extended):Extended; override;
function ViscCinematicaXTemperatura(Tpt: Extended):Extended; override;
constructor Create;
end;

TTubo = class(TPersistent) // define propriedades do tubo no qual


private // ocrre o escoamento
_Diam: Extended; // diâmetro
_Comp: Extended; // comprimento
_RugAbs: Extended; // rugosidade absoluta
protected
public
Tipo: string;
property Diam: Extended read _Diam write _Diam;
property Comprim: Extended read _Comp write _comp;
property RugAbs: Extended read _RugAbs write _rugAbs;
constructor Create;
destructor Destroy; override;
end;

TEscoamento = class(TPersistent) // define um escoamento específico


private
_Tubo: TTubo; // tubo no qual ocorre o escoamento
_Fluido: TFluido; // fluido que escoa
_Local: TAmbiente; // ambiente no qual se encontra o sistema
_Vazao: Extended; // vazão do escoamento
_DeltaH: Extended; // perda de carga
_CoefAtrito: Extended; // coeficiente de atrito "f" para a FU.
_Regime: Cardinal; // Regime de escoamento
protected
procedure SetRegime(Reg:Cardinal); virtual;
function GetReynolds: extended;
public
property Regime: Cardinal read _Regime write SetRegime;
property Tubo: TTubo read _Tubo write _Tubo;
property Fluido: TFluido read _Fluido write _Fluido;
property Local: TAmbiente read _Local write _Local;
property Q: extended read _Vazao write _vazao;
property DH: extended read _DeltaH write _DeltaH;
property F: extended read _CoefAtrito;
property Re: extended read GetReynolds;
constructor Create;
destructor Destroy; override;
end;

// protótipo da função de cálculo através da FU


function FormUniv(var Escoamento:TEscoamento; ParametroDesejado,
ProcessodeCalculo: Cardinal): Cardinal;

implementation
III-9

Listagem III.6 – Código fonte completo da biblioteca “FUniv.pas” (cont.).


uses MyDelphiUnit03; // Biblioteca básica, v. III.7.

{Implementação dos métodos acima definidos}

//================================= TAmbiente ==============================


constructor TAmbiente.Create;

Begin;
Inherited Create;
g:=0;
nome:='';
End;
//--------------------------------------------------------------------------
destructor TAmbiente.Destroy;

Begin;
inherited destroy;
end;
//--------------------------------------------------------------------------
procedure TAmbiente.SetAcelGrav(gx: extended);

Begin;
_AcelGrav:=gx;
End;
//==========================================================================

//================================= TPlanetaTerra ==========================


constructor TPlanetaTerra.Create;

Begin;
Inherited Create;
Nome:='Terra';
g:=9.81;
End;
//==========================================================================

//=================================== TFluido ==============================


constructor TFluido.Create;

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

Listagem III.6 – Código fonte completo da biblioteca “FUniv.pas” (cont.).


function TFluido.ViscCinematicaXTemperatura(Tpt: Extended):Extended;

Begin;
result:=0;
End;
//==========================================================================

//=================================== TAgua ================================


constructor TAgua.create;

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.

const A:Array[0..10,1..2] of extended = ((0,999.8),(10,999.7),(20,998.2),


(30,995.7),(40,992.2),(50,988),
(60,983.2),(70,977.8),(80,971.8),
(90,965.3),(100,958.4));
var T:Extended;
I:Integer;

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.

const A:Array[0..10,1..2] of extended = ((0,1.785E-6),(10,1.306E-6),


(20,1.003E-6),(30,8E-7),
(40,6.58E-7),(50,5.53E-7),
(60,4.74E-7),(70,4.13E-7),
(80,3.64E-7),(90,3.26E-7),
(100,2.94E-7));
var T:Extended;
I:Integer;

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

Listagem III.6 – Código fonte completo da biblioteca “FUniv.pas” (cont.).


//=================================== TTubo ================================
constructor TTubo.Create;

begin;
Inherited Create;
Tipo:='';
Diam:=0;
Comprim:=1;
RugAbs:=0;
End;
//--------------------------------------------------------------------------
destructor TTubo.Destroy;

Begin;
inherited destroy;
end;
//==========================================================================

//========================= TEscoamento ====================================


constructor TEscoamento.Create;

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

var RegOK: Boolean;

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

Listagem III.6 – Código fonte completo da biblioteca “FUniv.pas” (cont.).


end;
//==========================================================================

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

//========================== SOUZA et alli, 1991 ========================


function SouzaF1(Q,L,D,K,Ni,Ro:Extended;var F:Extended;var Regime:Cardinal)
:Extended;
// calcula a perda de carga "DH" em [Pa]
// dados: Q [m3/s]
// L [m]
// D [m]
// K [m]
// Ni [m2/s]
// Ro [Kg/m3]

// retorna ainda: F - fator de atrito


// Regime - tipo de regime

// implementado segundo o fluxograma da figura A.2

var Re,Ep,Fi1,Fi2,Lm,T: Extended;


Ex: Extended;

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

Listagem III.6 – Código fonte completo da biblioteca “FUniv.pas” (cont.).


Else
If (D/k)<=(Ex/448) Then T:=k/(3.71*D)
Else T:=k/(3.71*D)+ 5.62/Elev(Re,0.9);

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]

// retorna ainda: F - fator de atrito


// Regime - tipo de regime

// implementado segundo o fluxograma da figura A.3

var Ref,Ep,Fi1,Fi2,Lm,T: Extended;


Ex: Extended;

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

Listagem III.6 – Código fonte completo da biblioteca “FUniv.pas” (cont.).


If (D/k)<=(800/200) Then T:=k/(3.71*D)
Else T:=k/(3.71*D)+ 2.51/Ref;

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]

// retorna ainda: F - fator de atrito


// Regime - tipo de regime

// implementado segundo o fluxograma da figura A.4

var M,N,Ep,Fi1,Fi2,Lm,T: Extended;


Ex: Extended;

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

Listagem III.6 – Código fonte completo da biblioteca “FUniv.pas” (cont.).


If M<=(Ex/236) Then T:=0.38*Elev(N,1.042)/M
Else T:=4.15/Elev(N,0.937) + 0.38*Elev(N,1.042)/M;

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]

// retorna ainda: F - fator de atrito


// Regime - tipo de regime

// implementado segundo o fluxograma da figura A.5

var E,G,Ep,Fi1,Fi2,Lm,T: Extended;


Ex: Extended;

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

Listagem III.6 – Código fonte completo da biblioteca “FUniv.pas” (cont.).


If G<=(27*Ex) Then T:=18.83/Elev(E,3/2)
Else
If G>=(393*Ex) Then T:=1.03*G/Elev(E,5/3)
Else T:=1.03*G/Elev(E,5/3) + 18.83/Elev(E,3/2);

F:=Elev(-2*Log(Fi1*Lm+Fi2*T,10),-2);
End;
Result:=F*L*Ro*V*V/(2*DH);
End;
//==========================================================================

//========================== SWAMEE, apud PORTO, 1998 ======================


function SwameeF1(Q,L,D,K,Ni,Ro:Extended;var F:Extended;var Regime:Cardinal)
:Extended;
// calcula a perda de carga "DH" em [Pa]
// dados: Q [m3/s]
// L [m]
// D [m]
// K [m]
// Ni [m2/s]
// Ro [Kg/m3]

// retorna ainda: F - fator de atrito


// Regime - tipo de regime

// implementado segundo a equação A.4.

var Re: Extended;

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]

// retorna ainda: F - fator de atrito


// Regime - tipo de regime

// implementado segundo a equação A.5.

var Ref,Re: Extended;


III-17

Listagem III.6 – Código fonte completo da biblioteca “FUniv.pas” (cont.).


Begin;
Ref:=(D/Ni)*Sqrt(2*D*DH/(Ro*L));
F:=Elev(Elev(64/Ref,16)+9.5*Elev(Ln(k/(3.71*D)+2.51/Ref)
-Elev(400/Ref,6),-16),1/8);
Result:=(PI*D*D/4)*Sqrt(2*D*DH/(F*L*Ro));
Re:=4*Result/(PI*D*Ni);
Regime:=RE_Laminar;
If Re>2500 Then Regime:=RE_Critico;
If RE>=4000 Then Regime:=RE_Turbulento;
End;
//--------------------------------------------------------------------------
function SwameeF3(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]

// retorna ainda: F - fator de atrito


// Regime - tipo de regime

// implementado segundo a equação A.6.

var M,N,Re: Extended;

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]

// retorna ainda: F - fator de atrito


// Regime - tipo de regime

// implementado segundo a equação A.7.

var E,G,Re: Extended;

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

Listagem III.6 – Código fonte completo da biblioteca “FUniv.pas” (cont.).


Result:=F*L*Ro*V*V/(2*DH);
Re:=V*Result/Ni;
Regime:=RE_Laminar;
If Re>2500 Then Regime:=RE_Critico;
If RE>=4000 Then Regime:=RE_Turbulento;
End;
//==========================================================================

//
// função de cálculo para caracterização quantitativa de escoamento
//

function FormUniv(var Escoamento:TEscoamento; ParametroDesejado,


ProcessodeCalculo: Cardinal): Cardinal;

//onde: Escoamento - resultado do cálculo desejado. O parâmetro


// procurado se encontra na propriedade
// correspondente desse objeto,que é do tipo
// TEscoamento.
// ParametroDesejado - indica qual propriedade de "Ecoamento"
// deve ser determinada, as demais
// propriedades são tomadas como dados
// do problema.
// ProcessdeCalculo - indica se os cálculos devem ser operados
// por SOUZA et alli., 1991, ou segundo a
// formulação proposta por Swamee.
//
// A função retorna um possível código de erro.

Type
TFuncao = function(P1,P2,P3,P4,P5,P6:extended; var P7:extended;
var P8:Cardinal): Extended;

var X0,X1,X2,Y0,Y1: Extended;


FCalc1,FCalc2: TFuncao;
Rg: Cardinal;

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

Listagem III.6 – Código fonte completo da biblioteca “FUniv.pas” (cont.).


If Result<>0 Then Exit;

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;

PC_Perda: With Escoamento Do


Begin;
If Q<0 Then result:=FU_VazaoInvalida;
If Tubo.Diam<=0 Then result:=FU_DiamInvalido;
If Tubo.Comprim<=0 Then result:=FU_ComprimentoInvalido;
If Tubo.RugAbs<=0 Then result:=FU_RugosidadeInvalida;
If Result<>0 Then Exit;

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.

III.2. Biblioteca Matemática Básica.

No decorrer da implementação do código da Fórmula Universal,


assim como de vários outros processos que se apresentam neste trabalho, utiliza-se
III-20

funções que não fazem parte da biblioteca padrão da linguagem utilizada.

A implementação dessas rotinas pode ser vista na listagem III.7

Listagem III.7. – Biblioteca de rotinas matemáticas.


{**************************************************************************}
{ }
{ Biblioteca Delphi }
{ "unit" de implementação de }
{ Rotinas matemáticas básicas e outros }
{ tratamentos de números. }
{ }
{**************************************************************************}
Unit MyDelphiUnit03;

Interface

//{$M 16384,16777216} // sugestão: pilha mínima: 16Kb, pilha máxima: 16Mb


// permite limite de MaxDim=1250

// Constantes e Tipos de Dados.


const MaxDim=100; // máximo número de equações simultâneas;
// esse limite é imposto pelo hardware e configuração de
// memória acima; quando se aumenta muito o tamanho da
// pilha a performance parece cair.

Type TMatriz_Gauss = Array [1..MaxDim,1..MaxDim] of Extended;


TVetor_Gauss = Array [0..MaxDim] of Extended;

// Protótipos de procedimentos e funções

// resolve sistemas lineares pelo método da eliminação de Gauss


Procedure Gauss(Var A:TMatriz_Gauss; Var B,X:TVetor_Gauss; N:Integer;
Var SL:Boolean);
// Executa a b-ésima potência de A
Function Elev (A,B: Extended): Extended;
// Executa Log de A na base B
Function Log (A,B: Extended): Extended;
// retorna o valor de Pi (3.1415...)
Function Pi : Extended;
// Retorna o Arco cujo Cos é X, em rad.
Function ArcCos(X:Extended):Extended;
// Retorna a Tangente de X radianos
Function Tan(X:Extended): Extended;
// Retorna "V" arredondado 4/5 para "D" decimais
Function Arredonda(V:Extended;D:Integer):Extended;
// Retorna "V" truncado para "D" decimais
Function Trunca(V:Extended;D:Integer):Extended;
// Calcula fatorial de "N"
Function Fat(N:Cardinal):Extended;
// calcula o número de arranjos de N elementos p a p
Function Arranjo(N,P:Cardinal):Extended;
// calcula o número de combinações de N elementos P a P
Function Comb(N,P: Cardinal): Extended;
// retorna o "sinal" do argumento
Function Sinal (X: Extended): Extended;
// joga um dado com NF faces, retornando a que caiu
Function Dado (NF:Cardinal): cardinal;
III-21

Listagem III.7. – Biblioteca de rotinas matemáticas (cont.)


// Solução de equação de 2o. Grau
Procedure Eq2G(A,B,C: Extended; var X1,X2:Extended;var Erro:Word);

Implementation

uses SysUtils;

{Implementação dos protótipos acima definidos}

{--------------------------------------------------------------------------}
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;

{calcula a B-ésima potência de A}

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;

If B=0 then Elev:=1; {se o expoente é zero, o resultado é 1}


If (A<0) and (Frac(B)=0) and (B<>0) then {se o expoente for inteiro,
a potência de base negativa
é definida}
Begin;
If B=0 Then S:=0 Else S:=1-2*(Round(Abs(B)) mod 2);//determina o sinal
// de A (-1,0,1)
Elev:=S*Exp(B*Ln(Abs(A))); //calcula o valor da potencia e manipula
//o sinal}
End;

If (A<0) and (Frac(B)<>0) then


III-22

Listagem III.7. – Biblioteca de rotinas matemáticas (cont.)


Begin; {erro de Runtime, se base <0 não está definida o potência}
raise EMathError.CreateFmt('Base de Exponenciação < 0 para'+
' expoente não inteiro!',[]);
Elev:=0;
exit;
End;
End;
{--------------------------------------------------------------------------}
Function Log (A,B: Extended): Extended;
{Calcula o Logarítimo de A, na Base B.}

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

{..........................................................................}

Procedure Pivotamento (Var A: TMatriz_Gauss; VAR B: TVetor_Gauss;


K,N: Integer;Var SL:Boolean);

{..........................................................................'
' 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

Listagem III.7. – Biblioteca de rotinas matemáticas (cont.)


BEGIN;
FOR J:= K TO N DO
BEGIN;
AUX:=A[LP,J];
A[LP,J]:=A[K,J];
A[K,J]:=AUX;
END;
AUX:=B[LP]; B[LP]:=B[K] ;B[K]:=AUX;
END;
SL:=ABS(PV)<= (1E-4932);
END;

{..........................................................................}

VAR I,J,K,L: INTEGER;


M,SUM: EXTENDED;

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;

IF (ABS(A[N,N])>=1E-4932) And (Not SL) Then


Begin;
X[N]:=B[N]/A[N,N];
FOR L:=N-1 DOWNTO 1 DO
BEGIN;
SUM:=0;
FOR J:=L+1 TO N DO SUM:=SUM+A[L,J]*X[J];
X[L]:=(B[L]-SUM)/A[L,L];
END;
End;
END;
{--------------------------------------------------------------------------}
Function Tan(X:Extended): Extended;

Begin;
Tan:=Sin(X)/Cos(X);
End;
{--------------------------------------------------------------------------}
Procedure Eq2G(A,B,C: Extended; var X1,X2:Extended;var Erro:Word);

// Erro: 0 - sem erro;


// 1 - sem raízes reais, valores de X1 e X2 inválidos;

var Delta:Extended;

Begin;
Delta:=B*B-4*A*C;
If Delta<0 Then
Begin
Erro:=1;
X1:=0;
X2:=0;
III-24

Listagem III.7. – Biblioteca de rotinas matemáticas (cont.)


End
Else
Begin;
X1:=(-B+Sqrt(Delta))/(2*A);
X2:=(-B-Sqrt(Delta))/(2*A);
End;
End;
{--------------------------------------------------------------------------}
Function Arredonda(V:Extended;D:Integer):Extended;
// Retorna "V" arredondado 4/5 para "D" decimais

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

Listagem III.7. – Biblioteca de rotinas matemáticas (cont.)


End
Else // se a combinação existe
Comb:=Fat(N)/(Fat(P)*Fat(N-P)); // calcula C(N,P)=N!/(P!(N-P)!)
End;
//--------------------------------------------------------------------------
Function Dado (NF:Cardinal):Cardinal;
// joga um dado com NF faces, retornando a que caiu

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

Nesse Apêndice apresenta-se a implementação computacional das


rotinas utilizadas para a solução de sistemas de equações não lineares. Após a
apresentação genérica das mesmas, são apresentadas suas aplicações específicas
para os exemplos do Anexo B e do Anexo C.

IV.1. Solução para o Sistema de Equações não Lineares.

Como instrumento para a execução dos exemplos necessários ao


presente trabalho, utiliza-se uma rotina de solução para sistemas de equações não
lineares, que implementa o método de Newton-Raphson para sistemas de grau “n”,
conforme descrito por MARON (1987).

IV.1.1 Fundamentação

Seja o vetor x = [x1 x 2 L x n ] a solução para um sistema

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)

Supondo-se ainda que se disponha de x k , como uma aproximação

corrente para o vetor solução desejado ( x ).


IV-2

A estratégia de solução consiste em obter-se uma nova


aproximação ( x k +1 ) de tal forma que a avaliação das funções f i (x ) se aproximem

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.

Pode-se tomar como premissa que uma dada aproximação ( x k )

distancia-se do vetor solução ( x ) de um “vetor diferença” ( dx ), de tal forma que


x = x k + dx , onde dx = [dx1 , dx 2 , L dxn ] .

Tomando-se então que, para cada função, pode-se escrever:

f i ( x k + dx ) = 0, i = 1,2,K, n (IV.2)

Aplicando-se o conceito de derivada total à equação IV.2, pode-se


escrever, para cada função (fi a fn):

∂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

É possível reescrever essa série de “n” equações, indicadas na


equação IV.3, em forma matricial.
IV-3

 ∂f1 (x k ) ∂f1 (x k ) ∂f1 (x k ) 


 ∂x L
∂x2 ∂xn 
   dx   f1 ( x k ) 
1
 ∂f 2 (x k ) ∂f 2 (x k ) L ∂f 2 (x k ) dx1   f (x )
 ∂x1 ∂x2 ∂xn  ⋅  2  = −  2 k 
 M M M
M M  dx   f (x )
   n  n k 
 ∂f n ( x k ) ∂f n ( x k ) ∂f n ( x k ) 
L
 ∂x1 ∂x2 ∂xn 
(IV.4)
J = f ′(x k ) dx − f (x k )

onde a matriz “J” recebe a denominação de “matriz jacobiana”.

Resolvendo o sistema linear apresentado para que se obtenha o


vetor ( dx ), pode-se avaliar a aproximação seguinte através da equação IV.5.

x k +1 = x k + dx k (IV.5)

IV.1.2. Implementação

Para a implementação do método de Newton-Raphson, de forma


aplicada ao presente trabalho, é necessário primeiramente dispor-se das seguintes
ferramentas:
a) uma rotina capaz de construir a matriz Jacobiana (J), apresentada
na equação IV.4, assim como o vetor com os valores das funções segundo a
aproximação corrente (-f(xk));

b) uma rotina de solução para sistemas lineares de equações, a fim


de ser utilizada na determinação do vetor dx . Tal rotina consta da biblioteca
matemática básica, apresentada na listagem III.7.;
IV-4

c) uma rotina para a implementação da equação IV.5, e a avaliação


do erro das funções para tomada de decisão sobre prosseguir ou não as
aproximações sucessivas.

Desses três pontos, “b” e “c” são de implementação imediata, no


entanto, são necessárias algumas considerações a cerca da montagem da matriz
“Jacobiana”.

Primeiramente, pode-se observar que a matriz “J”, da equação IV.4,


é sempre quadrada, de lado “n”, i.e. sempre de dimensão n x n.

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

Com o conhecimento dessa propriedade, a implementação


computacional da matriz indicada na equação IV.6 se torna bastante imediata, desde
que se disponha de ferramenta adequada para o cálculo da derivada parcial
envolvida.

Com o objetivo de proporcionar uma total liberdade de processo de


cálculo para a avaliação das funções ( f i (x ) ) que compõem o sistema não linear, de

forma a permitir que, em seu corpo, possam chamar outras funções, proceder
IV-5

desvios e testes, ou utilizar-se de qualquer outro expediente computacional válido,


optou-se pela implementação numérica (e não analítica) do mecanismo de avaliação
das derivadas parciais, sendo que, as únicas restrições dessa opção, residem no fato
de que as funções ( f i (x ) ), assim como suas derivadas, devem ser contínuas, dentro

de um intervalo seguro, expandido em torno do espaço de soluções limitado pela


primeira aproximação (x1) e pelo vetor solução ( x )IV.1..

Essa forma permissiva de caracterização das funções trazem,


contudo, uma certa dificuldade na avaliação de suas derivadas em um dado ponto,
uma vez que não se conhece a natureza analítica da curva em questão, sabendo-se
apenas, que, provavelmente, trata-se de uma curva próxima a um polinômio de grau
2.

Tal proximidade indica, no sentido de assimilarmos a mesma a um


polinômio, que, se não exatamente de grau 2, os termos com grau maior e menor que
este colaborariam para a aplicação das correções necessárias. Graças a tal
proximidade contorna-se adequadamente as questões ligadas ao Problema de
WiggleIV.2.

Para tanto, optou-se pela aproximação polinomial utilizando-se a


Fórmula de Interpolação de Newton, com diferenças progressivas, uma vez que
apresenta resultados adequados ao problema sob análise, é uma técnica

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

relativamente comum e suas técnicas de derivação são bem conhecidas.


A apresentação e discussão dessa técnica se encontra em SCHEID
(1968), BARBOSA (1976) e MARON (1987), entre outros. Segue-se, no entanto,
uma breve apresentação de seus elementos práticos fundamentais.

Definindo-se “diferença” de uma dada função “u”, e representando-


se tal definição pelo operador “∆”, podemos escrever:

∆u k = u k +1 − u k (IV.7)

Aplicando-se a equação IV.7 de forma recursiva, podemos escrever


diferenças de ordem mais alta, como:

∆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

e assim sucessivamente, de modo que:

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

As aplicações recursivas da equação IV.7 conduzem à possibilidade


de construção de uma tabela de diferenças progressivas, de implementação mais
simples que a equação IV.8. A estrutura para uma tabela desse tipo pode ser vista na
equação IV.9.
IV-7

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

De posse das diferenças, calculadas por tabela semelhante à da

equação IV.9, e fazendo-se u = y(x), podemos escrever o polinômio interpolador (eq.

IV.10) e sua derivada primeira (eq. IV.11)IV.3.

P ( x ) = y 0 +  1s ∆y 0 +  2s ∆2 y 0 +  3s ∆3 y 0 + K +  ns ∆n y 0


        (IV.10)

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

Como, para o caso apresentado nesse trabalho, não nos interessa o


estabelecimento da função polinomial derivada primeira do polinômio interpolador,

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 

onde: h – intervalo entre os valores de “xi”, utilizados para a


avaliação dos valores da função “ui” (ou yi), quando da
geração da tabela de diferenças.

Dispondo-se, portanto, das rotinas adequadas à avaliação das


derivadas das funções “fi”, em pontos específicos, pode-se implementar o método de
Newton-Raphson, como apresentado na listagem IV.1.

Listagem IV.1 – Código fonte para o método de Newton-Raphson


{**************************************************************************}
{ }
{ Biblioteca Delphi }
{ "unit" de implementação da }
{ Solução de Sistemas de Equações Simultâneas }
{ não lineares pelo método de Newton-Raphson }
{ }
{**************************************************************************}
Unit SistNaoLinear;

interface

uses MyDelphiUnit03; // utiliza biblioteca conforme listagem III.7

// Tipos de Dados.
Type TVetor = array[1..MaxDim] of Extended; // vetor de números reais

PTVetor = ^TVetor; // ponteiro para vetor de número reais

TFdeX = function (X:Extended):Extended; // tipo função de uma variável


// escalar: f(x)

TFvet = function (X:TVetor):Extended; // tipo função de uma variável


// vetorial: f(X) onde X é um vetor

Tmfvx = Array[1..MaxDim] of TFvet; // vetor de funções vetoriais

// Variáveis globais
var IntCont: Integer;

// Protótipos de procedimentos e funções


IV-9

Listagem IV.1 – Código fonte para o método de Newton-Raphson (cont.)


// Resolve o sistema não linear pelo método de Newton-Raphson
Procedure NRaph1 (M:TmFvx; var X1:TVetor; N:Integer; Err:Extended);

implementation
{Implementação dos protótipos acima definidos}

var Xv: TVetor; // armazena global, a esta unit, o vetor XY


IV: Integer;// armazena global, a esta unit, o indice da variavel
// segundo a qual será feita a derivada IV1
Fx: TFvet; // armazena global, a esta unit, o endereco da funcao a
derivar

{---------------------------------------------------------------------------}
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 8 Do For J:=0 To 9 Do A[I,J]:=0; //inicializa tabela de


// diferencas

H:=1/2048; {estabelece a diferença entre os valores de xi}


N:=8; {numero de termos da expressao IV.12}

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

Listagem IV.1 – Código fonte para o método de Newton-Raphson (cont.)


{---------------------------------------------------------------------------}
Function Fxa (X0:Extended):Extended;
{arranja os argumentos e calcula o valor da funcao para 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 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"

T:=True; // assinala que haverá necessidade de mais iterações


IntCont:=0; // inicializa contador de iterações
While T Do // enquanto existir necessidade de iterações
Begin;
Inc(IntCont); // incrementa contador de iterações

{construção da matriz Jacobiana}


For I:=1 To N Do // para cada linha da matriz "A"
Begin;
For J:=1 To N Do // calcula a derivada parcial, segundo cada
A[I,J]:=DPar(M[I],X,J); // incógnita X[J], no ponto dado
// por X montando a matriz A[]
V[I]:=M[I](X); // calcula o resultado de cada função para
// o vetor solução atual.
End;

Gauss(A,V,DX,N,SL); // encontra o vetor das diferenças dX[]


IV-11

Listagem IV.1 – Código fonte para o método de Newton-Raphson (cont.)


For I:=1 To N Do X[I]:=X[I]-DX[I]; // aplica as diferenças ao vetor
// solução
T:=False; // marca como final de iterações

{verifica critério de parada}


For I:=1 To N Do
T:=T or (Abs(M[I](X)) > Abs(Err)); // se ao menos uma função
// calculada apresentar resultado maior
// que o erro máximo admissível, assinala
// necessidade de mais iteração.
End; // ao terminar as iterações..

X1:=X; // atribui o vetor resultado e sai


End;
{---------------------------------------------------------------------------}
end.

Atentando-se aos argumentos da função “NRaph1”, observa-se que


as funções propriamente ditas, componentes do sistema não linear, são passadas para
a citada rotina na forma de um vetor composto por elementos do tipo funçãoIV.5., e
que essas devem ser arranjadas de tal forma que apresentem valor nulo quando
satisfeitas.

IV.2. Implementação dos Exemplos.

Melhores esclarecimentos quanto à utilização da rotina de solução


de sistemas não lineares aqui proposta podem obtidos pela apresentação da
implementação específica dos exemplos dos Anexos B e C.

IV.5.
Tecnicamente são passados “ponteiros” ou “endereços”, onde o sistema pode
encontrar a verdadeira implementação das mesmas.
IV-12

IV.2.1. Exemplo do Anexo B – rede aberta.

As leis internas de cada componente que compõem o sistema não


linear a ser resolvido, são declaradas em um módulo de nome “Funcoes”, que, para o
exemplo em estudo, pode ser visto na listagem IV.2.

Listagem IV.2. – Funções do sistema não linear para exemplo do Anexo B.


unit Funcoes;

// Esta unit implementa as funções, de f1 a fn, que compõem o sistema


// não linear a ser resolvido para a solução do exemplo do Anexo B.
// Todas essas funções devem ser arranjadas de forma a ter resultado nulo
// (zero), quando a solução for atingida.

interface

Uses MyDelphiUnit03, SistNaoLinear;

Const NumEq=32; // número de equações para o sistema (deve ser global)

Var A: TmFvx; // vetor que contém as equações (deve ser global)

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

// atribuição de cada função ao elemento correspondente no vetor de funções.


A[1]:=f1;
A[2]:=f2;
A[3]:=f3;
A[4]:=f4;
A[5]:=f5;
A[6]:=f6;
A[7]:=f7;
A[8]:=f8;
A[9]:=f9;
A[10]:=f10;
A[11]:=f11;
A[12]:=f12;
A[13]:=f13;
A[14]:=f14;
A[15]:=f15;
A[16]:=f16;
A[17]:=f17;
A[18]:=f18;
A[19]:=f19;
A[20]:=f20;
A[21]:=f21;
A[22]:=f22;
IV-16

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.

O código de gerenciamento e acionamento do exemplo pode ser


visto na listagem IV.3. Omite-se, no entanto, a descrição do formulário principal
uma vez que a mesma é bastante intuitiva, por conter somente um componente do
tipo “button” e outro do tipo “memo”.

Listagem IV.3 – Acionamento da solução para o exemplo do Anexo B.


unit Unit1;

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

uses SistNaoLinear, Funcoes;

{$R *.DFM}

//============================================================================
procedure TForm1.Button1Click(Sender: TObject);

Var I: Integer;
X: TVetor;
T1,T2: TDateTime;
R:TTimeStamp;
IV-17

Listagem IV.3 – Acionamento da solução para o exemplo do Anexo B. (cont)


Begin;

// dados da aproximação inicial


X[1]:=1;
X[2]:=0.8;
X[3]:=0.6;
X[4]:=0.4;
X[5]:=0.2;
X[6]:=0.2;
X[7]:=0.2;
X[8]:=0.2;
X[9]:=0.2;
X[10]:=2;
X[11]:=2;
X[12]:=2;
X[13]:=19;
X[14]:=19;
X[15]:=19;
X[16]:=19;
X[17]:=19;
X[18]:=19;
X[19]:=19;
X[20]:=19;
X[21]:=19;
X[22]:=19;
X[23]:=19;
X[24]:=19;
X[25]:=19;
X[26]:=19;
X[27]:=19;
X[28]:=19;
X[29]:=19;
X[30]:=19;
X[31]:=19;
X[32]:=19;

T1:=Now; // marca momento de início

NRaph1(A,X,NumEq,1E-16); // resolve o sistema não linear

T2:=Now; // marca momento de final


T1:=T2-T1; // calcula diferença de tempo
R:=DateTimeToTimeStamp(T1); // converte para milisegundos

// mostra tempo, resultados e erros


With Memo1.Lines Do
Begin;
Clear;
Add('Resultados...');
Add(Format('Foram efetuadas %d iterações.',[IntCont]));
Add(Format('Consumidos %5.3f segundos',[R.Time/1000]));
For I:= 1 To NumEq Do Add(Format('X[%2d]= %10.7e',[I,X[I]]));
Add('');
Add('Erros finais nas equações propostas...');
For I:= 1 To NumEq Do Add(Format('f%2d(X)=%15.12f',[I,A[I](X)]));
End;
end;
//===========================================================================
end.
IV-18

IV.2.2. Exemplo do Anexo C – rede em anel.

De forma similar àquela apresentada no item IV.2.1, as leis internas


de cada componente que compõem o sistema não linear a ser resolvido, também são
declaradas em um módulo de nome “Funcoes”, que, para este exemplo, pode ser
visto na listagem IV.4.

Listagem IV.4. – Funções do sistema não linear para exemplo do Anexo C.


unit Funcoes;

// Esta unit implementa as funções, de f1 a fn, que compõem o sistema


// não linear a ser resolvido para o exemplo do Anexo C. Todas as
// funções devem ser arranjadas de forma a ter resultado nulo (zero),
// quando a solução for encontrada.

interface

Uses MyDelphiUnit03, SistnaoLinear, Dialogs;

Const NumEq=47; // número de equações para o sistema (deve ser global)

Var A: TmFvx; // vetor que contém as equações (deve ser global)

implementation

{--------------------------------------------------------------------------}
// rotina auxiliar para proporcionar redução de código na implementação do
// componente "Tê".

procedure CalcTe(var F1,F2:Extended; DN:Byte; Qa,Qb,Qc,Ha,Hb,Hc:Extended);

var DHAB,DHAC,DHBA,DHBC,DHCA,DHCB: Extended;

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

// atribuição de cada função ao vetor de funções.


A[1]:=f1;
A[2]:=f2;
A[3]:=f3;
A[4]:=f4;
A[5]:=f5;
A[6]:=f6;
A[7]:=f7;
A[8]:=f8;
A[9]:=f9;
A[10]:=f10;
A[11]:=f11;
A[12]:=f12;
A[13]:=f13;
A[14]:=f14;
A[15]:=f15;
A[16]:=f16;
A[17]:=f17;
A[18]:=f18;
A[19]:=f19;
A[20]:=f20;
A[21]:=f21;
A[22]:=f22;
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;
A[33]:=f33;
A[34]:=f34;
A[35]:=f35;
A[36]:=f36;
IV-26

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.

O código que contém a aproximação inicial, o encaminhamento da


solução do sistema de equações e a apresentação de resultados se encontra na
listagem IV.5. Do mesmo modo que no exemplo anterior, a omitiu-se a descrição do
formulário, que é idêntico àquele.

Listagem IV.5 – Acionamento da solução para o exemplo do Anexo C.


unit Unit1;

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

uses SistNaoLinear, Funcoes;

{$R *.DFM}

//===========================================================================
procedure TForm1.Button1Click(Sender: TObject);

Var I: Integer;
X: TVetor;
T1,T2: TDateTime;
R:TTimeStamp;
IV-27

Listagem IV.5 – Acionamento da solução para o exemplo do Anexo C. (cont)


Begin;

// dados da aproximação inicial


X[1]:=-4.0521;
X[2]:=-2.2287;
X[3]:=-1.8234;
X[4]:=-1.3507;
X[5]:=-1.8234;
X[6]:=-0.8779;
X[7]:=-0.9455;
X[8]:=-1.7559;
X[9]:=-1.3507;
X[10]:=-0.4052;
X[11]:=-0.8104;
X[12]:=-1.3507;
X[13]:=0.5403;
X[14]:=0.4052;
X[15]:=0.9455;
X[16]:=0.5403;
X[17]:=0.8780;
X[18]:=5;
X[19]:=10;
X[20]:=10;
X[21]:=10;
X[22]:=10;
X[23]:=10;
X[24]:=10;
X[25]:=10;
X[26]:=10;
X[27]:=10;
X[28]:=10;
X[29]:=10;
X[30]:=10;
X[31]:=10;
X[32]:=10;
X[33]:=10;
X[34]:=10;
X[35]:=10;
X[36]:=10;
X[37]:=10;
X[38]:=10;
X[39]:=10;
X[40]:=10;
X[41]:=10;
X[42]:=10;
X[43]:=10;
X[44]:=10;
X[45]:=10;
X[46]:=10;
X[47]:=10;

T1:=Now; // marca momento de início

NRaph1(A,X,NumEq,1E-16); // resolve o sistema não linear

T2:=Now; // marca momento de final


T1:=T2-T1; // calcula diferença de tempo
R:=DateTimeToTimeStamp(T1); // converte para milisegundos

// mostra tempo, resultados e erros


With Memo1.Lines Do
IV-28

Listagem IV.5 – Acionamento da solução para o exemplo do Anexo C. (cont)


Begin;
Clear;
Add('Resultados...');
Add(Format('Foram efetuadas %d iterações.',[IntCont]));
Add(Format('Consumidos %5.3f segundos',[R.Time/1000]));
For I:= 1 To NumEq Do Add(Format('X[%2d]= %10.7e',[I,X[I]]));
Add('');
Add('Erros nas equações propostas...');
For I:= 1 To NumEq Do Add(Format('f%2d(X)=%15.12f',[I,A[I](X)]));
End;
end;
//===========================================================================
end.
V-1

APÊNDICE V

Este apêndice apresenta a implementação de componentes e rotinas


que desempenham papel fundamental no controle do tempo simulado, na geração
das variáveis independentes, assim como aquelas ligadas a registro e análise de
valores de variáveis verificados durante a simulação.

V.1. Relógio-calendário.

O relógio-calendário, para o controle e registro do tempo de


simulação (referido como “Relógio” no Capítulo 8) foi implementado como um
componente, registrado na paleta de componentes, do ambiente de desenvolvimento
integrado Delphi 4.0.

O código apresentado na listagem V.1 define esse componente,


como classe “TRelCalend”, e o registra na seção “samples” da paleta de
componentes. Opcionalmente pode ainda ser definido um ícone apropriado para o
mesmo.

Listagem V.1 – Componente “TRelCalend”.


{**************************************************************************}
{ }
{ Componente Delphi }
{ "unit" de implementação do }
{ componente Relógio Calendario para }
{ registro e manipulação do tempo da simulação }
{ }
{**************************************************************************}
unit RelCalend;
V-2

Listagem V.1 – Componente “TRelCalend” (cont.)


{$H+}
interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
MyDelphiUnit02, MyDelphiUnit04,ExtCtrls;

// definição de tipos e constantes


type
TRelCalend = class(TComponent)
private
{ Private declarations }
FDia: TData; // Data
FHora: THora; // Hora
FMudaData: TNotifyEvent; // evento de mudança de data;
FMudaHora: TNotifyEvent; // evento de mudança de hora;
FTimerInterno: TTimer; // relógio para automatismo interno
FIncData: Record // incremento automático de data
IDia: Word;
IMes: Word;
IAno: Word;
End;
FIncHora: Record // incremento automático de hora
IHora: Word;
IMin: Word;
ISeg: Extended;
End;

procedure SetDataS(S:String); // escreve data a partir de string


procedure SetHoraS(S:String); // escreve hora a partir de string
procedure SetIncDataS(S:String); // escreve increm. de data de str.
procedure SetIncHoraS(S:String); // escreve increm. de hora de str.
function GetDataS:String; // le data para string
function GetHoraS:String; // le hora para string
function GetSegundo:Extended; // monta segundos + milissegundos
function EhFeriado : Boolean; // retorna "TRUE" se o dia é feriado
function GetIncDataS: String; // le incr. de data para str
function GetIncHoraS: String; // le incr. de hora para str.
function GetInterval: Cardinal; // le intervalo do incr. autom.
function GetAutomLig: Boolean; // "TRUE" se autom. acionado
procedure SetInterval(T: Cardinal); // escreve intervalo do timer int.
procedure IncrementoAutomatico(Sender:TObject); // rotina para onde vai
// "OnTimer" do timer interno

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

constructor Create(AOwner: TComponent); override; // construtor


destructor Destroy; override; // destrutor
procedure Incrementa; // com. man. p/ incrementar
procedure ProxData(DD,MM,AA:word); // avança DD,MM,AA na data
procedure ProxHora(HH,MM:word; SS:Extended); // avança HH,MM,SS na hora
procedure StartAutom; // aciona incremento automático
procedure StopAutom; // interrompe incremento automático

published
V-3

Listagem V.1 – Componente “TRelCalend” (cont.)


{ Published declarations }
// Data em formato texto
property SData:String read GetDataS write SetDataS;
// Hora em formato texto
property SHora:String read GetHoraS write SetHoraS;
// Passo do incremento automático
property PassoTimer: Cardinal read GetInterval write SetInterval;
// Valor do incremento automático de data
property Incdata: string read GetIncDataS write SetIncDataS;
// Valor do incremento automático de hora
property IncHora: string read GetIncHoraS write SetIncHoraS;

// ponteiros para as rotinas de tratam. dos eventos


property OnMudaData: TNotifyEvent read FMudaData write FMudaData;
property OnMudaHora: TNotifyEvent read FMudaHora write FMudaHora;

property Dia: Word read FDia.Dia; // Dia atual


property Mes: Word read FDia.Mes; // Mês atual
property Ano: Word read FDia.Ano; // Ano atual
property Hora: Word read FHora.Hora; // Hora atual
property Min: Word read FHora.Minuto; // Minuto atual
property Seg:Extended read GetSegundo; // Segundo atual
property Feriado:Boolean read EhFeriado; // "TRUE" se feriado

end;

procedure Register;

//=========================================================================

implementation

uses MyDelphiUnit00, MyDelphiUnit01;

//-------------------------------------------------------------------------
procedure Register;
// Registra o componente no ambiente
begin
RegisterComponents('Samples', [TRelCalend]);
end;
//=========================================================================
constructor TRelCalend.Create(AOwner: TComponent);

var Err: Boolean;

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

Listagem V.1 – Componente “TRelCalend” (cont.)


End;
//-------------------------------------------------------------------------
function TRelCalend.GetDataS: String;

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

Listagem V.1 – Componente “TRelCalend” (cont.)


function TRelCalend.GetHoraS: String;

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

HR:=HR + (MR div 60);


MR:=MR mod 60;

FDia.NovaData(HR Div 24);


IF HR>=24 Then HouveMudancadeData:=True;
HR:=HR mod 24;

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

Listagem V.1 – Componente “TRelCalend” (cont.)


Begin;
If assigned(FMudaData) Then FMudaData(self);
End;
//-------------------------------------------------------------------------
procedure TRelCalend.MudaHora;

Begin;
If assigned(FMudaHora) Then FMudaHora(self);
End;
//-------------------------------------------------------------------------
function TRelCalend.GetSegundo:Extended;

Begin;
GetSegundo:=FHora.Segundo+FHora.Milisegundo/1000;
End;
//-------------------------------------------------------------------------
function TRelCalend.EhFeriado: Boolean;

var Fer: Array [1..12] of TData;


B: Boolean;
I: Word;

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;

var DD,MM,AA: 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;

var HH,MM,SS: 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

Listagem V.1 – Componente “TRelCalend” (cont.)


Result:=HH+':'+MM+':'+SS;
end;
//--------------------------------------------------------------------------
Procedure TRelCalend.SetIncDataS(S:String);

var DD,MM,AA: Word;


SA: Array[1..3] of String;
SX: String;
I,J: Longint;
Err: Boolean;

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

var HH,MM: Word;


SS: Extended;
SA: Array[1..3] of String;
SX: String;
I,J: Longint;
Err: Boolean;

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

Listagem V.1 – Componente “TRelCalend” (cont.)


If not Err Then
Begin;
FIncHora.IHora:=HH;
FIncHora.IMin:=MM;
FIncHora.ISeg:=SS;
End
Else ShowMessage('Erro no incremento de hora do relógio de simulação!');
End;
//--------------------------------------------------------------------------
function TRelCalend.GetInterval: Cardinal;

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

Uma vez criado o componente, por sua introdução em um


formulário ou através do método “Create”, e definidas suas propriedades principais,
que são, a data e hora de início, incremento de hora e incremento de data, precede-se
o acionamento do “Relógio” através de um de dois mecanismos: automático, através
de um “timer” real da máquina, que deverá incrementar o “Relógio” de “Incdata” +
“IncHora” a cada intervalo de tempo real definido por “PassoTimer” (em ms); ou
pelo método direto, chamando-se sucessivamente o método “Incrementa”, no
interior de um “laço” de programação, por exemplo, a fim de promover o mesmo
incremento.

A cada alteração de data ou hora, as rotinas associadas a tais


eventos (“OnMudaData” e “OnMudaHora”) são acionadas para que se possa
proceder às avaliações pertinentes do sistema para o novo momento indicado pelo
“Relógio”.

Observa-se ainda que o valor dos incrementos de data e hora


podem ser alterados durante a simulação, permitindo passos maiores, de forma a
acelerar o processo, em momentos que não se deseje grande precisão, como por
exemplo horários de baixíssimo consumo, refinando tal passo para momentos em
que se deseje precisão, como o horário de pico. Tal expediente, no entanto, ainda
que utilizável, deve ser acompanhado do correspondente ajuste específico quando da
análise das variáveis registradas.

V.2 Rotina Geradora de Distribuições.

As funções apresentadas na biblioteca “InterClasses.pas”, listagem


V.2, concorrem para a geração de dados aleatórios que se distribuam conforme uma
V-10

dada distribuição básica observada ou admitida.

Listagem V.2 –Biblioteca “InterClasses.pas”.


{*************************************************************************}
{ }
{ Biblioteca Delphi }
{ "unit" de implementação de }
{ Objetos de intervalos de classes }
{ para geração de distribuições discretas. }
{ }
{*************************************************************************}
unit InterClasses;

interface

uses Classes, SysUtils, Dialogs;

// definição de tipos e constantes


Type

// uma classe da distribuição discreta


TClaDistDisc = record
Prob: extended; // probabilidade de ocorrência
ValRet: integer; // valor que caracteriza essa classe
end;

TPTClaDistDisc = ^TClaDistDisc;

// lista com as distribuições de classe


TListaDistClasses = class(TObject)
private
RX:TPTClaDistDisc;
public
ListaClasses: TList;
NumClasses: Integer;
constructor Create;
destructor Destroy; override;
procedure InsereClasse (R:TClaDistDisc);
procedure Limpar;
procedure LeArquivoClasses(Arq:string);
procedure GravaArquivoClasses(Arq:string);
procedure CopiaDeListaDistClasses(L:TListaDistClasses);
end;

// intervalos lineares para cada classe, na faixa de [0-1], classes com


// maior probabilidade de ocorrência têm intervalos maiores, de forma
// que um número [0-1] gerado uniformemente, tenha maior probabilidade
// de retornar as classes de intervalos maiores.
TRegInterv = record
LimInf: Extended; // limite inferior da classe
LimSup: Extended; // limite superior da classe
ValRet: Integer; // valor que caracteriza a classe
end;

TPTRegInterv = ^TRegInterv;

// lista com os intervalos lineares e valores de retorno


TListaIntervalos = class(TObject)
private
X: TPTClaDistDisc;
Z: TPTRegInterv;
public
V-11

Listagem V.2 –Biblioteca “InterClasses.pas” (cont.).


ListaIntervalos: TList; // lista de intervalos
NumIntervalos: Integer; // número de intervalos

constructor Create;
destructor Destroy; override;

procedure InsereIntervalo (R:TRegInterv);


procedure Limpar;
procedure GeraIntervalos(T:TListaDistClasses);
procedure GravaArqIntervalos(Arq:string);

// retorna a referência da classe para um


// dado Rx [0-1].
function GetClasse(Rx:extended):Integer;
end;

implementation

uses MyDelphiUnit01;

// implementação dos protótipo declarados acima

const Msg1: string = 'Não foi possível ler o arquivo!';


Msg2: string = 'Formato de dados incorreto!';
Msg3: string = 'Lista de classes vazia!';
Msg4: string = 'Lista de intervalos vazia!';

//============================= TListaDistClasses =========================


//-------------------------------------------------------------------------
constructor TListaDistClasses.Create;

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

Listagem V.2 –Biblioteca “InterClasses.pas” (cont.).


Dispose(RX);
Delete(0);
End;
End;
ListaClasses.Clear;
End;
//-------------------------------------------------------------------------
procedure TListaDistClasses.LeArquivoClasses(Arq:string);

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

Listagem V.2 –Biblioteca “InterClasses.pas” (cont.).


End;
CloseFile(F);
End;
//-------------------------------------------------------------------------
procedure TListaDistClasses.CopiaDeListaDistClasses(L:TListaDistClasses);

var N,I: Cardinal;


RY: TPtClaDistDisc;
R:TClaDistDisc;

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

//=========================== TListaIntervalos ============================


constructor TListaIntervalos.Create;

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

Listagem V.2 –Biblioteca “InterClasses.pas” (cont.).


End;
End;

ListaIntervalos.Clear;
End;
//-------------------------------------------------------------------------
procedure TListaIntervalos.GeraIntervalos(T:TListaDistClasses);

var I,N: Integer;


R: TRegInterv;

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;

var I,N: Integer;


X: extended;
D1,D2: extended;
Achei: Boolean;

Begin;
N:=NumIntervalos;
V-15

Listagem V.2 –Biblioteca “InterClasses.pas” (cont.).


If N>0 Then
Begin;
X:=Round(Rx*1E7)*1E-7;
I:=-1;
Repeat
Inc(I);
Z:=ListaIntervalos.Items[I];
D1:=Abs(X-Z^.LimInf);
D2:=Abs(X-Z^.LimSup);
Achei:=((X>Z^.LimInf) or (D1<=1E-6)) and
((X<Z^.LimSup) or (D2<=1E-6));
Until Achei;
Result:=Z^.ValRet;
end
Else
raise exception.create(Msg4);
End;
//-------------------------------------------------------------------------
end.

As funções principais dessa biblioteca são: a função


“LeArquivosdeClasses” do objeto “TListaDistClasses” que faz com que este passe a
conter uma lista de valores de retorno e probabilidades de ocorrência, lida de um
arquivo texto com formato apropriado; a função “GeraIntervalos” do objeto
“TListaIntervalos” que gera a Tabela 8.1 para uma dada distribuição de classes.

As funções acima, de fato, preparam o ambiente para a operação da


função “GetClasse”, do objeto “TListaIntervalos” que, utilizada com um número
aleatório distribuído uniformemente no intervalo (0,1], retorna um valor
representativo de classe, “replicando” a distribuição de freqüências ou
probabilidades obtidas inicialmente do arquivo texto lido por
“LeArquivosdeClasses” do objeto “TListaDistClasses”.
V-16

V.3. Componente para Registro de Valores.

Para que se proceda o registro dos valores das grandezas avaliadas,


segundo seqüências de tempo, determinadas pelo “Relógio”, foi criado o
componente “TRegVal”, cujo código pode ser visto na listagem V.3.

Listagem V.3 – Código para “RegVal.pas”.


{**************************************************************************}
{ }
{ Componente Delphi }
{ "unit" de implementação do }
{ componente Registro de Valores }
{ para registro e estatística bácica de }
{ parâmetros coletados durante a simulação }
{ }
{**************************************************************************}
unit RegVal;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
MyDelphiUnit02, MyDelphiUnit04, ComObj;

// definição de tipos e constantes


type
ERegValError = class (Exception);

TTipoUniv = (UnivAmostral,UnivPopulacional); // tipos de universo amostral


// para o cálculo da variança

TRegPonto = record // ponto de dado a ser registrado


Data: TData;
Hora: THora;
Valor: Extended;
end;

TPTRegPonto = ^TRegPonto;

TRegVal = class(TComponent)
private
{ Private declarations }
RX: TPTRegPonto;

FLista: TList; // lista de ponteiros para os pontos


FTipoUniv: TTipoUniv; // de dados
FLegenda: string;

protected
{ Protected declarations }
function CalcMedia: Extended;
function CalcVar: extended;
function CalcMax: extended;
V-17

Listagem V.3 – Código para “RegVal.pas” (cont.).


function CalcMin: extended;
function CalcNumElem: integer;
function CalcAmplit: extended;
function CalcDesvioPadrao: extended;
function CalcCoefVar: extended;
function CalcPtoMedio: extended;
function CalcSoma: extended;
function CalcDesvMed: extended;
function CalcMedGeom: extended;
function CalcMedHarm: extended;

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;

constructor create (AOwner:TComponent); override;


destructor destroy; override;

// insere um ponto de dados na lista


procedure InserePonto(D:TData; H:THora; V:Extended);
// limpa a lista
procedure Limpar;
// grava lista em arquivo texto com campos separados por "Sep"
procedure GravaArquivo(Arq:String; Sep:Char);
// exporta para planilha MS-Excel, criando um gráfico
procedure ExportaExcel(Arq:string);

end;

procedure Register; // registra comopente no ambiente Delphi.

implementation

uses MyDelphiUnit01, MyDelphiUnit03, xlConst;

const Msg1: String = 'Não foi possível gravar o arquivo!';


Msg2: string = 'Resultado inválido.';
Msg3: string = 'Lista Vazia!';
Msg4: string = 'Existe elemento nulo!';

//-------------------------------------------------------------------------
procedure Register;
begin
RegisterComponents('Samples', [TRegVal]);
V-18

Listagem V.3 – Código para “RegVal.pas” (cont.).


end;
//-------------------------------------------------------------------------
constructor TRegVal.create (AOwner: TComponent);
begin;
inherited create(AOwner);
FLista:=TList.Create;
FTipoUniv:=UnivAmostral;
FLegenda:='Lista de ';
end;
//-------------------------------------------------------------------------
destructor TRegVal.destroy;
Begin;
FLista.Free;
inherited destroy;
End;
//-------------------------------------------------------------------------
procedure TRegVal.InserePonto(D:TData; H:THora; V:Extended);

Begin;
New(RX);
RX^.Data:=D;
RX^.Hora:=H;
RX^.Valor:=V;
FLista.Add(RX);
End;
//-------------------------------------------------------------------------
function TRegVal.calcmedia: Extended;

var Cont: Integer;

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

var Txt: TStrings;


RX: TPTRegPOnto;
I: Integer;
S: String;

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

Listagem V.3 – Código para “RegVal.pas” (cont.).


raise ERegValError.CreateFmt(Msg1,[]);
end;
finally
Txt.Destroy;
End;
End;
//-------------------------------------------------------------------------
function TRegVal.CalcVar: extended;

var N,I: Integer;


Media: Extended;
RX: TPTRegPonto;

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

Listagem V.3 – Código para “RegVal.pas” (cont.).


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.CalcNumElem: integer;

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;

var RX: TPTRegPonto;


V-21

Listagem V.3 – Código para “RegVal.pas” (cont.).


I: Integer;

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;

var N,I: Integer;


Media: Extended;
RX: TPTRegPonto;

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;

var N,I: Integer;


RX: TPTRegPonto;

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;

var N,I: Integer;


RX: TPTRegPonto;

Begin;
result:=0;
N:=CalcNumElem;
If N<>0 Then
Begin;
For I:=1 To FLista.Count-1 Do
V-22

Listagem V.3 – Código para “RegVal.pas” (cont.).


Begin;
RX:=FLista.Items[I];
If RX^.Valor <>0 Then Result:=Result+1/RX^.Valor
Else
Begin;
raise ERegValError.Create(Msg4);
exit;
End;
End;
End
Else
raise ERegValError.Create(Msg2+#13+Msg3);
End;
//-------------------------------------------------------------------------
procedure TRegVal.Limpar;

begin;
FLista.Clear;
End;
//-------------------------------------------------------------------------
procedure TRegVal.ExportaExcel(Arq:string);

var Fnome, NPlan: String;


I,N: Integer;
Ap,Plan,Gr: Variant;
R: TPTRegPonto;

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;

For I:=0 To N-1 Do


begin;
R:=FLista.Items[I];
If R<>nil Then
Begin;
Plan.Cells[I+1,1]:=I+1;
Plan.Cells[I+1,2]:=R^.Data.Textodata(2);
Plan.Cells[I+1,3]:=R^.Hora.TextoHora(1);
Plan.Cells[I+1,4]:=R^.Valor;
End;
End;

Plan.Range['B1:B'+IntToStr(N)].Select;
Ap.Selection.NumberFormat:='dd/mm/aaaa';
V-23

Listagem V.3 – Código para “RegVal.pas” (cont.).


Plan.Range['C1:C'+IntToStr(N)].Select;
Ap.Selection.NumberFormat:='h:mm:ss';
Plan.Range['D1:D'+IntToStr(N)].Select;
Ap.Selection.NumberFormat:='0,00000';

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.

Os métodos mais importantes desse componente são “InserePonto”


que permite o acréscimo de um ponto de dados na lista, “GravaArquivo” que grava
os registros em arquivos texto e “ExportaExcel” que cria um arquivo compatível
com a planilha eletrônica MS-Excel, contendo a listagem de valores armazenada, e
uma representação gráfica da mesma.
V-24

V.4. Demais Bibliotecas Utilizadas.

As listagens V.4 a V.7, por sua vez, apresentam a codificação de


bibliotecas básicas, (exceto “MyDelphiUnit03, apresentada na listagem III.7, na
seção III.2.) que vêm sendo desenvolvidas pelo autor a cerca de 15 anosV.2, e tiveram
diversas de suas funções utilizadas no presente trabalho.

Esta inserção, de forma similar a todas as listagens aqui


apresentadas, se faz necessária a bem da repetibilidade do trabalho apresentado,
assim como, para proporcionar todos os elementos de base necessários, caso se
deseje prosseguir com o mesmo em nível de programação, permitindo assim sua
utilização, sua crítica e aperfeiçoamento.

As bibliotecas ainda apresentam uma série de funções que não


foram diretamente utilizadas no presente trabalho mas podem ser utilizadas em
versões mais aperfeiçoadas do mesmo, como aquelas referentes a determinação de
feriados.

Listagem V.4 – Biblioteca “MyDelphiUnit00”.


{**************************************************************************}
{ }
{ Biblioteca Delphi }
{ "unit" de implementação de }
{ Definição de tipos básicos auxiliares }
{ para programação Delphi. }
{ }
{**************************************************************************}
unit MyDelphiUnit00;

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

Listagem V.4 – Biblioteca “MyDelphiUnit00” (cont.).


// Constantes e Tipos de Dados.
type TCjChar = set of char; // conjunto de caracteres
TStringVetor = array[0..2147483646] of char; // vetor de caracteres
TStringPointer = ^TStringVetor; //ponteiro para vetor de caracteres

const TCjLetras:TCjChar = ['a'..'z','A'..'Z','á','é','í','ó','ú','Á','É',


'Í','Ó','Ú','ã','õ','Ã','Õ','à','À','Â','Ê','Ô',
'â','ê','ô','ü','Ü','ç','Ç'];
//conjunto de letras do alfabeto português brasil

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.

Listagem V.5 – Biblioteca “MyDelphiUnit01”


{**************************************************************************}
{ }
{ Biblioteca Delphi }
{ "unit" de implementação de }
{ rotinas auxiliares para }
{ manipulação de "strings" do tipo AnsiString }
{ }
{**************************************************************************}
unit MyDelphiUnit01;

{$H+}

interface

uses MyDelphiUnit00;

// Protótipos de procedimentos e funções

// põe zeros à esquerda


procedure FillZero(var S:String);
// remove os espaços
procedure NoSpace (var S:String);
// remove todos os caracteres em "C"
procedure NoSet (var S:string; C:TCjChar);
// retorna somente os caracteres em "C"
procedure OnlySet (var S:string; C:TCjChar);
// substitui todas as ocorrências do caracter "C1" pelo caracter "C2"
procedure ChangeCar (var S:String; C1,C2:Char);
// introduz uma pausa de Tempo [em ms]
procedure Esperar(Tempo:cardinal);
// volta string com "N" caract. "C"
function Comp(Car:Char; N:Longint): String;
// volta com "N" ajustado p/ Nc casas, completa "0"
function AjustaInt(N:Integer; Nc:Integer): String;
// extrai o nome do arquivo dado um "caminho" completo
function ExtraiNome(S:String):String;
V-26

Listagem V.5 – Biblioteca “MyDelphiUnit01” (cont.).


// converte uma string para caixa alta
function UpStr(S:String):String;
//remove espaços à esquerda da string
function AlinhaEsq (S:String): String;
// retorna o nome do usuário ativo
function LeftStr(S:String; N:Longint):String;
//retorna os "N" últimos caracteres da string;
function RightStr(S:String; N:Longint):String;
//retorna o nome do usuário ativo no sistema
function NomeUsuario (Err: Boolean): String;
//retorna os "N" primeiros caracteres da string;
function NomeUsuarioAtual: String;
// retorna uma string de "N" espaços (#32)
function Spc(N: Longint): String;
// retorna a representação binária de "N"
function ByteToBin(N:Byte):String;
// remove espaços à direita da string
function AlinhaDir (S:String): String;

implementation

uses windows, sysutils, forms;

{Implementação dos protótipos acima definidos}

{--------------------------------------------------------------------------}
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);

var Ps: Pointer;


Pa: TStringPointer;
I: Longint;
S1: String;
V-27

Listagem V.5 – Biblioteca “MyDelphiUnit01” (cont.).


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]<>' ' Then {verifica se não é espaço}
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 NoSet (var S:string; C:TCjChar);

var Ps: Pointer;


Pa: TStringPointer;
I: Longint;
S1: 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);

var Ps: Pointer;


Pa: TStringPointer;
I: Longint;
S1: 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 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

Listagem V.5 – Biblioteca “MyDelphiUnit01” (cont.).


Begin;
Str(N,S);
If Length(S)>Nc Then AjustaInt:=S
Else AjustaInt:= Comp('0',(Nc-Length(S)))+S;
End;
{--------------------------------------------------------------------------}
function ExtraiNome(S:String):String;
{Retorna o nome e extensão (nome.ext) de um arquivo, dado completo}
{com "path") em "S". Retorna "vazio", se o valor dado em "S" for somente}
{um diretório.}

var Ps: Pointer;


Pa: TStringPointer;
I: Longint;
S1,Sr: String;

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 }

var Ps: Pointer;


Pa: TStringPointer;
I: Longint;
S1,Sr: String;
CarCxBaixo: set of Char;

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;

var Ps: Pointer;


Pa: TStringPointer;
I,L: Longint;
S1,Sr: String;

Begin;
S1:=S; // resguarda o valor de "S" em "S1"
Sr:=''; // Inicializa "Sr" (String Resultado)
V-29

Listagem V.5 – Biblioteca “MyDelphiUnit01” (cont.).


Ps:=PChar(S1); // passa o valor do ponteiro de "S"
Pa:=Ps; // para o ponteiro de Pa que é o vetor.
L:=Length(S1); // salva o comprimento da string
I:=0; // aponta para o promeiro caracter

If L>0 Then // se a string não for vazia


begin;
While (Pa^[I]=#32) Do Inc(I); // varre a string buscando o primeiro
// caracter diferente de espaço
Sr:=Copy(S1,I+1,L-I+1); // copia o resto da string a partir
// do primeiro carcater diferente
// de espaço. Observar que a origem
// do vetor decaracteres é "0" (zero)
// e a do comando Copy é "1" (um).
end
else
Sr:=S;

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"

var Ps: Pointer;


Pa: TStringPointer;
I: Longint;
S1,Sr: String;

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

Listagem V.5 – Biblioteca “MyDelphiUnit01” (cont.).


S:=Sr; // atribui o resultado;
End;
//--------------------------------------------------------------------------
function NomeUsuario (Err: Boolean): String;

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"

Type Buffer = record


case integer of //cria um tipo com um buffer
1: (a:array[1..256] of char); //e o primeiro caracter que
2: (b:Char); //vai ser o alvo do apontador
end;

var L: Buffer; //cria instancia do buffer


P: PChar; //cria um ponteiro para o 1o. caracter do buffer
X:Cardinal;//cria uma "palavra dupla" para indicar o tam. máx. do buffer
S1:String; //cria uma string para a saída
Erro: Boolean; //cria uma variável de erro

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"

var S:String; // armazena o resultado


I: Integer; // contador
V-31

Listagem V.5 – Biblioteca “MyDelphiUnit01” (cont.).


//................................
function Pot2(I:Byte):Byte;
// calcula 2^I em aritmética de inteiros

var K,P: Byte;

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

If I>0 Then // se a string não for vazia


begin;
While (S1[I]=#32) Do Dec(I); // varre a string da direita p/ a
// esquerda buscando o primeiro
// caracter diferente de espaço
Sr:=Copy(S1,1,I); // copia o a string até o
// primeiro carcater diferente
// de espaço.
end
else
Sr:=S;

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

Listagem V.6 – Biblioteca “MyDelphiUnit02”.


{**************************************************************************}
{ }
{ Biblioteca Delphi }
{ "unit" de implementação de }
{ Rotinas ligadas a tratamento de }
{ Marcas de tempo como datas. }
{**************************************************************************}
unit MyDelphiUnit02;

interface

// Constantes e Tipos de Dados.


Type TData = Object // define um tipo de dados para manipular datas

Dia: Word;
Mes: Word;
Ano: Word;

// retorna data como string


function TextoData(Tipo:Byte):string;
// testa validade da data
function ValeData:Boolean;
// retorna o dia da semana
function DiaDaSemana(var S:String; var Erro: Boolean):byte;
// calcula data + N dias
procedure NovaData(N:Longint);
// retorna data de hoje
procedure AtualData;
//atribui determinada data numérica ao objeto
procedure PoeData (D,M,A: Word; var Erro:Boolean);
// atribui data como texto ao objeto
procedure LeData(S:String; var Erro:Boolean);
// retorna o primeiro dia do mês
procedure PrimDiaMes;
// retorna o último dia do mês
procedure UltimDiaMes;
// retorna nova data com "N" meses a mais
procedure SomaMes(N: Integer);
// retorna data da páscoa no ano determinado
procedure Pascoa;
// retorna data do carnaval no ano determinado
procedure Carnaval;
// retorna data do feriado de C.Christi no ano determinado
procedure CChristi;
// retorna data da Sexta-Feira da Paixão no ano determinado
procedure SextaSanta;
end;

// Protótipos de procedimentos e funções

// calcula número de dias entre datas


function EntreDatas(D1,D2:TData):Longint;
// calcula a idade, em anos completos
function AnosdeIdade (DNasc,D:TData):Word;

{Funções de Comparação entre datas}


function Lt (D1,D2:TData):Boolean; { LT = True se D1 < D2 }
function Gt (D1,D2:TData):Boolean; { GT = True se D1 > D2 }
function Eq (D1,D2:TData):Boolean; { EQ = True se D1 = D2 }
function Le (D1,D2:TData):Boolean; { LE = True se D1 <= D2 }
function Ge (D1,D2:TData):Boolean; { GE = True se D1 >= D2 }
V-33

Listagem V.6 – Biblioteca “MyDelphiUnit02” (cont.).


implementation

uses MyDelphiUnit01, SysUtils, Dialogs;

{Implementação dos protótipos acima definidos}

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

var DD,MM,AA: string;

begin;

Str(Dia:2,DD); FillZero(DD); // dia em string de tam. 2 c/ 0 à esq.


Str(Mes:2,MM); FillZero(MM); // mês em string de tam. 2 c/ 0 à esq.
Str(Ano:4,AA); FillZero(AA); // ano em string de tam. 4 c/ 0 à esq.

Case Tipo of // testa o tipo solicitado


0: TextoData:=DD+'/'+MM+'/'+ Copy(AA,3,2); // se "0" ano c/ 2 dígitos
1: TextoData:=DD+'/'+MM+'/'+AA; // se "1" ano c/ 4 dígitos
2: TextoData:=MM+'/'+DD+'/'+AA; // se "2" formato americano
end;
end;
{--------------------------------------------------------------------------}
procedure TData.NovaData(N:Longint);
{Calcula uma nova data distanciada de "N" dias daquela assinalada }
{pelo objeto. Para N>0 calcula datas no futuro, para N<0 no passado.}

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

Listagem V.6 – Biblioteca “MyDelphiUnit02” (cont.).


Dias:=Trunc(Dias - Dx.Ano * 365.25); // calcula o saldo de dias no ano
I:=1;
Repeat // determina o mês verificando quantos
Dias:=Dias-DM[I]; // meses cabem nos dias que sobraram
Inc(I);
Until Dias < 0; // o último mês "estoura" o número de dias
Dx.Mes:=I-1; // o último mês que não estourou é o procurado
Dx.Dia:=Dias + DM[I-1]; // corrige o estouro do número de dias
If Dx.Dia = 0 Then // se o dia foi "0" é porque refere-se
Begin; // de fato ao último dia do mês anterior
If Dx.Mes = 1 Then // se o mês for janeiro
Begin; // o mês anterior é
Dx.Mes:=12; // Dezembro
Dec(Dx.Ano); // do Ano anterior
End
Else Dec(Dx.Mes); // se o mês não é Janeiro, acerta o mês
Dx.Dia:=DM[Dx.Mes]; // acerta o dia
End;
Self:=Dx; // Atribui a nova data ao objeto.
End;
{--------------------------------------------------------------------------}
procedure TData.AtualData;
{põe a data de hoje (segundo o relógio do sistema) no objeto.
}

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

Var vale: Boolean;


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; // atribui o número de dias dos mêses
DM[5]:=31; DM[11]:=30;
DM[6]:=30; DM[12]:=31;

//vale:=true; // parte do princípio que a data é válida


vale:=(Self.Ano<=9999); // testa o ano e a validade anterior
vale:=vale and (Self.Mes>=1) and (Self.Mes<=12); // testa o mês e a
// validade anterior
If (Self.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;

vale:=vale and (Self.Dia>=1) and (Self.Dia<=DM[Mes]);// testa o dia e a


// validade anterior
ValeData:=vale; // retorna o valor da função
end;
{--------------------------------------------------------------------------}
procedure TData.PoeData (D,M,A: Word; var Erro:Boolean);
V-35

Listagem V.6 – Biblioteca “MyDelphiUnit02” (cont.).


{Atribui uma data ao objeto c/ dia, mês a ano em formato Word, e testa sua }
{Validade, se a data for inválida mantém a anterior e retorna erro. }

var DOld: TData;

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 }

const Alg = ['0'..'9'];

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;

If Not Erro Then


Begin;
If (Length(DD[3])<4) Then
If DN[3]>54 Then DN[3]:=1900+DN[3] Else DN[3]:=2000+DN[3];
PoeData(DN[1],DN[2],DN[3],Erro); // Executa a chamada a
End; // PoeData que verifica a
End; // validade e atribui
{--------------------------------------------------------------------------}
function TData.DiaDaSemana(var S:String; var Erro: Boolean):byte;
// retorna dia da semana: S - dia da semana em formato texto;
// Err - Data inválida;
V-36

Listagem V.6 – Biblioteca “MyDelphiUnit02” (cont.).


// DiaDaSemana - 1-Domingo...7-Sábado;

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

Else S:='Ocorreu um Erro desconhecido.';


End

End;
End;
//--------------------------------------------------------------------------
function Lt (D1,D2:TData):Boolean;

var Menor,Igual: 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;

If Igual Then Menor:=D1.Dia < D2.Dia;

Lt:=Menor;
End;
{--------------------------------------------------------------------------}
function Gt (D1,D2:TData):Boolean;
V-37

Listagem V.6 – Biblioteca “MyDelphiUnit02” (cont.).

var Maior,Igual: Boolean;

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;

If Igual Then Maior:=D1.Dia > D2.Dia;

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;

var D: Array[1..2] of TData;


Dt: Array [1..2] of Longint;
K,I: Integer;
Biss: Boolean;
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;
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

Listagem V.6 – Biblioteca “MyDelphiUnit02” (cont.).


Biss:=True;
If ((D[I].Ano mod 100)=0) and ((D[I].Ano mod 400)<>0) Then
begin;
DM[2]:=28;
Biss:=False;
End;
// mas se é a passagem do século, Fevereiro só tem 29 dias
// a cada 4 séculos.
End
Else Dm[2]:=28;

For K:=1 To D[I].Mes-1 Do Dt[I]:=Dt[I]+Dm[K];


Dt[I]:=Dt[I]+D[I].Dia;
If Biss Then Dec(Dt[I]);
end;
EntreDatas:=Dt[2]-Dt[1];
end;
{--------------------------------------------------------------------------}
procedure TData.PrimDiaMes;

Begin;
Self.Dia:=01;
End;
{--------------------------------------------------------------------------}
procedure TData.UltimDiaMes;

Var DD,MM,AA: 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;
Dm[5]:=31; Dm[11]:=30;
Dm[6]:=30; Dm[12]:=31;

MM:=Self.Mes;
AA:=Self.Ano;

If (AA mod 4)=0 Then


Begin;
DM[2]:=29; // se o ano é bissexto corrige fevereiro
If ((AA mod 100)=0) and ((AA 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];
Self.Dia:=DD;

End;
{--------------------------------------------------------------------------}
procedure TData.SomaMes(N: Integer);

Var DD,MM,MM1,AA: Word;


Dm: Array[1..12] of word;

Begin;

Dm[1]:=31; Dm[7]:=31;
Dm[2]:=28; Dm[8]:=31;
V-39

Listagem V.6 – Biblioteca “MyDelphiUnit02” (cont.).


Dm[3]:=31; Dm[9]:=30;
Dm[4]:=30; Dm[10]:=31;
Dm[5]:=31; Dm[11]:=30;
Dm[6]:=30; Dm[12]:=31;

DD:=Self.Dia;
MM:=Self.Mes;
AA:=Self.Ano;

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;

MM1:=MM;
MM:=MM+N;

AA:=AA + (MM div 12);


MM:=(MM mod 12);

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

var A,B,C,D,E,F,G,H,I,J,K,L,M,N,P,Q,R,S: Integer;

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

Listagem V.6 – Biblioteca “MyDelphiUnit02” (cont.).


'15/10/1582!'+#13+'Portanto, os resultados '+
'retornados aqui não fazem sentido!');
Exit;
End;

A:=Self.Ano div 100;


B:=Self.Ano mod 19;
C:=(A-17) div 25;
D:=A div 4;
E:=(A-C) div 3;
F:=(A-D-E+19*B+15) mod 30;
G:=F div 28;
H:=29 div (F+1);
I:=(21-B) div 11;
J:=G*H*I;
K:=F-(G*(1-J));
L:=Self.Ano div 4;
M:=(Self.Ano+L+K+2-A+D) mod 7;
N:=K-M;
P:=(N+40) div 44;
Q:=3+P;
R:=Q div 4;
S:=N+28-31*R;

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

var Id: Word;


DI,DF,D1: TData;
V-41

Listagem V.6 – Biblioteca “MyDelphiUnit02” (cont.).


Begin;
DI:=DNasc;
DF:=D;
If Gt(DI,DF) Then
Begin;
D1:=DI;
DI:=DF;
DF:=D1;
End;
Id:=DF.Ano - DI.Ano;
If DF.Mes < DI.Mes Then Dec(Id)
Else
If (DF.Mes=DI.Mes) and (DF.Dia<=DI.Dia) Then Dec(Id);
If Eq(Df,Di) Then Id:=0;
AnosdeIdade:=Id;
End;

//--------------------------------------------------------------------------
end.

Listagem V.7 – Biblioteca “MyDelphiUnit04”


{**************************************************************************}
{ }
{ Biblioteca Delphi }
{ "unit" de implementação de }
{ Rotinas ligadas a tratamento de }
{ Marcas de tempo como horas. }
{**************************************************************************}
unit MyDelphiUnit04;

interface

uses MyDelphiUnit00;

// Constantes e Tipos de Dados


Type THora = Object // define um tipo de dados para manipular horas

Hora: Word; // hora


Minuto: Word; // minuto
Segundo: Word; // segundo
MiliSegundo: Word; // milissegundo

//retorna hora como string


function TextoHora(Tipo:Byte): String;
// testa validade da hora
function ValeHora: Boolean;
//converte horas em segundos
function HoraParaSegundo: Extended;
// converte seg. em horas
procedure SegundoParaHora(S: Extended);
// soma H:M:S à hora.
procedure NovaHora(H,M:Integer; S:Extended);
//retorna hora do sistema
procedure AtualHora;
// atribui hora com argumentos numéricos
procedure PoeHora(H,M:Word; S:Extended; var Erro:Boolean);
// atribui hora a partir de uma string
procedure LeHora(S:String; var Erro:Boolean); // atribui hora
End;

// protótipos de funções e procedimentos


V-42

Listagem V.7 – Biblioteca “MyDelphiUnit04” (cont.).


// retorna o tempo, em segundos, entre 2 horários
function EntreHoras(H1,H2:THora): Extended;

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

uses sysutils, MyDelphiUnit01;

{--------------------------------------------------------------------------}
Procedure THora.AtualHora;

Var H,M,S,MS: Word;

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;

// Tipo 0 --> HH:MM:SS,MS


// Tipo 1 --> HH:MM:SS
// Tipo 2 --> HH:MM

Var SH,SM,SS,SMS,SR: 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

Listagem V.7 – Biblioteca “MyDelphiUnit04” (cont.).


TextoHora:=SR;

End;
{--------------------------------------------------------------------------}
function THora.ValeHora: Boolean;

Var Erro: 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);

Var Ha: THora;

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

Const Alg = ['0'..'9'];

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

Listagem V.7 – Biblioteca “MyDelphiUnit04” (cont.).


I:=0;
If (HS[1]<>'') Then For K:=1 To 3 Do If HS[K]='' Then HS[K]:='0';
For K:=1 To 2 Do If Not Erro Then
Begin;
Val(HS[K],HN[K],I);
Erro:=Erro or (I<>0);
End;

If Not Erro Then


Begin;
ChangeCar(HS[3],',','.');
Val(HS[3],Seg,I);
Erro:=Erro or (I<>0);
End;

If not Erro Then PoeHora(HN[1],HN[2],Seg,Erro);


End;
{--------------------------------------------------------------------------}
procedure THora.NovaHora(H,M:Integer; S:Extended);

Var HR,MR,SR: Extended;


Delta: Extended;
Erro: Boolean;

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

If SR<0 Then // acerta segundos negativos


Begin;
Delta:=(1-Trunc(SR/60));
SR:=SR+60*Delta;
MR:=MR-Delta;
End;

If MR<0 Then // acerta minutos negativos


Begin;
Delta:=(1-Trunc(MR/60));
MR:=MR+60*Delta;
HR:=HR-Delta;
End;

If HR<0 Then // acerta horas negativas


Begin;
Delta:=(1-Trunc(HR/24));
HR:=HR+24*Delta;
End;

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

Listagem V.7 – Biblioteca “MyDelphiUnit04” (cont.).


HoraParaSegundo:= 3600*Self.Hora+60*Self.Minuto+Segundo+Milisegundo/1000;
End;

{--------------------------------------------------------------------------}
procedure THora.SegundoParaHora(S: Extended);

Var H,M,Sg,MS,X: Int64;


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

Dentre as diversas distribuições de probabilidades apresentadas na


bibliografia, a distribuição Gama de probabilidades apresenta uma versatilidade
adequada para a representação dos tempos de permanência em imóveis, bem como
para a representação do tempo de reocupação dos mesmos.

Segundo MOOD et alli (1974), uma variável aleatória “X” segue


distribuição Gama, se sua densidade de probabilidades é dada por:

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

Temos ainda, a média e variança da distribuição, dadas


respectivamente pelas equações VI.2 e VI.3.

r
x= (VI.2)
λ

r
σ2 = (VI.3)
λ2
VI-2

Ou ainda, quando conhecidos os valores de média e variança, pela


solução simultânea das equações VI.2 e VI.3, pode-se definir a distribuição, com o
auxílio das equações VI.4 e VI.5.

x
λ= (VI.4)
σ2

x2
r= (VI.5)
σ2

Γ•)
VI.1. Função Gama (Γ

A função Gama, de um determinado argumento, é definida como:


Γ(t ) = ∫ x t −1 ⋅ e − x dx para t>0 (VI.6)
0

Essa função pode então, ser escrita como:


Γ(t + 1) = ∫ x t ⋅ e − x dx
0

procedendo-se sua integração por partes:

∞ t
x
Γ(t + 1) = t ∫ ⋅ e − x dx
0 t

dado que ∫ u ⋅ dv = u ⋅ v − ∫ v ⋅ du e fazendo,


VI-3

xt
u= → du = x t −1dx
t
dv = e − x dx → v = −e − x

compõe-se a integração por partes


 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

observa-se então que, pela própria definição de Γ(t),

Γ(t + 1) = t ⋅ Γ(t )

por analogia

Γ(t ) = (t − 1) ⋅ Γ(t − 1)

portanto

Γ(t + 1) = t ⋅ (t − 1) ⋅ Γ(t − 1)

Pode-se ainda, de maneira trivial, demonstrar que Γ(1) = 1 , de

forma que, para valores inteiros de “t”, pode-se escrever:

Γ(t ) = (t − 1) ! (VI.7)
VI-4

A equação VI.7. aplica-se somente quanto o argumento “t”


pertence ao conjunto dos números inteiros maiores que zero (conjunto dos números
naturais), que é um caso específico, comum e importante da função Gama. No
entanto, a função está definida para qualquer argumento pertencente ao domínio dos
números reais maiores que zero.

Para a avaliação da função Gama de argumentos não inteiros,


foram desenvolvidas várias técnicas, geralmente com expansões em séries
assintóticas ou polinomiais.

Para o presente trabalho, optou-se pela utilização de uma biblioteca


específica, disponibilizada por NIELSEN (1999).

Na listagem VI.1. encontra-se a implementação da função Gama,


da distribuição Gama de probabilidades e do procedimento para o cálculo dos
parâmetros dessa distribuição.

Ainda estão apresentadas, na listagem VI.1, diversas funções


estaísticas mais comuns.

Listagem VI.1 – Rotinas estatísticas: “EstatFunc.pas”.


{*************************************************************************}
{ }
{ Biblioteca Delphi }
{ "unit" de implementação de }
{ Rotinas básicas para geração de }
{ distribuições. }
{ }
{*************************************************************************}
unit EstatFunc;

interface

// tipos de dados

Type
VI-5

Listagem VI.1 – Rotinas estatísticas: “EstatFunc.pas” (cont).


TCaractDist = record
Xm: extended;
Desv: extended;
Peso: extended;
end;

// Protótipos de procedimentos e funções

// avalia a função Gama para x.


Function Gama(x: Extended): Extended;

// retorna a probabilidade de uma variável aleatória "x" segundo uma


// distribuição gama de probabilidades, com parâmetros "r" e "lb"
// conhecidos.
Function ProbGama(x,r,lb: Extended):Extended;

// calcula os parâmetros da distribuição gama, dados média e desvio.


Procedure ParamProbGama(med,desv: Extended; var r,lb:Extended);

// retorna a probabilidade de uma variável aleatória "x" segundo uma


// distribuição normal de probabilidades, dados média e desvio padrão
function ProbNormal(x,m,s: extended): extended;

// retorna a área de uma curva normal, acima de "x", dados média e


// desvio padrão. Corresponde à probabilidade de um dado valor
// se encontrar acima de "x".
function UpIntNormal(x,m,s: extended): extended;

// retorna a área de uma curva normal, abaixo de "x", dados média e


// desvio padrão. Corresponde à probabilidade de um dado valor
// se encontrar abaixo de "x".
function DnIntNormal(x,m,s: extended): extended;

// retorna a área de uma curva normal, contida no intervalo [m-a,m+a],


// dados média e desvio padrão. Corresponde à probabilidade de um dado
// valor estar em um intervalo de amplitude "2a", centrado na média
function CenIntNormal(a,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"
function LimCentralNormal(abr,m,s: extended): extended;

// retorna a probabilidade de uma variável aleatória "x" segundo uma


// distribuição multi modal, tomando cada moda como uma distribuição normal
// de probabilidades, dados média, desvio padrão, e seu peso na distribuição
// global.
function NormalMultiModal(X: extended; const A: array of TCaractDist;
esc:extended; Int: extended): extended;

implementation

uses SysUtils, MyDelphiUnit03;

{Implementação dos protótipos acima definidos}

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

Listagem VI.1 – Rotinas estatísticas: “EstatFunc.pas” (cont).


Stirlings series applied for x>6 otherwise polynomial expansion.
Then the relative error seems to be < 3e-7.
Even for x=15 the relative error seems to be ~ 2e-7. }

//.........................................................................

FUNCTION GammaStirling(x: Extended) :extended;


{ 21-8-1997,
Stirlings series, only to be applied for large x
Abramowitz and Stegun, p. 257 }
VAR dum1, dum2 : Extended;

BEGIN { FUNCTION GammaStirling }


Dum2:=Sqr(x);
Dum1:=1 + 1/12/x + 1/288/dum2 - 139/51840/x/dum2 - 571/2488320/Sqr(Dum2);
Dum1:=Dum1*Exp( -x+(x-1/2)*ln(x) )*Sqrt(2*pi);
GammaStirling:= Dum1;
END; { FUNCTION GammaStirling }

//.........................................................................

FUNCTION Gamma12(x: Extended) : Extended;


{ 21-8-1997,
Polynomial approximation, 6.1.36, Abramowitz and Stegun, p. 257
error < 3e-7. }
CONST b1= -0.577191652;
b2= 0.988205891;
b3= -0.897056937;
b4= 0.918206857;
b5= -0.756704078;
b6= 0.482199394;
b7= -0.193527818;
b8= 0.035868343;
VAR dum, dum1, dum2, dum4 : Extended;
BEGIN { FUNCTION Gamma12 }
dum1:= x-1;
dum2:= Sqr(dum1);
dum4:= Sqr(dum2);
dum:= 1+ b1*dum1 + b2*dum2 + b3*dum1*dum2 + b4*dum4 + b5*dum4*dum1;
dum:= dum + b6*dum4*dum2 + b7*dum4*dum2*dum1 + b8*Sqr(dum4);
Gamma12:= dum;
END; { FUNCTION Gamma12 }
//.........................................................................

BEGIN { FUNCTION Gamma }


If (x > 1754) or (x<=0) Then
Begin
raise EMathError.CreateFmt('Argumento da função Gama fora de faixa!'
,[]);
exit;
End;
If x >= 6 Then Result:= GammaStirling(x)
Else If x>2 Then Result:= (x-1)*Gama(x-1)
Else If x<1 Then Result:= Gama(x+1)/x
Else Result:= Gamma12(x);
END; { FUNCTION Gamma }
//-------------------------------------------------------------------------
Function ProbGama(x,r,lb: Extended):Extended;
// retorna a probabilidade de uma variável aleatória segundo uma
//distribuição gama de probabilidades, onde:
// x - variável aleatória no domínio de 0 a n;
// r - parâmetro "r" da distribuição;
// lb - parâmetro "lambda" da distribuição;
VI-7

Listagem VI.1 – Rotinas estatísticas: “EstatFunc.pas” (cont).


Begin;
If (x=0) and (r<1) then Result:=0 else
Result:=(lb/Gama(r))*Elev(lb*x,r-1)*Exp(-lb*x);
End;
//-------------------------------------------------------------------------
Procedure ParamProbGama(med,desv: Extended; var r,lb:Extended);
//retorna os parâmetros que caracterizam a distribuição, onde:
// med - média da distribuição;
// desv - desvio padrão da distribuição;
// r - parâmetro "r" da distribuição;
// lb - parâmetro "lambda" da distribuição;

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

var BigNum: extended;


Dx, Soma, Xr,Yant,Ypost: extended;
N: cardinal;

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

var LitNum: extended;


Dx, Soma, Xr,Yant,Ypost: extended;
N: cardinal;

begin;
LitNum:=m-15*s;
N:=500;
Dx:=(x-LitNum)/N;
VI-8

Listagem VI.1 – Rotinas estatísticas: “EstatFunc.pas” (cont).


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<=LitNum;
result:=Soma;
end;
//--------------------------------------------------------------------------
function CenIntNormal(a,m,s: extended): extended;
// retorna a área da curva entre "m-a" e "m+a"
// a - amplitude simétrica do intervalo avaliado
// m - média
// s - desvio padrão

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

var Yant,YPost,Y,A,Yold: extended;


Err: extended;

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

var S,PesoTot: Extended;


I: Integer;

Begin;
S:=0;
PesoTot:=0;
VI-9

Listagem VI.1 – Rotinas estatísticas: “EstatFunc.pas” (cont).


For I:=0 To High(A) Do
Begin;
S:=S+A[I].Peso*Int*ProbNormal(X/esc,A[I].XM/esc,A[I].desv/esc);
PesoTot:=PesoTot+A[I].Peso;
End;
Result:=S/PesoTot;
End;
//--------------------------------------------------------------------------
end.

A listagem VI.1. preserva, os comentários originais do código da


função Gama, como consta em Nielsen (1999); no entanto, foram alterados alguns
tipos de dados, o que elevou a precisão e os limites originais do código.
VII-1

APÊNDICE VII

Nesse Apêndice apresenta-se a implementação computacional das


rotinas e objetos utilizados para o exemplo de dinâmica populacional apresentado no
Capítulo 9, assim como seu exemplo de aplicação apresentado no Anexo D.

VII.1 Objetos de Dados e Rotinas Auxiliares – Exemplo do Anexo D.

A implementação dos objetos de dados e rotinas auxiliares


apresentam-se em dois módulos básicos denominados “TiposPop” e “DistrPop”, que
têm seu código apresentado nas listagens VII.1 e VII.2 respectivamenteVII.1.

As principais descrições pertinentes aos detalhes de implementação


desses códigos encontram-se em forma de comentários inseridos no mesmo.

Listagem VII.1 – Código fonte de “TiposPop”.


{*************************************************************************}
{ }
{ Biblioteca Delphi }
{ "unit" de implementação de }
{ Objetos representativos de }
{ elementos da população }
{ para uma edificação. }
{ }
{*************************************************************************}
unit TiposPop;

interface

uses MyDelphiUnit00, MyDelphiUnit01, MyDelphiUnit02, MyDelphiUnit03,


MyDelphiUnit04, classes, DistrPop, sysutils;
VII-2

Listagem VII.1 – Código fonte de “TiposPop” (cont.).


{Descrição do objetos de dados}

Type

// representação genérica de uma pessoa


TPessoa = class(TObject)

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;

constructor Create (Ident: Cardinal); virtual;


destructor Destroy; override;
end;

// Representação de pessoa do sexo masculino

THomem = class(TPessoa)

private
FSexo: Byte; // 1-masc
public
Property Sexo: Byte read FSexo;

constructor Create(Ident:Cardinal); override;


destructor Destroy; override;
end;

// Representação de pessoa do sexo feminino

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;

// Representação de um grupo de pessoas

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

Listagem VII.1 – Código fonte de “TiposPop” (cont.).


FNumPess: Cardinal; // número de membros

R: ^TPessoa; // variável auxiliar que não pode ser destruída


public
property NumPess: Cardinal read FNumPess; // número de pessoas
property Membros: TList read FMembros; // lista de pessoas
property Ident: Cardinal read FId; // identificação

constructor Create (Ident: Cardinal); virtual;


destructor Destroy; override;

procedure AdicionaPessoa (P:TPessoa);


function RemovePessoa (Ident: Cardinal): Boolean;
end;

// Representa uma economia, geralmente uma unidade habitacional

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;

constructor Create (Ident: Cardinal); virtual;


destructor Destroy; override;

procedure Limpar;
procedure EntraFamilia(F:TFamilia; D:Tdata; VJ:Byte);
procedure SaiFamilia;
end;

// Representação da edificação como um todo

TPredio = class (TObject)

private
FEconomias: TList; // lista das economias que compõem o prédio
FNumEcon: Cardinal; // número de economias

R: ^TEconomia; // variável auxiliar que não deve ser destruída


public
property Economias: TList read FEconomias;
property NumEcon: Cardinal read FNumEcon;

constructor create; virtual;


destructor destroy; override;

// limpa todas as economias, famílias e pessoas


procedure Limpar;
VII-4

Listagem VII.1 – Código fonte de “TiposPop” (cont.).


// insere economia
procedure InsereEconomia (E:TEconomia);
// gera uma população inicial
procedure PopularInicial(Di:Tdata;NEcon:Cardinal;TxEcDes:Extended);
// gera lista detalhada de economias, famílias e pessoas
procedure ListaDetalhes(ArqSai,Titulo:String);
// processa dinâmica de entrada e saída de famílias no prédio
procedure ProcessaEntradaSaida(DHoje:Tdata);
// prcessa dinâmica de nascimentos e mortes no prédio
procedure ProcessaNasceMorre(DHoje:Tdata);
end;

{implementação dos métodos dos objetos acima descritos}

implementation

//========================== TPessoa =======================================


constructor TPessoa.Create (Ident:Cardinal);

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

Listagem VII.1 – Código fonte de “TiposPop” (cont.).


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

Listagem VII.1 – Código fonte de “TiposPop” (cont.).


procedure TEconomia.Limpar;

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

Listagem VII.1 – Código fonte de “TiposPop” (cont.).


For I:=0 To FEconomias.Count-1 Do
begin;
R:=FEconomias[I];
Dispose(R);
End;
FEconomias.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;
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

Listagem VII.1 – Código fonte de “TiposPop” (cont.).


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

var I,J: Cardinal;


PE: ^TEconomia;
PP: ^TPessoa;
S,S1,S2,S3,S4: String;
F: textfile;

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

Listagem VII.1 – Código fonte de “TiposPop” (cont.).


IntToStr(PE^.Familia.NumPess));

For J:=1 To PE^.Familia.NumPess Do


Begin;
PP:=PE^.Familia.Membros[J-1];
Str(PP^.Id:6,S);
Fillzero(S);
S:='Identificação: '+S;
S1:='Data de Nascimento: '+PP^.DataNasc.TextoData(1);
S2:='Data de óbito: '+PP^.DataObito.Textodata(1);

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

Listagem VII.1 – Código fonte de “TiposPop” (cont.).


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

Listagem VII.1 – Código fonte de “TiposPop” (cont.).


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.FGravida:=False;
// 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;
PP^:=Mul;
// busca um "Id" de pessoa livre na familia
// para cada um dos 7 possíveis "Ids"
For W:=(10000*I+100*1+1) To (10000*I+100*1+7) Do
Begin;
K:=1; // verifica se já está alocado
Repeat
PP1:=PE^.Familia.Membros[K-1];
If PP1^.Id=W then break; // se já está
// alocado parte
// para outro
Inc(K);
Until K>PE^.FFamilia.NumPess;
If K>PE^.FFamilia.NumPess Then
break; // se não encontrou alocado é
// porque achou um "Id" livre
// não precisa buscar mais.
End;
Pes:=TPessoa.Create(W);
Pes.DataNasc:=DetermDataNasc(DHoje);

// a probabilidade de sexo do recém nascido


// é de 50-50%.
case Dado(2) of
VII-12

Listagem VII.1 – Código fonte de “TiposPop” (cont.).


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;
//--------------------------------------------------------------------------
end.

Listagem VII.2 – Código fonte de “DistrPop”.


{*************************************************************************}
{ }
{ Biblioteca Delphi }
{ "unit" de implementação de }
{ Rotinas básicas para geração de }
{ distribuições populacionais }
{ para uma edificação. }
{ }
{*************************************************************************}
unit DistrPop;

interface

uses MyDelphiUnit00, MyDelphiUnit01, MyDelphiUnit02, MyDelphiUnit03,


MyDelphiUnit04, InterClasses, sysutils, Dialogs, EstatFunc;

// constantes e protótipos de funções

const
// "pasta" onde se encontram os arquivos descritores das distribuições
// de probabilidades observadas
DirBase: String = 'D:\Doutorado\Tese\Programas dos Exemplos\Anexo D\';

// Determina número de membros de uma família


function DetermNumHab: Cardinal;
// Determina uma data de nascimento a partur de hoje a um ano
function DetermDataNasc(Hoje: TData):TData;
// Determina sexo para uma pessoa já existente
function DetermSexoExistente(DNasc, Hoje: TData):Byte;
// Determina sexo de um recém nascido
function DetermSexoRecemNasc: Byte;
// Determina data de óbito para uma pessoa, segundo sexo e idade atuais
VII-13

Listagem VII.2 – Código fonte de “DistrPop” (cont.).


function DetermObito(Sexo: Byte; DNasc, DHoje: TData): TData;
// Determina estado de gravidez de uma mulher e data do parto
function DetermGravidez(DNasc, DHoje: TData; var DatPart: TData): Boolean;
// Determina vínculo jurídico da unidade habit. (1-próprio: 2-alugado)
function DetermVincJur(NHab:Cardinal): Byte;
// Determina data da desocupação da unidade habitacional;
function DetermDataSaida(VJ:Byte; DEntr: TData): Tdata;
// Determina data de rehabitação
function DetermDataRehab(DDesoc: Tdata): TData;

{Implementação dos protótipos acima definidos}

implementation

// variáveis criadas para que o sistema leia os aruivos de probabilidades


// somente na entrada do programa e não a cada determinação.

var LCla: TListaDistClasses;


LClaObMasc, LClaObFem: TListaDistClasses;
LClasses:TListaDistClasses;
LNascIdMae: TListaDistClasses;

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;

var Id: Word;

Begin;
Id:=AnosDeIdade(DNasc,Hoje);
VII-14

Listagem VII.2 – Código fonte de “DistrPop” (cont.).


result:=IntervSexoIdade[Id].GetClasse(Dado(1000000)/1000000);
End;
//-------------------------------------------------------------------------
function DetermSexoRecemNasc: Byte;

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;

var Id: Cardinal;


Ex: extended;

Begin;
Id:=AnosDeIdade(DNasc,DHoje);
If (Id<15) or (Id>50) Then
VII-15

Listagem VII.2 – Código fonte de “DistrPop” (cont.).


result:=False
Else
Begin;
Ex:=Dado(1000000)/1000000;
PDistDisc:=LNascIdMae.ListaClasses.Items[Id-15];
result:= Ex<=PDistDisc^.Prob;
if result then
Begin;
DatPart:=DHoje;
DatPart.NovaData(Dado(366));
End;
End;
End;
//-------------------------------------------------------------------------
function DetermVincJur(NHab:Cardinal): Byte;

Begin;
result:=IntervVincJur[NHab].GetClasse(Dado(1000000)/1000000);
End;
//-------------------------------------------------------------------------
function DetermDataSaida(VJ:Byte; DEntr: TData): Tdata;

var D1: TData;


DSaida: cardinal;

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;

var D1: TData;


DRehab: cardinal;

Begin
D1:=DDesoc;
DRehab:=IntervTempoRehab.GetClasse(Dado(1000000)/1000000);
D1.NovaData(DRehab);
result:=D1;
End;
//-------------------------------------------------------------------------
initialization

{Inicialização de variáveis e leitura de arquivos com probabilidades}

// lê classes de número de habitantes e gera intervalos


LCla:=TListaDistClasses.Create;
VII-16

Listagem VII.2 – Código fonte de “DistrPop” (cont.).


IntervNumHab:=TListaIntervalos.Create;
LCla.LeArquivoClasses(DirBase + 'HabPorDom.ace');
IntervNumHab.GeraIntervalos(LCla);

// lê classes de idade e gera intervalos

IdadeCla:=TListaIntervalos.Create;
LCla.LeArquivoClasses(DirBase + 'Idade.ace');
IdadeCla.GeraIntervalos(LCla);

// lê as 101 distribuiçòes sexo x idade e gra os 101 intervalos


For _I:=0 To 100 Do
Begin;
IntervSexoIdade[_I]:=TListaIntervalos.Create;
Str(_I:3,_S);
Fillzero(_S);
_S:=DirBase+'SexoIdade'+_S+'.ace';
LCla.LeArquivoClasses(_S);
IntervSexoIdade[_I].GeraIntervalos(LCla);
End;

// lê a distribuição masculina de idade de óbito


LClaObMasc:=TListaDistClasses.Create;
LClaObMasc.LeArquivoClasses(DirBase + 'ObitosMasc.ace');

// lê distribuição feminina de idade de óbito


LClaObFem:=TListaDistClasses.Create;
LClaObFem.LeArquivoClasses(DirBase + 'ObitosFem.ace');

// lê a distribuição de probabilidades de ser mãe em determinada idade


LNascIdMae:=TListaDistClasses.Create;
LNascIdMae.LeArquivoClasses(DirBase + 'NascIdadeMae.ace');

// lê as distribuições de vínculo jurídico, próprio ou alugado para cada


// quantidade de moradores considerada.

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;

// gera intervalos de probabilidades de desocupação de unidade habitacional


// própria
IntervTempoPermProprio:=TListaIntervalos.Create;
LCla.Limpar;
_med:=3653; // média
_dev:=1096; // desvio padrão
_NDias:=14610; // número máximo de dias (limite técnico imposto)
ParamProbGama(_med,_dev,_r,_lb);
For _I:=0 To _NDias Do
Begin;
RCla.ValRet:=_I;
RCla.Prob:=Round(1E7*ProbGama(_I,_r,_lb))/1E7;
LCla.InsereClasse(RCla);
End;
IntervTempoPermProprio.GeraIntervalos(LCla);
VII-17

Listagem VII.2 – Código fonte de “DistrPop” (cont.).


// gera intervalos de probabilidades de desocupação de unidade habitacional
// alugada
IntervTempoPermAlug:=TListaIntervalos.Create;
LCla.Limpar;
_med:=730; // média
_dev:=183; // desvio padrão
_NDias:=3653; // número máximo de dias (limite técnico)
ParamProbGama(_med,_dev,_r,_lb);
For _I:=0 To _NDias Do
Begin;
RCla.ValRet:=_I;
RCla.Prob:=Round(1E7*ProbGama(_I,_r,_lb))/1E7;
LCla.InsereClasse(RCla);
End;
IntervTempoPermAlug.GeraIntervalos(LCla);

// gera intervalos de probabilidades de reocupação de unidade habitacional


IntervTempoRehab:=TListaIntervalos.Create;
LCla.Limpar;
_med:=90; // média
_dev:=25; // desvio padrão
_NDias:=365; // número máximo de dias (limite técnico)
ParamProbGama(_med,_dev,_r,_lb);
For _I:=0 To _NDias Do
Begin;
RCla.ValRet:=_I;
RCla.Prob:=Round(1E7*ProbGama(_I,_r,_lb))/1E7;
LCla.InsereClasse(RCla);
End;
IntervTempoRehab.GeraIntervalos(LCla);

LClasses:=TListaDistClasses.Create; // variável auxiliar para determinação


// de data de óbito;

end.

VII.2 Implementação para o Exemplo do Anexo D.

O exemplo apresentado no anexo D foi implementado com a


utilização das diversas bibliotecas, componente e objetos apresentados até aqui,
através de seu encadeamento por 3 módulos adicionais: o programa principal, a
descrição do formulário, e sua “unit” associada, apresentadas nas listagens VII.3,
VII.4 e VII.5 respectivamente.
VII-18

Listagem VII.3 – Programa principal para o exemplo do anexo D.


program Project1;

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.

Listagem VII.4 – Formulário principal para o exemplo do Anexo D.


object Form1: TForm1
Left = 196
Top = 156
Width = 544
Height = 247
Caption = 'Simulador de população - Anexo D.'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnActivate = FormActivate
OnCreate = FormCreate
OnDestroy = FormDestroy
PixelsPerInch = 96
TextHeight = 13
object G2: TGauge
Left = 372
Top = 40
Width = 120
Height = 120
Kind = gkPie
Progress = 0
end
object G1: TGauge
Left = 179
Top = 40
Width = 120
Height = 120
Kind = gkPie
Progress = 0
end
object Label1: TLabel
Left = 16
Top = 16
Width = 109
Height = 16
Caption = 'Calend. Interno:'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'MS Sans Serif'
VII-19

Listagem VII.4 – Formulário principal para o exemplo do Anexo D (cont.).


Font.Style = [fsBold]
ParentFont = False
end
object Label2: TLabel
Left = 16
Top = 35
Width = 105
Height = 19
Alignment = taCenter
AutoSize = False
Color = clBlack
Font.Charset = ANSI_CHARSET
Font.Color = clLime
Font.Height = -19
Font.Name = 'LcdD'
Font.Style = [fsBold]
ParentColor = False
ParentFont = False
end
object Label3: TLabel
Left = 152
Top = 16
Width = 174
Height = 16
Caption = 'Progresso da simulação:'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'MS Sans Serif'
Font.Style = [fsBold]
ParentFont = False
end
object Label4: TLabel
Left = 344
Top = 16
Width = 177
Height = 16
Caption = 'Progresso da exportação'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'MS Sans Serif'
Font.Style = [fsBold]
ParentFont = False
end
object Button2: TButton
Left = 16
Top = 72
Width = 121
Height = 25
Caption = 'Executa Simulação'
TabOrder = 0
OnClick = Button2Click
end
object Button3: TButton
Left = 16
Top = 112
Width = 121
Height = 25
Caption = 'Exporta Registros'
TabOrder = 1
OnClick = Button3Click
end
object Button1: TButton
VII-20

Listagem VII.4 – Formulário principal para o exemplo do Anexo D (cont.).


Left = 16
Top = 152
Width = 121
Height = 25
Caption = 'Grava formato H'
TabOrder = 2
OnClick = Button1Click
end
object Button4: TButton
Left = 16
Top = 192
Width = 121
Height = 25
Caption = 'Número de simulações'
TabOrder = 3
OnClick = Button4Click
end
object Edit1: TEdit
Left = 144
Top = 194
Width = 97
Height = 21
TabOrder = 4
end
object RC1: TRelCalend
SData = '01/01/2001'
SHora = '00:00:00,000'
PassoTimer = 1000
Incdata = '001/000/000'
IncHora = '000:00:00.000'
OnMudaData = RC1MudaData
Left = 320
Top = 88
end
end

Listagem VII.5 – “Unit” associada ao formulário da listagem VII.4.


{-------------------------------------------------------------------------}
{ }
{ Rotinas associadas aos objetos }
{ que compõem o formulário }
{ principal do exemplo }
{ do Anexo D. }
{ }
{-------------------------------------------------------------------------}
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Gauges, RelCalend, RegVal;

//--------------------------------------------------------------------------

const NumDeAptos = 40; // número de economias desejado


AnosDeSimulacao = 20; // número de anos a executar simulação

//--------------------------------------------------------------------------

type
VII-21

Listagem VII.5 – “Unit” associada ao formulário da listagem VII.4 (cont.).


TForm1 = class(TForm)
G1: TGauge; // indicador de progresso do cálculo
G2: TGauge; // indicador de progresso da gravação
RC1: TRelCalend; // relógio-calendário da simulação
Button2: TButton; // aciona simulação
Button3: TButton; // aciona exportação para MS-Excel
Label1: TLabel;
Label2: TLabel; // apresenta a data do calendário da simulação
Label3: TLabel;
Label4: TLabel;
Button1: TButton;
Button4: TButton;
Edit1: TEdit;
procedure Button2Click(Sender: TObject);
procedure RC1MudaData(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
procedure RegistraPopulacaoDoDia;
public
{ Public declarations }
Registros: Array[1..NumDeAptos] of TRegVal; // registra a população de
// cada economia
RSoma: Tregval; // registra a 'população total do prédio
end;
//--------------------------------------------------------------------------
var
Form1: TForm1;

implementation

uses TiposPop, MyDelphiUnit00, MyDelphiUnit01, MyDelphiUnit02,


MyDelphiUnit03,DistrPop,MyDelphiUnit04, VirtPrt;

{$R *.DFM}

var _P: TPredio; // o "prédio", como variável global.

//--------------------------------------------------------------------------
procedure TForm1.RegistraPopulacaoDoDia;
// registra estado populacional do dia apontado por "RC1"

var I,N: Cardinal;


PE: ^TEconomia;
Soma: Cardinal;

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

Listagem VII.5 – “Unit” associada ao formulário da listagem VII.4 (cont.).


//--------------------------------------------------------------------------
procedure TForm1.Button2Click(Sender: TObject);
// Dispara a simulação, partindo de uma inicial e acionando o incremento
// do relógio da simulação; atualiza indicadores de progresso.

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

Listagem VII.5 – “Unit” associada ao formulário da listagem VII.4 (cont.).


Fillzero(S);
S:='F:\Registrador-'+S+'.xls';
Registros[I].ExportaExcel(S);
G2.Progress:=I;
End;
S:='F:\Registrador-Soma.xls';
RSoma.ExportaExcel(S);
ShowMessage('Exportação terminada.');
end;
//--------------------------------------------------------------------------
procedure TForm1.FormActivate(Sender: TObject);
// atualiza indicador de data ao se ativar Form1

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.

var I,J: Cardinal;


S,S1: String;
F: textFile;
P: ^TRegPonto;

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

Listagem VII.5 – “Unit” associada ao formulário da listagem VII.4 (cont.).


S:=Edit1.text;
NoSpace(S);
Val(S,N,I);
If I<>0 Then
begin;
ShowMessage('Número de Avaliações inválido');
Exit;
end;
G2.MaxValue:=N;
For I:=1 To N Do
begin;
Str(I:2,S);
FillZero(S);
S:='Soma da dinâmica - '+S+'.xls';
Button2Click(Button2);
RSoma.ExportaExcel(S);
G2.Progress:=I;
RC1.SData:='01/01/2001';
RSoma.Limpar;
_P.destroy;
_P:=TPredio.create;
end;
end;
//--------------------------------------------------------------------------
initialization
// cria o prédio. Caso se deseje que o prédio esteja presente em todo o
// programa deve-se criá-lo como variável global.
_P:=TPredio.Create;

finalization
_P.destroy;

end.
VIII-1

APÊNDICE VIII

Nesses apêndice são apresentadas as peças de código que


compõem o exemplo do Capítulo 12, com exceção daquelas apresentadas
anteriormente, e que não tenham sofrido alterações notáveis.

As listagens contêm comentários que esclarecem suas funções e


trechos de código que poderiam ser de compreensão mais trabalhosa, ainda assim,
eventualmente, comenta-se após a apresentação da mesma, algum detalhe
considerado de maior relevância.

Listagem VIII.1 – Descrição dos aparelhos.


//--------------------------------------------------------------------------
//
// Implementação das "classes" referentes aos
// aparelhos sanitários.
// Nessa área de código define-se
// o comportamento dos aparelhos.
//
//--------------------------------------------------------------------------
unit Aparelho;

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

Listagem VIII.1 – Descrição dos aparelhos (cont).


function GetVazao: extended;
function GetPressao: extended;
procedure SetCd(X:extended);
function GetCd: extended;
procedure SetPressao(P: extended);
procedure SetN(N: extended);
procedure AvisaParada; dynamic;

public
{ Public declarations }

constructor create (AOwner: TComponent); override;

procedure AssumeCd(Q,P: extended); virtual;


procedure IniciarOperacao; virtual;
procedure AbrirAteQ(Q: extended); virtual;
procedure AbrirTotal; virtual;
procedure EncerrarOperacao; virtual;
procedure IncrementarUmSegundo; virtual;

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;

TApTempoPresUser = class(TAparelho) // aparelho que fecha por tempo e


// prende o usuário;
private
FTempoDur: cardinal;
FTempoDecor: cardinal;
FUsId: cardinal;
FUsAnt: cardinal;

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;

TApVolume = class(TAparelho) // aparelho que fecha por preenchimento


// de volume e não prende o usuário
private
FVolTanque: extended;
FVolEscoado: extended;

protected
VIII-3

Listagem VIII.1 – Descrição dos aparelhos (cont).


public
constructor Create(AOwner:TComponent); override;
procedure IniciarOperacao; reintroduce;
procedure IncrementarUmSegundo; override;

published
property VolEscoado: extended read FVolEscoado;
property VolTanque: extended read FVolTanque;
end;

TApCiclo = class(TAparelho) // aparelho que opera por ciclo automático


// iniciado pelo usuário
private
FVolEscoado: extended;
FTempoDecor: cardinal;

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

Listagem VIII.1 – Descrição dos aparelhos (cont).


protected

public
constructor Create(AOwner:TComponent); override;
published

end;

TApTanque = class(TApTempoPresUser)
private

protected

public
constructor Create(AOwner:TComponent); override;
published

end;

TMaqLavarCap4 = class(TApCiclo) // máquina de lavar do capítulo 4

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;

const BigNum = 1E1000;

//========================== TAparelho =====================================


//--------------------------------------------------------------------------
constructor TAparelho.create (AOwner: TComponent);

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

Listagem VIII.1 – Descrição dos aparelhos (cont).


Begin;
If FOperando Then result:=FCd*Elev(FPressao,1/Fn)
Else Result:=0;
End;
//--------------------------------------------------------------------------
function TAparelho.GetPressao: extended;

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

Listagem VIII.1 – Descrição dos aparelhos (cont).


End;
//--------------------------------------------------------------------------
procedure TAparelho.AbrirAteQ(Q: extended);

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

Listagem VIII.1 – Descrição dos aparelhos (cont).


begin;
FTempoDecor:=0;
FTempoDur:=0;
FUsAnt:=FUsId;
FUsId:=0;
inherited EncerrarOperacao;
End;
End;
End;
//========================== TApVolume =====================================
constructor TApVolume.Create(AOwner:TComponent);

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

Listagem VIII.1 – Descrição dos aparelhos (cont).


constructor TApChuveiro.Create(AOwner:TComponent);

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

Listagem VIII.1 – Descrição dos aparelhos (cont).


//--------------------------------------------------------------------------
procedure TMaqLavarCap4.IniciarOperacao;

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

Listagem VIII.1 – Descrição dos aparelhos (cont).


5: Begin;
Inc(FTempoDecor);
X:=FTempoDecor-4*60-1;
X:=X mod 25;
case X of
0..5: FCd:=5.338E-7;
6..24:FCd:=0;
End;
If FTempoDecor>=4*60+6*25 Then
FNFase:=6;
End;

6: Begin;
Inc(FTempoDecor);
If FTempoDecor >= 4*60+6*60 Then
EncerrarOperacao;
End;
End;
End;
//--------------------------------------------------------------------------
end.

Listagem VIII.2 – Implementação do “Despachante”.


//--------------------------------------------------------------------------
//
// "unit" com função de
// coordenar o acesso dos
// usuários aos aparelhos.
//
//--------------------------------------------------------------------------
unit Despachante;

interface

Uses FilaCardinal, Classes, TiposPop, unit1;

Type

TDespachante = class(TComponent)

private
FFila: TFilaCardinal;
procedure MontaNecessidade(var User:TPessoa);

protected

public
property Fila:TFilaCardinal read FFila;

// atenção AOwner deve sempre ser do tipo TPrédio. Esse inconveniente


// poderia se contornado com uma classe abstrata mas iria deixar o código
// desnecessariamente complexo.
constructor Create(AOwner:TComponent); override;
destructor Destroy; override;

procedure VerificaNecessidades;
procedure AtendeNecessidades;
procedure LiberaAparelho(Send:TObject);

published
VIII-11

Listagem VIII.2 – Implementação do “Despachante” (cont).


end;

implementation

uses Dominios, Aparelho, SysUtils, DistrHidra, Dialogs, Unit0;

//--------------------------------------------------------------------------
constructor TDespachante.Create(AOwner:TComponent);

var I,J,K: Cardinal;


PE: ^TEconomia;

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;

var PE: ^TEconomia;


PP: ^TPessoa;
I,J: Cardinal;

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

Listagem VIII.2 – Implementação do “Despachante” (cont).


End;
End;
End;
End;
End;
//--------------------------------------------------------------------------
procedure TDespachante.MontaNecessidade(var User:TPessoa);

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;

var PUId: ^cardinal;


Apto: cardinal;
PE: ^TEconomia;
F: TFamilia;
PU: ^TPessoa;
Atendeu, GrupoBloqueado: Boolean;
J,T: cardinal;
Q: extended;
I: Integer;
UsuarioAchado: Boolean;

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

Listagem VIII.2 – Implementação do “Despachante” (cont).


PU:=F.Membros[J];
UsuarioAchado:=PU^.Id=PUId^;
If UsuarioAchado Then break;
End;

If not UsuarioAchado Then // o usuário pode ter morrido na fila


Begin;
FFila.Delete(I);
Exit;
End;

GrupoBloqueado:=False;

Case PU^.NecessidadeAtual of

apnone: ShowMessage('Erro! Tem usuário na fila esperando '+


'por nada.');

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

Listagem VIII.2 – Implementação do “Despachante” (cont).


Atendeu:=True;
End;
End;

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

Listagem VIII.2 – Implementação do “Despachante” (cont).


//--------------------------------------------------------------------------
procedure TDespachante.LiberaAparelho(Send: TObject);

var Tp: TTipoAparelho;


Apto, Ind: cardinal;
F: TFamilia;
PU: ^TPessoa;
PE: ^TEconomia;

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.

Listagem VIII.3 – Implementação do Ramal tipo H1.


//--------------------------------------------------------------------------
//
// Implementa o tipo "RamalH1"
// com os dados e rotinas necessários
// para resolução do
// mesmo dado uma determinada
// pressão de entrada.
//
//--------------------------------------------------------------------------
unit RamalH1;

interface

uses Aparelho, FUniv, dialogs, sysutils, SistNaoLinearEsparso;

Type TRamalH1 = class(TObject)

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

Listagem VIII.3 – Implementação do Ramal tipo H1 (cont).


TabDep: TTabDep;

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

var Er: cardinal;


S: extended;

Begin;

If E.Q<>0 then S:=(E.Q)/Abs(E.Q) else S:=0;


E.Q:=Abs(E.Q);
Er:=FormUniv(E,PC_Perda,FPC_Swamee);
E.Q:=S*E.Q;
E.DH:=S*E.DH;
If Er=0 Then
Result:=E.DH
Else
Begin;
ShowMessage('Erro '+IntToStr(Er)+' no cálculo da perda de carga.');
result:=0;
end;
end;
//======================= sistema de equações ==============================
//..........................................................................
function f1(X:TVetor):extended;

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

Listagem VIII.3 – Implementação do Ramal tipo H1 (cont).


begin;
RH1.FPC.Pressao:=X[12];
result:=X[1]-RH1.FPC.Vazao;
end;
//..........................................................................
function f4(X:TVetor):extended;

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

Listagem VIII.3 – Implementação do Ramal tipo H1 (cont).


RH1.FML.Pressao:=X[17];
result:=X[4]-RH1.FML.Vazao;
end;
//..........................................................................
function f13(X:TVetor):extended;

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

// contém as posições para a derivação


const Aux: array[1..50,1..2] of cardinal =

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

var FVF: Tmfvx;


I,J: cardinal;

begin;
VIII-19

Listagem VIII.3 – Implementação do Ramal tipo H1 (cont).


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;

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;

// somente resolve se houver ao menos 1 aparelho com vazão


If RH1.FX[5]<>0 Then NRaphEsparso (FvF,RH1.FX,18,1E-8,RH1.TabDep);
RH1.FQentrada:=RH1.FX[5];
R:=RH1;
end;
//======================= TRamalH1 =========================================
constructor TRamalH1.Create;

var I:Cardinal;

Begin;
inherited create;

For I:=1 To 13 Do
VIII-20

Listagem VIII.3 – Implementação do Ramal tipo H1 (cont).


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.8;
FEsc[3].Tubo.Comprim:=2.3;
FEsc[4].Tubo.Comprim:=2.3;
FEsc[5].Tubo.Comprim:=0.4;
FEsc[6].Tubo.Comprim:=0.7;
FEsc[7].Tubo.Comprim:=2.3;
FEsc[8].Tubo.Comprim:=0.8;
FEsc[9].Tubo.Comprim:=1.1;
FEsc[10].Tubo.Comprim:=0.6;
FEsc[11].Tubo.Comprim:=1.1;
FEsc[12].Tubo.Comprim:=0.1;
FEsc[13].Tubo.Comprim:=0.2;
End;
//--------------------------------------------------------------------------
destructor TRamalH1.Destroy;

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.

Listagem VIII.4 – Implementação do Ramal tipo H2.


//--------------------------------------------------------------------------
//
// Implementa o tipo "RamalH2"
// com os dados e rotinas necessários
// para resolução do
// mesmo dado uma determinada
// pressão de entrada.
//
//--------------------------------------------------------------------------
unit RamalH2;
VIII-21

Listagem VIII.4 – Implementação do Ramal tipo H2 (cont).


interface

uses Aparelho, FUniv, dialogs, sysutils, SistNaoLinearEsparso;

Type TRamalH2 = class(TObject)

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;

property HEntrada: extended read FHentrada write FHentrada;


property Qentrada: extended read FQentrada;
property CH:TAparelho read FCH write FCH;
property LV:TAparelho read FLV write FLV;
property BS:TAparelho read FBS write FBS;

procedure ResolverRede;

constructor Create;
destructor Destroy; override;
published

end;

implementation

uses unit1;

var RH2: TRamalH2;

//--------------------------------------------------------------------------
function DeltaH(E:TEscoamento):extended;

var Er: cardinal;


S: extended;

Begin;

If E.Q<>0 then S:=(E.Q)/Abs(E.Q) else S:=0;


E.Q:=Abs(E.Q);
Er:=FormUniv(E,PC_Perda,FPC_Swamee);
E.Q:=S*E.Q;
E.DH:=S*E.DH;
If Er=0 Then
Result:=E.DH
Else
Begin;
ShowMessage('Erro '+IntToStr(Er)+' no cálculo da perda de carga.');
VIII-22

Listagem VIII.4 – Implementação do Ramal tipo H2 (cont).


result:=0;
end;
end;

//======================= sistema de equações ==============================


//..........................................................................
function f1(X:TVetor):extended;

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

Listagem VIII.4 – Implementação do Ramal tipo H2 (cont).


RH2.FLV.Pressao:=X[20];
result:=X[2]-RH2.FLV.Vazao;
end;
//..........................................................................
function f10(X:TVetor):extended;

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

Listagem VIII.4 – Implementação do Ramal tipo H2 (cont).


begin;
RH2.FEsc[13].Q:=X[5];
result:=X[10]-DeltaH(RH2.Fesc[13])-X[11];
end;
//..........................................................................
function f19(X:TVetor):extended;

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

// contém as posições para a derivação


const Aux: array[1..71,1..2] of cardinal =

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

Listagem VIII.4 – Implementação do Ramal tipo H2 (cont).


(8,20),(9,2),(9,20),(10,18),(10,3),(10,19),(11,17),(11,3),(11,18),(12,16),
(12,3),(12,17),(13,11),(13,4),(13,12),(14,12),(14,4),(14,13),(15,13),(15,4),
(15,14),(16,14),(16,4),(16,15),(17,4),(17,15),(18,10),(18,5),(18,11),(19,9),
(19,5),(19,10),(20,8),(20,9),(20,5),(21,7),(21,5),(21,8),(22,6),(22,5),
(22,7),(23,5),(23,6),(24,19),(24,1),(24,21),(25,11),(25,3),(25,16)
);

var FVF: Tmfvx;


I,J: cardinal;

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

Listagem VIII.4 – Implementação do Ramal tipo H2 (cont).


RH2.FX[25]:=RH2.Fx[24];

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

Listagem VIII.4 – Implementação do Ramal tipo H2 (cont).


Begin;
For I:=1 To 20 Do FEsc[I].free;
inherited destroy;
end;
//--------------------------------------------------------------------------
procedure TRamalH2.ResolverRede;

Begin;
ResolveRamalH2(Self);
End;
//--------------------------------------------------------------------------
initialization

RH2:=TRamalH2.Create;

end.

Listagem VIII.5 – Implementação da Coluna tipo AF-1, para ramais H1.


//--------------------------------------------------------------------------
//
// Implementa o tipo "ColunaAF1"
// com os dados e rotinas necessários
// para resolução das
// colunas impares dado uma
// determinada
// pressão de entrada.
//
//--------------------------------------------------------------------------
unit ColunaAF1;

interface

uses Aparelho, RamalH1, FUniv, dialogs, sysutils, SistNaoLinearEsparso;

Type

TRamaisH1 = array[1..7] of TRamalH1;

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;

FX: TVetor; // 1 a 33 - variáveis;


// 34 - 'H'entrada

TabDep: TTabDep;

PrimCalculo: Boolean; // sinalizador de primeiro cálculo


VIII-28

Listagem VIII.5 – Implementação da Coluna tipo AF-1, para ramais H1 (cont).


property HEntrada: extended read FHentrada write FHentrada;
property Qentrada: extended read FQentrada;
property Ram:TRamaisH1 read FRamais write FRamais;

procedure ResolverRede;

constructor Create;
destructor Destroy; override;
published

end;

implementation

uses unit1;

var AF1: TColunaAF1;

//--------------------------------------------------------------------------
function DeltaH(E:TEscoamento):extended;

var Er: cardinal;


S: extended;

Begin;

If Abs(E.Q)>=1E-15 then S:=(E.Q)/Abs(E.Q) else S:=0;


E.Q:=Abs(E.Q);
Er:=FormUniv(E,PC_Perda,FPC_Swamee);
E.Q:=S*E.Q;
E.DH:=S*E.DH;
If Er=0 Then
Result:=E.DH
Else
Begin;
ShowMessage('Erro '+IntToStr(Er)+' no cálculo da perda de carga.');
result:=0;
end;
end;

//======================= sistema de equações ==============================


//..........................................................................
function f1(X:TVetor):extended;

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

Listagem VIII.5 – Implementação da Coluna tipo AF-1, para ramais H1 (cont).


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

Listagem VIII.5 – Implementação da Coluna tipo AF-1, para ramais H1 (cont).


AF1.FEsc[5].Q:=X[4]/1000;
result:=X[26]-DeltaH(AF1.Fesc[5])/1000-X[27];
end;
//..........................................................................
function f14(X:TVetor):extended;

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

Listagem VIII.5 – Implementação da Coluna tipo AF-1, para ramais H1 (cont).


end;
//..........................................................................
function f22(X:TVetor):extended;

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

Listagem VIII.5 – Implementação da Coluna tipo AF-1, para ramais H1 (cont).


begin;
AF1.FEsc[17].Q:=X[5]/1000;
result:=X[23]-DeltaH(AF1.Fesc[17])/1000-X[25];
end;
//..........................................................................
function f31(X:TVetor):extended;

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

// contém as posições para a derivação


const Aux: array[1..91,1..2] of cardinal =

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

var FVF: Tmfvx;


I,J: cardinal;

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

Listagem VIII.5 – Implementação da Coluna tipo AF-1, para ramais H1 (cont).


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;

AF1:=R;
AF1.FX[34]:=AF1.HEntrada;

// a aproximação inicial correspone à pressão estática na primeira vez


// em que a coluna é calculada, nas demais toma como aproximação
// inicial a situação anterior, partindo-se do princípio que em um
// incremento de tempo relativamente pequeno, não deverá ocorrer
// grande alteração de aparelhos;

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

Listagem VIII.5 – Implementação da Coluna tipo AF-1, para ramais H1 (cont).


AF1.Ram[2].Hentrada:=AF1.FX[30];
AF1.Ram[2].ResolverRede;
AF1.FX[2]:=AF1.Ram[2].Qentrada;

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

// passando valores para L/s e kPa para melhorar desempenho numérico


For I:=1 To 13 Do AF1.FX[I]:=AF1.Fx[I]*1000;
For I:=14 To 34 Do AF1.FX[I]:=AF1.FX[I]/1000;

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;

If AF1.FX[13]<>0 then NRaphEsparso (FvF,AF1.FX,33,1E-9,AF1.TabDep);

// voltando valores para m3/s e Pa


For I:=1 To 13 Do AF1.FX[I]:=AF1.Fx[I]/1000;
For I:=14 To 34 Do AF1.FX[I]:=AF1.FX[I]*1000;

AF1.FQentrada:=AF1.FX[13];
R:=AF1;
end;
//======================= TColunaAF1 =======================================
constructor TColunaAF1.Create;

var I:Cardinal;

Begin;
inherited create;

PrimCalculo:=True;

For I:=1 To 7 Do FRamais[I]:=TRamalH1.Create;


VIII-35

Listagem VIII.5 – Implementação da Coluna tipo AF-1, para ramais H1 (cont).


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;

For I:=1 To 4 Do FEsc[I].Tubo.Diam:=17E-3;


For I:=5 To 12 Do FEsc[I].Tubo.Diam:=21.6E-3;
For I:=13 To 14 Do FEsc[I].Tubo.Diam:=27.8E-3;
FEsc[15].Tubo.Diam:=17E-3;
For I:=16 To 19 Do FEsc[I].Tubo.Diam:=21.6E-3;
FEsc[20].Tubo.Diam:=27.8E-3;

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

Listagem VIII.6 – Implementação da Coluna tipo AF-2, para ramais H2.


//--------------------------------------------------------------------------
//
// Implementa o tipo "ColunaAF2"
// com os dados e rotinas necessários
// para resolução das
// colunas pares dado uma
// determinada
// pressão de entrada.
//
//--------------------------------------------------------------------------
unit ColunaAF2;

interface

uses Aparelho, RamalH2, FUniv, dialogs, sysutils, SistNaoLinearEsparso;

Type

TRamaisH2 = array[1..7] of TRamalH2;

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;

property HEntrada: extended read FHentrada write FHentrada;


property Qentrada: extended read FQentrada;
property Ram:TRamaisH2 read FRamais write FRamais;

procedure ResolverRede;

constructor Create;
destructor Destroy; override;
published

end;

implementation

uses unit1;

var AF2: TColunaAF2;

//--------------------------------------------------------------------------
function DeltaH(E:TEscoamento):extended;

var Er: cardinal;


VIII-37

Listagem VIII.6 – Implementação da Coluna tipo AF-2, para ramais H2 (cont).


S: extended;

Begin;

If Abs(E.Q)>=1E-15 then S:=(E.Q)/Abs(E.Q) else S:=0;


E.Q:=Abs(E.Q);
Er:=FormUniv(E,PC_Perda,FPC_Swamee);
E.Q:=S*E.Q;
E.DH:=S*E.DH;
If Er=0 Then
Result:=E.DH
Else
Begin;
ShowMessage('Erro '+IntToStr(Er)+' no cálculo da perda de carga.');
result:=0;
end;
end;
//======================= sistema de equações ==============================
//..........................................................................
function f1(X:TVetor):extended;

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

Listagem VIII.6 – Implementação da Coluna tipo AF-2, para ramais H2 (cont).


begin;
AF2.Ram[1].HEntrada:=X[33]*1000;
AF2.Ram[1].ResolverRede;
result:=X[1]-AF2.Ram[1].Qentrada*1000;
end;
//..........................................................................
function f9(X:TVetor):extended;

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

Listagem VIII.6 – Implementação da Coluna tipo AF-2, para ramais H2 (cont).


result:=X[23]-DeltaH(AF2.Fesc[7])/1000-X[24];
end;
//..........................................................................
function f17(X:TVetor):extended;

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

Listagem VIII.6 – Implementação da Coluna tipo AF-2, para ramais H2 (cont).


//..........................................................................
function f25(X:TVetor):extended;

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

Listagem VIII.6 – Implementação da Coluna tipo AF-2, para ramais H2 (cont).


end;
//..........................................................................
//--------------------------------------------------------------------------
procedure ResolveColunaAF2(var R:TColunaAF2);

// contém as posições para a derivação


const Aux: array[1..91,1..2] of cardinal =

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

var FVF: Tmfvx;


I,J: cardinal;

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

Listagem VIII.6 – Implementação da Coluna tipo AF-2, para ramais H2 (cont).


+1.1*AF2.FEsc[14].Fluido.MassaEsp*AF2.FEsc[14].Local.g;
AF2.FX[15]:=AF2.FX[14];
AF2.FX[16]:=AF2.FX[14];
AF2.FX[17]:=AF2.FX[14]
+2.9*AF2.FEsc[12].Fluido.MassaEsp*AF2.FEsc[12].Local.g;
AF2.FX[18]:=AF2.Fx[17];
AF2.FX[19]:=AF2.Fx[17];
AF2.FX[20]:=AF2.Fx[17]
+2.9*AF2.FEsc[10].Fluido.MassaEsp*AF2.FEsc[10].Local.g;
AF2.FX[21]:=AF2.FX[20];
AF2.FX[22]:=AF2.Fx[20];
AF2.FX[23]:=AF2.Fx[20]
+2.9*AF2.FEsc[8].Fluido.MassaEsp*AF2.FEsc[8].Local.g;
AF2.FX[24]:=AF2.Fx[23];
AF2.FX[25]:=AF2.Fx[23];
AF2.FX[26]:=AF2.Fx[23]
+2.9*AF2.FEsc[6].Fluido.MassaEsp*AF2.FEsc[6].Local.g;
AF2.FX[27]:=AF2.Fx[26];
AF2.FX[28]:=AF2.Fx[26];
AF2.FX[29]:=AF2.Fx[26]
+2.9*AF2.FEsc[4].Fluido.MassaEsp*AF2.FEsc[4].Local.g;
AF2.FX[30]:=AF2.Fx[29];
AF2.FX[31]:=AF2.Fx[29];
AF2.FX[32]:=AF2.Fx[29]
+2.9*AF2.FEsc[2].Fluido.MassaEsp*AF2.FEsc[2].Local.g;
AF2.FX[33]:=AF2.Fx[32];

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

Listagem VIII.6 – Implementação da Coluna tipo AF-2, para ramais H2 (cont).


// passando valores para L/s e kPa para melhorar desempenho numérico
For I:=1 To 13 Do AF2.FX[I]:=AF2.Fx[I]*1000;
For I:=14 To 34 Do AF2.FX[I]:=AF2.FX[I]/1000;

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

// voltando valores para m3/s e Pa


For I:=1 To 13 Do AF2.FX[I]:=AF2.Fx[I]/1000;
For I:=14 To 34 Do AF2.FX[I]:=AF2.FX[I]*1000;

AF2.FQentrada:=AF2.FX[13];
R:=AF2;
end;
//======================= TColunaAF2 =======================================
constructor TColunaAF2.Create;

var I:Cardinal;

Begin;
inherited create;

PrimCalculo:=True;

For I:=1 To 7 Do FRamais[I]:=TRamalH2.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;
end;

For I:=1 To 20 Do FEsc[I].Tubo.Diam:=17E-3;

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

Listagem VIII.6 – Implementação da Coluna tipo AF-2, para ramais H2 (cont).


//--------------------------------------------------------------------------
destructor TColunaAF2.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 TColunaAF2.ResolverRede;

Begin;
ResolveColunaAF2(Self);
End;
//--------------------------------------------------------------------------
initialization

AF2:=TColunaAF2.Create;

end.

Listagem VIII.7 – Implementação da rede completa.


//--------------------------------------------------------------------------
//
// Implementa o tipo "Barrilete"
// com os dados e rotinas necessários
// para resolução de
// toda a rede, uma vez que
// toma as colunas como seus "aparelhos"
//
//--------------------------------------------------------------------------
unit Barrilete;

interface

uses Aparelho, RamalH2, FUniv, dialogs, sysutils, SistNaoLinearEsparso,


ColunaAF1, ColunaAF2, RamalH1, forms;

Type

TColunas1 = array[1..4] of TColunaAF1;


TColunas2 = array[1..4] of TColunaAF2;

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

Listagem VIII.7 – Implementação da rede completa (cont).


// 12-T17; 13-T18a; 14-T19; 15-T20L; 16-T22;
// 17-T24L; 18-T26; 19-T26L; 20-T28;
// 21-T30; 22-T10d; 23-T12d; 24-T16d; 25-T18b;
// 26-T20d; 27-T24d; 28-T26d;
FX: TVetor; // 1 a 43 - variáveis;

TabDep: TTabDep;

PrimCalculo:Boolean;

property HLamina: extended read FYLamina write FYLamina;


property QSaidaDoReserv: extended read FQSaidaDeR;
property ColImpar: TColunas1 read FColuna1 write FColuna1;
property ColPar: TColunas2 read FColuna2 write FColuna2;
property ConfigAparelhos: string read GetConfigAp;

procedure ResolverRede;

constructor Create;
destructor Destroy; override;
published

end;

implementation

uses math, unit1;

var Bar: TBarrilete;

//--------------------------------------------------------------------------
function DeltaH(E:TEscoamento):extended;

var Er: cardinal;


S: extended;

Begin;

If Abs(E.Q)>=1E-15 then S:=(E.Q)/Abs(E.Q) else S:=0;


E.Q:=Abs(E.Q);
Er:=FormUniv(E,PC_Perda,FPC_Swamee);
E.Q:=S*E.Q;
E.DH:=S*E.DH;
If Er=0 Then
Result:=E.DH
Else
Begin;
ShowMessage('Erro '+IntToStr(Er)+' no cálculo da perda de carga.');
result:=0;
end;
end;

//======================= sistema de equações ==============================


//..........................................................................
function f1(X:TVetor):extended;

begin;
result:=X[5]+X[6]-X[4];
Application.processMessages;
end;
//..........................................................................
function f2(X:TVetor):extended;

begin;
VIII-46

Listagem VIII.7 – Implementação da rede completa (cont).


result:=X[4]+X[7]-X[3];
end;
//..........................................................................
function f3(X:TVetor):extended;

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

Listagem VIII.7 – Implementação da rede completa (cont).


end;
//..........................................................................
function f12(X:TVetor):extended;

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; // Coluna AF-1 - componente 7


Bar.FColuna1[1].HEntrada:=X[29];
Bar.FColuna1[1].ResolverRede;
result:=X[5]-Bar.FColuna1[1].QEntrada*1000;
end;
//..........................................................................
function f14(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; // Coluna AF-2 - componente 9


Bar.FColuna2[1].HEntrada:=X[30];
Bar.FColuna2[1].ResolverRede;
result:=X[6]-Bar.FColuna2[1].QEntrada*1000;
end;
//..........................................................................
function f16(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; // Coluna AF-3 - componente 13


Bar.FColuna1[2].HEntrada:=X[31];
Bar.FColuna1[2].ResolverRede;
result:=X[7]-Bar.FColuna1[2].QEntrada*1000;
end;
//..........................................................................
function f20(X:TVetor):extended;

begin;
VIII-48

Listagem VIII.7 – Implementação da rede completa (cont).


Bar.FEsc[10].Q:=X[3]/1000;
result:=X[23]-DeltaH(Bar.Fesc[10])/1000-X[24];
end;
//..........................................................................
function f21(X:TVetor):extended;

begin; // Coluna AF-4 - componente 15


Bar.FColuna2[2].HEntrada:=X[32];
Bar.FColuna2[2].ResolverRede;
result:=X[8]-Bar.FColuna2[2].QEntrada*1000;
end;
//..........................................................................
function f22(X:TVetor):extended;

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; // Coluna AF-5 - componente 21


Bar.FColuna1[3].HEntrada:=X[16];
Bar.FColuna1[3].ResolverRede;
result:=X[15]-Bar.FColuna1[3].QEntrada*1000;
end;
//..........................................................................
function f28(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

Listagem VIII.7 – Implementação da rede completa (cont).


begin; // Coluna AF-6 - componente 23
Bar.FColuna2[3].HEntrada:=X[43];
Bar.FColuna2[3].ResolverRede;
result:=X[14]-Bar.FColuna2[3].QEntrada*1000;
end;
//..........................................................................
function f30(X:TVetor):extended;

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; // Coluna AF-7 - componente 27


Bar.FColuna1[4].HEntrada:=X[42];
Bar.FColuna1[4].ResolverRede;
result:=X[13]-Bar.FColuna1[4].QEntrada*1000;
end;
//..........................................................................
function f34(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; // Coluna AF-8 - componente 29


Bar.FColuna2[4].HEntrada:=X[41];
Bar.FColuna2[4].ResolverRede;
result:=X[12]-Bar.FColuna2[4].QEntrada*1000;
end;
//..........................................................................
function f36(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

Listagem VIII.7 – Implementação da rede completa (cont).


function f38(X:TVetor):extended;

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

// contém as posições para a derivação


const Aux: array[1..120,1..2] of cardinal =

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

Listagem VIII.7 – Implementação da rede completa (cont).


var FVF: Tmfvx;
I,J: cardinal;

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

Listagem VIII.7 – Implementação da rede completa (cont).


Bar.FX[18]:=Bar.FX[18];

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

// passando valores para L/s e kPa para melhorar desempenho numérico


For I:=1 To 15 Do Bar.FX[I]:=Bar.Fx[I]*1000;
For I:=16 To 43 Do Bar.FX[I]:=Bar.FX[I]/1000;

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

Listagem VIII.7 – Implementação da rede completa (cont).


If Bar.FX[1]<>0 Then NRaphEsparso (FvF,Bar.FX,43,1E-4,Bar.TabDep);

// voltando valores para m3/s e Pa


For I:=1 To 15 Do Bar.FX[I]:=Bar.Fx[I]/1000;
For I:=16 To 43 Do Bar.FX[I]:=Bar.FX[I]*1000;

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 4 Do Self.FColuna1[I]:=TColunaAF1.Create;


For I:=1 To 4 Do Self.FColuna2[I]:=TColunaAF2.Create;

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;

For I:=1 To 4 Do FEsc[I].Tubo.Diam:=35.2E-3;


For I:=5 To 10 Do FEsc[I].Tubo.Diam:=27.8E-3;
For I:=11 To 15 Do FEsc[I].Tubo.Diam:=35.2E-3;
For I:=16 To 23 Do FEsc[I].Tubo.Diam:=27.8E-3;
For I:=24 To 26 Do FEsc[I].Tubo.Diam:=35.2E-3;
For I:=26 To 28 Do FEsc[I].Tubo.Diam:=27.8E-3;

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

Listagem VIII.7 – Implementação da rede completa (cont).


FEsc[27].Tubo.Comprim:=0.9;
FEsc[28].Tubo.Comprim:=0.9;
End;
//--------------------------------------------------------------------------
destructor TBarrilete.Destroy;

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

Listagem VIII.7 – Implementação da rede completa (cont).


X:=LV.Cd*Ord(LV.Operando);
s:=s+CompCd(X);
X:=BS.Cd*Ord(BS.Operando);
s:=s+CompCd(X);
end;
End;
result:=S;
End;
//--------------------------------------------------------------------------
procedure TBarrilete.ResolverRede;

Begin;
If ConfigAparelhos <> FUltConfigApar Then // só recalcula se os aparelhos
Begin; // se alteraram.
ResolveBarrilete(Self);
FUltConfigApar:=ConfigAparelhos;
end;
End;
//--------------------------------------------------------------------------
initialization

Bar:=TBarrilete.Create;

end.

Listagem VIII.8 – Solução para sistemas não lineares “esparsos”.


{**************************************************************************}
{ }
{ Biblioteca Delphi }
{ "unit" de implementação da }
{ Solução de Sistemas de Equações Simultâneas }
{ não lineares pelo método de Newton-Raphson }
{ para matrizes "jacobianas" esparsas. }
{ }
{**************************************************************************}
Unit SistNaoLinearEsparso;

interface

uses dialogs, sysutils, MyDelphiUnit03; // utiliza biblioteca conforme


// listagem III.7

// Tipos de Dados.
Type TVetor = array[1..MaxDim] of Extended; // vetor de números reais

PTVetor = ^TVetor; // ponteiro para vetor de número reais

TFdeX = function (X:Extended):Extended; // tipo função de uma variável


// escalar: f(x)

TFvet = function (X:TVetor):Extended; // tipo função de uma variável


// vetorial: f(X) onde X é um vetor

Tmfvx = Array[1..MaxDim] of TFvet; // vetor de funções vetoriais

TTabDep = Array[1..MaxDim,1..MaxDim] of Boolean; // matriz de


// dependência para reduzir o número de
// derivadas parciais, uma vez que a matriz
// jacobiana é bastante esparsa.
// São indicadas como "True" somente
// as variáveis que influenciam cada equação
VIII-56

Listagem VIII.8 – Solução para sistemas não lineares “esparsos” (cont).


// p.e. A[I,J]:=True, incica que a função
// "I" depende da variável "J" e portanto
// deve ser derivada segundo a mesma.

// Protótipos de procedimentos e funções

// Resolve o sistema não linear pelo método de Newton-Raphson


Procedure NRaphEsparso(M:TmFvx; var X1:TVetor; N:Integer; Err:Extended;
TabDep:TTabdep);

implementation
{Implementação dos protótipos acima definidos}

Procedure NRaphEsparso(M:TmFvx; var X1:TVetor; N:Integer; Err:Extended;


TabDep:TTabdep);

var Xv: TVetor; // armazena o vetor XY


IV: Integer;// armazena o indice da variavel
// segundo a qual será feita a derivada IV1
Fx: TFvet; // armazena o endereco da funcao
// a derivar

{--------------------------------------------------------------------------}
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 8 Do For J:=0 To 9 Do A[I,J]:=0; //inicializa tabela de


// diferencas

H:=1/2048; {estabelece a diferença entre os valores de xi}


VIII-57

Listagem VIII.8 – Solução para sistemas não lineares “esparsos” (cont).


N:=8; {numero de termos da expressao IV.12}

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;
{--------------------------------------------------------------------------}

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

Listagem VIII.8 – Solução para sistemas não lineares “esparsos” (cont).


' 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
'
' se encontra "encravada" dessa forma para que a rotina inteira possa
' ser reentrante, como é o caso do cálculo das colunas, onde os ramais
' são tratados como aparelhos.
'
...........................................................................}

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"

T:=True; // assinala que haverá necessidade de mais iterações


// IntCont:=0; // inicializa contador de iterações
While T Do // enquanto existir necessidade de iterações
Begin;

//Inc(IntCont); // incrementa contador de iterações

{construção da matriz Jacobiana}


For I:=1 To N Do // para cada linha da matriz "A"
Begin;
For J:=1 To N Do // calcula a derivada parcial, segundo cada
Begin;
If TabDep[I,J] Then
A[I,J]:=DPar(M[I],X,J)// incognita X[J],no ponto dado
Else A[I,J]:=0; // por X montando a matriz A[]
end;

V[I]:=M[I](X); // calcula o resultado de cada função para


// o vetor solução atual.

End;

Gauss(A,V,DX,N,SL); // encontra o vetor das diferenças dX[]

If SL then showMessage('singularidade na solução do sistema');

For I:=1 To N Do X[I]:=X[I]-DX[I]; // aplica as diferenças ao vetor


// solução
T:=False; // marca como final de iterações

{verifica critério de parada}


For I:=1 To N Do
T:=T or (Abs(M[I](X)) > Abs(Err)); // se ao menos uma função
// calculada apresentar resultado maior
// que o erro máximo admissível, assinala
// necessidade de mais iteração.

End; // ao terminar as iterações..


VIII-59

Listagem VIII.8 – Solução para sistemas não lineares “esparsos” (cont).


X1:=X; // atribui o vetor resultado e sai
End;
{--------------------------------------------------------------------------}
begin;
NRaph2 (M,X1,N,Err);
end;
//--------------------------------------------------------------------------
end.

A solução para sistemas não lineares apresentada traz três


aspectos peculiares, em relação àquela apresentada na listagem IV.1:

a) a derivada de primeira ordem, utilizada na criação da matriz


“jacobiana”, é tomada de forma simplificada, impondo-se uma variação arbitrária
na variável derivativa, a fim de obter-se dois pontos próximos sobre a curva, de
modo a determinar-se a secante à curva dada por esses dois pontos, fazendo-a igual
à tangente pelo ponto médio. Tal expediente induz erros toleráveis no presente
exemplo, e provavelmente em qualquer exemplo onde os valores de pressão e
vazão da rede tenham a mesma ordem de grandeza dos valores aqui utilizados.
Essa simplificação foi necessária para o aumento da velocidade de execução, um
dos pontos fracos encontrados na implementação do exemplo, uma vez que, como
se toma, para o cálculo de redes de hierarquia superior, a rede de hierarquia inferior
como aparelho, a diminuição do número de vezes em que tais redes serão
calculadas para a montagem da matriz “jacobiana” contribui em muito para a
aceleração do processo;

b) a introdução de uma matriz de valores lógicos (Verdadeiro –


Falso), como indicativa das posições nas quais a matriz “jacobiana” tem elementos
possivelmente não nulos. Essa técnica aumenta em muito a velocidade de
montagem da matriz “jacobiana”, uma vez que, apesar do fato de contar-se com
número muito elevado de componentes, e portanto muitas leis internas dos
VIII-60

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.

c) o código foi tornado reentrante (i.e. pode chamar a si mesmo).


Tal expediente foi necessário uma vez que na implementação hierárquica utilizada,
duranteo cálculo de uma estrutira superio (p.e. colunas), é avaliada a derivada da
curva pressão x vazão de estruturas inferiores (p.e. ramais), o que faz com que
soluções do sistema não linear sejam necessárias durante a montagem da matriz
jacobiana. Esse objetivo foi obtido pela alteração de escopo das variáveis globais
da listagem IV.1, transformadas em variáveis locais.

Listagem VIII.9 – Objetos descritores da população.


{*************************************************************************}
{ }
{ Biblioteca Delphi }
{ "unit" de implementação de }
{ Objetos representativos de }
{ elementos da população }
{ }
{*************************************************************************}
unit TiposPop;

interface

uses MyDelphiUnit00, MyDelphiUnit01, MyDelphiUnit02, MyDelphiUnit03,


MyDelphiUnit04, classes, DistrPop, sysutils, Aparelho;

{Descrição do objetos de dados}

Type

TEstadoAtend = (eaLivre, eaEmEspera, eaEmAtendimento);

// representação genérica de uma pessoa


TPessoa = class(TObject)

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

Listagem VIII.9 – Objetos descritores da população (cont.).


property DataObito: TData read FDataObito write FDataObito;
property NecessidadeAtual: TTipoAparelho read FTipoNecessidade;
property EstadoDeAtendimento: TEstadoAtend read FEstadoAtend;

constructor Create (Ident: Cardinal); virtual;


destructor Destroy; override;

function RegistraNecessidade(N:TTipoAparelho): Boolean;


function IniciaAtend: Boolean;
function EncerraAtend: Boolean;
end;

// Representação de pessoa do sexo masculino

THomem = class(TPessoa)

private
FSexo: Byte; // 1-masc
public
Property Sexo: Byte read FSexo;

constructor Create(Ident:Cardinal); override;


destructor Destroy; override;
end;

// Representação de pessoa do sexo feminino

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;

// Representação de um grupo de pessoas

TFamilia = class(TObject)

private
FId: Cardinal;
FMembros: TList; // contém apontadores para TPessoa
FNumPess: Cardinal; // número de membros

R: ^TPessoa; // variável auxiliar que não pode ser destruída


public
property NumPess: Cardinal read FNumPess; // número de pessoas
property Membros: TList read FMembros; // lista de pessoas
property Ident: Cardinal read FId; // identificação

constructor Create (Ident: Cardinal); virtual;


destructor Destroy; override;

procedure AdicionaPessoa (P:TPessoa);


function RemovePessoa (Ident: Cardinal): Boolean;
end;
VIII-62

Listagem VIII.9 – Objetos descritores da população (cont.).

{implementação dos métodos dos objetos acima descritos}

implementation

//========================== TPessoa =======================================


constructor TPessoa.Create (Ident:Cardinal);

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

Listagem VIII.9 – Objetos descritores da população (cont.).


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

Listagem VIII.9 – Objetos descritores da população (cont.).


R:=Fmembros[I];
result:=R^.FId=Ident;
inc(I);
End;
If result then
begin;
Dec(I);
Fmembros.Delete(I);
Dec(FNumPess);
End;
End;
//--------------------------------------------------------------------------
end.

Listagem VIII.10 – Objetos descritores dos domínios físicos da edificação.


{*************************************************************************}
{ }
{ Biblioteca Delphi }
{ "unit" de implementação de }
{ Objetos representativos de }
{ para a edificação tomada }
{ como exemplo. }
{ }
{*************************************************************************}
unit Dominios;

interface

uses MyDelphiUnit00, MyDelphiUnit01, MyDelphiUnit02, MyDelphiUnit03,


MyDelphiUnit04, classes, DistrPop, sysutils, Aparelho, TiposPop,
Despachante;

{Descrição do objetos de dados}

Type

// Representa uma economia, geralmente uma unidade habitacional

TGrupoAparelhos = Array [0..3,0..2] of TAparelho;


TNumAparelhosPorGrupo = Array [0..3] of cardinal;

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

Listagem VIII.10 – Objetos descritores dos domínios físicos da edificação (cont.).


property GruposAp: TGrupoAparelhos read FGrupos;
property NumApaGrupo: TNumAparelhosPorGrupo read FNApGrupos;
property NumGrupos: cardinal read FNGrupos;

constructor Create (AOwner: TComponent; Ident: Cardinal); reintroduce;


destructor Destroy; override;

procedure Limpar;
procedure EntraFamilia(F:TFamilia; D:Tdata; VJ:Byte);
procedure SaiFamilia;
end;

// Representação da edificação como um todo

TPredio = class (TComponent)

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

R: ^TEconomia; // variável auxiliar que não deve ser destruída


public
property Despachante: TDespachante read FDep;
property Economias: TList read FEconomias;
property NumEcon: Cardinal read FNumEcon;

constructor create (AOwner:TComponent;


D:Tdata;NAp:Cardinal;TxDesoc:extended); reintroduce; virtual;
destructor destroy; override;

// limpa todas as economias, famílias e pessoas


procedure Limpar;
// insere economia
procedure InsereEconomia (E:TEconomia);
// gera uma população inicial
procedure PopularInicial(Di:Tdata;NEcon:Cardinal;TxEcDes:Extended);
// gera lista detalhada de economias, famílias e pessoas
procedure ListaDetalhes(ArqSai,Titulo:String);
// processa dinâmica de entrada e saída de famílias no prédio
procedure ProcessaEntradaSaida(DHoje:Tdata);
// prcessa dinâmica de nascimentos e mortes no prédio
procedure ProcessaNasceMorre(DHoje:Tdata);
// incrementa o relógio dos aparelhos;
procedure IncrementaUmSegundoAparelhos;
end;

{implementação dos métodos dos objetos acima descritos}

implementation

//========================== TEconomia =====================================


constructor TEconomia.Create (AOwner: TComponent; Ident: Cardinal);

Begin;
inherited Create(AOwner);
FId:=Ident;
FFamilia:=TFamilia.Create(0);
FOcupado:=False;
FDataEntr.Atualdata;
FVincJur:=0;

// 1o. grupo de aparelhos: ramal H2

FNApGrupos[0]:=3;
VIII-66

Listagem VIII.10 – Objetos descritores dos domínios físicos da edificação (cont.).


FGrupos[0,0]:=TApChuveiro.Create(Self);
FGrupos[0,1]:=TApLavatorio.Create(Self);
FGrupos[0,2]:=TApBaciaSanitaria6L.Create(Self);

// 2o. grupo: pia de cozinha, ramal H1


FNApGrupos[1]:=1;
FGrupos[1,0]:=TApPiaDeCozinha.Create(Self);

// 3o. grupo: Tanque de lavar roupas, ramal H1


FNapGrupos[2]:=1;
FGrupos[2,0]:=TApTanque.Create(Self);

// 4o. grupo: Máquina de lavar roupas, ramal H1.


FNapGrupos[3]:=1;
FGrupos[3,0]:=TMaqLavarCap4.Create(Self);

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

Listagem VIII.10 – Objetos descritores dos domínios físicos da edificação (cont.).


FEconomias:=TList.Create;
FNumEcon:=0;
PopularInicial(D,NAp,TxDesoc);
FDep:=TDespachante.Create(Self);
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
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

Listagem VIII.10 – Objetos descritores dos domínios físicos da edificação (cont.).


VJ: Byte;

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

var I,J: Cardinal;


PE: ^TEconomia;
PP: ^TPessoa;
S,S1,S2,S3,S4: String;
F: textfile;
VIII-69

Listagem VIII.10 – Objetos descritores dos domínios físicos da edificação (cont.).


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: '+
IntToStr(PE^.Familia.NumPess));

For J:=1 To PE^.Familia.NumPess Do


Begin;
PP:=PE^.Familia.Membros[J-1];
Str(PP^.Id:6,S);
Fillzero(S);
S:='Identificação: '+S;
S1:='Data de Nascimento: '+PP^.DataNasc.TextoData(1);
S2:='Data de óbito: '+PP^.DataObito.Textodata(1);

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

Listagem VIII.10 – Objetos descritores dos domínios físicos da edificação (cont.).


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

Listagem VIII.10 – Objetos descritores dos domínios físicos da edificação (cont.).


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

Listagem VIII.10 – Objetos descritores dos domínios físicos da edificação (cont.).


PP^:=Mul;
// busca um "Id" de pessoa livre na familia
// para cada um dos 7 possíveis "Ids"
For W:=(10000*I+100*1+1) To (10000*I+100*1+7) Do
Begin;
K:=1; // verifica se já está alocado
Repeat
PP1:=PE^.Familia.Membros[K-1];
If PP1^.Id=W then break; // se já está
// alocado parte
// para outro
Inc(K);
Until K>PE^.FFamilia.NumPess;
If K>PE^.FFamilia.NumPess Then
break; // se não encontrou alocado é
// porque achou um "Id" livre
// não precisa buscar mais.
End;
Pes:=TPessoa.Create(W);
Pes.DataNasc:=DetermDataNasc(DHoje);

// a probabilidade de sexo do recém nascido


// é de 50-50%.
case Dado(2) of

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;

var I,J,K: cardinal;


PE: ^TEconomia;

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

Listagem VIII.10 – Objetos descritores dos domínios físicos da edificação (cont.).


//--------------------------------------------------------------------------
end.

Listagem VIII.11 – Implementação da fila de atendimento.


//--------------------------------------------------------------------------
//
// Biblioteca de implementação para
// estruturas de dados do tipo "Fila"
// com atendimento FIFO - First In
// First out - ajustada para elementos
// do tipo "cardinal" utilizados para
// identificar os usuários.
//
//--------------------------------------------------------------------------
unit FilaCardinal;

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

Listagem VIII.11 – Implementação da fila de atendimento (cont.).


begin;
P1:=inherited AtendeProximo;
result:=P1^;
Dispose(P1);
end;
//--------------------------------------------------------------------------
end.

Listagem VIII.12 – Classe base para a fila de atendimento.


//--------------------------------------------------------------------------
//
// Biblioteca de implementação para
// estruturas de dados do tipo "Fila"
// com atendimento FIFO - First In
// First out.
//--------------------------------------------------------------------------
unit Fila;

interface

uses classes, dialogs, sysutils;

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;

constructor Create; virtual;


destructor Destroy; reintroduce;

procedure PoeNaFila(P: pointer); virtual;


function AtendeProximo: pointer; virtual;
end;

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

Listagem VIII.12 – Classe base para a fila de atendimento (cont.).


End;
inherited destroy;
End;
//--------------------------------------------------------------------------
procedure TFila.PoeNaFila(P:pointer);

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.

Listagem VIII.13 – Rotinas auxiliares.


//--------------------------------------------------------------------------
//
// Implementa uma série de
// rotinas auxiliares tanto para
// a simulação quanto para a
// apresentação de resultados
//
//--------------------------------------------------------------------------
unit Unit0;

interface

uses Dominios,Unit1, grids, SysUtils, RegVal, MyDelphiUnit02,


MyDelphiUnit04,stdctrls, Aparelho, windows, graphics, Barrilete;

// DirBase - local para busca dos arquivos de dados, em especial as


// distribuições estatísticas
//
// DirRelat - local padrão para gravação dos arquivos resultados

const DirBase = 'D:\Doutorado\Tese\Programas dos Exemplos\'+


'Exemplo do Capitulo 12\Arquivos de dados\';

DirRelat = 'D:\Doutorado\Tese\Programas dos Exemplos\'+


VIII-76

Listagem VIII.13 – Rotinas auxiliares (cont.).


'Exemplo do Capitulo 12\Relatorios\';

Type TArrayRegVaz = Array[1..28,1..6] of TRegVal;


// um conjunto de 6 cada economia; 1-chuveiro; 2-Lavatório;
// 3-Bacia Sanitária; 4-Pia de Cozinha; 5-Tanque de Lavar Roupa;
// 6-Máquina de lavar roupas;

var Predio1: TPredio;


Rede1: TBarrilete;
TempoParado: Boolean;

RegPop: Array[1..28] of TRegVal; // registro de população


SomaPop: TRegVal;

RegVaz:TArrayRegVaz; // registro de vazões

procedure AjustaColunaDeStringGrid(var SG:TStringGrid; NCol:integer);


procedure AjustaTodasAsColunasDeStringGrid(var SG:TStringGrid);
procedure AjustaLarguraTotalDeStringGrid(var SG:TStringGrid);
procedure InsereColunaAEsquerda(var SG:TStringGrid);
procedure RegistraPopulacaoDoDia(P:TPredio;var RV:array of TRegVal;
var RS:TRegVal; D:TData;H:THora);
procedure MostraUltimoRegDaPopulacao(RV:array of TRegVal; RS:TRegVal;
var SG:TStringGrid; var Soma:TLabel);
procedure MostraEstadoAparelhos(var SG:TStringGrid);
procedure MarcaGrade(var SG:TStringGrid; Ok:Boolean; C,R:Integer);
procedure RegistraVazaoAparelhos(P:TPredio;var RV:TArrayRegVaz;
D:TData;H:THora);
procedure CalcularRede(var P:TPredio; var R:TBarrilete);

implementation

procedure AjustaColunaDeStringGrid(var SG:TStringGrid; NCol:integer);


// seria mais correto definir uma classe descendente de stringGrid
// com esse método a mais, mas foi feito dessa forma para diminuir
// a quantidade de código no presente trabalho.

var MaxLarg: Integer;


S: String;
I,W: Integer;
FixCol: Integer;

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

Listagem VIII.13 – Rotinas auxiliares (cont.).


Begin;
For I:=0 To SG.ColCount-1 Do
AjustaColunaDeStringGrid(SG,I);
End;
//--------------------------------------------------------------------------
procedure AjustaLarguraTotalDeStringGrid(var SG:TStringGrid);

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

var I,N: Cardinal;


PE: ^TEconomia;
Soma: Cardinal;

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

Listagem VIII.13 – Rotinas auxiliares (cont.).


SG.Cells[7,I+1]:=IntToStr(Round(P^.Valor));
End;
SG.Cells[7,0]:=P^.Data.TextoData(0);
AjustaTodasAsColunasDeStringGrid(SG);
AjustaLarguraTotalDeStringGrid(SG);
End;
//--------------------------------------------------------------------------
procedure MarcaGrade(var SG:TStringGrid; Ok:Boolean; C,R:Integer);

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

var I,J,K,C,R: cardinal;


PE: ^TEconomia;

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

Listagem VIII.13 – Rotinas auxiliares (cont.).


Begin;
TReg:=Form1.RG2.ItemIndex;
With P Do
Begin;
For I:=0 To NumEcon-1 Do
Begin;
PE:=Economias[I];
With PE^ Do
Begin;
L:=0;
For J:=0 To NumGrupos-1 Do
For K:=0 To NumApaGrupo[J]-1 Do
Begin;
Inc(L);
Case TReg of

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

Listagem VIII.13 – Rotinas auxiliares (cont.).


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/60;
end;
End;

End;

End;
End;
End;
End;
End;
//--------------------------------------------------------------------------
procedure CalcularRede(var P:TPredio; var R:TBarrilete);

var PE: ^TEconomia;


EC: TEconomia;
I,Ap,Pv: cardinal;

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;

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;
(EC.GruposAP[1,0] as TApPiaDeCozinha).Pressao:=PC.Pressao;
(EC.GruposAp[2,0] as TApTanque).pressao:=TQ.Pressao;
(EC.GruposAp[3,0] as TMaqLavarCap4).pressao:=ML.Pressao;
End;
With R.ColPar[Ap].Ram[Pv] Do
Begin;
(EC.GruposAP[0,0] as TApChuveiro).pressao:=CH.pressao;
(EC.GruposAP[0,1] as TApLavatorio).pressao:=LV.Pressao;
VIII-81

Listagem VIII.13 – Rotinas auxiliares (cont.).


(EC.GruposAP[0,2] as TApBaciaSanitaria6L).pressao:=LV.Pressao;
End;
End;
End;
//--------------------------------------------------------------------------
end.

Listagem VIII.14 – Resposta aos componentes do formulário principal.


//--------------------------------------------------------------------------
//
// Implementa o formulário principal
//
//--------------------------------------------------------------------------
unit Unit1;

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

Listagem VIII.14 – Resposta aos componentes do formulário principal (cont.).


{ Private declarations }
FirstAtivation:Boolean;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Unit0, Dominios, MyDelphiUnit01, MyDelphiUnit02, MyDelphiUnit04,


RegVal, DistrHidra, Barrilete, Aparelho;

{$R *.DFM}
//--------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);

var I,J: Integer;

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

Predio1:=TPredio.Create(Form1,RelPrincipal.RData,28,0.1); // 10% unidades


// desocupadas
Rede1:=TBarrilete.Create;

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;

Rede1.HLamina:=1; // 1m de lâmina na entrada do reservatório

With SG1 Do
VIII-83

Listagem VIII.14 – Resposta aos componentes do formulário principal (cont.).


begin;
RowCount:=Predio1.NumEcon+1;
ColCount:=8;
Cells[0,0]:='Apto.';
For I:=1 To Predio1.NumEcon Do Cells[0,I]:=IntToStr(I);
AjustaTodasAsColunasDeStringGrid(SG1);
AjustaLarguraTotalDeStringGrid(SG1);
End;

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;

For I:=1 To Predio1.NumEcon Do RegPop[I]:=TRegVal.Create(Form1);


SomaPop:=TRegVal.create(Form1);

RegistraPopulacaoDoDia(Predio1,RegPop,SomaPop,RelPrincipal.RData,RelPrincipal
.RHora);
MostraUltimoRegDaPopulacao(RegPop,SomaPop,SG1,DispSomaPop);

For I:=1 To Predio1.NumEcon Do


For J:=1 To 6 Do RegVaz[I,J]:=TRegVal.create(Form1);

For I:=1 To Predio1.NumEcon Do RegVaz[I,1].Caption:='chuveiro';


For I:=1 To Predio1.NumEcon Do RegVaz[I,2].Caption:='lavatório';
For I:=1 To Predio1.NumEcon Do RegVaz[I,3].Caption:='bacia sanitária';
For I:=1 To Predio1.NumEcon Do RegVaz[I,4].Caption:='pia de cozinha';
For I:=1 To Predio1.NumEcon Do
RegVaz[I,5].Caption:='tanque de lavar roupas';
For I:=1 To Predio1.NumEcon Do
RegVaz[I,6].Caption:='máquina de lavar roupas';

CBox1.ItemIndex:=0;
end;
//--------------------------------------------------------------------------
procedure TForm1.FormDestroy(Sender: TObject);

var I,J: Cardinal;

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

Listagem VIII.14 – Resposta aos componentes do formulário principal (cont.).


//--------------------------------------------------------------------------
procedure TForm1.RelPrincipalMudaHora(Sender: TObject);

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;

While not TempoParado Do


Begin;
Application.ProcessMessages;
// Esperar(200);
RelPrincipal.Incrementa;
End;
end;
//--------------------------------------------------------------------------
procedure TForm1.Timer1Timer(Sender: TObject);

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

Listagem VIII.14 – Resposta aos componentes do formulário principal (cont.).


End;
end;
//--------------------------------------------------------------------------
procedure TForm1.Button2Click(Sender: TObject);

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

For I:=0 To SomaPop.n-1 Do


Begin;
S:='';
For J:=1 To Predio1.NumEcon Do
Begin;
P:=RegPop[J].Lista[I];
S:=S+' '+IntToStr(Round(P^.Valor));
End;
P:=SomaPop.Lista[I];
S:=P^.Data.TextoData(1)+' '+S+' '+IntToStr(Round(P^.Valor));
Writeln(F,S);
End;

CloseFile(F);
End;

If not TPar Then Button1.Click;


End;
//--------------------------------------------------------------------------
procedure TForm1.RG1Click(Sender: TObject);
begin
Case RG1.ItemIndex of

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

Listagem VIII.14 – Resposta aos componentes do formulário principal (cont.).


var I,J,K:Integer;
S,S1: String;
TGrav: integer;
F: TextFile;
PR: TPTRegPonto;

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

0: Begin; // arquivos individuais


For I:=1 To 28 Do
For J:=1 To 6 Do
If (CBox1.ItemIndex=0) or (CBox1.ItemIndex=J) Then
Begin;
Str(100*I+J:4,S);
FillZero(S);
S:=DirRelat+'vazão-'+S+'.txt';
RegVaz[I,J].GravaArquivo(S,' ');
End;
ShowMessage('Gravação encerrada.');
End;

1: Begin; // arquivo único agrupado por apartamento


If SD2.Execute Then
Begin;
S:=SD2.FileName;
AssignFile(F,S);
Rewrite(F);
S:='Data Hora ';
For I:=1 To 28 Do For J:=1 To 6 Do
If (CBox1.ItemIndex=0) or (CBox1.ItemIndex=J) Then
Begin;
Str(I:2,S1);
FillZero(S1);
S:=S+'Apto-'+S1;
Str(J:1,S1);
S:=S+'/Aparelho-'+S1+' ';
End;
Writeln(F,S);

For I:=0 To RegVaz[1,1].Lista.Count-1 Do


Begin;
PR:=Regvaz[1,1].Lista[I];
S:=PR^.data.TextoData(0)+' ';
S:=S+PR^.Hora.textoHora(1)+' ';
For J:=1 To 28 Do
For K:=1 To 6 Do
If (CBox1.ItemIndex=0) or (CBox1.ItemIndex=K) Then
Begin;
PR:=RegVaz[J,K].Lista[I];
S1:=Format('%.5e',[PR^.Valor]);
S:=S+S1+' ';
End;
VIII-87

Listagem VIII.14 – Resposta aos componentes do formulário principal (cont.).


Writeln(F,S);
End;
CloseFile(F);
ShowMessage('Gravação encerrada.');
End;
End;

2: Begin; // arquivo único agrupado por aparelho


If SD2.Execute Then
Begin;
S:=SD2.FileName;
AssignFile(F,S);
Rewrite(F);
S:='Data Hora ';
For J:=1 To 6 Do For I:=1 To 28 Do
If (CBox1.ItemIndex=0) or (CBox1.ItemIndex=J) Then
Begin;
Str(J:1,S1);
S:=S+'Aparelho-'+S1;
Str(I:2,S1);
FillZero(S1);
S:=S+'/Apto-'+S1+' ';
End;
Writeln(F,S);

For I:=0 To RegVaz[1,1].Lista.Count-1 Do


Begin;
PR:=Regvaz[1,1].Lista[I];
S:=PR^.data.TextoData(0)+' ';
S:=S+PR^.Hora.textoHora(1)+' ';
For K:=1 To 6 Do
For J:=1 To 28 Do
If (CBox1.ItemIndex=0) or (CBox1.ItemIndex=K) Then
Begin;
PR:=RegVaz[J,K].Lista[I];
S1:=Format('%.5e',[PR^.Valor]);
S:=S+S1+' ';
End;
Writeln(F,S);
End;
CloseFile(F);
ShowMessage('Gravação encerrada.');
End;
End;

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

Listagem VIII.14 – Resposta aos componentes do formulário principal (cont.).


Button1.Enabled:=True;
Button2.Enabled:=True;
Button3.Enabled:=True;
End;
end;
//--------------------------------------------------------------------------
end.

Listagem VIII.15 – Descrição do formulário principal.


object Form1: TForm1
Left = 14
Top = 122
Width = 718
Height = 428
Caption = 'Exemplo do Capítulo 12'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poDesktopCenter
WindowState = wsMaximized
OnActivate = FormActivate
OnCreate = FormCreate
OnDestroy = FormDestroy
PixelsPerInch = 96
TextHeight = 13
object DataDisp: TLabel
Left = 8
Top = 32
Width = 129
Height = 26
Alignment = taCenter
AutoSize = False
Caption = '12/01/2001'
Color = clBlack
Font.Charset = ANSI_CHARSET
Font.Color = clYellow
Font.Height = -27
Font.Name = 'LcdD'
Font.Style = []
ParentColor = False
ParentFont = False
end
object TimeDisp: TLabel
Left = 8
Top = 64
Width = 129
Height = 26
Alignment = taCenter
AutoSize = False
Caption = '12:00:00'
Color = clBlack
Font.Charset = ANSI_CHARSET
Font.Color = clYellow
Font.Height = -27
Font.Name = 'Quartz'
Font.Style = [fsItalic]
ParentColor = False
VIII-89

Listagem VIII.15 – Descrição do formulário principal (cont.).


ParentFont = False
end
object Label1: TLabel
Left = 16
Top = 11
Width = 112
Height = 17
Caption = 'Tempo simulado.'
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -15
Font.Name = 'Times New Roman'
Font.Style = [fsBold]
ParentFont = False
end
object Label2: TLabel
Left = 349
Top = 11
Width = 79
Height = 17
Caption = 'Tempo real.'
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -15
Font.Name = 'Times New Roman'
Font.Style = [fsBold]
ParentFont = False
end
object DispHoraReal: TLabel
Left = 324
Top = 64
Width = 129
Height = 26
Alignment = taCenter
AutoSize = False
Caption = '12:00:00'
Color = clBlack
Font.Charset = ANSI_CHARSET
Font.Color = clLime
Font.Height = -27
Font.Name = 'Quartz'
Font.Style = [fsItalic]
ParentColor = False
ParentFont = False
end
object DispDataReal: TLabel
Left = 324
Top = 32
Width = 129
Height = 26
Alignment = taCenter
AutoSize = False
Caption = '12/01/2001'
Color = clBlack
Font.Charset = ANSI_CHARSET
Font.Color = clLime
Font.Height = -27
Font.Name = 'LcdD'
Font.Style = []
ParentColor = False
ParentFont = False
end
object Button1: TButton
Left = 8
VIII-90

Listagem VIII.15 – Descrição do formulário principal (cont.).


Top = 96
Width = 129
Height = 25
Caption = 'Button1'
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -16
Font.Name = 'Times New Roman'
Font.Style = [fsBold]
ParentFont = False
TabOrder = 0
OnClick = Button1Click
end
object PC1: TPageControl
Left = 0
Top = 121
Width = 694
Height = 409
ActivePage = TS2
Align = alBottom
TabOrder = 1
object TS1: TTabSheet
Caption = 'População'
object DispSomaPop: TLabel
Left = 567
Top = 31
Width = 34
Height = 18
Caption = '117'
Font.Charset = OEM_CHARSET
Font.Color = clWindowText
Font.Height = -19
Font.Name = 'Terminal'
Font.Style = [fsBold]
ParentFont = False
end
object Label3: TLabel
Left = 533
Top = 8
Width = 102
Height = 19
Caption = 'População Total:'
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -16
Font.Name = 'Times New Roman'
Font.Style = []
ParentFont = False
end
object Bevel1: TBevel
Left = 528
Top = 0
Width = 113
Height = 57
Style = bsRaised
end
object SG1: TStringGrid
Left = 8
Top = 8
Width = 345
Height = 361
TabOrder = 0
end
object Button2: TButton
VIII-91

Listagem VIII.15 – Descrição do formulário principal (cont.).


Left = 528
Top = 72
Width = 113
Height = 41
Caption = 'Salvar'
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -16
Font.Name = 'Times New Roman'
Font.Style = [fsBold]
ParentFont = False
TabOrder = 1
OnClick = Button2Click
end
end
object TS2: TTabSheet
Caption = 'Aparelhos'
ImageIndex = 1
object Label4: TLabel
Left = 464
Top = 180
Width = 144
Height = 13
Caption = 'Aparelhos a serem registrados:'
end
object SG2: TStringGrid
Left = 8
Top = 8
Width = 441
Height = 361
DefaultRowHeight = 12
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -8
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
TabOrder = 0
end
object Button3: TButton
Left = 464
Top = 234
Width = 233
Height = 25
Caption = 'Salvar Vazões'
TabOrder = 1
OnClick = Button3Click
end
object RG2: TRadioGroup
Left = 464
Top = 4
Width = 233
Height = 73
Caption = 'Intervalo de registro'
ItemIndex = 2
Items.Strings = (
'1 segundo'
'5 segundos'
'1 minuto')
TabOrder = 2
end
object RG3: TRadioGroup
Left = 464
Top = 88
VIII-92

Listagem VIII.15 – Descrição do formulário principal (cont.).


Width = 233
Height = 81
Caption = 'Opções de gravação'
ItemIndex = 2
Items.Strings = (
'arquivos individuais'
'arquivo único agrupado por apartamento'
'arquivo único agrupado por aparelho')
TabOrder = 3
end
object CBox1: TComboBox
Left = 464
Top = 196
Width = 233
Height = 21
ItemHeight = 13
Items.Strings = (
'0 - Todos'
'1 - Chuveiro'
'2 - Lavatório'
'3 - Bacia sanitária'
'4 - Pia de cozinha'
'5 - Tanque de lavar roupas'
'6 - Máquina de lavar roupas')
TabOrder = 4
Text = '0 - Todos'
end
end
end
object RG1: TRadioGroup
Left = 144
Top = 32
Width = 169
Height = 57
Caption = 'Incremento de tempo simulado'
ItemIndex = 0
Items.Strings = (
'1 segundo'
'1 dia')
TabOrder = 2
OnClick = RG1Click
end
object CB1: TCheckBox
Left = 144
Top = 96
Width = 105
Height = 17
Caption = 'Parar a cada dia'
Checked = True
State = cbChecked
TabOrder = 3
end
object RelPrincipal: TRelCalend
SData = '01/01/2000'
SHora = '00:00:00,000'
PassoTimer = 1000
Incdata = '000/000/000'
IncHora = '000:00:01.000'
OnMudaData = RelPrincipalMudaData
OnMudaHora = RelPrincipalMudaHora
Left = 136
end
object Timer1: TTimer
OnTimer = Timer1Timer
VIII-93

Listagem VIII.15 – Descrição do formulário principal (cont.).


Left = 372
Top = 96
end
object SD1: TSaveDialog
DefaultExt = '*.txt'
Filter = 'Arquivos de texto (*.txt)|*.txt|Todos os arquivos (*.*)|*.*'
Options = [ofOverwritePrompt, ofHideReadOnly, ofEnableSizing]
Title = 'Arquivo de população'
Left = 484
Top = 24
end
object SD2: TSaveDialog
DefaultExt = '*.txt'
Filter = 'Arquivos de texto (*.txt)|*.txt|Todos os arquivos (*.*)|*.*'
Options = [ofOverwritePrompt, ofHideReadOnly, ofEnableSizing]
Title = 'Arquivo de vazão nos aparelhos'
Left = 532
Top = 24
end
end

Listagem VIII.16 – Programa principal.


//--------------------------------------------------------------------------
//
// Exemplo do capítulo 12
// Programa principal.
//
//
//--------------------------------------------------------------------------
program Cap_12;

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.

Você também pode gostar