Biblioteca de funções psicrométricas para calcular propriedades termodinâmicas do ar para Python, C, C#, Fortran, JavaScript e VBA/Excel
Visão global
A psicrometria é o estudo das propriedades físicas e termodinâmicas do ar úmido. Estas propriedades incluem, por exemplo, a temperatura do ponto de orvalho do ar, a temperatura do bulbo úmido, a umidade relativa, a taxa de umidade e a entalpia.
A estimativa dessas propriedades é crítica em diversas aplicações científicas e de engenharia, como aquecimento, ventilação e ar condicionado (HVAC) e meteorologia. Embora fórmulas para calcular as propriedades psicrométricas do ar estejam amplamente disponíveis na literatura (@ Stull2011;@Wexler1983;@Stoecker1982;@Dilley1968;@Humphreys1920), sua implementação em programas de computador ou planilhas pode ser desafiadora e demorada.
PsychroLib é uma biblioteca de funções que permite o cálculo das propriedades psicrométricas do ar úmido e seco. A biblioteca está disponível para Python, C, C#, Fortran, JavaScript, Microsoft Excel Visual Basic for Applications (VBA). Funciona em sistemas de unidades métricos (SI) e imperiais (IP). As funções são baseadas em fórmulas do Manual ASHRAE 2017 – Fundamentos, Capítulo 1, edições SI e IP. As funções podem ser agrupadas em duas categorias:
- Funções para cálculo da temperatura do ponto de orvalho, temperatura de bulbo úmido, pressão parcial de vapor da água, razão de umidade ou umidade relativa, conhecendo qualquer outra destas e temperatura de bulbo seco e pressão atmosférica.
- Funções para cálculo de outras propriedades do ar úmido. Todos estes usam a taxa de umidade como entrada.
Pitão
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 | # PsychroLib (versão 2.3.0) (https://github.com/psychrometrics/psychrolib) # Copyright (c) 2018 D. Thevenard e D. Meyer para a implementação atual da biblioteca # Copyright (c) Manual ASHRAE 2017 - Fundamentos para equações e coeficientes ASHRAE # Licenciado sob a licença MIT. """ psicrolib.py Contém funções para calcular propriedades termodinâmicas de misturas gás-vapor e atmosfera padrão adequada para a maioria das aplicações de engenharia, físicas e meteorológicas formulários. A maioria das funções é uma implementação das fórmulas encontradas no Manual ASHRAE 2017 - Fundamentos, tanto no Sistema Internacional (SI), e unidades imperiais (IP). Consulte as informações incluídas em cada função para sua respectiva referência. Exemplo >>> importar psicrolib >>> # Defina o sistema de unidades, por exemplo, para SI (pode ser psychrolib.SI ou psychrolib.IP) >>> psicrolib.SetUnitSystem(psicrolib.SI) >>> # Calcule a temperatura do ponto de orvalho para uma temperatura de bulbo seco de 25 C e uma umidade relativa de 80% >>> TDewPoint = psicrolib.GetTDewPointFromRelHum(25,0, 0,80) >>> imprimir(TDewPoint) 21.309397163661785 Direitos autorais - Para a implementação atual da biblioteca Copyright (c) 2018 D. Thevenard e D. Meyer. - Para equações e coeficientes publicados Manual ASHRAE - Fundamentos, Capítulo 1 Copyright (c) Manual ASHRAE 2017 - Fundamentos (https://www.ashrae.org) Licença MIT (https://github.com/psychrometrics/psychrolib/LICENSE.txt) Nota dos Autores Fizemos todos os esforços para garantir que o código seja adequado, no entanto, não fazemos representação no que diz respeito à sua precisão. Use por sua conta e risco. Você deveria notar um erro ou se você tiver uma sugestão, avise-nos através do GitHub em https://github.com/psychrometrics/psychrolib/issues. "" " importar matemática a partir de enum importar Enum, auto a partir de digitando importar Opcional ################################################# ################################################# ### # Constantes globais ################################################# ################################################# ### ZERO_FAHRENHEIT_AS_RANKINE = 459.67 """float: Zero grau Fahrenheit (°F) expresso como grau Rankine (°R) Unidades: ° R Referência: Manual ASHRAE - Fundamentos (2017) cap. 39 "" " ZERO_CELSIUS_AS_KELVIN = 273.15 """float: Zero grau Celsius (°C) expresso como Kelvin (K) Unidades: K Referência: Manual ASHRAE - Fundamentos (2017) cap. 39 "" " R_DA_IP = 53.350 """float: Constante de gás universal para ar seco (versão IP) Unidades: pés lb_Force lb_DryAir⁻¹ R⁻¹ Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 "" " R_DA_SI = 287.042 """float: Constante de gás universal para ar seco (versão SI) Unidades: J kg_DryAir⁻¹ K⁻¹ Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 "" " MAX_ITER_COUNT = 100 """int: Número máximo de iterações antes de sair dos loops while. "" " MIN_HUM_RATIO = 1e-7 """float: Razão de umidade mínima aceitável usada/devolvida por qualquer função. Qualquer valor acima de 0 ou abaixo de MIN_HUM_RATIO será redefinido para este valor. "" " FREEZING_POINT_WATER_IP = 32.0 """float: Ponto de congelamento da água em Fahrenheit. "" " FREEZING_POINT_WATER_SI = 0.0 """float: Ponto de congelamento da água em Celsius. "" " TRIPLE_POINT_WATER_IP = 32.018 """float: Ponto triplo da água em Fahrenheit. "" " TRIPLE_POINT_WATER_SI = 0.01 """float: Ponto triplo da água em Celsius. "" " ################################################# ################################################# ### # Funções auxiliares ################################################# ################################################# ### # Sistema de unidades a ser usado. classe UnitSystem(Enum): "" " Classe privada não exposta usada para definir valores de enumeração automática. "" " IP = auto() SI = auto() IP = UnidadeSistema.IP SI = SistemaUnitário.SI PSYCHROLIB_UNITS = Nenhum PSYCHROLIB_TOLERANCE = 1.0 # Tolerância de cálculos de temperatura def SetUnitSystem(Unidades: Sistema de Unidades) -> Nenhum: "" " Defina o sistema de unidades a ser usado (SI ou IP). Args: Unidades: string indicando o sistema de unidades escolhido (SI ou IP) Notas: Esta função *TEM QUE SER CHAMADA* antes que a biblioteca possa ser usada "" " global PSYCHROLIB_UNITS global PSYCHROLIB_TOLERANCE se não isinstance(Unidades, Sistema de Unidade): levantar ValueError("O sistema de unidades deve ser SI ou IP.") PSYCHROLIB_UNITS = Unidades # Definir tolerância nos cálculos de temperatura # A tolerância é a mesma em IP e SI se Unidades == IP: PSYCHROLIB_TOLERANCE = 0.001 * 9. / 5. outro: PSYCHROLIB_TOLERANCE = 0.001 def GetUnitSystem() -> Opcional[UnitSystem]: "" " Sistema de retorno de unidades em uso. "" " Retorna PSYCHROLIB_UNITS def isIP() -> bool: "" " Verifique se o sistema em uso é IP ou SI. "" " se PSYCHROLIB_UNITS == IP: Retorna Verdade elif PSYCHROLIB_UNITS == SI: Retorna Falso outro: levantar ValueError('O sistema de unidades não foi definido.') ################################################# ################################################# ### # Conversão entre unidades de temperatura ################################################# ################################################# ### def GetTRankineFromTFahrenheit(TFahrenheit: flutuador) -> flutuador: "" " Função utilitária para converter temperatura em grau Rankine (°R) dada temperatura em graus Fahrenheit (°F). Args: TRankine: Temperatura em graus Fahrenheit (°F) Retorna: Temperatura em graus Rankine (°R) Referência: Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 seção 3 Notas: Conversão exata. "" " TRankine = TFahrenheit + ZERO_FAHRENHEIT_AS_RANKINE Retorna TRankine def GetTFahrenheitFromTRankine(TRankine: flutuador) -> flutuador: "" " Função utilitária para converter temperatura em graus Fahrenheit (°F) dada temperatura em graus Rankine (°R). Args: TRankin: Temperatura em graus Rankine (°R) Retorna: Temperatura em graus Fahrenheit (°F) Referência: Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 seção 3 Notas: Conversão exata. "" " Retorna TRankine - ZERO_FAHRENHEIT_AS_RANKINE def ObterTKelvinFromTCelsius(TCelsius: flutuador) -> flutuador: "" " Função utilitária para converter temperatura em Kelvin (K) dada temperatura em graus Celsius (°C). Args: TCelsius: Temperatura em graus Celsius (°C) Retorna: Temperatura em Kelvin (K) Referência: Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 seção 3 Notas: Conversão exata. "" " TKelvin = TCelsius + ZERO_CELSIUS_AS_KELVIN Retorna TKelvin def ObterTCelsiusFromTKelvin(TKelvin: flutuador) -> flutuador: "" " Função utilitária para converter temperatura em graus Celsius (°C) dada temperatura em Kelvin (K). Args: TKelvin: Temperatura em Kelvin (K) Retorna: Temperatura em graus Celsius (°C) Referência: Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 seção 3 Notas: Conversão exata. "" " Retorna TKelvin - ZERO_CELSIUS_AS_KELVIN ################################################# ################################################# ### # Conversões entre ponto de orvalho, bulbo úmido e umidade relativa ################################################# ################################################# ### def GetTWetBulbFromTDewPoint(TDryBulb: flutuador, TDewPoint: flutuador, Pressão: flutuador) -> flutuador: "" " Retorna a temperatura do bulbo úmido dada a temperatura do bulbo seco, a temperatura do ponto de orvalho e a pressão. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] TDewPoint: Temperatura do ponto de orvalho em °F [IP] ou °C [SI] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: Temperatura de bulbo úmido em °F [IP] ou °C [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 "" " se TDewPoint > TDryBulb: levantar ValueError("A temperatura do ponto de orvalho está acima da temperatura do bulbo seco") HumRatio = GetHumRatioFromTDewPoint(TDewPoint, Pressão) TWetBulb = GetTWetBulbFromHumRatio(TDryBulb, HumRatio, Pressão) Retorna TWetBulb def GetTWetBulbFromRelHum(TDryBulb: flutuador, RelHum: flutuador, Pressão: flutuador) -> flutuador: "" " Retorna a temperatura de bulbo úmido dada a temperatura de bulbo seco, umidade relativa e pressão. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] RelHum: Umidade relativa na faixa [0, 1] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: Temperatura de bulbo úmido em °F [IP] ou °C [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 "" " se RelHum < 0 ou RelHum > 1: levantar ValueError("A umidade relativa está fora da faixa [0, 1]") HumRatio = GetHumRatioFromRelHum(TDryBulb, RelHum, Pressão) TWetBulb = GetTWetBulbFromHumRatio(TDryBulb, HumRatio, Pressão) Retorna TWetBulb def GetRelHumFromTDewPoint(TDryBulb: flutuador, TDewPoint: flutuador) -> flutuador: "" " Retorna a umidade relativa dada a temperatura de bulbo seco e a temperatura do ponto de orvalho. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] TDewPoint: Temperatura do ponto de orvalho em °F [IP] ou °C [SI] Retorna: Umidade relativa na faixa [0, 1] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 equação 22 "" " se TDewPoint > TDryBulb: levantar ValueError("A temperatura do ponto de orvalho está acima da temperatura do bulbo seco") VapPres = GetSatVapPres(TDewPoint) SatVapPres = GetSatVapPres(TDryBulb) RelHum = VapPres / SatVapPres Retorna RelHum def GetRelHumFromTWetBulb(TDryBulb: flutuador, TWetBulb: flutuador, Pressão: flutuador) -> flutuador: "" " Retorna a umidade relativa dada a temperatura de bulbo seco, temperatura e pressão de bulbo úmido. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] TWetBulb: Temperatura de bulbo úmido em °F [IP] ou °C [SI] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: Umidade relativa na faixa [0, 1] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 "" " se TWetBulb > TDryBulb: levantar ValueError(“A temperatura do bulbo úmido está acima da temperatura do bulbo seco”) HumRatio = GetHumRatioFromTWetBulb(TDryBulb, TWetBulb, Pressão) RelHum = GetRelHumFromHumRatio(TDryBulb, HumRatio, Pressão) Retorna RelHum def GetTDewPointFromRelHum(TDryBulb: flutuador, RelHum: flutuador) -> flutuador: "" " Temperatura de retorno do ponto de orvalho dada a temperatura de bulbo seco e umidade relativa. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] RelHum: Umidade relativa na faixa [0, 1] Retorna: Temperatura do ponto de orvalho em °F [IP] ou °C [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 "" " se RelHum < 0 ou RelHum > 1: levantar ValueError("A umidade relativa está fora da faixa [0, 1]") VapPres = GetVapPresFromRelHum(TDryBulb, RelHum) TDewPoint = GetTDewPointFromVapPres(TDryBulb, VapPres) Retorna TDewPoint def ObterTDewPointFromTWetBulb(TDryBulb: flutuador, TWetBulb: flutuador, Pressão: flutuador) -> flutuador: "" " Temperatura de retorno do ponto de orvalho dada a temperatura de bulbo seco, temperatura de bulbo úmido e pressão. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] TWetBulb: Temperatura de bulbo úmido em °F [IP] ou °C [SI] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: Temperatura do ponto de orvalho em °F [IP] ou °C [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 "" " se TWetBulb > TDryBulb: levantar ValueError(“A temperatura do bulbo úmido está acima da temperatura do bulbo seco”) HumRatio = GetHumRatioFromTWetBulb(TDryBulb, TWetBulb, Pressão) TDewPoint = GetTDewPointFromHumRatio(TDryBulb, HumRatio, Pressão) Retorna TDewPoint ################################################# ################################################# ### # Conversões entre ponto de orvalho ou umidade relativa e pressão de vapor ################################################# ################################################# ### def GetVapPresFromRelHum(TDryBulb: flutuador, RelHum: flutuador) -> flutuador: "" " Retorna a pressão parcial do vapor d'água em função da umidade relativa e da temperatura. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] RelHum: Umidade relativa na faixa [0, 1] Retorna: Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 12, 22 "" " se RelHum < 0 ou RelHum > 1: levantar ValueError("A umidade relativa está fora da faixa [0, 1]") VapPres = RelHum * GetSatVapPres(TDryBulb) Retorna VapPres def GetRelHumFromVapPres(TDryBulb: flutuador, VapPres: flutuador) -> flutuador: "" " Retorna a umidade relativa dada a temperatura de bulbo seco e a pressão de vapor. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] VapPres: Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] Retorna: Umidade relativa na faixa [0, 1] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 12, 22 "" " se VapPres < 0: levantar ValueError(“A pressão parcial do vapor d'água no ar úmido não pode ser negativa”) RelHum = VapPres / GetSatVapPres(TDryBulb) Retorna RelHum def dLnPws_(TDryBulb: flutuador) -> flutuador: "" " Função auxiliar retornando a derivada do logaritmo natural da pressão de vapor de saturação em função da temperatura de bulbo seco. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] Retorna: Derivada do logaritmo natural da pressão de vapor do ar saturado em Psi [IP] ou Pa [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 equação 5 e 6 "" " se isIP (): T = GetTRankineFromTFahrenheit(TDryBulb) se TDryBulb <= TRIPLE_POINT_WATER_IP: dLnPws = 1.0214165E+04 / matemática.pow(T, 2) - 5.3765794E-03 + 2 * 1.9202377E-07 * T \ + 3 * 3.5575832E-10 * matemática.pow(T, 2) - 4 * 9.0344688E-14 * matemática.pow(T, 3) + 4.1635019 / T outro: dLnPws = 1.0440397E+04 / matemática.pow(T, 2) - 2.7022355E-02 + 2 * 1.2890360E-05 * T \ - 3 * 2.4780681E-09 * matemática.pow(T, 2) + 6.5459673 / T outro: T = ObterTKelvinFromTCelsius(TDryBulb) se TDryBulb <= TRIPLE_POINT_WATER_SI: dLnPws = 5.6745359E+03 / matemática.pow(T, 2) - 9.677843E-03 + 2 * 6.2215701E-07 * T \ + 3 * 2.0747825E-09 * matemática.pow(T, 2) - 4 * 9.484024E-13 * matemática.pow(T, 3) + 4.1635019 / T outro: dLnPws = 5.8002206E+03 / matemática.pow(T, 2) - 4.8640239E-02 + 2 * 4.1764768E-05 * T \ - 3 * 1.4452093E-08 * matemática.pow(T, 2) + 6.5459673 / T Retorna dLnPws def GetTDewPointFromVapPres(TDryBulb: flutuador, VapPres: flutuador) -> flutuador: "" " Temperatura de retorno do ponto de orvalho dada a temperatura de bulbo seco e a pressão de vapor. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] VapPres: Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] Retorna: Temperatura do ponto de orvalho em °F [IP] ou °C [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 5 e 6 Notas: A temperatura do ponto de orvalho é resolvida invertendo a equação que fornece a pressão do vapor de água na saturação da temperatura, em vez de usar as regressões fornecidas pela ASHRAE (eqn. 37 e 38) que são muito menos precisos e têm um faixa de validade mais estreita. O método Newton-Raphson (NR) é usado no logaritmo do vapor de água pressão em função da temperatura, que é uma função muito suave A convergência geralmente é alcançada em 3 a 5 iterações. TDryBulb não é realmente necessário aqui, apenas usado por conveniência. "" " se isIP (): BOUNDS = [-148, 392] outro: BOUNDS = [-100, 200] # Verificação de validade – limites fora dos quais uma solução não pode ser encontrada se VapPres < GetSatVapPres(LIMITES[0]) ou VapPres > GetSatVapPres(LIMITES[1]): levantar ValueError(“A pressão parcial do vapor d'água está fora da faixa de validade das equações”) # Usamos NR para aproximar a solução. # Primeiro palpite TDewPoint = TDryBulb # Valor calculado das temperaturas do ponto de orvalho, resolvido iterativamente lnVP = matemática.log(VapPres) # Pressão parcial de vapor de água no ar úmido índice = 1 enquanto Verdade: TDewPoint_iter = TDewPoint #TDewPoint usado no cálculo do NR lnVP_iter = matemática.log(GetSatVapPres(TDewPoint_iter)) # Derivada de função, calculada analiticamente d_lnVP = dLnPws_(TDewPoint_iter) # Nova estimativa, delimitada pelo domínio de pesquisa definido acima TDewPoint = TDewPoint_iter - (lnVP_iter - lnVP) / d_lnVP TDewPoint = max(TDewPoint, BOUNDS [0]) TDewPoint = min(TDewPoint, BOUNDS [1]) se ((math.fabs(TDewPoint - TDewPoint_iter) <= PSYCHROLIB_TOLERANCE)): pausa se (índice > MAX_ITER_COUNT): levantar ValueError("Convergência não alcançada em GetTDewPointFromVapPres. Parando.") índice = índice + 1 TDewPoint = min(TDewPoint, TDryBulb) Retorna TDewPoint def GetVapPresFromTDewPoint(TDewPoint: flutuador) -> flutuador: "" " Pressão de vapor de retorno dada a temperatura do ponto de orvalho. Args: TDewPoint: Temperatura do ponto de orvalho em °F [IP] ou °C [SI] Retorna: Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 equação 36 "" " VapPres = GetSatVapPres(TDewPoint) Retorna VapPres ################################################# ################################################# ### # Conversões de temperatura de bulbo úmido, temperatura de ponto de orvalho ou umidade relativa para proporção de umidade ################################################# ################################################# ### def GetTWetBulbFromHumRatio(TDryBulb: flutuador, HumRatio: flutuador, Pressão: flutuador) -> flutuador: "" " Retorna a temperatura de bulbo úmido dada a temperatura de bulbo seco, proporção de umidade e pressão. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] HumRatio: Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: Temperatura de bulbo úmido em °F [IP] ou °C [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eqn 33 e 35 resolvido para Tstar "" " se HumRatio < 0: levantar ValueError("A relação de umidade não pode ser negativa") LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) TDewPoint = GetTDewPointFromHumRatio(TDryBulb, LimitadaHumRatio, Pressão) #Suposições iniciais TWetBulbSup = TDryBulb TWetBulbInf = TDewPoint TWetBulb = (TWetBulbInf + TWetBulbSup) / 2 índice = 1 # Loop de bissecção enquanto ((TWetBulbSup - TWetBulbInf) > PSYCHROLIB_TOLERANCE): # Calcular a taxa de umidade na temperatura Tstar Wstar = GetHumRatioFromTWetBulb(TDryBulb, TWetBulb, Pressão) # Obtenha novos limites se Wstar > LimitadaHumRatio: TWetBulbSup = TWetBulb outro: TWetBulbInf = TWetBulb # Nova estimativa da temperatura do bulbo úmido TWetBulb = (TWetBulbSup + TWetBulbInf) / 2 se (índice > = MAX_ITER_COUNT): levantar ValueError("Convergência não alcançada em GetTWetBulbFromHumRatio. Parando.") índice = índice + 1 Retorna TWetBulb def ObterHumRatioFromTWetBulb(TDryBulb: flutuador, TWetBulb: flutuador, Pressão: flutuador) -> flutuador: "" " Razão de umidade de retorno dada a temperatura de bulbo seco, temperatura de bulbo úmido e pressão. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] TWetBulb: Temperatura de bulbo úmido em °F [IP] ou °C [SI] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 33 e 35 "" " se TWetBulb > TDryBulb: levantar ValueError(“A temperatura do bulbo úmido está acima da temperatura do bulbo seco”) Wsstar = GetSatHumRatio(TWetBulb, Pressão) se isIP (): se TWetBulb > = FREEZING_POINT_WATER_IP: HumRatio = ((1093 - 0.556 * TWetBulb) * Wsstar - 0.240 * (TDryBulb - TWetBulb)) \ / (1093 + 0.444 * TDryBulb - TWetBulb) outro: HumRatio = ((1220 - 0.04 * TWetBulb) * Wsstar - 0.240 * (TDryBulb - TWetBulb)) \ / (1220 + 0.444 * TDryBulb - 0.48* TWetBulb) outro: se TWetBulb > = FREEZING_POINT_WATER_SI: HumRatio = ((2501. - 2.326 * TWetBulb) * Wsstar - 1.006 * (TDryBulb - TWetBulb)) \ / (2501. + 1.86 * TDryBulb - 4.186 * TWetBulb) outro: HumRatio = ((2830. - 0.24 * TWetBulb) * Wsstar - 1.006 * (TDryBulb - TWetBulb)) \ / (2830. + 1.86 * TDryBulb - 2.1 * TWetBulb) # Verificação de validade. Retorna max(HumRatio, MIN_HUM_RATIO) def GetHumRatioFromRelHum(TDryBulb: flutuador, RelHum: flutuador, Pressão: flutuador) -> flutuador: "" " Proporção de umidade de retorno dada a temperatura de bulbo seco, umidade relativa e pressão. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] RelHum: Umidade relativa na faixa [0, 1] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 "" " se RelHum < 0 ou RelHum > 1: levantar ValueError("A umidade relativa está fora da faixa [0, 1]") VapPres = GetVapPresFromRelHum(TDryBulb, RelHum) HumRatio = GetHumRatioFromVapPres(VapPres, Pressão) Retorna HumRatio def GetRelHumFromHumRatio(TDryBulb: flutuador, HumRatio: flutuador, Pressão: flutuador) -> flutuador: "" " Retorna a umidade relativa dada a temperatura de bulbo seco, taxa de umidade e pressão. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] HumRatio: Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: Umidade relativa na faixa [0, 1] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 "" " se HumRatio < 0: levantar ValueError("A relação de umidade não pode ser negativa") VapPres = GetVapPresFromHumRatio(HumRatio, Pressão) RelHum = GetRelHumFromVapPres(TDryBulb, VapPres) Retorna RelHum def GetHumRatioFromTDewPoint(TDewPoint: flutuador, Pressão: flutuador) -> flutuador: "" " Proporção de umidade de retorno dada a temperatura e pressão do ponto de orvalho. Args: TDewPoint: Temperatura do ponto de orvalho em °F [IP] ou °C [SI] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 equação 13 "" " VapPres = GetSatVapPres(TDewPoint) HumRatio = GetHumRatioFromVapPres(VapPres, Pressão) Retorna HumRatio def ObterTDewPointFromHumRatio(TDryBulb: flutuador, HumRatio: flutuador, Pressão: flutuador) -> flutuador: "" " Temperatura de retorno do ponto de orvalho dada a temperatura de bulbo seco, taxa de umidade e pressão. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] HumRatio: Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: Temperatura do ponto de orvalho em °F [IP] ou °C [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 "" " se HumRatio < 0: levantar ValueError("A relação de umidade não pode ser negativa") VapPres = GetVapPresFromHumRatio(HumRatio, Pressão) TDewPoint = GetTDewPointFromVapPres(TDryBulb, VapPres) Retorna TDewPoint ################################################# ################################################# ### # Conversões entre relação de umidade e pressão de vapor ################################################# ################################################# ### def GetHumRatioFromVapPres(VapPres: flutuador, Pressão: flutuador) -> flutuador: "" " Razão de umidade de retorno dada a pressão de vapor de água e a pressão atmosférica. Args: VapPres: Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 equação 20 "" " se VapPres < 0: levantar ValueError(“A pressão parcial do vapor d'água no ar úmido não pode ser negativa”) HumRatio = 0.621945 * VapPres / (Pressão - VapPres) # Verificação de validade. Retorna max(HumRatio, MIN_HUM_RATIO) def GetVapPresFromHumRatio(HumRatio: flutuador, Pressão: flutuador) -> flutuador: "" " Pressão de vapor de retorno dada a relação de umidade e pressão. Args: HumRatio: Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eqn 20 resolvido para pw "" " se HumRatio < 0: levantar ValueError("A relação de umidade é negativa") LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) VapPres = Pressão * LimitadaHumRatio / (0.621945 + RazãoHum Limitada) Retorna VapPres ################################################# ################################################# ### # Conversões entre taxa de umidade e umidade específica ################################################# ################################################# ### def GetSpecificHumFromHumRatio(HumRatio: flutuador) -> flutuador: "" " Retorne a umidade específica da proporção de umidade (também conhecida como proporção de mistura). Args: HumRatio: Razão de umidade em lb_H₂O lb_Dry_Air⁻¹ [IP] ou kg_H₂O kg_Dry_Air⁻¹ [SI] Retorna: Umidade específica em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 equação 9b "" " se HumRatio < 0: levantar ValueError("A relação de umidade não pode ser negativa") LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) EspecíficoHum = LimitadaHumRatio / (1.0 + RazãoHum Limitada) Retorna EspecíficoHum def GetHumRatioFromSpecificHum(Hum específico: flutuador) -> flutuador: "" " Retorne a proporção de umidade (também conhecida como proporção de mistura) da umidade específica. Args: SpecificHum: umidade específica em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] Retorna: Razão de umidade em lb_H₂O lb_Dry_Air⁻¹ [IP] ou kg_H₂O kg_Dry_Air⁻¹ [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eqn 9b (resolvido para proporção de umidade) "" " se EspecíficoHum < 0.0 ou EspecíficoHum > = 1.0: levantar ValueError("A umidade específica está fora da faixa [0, 1[") HumRatio = EspecíficoHum / (1.0 - EspecíficoHum) # Verificação de validade. Retorna max(HumRatio, MIN_HUM_RATIO) ################################################# ################################################# ### # Cálculos de ar seco ################################################# ################################################# ### def GetDryAirEnthalpy(TDryBulb: flutuador) -> flutuador: "" " Retorno da entalpia do ar seco dada a temperatura do bulbo seco. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] Retorna: Entalpia do ar seco em Btu lb⁻¹ [IP] ou J kg⁻¹ [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 equação 28 "" " se isIP (): DryAirEntalpia = 0.240 * TDryBulb outro: DryAirEntalpia = 1006 * TDryBulb Retorna DryAirEntalpia def GetDryAirDensity(TDryBulb: flutuador, Pressão: flutuador) -> flutuador: "" " Retorna a densidade do ar seco, dada a temperatura e pressão do bulbo seco. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: Densidade do ar seco em lb ft⁻³ [IP] ou kg m⁻³ [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 Notas: Eqn 14 para a relação perfeita de gases para ar seco. Eqn 1 para a constante universal dos gases. O fator 144 em IP é para a conversão de Psi = lb in⁻² em lb ft⁻². "" " se isIP (): Densidade de Ar Seco = (144 * Pressão) / R_DA_IP / GetTRankineFromTFahrenheit(TDryBulb) outro: Densidade de Ar Seco = Pressão / R_DA_SI / ObterTKelvinFromTCelsius(TDryBulb) Retorna Densidade de Ar Seco def ObterDryAirVolume(TDryBulb: flutuador, Pressão: flutuador) -> flutuador: "" " Retorno do volume de ar seco, dada a temperatura e pressão do bulbo seco. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: Volume de ar seco em ft³ lb⁻¹ [IP] ou em m³ kg⁻¹ [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 Notas: Eqn 14 para a relação perfeita de gases para ar seco. Eqn 1 para a constante universal dos gases. O fator 144 em IP é para a conversão de Psi = lb in⁻² em lb ft⁻². "" " se isIP (): Volume de Ar Seco = R_DA_IP * GetTRankineFromTFahrenheit(TDryBulb) / (144 * Pressão) outro: Volume de Ar Seco = R_DA_SI * ObterTKelvinFromTCelsius(TDryBulb) / Pressão Retorna Volume de Ar Seco def GetTDryBulbFromEnthalpyAndHumRatio(Entalpia de ar úmido: flutuador, HumRatio: flutuador) -> flutuador: "" " Retorne a temperatura do bulbo seco a partir da relação de entalpia e umidade. Args: MoistAirEnthalpy: Entalpia de ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹ HumRatio: Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] Retorna: Temperatura de bulbo seco em °F [IP] ou °C [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 30 Notas: Baseado na função `GetMoistAirEnthalpy`, reorganizada para temperatura. "" " se HumRatio < 0: levantar ValueError("A relação de umidade é negativa") LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) se isIP (): TDryBulb = (MoistAirEnthalpia - 1061.0 * RazãoHum Limitada) / (0.240 + 0.444 * RazãoHum Limitada) outro: TDryBulb = (MoistAirEnthalpia / 1000.0 - 2501.0 * RazãoHum Limitada) / (1.006 + 1.86 * RazãoHum Limitada) Retorna TDryBulb def GetHumRatioFromEnthalpyAndTDryBulb(Entalpia de ar úmido: flutuador, TDryBulb: flutuador) -> flutuador: "" " Relação de umidade de retorno da entalpia e temperatura de bulbo seco. Args: MoistAirEnthalpy: Entalpia de ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹ TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] Retorna: Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 30. Notas: Baseado na função `GetMoistAirEnthalpy`, reorganizada para proporção de umidade. "" " se isIP (): HumRatio = (MoistAirEnthalpia - 0.240 * TDryBulb) / (1061.0 + 0.444 * TDryBulb) outro: HumRatio = (MoistAirEnthalpia / 1000.0 - 1.006 * TDryBulb) / (2501.0 + 1.86 * TDryBulb) # Verificação de validade. Retorna max(HumRatio, MIN_HUM_RATIO) ################################################# ################################################# ### # Cálculos de ar saturado ################################################# ################################################# ### def GetSatVapPres(TDryBulb: flutuador) -> flutuador: "" " Pressão de vapor de saturação de retorno dada a temperatura de bulbo seco. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] Retorna: Pressão de vapor do ar saturado em Psi [IP] ou Pa [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 equação 5 e 6 Nota importante: as fórmulas ASHRAE são definidas acima e abaixo do ponto de congelamento, mas têm uma descontinuidade no ponto de congelamento. Esta é uma pequena imprecisão por parte da ASHRAE: as fórmulas deve ser definido acima e abaixo do ponto triplo da água (não do ponto de gás), caso em que a descontinuidade desaparece. É essencial usar o ponto triplo da água, caso contrário funcionará GetTDewPointFromVapPres, que inverte a função atual, não converge adequadamente em torno o ponto de congelamento. "" " se isIP (): se (TDryBulb < -148 ou TDryBulb > 392): levantar ValueError("A temperatura do bulbo seco deve estar na faixa [-148, 392]°F") T = GetTRankineFromTFahrenheit(TDryBulb) se (TDryBulb <= TRIPLE_POINT_WATER_IP): LnPws = (-1.0214165E+04 / T - 4.8932428 - 5.3765794E-03 * T + 1.9202377E-07 * T **2 \ + 3.5575832E-10 * matemática.pow(T, 3) - 9.0344688E-14 * matemática.pow(T, 4) + 4.1635019 * matemática.log(T)) outro: LnPws = -1.0440397E+04 / T - 1.1294650E+01 - 2.7022355E-02* T + 1.2890360E-05 * T **2 \ - 2.4780681E-09 * matemática.pow(T, 3) + 6.5459673 * matemática.log(T) outro: se (TDryBulb < -100 ou TDryBulb > 200): levantar ValueError("A temperatura do bulbo seco deve estar na faixa [-100, 200]°C") T = ObterTKelvinFromTCelsius(TDryBulb) se (TDryBulb <= TRIPLE_POINT_WATER_SI): LnPws = -5.6745359E+03 / T + 6.3925247 - 9.677843E-03 * T + 6.2215701E-07 * T **2 \ + 2.0747825E-09 * matemática.pow(T, 3) - 9.484024E-13 * matemática.pow(T, 4) + 4.1635019 * matemática.log(T) outro: LnPws = -5.8002206E+03 / T + 1.3914993 - 4.8640239E-02 * T + 4.1764768E-05 * T **2 \ - 1.4452093E-08 * matemática.pow(T, 3) + 6.5459673 * matemática.log(T) SatVapPres = matemática.exp(LnPws) Retorna SatVapPres def GetSatHumRatio(TDryBulb: flutuador, Pressão: flutuador) -> flutuador: "" " Proporção de umidade de retorno do ar saturado, dada a temperatura e pressão do bulbo seco. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: Razão de umidade do ar saturado em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 equação 36, resolvida para W "" " SatVaporPres = GetSatVapPres(TDryBulb) SatHumRatio = 0.621945 * SatVaporPres / (Pressão - SatVaporPres) # Verificação de validade. Retorna max(SatHumRatio, MIN_HUM_RATIO) def GetSatAirEnthalpy(TDryBulb: flutuador, Pressão: flutuador) -> flutuador: "" " Retorno da entalpia do ar saturado dada a temperatura e pressão do bulbo seco. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: Entalpia de ar saturado em Btu lb⁻¹ [IP] ou J kg⁻¹ [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 "" " SatHumRatio = GetSatHumRatio(TDryBulb, Pressão) SatAirEntalpia = GetMoistAirEnthalpy(TDryBulb, Razão SatHum) Retorna SatAirEntalpia ################################################# ################################################# ### # Cálculos de ar úmido ################################################# ################################################# ### def Obter Déficit de Pressão de Vapor(TDryBulb: flutuador, HumRatio: flutuador, Pressão: flutuador) -> flutuador: "" " Retorno Déficit de pressão de vapor dada a temperatura de bulbo seco, razão de umidade e pressão. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] HumRatio: Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: Déficit de pressão de vapor em Psi [IP] ou Pa [SI] Referência: Ok (1987) equação 2.13a "" " se HumRatio < 0: levantar ValueError("A relação de umidade é negativa") RelHum = GetRelHumFromHumRatio(TDryBulb, HumRatio, Pressão) Déficit de pressão de vapor = GetSatVapPres(TDryBulb) * (1 - RelHum) Retorna Déficit de pressão de vapor def GetDegreeOfSaturation(TDryBulb: flutuador, HumRatio: flutuador, Pressão: flutuador) -> flutuador: "" " Retorna o grau de saturação (ou seja, relação umidade do ar / relação umidade do ar na saturação na mesma temperatura e pressão) dada a temperatura de bulbo seco, razão de umidade e pressão atmosférica. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] HumRatio: Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: Grau de saturação em unidade arbitrária Referência: Manual ASHRAE - Fundamentos (2009) cap. 1 equação 12 Notas: Esta definição está ausente do Manual de 2017. Usando a versão 2009. "" " se HumRatio < 0: levantar ValueError("A relação de umidade é negativa") LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) SatHumRatio = GetSatHumRatio(TDryBulb, Pressão) Grau de saturação = LimitadaHumRatio / SatHumRatio Retorna Grau de saturação def GetMoistAirEnthalpy(TDryBulb: flutuador, HumRatio: flutuador) -> flutuador: "" " Retorno da entalpia do ar úmido dada a temperatura do bulbo seco e a proporção de umidade. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] HumRatio: Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] Retorna: Entalpia do ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹ Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 30 "" " se HumRatio < 0: levantar ValueError("A relação de umidade é negativa") LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) se isIP (): MoistAirEnthalpia = 0.240 * TDryBulb + LimitadaHumRatio * (1061 + 0.444 * TDryBulb) outro: MoistAirEnthalpia = (1.006 * TDryBulb + LimitadaHumRatio * (2501. + 1.86 * TDryBulb)) * 1000 Retorna MoistAirEnthalpia def ObterMoistAirVolume(TDryBulb: flutuador, HumRatio: flutuador, Pressão: flutuador) -> flutuador: "" " Retorne o volume específico de ar úmido, dada a temperatura de bulbo seco, proporção de umidade e pressão. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] HumRatio: Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: Volume específico de ar úmido em ft³ lb⁻¹ de ar seco [IP] ou em m³ kg⁻¹ de ar seco [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 equação 26 Notas: Nas unidades IP, R_DA_IP/144 é igual a 0,370486 que é o coeficiente que aparece na equação 26 O fator 144 é para a conversão de Psi = lb in⁻² em lb ft⁻². "" " se HumRatio < 0: levantar ValueError("A relação de umidade é negativa") LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) se isIP (): Volume de ar úmido = R_DA_IP * GetTRankineFromTFahrenheit(TDryBulb) * (1 + 1.607858 * RazãoHum Limitada) / (144 * Pressão) outro: Volume de ar úmido = R_DA_SI * ObterTKelvinFromTCelsius(TDryBulb) * (1 + 1.607858 * RazãoHum Limitada) / Pressão Retorna Volume de ar úmido def GetTDryBulbFromMoistAirVolumeAndHumRatio(Volume de ar úmido: flutuador, HumRatio: flutuador, Pressão: flutuador) -> flutuador: "" " Retorne a temperatura do bulbo seco considerando o volume específico do ar úmido, a taxa de umidade e a pressão. Args: MoistAirVolume: Volume específico de ar úmido em ft³ lb⁻¹ de ar seco [IP] ou em m³ kg⁻¹ de ar seco [SI] HumRatio: Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 equação 26 Notas: Nas unidades IP, R_DA_IP/144 é igual a 0,370486 que é o coeficiente que aparece na equação 26 O fator 144 é para a conversão de Psi = lb in⁻² em lb ft⁻². Baseado na função `GetMoistAirVolume`, reorganizada para temperatura de bulbo seco. "" " se HumRatio < 0: levantar ValueError("A relação de umidade é negativa") LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) se isIP (): TDryBulb = GetTFahrenheitFromTRankine(MoistAirVolume * (144 * Pressão) / (R_DA_IP * (1 + 1.607858 * LimitadaHumRatio))) outro: TDryBulb = ObterTCelsiusFromTKelvin(MoistAirVolume * Pressão / (R_DA_SI * (1 + 1.607858 * LimitadaHumRatio))) Retorna TDryBulb def GetMoistAirDensity(TDryBulb: flutuador, HumRatio: flutuador, Pressão:flutuador) -> flutuador: "" " Retorna a densidade do ar úmido de acordo com a taxa de umidade, temperatura de bulbo seco e pressão. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] HumRatio: Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: MoistAirDensity: Densidade do ar úmido em lb ft⁻³ [IP] ou kg m⁻³ [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 equação 11 "" " se HumRatio < 0: levantar ValueError("A relação de umidade é negativa") LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) Volume de ar úmido = GetMoistAirVolume(TDryBulb, LimitadaHumRatio, Pressão) Densidade do ar úmido = (1 + RazãoHum Limitada) / Volume de ar úmido Retorna Densidade do ar úmido ################################################# ################################################# ### # Atmosfera padrão ################################################# ################################################# ### def ObterStandardAtmPressure(Altitude: flutuador) -> flutuador: "" " Retorna a pressão barométrica da atmosfera padrão, dada a elevação (altitude). Args: Altitude: Altitude em pés [IP] ou m [SI] Retorna: Pressão barométrica da atmosfera padrão em Psi [IP] ou Pa [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 equação 3 "" " se isIP (): PressãoAtmPadrão = 14.696 * math.pow (1 - 6.8754e-06 * Altitude, 5.2559) outro: PressãoAtmPadrão = 101325 * math.pow (1 - 2.25577e-05 * Altitude, 5.2559) Retorna PressãoAtmPadrão def ObterStandardAtmTemperature(Altitude: flutuador) -> flutuador: "" " Retorna a temperatura atmosférica padrão, dada a elevação (altitude). Args: Altitude: Altitude em pés [IP] ou m [SI] Retorna: Temperatura de bulbo seco da atmosfera padrão em °F [IP] ou °C [SI] Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 equação 4 "" " se isIP (): TemperaturaAtmPadrão = 59 - 0.00356620 * Altitude outro: TemperaturaAtmPadrão = 15 - 0.0065 * Altitude Retorna TemperaturaAtmPadrão def ObterSeaLevelPressure(EstaçãoPressão: flutuador, Altitude: flutuador, TDryBulb: flutuador) -> flutuador: "" " Pressão de retorno ao nível do mar dada a temperatura de bulbo seco, altitude acima do nível do mar e pressão. Args: StationPressure: Pressão observada da estação em Psi [IP] ou Pa [SI] Altitude: Altitude em pés [IP] ou m [SI] TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] Retorna: Pressão barométrica ao nível do mar em Psi [IP] ou Pa [SI] Referência: Hess SL, Introdução à meteorologia teórica, Holt Rinehart e Winston, NY 1959, CH. 6,5; Stull RB, Meteorologia para cientistas e engenheiros, 2ª edição, Brooks/Cole 2000, cap. 1. Notas: O procedimento padrão para os EUA é usar para TDryBulb a média da temperatura atual da estação e da temperatura da estação de 12 horas atrás. "" " se isIP (): # Calcule a temperatura média na coluna de ar, assumindo uma taxa de lapso Nº de 3,6 °F/1000 pés TColumn = TDryBulb + 0.0036 * Altitude / 2 # Determine a altura da escala H = 53.351 * ObterTRankinDeTFahrenheit(TColumn) outro: # Calcule a temperatura média na coluna de ar, assumindo uma taxa de lapso Número de 6,5 °C/km TColumn = TDryBulb + 0.0065 * Altitude / 2 # Determine a altura da escala H = 287.055 * ObterTKelvinFromTCelsius(TColumn) / 9.807 # Calcule a pressão ao nível do mar Nível do MarPressão = EstaçãoPressão * matemática.exp(Altitude / H) Retorna Nível do MarPressão def GetStationPressão(Pressão do nível do mar: flutuador, Altitude: flutuador, TDryBulb: flutuador) -> flutuador: "" " Pressão da estação de retorno da pressão ao nível do mar. Args: SeaLevelPressure: Pressão barométrica ao nível do mar em Psi [IP] ou Pa [SI] Altitude: Altitude em pés [IP] ou m [SI] TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] Retorna: Pressão da estação em Psi [IP] ou Pa [SI] Referência: Consulte 'GetSeaLevelPressure' Notas: Esta função é apenas o inverso de 'GetSeaLevelPressure'. "" " EstaçãoPressão = Nível do MarPressão / GetSeaLevelPressure(1, Altitude, TDryBulb) Retorna EstaçãoPressão ################################################# ################################################# ## # Funções para definir todos os valores psicrométricos ################################################# ################################################# ### def CalcPsicrometriaFromTWetBulb(TDryBulb: flutuador, TWetBulb: flutuador, Pressão: flutuador) -> tupla: "" " Função utilitária para calcular a taxa de umidade, temperatura do ponto de orvalho, umidade relativa, pressão de vapor, entalpia de ar úmido, volume de ar úmido e grau de saturação do ar fornecido temperatura de bulbo seco, temperatura de bulbo úmido e pressão. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] TWetBulb: Temperatura de bulbo úmido em °F [IP] ou °C [SI] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] Temperatura do ponto de orvalho em °F [IP] ou °C [SI] Umidade relativa na faixa [0, 1] Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] Entalpia do ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹ [SI] Volume específico de ar úmido em ft³ lb⁻¹ [IP] ou em m³ kg⁻¹ [SI] Grau de saturação [sem unidade] "" " HumRatio = GetHumRatioFromTWetBulb(TDryBulb, TWetBulb, Pressão) TDewPoint = GetTDewPointFromHumRatio(TDryBulb, HumRatio, Pressão) RelHum = GetRelHumFromHumRatio(TDryBulb, HumRatio, Pressão) VapPres = GetVapPresFromHumRatio(HumRatio, Pressão) MoistAirEnthalpia = GetMoistAirEnthalpy(TDryBulb, HumRatio) Volume de ar úmido = GetMoistAirVolume(TDryBulb, HumRatio, Pressão) Grau de saturação = GetDegreeOfSaturation(TDryBulb, HumRatio, Pressão) Retorna HumRatio, TDewPoint, RelHum, VapPres, MoistAirEntalpia, MoistAirVolume, Grau de saturação def CalcPsicrometriaFromTDewPoint(TDryBulb: flutuador, TDewPoint: flutuador, Pressão: flutuador) -> tupla: "" " Função utilitária para calcular a taxa de umidade, temperatura de bulbo úmido, umidade relativa, pressão de vapor, entalpia de ar úmido, volume de ar úmido e grau de saturação do ar fornecido temperatura de bulbo seco, temperatura de ponto de orvalho e pressão. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] TDewPoint: Temperatura do ponto de orvalho em °F [IP] ou °C [SI] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] Temperatura de bulbo úmido em °F [IP] ou °C [SI] Umidade relativa na faixa [0, 1] Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] Entalpia do ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹ [SI] Volume específico de ar úmido em ft³ lb⁻¹ [IP] ou em m³ kg⁻¹ [SI] Grau de saturação [sem unidade] "" " HumRatio = GetHumRatioFromTDewPoint(TDewPoint, Pressão) TWetBulb = GetTWetBulbFromHumRatio(TDryBulb, HumRatio, Pressão) RelHum = GetRelHumFromHumRatio(TDryBulb, HumRatio, Pressão) VapPres = GetVapPresFromHumRatio(HumRatio, Pressão) MoistAirEnthalpia = GetMoistAirEnthalpy(TDryBulb, HumRatio) Volume de ar úmido = GetMoistAirVolume(TDryBulb, HumRatio, Pressão) Grau de saturação = GetDegreeOfSaturation(TDryBulb, HumRatio, Pressão) Retorna HumRatio, TWetBulb, RelHum, VapPres, MoistAirEntalpia, MoistAirVolume, Grau de saturação def CalcPsicrometriaFromRelHum(TDryBulb: flutuador, RelHum: flutuador, Pressão: flutuador) -> tupla: "" " Função utilitária para calcular a taxa de umidade, temperatura de bulbo úmido, temperatura de ponto de orvalho, pressão de vapor, entalpia de ar úmido, volume de ar úmido e grau de saturação do ar fornecido temperatura de bulbo seco, umidade relativa e pressão. Args: TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] RelHum: Umidade relativa na faixa [0, 1] Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] Retorna: Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] Temperatura de bulbo úmido em °F [IP] ou °C [SI] Temperatura do ponto de orvalho em °F [IP] ou °C [SI]. Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] Entalpia do ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹ [SI] Volume específico de ar úmido em ft³ lb⁻¹ [IP] ou em m³ kg⁻¹ [SI] Grau de saturação [sem unidade] "" " HumRatio = GetHumRatioFromRelHum(TDryBulb, RelHum, Pressão) TWetBulb = GetTWetBulbFromHumRatio(TDryBulb, HumRatio, Pressão) TDewPoint = GetTDewPointFromHumRatio(TDryBulb, HumRatio, Pressão) VapPres = GetVapPresFromHumRatio(HumRatio, Pressão) MoistAirEnthalpia = GetMoistAirEnthalpy(TDryBulb, HumRatio) Volume de ar úmido = GetMoistAirVolume(TDryBulb, HumRatio, Pressão) Grau de saturação = GetDegreeOfSaturation(TDryBulb, HumRatio, Pressão) Retorna HumRatio, TWetBulb, TDewPoint, VapPres, MoistAirEntalpia, MoistAirVolume, Grau de saturação |
C_sharp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 | / * * PsychroLib (versão 2.3.0) (https://github.com/psychrometrics/psychrolib) * Copyright (c) 2018 D. Thevenard e D. Meyer, D. Gosnell para a implementação atual da biblioteca * Copyright (c) Manual ASHRAE 2017 - Fundamentos para equações e coeficientes ASHRAE * Portado para C# por https://github.com/DJGosnell * Licenciado sob a licença MIT. * / usando Sistema; namespace PsychroLib { /// <resumo> /// Classe de funções que permitem o cálculo das propriedades psicrométricas do ar úmido e seco. /// </sumário> público classe Psicrometria { /********************************************** ************************************************** *** * Constantes globais ************************************************** ************************************************** */ /// <resumo> /// Zero grau Fahrenheit (°F) expresso como grau Rankine (°R). /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 39. /// </sumário> privado const duplo ZERO_FAHRENHEIT_AS_RANKINE = 459.67; /// <resumo> /// Zero grau Celsius (°C) expresso em Kelvin (K). /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 39. /// </sumário> privado const duplo ZERO_CELSIUS_AS_KELVIN = 273.15; /// <resumo> /// Constante de gás universal para ar seco (versão IP) em pés lb_Force lb_DryAir⁻¹ R⁻¹. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1. /// </sumário> privado const duplo R_DA_IP = 53.350; /// <resumo> /// Constante de gás universal para ar seco (versão SI) em J kg_DryAir⁻¹ K⁻¹. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1. /// </sumário> privado const duplo R_DA_SI = 287.042; /// <resumo> /// Valor inválido (adimensional). /// </sumário> privado const duplo INVÁLIDO = -99999; /// <resumo> /// Número máximo de iterações antes de sair dos loops while. /// </sumário> privado const duplo MAX_ITER_COUNT = 100; /// <resumo> /// Razão de umidade mínima aceitável usada/retornada por qualquer função. /// Qualquer valor acima de 0 ou abaixo de MIN_HUM_RATIO será redefinido para este valor. /// </sumário> privado const duplo MIN_HUM_RATIO = 1e-7; /// <resumo> /// Ponto de congelamento da água em Fahrenheit. /// </sumário> privado const duplo FREEZING_POINT_WATER_IP = 32.0; /// <resumo> /// Ponto de congelamento da água em Celsius. /// </sumário> privado const duplo FREEZING_POINT_WATER_SI = 0.0; /// <resumo> /// Ponto triplo da água em Fahrenheit. /// </sumário> privado const duplo TRIPLE_POINT_WATER_IP = 32.018; /// <resumo> /// Ponto triplo da água em Celsius. /// </sumário> privado const duplo TRIPLE_POINT_WATER_SI = 0.01; /// <resumo> /// Obtém ou define o sistema atual de unidades para os cálculos. /// </sumário> público UnitSystem UnitSystem { obter => _unitSystem; conjunto { _unitSystem = valor; se (valor == UnidadeSistema.IP) PSYCHROLIB_TOLERANCE = 0.001 * 9.0 / 5.0; outro PSYCHROLIB_TOLERANCE = 0.001; } } privado duplo PSYCHROLIB_TOLERANCE; privado UnitSystem _unitSystem; /// <resumo> /// Construtor para criar instância com o sistema de unidades especificado. /// </sumário> /// <param name="unitSystem">Sistema de unidades a serem utilizadas para cálculos.</param> público Psicrometria(Sistema de Unidades unidadeSistema) { UnitSystem = unidadeSistema; } /********************************************** ************************************************** *** * Conversão entre unidades de temperatura ************************************************** ************************************************** */ /// <resumo> /// Função utilitária para converter temperatura em grau Rankine (°R) /// dada temperatura em graus Fahrenheit (°F). /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 seção 3 /// </sumário> /// <param name="tF">Temperatura em Fahrenheit (°F)</param> /// <returns>Rankine (°R)</returns> público duplo GetTRankineFromTFahrenheit(duplo tF) { Retorna tF + ZERO_FAHRENHEIT_AS_RANKINE; /* exato */ } /// <resumo> /// Função utilitária para converter temperatura em graus Fahrenheit (°F) /// dada temperatura em grau Rankine (°R). /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 seção 3 /// </sumário> /// <param name="tR">Temperatura em Rankine (°R)</param> /// <returns>Fahrenheit (°F)</returns> público duplo GetTFahrenheitFromTRankine(duplo tR) { Retorna tR - ZERO_FAHRENHEIT_AS_RANKINE; /* exato */ } /// <resumo> /// Função utilitária para converter temperatura em Kelvin (K) /// dada temperatura em graus Celsius (°C). /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 seção 3 /// </sumário> /// <param name="tC">Temperatura em Celsius (°C)</param> /// <returns>Rankine (°R)</returns> público duplo ObterTKelvinFromTCelsius(duplo tC) { Retorna tC + ZERO_CELSIUS_AS_KELVIN; /* exato */ } /// <resumo> /// Função utilitária para converter temperatura em graus Celsius (°C) /// dada temperatura em Kelvin (K). /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 seção 3 /// </sumário> /// <param name="tK">Temperatura em Rankine (°R)</param> /// <returns>Celsius (°C)</returns> público duplo ObterTCelsiusFromTKelvin(duplo tK) { Retorna tK - ZERO_CELSIUS_AS_KELVIN; /* exato */ } /********************************************** ************************************************** *** * Conversões entre ponto de orvalho, bulbo úmido e umidade relativa ************************************************** ************************************************** */ /// <resumo> /// Retorna a temperatura do bulbo úmido dada a temperatura do bulbo seco, temperatura do ponto de orvalho e pressão. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="tDewPoint">Temperatura do ponto de orvalho em °F [IP] ou °C [SI]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Temperatura de bulbo úmido em °F [IP] ou °C [SI]</returns> público duplo GetTWetBulbFromTDewPoint(duplo tDryBulb, duplo tDewPoint, duplo pressão) { se (!(tDewPoint <= tDryBulb)) lançar novo InvalidOperationException("A temperatura do ponto de orvalho está acima da temperatura do bulbo seco"); var humRatio = GetHumRatioFromTDewPoint(tDewPoint, pressão); Retorna GetTWetBulbFromHumRatio(tDryBulb, humRatio, pressão); } /// <resumo> /// Retorna a temperatura do bulbo úmido dada a temperatura do bulbo seco, umidade relativa e pressão. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="relHum">Umidade relativa [0-1]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Temperatura de bulbo úmido em °F [IP] ou °C [SI]</returns> público duplo GetTWetBulbFromRelHum(duplo tDryBulb, duplo relHum, duplo pressão) { se (! (relHum > = 0.0 && relHum <= 1.0)) lançar novo InvalidOperationException("A umidade relativa está fora da faixa [0,1]"); var humRatio = GetHumRatioFromRelHum(tDryBulb, relHum, pressão); Retorna GetTWetBulbFromHumRatio(tDryBulb, humRatio, pressão); } /// <resumo> /// Retorna a umidade relativa dada a temperatura de bulbo seco e a temperatura do ponto de orvalho. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 equação 22 /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="tDewPoint">Temperatura do ponto de orvalho em °F [IP] ou °C [SI]</param> /// <returns>Umidade relativa [0-1]</returns> público duplo GetRelHumFromTDewPoint(duplo tDryBulb, duplo tDewPoint) { se (!(tDewPoint <= tDryBulb)) lançar novo InvalidOperationException("A temperatura do ponto de orvalho está acima da temperatura do bulbo seco"); var vapPres = GetSatVapPres(tDewPoint); var satVapPres = GetSatVapPres(tDryBulb); Retorna vapPres / satVapPres; } /// <resumo> /// Retorna a umidade relativa dada a temperatura de bulbo seco, temperatura de bulbo úmido e pressão. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="tWetBulb">Temperatura do bulbo úmido em °F [IP] ou °C [SI]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Umidade relativa [0-1]</returns> público duplo GetRelHumFromTWetBulb(duplo tDryBulb, duplo tWetBulb, duplo pressão) { se (!(tLâmpada molhada <= tDryBulb)) lançar novo InvalidOperationException(“A temperatura do bulbo úmido está acima da temperatura do bulbo seco”); var humRatio = GetHumRatioFromTWetBulb(tDryBulb, tWetBulb, pressão); Retorna GetRelHumFromHumRatio(tDryBulb, humRatio, pressão); } /// <resumo> /// Retorna a temperatura do ponto de orvalho dada a temperatura do bulbo seco e a umidade relativa. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="relHum">Umidade relativa [0-1]</param> /// <returns>Temperatura do ponto de orvalho em °F [IP] ou °C [SI]</returns> público duplo GetTDewPointFromRelHum(duplo tDryBulb, duplo relHum) { se (! (relHum > = 0.0 && relHum <= 1.0)) lançar novo InvalidOperationException("A umidade relativa está fora da faixa [0,1]"); var vapPres = GetVapPresFromRelHum(tDryBulb, relHum); Retorna GetTDewPointFromVapPres(tDryBulb, vapPres); } /// <resumo> /// Retorna a temperatura do ponto de orvalho dada a temperatura de bulbo seco, temperatura de bulbo úmido e pressão. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="tWetBulb">Temperatura do bulbo úmido em °F [IP] ou °C [SI]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Temperatura do ponto de orvalho em °F [IP] ou °C [SI]</returns> público duplo ObterTDewPointFromTWetBulb(duplo tDryBulb, duplo tWetBulb, duplo pressão) { se (!(tLâmpada molhada <= tDryBulb)) lançar novo InvalidOperationException(“A temperatura do bulbo úmido está acima da temperatura do bulbo seco”); var humRatio = GetHumRatioFromTWetBulb(tDryBulb, tWetBulb, pressão); Retorna ObterTDewPointFromHumRatio(tDryBulb, humRatio, pressão); } /********************************************** ************************************************** *** * Conversões entre ponto de orvalho ou umidade relativa e pressão de vapor ************************************************** ************************************************** */ /// <resumo> /// Retorna a pressão parcial do vapor d'água em função da umidade relativa e da temperatura. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 12, 22 /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="relHum">Umidade relativa [0-1]</param> /// <returns>Pressão parcial do vapor de água no ar úmido em Psi [IP] ou Pa [SI]</returns> público duplo GetVapPresFromRelHum(duplo tDryBulb, duplo relHum) { se (! (relHum > = 0.0 && relHum <= 1.0)) lançar novo InvalidOperationException("A umidade relativa está fora da faixa [0,1]"); Retorna relHum * GetSatVapPres(tDryBulb); } /// <resumo> /// Retorna a umidade relativa dada a temperatura de bulbo seco e a pressão de vapor. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 12, 22 /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="vapPres">Pressão parcial do vapor de água no ar úmido em Psi [IP] ou Pa [SI]</param> /// <returns>Umidade relativa [0-1]</returns> público duplo GetRelHumFromVapPres(duplo tDryBulb, duplo vapPres) { se (! (vapPres > = 0.0)) lançar novo InvalidOperationException(“A pressão parcial do vapor d'água no ar úmido é negativa”); Retorna vapPres / GetSatVapPres(tDryBulb); } /// <resumo> /// Função auxiliar retornando a derivada do logaritmo natural da pressão de vapor de saturação /// em função da temperatura de bulbo seco. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 5 e 6 /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <returns>Derivada do logaritmo natural da pressão de vapor do ar saturado em Psi [IP] ou Pa [SI]</returns> privado duplo dLnPws_(duplo tDryBulb) { duplo dLnPws, T; se (Sistema de Unidades == UnidadeSistema.IP) { T = GetTRankinFromTFahrenheit(tDryBulb); se (tDryBulb <= TRIPLE_POINT_WATER_IP) dLnPws = 1.0214165E+04 / Math.Pow(T, 2) - 5.3765794E-03 + 2 * 1.9202377E-07 * T + 3 * 3.5575832E-10 * Math.Pow(T, 2) - 4 * 9.0344688E-14 * Math.Pow(T, 3) + 4.1635019 / T; outro dLnPws = 1.0440397E+04 / Math.Pow(T, 2) - 2.7022355E-02 + 2 * 1.2890360E-05 * T - 3 * 2.4780681E-09 * Math.Pow(T, 2) + 6.5459673 / T; } outro { T = GetTKelvinFromTCelsius(tDryBulb); se (tDryBulb <= TRIPLE_POINT_ÁGUA_SI) dLnPws = 5.6745359E+03 / Math.Pow(T, 2) - 9.677843E-03 + 2 * 6.2215701E-07 * T + 3 * 2.0747825E-09 * Math.Pow(T, 2) - 4 * 9.484024E-13 * Math.Pow(T, 3) + 4.1635019 / T; outro dLnPws = 5.8002206E+03 / Math.Pow(T, 2) - 4.8640239E-02 + 2 * 4.1764768E-05 * T - 3 * 1.4452093E-08 * Math.Pow(T, 2) + 6.5459673 / T; } Retorna dLnPws; } /// <resumo> /// Retorno da temperatura do ponto de orvalho dada a temperatura do bulbo seco e a pressão de vapor. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 5 e 6 /// Notas: a temperatura do ponto de orvalho é resolvida invertendo a equação que dá a pressão do vapor de água /// na saturação da temperatura em vez de usar as regressões fornecidas /// pela ASHRAE (eqn. 37 e 38) que são muito menos precisos e têm um /// faixa de validade mais estreita. /// O método Newton-Raphson (NR) é usado no logaritmo do vapor de água /// pressão em função da temperatura, que é uma função muito suave /// A convergência geralmente é alcançada em 3 a 5 iterações. /// tDryBulb não é realmente necessário aqui, apenas usado por conveniência. /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="vapPres">Pressão parcial do vapor de água no ar úmido em Psi [IP] ou Pa [SI]</param> /// <returns>(o) Temperatura do ponto de orvalho em °F [IP] ou °C [SI]</returns> público duplo GetTDewPointFromVapPres(duplo tDryBulb, duplo vapPres) { //Função limites do sistema de unidades var limites = UnitSystem == UnidadeSistema.IP ? novo[] {-148.0, 392.0} : novo[] {-100.0, 200.0}; // Limites fora dos quais uma solução não pode ser encontrada se (vapPres < GetSatVapPres(limites[0]) || vapPres > GetSatVapPres(limites[1])) lançar novo InvalidOperationException( “A pressão parcial do vapor d'água está fora da faixa de validade das equações”); // Usamos NR para aproximar a solução. // Primeiro palpite var tDewPoint = tDryBulb; // Valor calculado das temperaturas do ponto de orvalho, resolvido iterativamente em °F [IP] ou °C [SI] var lnVP = Math.Log(vapPres); // Logaritmo natural da pressão parcial da pressão do vapor de água no ar úmido duplo tDewPoint_iter; // Valor do tDewPoint utilizado no cálculo do NR duplo lnVP_iter; // Valor do log da pressão de vapor de água utilizado no cálculo de NR var índice = 1; Faz { //Ponto atual tDewPoint_iter = tDewPoint; lnVP_iter = Math.Log(GetSatVapPres(tDewPoint_iter)); // Derivada da função, calculada analiticamente var d_lnVP = dLnPws_(tDewPoint_iter); // Nova estimativa, limitada pelo domínio de validade da eqn. 5 e 6 tDewPoint = tDewPoint_iter - (lnVP_iter - lnVP) / d_lnVP; tDewPoint = Math.Max(tDewPoint, limites [0]); tDewPoint = Math.Min(tPontoDe orvalho, limites [1]); se (índice > MAX_ITER_COUNT) lançar novo InvalidOperationException( "Convergência não alcançada em GetTDewPointFromVapPres. Parando."); index ++; } enquanto (Math.Abs(tDewPoint - tDewPoint_iter) > PSYCHROLIB_TOLERANCE); Retorna Math.Min(tPontoDe orvalho, tDryBulb); } /// <resumo> /// Pressão de vapor de retorno dada a temperatura do ponto de orvalho. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 36 /// </sumário> /// <param name="tDewPoint">Temperatura do ponto de orvalho em °F [IP] ou °C [SI]</param> /// <returns>Pressão parcial do vapor de água no ar úmido em Psi [IP] ou Pa [SI]</returns> público duplo GetVapPresFromTDewPoint(duplo tDewPoint) { Retorna GetSatVapPres(tPontoDe orvalho); } /********************************************** ************************************************** *** * Conversões de temperatura de bulbo úmido, temperatura de ponto de orvalho ou umidade relativa para proporção de umidade ************************************************** ************************************************** */ /// <resumo> /// Retorna a temperatura do bulbo úmido dada a temperatura do bulbo seco, taxa de umidade e pressão. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eqn 33 e 35 resolvido para Tstar /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="humRatio">Proporção de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Temperatura de bulbo úmido em °F [IP] ou °C [SI]</returns> público duplo GetTWetBulbFromHumRatio(duplo tDryBulb, duplo humRatio, duplo pressão) { // Declarações duplo Wstar; duplo tDewPoint, tWetBulb, tWetBulbSup, tWetBulbInf, delimitadoHumRatio; var índice = 1; se (!(humRatio > = 0.0)) lançar novo InvalidOperationException("A relação de umidade é negativa"); delimitadoHumRatio = Math.Max(humRatio, MIN_HUM_RATIO); tDewPoint = GetTDewPointFromHumRatio(tDryBulb, delimitadoHumRatio, pressão); //Suposições iniciais tWetBulbSup = tDryBulb; tWetBulbInf = tDewPoint; tWetBulb = (tWetBulbInf + tWetBulbSup) / 2.0; // Loop de bissecção enquanto ((tWetBulbSup - tWetBulbInf) > PSYCHROLIB_TOLERANCE) { // Calcula a taxa de umidade na temperatura Tstar Wstar = GetHumRatioFromTWetBulb(tDryBulb, tWetBulb, pressão); // Obtenha novos limites se (Wstar > delimitadoHumRatio) tWetBulbSup = tWetBulb; outro tWetBulbInf = tWetBulb; // Nova estimativa da temperatura do bulbo úmido tWetBulb = (tWetBulbSup + tWetBulbInf) / 2.0; se (índice > MAX_ITER_COUNT) lançar novo InvalidOperationException( "Convergência não alcançada em GetTWetBulbFromHumRatio. Parando."); index ++; } Retorna tWetBulb; } /// <resumo> /// Taxa de umidade de retorno dada a temperatura de bulbo seco, temperatura de bulbo úmido e pressão. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 33 e 35 /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="tWetBulb">Temperatura do bulbo úmido em °F [IP] ou °C [SI]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Proporção de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI]</returns> público duplo ObterHumRatioFromTWetBulb(duplo tDryBulb, duplo tWetBulb, duplo pressão) { duplo wsstar; duplo humRatio = INVÁLIDO; se (!(tLâmpada molhada <= tDryBulb)) lançar novo InvalidOperationException(“A temperatura do bulbo úmido está acima da temperatura do bulbo seco”); wsstar = GetSatHumRatio(tLâmpada Molhada, pressão); se (Sistema de Unidades == UnidadeSistema.IP) { se (tWetBulb > = FREEZING_POINT_WATER_IP) humRatio = ((1093.0 - 0.556 * tWetBulb) * wsstar - 0.240 * (tDryBulb - tWetBulb)) / (1093.0 + 0.444 * tDryBulb - tWetBulb); outro humRatio = ((1220.0 - 0.04 * tWetBulb) * wsstar - 0.240 * (tDryBulb - tWetBulb)) / (1220.0 + 0.444 * tDryBulb - 0.48 * tWetBulb); } outro { se (tWetBulb > = FREEZING_POINT_WATER_SI) humRatio = ((2501.0 - 2.326 * tWetBulb) * wsstar - 1.006 * (tDryBulb - tWetBulb)) / (2501.0 + 1.86 * tDryBulb - 4.186 * tWetBulb); outro humRatio = ((2830.0 - 0.24 * tWetBulb) * wsstar - 1.006 * (tDryBulb - tWetBulb)) / (2830.0 + 1.86 * tDryBulb - 2.1 * tWetBulb); } //Verificação de validade. Retorna Math.Max(humRatio, MIN_HUM_RATIO); } /// <resumo> /// Taxa de umidade de retorno dada a temperatura de bulbo seco, umidade relativa e pressão. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="relHum">Umidade relativa [0-1]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Proporção de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI]</returns> público duplo GetHumRatioFromRelHum(duplo tDryBulb, duplo relHum, duplo pressão) { se (! (relHum > = 0.0 && relHum <= 1.0)) lançar novo InvalidOperationException("A umidade relativa está fora da faixa [0,1]"); var vapPres = GetVapPresFromRelHum(tDryBulb, relHum); Retorna GetHumRatioFromVapPres(vapPres, pressão); } /// <resumo> /// Retorna a umidade relativa dada a temperatura de bulbo seco, taxa de umidade e pressão. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="humRatio">Proporção de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Umidade relativa [0-1]</returns> público duplo GetRelHumFromHumRatio(duplo tDryBulb, duplo humRatio, duplo pressão) { se (!(humRatio > = 0.0)) lançar novo InvalidOperationException("A relação de umidade é negativa"); var vapPres = GetVapPresFromHumRatio(humRatio, pressão); Retorna GetRelHumFromVapPres(tDryBulb, vapPres); } /// <resumo> /// Taxa de umidade de retorno dada a temperatura e pressão do ponto de orvalho. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 /// </sumário> /// <param name="tDewPoint">Temperatura do ponto de orvalho em °F [IP] ou °C [SI]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Proporção de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI]</returns> público duplo GetHumRatioFromTDewPoint(duplo tDewPoint, duplo pressão) { var vapPres = GetSatVapPres(tDewPoint); Retorna GetHumRatioFromVapPres(vapPres, pressão); } /// <resumo> /// Retorna a temperatura do ponto de orvalho dada a temperatura de bulbo seco, taxa de umidade e pressão. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="humRatio">Proporção de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Temperatura do ponto de orvalho em °F [IP] ou °C [SI]</returns> público duplo ObterTDewPointFromHumRatio(duplo tDryBulb, duplo humRatio, duplo pressão) { se (!(humRatio > = 0.0)) lançar novo InvalidOperationException("A relação de umidade é negativa"); var vapPres = GetVapPresFromHumRatio(humRatio, pressão); Retorna GetTDewPointFromVapPres(tDryBulb, vapPres); } /********************************************** ************************************************** *** * Conversões entre relação de umidade e pressão de vapor ************************************************** ************************************************** */ /// <resumo> /// Relação de umidade de retorno dada a pressão de vapor de água e a pressão atmosférica. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 equação 20 /// </sumário> /// <param name="vapPres">Pressão parcial do vapor de água no ar úmido em Psi [IP] ou Pa [SI]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Proporção de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI]</returns> público duplo GetHumRatioFromVapPres(duplo vapPres, duplo pressão) { se (! (vapPres > = 0.0)) lançar novo InvalidOperationException(“A pressão parcial do vapor d'água no ar úmido é negativa”); var humRatio = 0.621945 * vapPres / (pressão - vapPres); //Verificação de validade. Retorna Math.Max(humRatio, MIN_HUM_RATIO); } /// <resumo> /// Pressão de vapor de retorno dada a relação de umidade e pressão. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eqn 20 resolvido para pw /// </sumário> /// <param name="humRatio">Proporção de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Pressão parcial do vapor de água no ar úmido em Psi [IP] ou Pa [SI]</returns> público duplo GetVapPresFromHumRatio(duplo humRatio, duplo pressão) { se (!(humRatio > = 0.0)) lançar novo InvalidOperationException("A relação de umidade é negativa"); var delimitadoHumRatio = Math.Max(humRatio, MIN_HUM_RATIO); var vapPres = pressão * delimitadoHumRatio / (0.621945 + delimitadoHumRatio); Retorna vapPres; } /********************************************** ************************************************** *** * Conversões entre relação de umidade e umidade específica ************************************************** ************************************************** */ /// <resumo> /// Retorna a umidade específica da proporção de umidade (também conhecida como proporção de mistura) /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 equação 9b /// </sumário> /// <param name="humRatio">Proporção de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI]</param> /// <returns>Proporção de umidade específica em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI]</returns> público duplo GetSpecificHumFromHumRatio(duplo humRatio) { se (!(humRatio > = 0.0)) lançar novo InvalidOperationException("A relação de umidade é negativa"); var delimitadoHumRatio = Math.Max(humRatio, MIN_HUM_RATIO); Retorna delimitadoHumRatio / (1.0 + delimitadoHumRatio); } /// <resumo> /// Retorna a proporção de umidade (também conhecida como proporção de mistura) da umidade específica /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eqn 9b (resolvido para proporção de umidade) /// </sumário> /// <param name="specificHum"></param> /// <returns>Proporção de umidade em lb_H₂O lb_Dry_Air⁻¹ [IP] ou kg_H₂O kg_Dry_Air⁻¹ [SI]</returns> público duplo GetHumRatioFromSpecificHum(duplo específicoHum) { se (!(específicoHum > = 0.0 && específicoHum < 1.0)) lançar novo InvalidOperationException("A umidade específica está fora da faixa [0, 1]"); var humRatio = específicoHum / (1.0 - específicoHum); //Verificação de validade Retorna Math.Max(humRatio, MIN_HUM_RATIO); } /********************************************** ************************************************** *** * Cálculos de ar seco ************************************************** ************************************************** */ /// <resumo> /// Retorna a entalpia do ar seco dada a temperatura do bulbo seco. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 28 /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <returns>Entalpia do ar seco em Btu lb⁻¹ [IP] ou J kg⁻¹ [SI]</returns> público duplo GetDryAirEnthalpy(duplo tDryBulb) { se (Sistema de Unidades == UnidadeSistema.IP) Retorna 0.240 * tDryBulb; Retorna 1006.0 * tDryBulb; } /// <resumo> /// Retorna a densidade do ar seco dada a temperatura e pressão do bulbo seco. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 /// Notas: eqn 14 para a relação perfeita de gás para ar seco. /// Eqn 1 para a constante universal dos gases. /// O fator 144 em IP é para a conversão de Psi = lb in⁻² para lb ft⁻². /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Densidade do ar seco em lb ft⁻³ [IP] ou kg m⁻³ [SI]</returns> público duplo GetDryAirDensity(duplo tDryBulb, duplo pressão) { se (Sistema de Unidades == UnidadeSistema.IP) Retorna (144.0 * pressão) / R_DA_IP / GetTRankinFromTFahrenheit(tDryBulb); Retorna pressão / R_DA_SI / GetTKelvinFromTCelsius(tDryBulb); } /// <resumo> /// Retorna o volume de ar seco dada a temperatura e pressão do bulbo seco. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1. /// Notas: eqn 14 para a relação perfeita de gás para ar seco. /// Eqn 1 para a constante universal dos gases. /// O fator 144 em IP é para a conversão de Psi = lb in⁻² para lb ft⁻². /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Volume de ar seco ft³ lb⁻¹ [IP] ou em m³ kg⁻¹ [SI]</returns> público duplo ObterDryAirVolume(duplo tDryBulb, duplo pressão) { se (Sistema de Unidades == UnidadeSistema.IP) Retorna R_DA_IP * GetTRankineFromTFahrenheit(tDryBulb) / (144.0 * pressão); Retorna R_DA_SI * ObterTKelvinFromTCelsius(tDryBulb) / pressão; } /// <resumo> /// Retorna a temperatura do bulbo seco a partir da relação de entalpia e umidade. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 30. /// Notas: baseadas na função `GetMoistAirEnthalpy`, reorganizadas para temperatura. /// </sumário> /// <param name="moistAirEnthalpy">Entalpia do ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹</param> /// <param name="humRatio">Proporção de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI]</param> /// <returns>Temperatura de bulbo seco em °F [IP] ou °C [SI]</returns> público duplo GetTDryBulbFromEnthalpyAndHumRatio(duplo úmidoArEntalpia, duplo humRatio) { se (!(humRatio > = 0.0)) lançar novo InvalidOperationException("A relação de umidade é negativa"); var delimitadoHumRatio = Math.Max(humRatio, MIN_HUM_RATIO); se (Sistema de Unidades == UnidadeSistema.IP) Retorna (úmidoArEntalpia - 1061.0 * delimitadoHumRatio) / (0.240 + 0.444 * delimitadoHumRatio); Retorna (úmidoArEntalpia / 1000.0 - 2501.0 * delimitadoHumRatio) / (1.006 + 1.86 * delimitadoHumRatio); } /// <resumo> /// Retorna a relação de umidade da entalpia e da temperatura de bulbo seco. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 30. /// Notas: baseadas na função `GetMoistAirEnthalpy`, reorganizadas para taxa de umidade. /// </sumário> /// <param name="moistAirEnthalpy">Entalpia do ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹</param> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <returns>Proporção de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻</returns> público duplo GetHumRatioFromEnthalpyAndTDryBulb(duplo úmidoArEntalpia, duplo tDryBulb) { { duplo humRatio; se (Sistema de Unidades == UnidadeSistema.IP) humRatio = (úmidoArEntalpia - 0.240 * tDryBulb) / (1061.0 + 0.444 * tDryBulb); outro humRatio = (úmidoArEntalpia / 1000.0 - 1.006 * tDryBulb) / (2501.0 + 1.86 * tDryBulb); //Verificação de validade. Retorna Math.Max(humRatio, MIN_HUM_RATIO); } } /********************************************** ************************************************** *** * Cálculos de ar saturado ************************************************** ************************************************** */ /// <resumo> /// Pressão de vapor de saturação de retorno dada a temperatura de bulbo seco. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 5 e 6 /// Nota importante: as fórmulas ASHRAE são definidas acima e abaixo do ponto de congelamento, mas têm /// uma descontinuidade no ponto de congelamento. Esta é uma pequena imprecisão por parte da ASHRAE: as fórmulas /// deve ser definido acima e abaixo do ponto triplo da água (não do ponto de gás), nesse caso /// a descontinuidade desaparece. É essencial usar o ponto triplo da água, caso contrário funcionará /// GetTDewPointFromVapPres, que inverte a função atual, não converge corretamente em torno /// o ponto de congelamento. /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <returns>Pressão de vapor do ar saturado em Psi [IP] ou Pa [SI]</returns> público duplo GetSatVapPres(duplo tDryBulb) { duplo lnPws; se (Sistema de Unidades == UnidadeSistema.IP) { se (!(tDryBulb > = -148.0 && tDryBulb <= 392.0)) lançar novo InvalidOperationException("A temperatura do bulbo seco está fora da faixa [-148, 392]"); var T = GetTRankinFromTFahrenheit(tDryBulb); se (tDryBulb <= TRIPLE_POINT_WATER_IP) lnPws = (-1.0214165E+04 / T - 4.8932428 - 5.3765794E-03 * T + 1.9202377E-07 * T * T + 3.5575832E-10 * Math.Pow(T, 3) - 9.0344688E-14 * Math.Pow(T, 4) + 4.1635019 * Math.Log(T)); outro lnPws = -1.0440397E+04 / T - 1.1294650E+01 - 2.7022355E-02 * T + 1.2890360E-05 * T * T - 2.4780681E-09 * Math.Pow(T, 3) + 6.5459673 * Math.Log (T); } outro { se (!(tDryBulb > = -100.0 && tDryBulb <= 200.0)) lançar novo InvalidOperationException("A temperatura do bulbo seco está fora da faixa [-100, 200]"); var T = GetTKelvinFromTCelsius(tDryBulb); se (tDryBulb <= TRIPLE_POINT_ÁGUA_SI) lnPws = -5.6745359E+03 / T + 6.3925247 - 9.677843E-03 * T + 6.2215701E-07 * T * T + 2.0747825E-09 * Math.Pow(T, 3) - 9.484024E-13 * Math.Pow(T, 4) + 4.1635019 * Math.Log (T); outro lnPws = -5.8002206E+03 / T + 1.3914993 - 4.8640239E-02 * T + 4.1764768E-05 * T * T - 1.4452093E-08 * Math.Pow(T, 3) + 6.5459673 * Math.Log (T); } Retorna Math.Exp(lnPws); } /// <resumo> /// Taxa de umidade de retorno do ar saturado, dada a temperatura e pressão do bulbo seco. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 equação 36, resolvida para W /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Proporção de umidade do ar saturado em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI]</returns> público duplo GetSatHumRatio(duplo tDryBulb, duplo pressão) { var satVaporPres = GetSatVapPres(tDryBulb); var satHumRatio = 0.621945 * satVaporPres / (pressão - satVaporPres); //Verificação de validade. Retorna Math.Max(satHumRatio, MIN_HUM_RATIO); } /// <resumo> /// Retorna a entalpia do ar saturado dada a temperatura e pressão do bulbo seco. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Entalpia de ar saturado em Btu lb⁻¹ [IP] ou J kg⁻¹ [SI]</returns> público duplo GetSatAirEnthalpy(duplo tDryBulb, duplo pressão) { Retorna GetMoistAirEnthalpy(tDryBulb, GetSatHumRatio(tDryBulb, pressão)); } /********************************************** ************************************************** *** * Cálculos de ar úmido ************************************************** ************************************************** */ /// <resumo> /// Retorno Déficit de pressão de vapor dada a temperatura de bulbo seco, razão de umidade e pressão. /// Referência: ver Oke (1987) eq. 2.13a /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="humRatio">Proporção de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Déficit de pressão de vapor em Psi [IP] ou Pa [SI]</returns> público duplo Obter Déficit de Pressão de Vapor(duplo tDryBulb, duplo humRatio, duplo pressão) { se (!(humRatio > = 0.0)) lançar novo InvalidOperationException("A relação de umidade é negativa"); var relHum = GetRelHumFromHumRatio(tDryBulb, humRatio, pressão); Retorna GetSatVapPres(tDryBulb) * (1.0 - relHum); } /// <resumo> /// Retorna o grau de saturação (ou seja, relação umidade do ar / relação umidade do ar na saturação /// na mesma temperatura e pressão) dada a temperatura de bulbo seco, razão de umidade e pressão atmosférica. /// Referência: Manual ASHRAE - Fundamentos (2009) cap. 1 eq. 12 /// Notas: a definição está ausente do Manual de 2017 /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="humRatio">Proporção de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Grau de saturação (sem unidade)</returns> público duplo GetDegreeOfSaturation(duplo tDryBulb, duplo humRatio, duplo pressão) { se (!(humRatio > = 0.0)) lançar novo InvalidOperationException("A relação de umidade é negativa"); var delimitadoHumRatio = Math.Max(humRatio, MIN_HUM_RATIO); Retorna delimitadoHumRatio / GetSatHumRatio(tDryBulb, pressão); } /// <resumo> /// Retorna a entalpia do ar úmido dada a temperatura do bulbo seco e a proporção de umidade. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 30 /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="humRatio">Proporção de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI]</param> /// <returns>Entalpia do ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹ [SI]</returns> público duplo GetMoistAirEnthalpy(duplo tDryBulb, duplo humRatio) { se (!(humRatio > = 0.0)) lançar novo InvalidOperationException("A relação de umidade é negativa"); var delimitadoHumRatio = Math.Max(humRatio, MIN_HUM_RATIO); se (Sistema de Unidades == UnidadeSistema.IP) Retorna 0.240 * tDryBulb + delimitadoHumRatio * (1061.0 + 0.444 * tDryBulb); Retorna (1.006 * tDryBulb + delimitadoHumRatio * (2501.0 + 1.86 * tDryBulb)) * 1000.0; } /// <resumo> /// Retorna o volume específico do ar úmido, dada a temperatura do bulbo seco, proporção de umidade e pressão. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 26 /// Notas: em unidades IP, R_DA_IP/144 é igual a 0,370486 que é o coeficiente que aparece na eq. 26. /// O fator 144 é para a conversão de Psi = lb in⁻² para lb ft⁻². /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="humRatio">Proporção de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Volume específico ft³ lb⁻¹ [IP] ou em m³ kg⁻¹ [SI]</returns> público duplo ObterMoistAirVolume(duplo tDryBulb, duplo humRatio, duplo pressão) { se (!(humRatio > = 0.0)) lançar novo InvalidOperationException("A relação de umidade é negativa"); var delimitadoHumRatio = Math.Max(humRatio, MIN_HUM_RATIO); se (Sistema de Unidades == UnidadeSistema.IP) Retorna R_DA_IP * GetTRankineFromTFahrenheit(tDryBulb) * (1.0 + 1.607858 * delimitadoHumRatio) / (144.0 * pressão); Retorna R_DA_SI * ObterTKelvinFromTCelsius(tDryBulb) * (1.0 + 1.607858 * delimitadoHumRatio) / pressão; } /// <resumo> /// Retorna a temperatura do bulbo seco considerando o volume específico do ar úmido, a taxa de umidade e a pressão. /// Referência: /// Manual ASHRAE - Fundamentos (2017) cap. 1 equação 26 /// Notas: /// Em unidades IP, R_DA_IP / 144 é igual a 0,370486 que é o coeficiente que aparece na equação 26 /// O fator 144 é para a conversão de Psi = lb in⁻² para lb ft⁻². /// Baseado na função `GetMoistAirVolume`, reorganizada para temperatura de bulbo seco. /// </sumário> /// <param name="MoistAirVolume">Volume específico de ar úmido em ft³ lb⁻¹ de ar seco [IP] ou em m³ kg⁻¹ de ar seco [SI]</param> /// <param name="humRatio">Proporção de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Temperatura de bulbo seco em °F [IP] ou °C [SI]</returns> público duplo GetTDryBulbFromMoistAirVolumeAndHumRatio(duplo MoistAirVolume, duplo humRatio, duplo pressão) { se (!(humRatio > = 0.0)) lançar novo InvalidOperationException("A relação de umidade é negativa"); var delimitadoHumRatio = Math.Max(humRatio, MIN_HUM_RATIO); se (Sistema de Unidades == UnidadeSistema.IP) Retorna GetTFahrenheitFromTRankine(MoistAirVolume * (144 * pressão) / (R_DA_IP * (1 + 1.607858 * delimitadoHumRatio))); Retorna ObterTCelsiusFromTKelvin(MoistAirVolume * pressão / (R_DA_SI * (1 + 1.607858 * delimitadoHumRatio))); } /// <resumo> /// Retorna a densidade do ar úmido de acordo com a taxa de umidade, temperatura de bulbo seco e pressão. /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 11 /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="humRatio">Proporção de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Densidade do ar úmido em lb ft⁻³ [IP] ou kg m⁻³ [SI]</returns> público duplo GetMoistAirDensity(duplo tDryBulb, duplo humRatio, duplo pressão) { se (!(humRatio > = 0.0)) lançar novo InvalidOperationException("A relação de umidade é negativa"); var delimitadoHumRatio = Math.Max(humRatio, MIN_HUM_RATIO); Retorna (1.0 + delimitadoHumRatio) / GetMoistAirVolume(tDryBulb, delimitadoHumRatio, pressão); } /********************************************** ************************************************** *** * Atmosfera padrão ************************************************** ************************************************** */ /// <resumo> /// Retorna a pressão barométrica atmosférica padrão, dada a elevação (altitude). /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 equação 3 /// </sumário> /// <param name="altitude">altitude em pés [IP] ou m [SI]</param> /// <returns>Pressão barométrica atmosférica padrão em Psi [IP] ou Pa [SI]</returns> público duplo ObterStandardAtmPressure(duplo altitude) { se (Sistema de Unidades == UnidadeSistema.IP) Retorna 14.696 * Math.Pow (1.0 - 6.8754e-06 * altitude, 5.2559); Retorna 101325.0 * Math.Pow (1.0 - 2.25577e-05 * altitude, 5.2559); } /// <resumo> /// Retorna a temperatura atmosférica padrão, dada a elevação (altitude). /// Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 equação 4 /// </sumário> /// <param name="altitude">altitude em pés [IP] ou m [SI]</param> /// <returns> Temperatura de bulbo seco da atmosfera padrão em °F [IP] ou °C [SI]</returns> público duplo ObterStandardAtmTemperature(duplo altitude) { se (Sistema de Unidades == UnidadeSistema.IP) Retorna 59.0 - 0.00356620 * altitude; Retorna 15.0 - 0.0065 * altitude; } /// <resumo> /// Retorno da pressão ao nível do mar dada a temperatura de bulbo seco, altitude acima do nível do mar e pressão. /// Referência: Hess SL, Introdução à meteorologia teórica, Holt Rinehart e Winston, NY 1959, /// CH. 6,5; Stull RB, Meteorologia para cientistas e engenheiros, 2ª edição, /// Brooks/Cole 2000, cap. 1. /// Notas: o procedimento padrão para os EUA é usar para tDryBulb a média /// da temperatura atual da estação e da temperatura da estação de 12 horas atrás. /// </sumário> /// <param name="stnPressure">Pressão observada da estação em Psi [IP] ou Pa [SI]</param> /// <param name="altitude">Altitude acima do nível do mar em pés [IP] ou m [SI]</param> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <returns>Pressão barométrica ao nível do mar em Psi [IP] ou Pa [SI]</returns> público duplo ObterSeaLevelPressure(duplo stnPressão, duplo altitude, duplo tDryBulb) { duplo h; se (Sistema de Unidades == UnidadeSistema.IP) { // Calcula a temperatura média na coluna de ar, assumindo uma taxa de lapso // de 3,6 °F/1000 pés var tColumn = tDryBulb + 0.0036 * altitude / 2.0; // Determina a altura da escala h = 53.351 * GetTRankineFromTFahrenheit(tColumn); } outro { // Calcula a temperatura média na coluna de ar, assumindo uma taxa de lapso // de 6,5 °C/km var tColumn = tDryBulb + 0.0065 * altitude / 2.0; // Determina a altura da escala h = 287.055 * ObterTKelvinFromTCelsius(tColumn) / 9.807; } //Calcula a pressão ao nível do mar var SeaLevelPressure = stnPressão * Math.Exp(altitude / h); Retorna seaLevelPressure; } /// <resumo> /// Pressão da estação de retorno da pressão ao nível do mar /// Referência: veja 'GetSeaLevelPressure' /// Notas: esta função é exatamente o inverso de 'GetSeaLevelPressure'. /// </sumário> /// <param name="seaLevelPressure">Pressão barométrica ao nível do mar em Psi [IP] ou Pa [SI]</param> /// <param name="altitude">Altitude acima do nível do mar em pés [IP] ou m [SI]</param> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <returns>Pressão da estação em Psi [IP] ou Pa [SI]</returns> público duplo GetStationPressão(duplo nível do marPressão, duplo altitude, duplo tDryBulb) { Retorna SeaLevelPressure / GetSeaLevelPressure(1.0, altitude, tDryBulb); } /********************************************** ************************************************** *** * Funções para definir todos os valores psicrométricos ************************************************** ************************************************** */ /// <resumo> /// Função utilitária para calcular a taxa de umidade, temperatura do ponto de orvalho, umidade relativa, /// pressão de vapor, entalpia de ar úmido, volume de ar úmido e grau de saturação do ar fornecido /// temperatura de bulbo seco, temperatura de bulbo úmido e pressão. /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="tWetBulb">Temperatura do bulbo úmido em °F [IP] ou °C [SI]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Valores calculados.</returns> público Valor psicrométrico CalcPsicrometriaFromTWetBulb(duplo tDryBulb, duplo tWetBulb, duplo pressão) { var valor = novo Valor psicrométrico { TDryBulb = tDryBulb, TWetBulb = tWetBulb, Pressão = pressão }; valor.HumRatio = GetHumRatioFromTWetBulb(tDryBulb, tWetBulb, pressão); valor.TDewPoint = GetTDewPointFromHumRatio(tDryBulb, valor.HumRatio, pressão); valor.RelHum = GetRelHumFromHumRatio(tDryBulb, valor.HumRatio, pressão); valor.VapPres = GetVapPresFromHumRatio(valor.HumRatio, pressão); valor.MoistAirEnthalpy = GetMoistAirEnthalpy(tDryBulb, valor.HumRatio); valor.MoistAirVolume = GetMoistAirVolume(tDryBulb, valor.HumRatio, pressão); valor.DegreeOfSaturation = GetDegreeOfSaturation(tDryBulb, valor.HumRatio, pressão); Retorna valor; } /// <resumo> /// Função utilitária para calcular a taxa de umidade, temperatura de bulbo úmido, umidade relativa, /// pressão de vapor, entalpia de ar úmido, volume de ar úmido e grau de saturação do ar fornecido /// temperatura de bulbo seco, temperatura de ponto de orvalho e pressão. /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="tDewPoint">Temperatura do ponto de orvalho em °F [IP] ou °C [SI]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Valores calculados.</returns> público Valor psicrométrico CalcPsicrometriaFromTDewPoint(duplo tDryBulb, duplo tDewPoint, duplo pressão) { var valor = novo Valor psicrométrico { TDryBulb = tDryBulb, TDewPoint = tDewPoint, Pressão = pressão }; valor.HumRatio = GetHumRatioFromTDewPoint(tDewPoint, pressão); valor.TWetBulb = GetTWetBulbFromHumRatio(tDryBulb, valor.HumRatio, pressão); valor.RelHum = GetRelHumFromHumRatio(tDryBulb, valor.HumRatio, pressão); valor.VapPres = GetVapPresFromHumRatio(valor.HumRatio, pressão); valor.MoistAirEnthalpy = GetMoistAirEnthalpy(tDryBulb, valor.HumRatio); valor.MoistAirVolume = GetMoistAirVolume(tDryBulb, valor.HumRatio, pressão); valor.DegreeOfSaturation = GetDegreeOfSaturation(tDryBulb, valor.HumRatio, pressão); Retorna valor; } /// <resumo> /// Função utilitária para calcular a taxa de umidade, temperatura de bulbo úmido, temperatura de ponto de orvalho, /// pressão de vapor, entalpia de ar úmido, volume de ar úmido e grau de saturação do ar fornecido /// temperatura de bulbo seco, umidade relativa e pressão. /// </sumário> /// <param name="tDryBulb">Temperatura do bulbo seco em °F [IP] ou °C [SI]</param> /// <param name="relHum">Umidade relativa [0-1]</param> /// <param name="pressão">Pressão atmosférica em Psi [IP] ou Pa [SI]</param> /// <returns>Valores calculados.</returns> público Valor psicrométrico CalcPsicrometriaFromRelHum(duplo tDryBulb, duplo relHum, duplo pressão) { var valor = novo Valor psicrométrico { TDryBulb = tDryBulb, RelHum = relHum, Pressão = pressão }; valor.HumRatio = GetHumRatioFromRelHum(tDryBulb, relHum, pressão); valor.TWetBulb = GetTWetBulbFromHumRatio(tDryBulb, valor.HumRatio, pressão); valor.TDewPoint = GetTDewPointFromHumRatio(tDryBulb, valor.HumRatio, pressão); valor.VapPres = GetVapPresFromHumRatio(valor.HumRatio, pressão); valor.MoistAirEnthalpy = GetMoistAirEnthalpy(tDryBulb, valor.HumRatio); valor.MoistAirVolume = GetMoistAirVolume(tDryBulb, valor.HumRatio, pressão); valor.DegreeOfSaturation = GetDegreeOfSaturation(tDryBulb, valor.HumRatio, pressão); Retorna valor; } } /// <resumo> /// Contém resultados de saída de um cálculo psicrométrico. /// </sumário> público classe Valor psicrométrico { /// <resumo> /// Temperatura de bulbo seco em °F [IP] ou °C [SI] /// </sumário> público duplo TDryBulb { obter; conjunto; } /// <resumo> /// Temperatura de bulbo úmido em °F [IP] ou °C [SI] /// </sumário> público duplo TWetBulb { obter; conjunto; } /// <resumo> /// Pressão atmosférica em Psi [IP] ou Pa [SI] /// </sumário> público duplo Pressão { obter; conjunto; } /// <resumo> /// Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] /// </sumário> público duplo HumRatio { obter; conjunto; } /// <resumo> /// Temperatura do ponto de orvalho em °F [IP] ou °C [SI] /// </sumário> público duplo TDewPoint { obter; conjunto; } /// <resumo> /// Umidade relativa [0-1] /// </sumário> público duplo RelHum { obter; conjunto; } /// <resumo> /// Pressão parcial do vapor de água no ar úmido em Psi [IP] ou Pa [SI] /// </sumário> público duplo VapPres { obter; conjunto; } /// <resumo> /// Entalpia do ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹ [SI] /// </sumário> público duplo MoistAirEnthalpia { obter; conjunto; } /// <resumo> /// Volume específico ft³ lb⁻¹ [IP] ou em m³ kg⁻¹ [SI] /// </sumário> público duplo Volume de ar úmido { obter; conjunto; } /// <resumo> /// Grau de saturação [sem unidade] /// </sumário> público duplo Grau de saturação { obter; conjunto; } } /// <resumo> /// Sistemas de unidades padrão /// </sumário> público enum UnitSystem { /// <resumo> /// Unidades imperiais /// </sumário> IP = 1, /// <resumo> /// Unidades do sistema métrico /// </sumário> SI = 2 } } |
Fortran
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 | ! PsychroLib (versão 2.3.0) (https://github.com/psychrometrics/psychrolib) ! Copyright (c) 2018 D. Thevenard e D. Meyer para a implementação atual da biblioteca ! Copyright (c) Manual ASHRAE 2017 - Fundamentos para equações e coeficientes ASHRAE ! Licenciado sob a licença MIT. módulo psicrolib !+ Visão geral do módulo !+ Contém funções para calcular propriedades termodinâmicas de misturas gás-vapor !+ e atmosfera padrão adequada para a maioria das aplicações de engenharia, física e meteorológica !+ aplicativos. ! + !+ A maioria das funções são uma implementação das fórmulas encontradas no !+ Manual ASHRAE 2017 - Fundamentos, tanto no Sistema Internacional (SI), Unidades !+ e Imperiais (IP). Consulte as informações incluídas em !+ cada função para sua respectiva referência. ! + ! + Exemplo !+ use psychrolib, apenas: GetTDewPointFromRelHum, SetUnitSystem, SI !+ ! Defina o sistema de unidades, por exemplo, para SI (pode ser 'SI' ou 'IP') !+ chamar SetUnitSystem(SI) !+ ! Calcule a temperatura do ponto de orvalho para uma temperatura de bulbo seco de 25°C e uma umidade relativa de 80% !+ imprimir *, GetTDewPointFromRelHum(25,0, 0,80) ! + 21,3094 ! + !+ Direitos autorais !+ - Para a implementação atual da biblioteca !+ Copyright (c) 2018 D. Thevenard e D. Meyer. !+ - Para equações e coeficientes publicados Manual ASHRAE - Fundamentos, Capítulo 1 !+ Copyright (c) Manual ASHRAE 2017 - Fundamentos (https://www.ashrae.org) ! + ! + Licença !+ MIT (https://github.com/psychrometrics/psychrolib/LICENSE.txt) ! + !+ Nota dos Autores !+ Fizemos todos os esforços para garantir que o código seja adequado, porém, não fazemos !+ representação em relação à sua precisão. Use por sua conta e risco. Você deveria notar !+ um erro, ou se você tiver uma sugestão, avise-nos através do GitHub em !+ https://github.com/psychrometrics/psychrolib/issues. implícito nenhum privado público :: IP público :: SI público :: SetUnitSystem público :: GetUnitSystem público :: isIP público :: GetTRankineFromTFahrenheit público :: GetTFahrenheitFromTRankine público :: ObterTKelvinFromTCelsius público :: ObterTCelsiusFromTKelvin público :: GetTWetBulbFromTDewPoint público :: GetTWetBulbFromRelHum público :: GetRelHumFromTDewPoint público :: GetRelHumFromTWetBulb público :: GetTDewPointFromRelHum público :: ObterTDewPointFromTWetBulb público :: GetVapPresFromRelHum público :: GetRelHumFromVapPres público :: GetTDewPointFromVapPres público :: GetVapPresFromTDewPoint público :: GetTWetBulbFromHumRatio público :: ObterHumRatioFromTWetBulb público :: GetHumRatioFromRelHum público :: GetRelHumFromHumRatio público :: GetHumRatioFromTDewPoint público :: ObterTDewPointFromHumRatio público :: GetHumRatioFromVapPres público :: GetVapPresFromHumRatio público :: GetDryAirEnthalpy público :: GetDryAirDensity público :: ObterDryAirVolume público :: GetTDryBulbFromEnthalpyAndHumRatio público :: GetHumRatioFromEnthalpyAndTDryBulb público :: GetSatVapPres público :: GetSatHumRatio público :: GetSatAirEnthalpy público :: Obter Déficit de Pressão de Vapor público :: GetDegreeOfSaturation público :: GetMoistAirEnthalpy público :: ObterMoistAirVolume público :: GetTDryBulbFromMoistAirVolumeAndHumRatio público :: GetMoistAirDensity público :: ObterStandardAtmPressure público :: ObterStandardAtmTemperature público :: ObterSeaLevelPressure público :: GetStationPressão público :: GetSpecificHumFromHumRatio público :: GetHumRatioFromSpecificHum público :: CalcPsicrometriaFromTWetBulb público :: CalcPsicrometriaFromTDewPoint público :: CalcPsicrometriaFromRelHum público :: dLnPws_ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ! Constantes globais !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! real, parâmetro :: ZERO_FAHRENHEIT_AS_RANKINE = 459.67 !+ Zero grau Fahrenheit (°F) expresso como grau Rankine (°R). !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 39. real, parâmetro :: ZERO_CELSIUS_AS_KELVIN = 273.15 !+ Zero grau Celsius (°C) expresso em Kelvin (K). !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 39. real, parâmetro :: R_DA_IP = 53.350 !+ Constante de gás universal para ar seco (versão IP) em pés lb_Force lb_DryAir⁻¹ R⁻¹. !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1. real, parâmetro :: R_DA_SI = 287.042 !+ Constante de gás universal para ar seco (versão SI) em J kg_DryAir⁻¹ K⁻¹. !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1. inteiro, parâmetro :: IP = 1 inteiro, parâmetro :: SI = 2 inteiro :: PSYCHROLIB_UNITS = 0 ! 0 = indefinido. !+ Sistema de unidades a ser usado. real :: PSYCHROLIB_TOLERANCE = 1.0 !+ Tolerância de cálculos de temperatura. inteiro, parâmetro :: MAX_ITER_COUNT = 100 !+ Número máximo de iterações antes de sair dos loops while. real, parâmetro :: MIN_HUM_RATIO = 1e-7 !+ Razão de umidade mínima aceitável usada/devolvida por qualquer função. !+ Qualquer valor acima de 0 ou abaixo de MIN_HUM_RATIO será redefinido para este valor. real, parâmetro :: FREEZING_POINT_WATER_IP = 32.0 !+ float: Ponto de congelamento da água em Fahrenheit. real, parâmetro :: FREEZING_POINT_WATER_SI = 0.0 !+ float: Ponto de congelamento da água em Celsius. real, parâmetro :: TRIPLE_POINT_WATER_IP = 32.018 !+ float: Ponto triplo da água em Fahrenheit. real, parâmetro :: TRIPLE_POINT_WATER_SI = 0.01 !+ float: Ponto triplo da água em Celsius. contém !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ! Funções auxiliares !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! sub-rotina SetUnitSystem(UnitSystem) !+ Defina o sistema de unidades a utilizar (SI ou IP). !+ Notas: esta função *TEM QUE SER CHAMADA* antes que a biblioteca possa ser usada inteiro, intenção(em) :: UnitSystem !+ Unidades: string indicando o sistema de unidades escolhido (SI ou IP) se (.não. (UnitSystem == SI .ou. UnitSystem == IP)) em seguida erro Pare "O sistema de unidades deve ser SI ou IP." fim se PSYCHROLIB_UNITS = UnitSystem ! Definir tolerância nos cálculos de temperatura ! A tolerância é a mesma em IP e SI se (UnitSystem == IP) em seguida PSYCHROLIB_TOLERANCE = 0.001 * 9.0 / 5.0 outro PSYCHROLIB_TOLERANCE = 0.001 fim se finalizar sub-rotina SetUnitSystem função GetUnitSystem() resultado(UnitSystem) !+ Retorna o sistema de unidades em uso. inteiro :: UnitSystem UnitSystem = PSYCHROLIB_UNITS função final GetUnitSystem função isIP() !+ Verifique se o sistema em uso é IP ou SI lógico :: isIP se (PSYCHROLIB_UNITS == IP) em seguida isIP = .verdade. mais se (PSYCHROLIB_UNITS == SI) em seguida isIP = .falso. outro erro Pare "O sistema de unidades não foi definido." fim se função final isIP !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ! Conversão entre unidades de temperatura !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! função GetTRankineFromTFahrenheit(TFahrenheit) resultado(TRankine) !+ Função utilitária para converter temperatura em grau Rankine (°R) !+ dada temperatura em graus Fahrenheit (°F). !+ Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 seção 3 real, intenção(em) :: TFahrenheit !+ Temperatura em graus Fahrenheit real :: TRankine !+ Temperatura em graus Rankine TRankine = TFahrenheit + ZERO_FAHRENHEIT_AS_RANKINE função final GetTRankineFromTFahrenheit função GetTFahrenheitFromTRankine(TRankine) resultado(TFahrenheit) !+ Função utilitária para converter temperatura em graus Fahrenheit (°F) !+ dada temperatura em grau Rankine (°R). !+ Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 seção 3 real, intenção(em) :: TRankine !+ Temperatura em graus Rankine real :: TFahrenheit !+ Temperatura em graus Fahrenheit TFahrenheit = TRankine - ZERO_FAHRENHEIT_AS_RANKINE função final GetTFahrenheitFromTRankine função ObterTKelvinFromTCelsius(TCelsius) resultado(TKelvin) !+ Função utilitária para converter temperatura em Kelvin (K) !+ dada temperatura em graus Celsius (°C). !+ Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 seção 3 real, intenção(em) :: TCelsius !+ Temperatura em graus Celsius real :: TKelvin !+ Tempearatyre em Kelvin TKelvin = TCelsius + ZERO_CELSIUS_AS_KELVIN função final ObterTKelvinFromTCelsius função ObterTCelsiusFromTKelvin(TKelvin) resultado(TCelsius) !+ Função utilitária para converter temperatura em graus Celsius (°C) !+ dada temperatura em Kelvin (K). !+ Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 seção 3 real, intenção(em) :: TKelvin !+ Tempearatyre em Kelvin real :: TCelsius !+ Temperatura em graus Celsius TCelsius = TKelvin - ZERO_CELSIUS_AS_KELVIN função final ObterTCelsiusFromTKelvin !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ! Conversões entre ponto de orvalho, bulbo úmido e umidade relativa !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! função GetTWetBulbFromTDewPoint(TDryBulb, TDewPoint, Pressão) resultado(TWetBulb) !+ Retorno da temperatura de bulbo úmido dada a temperatura de bulbo seco, temperatura de ponto de orvalho e pressão. !+ Referências: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: TDewPoint !+ Temperatura do ponto de orvalho em °F [IP] ou °C [SI] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real :: TWetBulb !+ Temperatura de bulbo úmido em °F [IP] ou °C [SI] real :: HumRatio !+ Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] se (TDewPoint > TDryBulb) em seguida erro Pare "Erro: a temperatura do ponto de orvalho está acima da temperatura do bulbo seco" fim se HumRatio = GetHumRatioFromTDewPoint(TDewPoint, Pressão) TWetBulb = GetTWetBulbFromHumRatio(TDryBulb, HumRatio, Pressão) função final GetTWetBulbFromTDewPoint função GetTWetBulbFromRelHum(TDryBulb, RelHum, Pressão) resultado(TWetBulb) !+ Retorna a temperatura de bulbo úmido dada a temperatura de bulbo seco, umidade relativa e pressão. !+ Referências: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: RelHum !+ Umidade relativa na faixa [0, 1] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real :: TWetBulb !+ Temperatura de bulbo úmido em °F [IP] ou °C [SI] real :: HumRatio !+ Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] se (RelHum < 0.0 .ou. RelHum > 1.0) em seguida erro Pare "Erro: a umidade relativa está fora da faixa [0,1]" fim se HumRatio = GetHumRatioFromRelHum(TDryBulb, RelHum, Pressão) TWetBulb = GetTWetBulbFromHumRatio(TDryBulb, HumRatio, Pressão) função final GetTWetBulbFromRelHum função GetRelHumFromTDewPoint(TDryBulb, TDewPoint) resultado(RelHum) !+ Retorna a umidade relativa dada a temperatura de bulbo seco e a temperatura do ponto de orvalho. !+ Referências: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 equação 22 real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: TDewPoint !+ Temperatura do ponto de orvalho em °F [IP] ou °C [SI] real :: RelHum !+ Umidade relativa na faixa [0, 1] real :: VapPres !+ Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] real :: SatVapPres !+ Pressão de vapor do ar saturado em Psi [IP] ou Pa [SI] se (TDewPoint > TDryBulb) em seguida erro Pare "Erro: a temperatura do ponto de orvalho está acima da temperatura do bulbo seco" fim se VapPres = GetSatVapPres(TDewPoint) SatVapPres = GetSatVapPres(TDryBulb) RelHum = VapPres / SatVapPres função final GetRelHumFromTDewPoint função GetRelHumFromTWetBulb(TDryBulb, TWetBulb, Pressão) resultado(RelHum) !+ Retorna a umidade relativa dada a temperatura de bulbo seco, temperatura de bulbo úmido e pressão. !+ Referências: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: TWetBulb !+ Temperatura de bulbo úmido em °F [IP] ou °C [SI] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real :: RelHum !+ Umidade relativa na faixa [0, 1] real :: HumRatio !+ Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] se (TWetBulb > TDryBulb) em seguida erro Pare "Erro: a temperatura do bulbo úmido está acima da temperatura do bulbo seco" fim se HumRatio = ObterHumRatioFromTWetBulb(TDryBulb, TWetBulb, Pressão) RelHum = GetRelHumFromHumRatio(TDryBulb, HumRatio, Pressão) função final GetRelHumFromTWetBulb função GetTDewPointFromRelHum(TDryBulb, RelHum) resultado(TDewPoint) !+ Retorno da temperatura do ponto de orvalho dada a temperatura do bulbo seco e a umidade relativa. !+ Referências: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: RelHum !+ Umidade relativa na faixa [0, 1] real :: TDewPoint !+ Temperatura do ponto de orvalho em °F [IP] ou °C [SI] real :: VapPres !+ Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] se (RelHum < 0.0 .ou. RelHum > 1.0) em seguida erro Pare "Erro: a umidade relativa está fora da faixa [0,1]" fim se VapPres = GetVapPresFromRelHum(TDryBulb, RelHum) TDewPoint = GetTDewPointFromVapPres(TDryBulb, VapPres) função final GetTDewPointFromRelHum função ObterTDewPointFromTWetBulb(TDryBulb, TWetBulb, Pressão) resultado(TDewPoint) !+ Temperatura de ponto de orvalho de retorno dada a temperatura de bulbo seco, temperatura de bulbo úmido e pressão. !+ Referências: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: TWetBulb !+ Temperatura de bulbo úmido em °F [IP] ou °C [SI] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real :: TDewPoint !+ Temperatura do ponto de orvalho em °F [IP] ou °C [SI] real :: HumRatio !+ Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] se (TWetBulb > TDryBulb) em seguida erro Pare "Erro: a temperatura do bulbo úmido está acima da temperatura do bulbo seco" fim se HumRatio = ObterHumRatioFromTWetBulb(TDryBulb, TWetBulb, Pressão) TDewPoint = ObterTDewPointFromHumRatio(TDryBulb, HumRatio, Pressão) função final ObterTDewPointFromTWetBulb !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ! Conversões entre ponto de orvalho ou umidade relativa e pressão de vapor !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! função GetVapPresFromRelHum(TDryBulb, RelHum) resultado(VapPres) !+ Retorna a pressão parcial do vapor d'água em função da umidade relativa e da temperatura. !+ Referências: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 12, 22 real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: RelHum !+ Umidade relativa na faixa [0, 1] real :: VapPres !+ Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] se (RelHum < 0.0 .ou. RelHum > 1.0) em seguida erro Pare "Erro: a umidade relativa está fora da faixa [0,1]" fim se VapPres = RelHum * GetSatVapPres(TDryBulb) função final GetVapPresFromRelHum função GetRelHumFromVapPres(TDryBulb, VapPres) resultado(RelHum) !+ Retorna a umidade relativa dada a temperatura de bulbo seco e a pressão de vapor. !+ Referências: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 12, 22 real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: VapPres !+ Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] real :: RelHum !+ Umidade relativa na faixa [0, 1] se (VapPres < 0.0) em seguida erro Pare "Erro: a pressão parcial do vapor d'água no ar úmido não pode ser negativa" fim se RelHum = VapPres / GetSatVapPres(TDryBulb) função final GetRelHumFromVapPres função dLnPws_(TDryBulb) resultado(dLnPws) !+ Função auxiliar retornando a derivada do logaritmo natural da pressão de vapor de saturação !+ em função da temperatura de bulbo seco. !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 equação 5 real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real :: dLnPws !+ Derivada do logaritmo natural da pressão de vapor do ar saturado em Psi [IP] ou Pa [SI] real :: T !+ Temperatura de bulbo seco em R [IP] ou K [SI] se (isIP()) em seguida T = GetTRankineFromTFahrenheit(TDryBulb) se (TDryBulb <= TRIPLE_POINT_WATER_IP) em seguida dLnPws = 1.0214165E+04 / T**2 - 5.3765794E-03 + 2 * 1.9202377E-07 * T E + 3 * 3.5575832E-10 * T**2 - 4 * 9.0344688E-14 * T**3 + 4.1635019 / T outro dLnPws = 1.0440397E+04 / T**2 - 2.7022355E-02 + 2 * 1.2890360E-05 * T E - 3 * 2.4780681E-09 * T**2 + 6.5459673 / T fim se outro T = ObterTKelvinFromTCelsius(TDryBulb) se (TDryBulb <= TRIPLE_POINT_WATER_SI) em seguida dLnPws = 5.6745359E+03 / T**2 - 9.677843E-03 + 2 * 6.2215701E-07 * T E + 3 * 2.0747825E-09 * T**2 - 4 * 9.484024E-13 * T**3 + 4.1635019 / T outro dLnPws = 5.8002206E+03 / T**2 - 4.8640239E-02 + 2 * 4.1764768E-05 * T E - 3 * 1.4452093E-08 * T**2 + 6.5459673 / T fim se fim se função final dLnPws_ função GetTDewPointFromVapPres(TDryBulb, VapPres) resultado(TDewPoint) !+ Temperatura de retorno do ponto de orvalho dada a temperatura de bulbo seco e a pressão de vapor. !+ Referências: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 5 e 6 ! + Notas: !+ A temperatura do ponto de orvalho é resolvida invertendo a equação que fornece a pressão do vapor de água !+ na saturação da temperatura em vez de usar as regressões fornecidas !+ da ASHRAE (eqn. 37 e 38) que são muito menos precisos e têm um !+ faixa de validade mais estreita. !+ O método Newton-Raphson (NR) é usado no logaritmo do vapor de água !+ pressão em função da temperatura, que é uma função muito suave !+ A convergência geralmente é alcançada em 3 a 5 iterações. !+ TDryBulb não é realmente necessário aqui, apenas usado por conveniência. real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: VapPres !+ Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] real :: TDewPoint !+ Temperatura do ponto de orvalho em °F [IP] ou °C [SI] real :: lnVP !+ Logaritmo natural da pressão parcial da pressão do vapor de água no ar úmido real :: d_lnVP !+ Derivada da função, calculada numericamente real :: lnVP_iter !+ Valor do log da pressão de vapor de água usado no cálculo de NR real :: TDewPoint_iter !+ Valor do TDewPoint usado no cálculo do NR real, dimensão(2) :: BOUNDS !+ Faixa de temperatura válida em °F [IP] ou °C [SI] inteiro :: índice !+ Índice usado no cálculo ! Limites e tamanho do passo em função do sistema de unidades se (isIP()) em seguida BOUNDS(1) = -148.0 BOUNDS(2) = 392.0 outro BOUNDS(1) = -100.0 BOUNDS(2) = 200.0 fim se ! Verificação de validade – limites fora dos quais uma solução não pode ser encontrada se (VapPres < GetSatVapPres(BOUNDS(1)) .ou. VapPres > GetSatVapPres(BOUNDS(2))) em seguida erro Pare "Erro: a pressão parcial do vapor d'água está fora da faixa de validade das equações" fim se ! Usamos NR para aproximar a solução. TDewPoint = TDryBulb lnVP = registro(VapPres) índice = 1 fazer enquanto (.verdade.) TDewPoint_iter = TDewPoint ! TDewPoint_iter usado no cálculo do NR lnVP_iter = registro(GetSatVapPres(TDewPoint_iter)) ! Derivada de função, calculada analiticamente d_lnVP = dLnPws_(TDewPoint_iter) ! Nova estimativa, limitada pelo domínio de pesquisa definido acima TDewPoint = TDewPoint_iter - (lnVP_iter - lnVP) / d_lnVP TDewPoint = max(TDewPoint, BOUNDS(1)) TDewPoint = min(TDewPoint, BOUNDS(2)) se (abs(TDewPoint - TDewPoint_iter) <= PSYCHROLIB_TOLERANCE) em seguida saída fim se E se (índice > MAX_ITER_COUNT) em seguida erro Pare "Convergência não alcançada em GetTDewPointFromVapPres. Parando." fim se índice = índice + 1 fim fazer TDewPoint = min(TDewPoint, TDryBulb) função final GetTDewPointFromVapPres função GetVapPresFromTDewPoint(TDewPoint) resultado(VapPres) !+ Pressão de vapor de retorno dada a temperatura do ponto de orvalho. !+ Referências: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 equação 36 real, intenção(em) :: TDewPoint !+ Temperatura do ponto de orvalho em °F [IP] ou °C [SI] real :: VapPres !+ Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] VapPres = GetSatVapPres(TDewPoint) função final GetVapPresFromTDewPoint !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ! Conversões de temperatura de bulbo úmido, temperatura de ponto de orvalho ou umidade relativa para proporção de umidade !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! função GetTWetBulbFromHumRatio(TDryBulb, HumRatio, Pressão) resultado(TWetBulb) !+ Retorna a temperatura de bulbo úmido dada a temperatura de bulbo seco, taxa de umidade e pressão. !+ Referências: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 eqn 33 e 35 resolvido para Tstar real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: HumRatio !+ Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real :: TWetBulb !+ Temperatura de bulbo úmido em °F [IP] ou °C [SI] real :: TDewPoint !+ TDewPoint : Temperatura do ponto de orvalho em °F [IP] ou °C [SI] real :: TWetBulbSup !+ Valor superior da temperatura do bulbo úmido no método de bissecção (a estimativa inicial é da temperatura do bulbo seco) em °F [IP] ou °C [SI] real :: TWetBulbInf !+ Valor mais baixo da temperatura de bulbo úmido no método de bissecção (a estimativa inicial é a partir da temperatura do ponto de orvalho) em °F [IP] ou °C [SI] real :: Wstar !+ Razão de umidade na temperatura Tstar em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] real :: LimitadaHumRatio !+ Razão de umidade limitada a MIN_HUM_RATIO inteiro :: índice !+ índice usado na iteração se (HumRatio < 0.0) em seguida erro Pare "Erro: a proporção de umidade não pode ser negativa" fim se LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) TDewPoint = ObterTDewPointFromHumRatio(TDryBulb, LimitadaHumRatio, Pressão) ! Suposições iniciais TWetBulbSup = TDryBulb TWetBulbInf = TDewPoint TWetBulb = (TWetBulbInf + TWetBulbSup) / 2.0 índice = 1 ! Loop de bissecção fazer enquanto ((TWetBulbSup - TWetBulbInf) > PSYCHROLIB_TOLERANCE) ! Calcular a taxa de umidade na temperatura Tstar Wstar = ObterHumRatioFromTWetBulb(TDryBulb, TWetBulb, Pressão) ! Obtenha novos limites se (Wstar > LimitadaHumRatio) em seguida TWetBulbSup = TWetBulb outro TWetBulbInf = TWetBulb fim se ! Nova estimativa da temperatura do bulbo úmido TWetBulb = (TWetBulbSup + TWetBulbInf) / 2.0 se (índice > MAX_ITER_COUNT) em seguida erro Pare "Convergência não alcançada em GetTWetBulbFromHumRatio. Parando." fim se índice = índice + 1 fim fazer função final GetTWetBulbFromHumRatio função ObterHumRatioFromTWetBulb(TDryBulb, TWetBulb, Pressão) resultado(HumRatio) !+ Taxa de umidade de retorno dada a temperatura de bulbo seco, temperatura de bulbo úmido e pressão. !+ Referências: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 33 e 35 real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: TWetBulb !+ Temperatura de bulbo úmido em °F [IP] ou °C [SI] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real :: HumRatio !+ Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] real :: Wsstar !+ Razão de umidade na temperatura Tstar em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] se (TWetBulb > TDryBulb) em seguida erro Pare "Erro: a temperatura do bulbo úmido está acima da temperatura do bulbo seco" fim se Wsstar = GetSatHumRatio(TWetBulb, Pressão) se (isIP()) em seguida E se (TWetBulb > = FREEZING_POINT_WATER_IP) em seguida HumRatio = ((1093.0 - 0.556 * TWetBulb) * Wsstar - 0.240 * (TDryBulb - TWetBulb)) E / (1093.0 + 0.444 * TDryBulb - TWetBulb) outro HumRatio = ((1220.0 - 0.04 * TWetBulb) * Wsstar - 0.240 * (TDryBulb - TWetBulb)) E / (1220.0 + 0.444 * TDryBulb - 0.48 * TWetBulb) fim se outro E se (TWetBulb > = FREEZING_POINT_WATER_SI) em seguida HumRatio = ((2501.0 - 2.326 * TWetBulb) * Wsstar - 1.006 * (TDryBulb - TWetBulb)) E / (2501.0 + 1.86 * TDryBulb - 4.186 * TWetBulb) outro HumRatio = ((2830.0 - 0.24 * TWetBulb) * Wsstar - 1.006 * (TDryBulb - TWetBulb)) E / (2830.0 + 1.86 * TDryBulb - 2.1 * TWetBulb) fim se fim se ! Verificação de validade. HumRatio = max(HumRatio, MIN_HUM_RATIO) função final ObterHumRatioFromTWetBulb função GetHumRatioFromRelHum(TDryBulb, RelHum, Pressão) resultado(HumRatio) !+ Taxa de umidade de retorno dada a temperatura de bulbo seco, umidade relativa e pressão. !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: RelHum !+ Umidade relativa na faixa [0, 1] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real :: HumRatio !+ Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] real :: VapPres !+ Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] se (RelHum < 0.0 .ou. RelHum > 1.0) em seguida erro Pare "Erro: a umidade relativa está fora da faixa [0,1]" fim se VapPres = GetVapPresFromRelHum(TDryBulb, RelHum) HumRatio = GetHumRatioFromVapPres(VapPres, Pressão) função final GetHumRatioFromRelHum função GetRelHumFromHumRatio(TDryBulb, HumRatio, Pressão) resultado(RelHum) !+ Retorna a umidade relativa dada a temperatura de bulbo seco, taxa de umidade e pressão. !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: HumRatio !+ Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real :: RelHum !+ Umidade relativa na faixa [0, 1] real :: VapPres !+ Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] se (HumRatio < 0.0) em seguida erro Pare "Erro: a proporção de umidade não pode ser negativa" fim se VapPres = GetVapPresFromHumRatio(HumRatio, Pressão) RelHum = GetRelHumFromVapPres(TDryBulb, VapPres) função final GetRelHumFromHumRatio função GetHumRatioFromTDewPoint(TDewPoint, Pressão) resultado(HumRatio) !+ Taxa de umidade de retorno dada a temperatura e pressão do ponto de orvalho. !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 real, intenção(em) :: TDewPoint !+ Temperatura do ponto de orvalho em °F [IP] ou °C [SI] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real :: HumRatio !+ Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] real :: VapPres !+ Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] VapPres = GetSatVapPres(TDewPoint) HumRatio = GetHumRatioFromVapPres(VapPres, Pressão) função final GetHumRatioFromTDewPoint função ObterTDewPointFromHumRatio(TDryBulb, HumRatio, Pressão) resultado(TDewPoint) !+ Temperatura de retorno do ponto de orvalho dada a temperatura de bulbo seco, taxa de umidade e pressão. !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: HumRatio !+ Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real :: TDewPoint !+ Temperatura do ponto de orvalho em °F [IP] ou °C [SI] real :: VapPres !+ Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] se (HumRatio < 0.0) em seguida erro Pare "Erro: a proporção de umidade não pode ser negativa" fim se VapPres = GetVapPresFromHumRatio(HumRatio, Pressão) TDewPoint = GetTDewPointFromVapPres(TDryBulb, VapPres) função final ObterTDewPointFromHumRatio !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ! Conversões entre taxa de umidade e pressão de vapor !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! função GetHumRatioFromVapPres(VapPres, Pressão) resultado(HumRatio) !+ Relação de umidade de retorno dada a pressão de vapor de água e a pressão atmosférica. !+ Referência: !+ Fundamentos da ASHRAE (2005) cap. 6 eq. 22; !+ Fundamentos da ASHRAE (2009) cap. 1 eq. 22. real, intenção(em) :: VapPres !+ Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real :: HumRatio !+ Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] se (VapPres < 0.0) em seguida erro Pare "Erro: a pressão parcial do vapor d'água no ar úmido não pode ser negativa" fim se HumRatio = 0.621945 * VapPres / (Pressão-VapPres) ! Verificação de validade. HumRatio = max(HumRatio, MIN_HUM_RATIO) função final GetHumRatioFromVapPres função GetVapPresFromHumRatio(HumRatio, Pressão) resultado(VapPres) !+ Pressão de vapor de retorno dada a relação de umidade e pressão. !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 eqn 20 resolvido para pw real, intenção(em) :: HumRatio !+ Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real :: VapPres !+ Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] real :: LimitadaHumRatio !+ Razão de umidade limitada a MIN_HUM_RATIO se (HumRatio < 0.0) em seguida erro Pare "Erro: a taxa de umidade é negativa" fim se LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) VapPres = Pressão * LimitadaHumRatio / (0.621945 + LimitadaHumRatio) função final GetVapPresFromHumRatio !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ! Conversões entre taxa de umidade e umidade específica !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! função GetSpecificHumFromHumRatio(HumRatio) resultado(EspecíficoHum) !+ Retorna a umidade específica da proporção de umidade (também conhecida como proporção de mistura). !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 equação 9b real, intenção(em) :: HumRatio !+ Razão de umidade em lb_H₂O lb_Dry_Air⁻¹ [IP] ou kg_H₂O kg_Dry_Air⁻¹ [SI] real :: EspecíficoHum !+ Umidade específica em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] real :: LimitadaHumRatio !+ Razão de umidade limitada a MIN_HUM_RATIO se (HumRatio < 0.0) em seguida erro Pare "Erro: a proporção de umidade não pode ser negativa" fim se LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) EspecíficoHum = LimitadaHumRatio / (1.0 + LimitadaHumRatio) função final GetSpecificHumFromHumRatio função GetHumRatioFromSpecificHum(EspecíficoHum) resultado(HumRatio) !+ Retorna a proporção de umidade (também conhecida como proporção de mistura) da umidade específica. !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 eqn 9b (resolvido para proporção de umidade) real, intenção(em) :: EspecíficoHum !+ Umidade específica em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] real :: HumRatio !+ Razão de umidade em lb_H₂O lb_Dry_Air⁻¹ [IP] ou kg_H₂O kg_Dry_Air⁻¹ [SI] se (EspecíficoHum < 0.0 .ou. EspecíficoHum > = 1.0) em seguida erro Pare "Erro: a umidade específica está fora da faixa [0, 1[" fim se HumRatio = EspecíficoHum / (1.0 - EspecíficoHum) ! Verificação de validade. HumRatio = max(HumRatio, MIN_HUM_RATIO) função final GetHumRatioFromSpecificHum !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ! Cálculos de Ar Seco !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! função GetDryAirEnthalpy(TDryBulb) resultado(DryAirEntalpia) !+ Retorna a entalpia do ar seco dada a temperatura do bulbo seco. !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 equação 28 real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real :: DryAirEntalpia !+ Entalpia do ar seco em Btu lb⁻¹ [IP] ou J kg⁻¹ [SI] se (isIP()) em seguida DryAirEntalpia = 0.240 * TDryBulb outro DryAirEntalpia = 1006 * TDryBulb fim se função final GetDryAirEnthalpy função GetDryAirDensity(TDryBulb, Pressão) resultado(Densidade de Ar Seco) !+ Retorna a densidade do ar seco dada a temperatura e pressão do bulbo seco. !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 ! + Notas: !+ Eqn 14 para a relação de gás perfeita para ar seco. !+ Eqn 1 para a constante universal dos gases. !+ O fator 144 em IP é para a conversão de Psi = lb in⁻² para lb ft⁻². real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real :: Densidade de Ar Seco !+ Densidade do ar seco em lb ft⁻³ [IP] ou kg m⁻³ [SI] se (isIP()) em seguida Densidade de Ar Seco = (144 * Pressão) / R_DA_IP / GetTRankineFromTFahrenheit(TDryBulb) outro Densidade de Ar Seco = Pressão / R_DA_SI / ObterTKelvinFromTCelsius(TDryBulb) fim se função final GetDryAirDensity função ObterDryAirVolume(TDryBulb, Pressão) resultado(Volume de Ar Seco) !+ Retorno do volume de ar seco dada a temperatura e pressão do bulbo seco. !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 ! + Notas: !+ Eqn 14 para a relação de gás perfeita para ar seco. !+ Eqn 1 para a constante universal dos gases. !+ O fator 144 em IP é para a conversão de Psi = lb in⁻² para lb ft⁻². real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real :: Volume de Ar Seco !+ Volume de ar seco em ft³ lb⁻¹ [IP] ou em m³ kg⁻¹ [SI] se (isIP()) em seguida Volume de Ar Seco = GetTRankineFromTFahrenheit(TDryBulb) * R_DA_IP / (144 * Pressão) outro Volume de Ar Seco = ObterTKelvinFromTCelsius(TDryBulb) * R_DA_SI / Pressão fim se função final ObterDryAirVolume função GetTDryBulbFromEnthalpyAndHumRatio(MoistAirEnthalpia, HumRatio) resultado(TDryBulb) !+ Retorna a temperatura do bulbo seco a partir da relação de entalpia e umidade. !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 30 ! + Notas: !+ Baseado na função `GetMoistAirEnthalpy`, reorganizada para temperatura. real, intenção(em) :: MoistAirEnthalpia !+ Entalpia do ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹ real, intenção(em) :: HumRatio !+ Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] real :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real :: LimitadaHumRatio !+ Razão de umidade limitada a MIN_HUM_RATIO se (HumRatio < 0.0) em seguida erro Pare "Erro: a taxa de umidade é negativa" fim se LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) se (isIP()) em seguida TDryBulb = (MoistAirEnthalpia - 1061.0 * LimitadaHumRatio) / (0.240 + 0.444 * LimitadaHumRatio) outro TDryBulb = (MoistAirEnthalpia / 1000.0 - 2501.0 * LimitadaHumRatio) / (1.006 + 1.86 * LimitadaHumRatio) fim se função final GetTDryBulbFromEnthalpyAndHumRatio função GetHumRatioFromEnthalpyAndTDryBulb(MoistAirEnthalpia, TDryBulb) resultado(HumRatio) !+ Relação de umidade de retorno da entalpia e da temperatura de bulbo seco. !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 30 ! + Notas: !+ Baseado na função `GetMoistAirEnthalpy`, reorganizada para proporção de umidade. real, intenção(em) :: MoistAirEnthalpia !+ Entalpia do ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹ real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real :: HumRatio !+ Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] se (isIP()) em seguida HumRatio = (MoistAirEnthalpia - 0.240 * TDryBulb) / (1061.0 + 0.444 * TDryBulb) outro HumRatio = (MoistAirEnthalpia / 1000.0 - 1.006 * TDryBulb) / (2501.0 + 1.86 * TDryBulb) fim se ! Verificação de validade. HumRatio = max(HumRatio, MIN_HUM_RATIO) função final GetHumRatioFromEnthalpyAndTDryBulb !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ! Cálculos de Ar Saturado !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! função GetSatVapPres(TDryBulb) resultado(SatVapPres) !+ Pressão de vapor de saturação de retorno dada a temperatura de bulbo seco. !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 equação 5 !+ Nota importante: as fórmulas ASHRAE são definidas acima e abaixo do ponto de congelamento, mas têm !+ uma descontinuidade no ponto de congelamento. Esta é uma pequena imprecisão por parte da ASHRAE: as fórmulas !+ deve ser definido acima e abaixo do ponto triplo da água (não do ponto de gás), nesse caso !+ a descontinuidade desaparece. É essencial usar o ponto triplo da água, caso contrário funcionará !+ GetTDewPointFromVapPres, que inverte a função atual, não converge corretamente em torno !+ o ponto de congelamento. real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real :: SatVapPres !+ Pressão de vapor do ar saturado em Psi [IP] ou Pa [SI] real :: LnPws !+ Log da pressão de vapor do ar saturado (adimensional) real :: T !+ Temperatura de bulbo seco em R [IP] ou K [SI] se (isIP()) em seguida E se (TDryBulb < -148.0 .ou. TDryBulb > 392.0) em seguida erro Pare "Erro: a temperatura do bulbo seco deve estar na faixa [-148, 392]°F" fim se T = GetTRankineFromTFahrenheit(TDryBulb) se (TDryBulb <= TRIPLE_POINT_WATER_IP) em seguida LnPws = (-1.0214165E+04 / T - 4.8932428 - 5.3765794E-03 * T + 1.9202377E-07 * T**2 E + 3.5575832E-10 * T**3 - 9.0344688E-14 * T**4 + 4.1635019 * registro(T)) outro LnPws = -1.0440397E+04 / T - 1.1294650E+01 - 2.7022355E-02* T + 1.2890360E-05 * T**2 E - 2.4780681E-09 * T**3 + 6.5459673 * registro(T) fim se outro E se (TDryBulb < -100.0 .ou. TDryBulb > 200.0) em seguida erro Pare "Erro: a temperatura do bulbo seco deve estar na faixa [-100, 200]°C" fim se T = ObterTKelvinFromTCelsius(TDryBulb) se (TDryBulb <= TRIPLE_POINT_WATER_SI) em seguida LnPws = -5.6745359E+03 / T + 6.3925247 - 9.677843E-03 * T + 6.2215701E-07 * T**2 E + 2.0747825E-09 * T**3 - 9.484024E-13 * T**4 + 4.1635019 * registro(T) outro LnPws = -5.8002206E+03 / T + 1.3914993 - 4.8640239E-02 * T + 4.1764768E-05 * T**2 E - 1.4452093E-08 * T**3 + 6.5459673 * registro(T) fim se fim se SatVapPres = exp(LnPws) função final GetSatVapPres função GetSatHumRatio(TDryBulb, Pressão) resultado(SatHumRatio) !+ Razão de umidade de retorno do ar saturado, dada a temperatura e pressão do bulbo seco. !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 equação 36, resolvida para W real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real :: SatHumRatio !+ Razão de umidade do ar saturado em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] real :: SatVaporPres !+ Pressão de vapor do ar saturado em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] SatVaporPres = GetSatVapPres(TDryBulb) SatHumRatio = 0.621945 * SatVaporPres / (Pressão-SatVaporPres) ! Verificação de validade. SatHumRatio = max(SatHumRatio, MIN_HUM_RATIO) função final GetSatHumRatio função GetSatAirEnthalpy(TDryBulb, Pressão) resultado(SatAirEntalpia) !+ Retorno da entalpia do ar saturado dada a temperatura e pressão do bulbo seco. !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real :: SatAirEntalpia !+ Entalpia de ar saturado em Btu lb⁻¹ [IP] ou J kg⁻¹ [SI] SatAirEntalpia = GetMoistAirEnthalpy(TDryBulb, GetSatHumRatio(TDryBulb, Pressão)) função final GetSatAirEnthalpy !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ! Cálculos de ar úmido !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! função Obter Déficit de Pressão de Vapor(TDryBulb, HumRatio, Pressão) resultado(Déficit de pressão de vapor) !+ Retorno Déficit de pressão de vapor dada a temperatura de bulbo seco, razão de umidade e pressão. !+ Referência: !+ Ok (1987) eq. 2.13a real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: HumRatio !+ Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real :: Déficit de pressão de vapor !+ Déficit de pressão de vapor em Psi [IP] ou Pa [SI] real :: RelHum !+ Umidade relativa na faixa [0, 1] se (HumRatio < 0.0) em seguida erro Pare "Erro: a taxa de umidade é negativa" fim se RelHum = GetRelHumFromHumRatio(TDryBulb, HumRatio, Pressão) Déficit de pressão de vapor = GetSatVapPres(TDryBulb) * (1.0 - RelHum) função final Obter Déficit de Pressão de Vapor função GetDegreeOfSaturation(TDryBulb, HumRatio, Pressão) resultado(Grau de saturação) !+ Retorna o grau de saturação (ou seja, relação umidade do ar / relação umidade do ar na saturação !+ na mesma temperatura e pressão) dada a temperatura de bulbo seco, razão de umidade e pressão atmosférica. !+ Referência: !+ Manual ASHRAE - Fundamentos (2009) cap. 1 equação 12 ! + Notas: !+ Esta definição está ausente do Manual de 2017. Usando a versão 2009. real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: HumRatio !+ Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real :: Grau de saturação !+ Grau de saturação em unidade arbitrária real :: LimitadaHumRatio !+ Razão de umidade limitada a MIN_HUM_RATIO se (HumRatio < 0.0) em seguida erro Pare "Erro: a taxa de umidade é negativa" fim se LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) Grau de saturação = LimitadaHumRatio / GetSatHumRatio(TDryBulb, Pressão) função final GetDegreeOfSaturation função GetMoistAirEnthalpy(TDryBulb, HumRatio) resultado(MoistAirEnthalpia) !+ Retorna a entalpia do ar úmido dada a temperatura do bulbo seco e a proporção de umidade. !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 30 real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: HumRatio !+ Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] real :: MoistAirEnthalpia !+ Entalpia do ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹ real :: LimitadaHumRatio !+ Razão de umidade limitada a MIN_HUM_RATIO se (HumRatio < 0.0) em seguida erro Pare "Erro: a taxa de umidade é negativa" fim se LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) se (isIP()) em seguida MoistAirEnthalpia = 0.240 * TDryBulb + LimitadaHumRatio * (1061.0 + 0.444 * TDryBulb) outro MoistAirEnthalpia = (1.006 * TDryBulb + LimitadaHumRatio * (2501.0 + 1.86 * TDryBulb)) * 1000.0 fim se função final GetMoistAirEnthalpy função ObterMoistAirVolume(TDryBulb, HumRatio, Pressão) resultado(Volume de ar úmido) !+ Retorna o volume específico de ar úmido, dada a temperatura de bulbo seco, proporção de umidade e pressão. !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 equação 26 ! + Notas: !+ Em unidades IP, R_DA_IP / 144 é igual a 0,370486 que é o coeficiente que aparece na equação 26 !+ O fator 144 é para a conversão de Psi = lb in⁻² para lb ft⁻². real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: HumRatio !+ Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real :: Volume de ar úmido !+ Volume específico de ar úmido em ft³ lb⁻¹ de ar seco [IP] ou em m³ kg⁻¹ de ar seco [SI] real :: LimitadaHumRatio !+ Razão de umidade limitada a MIN_HUM_RATIO se (HumRatio < 0.0) em seguida erro Pare "Erro: a taxa de umidade é negativa" fim se LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) se (isIP()) em seguida Volume de ar úmido = R_DA_IP * GetTRankineFromTFahrenheit(TDryBulb) * (1.0 + 1.607858 * LimitadaHumRatio) / (144.0 * Pressão) outro Volume de ar úmido = R_DA_SI * ObterTKelvinFromTCelsius(TDryBulb) * (1.0 + 1.607858 * LimitadaHumRatio) / Pressão fim se função final ObterMoistAirVolume função GetTDryBulbFromMoistAirVolumeAndHumRatio(Volume de ar úmido, HumRatio, Pressão) resultado(TDryBulb) !+ Retorna a temperatura do bulbo seco considerando o volume específico do ar úmido, a taxa de umidade e a pressão. !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 equação 26 ! + Notas: !+ Em unidades IP, R_DA_IP / 144 é igual a 0,370486 que é o coeficiente que aparece na equação 26 !+ O fator 144 é para a conversão de Psi = lb in⁻² para lb ft⁻². !+ Baseado na função `GetMoistAirVolume`, reorganizada para temperatura de bulbo seco. real, intenção(em) :: Volume de ar úmido !+ Volume específico de ar úmido em ft³ lb⁻¹ de ar seco [IP] ou em m³ kg⁻¹ de ar seco [SI] real, intenção(em) :: HumRatio !+ Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real :: LimitadaHumRatio !+ Razão de umidade limitada a MIN_HUM_RATIO se (HumRatio < 0.0) em seguida erro Pare "Erro: a taxa de umidade é negativa" fim se LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) se (isIP()) em seguida TDryBulb = GetTFahrenheitFromTRankine(Volume de ar úmido * (144 * Pressão) E / (R_DA_IP * (1 + 1.607858 * LimitadaHumRatio))) outro TDryBulb = ObterTCelsiusFromTKelvin(Volume de ar úmido * Pressão E / (R_DA_SI * (1 + 1.607858 * LimitadaHumRatio))) fim se função final GetTDryBulbFromMoistAirVolumeAndHumRatio função GetMoistAirDensity(TDryBulb, HumRatio, Pressão) resultado(Densidade do ar úmido) !+ Retorna a densidade do ar úmido de acordo com a taxa de umidade, temperatura de bulbo seco e pressão. !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 equação 11 real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: HumRatio !+ Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real :: Densidade do ar úmido !+ Densidade do ar úmido em lb ft⁻³ [IP] ou kg m⁻³ [SI] real :: LimitadaHumRatio !+ Razão de umidade limitada a MIN_HUM_RATIO se (HumRatio < 0.0) em seguida erro Pare "Erro: a taxa de umidade é negativa" fim se LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) Densidade do ar úmido = (1.0 + LimitadaHumRatio) / ObterMoistAirVolume(TDryBulb, LimitadaHumRatio, Pressão) função final GetMoistAirDensity !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ! Atmosfera padrão !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! função ObterStandardAtmPressure(Altitude) resultado(PressãoAtmPadrão) !+ Retorna a pressão barométrica atmosférica padrão, dada a elevação (altitude). !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 equação 3 real, intenção(em) :: Altitude !+ Altitude em pés [IP] ou m [SI] real :: PressãoAtmPadrão !+ Pressão barométrica da atmosfera padrão em Psi [IP] ou Pa [SI] se (isIP()) em seguida PressãoAtmPadrão = 14.696 * (1.0 - 6.8754e-06 * Altitude) **5.2559 outro PressãoAtmPadrão = 101325 * (1 - 2.25577e-05 * Altitude) **5.2559 fim se função final ObterStandardAtmPressure função ObterStandardAtmTemperature(Altitude) resultado(TemperaturaAtmPadrão) !+ Retorna a temperatura atmosférica padrão, dada a elevação (altitude). !+ Referência: !+ Manual ASHRAE - Fundamentos (2017) cap. 1 equação 4 real, intenção(em) :: Altitude !+ Altitude em pés [IP] ou m [SI] real :: TemperaturaAtmPadrão !+ Temperatura de bulbo seco da atmosfera padrão em °F [IP] ou °C [SI] se (isIP()) em seguida TemperaturaAtmPadrão = 59.0 - 0.00356620 * Altitude outro TemperaturaAtmPadrão = 15.0 - 0.0065 * Altitude fim se função final ObterStandardAtmTemperature função ObterSeaLevelPressure(Pressão Stn, Altitude, TDryBulb) resultado(Nível do MarPressão) !+ Pressão de retorno ao nível do mar dada a temperatura de bulbo seco, altitude acima do nível do mar e pressão. !+ Referência: !+ Hess SL, Introdução à meteorologia teórica, Holt Rinehart e Winston, NY 1959, !+ cap. 6,5; Stull RB, Meteorologia para cientistas e engenheiros, 2ª edição, !+ Brooks/Cole 2000, cap. 1. ! + Notas: !+ O procedimento padrão para os EUA é usar para TDryBulb a média !+ da temperatura atual da estação e da temperatura da estação de 12 horas atrás. real, intenção(em) :: Pressão Stn !+ Pressão observada da estação em Psi [IP] ou Pa [SI] real, intenção(em) :: Altitude !+ Altitude em pés [IP] ou m [SI] real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real :: Nível do MarPressão !+ Pressão barométrica ao nível do mar em Psi [IP] ou Pa [SI] real :: TColumn !+ Temperatura média na coluna de ar em R [IP] ou K [SI] real :: H !+ altura da escala (adimensional) se (isIP()) em seguida ! Calcule a temperatura média na coluna de ar, assumindo uma taxa de lapso ! de 3,6 °F/1000 pés TColumn = TDryBulb + 0.0036 * Altitude / 2.0 ! Determine a altura da escala H = 53.351 * GetTRankineFromTFahrenheit(TColumn) outro ! Calcule a temperatura média na coluna de ar, assumindo uma taxa de lapso ! de 6,5 °C/km TColumn = TDryBulb + 0.0065 * Altitude / 2.0 ! Determine a altura da escala H = 287.055 * ObterTKelvinFromTCelsius(TColumn) / 9.807 fim se ! Calcular a pressão ao nível do mar Nível do MarPressão = Pressão Stn * exp(Altitude / H) função final ObterSeaLevelPressure função GetStationPressão(Nível do MarPressão, Altitude, TDryBulb) resultado(EstaçãoPressão) !+ Pressão da estação de retorno da pressão ao nível do mar. !+ Referência: !+ Veja 'GetSeaLevelPressure' ! + Notas: !+ Esta função é exatamente o inverso de 'GetSeaLevelPressure'. real, intenção(em) :: Nível do MarPressão !+ Pressão barométrica ao nível do mar em Psi [IP] ou Pa [SI] real, intenção(em) :: Altitude !+ Altitude em pés [IP] ou m [SI] real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real :: EstaçãoPressão !+ Pressão da estação em Psi [IP] ou Pa [SI] EstaçãoPressão = Nível do MarPressão / ObterSeaLevelPressure(1.0, Altitude, TDryBulb) função final GetStationPressão !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! ! Funções para definir todos os valores psicrométricos !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! sub-rotina CalcPsicrometriaFromTWetBulb(TDryBulb, E TWetBulb, E Pressão, E HumRatio, E TDewPoint, E RelHum, E VapPres, E MoistAirEnthalpia, E Volume de ar úmido, E Grau de saturação) !+ Função utilitária para calcular a taxa de umidade, temperatura do ponto de orvalho, umidade relativa, !+ pressão de vapor, entalpia de ar úmido, volume de ar úmido e grau de saturação do ar fornecido !+ temperatura de bulbo seco, temperatura de bulbo úmido e pressão. real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: TWetBulb !+ Temperatura de bulbo úmido em °F [IP] ou °C [SI] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real, intenção(Fora) :: HumRatio !+ Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] real, intenção(Fora) :: TDewPoint !+ Temperatura do ponto de orvalho em °F [IP] ou °C [SI] real, intenção(Fora) :: RelHum !+ Umidade relativa na faixa [0, 1] real, intenção(Fora) :: VapPres !+ Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] real, intenção(Fora) :: MoistAirEnthalpia !+ Entalpia de ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹ [SI] real, intenção(Fora) :: Volume de ar úmido !+ Volume específico de ar úmido em ft³ lb⁻¹ [IP] ou em m³ kg⁻¹ [SI] real, intenção(Fora) :: Grau de saturação !+ Grau de saturação [sem unidade] HumRatio = ObterHumRatioFromTWetBulb(TDryBulb, TWetBulb, Pressão) TDewPoint = ObterTDewPointFromHumRatio(TDryBulb, HumRatio, Pressão) RelHum = GetRelHumFromHumRatio(TDryBulb, HumRatio, Pressão) VapPres = GetVapPresFromHumRatio(HumRatio, Pressão) MoistAirEnthalpia = GetMoistAirEnthalpy(TDryBulb, HumRatio) Volume de ar úmido = ObterMoistAirVolume(TDryBulb, HumRatio, Pressão) Grau de saturação = GetDegreeOfSaturation(TDryBulb, HumRatio, Pressão) finalizar sub-rotina CalcPsicrometriaFromTWetBulb sub-rotina CalcPsicrometriaFromTDewPoint(TDryBulb, E TDewPoint, E Pressão, E HumRatio, E TWetBulb, E RelHum, E VapPres, E MoistAirEnthalpia, E Volume de ar úmido, E Grau de saturação) !+ Função utilitária para calcular a taxa de umidade, temperatura de bulbo úmido, umidade relativa, !+ pressão de vapor, entalpia de ar úmido, volume de ar úmido e grau de saturação do ar fornecido !+ temperatura de bulbo seco, temperatura de ponto de orvalho e pressão. real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: TDewPoint !+ Temperatura do ponto de orvalho em °F [IP] ou °C [SI] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real, intenção(Fora) :: HumRatio !+ Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] real, intenção(Fora) :: TWetBulb !+ Temperatura de bulbo úmido em °F [IP] ou °C [SI] real, intenção(Fora) :: RelHum !+ Umidade relativa na faixa [0, 1] real, intenção(Fora) :: VapPres !+ Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] real, intenção(Fora) :: MoistAirEnthalpia !+ Entalpia de ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹ [SI] real, intenção(Fora) :: Volume de ar úmido !+ Volume específico de ar úmido em ft³ lb⁻¹ [IP] ou em m³ kg⁻¹ [SI] real, intenção(Fora) :: Grau de saturação !+ Grau de saturação [sem unidade] HumRatio = GetHumRatioFromTDewPoint(TDewPoint, Pressão) TWetBulb = GetTWetBulbFromHumRatio(TDryBulb, HumRatio, Pressão) RelHum = GetRelHumFromHumRatio(TDryBulb, HumRatio, Pressão) VapPres = GetVapPresFromHumRatio(HumRatio, Pressão) MoistAirEnthalpia = GetMoistAirEnthalpy(TDryBulb, HumRatio) Volume de ar úmido = ObterMoistAirVolume(TDryBulb, HumRatio, Pressão) Grau de saturação = GetDegreeOfSaturation(TDryBulb, HumRatio, Pressão) finalizar sub-rotina CalcPsicrometriaFromTDewPoint sub-rotina CalcPsicrometriaFromRelHum(TDryBulb, E RelHum, E Pressão, E HumRatio, E TWetBulb, E TDewPoint, E VapPres, E MoistAirEnthalpia, E Volume de ar úmido, E Grau de saturação) !+ Função utilitária para calcular a taxa de umidade, temperatura de bulbo úmido, temperatura de ponto de orvalho, !+ pressão de vapor, entalpia de ar úmido, volume de ar úmido e grau de saturação do ar fornecido !+ temperatura de bulbo seco, umidade relativa e pressão. real, intenção(em) :: TDryBulb !+ Temperatura de bulbo seco em °F [IP] ou °C [SI] real, intenção(em) :: RelHum !+ Umidade relativa na faixa [0, 1] real, intenção(em) :: Pressão !+ Pressão atmosférica em Psi [IP] ou Pa [SI] real, intenção(Fora) :: HumRatio !+ Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] real, intenção(Fora) :: TWetBulb !+ Temperatura de bulbo úmido em °F [IP] ou °C [SI] real, intenção(Fora) :: TDewPoint !+ Temperatura do ponto de orvalho em °F [IP] ou °C [SI] real, intenção(Fora) :: VapPres !+ Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] real, intenção(Fora) :: MoistAirEnthalpia !+ Entalpia de ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹ [SI] real, intenção(Fora) :: Volume de ar úmido !+ Volume específico de ar úmido em ft³ lb⁻¹ [IP] ou em m³ kg⁻¹ [SI] real, intenção(Fora) :: Grau de saturação !+ Grau de saturação [sem unidade] HumRatio = GetHumRatioFromRelHum(TDryBulb, RelHum, Pressão) TWetBulb = GetTWetBulbFromHumRatio(TDryBulb, HumRatio, Pressão) TDewPoint = ObterTDewPointFromHumRatio(TDryBulb, HumRatio, Pressão) VapPres = GetVapPresFromHumRatio(HumRatio, Pressão) MoistAirEnthalpia = GetMoistAirEnthalpy(TDryBulb, HumRatio) Volume de ar úmido = ObterMoistAirVolume(TDryBulb, HumRatio, Pressão) Grau de saturação = GetDegreeOfSaturation(TDryBulb, HumRatio, Pressão) finalizar sub-rotina CalcPsicrometriaFromRelHum módulo final psicrolib |
Visual Básico, VBA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 | ' PsychroLib (versão 2.3.0) (https://github.com/psychrometrics/psychrolib) ' Copyright (c) 2018 D. Thevenard e D. Meyer para a implementação atual da biblioteca ' Copyright (c) Manual ASHRAE 2017 - Fundamentos para equações e coeficientes ASHRAE ' Licenciado sob a licença MIT. ' 'psicrolib.vba ' 'Contém funções para calcular propriedades termodinâmicas de misturas gás-vapor ' e atmosfera padrão adequada para a maioria das aplicações de engenharia, física e meteorológica ' formulários. ' 'A maioria das funções são uma implementação das fórmulas encontradas no ' Manual ASHRAE 2017 - Fundamentos, tanto no Sistema Internacional (SI), ' e unidades imperiais (IP). Consulte as informações incluídas em 'cada função para sua respectiva referência. ' ' Exemplo ' ' Defina o sistema de unidades, por exemplo, para SI (pode ser 'SI' ou 'IP' ) ' ' descomentando a seguinte linha no módulo psychrolib ' Const PSYCHROLIB_UNITS = UnitSystem.SI ' ' ' Calcule a temperatura do ponto de orvalho para uma temperatura de bulbo seco de 25 C e uma umidade relativa de 80% ' TDewPoint = GetTDewPointFromRelHum(25,0, 0,80) 'Debug.Print(TDewPoint) '21.309397163661785 ' ' Direito autoral ' - Para a implementação atual da biblioteca ' Copyright (c) 2018 D. Thevenard e D. Meyer. ' - Para equações e coeficientes publicados Manual ASHRAE - Fundamentos, Capítulo 1 ' Copyright (c) Manual ASHRAE 2017 - Fundamentos (https://www.ashrae.org) ' 'Licença 'MIT (https://github.com/psychrometrics/psychrolib/LICENSE.txt) ' 'Nota dos Autores 'Fizemos todos os esforços para garantir que o código seja adequado, no entanto, não fazemos ' representação no que diz respeito à sua precisão. Use por sua conta e risco. Você deveria notar ' um erro, ou se você tiver uma sugestão, avise-nos através do GitHub em ' https://github.com/psychrometrics/psychrolib/issues. ' Opção Explícito '********************************************** ************************************************** *** ' IMPORTANTE: Remova manualmente o comentário do sistema de unidades a ser usado '********************************************** ************************************************** *** 'Enumeração para definir sistemas de unidades Enum UnitSystem IP = 1 SI = 2 Final Enum ' Remova o comentário de uma dessas duas linhas para definir o sistema de unidades ("IP" ou "SI") 'Const PSYCHROLIB_UNITS = UnitSystem.IP 'Const PSYCHROLIB_UNITS = UnitSystem.SI '********************************************** ************************************************** *** 'Constantes globais '********************************************** ************************************************** *** Privada Const ZERO_FAHRENHEIT_AS_RANKINE = 459.67 'Zero grau Fahrenheit (°F) expresso como grau Rankine (°R). 'Referência: Manual ASHRAE - Fundamentos (2017) cap. 39. Privada Const ZERO_CELSIUS_AS_KELVIN = 273.15 'Zero grau Celsius (°C) expresso em Kelvin (K). ' Referência: Manual ASHRAE - Fundamentos (2017) cap. 39. Privada Const R_DA_IP = 53.35 ' Constante de gás universal para ar seco (versão IP) em ft lbf/lb_DryAir/R. Privada Const R_DA_SI = 287.042 ' Constante de gás universal para ar seco (versão SI) em J/kg_DryAir/K. Privada Const MAX_ITER_COUNT = 100 'Número máximo de iterações antes de sair dos loops while. Privada Const MIN_HUM_RATIO = 1e-7 ' Razão de umidade mínima aceitável usada/devolvida por qualquer função. 'Qualquer valor acima de 0 ou abaixo de MIN_HUM_RATIO será redefinido para este valor. Privada Const FREEZING_POINT_WATER_IP = 32.0 ' Ponto de congelamento da água, em °F Privada Const FREEZING_POINT_WATER_SI = 0.0 ' Ponto de congelamento da água, em °C Privada Const TRIPLE_POINT_WATER_IP = 32.018 ' Ponto triplo da água, em °F Privada Const TRIPLE_POINT_WATER_SI = 0.01 ' Ponto triplo da água, em °C '********************************************** ************************************************** *** ' Funções auxiliares '********************************************** ************************************************** *** Função GetUnitSystem() Como UnitSystem ' 'Esta função retorna o sistema de unidades atualmente em uso (SI ou IP). ' 'Args: ' nenhum ' 'Retorna: 'O sistema de unidades atualmente em uso ('SI' ou 'IP') ' ' Observação: ' ' Se você receber um erro aqui, é porque você não descomentou uma das duas linhas ' definindo PSYCHROLIB_UNITS (veja a seção Constantes Globais) ' GetUnitSystem = PSYCHROLIB_UNITS Final Função Privada Função isIP() Como Variante ' 'Esta função verifica se o sistema de unidades atualmente em uso é IP ou SI. ' 'Args: ' nenhum ' 'Retorna: ' Verdadeiro se IP, Falso se SI, e gera erro se indefinido ' Se (PSYCHROLIB_UNITS = UnidadeSistema.IP) Então isIP = Verdade ElseIf (PSYCHROLIB_UNITS = SistemaUnitário.SI) Então isIP = Falso Outro MsgBox ("O sistema de unidades não foi definido.") isIP = CVErr(xlErrNA) Final Se Final Função Privada Função GetTol() Como Variante ' 'Esta função retorna a tolerância nas temperaturas usadas para resolução iterativa. 'O valor é fisicamente o mesmo em IP ou SI. ' 'Args: ' nenhum ' 'Retorna: ' Tolerância às temperaturas ' Se (PSYCHROLIB_UNITS = UnidadeSistema.IP) Então GetTol = 0.001 * 9 / 5 Outro GetTol = 0.001 Final Se Final Função Privada Sub MyMsgBox(ByVal ErrMsg Como Corda) ' 'Saída de mensagem de erro ' Substitua esta função pela sua própria, se necessário, ou comente seu código se você não quiser ver as mensagens ' 'Mensagem desabilitada por padrão ' MsgBox(ErrMsg) Final Sub Privada Função Min(ByVal Num1 Como Variante, ByVal Num2 Como Variante) Como Variante ' 'Função mínima para retornar no mínimo dois números ' Se (Num1 <= Num2) Então Min = Num1 Outro Min = Num2 Final Se Final Função Privada Função Max(ByVal Num1 Como Variante, ByVal Num2 Como Variante) Como Variante ' 'Função Max para retornar no máximo dois números ' Se (Num1 > = Num2) Então Max = Num1 Outro Max = Num2 Final Se Final Função '********************************************** **************************** 'Conversões entre unidades de temperatura '********************************************** **************************** Função GetTRankineFromTFahrenheit(ByVal T_Fahrenheit Como Variante) Como Variante ' ' Função utilitária para converter temperatura em grau Rankine (°R) ' dada temperatura em graus Fahrenheit (°F). ' 'Args: ' T_Fahrenheit: Temperatura em graus Fahrenheit (°F) ' 'Retorna: ' Temperatura em graus Rankine (°R) ' 'Referência: ' Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 seção 3 ' 'Notas: 'Conversão exata. ' Em Erro Vamos para ErrHandler GetTRankineFromTFahrenheit = (T_Fahrenheit + ZERO_FAHRENHEIT_AS_RANKINE) Saída Função ErrHandler: GetTRankineFromTFahrenheit = CVErr(xlErrNA) Final Função Função GetTFahrenheitFromTRankine(ByVal T_Rankine Como Variante) Como Variante ' ' Função utilitária para converter temperatura em graus Fahrenheit (°F) ' dada temperatura em grau Rankine (°R). ' 'Args: ' TRankine: Temperatura em grau Rankine (°R) ' 'Retorna: 'Temperatura em graus Fahrenheit (°F) ' 'Referência: ' Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 seção 3 ' 'Notas: 'Conversão exata. ' Em Erro Vamos para ErrHandler GetTFahrenheitFromTRankine = (T_Rankine - ZERO_FAHRENHEIT_AS_RANKINE) Saída Função ErrHandler: GetTFahrenheitFromTRankine = CVErr(xlErrNA) Final Função Função ObterTKelvinFromTCelsius(ByVal T_Celsius Como Variante) Como Variante ' ' Função utilitária para converter temperatura em Kelvin (K) ' dada a temperatura em graus Celsius (°C). ' 'Args: ' TCelsius: Temperatura em graus Celsius (°C) ' 'Retorna: 'Temperatura em Kelvin (K) ' 'Referência: ' Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 seção 3 ' 'Notas: 'Conversão exata. ' Em Erro Vamos para ErrHandler ObterTKelvinFromTCelsius = (T_Celsius + ZERO_CELSIUS_AS_KELVIN) Saída Função ErrHandler: ObterTKelvinFromTCelsius = CVErr(xlErrNA) Final Função Função ObterTCelsiusFromTKelvin(ByVal T_Kelvin Como Variante) Como Variante ' ' Função utilitária para converter temperatura em graus Celsius (°C) ' dada a temperatura em Kelvin (K). ' 'Args: 'TKelvin: Temperatura em Kelvin (K) ' 'Retorna: 'Temperatura em graus Celsius (°C) ' 'Referência: ' Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 seção 3 ' 'Notas: 'Conversão exata. ' Em Erro Vamos para ErrHandler ObterTCelsiusFromTKelvin = (T_Kelvin - ZERO_CELSIUS_AS_KELVIN) Saída Função ErrHandler: ObterTCelsiusFromTKelvin = CVErr(xlErrNA) Final Função '********************************************** ************************************************** *** 'Conversões entre ponto de orvalho, bulbo úmido e umidade relativa '********************************************** ************************************************** *** Função GetTWetBulbFromTDewPoint(ByVal TDryBulb Como Variante, ByVal TDewPoint Como Variante, ByVal Pressão Como Variante) Como Variante ' 'Retorna a temperatura do bulbo úmido dada a temperatura do bulbo seco, temperatura do ponto de orvalho e pressão. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' TDewPoint : Temperatura do ponto de orvalho em °F [IP] ou °C [SI] ' Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] ' 'Retorna: 'Temperatura de bulbo úmido em °F [IP] ou °C [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 ' Dim HumRatio Como Variante Em Erro Vamos para ErrHandler Se TDewPoint > TDryBulb Então MyMsgBox ("A temperatura do ponto de orvalho está acima da temperatura do bulbo seco") Vamos para ErrHandler Final Se HumRatio = GetHumRatioFromTDewPoint(TDewPoint, Pressão) GetTWetBulbFromTDewPoint = GetTWetBulbFromHumRatio(TDryBulb, HumRatio, Pressão) Saída Função ErrHandler: GetTWetBulbFromTDewPoint = CVErr(xlErrNA) Final Função Função GetTWetBulbFromRelHum(ByVal TDryBulb Como Variante, ByVal RelHum Como Variante, ByVal Pressão Como Variante) Como Variante ' 'Retorna a temperatura do bulbo úmido dada a temperatura do bulbo seco, umidade relativa e pressão. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] 'RelHum: Umidade relativa na faixa [0, 1] ' Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] ' 'Retorna: 'Temperatura de bulbo úmido em °F [IP] ou °C [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 ' Dim HumRatio Como Variante Em Erro Vamos para ErrHandler Se (RelHum < 0 Ou RelHum > 1) Então MyMsgBox ("A umidade relativa está fora da faixa [0,1]") Vamos para ErrHandler Final Se HumRatio = GetHumRatioFromRelHum(TDryBulb, RelHum, Pressão) GetTWetBulbFromRelHum = GetTWetBulbFromHumRatio(TDryBulb, HumRatio, Pressão) Saída Função ErrHandler: GetTWetBulbFromRelHum = CVErr(xlErrNA) Final Função Função GetRelHumFromTDewPoint(ByVal TDryBulb Como Variante, ByVal TDewPoint Como Variante) Como Variante ' 'Retorna a umidade relativa dada a temperatura de bulbo seco e a temperatura do ponto de orvalho. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' TDewPoint : Temperatura do ponto de orvalho em °F [IP] ou °C [SI] ' 'Retorna: ' Umidade relativa na faixa [0, 1] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 equação 22 ' Dim VapPres Como Variante Dim SatVapPres Como Variante Em Erro Vamos para ErrHandler Se (TDewPoint > TDryBulb) Então MyMsgBox ("A temperatura do ponto de orvalho está acima da temperatura do bulbo seco") Vamos para ErrHandler Final Se VapPres = GetSatVapPres(TDewPoint) SatVapPres = GetSatVapPres(TDryBulb) GetRelHumFromTDewPoint = VapPres / SatVapPres Saída Função ErrHandler: GetRelHumFromTDewPoint = CVErr(xlErrNA) Final Função Função GetRelHumFromTWetBulb(ByVal TDryBulb Como Variante, ByVal TWetBulb Como Variante, ByVal Pressão Como Variante) Como Variante ' 'Retorna a umidade relativa dada a temperatura de bulbo seco, temperatura de bulbo úmido e pressão. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' TWetBulb : Temperatura do bulbo úmido em °F [IP] ou °C [SI] ' Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] ' 'Retorna: ' Umidade relativa na faixa [0, 1] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 ' Dim HumRatio Como Variante Em Erro Vamos para ErrHandler Se TWetBulb > TDryBulb Então MyMsgBox (“A temperatura do bulbo úmido está acima da temperatura do bulbo seco”) Vamos para ErrHandler Final Se HumRatio = GetHumRatioFromTWetBulb(TDryBulb, TWetBulb, Pressão) GetRelHumFromTWetBulb = GetRelHumFromHumRatio(TDryBulb, HumRatio, Pressão) Saída Função ErrHandler: GetRelHumFromTWetBulb = CVErr(xlErrNA) Final Função Função GetTDewPointFromRelHum(ByVal TDryBulb Como Variante, ByVal RelHum Como Variante) Como Variante ' 'Retorna a temperatura do ponto de orvalho dada a temperatura do bulbo seco e a umidade relativa. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' RelHum: Umidade relativa na faixa [0, 1] ' 'Retorna: ' Temperatura do ponto de orvalho em °F [IP] ou °C [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 ' Dim VapPres Como Variante Em Erro Vamos para ErrHandler Se RelHum < 0 Ou RelHum > 1 Então MyMsgBox ("A umidade relativa está fora da faixa [0, 1]") Vamos para ErrHandler Final Se VapPres = GetVapPresFromRelHum(TDryBulb, RelHum) GetTDewPointFromRelHum = GetTDewPointFromVapPres(TDryBulb, VapPres) Saída Função ErrHandler: GetTDewPointFromRelHum = CVErr(xlErrNA) Final Função Função ObterTDewPointFromTWetBulb(ByVal TDryBulb Como Variante, ByVal TWetBulb Como Variante, ByVal Pressão Como Variante) Como Variante ' 'Retorna a temperatura do ponto de orvalho dada a temperatura de bulbo seco, temperatura de bulbo úmido e pressão. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' TWetBulb : Temperatura do bulbo úmido em °F [IP] ou °C [SI] ' Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] ' 'Retorna: ' Temperatura do ponto de orvalho em °F [IP] ou °C [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 ' Dim HumRatio Como Variante Em Erro Vamos para ErrHandler Se TWetBulb > TDryBulb Então MyMsgBox (“A temperatura do bulbo úmido está acima da temperatura do bulbo seco”) Vamos para ErrHandler Final Se HumRatio = GetHumRatioFromTWetBulb(TDryBulb, TWetBulb, Pressão) ObterTDewPointFromTWetBulb = GetTDewPointFromHumRatio(TDryBulb, HumRatio, Pressão) Saída Função ErrHandler: ObterTDewPointFromTWetBulb = CVErr(xlErrNA) Final Função '********************************************** ************************************************** *** ' Conversões entre ponto de orvalho ou umidade relativa e pressão de vapor '********************************************** ************************************************** *** Função GetVapPresFromRelHum(ByVal TDryBulb Como Variante, ByVal RelHum Como Variante) Como Variante ' 'Retorna a pressão parcial do vapor d'água em função da umidade relativa e da temperatura. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] 'RelHum: Umidade relativa na faixa [0, 1] ' 'Retorna: ' Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 12, 22 ' Em Erro Vamos para ErrHandler Se RelHum < 0 Ou RelHum > 1 Então MyMsgBox ("A umidade relativa está fora da faixa [0, 1]") Vamos para ErrHandler Final Se GetVapPresFromRelHum = RelHum * GetSatVapPres(TDryBulb) Saída Função ErrHandler: GetVapPresFromRelHum = CVErr(xlErrNA) Final Função Função GetRelHumFromVapPres(ByVal TDryBulb Como Variante, ByVal VapPres Como Variante) Como Variante 'Retorna a umidade relativa dada a temperatura de bulbo seco e a pressão de vapor. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' VapPres: Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] ' 'Retorna: ' Umidade relativa na faixa [0, 1] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 12, 22 ' Em Erro Vamos para ErrHandler Se (VapPres < 0) Então MyMsgBox (“A pressão parcial do vapor d'água no ar úmido é negativa”) Vamos para ErrHandler Final Se GetRelHumFromVapPres = VapPres / GetSatVapPres(TDryBulb) Saída Função ErrHandler: GetRelHumFromVapPres = CVErr(xlErrNA) Final Função Privada Função dLnPws_(TDryBulb Como Variante) Como Variante ' ' Função auxiliar retornando a derivada do logaritmo natural da pressão de vapor de saturação 'em função da temperatura de bulbo seco. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' 'Retorna: ' Derivada do logaritmo natural da pressão de vapor do ar saturado em Psi [IP] ou Pa [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 equação 5 e 6 ' Dim T Como Variante Se (isIP ()) Então T = GetTRankineFromTFahrenheit(TDryBulb) Se (TDryBulb <= TRIPLE_POINT_WATER_IP) Então dLnPws_ = 10214.165 / T ^ 2 - 0.0053765794 + 2 * 0.00000019202377 * T _ + 3 * 3.5575832E-10 * T ^ 2 - 4 * 9.0344688E-14 * T ^ 3 + 4.1635019 / T Outro dLnPws_ = 10440.397 / T ^ 2 - 0.027022355 + 2 * 0.00001289036 * T _ - 3 * 2.4780681E-09 * T ^ 2 + 6.5459673 / T Final Se Outro T = ObterTKelvinFromTCelsius(TDryBulb) Se (TDryBulb <= TRIPLE_POINT_ÁGUA_SI) Então dLnPws_ = 5674.5359 / T ^ 2 - 0.009677843 + 2 * 0.00000062215701 * T _ + 3 * 2.0747825E-09 * T ^ 2 - 4 * 9.484024E-13 * T ^ 3 + 4.1635019 / T Outro dLnPws_ = 5800.2206 / T ^ 2 - 0.048640239 + 2 * 0.000041764768 * T _ - 3 * 0.000000014452093 * T ^ 2 + 6.5459673 / T Final Se Final Se Final Função Função GetTDewPointFromVapPres(ByVal TDryBulb Como Variante, ByVal VapPres Como Variante) Como Variante ' 'Temperatura do ponto de orvalho de retorno dada a temperatura do bulbo seco e a pressão de vapor. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' VapPres: Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] ' 'Retorna: ' Temperatura do ponto de orvalho em °F [IP] ou °C [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 5 e 6 ' ' Notas: ' A temperatura do ponto de orvalho é resolvida invertendo a equação que dá a pressão do vapor de água 'na saturação da temperatura, em vez de usar as regressões fornecidas ' pela ASHRAE (eqn. 37 e 38) que são muito menos precisos e têm um ' faixa de validade mais estreita. ' O método Newton-Raphson (NR) é usado no logaritmo do vapor de água 'pressão em função da temperatura, que é uma função muito suave ' A convergência geralmente é alcançada em 3 a 5 iterações. ' TDryBulb não é realmente necessário aqui, apenas usado por conveniência. ' Dim BOUNDS (2) Como Variante Dim PSYCHROLIB_TOLERANCE Como Variante Se (isIP ()) Então BOUNDS (1) = -148. BOUNDS (2) = 392. Outro BOUNDS (1) = -100. BOUNDS (2) = 200. Final Se Em Erro Vamos para ErrHandler Se ((VapPres < GetSatVapPres(BOUNDS(1))) Ou (VapPres > GetSatVapPres(BOUNDS(2)))) Então MyMsgBox (“A pressão parcial do vapor d'água está fora da faixa de validade das equações”) Vamos para ErrHandler Final Se PSYCHROLIB_TOLERANCE = GetTol () Dim TDewPoint Como Variante Dim lnVP Como Variante Dim d_lnVP Como Variante Dim TDewPoint_iter Como Variante Dim lnVP_iter Dim índice Como Variante índice = 1 'Usamos NR para aproximar a solução. 'Primeiro palpite TDewPoint = TDryBulb 'Valor calculado das temperaturas do ponto de orvalho, resolvido iterativamente lnVP = Registro (VapPres) ' Pressão parcial do vapor de água no ar úmido ' Iteração Faz TDewPoint_iter = TDewPoint ' Valor do Tdp utilizado no cálculo do NR lnVP_iter = Log(GetSatVapPres(TDewPoint_iter)) ' Derivada da função, calculada analiticamente d_lnVP = dLnPws_(TDewPoint_iter) 'Nova estimativa, limitada pelo domínio de validade da eq. 5 e 6 e pelo ponto de congelamento TDewPoint = TDewPoint_iter - (lnVP_iter - lnVP) / d_lnVP TDewPoint = Max(TDewPoint, BOUNDS (1)) TDewPoint = Min(TDewPoint, BOUNDS (2)) Se (índice > MAX_ITER_COUNT) Então Vamos para ErrHandler Final Se índice = índice + 1 Laço Enquanto (Abs(TDewPoint - TDewPoint_iter) > PSYCHROLIB_TOLERANCE) TDewPoint = Min(TDewPoint, TDryBulb) GetTDewPointFromVapPres = TDewPoint Saída Função ErrHandler: GetTDewPointFromVapPres = CVErr(xlErrNA) Final Função Função GetVapPresFromTDewPoint(ByVal TDewPoint Como Variante) Como Variante ' ' Pressão de vapor de retorno dada a temperatura do ponto de orvalho. ' 'Args: ' TDewPoint : Temperatura do ponto de orvalho em °F [IP] ou °C [SI] ' 'Retorna: ' Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 equação 36 ' Em Erro Vamos para ErrHandler GetVapPresFromTDewPoint = GetSatVapPres(TDewPoint) Saída Função ErrHandler: GetVapPresFromTDewPoint = CVErr(xlErrNA) Final Função '********************************************** ************************************************** *** ' Conversões de temperatura de bulbo úmido, temperatura de ponto de orvalho ou umidade relativa para proporção de umidade '********************************************** ************************************************** *** Função GetTWetBulbFromHumRatio(ByVal TDryBulb Como Variante, ByVal HumRatio Como Variante, ByVal Pressão Como Variante) Como Variante ' 'Retorna a temperatura do bulbo úmido dada a temperatura do bulbo seco, proporção de umidade e pressão. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' HumRatio: Razão de umidade em lb_H2O/lb_Air [IP] ou kg_H2O/kg_Air [SI] ' Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] ' 'Retorna: 'Temperatura de bulbo úmido em °F [IP] ou °C [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 eqn 33 e 35 resolvido para Tstar ' 'Declarações Dim Wstar Como Variante Dim TDewPoint Como Variante, TWetBulb Como Variante, TWetBulbSup Como Variante, TWetBulbInf Como Variante Dim Para mim Como Variante, LimitadaHumRatio Como Variante, índice Como Variante Em Erro Vamos para ErrHandler Se HumRatio < 0 Então MyMsgBox ("A relação de umidade não pode ser negativa") Vamos para ErrHandler Final Se LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) TDewPoint = GetTDewPointFromHumRatio(TDryBulb, LimitadaHumRatio, Pressão) 'Suposições iniciais TWetBulbSup = TDryBulb TWetBulbInf = TDewPoint TWetBulb = (TWetBulbInf + TWetBulbSup) / 2 ' Loop de bissecção Para mim = GetTol () índice = 0 Enquanto ((TWetBulbSup - TWetBulbInf) > Para mim) 'Calcula a razão de umidade na temperatura Tstar Wstar = GetHumRatioFromTWetBulb(TDryBulb, TWetBulb, Pressão) ' Obtenha novos limites Se (Wstar > RazãoHum Limitada) Então TWetBulbSup = TWetBulb Outro TWetBulbInf = TWetBulb Final Se 'Nova estimativa da temperatura do bulbo úmido TWetBulb = (TWetBulbSup + TWetBulbInf) / 2 Se (índice > MAX_ITER_COUNT) Então Vamos para ErrHandler Final Se índice = índice + 1 Wend GetTWetBulbFromHumRatio = TWetBulb Saída Função ErrHandler: GetTWetBulbFromHumRatio = CVErr(xlErrNA) Final Função Função ObterHumRatioFromTWetBulb(ByVal TDryBulb Como Variante, ByVal TWetBulb Como Variante, ByVal Pressão Como Variante) Como Variante ' ' Taxa de umidade de retorno dada a temperatura de bulbo seco, temperatura de bulbo úmido e pressão. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' TWetBulb : Temperatura do bulbo úmido em °F [IP] ou °C [SI] ' Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] ' 'Retorna: ' Razão de umidade em lb_H2O/lb_Air [IP] ou kg_H2O/kg_Air [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 33 e 35 Dim Wsstar Como Variante, HumRatio Como Variante Wsstar = GetSatHumRatio(TWetBulb, Pressão) Em Erro Vamos para ErrHandler Se TWetBulb > TDryBulb Então MyMsgBox (“A temperatura do bulbo úmido está acima da temperatura do bulbo seco”) Vamos para ErrHandler Final Se Se isIP () Então Se (TWetBulb > = FREEZING_POINT_WATER_IP) Então HumRatio = ((1093 - 0.556 * TWetBulb) * Wsstar - 0.24 * (TDryBulb - TWetBulb)) / (1093 + 0.444 * TDryBulb - TWetBulb) Outro HumRatio = ((1220 - 0.04 * TWetBulb) * Wsstar - 0.24 * (TDryBulb - TWetBulb)) / (1220 + 0.444 * TDryBulb - 0.48 * TWetBulb) Final Se Outro Se (TWetBulb > = FREEZING_POINT_WATER_SI) Então HumRatio = ((2501 - 2.326 * TWetBulb) * Wsstar - 1.006 * (TDryBulb - TWetBulb)) / (2501 + 1.86 * TDryBulb - 4.186 * TWetBulb) Outro HumRatio = ((2830 - 0.24 * TWetBulb) * Wsstar - 1.006 * (TDryBulb - TWetBulb)) / (2830 + 1.86 * TDryBulb - 2.1 * TWetBulb) Final Se Final Se 'Verificação de validade. ObterHumRatioFromTWetBulb = max(HumRatio, MIN_HUM_RATIO) Saída Função ErrHandler: ObterHumRatioFromTWetBulb = CVErr(xlErrNA) Final Função Função GetHumRatioFromRelHum(ByVal TDryBulb Como Variante, ByVal RelHum Como Variante, ByVal Pressão Como Variante) Como Variante ' ' Taxa de umidade de retorno dada a temperatura de bulbo seco, umidade relativa e pressão. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] 'RelHum: Umidade relativa na faixa [0, 1] ' Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] ' 'Retorna: ' Razão de umidade em lb_H2O/lb_Air [IP] ou kg_H2O/kg_Air [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 ' Dim VapPres Como Variante Em Erro Vamos para ErrHandler Se RelHum < 0 Ou RelHum > 1 Então MyMsgBox ("A umidade relativa está fora da faixa [0, 1]") Vamos para ErrHandler Final Se VapPres = GetVapPresFromRelHum(TDryBulb, RelHum) GetHumRatioFromRelHum = GetHumRatioFromVapPres(VapPres, Pressão) Saída Função ErrHandler: GetHumRatioFromRelHum = CVErr(xlErrNA) Final Função Função GetRelHumFromHumRatio(ByVal TDryBulb Como Variante, ByVal HumRatio Como Variante, ByVal Pressão Como Variante) Como Variante ' 'Retorna a umidade relativa dada a temperatura de bulbo seco, taxa de umidade e pressão. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' HumRatio: Razão de umidade em lb_H2O/lb_Air [IP] ou kg_H2O/kg_Air [SI] ' Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] ' 'Retorna: ' Umidade relativa na faixa [0, 1] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 ' Dim VapPres Como Variante Em Erro Vamos para ErrHandler Se HumRatio < 0 Então MyMsgBox ("A relação de umidade é negativa") Vamos para ErrHandler Final Se VapPres = GetVapPresFromHumRatio(HumRatio, Pressão) GetRelHumFromHumRatio = GetRelHumFromVapPres(TDryBulb, VapPres) Saída Função ErrHandler: GetRelHumFromHumRatio = CVErr(xlErrNA) Final Função Função GetHumRatioFromTDewPoint(ByVal TDewPoint Como Variante, ByVal Pressão Como Variante) Como Variante ' ' Taxa de umidade de retorno dada a temperatura e pressão do ponto de orvalho. ' 'Args: ' TDewPoint : Temperatura do ponto de orvalho em °F [IP] ou °C [SI] ' Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] ' 'Retorna: ' Razão de umidade em lb_H2O/lb_Air [IP] ou kg_H2O/kg_Air [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 equação 13 ' Dim VapPres Como Variante Em Erro Vamos para ErrHandler VapPres = GetSatVapPres(TDewPoint) GetHumRatioFromTDewPoint = GetHumRatioFromVapPres(VapPres, Pressão) Saída Função ErrHandler: GetHumRatioFromTDewPoint = CVErr(xlErrNA) Final Função Função ObterTDewPointFromHumRatio(ByVal TDryBulb Como Variante, ByVal HumRatio Como Variante, ByVal Pressão Como Variante) Como Variante ' 'Retorna a temperatura do ponto de orvalho dada a temperatura do bulbo seco, proporção de umidade e pressão. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' HumRatio: Razão de umidade em lb_H2O/lb_Air [IP] ou kg_H2O/kg_Air [SI] ' Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] ' 'Retorna: ' Temperatura do ponto de orvalho em °F [IP] ou °C [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 ' Dim VapPres Como Variante Em Erro Vamos para ErrHandler Se HumRatio < 0 Então MyMsgBox ("A relação de umidade é negativa") Vamos para ErrHandler Final Se VapPres = GetVapPresFromHumRatio(HumRatio, Pressão) ObterTDewPointFromHumRatio = GetTDewPointFromVapPres(TDryBulb, VapPres) Saída Função ErrHandler: ObterTDewPointFromHumRatio = CVErr(xlErrNA) Final Função '********************************************** ************************************************** *** ' Conversões entre razão de umidade e pressão de vapor '********************************************** ************************************************** *** Função GetHumRatioFromVapPres(ByVal VapPres Como Variante, ByVal Pressão Como Variante) Como Variante ' ' Taxa de umidade de retorno dada a pressão de vapor d'água e a pressão atmosférica. ' 'Args: ' VapPres: Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] ' Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] ' 'Retorna: ' Razão de umidade em lb_H2O/lb_Air [IP] ou kg_H2O/kg_Air [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 equação 20 ' Dim HumRatio Como Variante Em Erro Vamos para ErrHandler Se VapPres < 0 Então MyMsgBox (“A pressão parcial do vapor d'água no ar úmido é negativa”) Vamos para ErrHandler Final Se HumRatio = 0.621945 * VapPres / (Pressão - VapPres) 'Verificação de validade. GetHumRatioFromVapPres = max(HumRatio, MIN_HUM_RATIO) Saída Função ErrHandler: GetHumRatioFromVapPres = CVErr(xlErrNA) Final Função Função GetVapPresFromHumRatio(ByVal HumRatio Como Variante, ByVal Pressão Como Variante) Como Variante ' ' Pressão de vapor de retorno dada a relação de umidade e pressão. ' 'Args: ' HumRatio: Razão de umidade em lb_H2O/lb_Air [IP] ou kg_H2O/kg_Air [SI] ' Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] ' 'Retorna: ' Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 eqn 20 resolvido para pw ' Dim VapPres Como Variante, LimitadaHumRatio Como Variante Em Erro Vamos para ErrHandler Se HumRatio < 0 Então MyMsgBox ("A relação de umidade é negativa") Vamos para ErrHandler Final Se LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) VapPres = Pressão * LimitadaHumRatio / (0.621945 + RazãoHum Limitada) GetVapPresFromHumRatio = VapPres Saída Função ErrHandler: GetVapPresFromHumRatio = CVErr(xlErrNA) Final Função '********************************************** ************************************************** *** 'Conversões entre proporção de umidade e umidade específica '********************************************** ************************************************** *** Função GetSpecificHumFromHumRatio(ByVal HumRatio Como Variante) Como Variante ' ' Retorna a umidade específica da proporção de umidade (também conhecida como proporção de mistura). ' 'Args: ' HumRatio: Razão de umidade em lb_H₂O lb_Dry_Air⁻¹ [IP] ou kg_H₂O kg_Dry_Air⁻¹ [SI] ' 'Retorna: ' Umidade específica em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 equação 9b ' ' Dim EspecíficoHum Como Variante Em Erro Vamos para ErrHandler Se (HumRatio < 0) Então MyMsgBox ("A relação de umidade é negativa") Vamos para ErrHandler Final Se EspecíficoHum = HumRatio / (1.0 + HumRatio) GetSpecificHumFromHumRatio = EspecíficoHum Saída Função ErrHandler: GetSpecificHumFromHumRatio = CVErr(xlErrNA) Final Função Função GetHumRatioFromSpecificHum(ByVal EspecíficoHum Como Variante) Como Variante ' ' Retorna a proporção de umidade (também conhecida como proporção de mistura) da umidade específica. ' 'Args: ' SpecificHum : Umidade específica em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] ' 'Retorna: ' Razão de umidade em lb_H₂O lb_Dry_Air⁻¹ [IP] ou kg_H₂O kg_Dry_Air⁻¹ [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 eqn 9b (resolvido para proporção de umidade) ' ' Dim HumRatio como Variante Em Erro Vamos para ErrHandler Se (Hum específico < 0 Ou EspecíficoHum > = 1) Então MyMsgBox ("A umidade específica está fora da faixa [0, 1[") Vamos para ErrHandler Final Se HumRatio = EspecíficoHum / (1.0 - EspecíficoHum) GetHumRatioFromSpecificHum = max(HumRatio, MIN_HUM_RATIO) Saída Função ErrHandler: GetHumRatioFromSpecificHum = CVErr(xlErrNA) Final Função '********************************************** ************************************************** *** 'Cálculos de ar seco '********************************************** ************************************************** *** Função GetDryAirEnthalpy(ByVal TDryBulb Como Variante) Como Variante ' ' Retorna a entalpia do ar seco dada a temperatura do bulbo seco. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' 'Retorna: 'Entalpia do ar seco em Btu/lb [IP] ou J/kg [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 equação 28 ' Em Erro Vamos para ErrHandler Se (isIP ()) Então GetDryAirEnthalpy = 0.24 * TDryBulb Outro GetDryAirEnthalpy = 1006 * TDryBulb Final Se Saída Função ErrHandler: GetDryAirEnthalpy = CVErr(xlErrNA) Final Função Função GetDryAirDensity(ByVal TDryBulb Como Variante, ByVal Pressão Como Variante) Como Variante ' 'Retorna a densidade do ar seco, dada a temperatura e pressão do bulbo seco. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] ' 'Retorna: ' Densidade do ar seco em lb/ft³ [IP] ou kg/m³ [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 ' ' Notas: ' Eqn 14 para a relação perfeita de gás para ar seco. ' Eqn 1 para a constante universal dos gases. ' O fator 144 em IP é para a conversão de Psi = lb/in² para lb/ft². ' Em Erro Vamos para ErrHandler Se (isIP ()) Então GetDryAirDensity = (144 * Pressão) / R_DA_IP / GetTRankineFromTFahrenheit(TDryBulb) Outro GetDryAirDensity = Pressão / R_DA_SI / ObterTKelvinFromTCelsius(TDryBulb) Final Se Saída Função ErrHandler: GetDryAirDensity = CVErr(xlErrNA) Final Função Função ObterDryAirVolume(ByVal TDryBulb Como Variante, ByVal Pressão Como Variante) Como Variante ' 'Retorna o volume de ar seco dada a temperatura e pressão do bulbo seco. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] ' 'Retorna: 'Volume de ar seco em ft³/lb [IP] ou em m³/kg [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 ' ' Notas: ' Eqn 14 para a relação perfeita de gás para ar seco. ' Eqn 1 para a constante universal dos gases. ' O fator 144 em IP é para a conversão de Psi = lb/in² para lb/ft². ' Em Erro Vamos para ErrHandler Se (isIP ()) Então ObterDryAirVolume = GetTRankineFromTFahrenheit(TDryBulb) * R_DA_IP / (144 * Pressão) Outro: ObterDryAirVolume = ObterTKelvinFromTCelsius(TDryBulb) * R_DA_SI / Pressão Final Se Saída Função ErrHandler: ObterDryAirVolume = CVErr(xlErrNA) Final Função Função GetTDryBulbFromEnthalpyAndHumRatio(ByVal MoistAirEnthalpia Como Variante, ByVal HumRatio Como Variante) Como Variante ' 'Retorna a temperatura do bulbo seco a partir da relação de entalpia e umidade. ' ' 'Args: 'MoistAirEnthalpy: Entalpia de ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹ ' HumRatio: Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] ' 'Retorna: 'Temperatura de bulbo seco em °F [IP] ou °C [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 30 ' ' Notas: ' Baseado na função `GetMoistAirEnthalpy`, reorganizada para temperatura. ' Em Erro Vamos para ErrHandler Se HumRatio < 0 Então MyMsgBox ("A relação de umidade é negativa") Vamos para ErrHandler Final Se Se (isIP ()) Então GetTDryBulbFromEnthalpyAndHumRatio = (MoistAirEnthalpia - 1061.0 * HumRatio) / (0.24 + 0.444 * HumRatio) Outro: GetTDryBulbFromEnthalpyAndHumRatio = (MoistAirEnthalpia / 1000.0 - 2501.0 * HumRatio) / (1.006 + 1.86 * HumRatio) Final Se Saída Função ErrHandler: GetTDryBulbFromEnthalpyAndHumRatio = CVErr(xlErrNA) Final Função Função GetHumRatioFromEnthalpyAndTDryBulb(ByVal MoistAirEnthalpia Como Variante, ByVal TDryBulb Como Variante) Como Variante ' 'Retorna a relação de umidade da entalpia e da temperatura de bulbo seco. ' ' 'Args: 'MoistAirEnthalpy: Entalpia de ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹ ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' 'Retorna: ' Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 30 ' ' Notas: ' Baseado na função `GetMoistAirEnthalpy`, reorganizada para proporção de umidade. ' Em Erro Vamos para ErrHandler Se (isIP ()) Então GetHumRatioFromEnthalpyAndTDryBulb = (MoistAirEnthalpia - 0.24 * TDryBulb) / (1061.0 + 0.444 * TDryBulb) Outro: GetHumRatioFromEnthalpyAndTDryBulb = (MoistAirEnthalpia / 1000.0 - 1.006 * TDryBulb) / (2501.0 + 1.86 * TDryBulb) Final Se Saída Função ErrHandler: GetHumRatioFromEnthalpyAndTDryBulb = CVErr(xlErrNA) Final Função '********************************************** ************************************************** *** 'Cálculos de ar saturado '********************************************** ************************************************** *** Função GetSatVapPres(ByVal TDryBulb Como Variante) Como Variante ' ' Pressão de vapor de saturação de retorno dada a temperatura de bulbo seco. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' 'Retorna: ' Pressão de vapor do ar saturado em Psi [IP] ou Pa [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 equação 5 e 6 'Nota importante: as fórmulas ASHRAE são definidas acima e abaixo do ponto de congelamento, mas têm ' uma descontinuidade no ponto de congelamento. Esta é uma pequena imprecisão por parte da ASHRAE: as fórmulas 'deve ser definido acima e abaixo do ponto triplo da água (não do ponto de gás), caso em que ' a descontinuidade desaparece. É essencial usar o ponto triplo da água, caso contrário funcionará ' GetTDewPointFromVapPres, que inverte a função atual, não converge corretamente em torno 'o ponto de congelamento. ' Dim LnPws Como Variante, T Como Variante Em Erro Vamos para ErrHandler Se (isIP ()) Então Se (TDryBulb < -148 Ou TDryBulb > 392) Então MyMsgBox ("A temperatura do bulbo seco está fora da faixa [-148, 392] °F") Vamos para ErrHandler Final Se T = GetTRankineFromTFahrenheit(TDryBulb) Se (TDryBulb <= TRIPLE_POINT_WATER_IP) Então LnPws = (-10214.165 / T - 4.8932428 - 0.0053765794 * T + 0.00000019202377 * T ^ 2 _ + 3.5575832E-10 * T ^ 3 - 9.0344688E-14 * T ^ 4 + 4.1635019 * Log (T)) Outro LnPws = -10440.397 / T - 11.29465 - 0.027022355 * T + 0.00001289036 * T ^ 2 _ - 2.4780681E-09 * T ^ 3 + 6.5459673 * Log (T) Final Se Outro Se (TDryBulb < -100 Ou TDryBulb > 200) Então MyMsgBox ("A temperatura do bulbo seco está fora da faixa [-100, 200] °C") Vamos para ErrHandler Final Se T = ObterTKelvinFromTCelsius(TDryBulb) Se (TDryBulb <= TRIPLE_POINT_ÁGUA_SI) Então LnPws = -5674.5359 / T + 6.3925247 - 0.009677843 * T + 0.00000062215701 * T ^ 2 _ + 2.0747825E-09 * T ^ 3 - 9.484024E-13 * T ^ 4 + 4.1635019 * Log (T) Outro LnPws = -5800.2206 / T + 1.3914993 - 0.048640239 * T + 0.000041764768 * T ^ 2 _ - 0.000000014452093 * T ^ 3 + 6.5459673 * Log (T) Final Se Final Se GetSatVapPres = Exp (LnPws) Saída Função ErrHandler: GetSatVapPres = CVErr(xlErrNA) Final Função Função GetSatHumRatio(ByVal TDryBulb Como Variante, ByVal Pressão Como Variante) Como Variante ' ' Taxa de umidade de retorno do ar saturado, dada a temperatura e pressão do bulbo seco. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] ' 'Retorna: ' Razão de umidade do ar saturado em lb_H2O/lb_Air [IP] ou kg_H2O/kg_Air [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 equação 36, resolvida para W ' Dim SatVaporPres Como Variante, SatHumRatio Como Variante Em Erro Vamos para ErrHandler SatVaporPres = GetSatVapPres(TDryBulb) SatHumRatio = 0.621945 * SatVaporPres / (Pressão - SatVaporPres) GetSatHumRatio = max(SatHumRatio, MIN_HUM_RATIO) Saída Função ErrHandler: GetSatHumRatio = CVErr(xlErrNA) Final Função Função GetSatAirEnthalpy(ByVal TDryBulb Como Variante, ByVal Pressão Como Variante) Como Variante ' ' Retorno da entalpia do ar saturado dada a temperatura e pressão do bulbo seco. ' 'Args: ' TDryBulb: Temperatura do bulbo seco em °F [IP] ou °C [SI] ' Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] ' 'Retorna: ' Entalpia do ar saturado em Btu/lb [IP] ou J/kg [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 ' Em Erro Vamos para ErrHandler GetSatAirEnthalpy = GetMoistAirEnthalpy(TDryBulb, GetSatHumRatio(TDryBulb, Pressão)) Saída Função ErrHandler: GetSatAirEnthalpy = CVErr(xlErrNA) Final Função '********************************************** ************************************************** *** 'Cálculos de ar úmido '********************************************** ************************************************** *** Função Obter Déficit de Pressão de Vapor(ByVal TDryBulb Como Variante, ByVal HumRatio Como Variante, ByVal Pressão Como Variante) Como Variante ' ' Retorno Déficit de pressão de vapor dada a temperatura de bulbo seco, razão de umidade e pressão. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' HumRatio: Razão de umidade em lb_H2O/lb_Air [IP] ou kg_H2O/kg_Air [SI] ' Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] ' 'Retorna: ' Déficit de pressão de vapor em Psi [IP] ou Pa [SI] ' 'Referência: ' Ok (1987) equação 2.13a ' Dim RelHum Como Variante Em Erro Vamos para ErrHandler Se HumRatio < 0 Então MyMsgBox ("A relação de umidade é negativa") Vamos para ErrHandler Final Se RelHum = GetRelHumFromHumRatio(TDryBulb, HumRatio, Pressão) Obter Déficit de Pressão de Vapor = GetSatVapPres(TDryBulb) * (1 - RelHum) Saída Função ErrHandler: Obter Déficit de Pressão de Vapor = CVErr(xlErrNA) Final Função Função GetDegreeOfSaturation(ByVal TDryBulb Como Variante, ByVal HumRatio Como Variante, ByVal Pressão Como Variante) Como Variante ' ' Retorna o grau de saturação (ou seja, relação umidade do ar / relação umidade do ar na saturação 'à mesma temperatura e pressão) dada a temperatura de bulbo seco, razão de umidade e pressão atmosférica. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' HumRatio: Razão de umidade em lb_H2O/lb_Air [IP] ou kg_H2O/kg_Air [SI] ' Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] ' 'Retorna: ' Grau de saturação em unidade arbitrária ' 'Referência: ' Manual ASHRAE - Fundamentos (2009) cap. 1 equação 12 ' ' Notas: 'Esta definição está ausente do Manual de 2017. Usando a versão 2009. ' Dim LimitadaHumRatio Como Variante Em Erro Vamos para ErrHandler Se HumRatio < 0 Então MyMsgBox ("A relação de umidade é negativa") Vamos para ErrHandler Final Se LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) GetDegreeOfSaturation = LimitadaHumRatio / GetSatHumRatio(TDryBulb, Pressão) Saída Função ErrHandler: GetDegreeOfSaturation = CVErr(xlErrNA) Final Função Função GetMoistAirEnthalpy(ByVal TDryBulb Como Variante, ByVal HumRatio Como Variante) Como Variante ' ' Retorna a entalpia do ar úmido dada a temperatura do bulbo seco e a proporção de umidade. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' HumRatio: Razão de umidade em lb_H2O/lb_Air [IP] ou kg_H2O/kg_Air [SI] ' 'Retorna: ' Entalpia do ar úmido em Btu/lb [IP] ou J/kg ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 30 ' Dim LimitadaHumRatio Como Variante Em Erro Vamos para ErrHandler Se (HumRatio < 0) Então MyMsgBox ("A relação de umidade é negativa") Vamos para ErrHandler Final Se LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) Se (isIP ()) Então GetMoistAirEnthalpy = 0.24 * TDryBulb + LimitadaHumRatio * (1061 + 0.444 * TDryBulb) Outro GetMoistAirEnthalpy = (1.006 * TDryBulb + LimitadaHumRatio * (2501 + 1.86 * TDryBulb)) * 1000 Final Se Saída Função ErrHandler: GetMoistAirEnthalpy = CVErr(xlErrNA) Final Função Função ObterMoistAirVolume(ByVal TDryBulb Como Variante, ByVal HumRatio Como Variante, ByVal Pressão Como Variante) Como Variante ' 'Retorna o volume específico do ar úmido, dada a temperatura do bulbo seco, proporção de umidade e pressão. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' HumRatio: Razão de umidade em lb_H2O/lb_Air [IP] ou kg_H2O/kg_Air [SI] ' Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] ' 'Retorna: 'Volume específico de ar úmido em pés³/lb de ar seco [IP] ou em m³/kg de ar seco [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 equação 26 ' ' Notas: 'Em unidades IP, R_DA_IP/144 é igual a 0,370486 que é o coeficiente que aparece na equação 26 'O fator 144 é para a conversão de Psi = lb/in² para lb/ft². ' Dim LimitadaHumRatio Como Variante Em Erro Vamos para ErrHandler Se (HumRatio < 0) Então MyMsgBox ("A relação de umidade é negativa") Vamos para ErrHandler Final Se LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) Se (isIP ()) Então ObterMoistAirVolume = R_DA_IP * GetTRankineFromTFahrenheit(TDryBulb) * (1 + 1.607858 * RazãoHum Limitada) / (144 * Pressão) Outro ObterMoistAirVolume = R_DA_SI * ObterTKelvinFromTCelsius(TDryBulb) * (1 + 1.607858 * RazãoHum Limitada) / Pressão Final Se Saída Função ErrHandler: ObterMoistAirVolume = CVErr(xlErrNA) Final Função Função GetTDryBulbFromMoistAirVolumeAndHumRatio(ByVal Volume de ar úmido Como Variante, ByVal HumRatio Como Variante, ByVal Pressão Como Variante) Como Variante ' 'Retorna a temperatura do bulbo seco dado o volume específico do ar úmido, a taxa de umidade e a pressão. ' 'Args: 'MoistAirVolume: Volume específico de ar úmido em ft³ lb⁻¹ de ar seco [IP] ou em m³ kg⁻¹ de ar seco [SI] ' HumRatio: Razão de umidade em lb_H2O/lb_Air [IP] ou kg_H2O/kg_Air [SI] ' Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] ' 'Retorna: 'Volume específico de ar úmido em pés³/lb de ar seco [IP] ou em m³/kg de ar seco [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 equação 26 ' ' Notas: 'Em unidades IP, R_DA_IP/144 é igual a 0,370486 que é o coeficiente que aparece na equação 26 'O fator 144 é para a conversão de Psi = lb/in² para lb/ft². ' Baseado na função `GetMoistAirVolume`, reorganizada para temperatura de bulbo seco. ' Dim LimitadaHumRatio Como Variante Em Erro Vamos para ErrHandler Se (HumRatio < 0) Então MyMsgBox ("A relação de umidade é negativa") Vamos para ErrHandler Final Se LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) Se (isIP ()) Então GetTDryBulbFromMoistAirVolumeAndHumRatio = GetTFahrenheitFromTRankine(MoistAirVolume * (144 * Pressão) / (R_DA_IP * (1 + 1.607858 * LimitadaHumRatio))) Outro GetTDryBulbFromMoistAirVolumeAndHumRatio = ObterTCelsiusFromTKelvin(MoistAirVolume * Pressão / (R_DA_SI * (1 + 1.607858 * LimitadaHumRatio))) Final Se Saída Função ErrHandler: GetTDryBulbFromMoistAirVolumeAndHumRatio = CVErr(xlErrNA) Final Função Função GetMoistAirDensity(ByVal TDryBulb Como Variante, ByVal HumRatio Como Variante, ByVal Pressão Como Variante) Como Variante ' 'Retorna a densidade do ar úmido de acordo com a taxa de umidade, temperatura de bulbo seco e pressão. ' 'Args: ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' HumRatio: Razão de umidade em lb_H2O/lb_Air [IP] ou kg_H2O/kg_Air [SI] ' Pressão: Pressão atmosférica em Psi [IP] ou Pa [SI] ' 'Retorna: 'MoistAirDensity: Densidade do ar úmido em lb/ft³ [IP] ou kg/m³ [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 equação 11 ' Dim Volume de ar úmido Como Variante, LimitadaHumRatio Como Variante Em Erro Vamos para ErrHandler Se (HumRatio < 0) Então MyMsgBox ("A relação de umidade é negativa") Vamos para ErrHandler Final Se LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO) Volume de ar úmido = GetMoistAirVolume(TDryBulb, LimitadaHumRatio, Pressão) GetMoistAirDensity = (1 + RazãoHum Limitada) / Volume de ar úmido Saída Função ErrHandler: GetMoistAirDensity = CVErr(xlErrNA) Final Função '********************************************** ************************************************** *** ' Atmosfera padrão '********************************************** ************************************************** *** Função ObterStandardAtmPressure(ByVal Altitude Como Variante) Como Variante ' 'Retorna a pressão barométrica atmosférica padrão, dada a elevação (altitude). ' 'Args: ' Altitude: Altitude em pés [IP] ou m [SI] ' 'Retorna: 'Pressão barométrica da atmosfera padrão em Psi [IP] ou Pa [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 equação 3 ' Em Erro Vamos para ErrHandler Se (isIP ()) Então ObterStandardAtmPressure = 14.696 * (1 - 0.0000068754 * Altitude) ^ 5.2559 Outro ObterStandardAtmPressure = 101325 * (1 - 0.0000225577 * Altitude) ^ 5.2559 Final Se Saída Função ErrHandler: ObterStandardAtmPressure = CVErr(xlErrNA) Final Função Função ObterStandardAtmTemperature(ByVal Altitude Como Variante) Como Variante ' 'Retorna a temperatura atmosférica padrão, dada a elevação (altitude). ' 'Args: ' Altitude: Altitude em pés ' 'Retorna: 'Temperatura de bulbo seco da atmosfera padrão em °F [IP] ou °C [SI] ' 'Referência: ' Manual ASHRAE - Fundamentos (2017) cap. 1 equação 4 ' Em Erro Vamos para ErrHandler Se (isIP ()) Então ObterStandardAtmTemperature = 59 - 0.0035662 * Altitude Outro ObterStandardAtmTemperature = 15 - 0.0065 * Altitude Final Se Saída Função ErrHandler: ObterStandardAtmTemperature = CVErr(xlErrNA) Final Função Função ObterSeaLevelPressure(ByVal EstaçãoPressão Como Variante, ByVal Altitude Como Variante, ByVal TDryBulb Como Variante) Como Variante ' ' Pressão de retorno ao nível do mar dada a temperatura de bulbo seco, altitude acima do nível do mar e pressão. ' 'Args: ' StationPressure : Pressão observada da estação em Psi [IP] ou Pa [SI] ' Altitude: Altitude em pés [IP] ou m [SI] ' TDryBulb : Temperatura do bulbo seco em °F [IP] ou °C [SI] ' 'Retorna: ' Pressão barométrica ao nível do mar em Psi [IP] ou Pa [SI] ' 'Referência: ' Hess SL, Introdução à meteorologia teórica, Holt Rinehart e Winston, NY 1959, ' CH. 6,5; Stull RB, Meteorologia para cientistas e engenheiros, 2ª edição, ' Brooks/Cole 2000, cap. 1. ' ' Notas: 'O procedimento padrão para os EUA é usar para TDryBulb a média 'da temperatura atual da estação e da temperatura da estação de 12 horas atrás. ' 'Calcula a temperatura média na coluna de ar, assumindo uma taxa de lapso ' de 6,5°C/km Dim TColumn Como Variante Dim H Como Variante Em Erro Vamos para ErrHandler Se (isIP ()) Então 'Calcula a temperatura média na coluna de ar, assumindo uma taxa de lapso 'de 3,6 °F/1000 pés TColumn = TDryBulb + 0.0036 * Altitude / 2 'Determina a altura da escala H = 53.351 * ObterTRankinDeTFahrenheit(TColumn) Outro 'Calcula a temperatura média na coluna de ar, assumindo uma taxa de lapso ' de 6,5°C/km |