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 { /// |
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 TColumn = TDryBulb + 0.0065 * Altitude / 2 'Determina a altura da escala H = 287.055 * ObterTKelvinFromTCelsius(TColumn) / 9.807 Final Se 'Calcula a pressão ao nível do mar ObterSeaLevelPressure = EstaçãoPressão * Exp(Altitude / H) Saída Função ErrHandler: ObterSeaLevelPressure = CVErr(xlErrNA) Final Função Função GetStationPressão(ByVal Nível do MarPressão Como Variante, ByVal Altitude Como Variante, ByVal TDryBulb Como Variante) Como Variante ' '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: ' Veja 'GetSeaLevelPressure' ' ' Notas: 'Esta função é apenas o inverso de 'GetSeaLevelPressure'. ' Em Erro Vamos para ErrHandler GetStationPressão = Nível do MarPressão / GetSeaLevelPressure(1, Altitude, TDryBulb) Saída Função ErrHandler: GetStationPressão = CVErr(xlErrNA) Final Função '********************************************** ************************************************** *** 'Funções para definir todos os valores psicrométricos '********************************************** ************************************************** *** Sub CalcPsicrometriaFromTWetBulb(ByVal TDryBulb Como Variante, ByVal TWetBulb Como Variante, ByVal Pressão Como Variante, _ ByRef HumRatio Como Variante, ByRef TDewPoint Como Variante, ByRef RelHum Como Variante, ByRef VapPres Como Variante, _ ByRef MoistAirEnthalpia Como Variante, ByRef Volume de ar úmido Como Variante, ByRef Grau de saturação Como Variante) ' '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 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] ' 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) Final Sub Sub CalcPsicrometriaFromTDewPoint(ByVal TDryBulb Como Variante, ByVal TDewPoint Como Variante, ByVal Pressão Como Variante, _ ByRef HumRatio Como Variante, ByRef TWetBulb Como Variante, ByRef RelHum Como Variante, ByRef VapPres Como Variante, _ ByRef MoistAirEnthalpia Como Variante, ByRef Volume de ar úmido Como Variante, ByRef Grau de saturação Como Variante) ' '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_H2O/lb_Air [IP] ou kg_H2O/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) Final Sub Sub CalcPsicrometriaFromRelHum(ByVal TDryBulb Como Variante, ByVal RelHum Como Variante, ByVal Pressão Como Variante, _ ByRef HumRatio Como Variante, ByRef TWetBulb Como Variante, ByRef TDewPoint Como Variante, ByRef VapPres Como Variante, _ ByRef MoistAirEnthalpia Como Variante, ByRef Volume de ar úmido Como Variante, ByRef Grau de saturação Como Variante) ' ' 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_H2O/lb_Air [IP] ou kg_H2O/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) Final Sub |
Javascript
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 | /** * 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. */ função Psicrometria() { /** * 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 * 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 (por exemplo, Node.JS) * //Importa o PsychroLib * var psicrolib = require('psicrolib.js') * // Define o sistema de unidades *psicrolib.SetUnitSystem(psicrolib.SI) * // Calcula a temperatura do ponto de orvalho para uma temperatura de bulbo seco de 25 C e uma umidade relativa de 80% * var TDewPoint = psicrolib.GetTDewPointFromRelHum(25,0, 0,80); * console.log('TDewPoint: %d', TDewPoint); * 21.3094 * * 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, porém, 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. */ //Funções padrão var registro = Matemática.registro; var exp = Matemática.exp; var Pancada = Matemática.Pancada; var min = Matemática.min; var max = Matemática.max; var abs = Matemática.abdômen; /****************************************************************************************************** * Constantes globais *****************************************************************************************************/ var ZERO_FAHRENHEIT_AS_RANKINE = 459.67; // Zero grau Fahrenheit (°F) expresso como grau Rankine (°R). // Referência: Manual ASHRAE - Fundamentos (2017) cap. 39. var ZERO_CELSIUS_AS_KELVIN = 273.15; // Zero grau Celsius (°C) expresso em Kelvin (K). // Referência: Manual ASHRAE - Fundamentos (2017) cap. 39. var 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. var 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. var INVÁLIDO = -99999; // Valor inválido (adimensional). var MAX_ITER_COUNT = 100 // Número máximo de iterações antes de sair dos loops while. var MIN_HUM_RATIO = 1e-7 // 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. var FREEZING_POINT_WATER_IP = 32.0 // Ponto de congelamento da água em Fahrenheit. var FREEZING_POINT_WATER_SI = 0.0 // Ponto de congelamento da água em Celsius. var TRIPLE_POINT_WATER_IP = 32.018 // Ponto triplo da água em Fahrenheit. var TRIPLE_POINT_WATER_SI = 0.01 // Ponto triplo da água em Celsius. /****************************************************************************************************** * Funções auxiliares *****************************************************************************************************/ //Sistemas de unidades (IP ou SI) var PSYCHROLIB_UNITS = indefinido; este.IP = 1; este.SI = 2; //Função para definir o sistema de unidades // Nota: esta função *TEM QUE SER CHAMADA* antes que a biblioteca possa ser usada este.SetUnitSystem = função(Sistema de Unidades) { se (Sistema de Unidades ! = este.IP && UnitSystem ! = este.SI) { lançar novo Erro('UnitSystem deve ser IP ou SI'); } PSYCHROLIB_UNITS = UnidadeSistema; //Definir tolerância de cálculos de temperatura // A tolerância é a mesma em IP e SI se (PSYCHROLIB_UNITS == este.IP) PSYCHROLIB_TOLERANCE = 0.001 * 9. / 5.; outro PSYCHROLIB_TOLERANCE = 0.001; } // Retorna o sistema de unidades em uso. este.GetUnitSystem = função() { Retorna PSYCHROLIB_UNITS; } //Função para verificar se o sistema de unidades atual é SI ou IP // A função sai com erro se o sistema de unidades for indefinido este.isIP = função() { se (PSYCHROLIB_UNITS == este.IP) Retorna verdadeiro; outro se (PSYCHROLIB_UNITS == este.SI) Retorna falso; outro lançar novo Erro("O sistema de unidades não está definido"); } /****************************************************************************************************** * Conversão entre unidades de temperatura *****************************************************************************************************/ // 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 este.GetTRankineFromTFahrenheit = função (T_F) { Retorna T_F + ZERO_FAHRENHEIT_AS_RANKINE; } /* exato */ // 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 este.GetTFahrenheitFromTRankine = função (T_R) { Retorna T_R - ZERO_FAHRENHEIT_AS_RANKINE; } /* exato */ // 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 este.GetTKelvinFromTCelsius = função (T_C) { Retorna T_C + ZERO_CELSIUS_AS_KELVIN; } /* exato */ // 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 este.GetTCelsiusFromTKelvin = função (T_K) { Retorna T_K - ZERO_CELSIUS_AS_KELVIN; } /* exato */ /****************************************************************************************************** * Conversões entre ponto de orvalho, bulbo úmido e umidade relativa *****************************************************************************************************/ // 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 este.GetTWetBulbFromTDewPoint = função // (o) Temperatura de bulbo úmido em °F [IP] ou °C [SI] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , TDewPoint // (i) Temperatura do ponto de orvalho em °F [IP] ou °C [SI] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { var HumRatio; se (!(TDewPoint TDryBulb)) lançar novo Erro("A temperatura do ponto de orvalho está acima da temperatura do bulbo seco"); HumRatio = este.GetHumRatioFromTDewPoint(TDewPoint, Pressão); Retorna este.GetTWetBulbFromHumRatio(TDryBulb, HumRatio, Pressão); } // Retorna a temperatura de bulbo úmido dada a temperatura de bulbo seco, umidade relativa e pressão. // Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 este.GetTWetBulbFromRelHum = função // (o) Temperatura de bulbo úmido em °F [IP] ou °C [SI] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , RelHum // (i) Umidade relativa [0-1] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { var HumRatio; se (! (RelHum > = 0. && RelHum 1.)) lançar novo Erro("A umidade relativa está fora da faixa [0,1]"); HumRatio = este.GetHumRatioFromRelHum(TDryBulb, RelHum, Pressão); Retorna este.GetTWetBulbFromHumRatio(TDryBulb, HumRatio, Pressão); } // 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 este.GetRelHumFromTDewPoint = função // (o) Umidade relativa [0-1] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , TDewPoint // (i) Temperatura do ponto de orvalho em °F [IP] ou °C [SI] ) { var VapPres, SatVapPres; se (!(TDewPoint TDryBulb)) lançar novo Erro("A temperatura do ponto de orvalho está acima da temperatura do bulbo seco"); VapPres = este.GetSatVapPres(TDewPoint); SatVapPres = este.GetSatVapPres(TDryBulb); Retorna VapPres / SatVapPres; } // Retorna a umidade relativa dada a temperatura de bulbo seco, temperatura e pressão de bulbo úmido. // Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 este.GetRelHumFromTWetBulb = função // (o) Umidade relativa [0-1] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , TWetBulb // (i) Temperatura de bulbo úmido em °F [IP] ou °C [SI] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { var HumRatio; se (!(TWetBulb TDryBulb)) lançar novo Erro(“A temperatura do bulbo úmido está acima da temperatura do bulbo seco”); HumRatio = este.GetHumRatioFromTWetBulb(TDryBulb, TWetBulb, Pressão); Retorna este.GetRelHumFromHumRatio(TDryBulb, HumRatio, Pressão); } // Retorna a temperatura do ponto de orvalho dada a temperatura de bulbo seco e a umidade relativa. // Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 este.GetTDewPointFromRelHum = função // (o) Temperatura do ponto de orvalho em °F [IP] ou °C [SI] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , RelHum // (i) Umidade relativa [0-1] ) { var VapPres; se (! (RelHum > = 0. && RelHum 1.)) lançar novo Erro("A umidade relativa está fora da faixa [0,1]"); VapPres = este.GetVapPresFromRelHum(TDryBulb, RelHum); Retorna este.GetTDewPointFromVapPres(TDryBulb, VapPres); } // 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 este.GetTDewPointFromTWetBulb = função // (o) Temperatura do ponto de orvalho em °F [IP] ou °C [SI] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , TWetBulb // (i) Temperatura de bulbo úmido em °F [IP] ou °C [SI] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { var HumRatio; se (!(TWetBulb TDryBulb)) lançar novo Erro(“A temperatura do bulbo úmido está acima da temperatura do bulbo seco”); HumRatio = este.GetHumRatioFromTWetBulb(TDryBulb, TWetBulb, Pressão); Retorna este.GetTDewPointFromHumRatio(TDryBulb, HumRatio, Pressão); } /****************************************************************************************************** * Conversões entre ponto de orvalho ou umidade relativa e pressão de vapor *****************************************************************************************************/ // 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 este.GetVapPresFromRelHum = função // (o) Pressão parcial do vapor de água no ar úmido em Psi [IP] ou Pa [SI] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , RelHum // (i) Umidade relativa [0-1] ) { se (! (RelHum > = 0. && RelHum 1.)) lançar novo Erro("A umidade relativa está fora da faixa [0,1]"); Retorna RelHum * este.GetSatVapPres(TDryBulb); } // 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 este.GetRelHumFromVapPres = função // (o) Umidade relativa [0-1] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , VapPres // (i) Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] ) { se (! (VapPres > = 0.)) lançar novo Erro(“A pressão parcial do vapor d'água no ar úmido é negativa”); Retorna VapPres / este.GetSatVapPres(TDryBulb); } // 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 este.dLnPws_ = função // (o) Derivada do logaritmo natural da pressão de vapor do ar saturado em Psi [IP] ou Pa [SI] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] ) { var dLnPws, T; se (este.isIP ()) { T = este.GetTRankineFromTFahrenheit(TDryBulb); se (TDryBulb TRIPLE_POINT_WATER_IP) dLnPws = 1.0214165E +04 / pow (T, 2) - 5.3765794E-03 + 2 * 1.9202377E-07 * T + 3 * 3.5575832E-10 * pow (T, 2) - 4 * 9.0344688E-14 * pow (T, 3) + 4.1635019 / T; outro dLnPws = 1.0440397E +04 / pow (T, 2) - 2.7022355E-02 + 2 * 1.2890360E-05 * T - 3 * 2.4780681E-09 * pow (T, 2) + 6.5459673 / T; } outro { T = este.GetTKelvinFromTCelsius(TDryBulb); se (TDryBulb TRIPLE_POINT_ÁGUA_SI) dLnPws = 5.6745359E +03 / pow (T, 2) - 9.677843E-03 + 2 * 6.2215701E-07 * T + 3 * 2.0747825E-09 * pow (T, 2) - 4 * 9.484024E-13 * pow (T, 3) + 4.1635019 / T; outro dLnPws = 5.8002206E +03 / pow (T, 2) - 4.8640239E-02 + 2 * 4.1764768E-05 * T - 3 * 1.4452093E-08 * pow (T, 2) + 6.5459673 / T; } Retorna dLnPws; } // Retorno da temperatura do ponto de orvalho dada a temperatura de 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 d'á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. este.GetTDewPointFromVapPres = função // (o) Temperatura do ponto de orvalho em °F [IP] ou °C [SI] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , VapPres // (i) Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] ) { //Função limites do sistema de unidades var BOUNDS // Domínio de validade das equações se (este.isIP ()) { BOUNDS = [-148., 392.]; // Domínio de validade das equações } outro { BOUNDS = [-100., 200.]; // Domínio de validade das equações } // Limites fora dos quais uma solução não pode ser encontrada se (VapPres este.GetSatVapPres(LIMITES[0]) || VapPres > este.GetSatVapPres(LIMITES[1])) lançar novo Erro(“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 = log(VapPres); // Logaritmo natural da pressão parcial da pressão do vapor de água no ar úmido var TDewPoint_iter; // Valor do TDewPoint utilizado no cálculo do NR var 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 = registro(este.GetSatVapPres(TDewPoint_iter)); // Derivada da função, calculada analiticamente var d_lnVP = este.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 = max(TDewPoint, BOUNDS [0]); TDewPoint = min(TDewPoint, BOUNDS [1]); se (índice > MAX_ITER_COUNT) lançar novo Erro("Convergência não alcançada em GetTDewPointFromVapPres. Parando."); index ++; } enquanto (abs(TDewPoint - TDewPoint_iter) > PSYCHROLIB_TOLERANCE); Retorna min(TDewPoint, TDryBulb); } // Pressão de vapor de retorno dada a temperatura do ponto de orvalho. // Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 36 este.GetVapPresFromTDewPoint = função // (o) Pressão parcial do vapor de água no ar úmido em Psi [IP] ou Pa [SI] ( TDewPoint // (i) Temperatura do ponto de orvalho em °F [IP] ou °C [SI] ) { Retorna este.GetSatVapPres(TDewPoint); } /****************************************************************************************************** * Conversões de temperatura de bulbo úmido, temperatura de ponto de orvalho ou umidade relativa para proporção de umidade *****************************************************************************************************/ // Retorna a temperatura do bulbo úmido dada a temperatura do bulbo seco, proporção de umidade e pressão. // Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eqn 33 e 35 resolvido para Tstar este.GetTWetBulbFromHumRatio = função // (o) Temperatura de bulbo úmido em °F [IP] ou °C [SI] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , HumRatio // (i) Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { // Declarações var Wstar; var TDewPoint, TWetBulb, TWetBulbSup, TWetBulbInf, LimitadaHumRatio; var índice = 1; se (!(HumRatio > = 0.)) lançar novo Erro("A relação de umidade é negativa"); LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO); TDewPoint = este.GetTDewPointFromHumRatio(TDryBulb, LimitadaHumRatio, Pressão); //Suposições iniciais TWetBulbSup = TDryBulb; TWetBulbInf = TDewPoint; TWetBulb = (TWetBulbInf + TWetBulbSup) / 2.; // Loop de bissecção enquanto ((TWetBulbSup - TWetBulbInf) > PSYCHROLIB_TOLERANCE) { // Calcula a taxa de umidade na temperatura Tstar Wstar = este.GetHumRatioFromTWetBulb(TDryBulb, TWetBulb, Pressão); // Obtenha novos limites se (Wstar > RazãoHum Limitada) TWetBulbSup = TWetBulb; outro TWetBulbInf = TWetBulb; // Nova estimativa da temperatura do bulbo úmido TWetBulb = (TWetBulbSup + TWetBulbInf) / 2.; se (índice > MAX_ITER_COUNT) lançar novo Erro("Convergência não alcançada em GetTWetBulbFromHumRatio. Parando."); index ++; } Retorna TWetBulb; } // 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 este.GetHumRatioFromTWetBulb = função // (o) Taxa de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , TWetBulb // (i) Temperatura de bulbo úmido em °F [IP] ou °C [SI] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { var Wsstar; HumRatio = INVÁLIDO se (!(TWetBulb TDryBulb)) lançar novo Erro(“A temperatura do bulbo úmido está acima da temperatura do bulbo seco”); Wsstar = este.GetSatHumRatio(TWetBulb, Pressão); se (este.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); } // Taxa de umidade de retorno dada a temperatura de bulbo seco, umidade relativa e pressão. // Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 este.GetHumRatioFromRelHum = função // (o) Taxa de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] ( TDryBulb // (i) Temperatura de bulbo seco [F] , RelHum // (i) Umidade relativa [0-1] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { var VapPres; se (! (RelHum > = 0. && RelHum 1.)) lançar novo Erro("A umidade relativa está fora da faixa [0,1]"); VapPres = este.GetVapPresFromRelHum(TDryBulb, RelHum); Retorna este.GetHumRatioFromVapPres(VapPres, Pressão); } // Retorna a umidade relativa dada a temperatura de bulbo seco, taxa de umidade e pressão. // Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 este.GetRelHumFromHumRatio = função // (o) Umidade relativa [0-1] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , HumRatio // (i) Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { var VapPres; se (!(HumRatio > = 0.)) lançar novo Erro("A relação de umidade é negativa"); VapPres = este.GetVapPresFromHumRatio(HumRatio, Pressão); Retorna este.GetRelHumFromVapPres(TDryBulb, VapPres); } // Taxa de umidade de retorno dada a temperatura e pressão do ponto de orvalho. // Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 este.GetHumRatioFromTDewPoint = função // (o) Taxa de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] ( TDewPoint // (i) Temperatura do ponto de orvalho em °F [IP] ou °C [SI] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { var VapPres; VapPres = este.GetSatVapPres(TDewPoint); Retorna este.GetHumRatioFromVapPres(VapPres, Pressão); } // 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 este.GetTDewPointFromHumRatio = função // (o) Temperatura do ponto de orvalho em °F [IP] ou °C [SI] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , HumRatio // (i) Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { var VapPres; se (!(HumRatio > = 0.)) lançar novo Erro("A relação de umidade é negativa"); VapPres = este.GetVapPresFromHumRatio(HumRatio, Pressão); Retorna este.GetTDewPointFromVapPres(TDryBulb, VapPres); } /****************************************************************************************************** * Conversões entre relação de umidade e pressão de vapor *****************************************************************************************************/ // Taxa de umidade de retorno dada a pressão de vapor d'água e a pressão atmosférica. // Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 equação 20 este.GetHumRatioFromVapPres = função // (o) Taxa de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] ( VapPres // (i) Pressão parcial de vapor de água no ar úmido em Psi [IP] ou Pa [SI] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { var HumRatio; se (! (VapPres > = 0.)) lançar novo Erro(“A pressão parcial do vapor d'água no ar úmido é negativa”); HumRatio = 0.621945 * VapPres / (Pressão - VapPres); //Verificação de validade. Retorna max(HumRatio, MIN_HUM_RATIO); } // 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 este.GetVapPresFromHumRatio = função // (o) Pressão parcial do vapor de água no ar úmido em Psi [IP] ou Pa [SI] ( HumRatio // (i) Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { var VapPres, LimitadaHumRatio; se (!(HumRatio > = 0.)) lançar novo Erro("A relação de umidade é negativa"); LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO); VapPres = Pressão * LimitadaHumRatio / (0.621945 + LimitadaHumRatio); Retorna VapPres; } /****************************************************************************************************** * Conversões entre relação de umidade e umidade específica *****************************************************************************************************/ // 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 este.GetSpecificHumFromHumRatio = função // (o) Razão de umidade específica em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] ( HumRatio // (i) Razão de umidade em lb_H₂O lb_Dry_Air⁻¹ [IP] ou kg_H₂O kg_Dry_Air⁻¹ [SI] ) { var LimitadaHumRatio; se (!(HumRatio > = 0.)) lançar novo Erro("A relação de umidade é negativa"); LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO); Retorna LimitadaHumRatio / (1.0 + LimitadaHumRatio); } // 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) este.GetHumRatioFromSpecificHum = função // (o) Razão de umidade em lb_H₂O lb_Dry_Air⁻¹ [IP] ou kg_H₂O kg_Dry_Air⁻¹ [SI] ( EspecíficoHum // (i) Razão de umidade específica em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] ) { var HumRatio; se (!(EspecíficoHum > = 0.0 && EspecíficoHum 1.0)) lançar novo Erro("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 *****************************************************************************************************/ // Retorna a entalpia do ar seco dada a temperatura do bulbo seco. // Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 eq. 28 este.GetDryAirEnthalpy = função // (o) Entalpia do ar seco em Btu lb⁻¹ [IP] ou J kg⁻¹ [SI] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] ) { se (este.isIP ()) Retorna 0.240 * TDryBulb; outro Retorna 1006. * TDryBulb; } // 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 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⁻². este.GetDryAirDensity = função // (o) Densidade do ar seco em lb ft⁻³ [IP] ou kg m⁻³ [SI] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { se (este.isIP ()) Retorna (144. * Pressão) / R_DA_IP / este.GetTRankineFromTFahrenheit(TDryBulb); outro Retorna Pressão / R_DA_SI / este.GetTKelvinFromTCelsius(TDryBulb); } //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 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⁻². este.GetDryAirVolume = função // (o) Volume de ar seco ft³ lb⁻¹ [IP] ou em m³ kg⁻¹ [SI] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { se (este.isIP ()) Retorna R_DA_IP * este.GetTRankineFromTFahrenheit(TDryBulb) / (144. * Pressão); outro Retorna R_DA_SI * este.GetTKelvinFromTCelsius(TDryBulb) / Pressão; } // 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. este.GetTDryBulbFromEnthalpyAndHumRatio = função // (o) Temperatura de bulbo seco em °F [IP] ou °C [SI] ( MoistAirEnthalpia // (i) Entalpia do ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹ , HumRatio // (i) Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] ) { var LimitadaHumRatio; se (!(HumRatio > = 0.)) lançar novo Erro("A relação de umidade é negativa"); LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO); se (este.isIP ()) Retorna (MoistAirEnthalpia - 1061.0 * RazãoHum Limitada) / (0.240 + 0.444 * LimitadaHumRatio); outro Retorna (MoistAirEnthalpia / 1000.0 - 2501.0 * RazãoHum Limitada) / (1.006 + 1.86 * LimitadaHumRatio); } // 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. este.GetHumRatioFromEnthalpyAndTDryBulb = função // (o) Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻ ( MoistAirEnthalpia // (i) Entalpia do ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹ , TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] ) { var HumRatio; se (este.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 *****************************************************************************************************/ // 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. este.GetSatVapPres = função // (o) Pressão de vapor do ar saturado em Psi [IP] ou Pa [SI] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] ) { var LnPws, T; se (este.isIP ()) { se (!(TDryBulb > = -148. && TDryBulb 392.)) lançar novo Erro("A temperatura do bulbo seco está fora da faixa [-148, 392]"); T = este.GetTRankineFromTFahrenheit(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 * pow (T, 3) - 9.0344688E-14 * pow (T, 4) + 4.1635019 * log (T)); outro LnPws = -1.0440397E +04 / T - 1.1294650E +01 - 2.7022355E-02 * T + 1.2890360E-05 * T * T - 2.4780681E-09 * pow (T, 3) + 6.5459673 * log (T); } outro { se (!(TDryBulb > = -100. && TDryBulb 200.)) lançar novo Erro("A temperatura do bulbo seco está fora da faixa [-100, 200]"); T = este.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 * pow (T, 3) - 9.484024E-13 * pow (T, 4) + 4.1635019 * log (T); outro LnPws = -5.8002206E +03 / T + 1.3914993 - 4.8640239E-02 * T + 4.1764768E-05 * T * T - 1.4452093E-08 * pow (T, 3) + 6.5459673 * log (T); } Retorna exp(LnPws); } // 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 este.GetSatHumRatio = função // (o) Razão de umidade do ar saturado em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { var SatVaporPres, Razão SatHum; SatVaporPres = este.GetSatVapPres(TDryBulb); SatHumRatio = 0.621945 * SatVaporPres / (Pressão - SatVaporPres); //Verificação de validade. Retorna max(SatHumRatio, MIN_HUM_RATIO); } // Retorna a entalpia do ar saturado dada a temperatura e pressão do bulbo seco. // Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 este.GetSatAirEnthalpy = função // (o) Entalpia do ar saturado em Btu lb⁻¹ [IP] ou J kg⁻¹ [SI] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { Retorna este.GetMoistAirEnthalpy(TDryBulb, este.GetSatHumRatio(TDryBulb, Pressão)); } /****************************************************************************************************** * Cálculos de ar úmido *****************************************************************************************************/ // 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 este.GetVaporPressureDeficit = função // (o) Déficit de pressão de vapor em Psi [IP] ou Pa [SI] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , HumRatio // (i) Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { var RelHum; se (!(HumRatio > = 0.)) lançar novo Erro("A relação de umidade é negativa"); RelHum = este.GetRelHumFromHumRatio(TDryBulb, HumRatio, Pressão); Retorna este.GetSatVapPres(TDryBulb) * (1. - RelHum); } // 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. // Referência: Manual ASHRAE - Fundamentos (2009) cap. 1 eq. 12 // Notas: a definição está ausente do Manual de 2017 este.GetDegreeOfSaturation = função // (o) Grau de saturação (sem unidade) ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , HumRatio // (i) Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { var LimitadaHumRatio; se (!(HumRatio > = 0.)) lançar novo Erro("A relação de umidade é negativa"); LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO); Retorna LimitadaHumRatio / este.GetSatHumRatio(TDryBulb, Pressão); } // 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 este.GetMoistAirEnthalpy = função // (o) Entalpia do ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹ [SI] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , HumRatio // (i) Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] ) { var LimitadaHumRatio; se (!(HumRatio > = 0.)) lançar novo Erro("A relação de umidade é negativa"); LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO); se (este.isIP ()) Retorna 0.240 * TDryBulb + LimitadaHumRatio * (1061. + 0.444 * TDryBulb); outro Retorna (1.006 * TDryBulb + LimitadaHumRatio * (2501. + 1.86 * TDryBulb)) * 1000.; } // 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 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⁻². este.GetMoistAirVolume = função // (o) Volume específico ft³ lb⁻¹ [IP] ou em m³ kg⁻¹ [SI] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , HumRatio // (i) Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { var LimitadaHumRatio; se (!(HumRatio > = 0.)) lançar novo Erro("A relação de umidade é negativa"); LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO); se (este.isIP ()) Retorna R_DA_IP * este.GetTRankineFromTFahrenheit(TDryBulb) * (1. + 1.607858 * RazãoHum Limitada) / (144. * Pressão); outro Retorna R_DA_SI * este.GetTKelvinFromTCelsius(TDryBulb) * (1. + 1.607858 * RazãoHum Limitada) / Pressão; } // 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. este.GetTDryBulbFromMoistAirVolumeAndHumRatio = função // (o) Temperatura de bulbo seco em °F [IP] ou °C [SI] ( Volume de ar úmido // (i) Volume específico de ar úmido em ft³ lb⁻¹ de ar seco [IP] ou em m³ kg⁻¹ de ar seco [SI] , HumRatio // (i) Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { var LimitadaHumRatio; se (!(HumRatio > = 0.)) lançar novo Erro("A relação de umidade é negativa"); LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO); se (este.isIP ()) Retorna este.GetTFahrenheitFromTRankine(MoistAirVolume * (144 * Pressão) / (R_DA_IP * (1 + 1.607858 * BoundedHumRatio))); outro Retorna este.GetTCelsiusFromTKelvin(MoistAirVolume * Pressão / (R_DA_SI * (1 + 1.607858 * BoundedHumRatio))); } // 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 este.GetMoistAirDensity = função // (o) Densidade do ar úmido em lb ft⁻³ [IP] ou kg m⁻³ [SI] ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , HumRatio // (i) Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { var LimitadaHumRatio; se (!(HumRatio > = 0.)) lançar novo Erro("A relação de umidade é negativa"); LimitadaHumRatio = max(HumRatio, MIN_HUM_RATIO); Retorna (1. + RazãoHum Limitada) / este.GetMoistAirVolume(TDryBulb, LimitadaHumRatio, Pressão); } /****************************************************************************************************** * Atmosfera padrã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 este.GetStandardAtmPressure = função // (o) Pressão barométrica da atmosfera padrão em Psi [IP] ou Pa [SI] ( Altitude // (i) Altitude em pés [IP] ou m [SI] ) { var Pressão; se (este.isIP ()) Pressão = 14.696 * Pancada(1. - 6.8754e-06 * Altitude, 5.2559); outro Pressão = 101325.* Pancada(1. - 2.25577e-05 * Altitude, 5.2559); Retorna Pressão; } // Retorna a temperatura atmosférica padrão, dada a elevação (altitude). // Referência: Manual ASHRAE - Fundamentos (2017) cap. 1 equação 4 este.GetStandardAtmTemperatura = função // (o) Temperatura de bulbo seco da atmosfera padrão em °F [IP] ou °C [SI] ( Altitude // (i) Altitude em pés [IP] ou m [SI] ) { var Temperatura; se (este.isIP ()) Temperatura = 59. - 0.00356620 * Altitude; outro Temperatura = 15. - 0.0065 * Altitude; Retorna Temperatura; } // 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, // 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. este.GetSeaLevelPressure = função // (o) Pressão barométrica ao nível do mar em Psi [IP] ou Pa [SI] ( Pressão Stn // (i) Pressão observada da estação em Psi [IP] ou Pa [SI] , Altitude // (i) Altitude acima do nível do mar em pés [IP] ou m [SI] , TDryBulb // (i) Temperatura de bulbo seco em ft³ lb⁻¹ [IP] ou em m³ kg⁻¹ [SI] ) { var TColuna, H; se (este.isIP ()) { // 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 * este.GetTRankineFromTFahrenheit(TColumn); } outro { // Calcula a temperatura média na coluna de ar, assumindo uma taxa de lapso // de 6,5 °C/km TColumn = TDryBulb + 0.0065 * Altitude / 2.; // Determina a altura da escala H = 287.055 * este.GetTKelvinFromTCelsius(TColumn) / 9.807; } //Calcula a pressão ao nível do mar var Nível do MarPressão = Pressão Stn * exp(Altitude / H); Retorna Pressão do nível do mar; } // 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'. este.GetStationPressure = função // (o) Pressão da estação em Psi [IP] ou Pa [SI] ( Nível do MarPressão // (i) Pressão barométrica ao nível do mar em Psi [IP] ou Pa [SI] , Altitude // (i) Altitude acima do nível do mar em pés [IP] ou m [SI] , TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] ) { Retorna Nível do MarPressão / este.GetSeaLevelPressure(1., Altitude, TDryBulb); } /****************************************************************************************************** * Funções para definir todos os valores psicrométricos *****************************************************************************************************/ // 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. este.CalcPsychrometricsFromTWetBulb = função /** * HumRatio // (o) Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] * TDewPoint // (o) Temperatura do ponto de orvalho em °F [IP] ou °C [SI] * RelHum // (o) Umidade relativa [0-1] * VapPres // (o) Pressão parcial do vapor de água no ar úmido em Psi [IP] ou Pa [SI] * MoistAirEnthalpy // (o) Entalpia do ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹ [SI] * MoistAirVolume // (o) Volume específico ft³ lb⁻¹ [IP] ou em m³ kg⁻¹ [SI] * DegreeOfSaturation // (o) Grau de saturação [sem unidade] */ ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , TWetBulb // (i) Temperatura de bulbo úmido em °F [IP] ou °C [SI] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { var HumRatio = este.GetHumRatioFromTWetBulb(TDryBulb, TWetBulb, Pressão); var TDewPoint = este.GetTDewPointFromHumRatio(TDryBulb, HumRatio, Pressão); var RelHum = este.GetRelHumFromHumRatio(TDryBulb, HumRatio, Pressão); var VapPres = este.GetVapPresFromHumRatio(HumRatio, Pressão); var MoistAirEnthalpia = este.GetMoistAirEnthalpy(TDryBulb, HumRatio); var Volume de ar úmido = este.GetMoistAirVolume(TDryBulb, HumRatio, Pressão); var Grau de saturação = este.GetDegreeOfSaturation(TDryBulb, HumRatio, Pressão); Retorna [HumRatio, TDewPoint, RelHum, VapPres, MoistAirEntalpia, MoistAirVolume, GrauDeSaturaçã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. este.CalcPsychrometricsFromTDewPoint = função /** * HumRatio // (o) Razão de umidade em lb_H₂O lb_Air⁻¹ [IP] ou kg_H₂O kg_Air⁻¹ [SI] * TWetBulb // (o) Temperatura do bulbo úmido em °F [IP] ou °C [SI] * RelHum // (o) Umidade relativa [0-1] * VapPres // (o) Pressão parcial do vapor de água no ar úmido em Psi [IP] ou Pa [SI] * MoistAirEnthalpy // (o) Entalpia do ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹ [SI] * MoistAirVolume // (o) Volume específico ft³ lb⁻¹ [IP] ou em m³ kg⁻¹ [SI] * DegreeOfSaturation // (o) Grau de saturação [sem unidade] */ ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , TDewPoint // (i) Temperatura do ponto de orvalho em °F [IP] ou °C [SI] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { var HumRatio = este.GetHumRatioFromTDewPoint(TDewPoint, Pressão); var TWetBulb = este.GetTWetBulbFromHumRatio(TDryBulb, HumRatio, Pressão); var RelHum = este.GetRelHumFromHumRatio(TDryBulb, HumRatio, Pressão); var VapPres = este.GetVapPresFromHumRatio(HumRatio, Pressão); var MoistAirEnthalpia = este.GetMoistAirEnthalpy(TDryBulb, HumRatio); var Volume de ar úmido = este.GetMoistAirVolume(TDryBulb, HumRatio, Pressão); var Grau de saturação = este.GetDegreeOfSaturation(TDryBulb, HumRatio, Pressão); Retorna [HumRatio, TWetBulb, RelHum, VapPres, MoistAirEntalpia, MoistAirVolume, GrauDeSaturaçã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. este.CalcPsicrometriaDeRelHum = função /** * HumRatio // (o) Pressão parcial do vapor de água no ar úmido em Psi [IP] ou Pa [SI] * TWetBulb // (o) Temperatura do bulbo úmido em °F [IP] ou °C [SI] * TDewPoint // (o) Temperatura do ponto de orvalho em °F [IP] ou °C [SI] * VapPres // (o) Pressão parcial do vapor d'água no ar úmido [Psi] * MoistAirEnthalpy // (o) Entalpia do ar úmido em Btu lb⁻¹ [IP] ou J kg⁻¹ [SI] * MoistAirVolume // (o) Volume específico ft³ lb⁻¹ [IP] ou em m³ kg⁻¹ [SI] * DegreeOfSaturation // (o) Grau de saturação [sem unidade] */ ( TDryBulb // (i) Temperatura de bulbo seco em °F [IP] ou °C [SI] , RelHum // (i) Umidade relativa [0-1] , Pressão // (i) Pressão atmosférica em Psi [IP] ou Pa [SI] ) { var HumRatio = este.GetHumRatioFromRelHum(TDryBulb, RelHum, Pressão); var TWetBulb = este.GetTWetBulbFromHumRatio(TDryBulb, HumRatio, Pressão); var TDewPoint = este.GetTDewPointFromHumRatio(TDryBulb, HumRatio, Pressão); var VapPres = este.GetVapPresFromHumRatio(HumRatio, Pressão); var MoistAirEnthalpia = este.GetMoistAirEnthalpy(TDryBulb, HumRatio); var Volume de ar úmido = este.GetMoistAirVolume(TDryBulb, HumRatio, Pressão); var Grau de saturação = este.GetDegreeOfSaturation(TDryBulb, HumRatio, Pressão); Retorna [HumRatio, TWetBulb, TDewPoint, VapPres, MoistAirEntalpia, MoistAirVolume, GrauDeSaturação]; } } // https://github.com/umdjs/umd (função (raiz, fábrica) { se (tipo de definir === 'função' && definir.amd) { //AMD. Registre-se como um módulo anônimo. definir([], fábrica); } outro se (tipo de módulo === 'objeto' && módulo.exportações) { // Nó. Não funciona com CommonJS estrito, mas // apenas ambientes do tipo CommonJS que suportam module.exports, //como o Node. módulo.exportações = fábrica(); } outro { // Globais do navegador (raiz é janela) raiz.psicrolib = fábrica(); } }(tipo de auto !== 'indefinido' ? auto : este, função () { Retorna novo Psicrometria(); })); |
C
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 | /** * 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. * * 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 * 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 * #include "psicrolib.h" * // Define o sistema de unidades, por exemplo, para SI (pode ser 'SI' ou 'IP') * SetUnitSystem(SI); * // Calcula a temperatura do ponto de orvalho para uma temperatura de bulbo seco de 25 C e uma umidade relativa de 80% * double TDewPoint = GetTDewPointFromRelHum(25,0, 0,80); * printf("%lg", TDewPoint); * 21.3094 * * 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, porém, 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. */ //Arquivos de cabeçalho C padrão #include |
FREQUENTLY ASKED QUESTIONS
Implementing psychrometric formulas in computer programs or spreadsheets can be challenging and time-consuming due to the complexity of the equations involved. Some common challenges include ensuring accuracy and precision, handling unit conversions, and dealing with iterative calculations. Additionally, implementing these formulas requires a deep understanding of the underlying thermodynamic principles and mathematical concepts, which can be a barrier for many engineers and researchers.
PsychroLib supports a range of programming languages, including Python, C, C#, Fortran, JavaScript, and VBA/Excel. The library is designed to be easily accessible and can be downloaded from the PsychroLib website. Once downloaded, users can integrate the library into their preferred programming environment and start using the psychrometric functions to calculate thermodynamic properties of air.
PsychroLib simplifies the process of calculating psychrometric properties of air by providing a comprehensive library of functions that can be easily integrated into computer programs or spreadsheets. This eliminates the need for users to implement complex formulas and equations from scratch, saving time and reducing the risk of errors. The library also provides a consistent and accurate way of calculating psychrometric properties, ensuring that results are reliable and trustworthy.
PsychroLib can be used for both research and development purposes, as well as practical applications. The library provides a robust and accurate way of calculating psychrometric properties of air, making it an ideal tool for researchers and developers working on HVAC and meteorology-related projects. At the same time, the library is also suitable for practical applications, such as designing and optimizing HVAC systems, and analyzing weather patterns and climate phenomena.