Example #1
0
    def test_density_at_saturation(self):
        """Density of saturated humid air from dry bulb temperature."""
        # TODO finish test specific_volume

        # vol_m3_kg = specific_volume(
        #     dry_temp_c, p_sat, p_atm_kpa=PRESSURE_STD_ATM_KPA)
        # print(dry_temp_c, p_sat, p_sat_ref, vol_m3_kg, 1/vol_m3_kg, d_ref)
        # self.assertAlmostEqual(1 / vol_m3_kg, d_ref, delta=1)

        from psychrochart.equations import (
            PRESSURE_STD_ATM_KPA, saturation_pressure_water_vapor,
            specific_volume)

        press = PRESSURE_STD_ATM_KPA
        for t, (ps_ref, dens_ref) in TEMP_PRESS_PA_DENS_G_KG.items():
            # dens_ref_kg_m3 = dens_ref / 1000.

            psat = saturation_pressure_water_vapor(t, mode=1)
            # xmax = humidity_ratio(psat)
            vol_psat = specific_volume(t, psat, p_atm_kpa=press)
            vol_p0 = specific_volume(t, 0, p_atm_kpa=press)
            print('DEB', t, dens_ref, vol_psat, vol_p0, 1/vol_psat, 1/vol_p0)
            dens_kg_m3 = 1 / vol_psat - 1 / vol_p0
            print(dens_kg_m3)

            self.assertAlmostEqual(psat, ps_ref / 1000, delta=27)
Example #2
0
 def Qest(self):
     """Carga de refrigeração sensível e latente para fluxo de ar
     estabelecido kW"""
     import psychrochart.equations as pce
     area_p = self.h_porta * self.l_porta
     tbs = self.temp_externa('tbs')
     tbu = self.temp_externa('tbu')
     h_externo = pce.humidity_ratio_from_temps(tbs, tbu)
     w_externo = pce.water_vapor_pressure(h_externo)
     hi = pce.enthalpy_moist_air(tbs, w_externo)
     t_estoc = self.dados_produto('T Estoc')
     u_estoc = self.dados_produto('UR')
     t_bu_refri = pce.wet_bulb_temperature_empiric(t_estoc, u_estoc)
     h_refri = pce.humidity_ratio_from_temps(t_estoc, t_bu_refri)
     w_refri = pce.water_vapor_pressure(h_refri)
     hr = pce.enthalpy_moist_air(t_estoc, w_refri)
     pi = 1 / pce.specific_volume(tbs, w_externo)
     pr = 1 / pce.specific_volume(t_estoc, w_refri)
     Fm = (2 / (1 + (pr / pi)**(1 / 3)))**1.5
     Uest = 0.442 * Fm * ((pr - pi) * 9.81 * self.h_porta / pr)**0.5
     Qest = 0.5 * area_p * (hi - hr) * pr * Uest
     return Qest
Example #3
0
    def _make_chart_data(self,
                         styles: Union[dict, str]=None,
                         zones_file: Union[dict, str]=None) -> None:
        """Generate the data to plot the psychrometric chart."""
        # Get styling
        config = load_config(styles)
        self.d_config = config
        self.temp_step = config['limits']['step_temp']

        self.figure_params = config['figure']
        self.dbt_min, self.dbt_max = config['limits']['range_temp_c']
        self.w_min, self.w_max = config['limits']['range_humidity_g_kg']
        self.chart_params = config['chart_params']

        # Base pressure
        if config['limits'].get('pressure_kpa') is not None:
            self.p_atm_kpa = config['limits']['pressure_kpa']
        elif config['limits'].get('altitude_m') is not None:
            self.altitude_m = config['limits']['altitude_m']
            self.p_atm_kpa = pressure_by_altitude(self.altitude_m)

        # Dry bulb constant lines (vertical):
        if self.chart_params["with_constant_dry_temp"]:
            step = self.chart_params["constant_temp_step"]
            style = config['constant_dry_temp']
            temps_vl = f_range(self.dbt_min, self.dbt_max, step)
            heights = [1000 * humidity_ratio(
                saturation_pressure_water_vapor(t),
                p_atm_kpa=self.p_atm_kpa) for t in temps_vl]

            self.constant_dry_temp_data = PsychroCurves(
                [PsychroCurve([t, t], [self.w_min, h], style,
                              type_curve='constant_dry_temp_data',
                              label=None, logger=self._logger)
                 for t, h in zip(temps_vl, heights)],
                family_label=self.chart_params["constant_temp_label"])

        # Absolute humidity constant lines (horizontal):
        if self.chart_params["with_constant_humidity"]:
            step = self.chart_params["constant_humid_step"]
            style = config['constant_humidity']
            ws_hl = f_range(self.w_min + step, self.w_max + step / 10, step)
            dew_points = solve_curves_with_iteration(
                'DEW POINT', [x / 1000 for x in ws_hl],
                lambda x: dew_point_temperature(
                        water_vapor_pressure(
                            x, p_atm_kpa=self.p_atm_kpa)),
                lambda x: humidity_ratio(
                    saturation_pressure_water_vapor(x),
                    p_atm_kpa=self.p_atm_kpa))

            self.constant_humidity_data = PsychroCurves(
                [PsychroCurve([t_dp, self.dbt_max], [w, w], style,
                              type_curve='constant_humidity_data',
                              label=None, logger=self._logger)
                 for w, t_dp in zip(ws_hl, dew_points)],
                family_label=self.chart_params["constant_humid_label"])

        # Constant relative humidity curves:
        if self.chart_params["with_constant_rh"]:
            rh_perc_values = self.chart_params["constant_rh_curves"]
            rh_label_values = self.chart_params.get("constant_rh_labels", [])
            label_loc = self.chart_params.get("constant_rh_labels_loc", .85)
            style = config["constant_rh"]
            temps_ct_rh, curves_ct_rh = _gen_list_curves_range_temps(
                curve_constant_humidity_ratio,
                self.dbt_min, self.dbt_max, self.temp_step,
                rh_perc_values, p_atm_kpa=self.p_atm_kpa)

            self.constant_rh_data = PsychroCurves(
                [PsychroCurve(
                    temps_ct_rh, curve_ct_rh, style,
                    type_curve='constant_rh_data',
                    label_loc=label_loc, label='RH {:g} %'.format(rh)
                    if round(rh, 1) in rh_label_values else None,
                    logger=self._logger)
                    for rh, curve_ct_rh in zip(rh_perc_values, curves_ct_rh)],
                family_label=self.chart_params["constant_rh_label"])

        # Constant enthalpy lines:
        if self.chart_params["with_constant_h"]:
            step = self.chart_params["constant_h_step"]
            start, end = self.chart_params["range_h"]
            enthalpy_values = f_range(start, end, step)
            h_label_values = self.chart_params.get("constant_h_labels", [])
            label_loc = self.chart_params.get("constant_h_labels_loc", 1.)
            style = config["constant_h"]
            temps_max_constant_h = [
                dry_temperature_for_enthalpy_of_moist_air(
                    self.w_min / 1000, h)
                for h in enthalpy_values]

            sat_points = solve_curves_with_iteration(
                'ENTHALPHY', enthalpy_values,
                lambda x: dry_temperature_for_enthalpy_of_moist_air(
                    self.w_min / 1000 + 0.1, x),
                lambda x: enthalpy_moist_air(
                    x, saturation_pressure_water_vapor(x),
                    p_atm_kpa=self.p_atm_kpa))

            self.constant_h_data = PsychroCurves(
                [PsychroCurve(
                    [t_sat, t_max], [1000 * humidity_ratio(
                        saturation_pressure_water_vapor(t_sat),
                        self.p_atm_kpa), self.w_min], style,
                    type_curve='constant_h_data',
                    label_loc=label_loc, label='{:g} kJ/kg_da'.format(h)
                    if round(h, 3) in h_label_values else None,
                    logger=self._logger)
                    for t_sat, t_max, h in zip(
                    sat_points, temps_max_constant_h, enthalpy_values)],
                family_label=self.chart_params["constant_h_label"])

        # Constant specific volume lines:
        if self.chart_params["with_constant_v"]:
            step = self.chart_params["constant_v_step"]
            start, end = self.chart_params["range_vol_m3_kg"]
            vol_values = f_range(start, end, step)
            vol_label_values = self.chart_params.get("constant_v_labels", [])
            label_loc = self.chart_params.get("constant_v_labels_loc", 1.)
            style = config["constant_v"]
            temps_max_constant_v = [
                dry_temperature_for_specific_volume_of_moist_air(
                    0, specific_vol, p_atm_kpa=self.p_atm_kpa)
                for specific_vol in vol_values]
            sat_points = solve_curves_with_iteration(
                'CONSTANT VOLUME', vol_values,
                lambda x: dry_temperature_for_specific_volume_of_moist_air(
                    0, x, p_atm_kpa=self.p_atm_kpa),
                lambda x: specific_volume(
                    x, saturation_pressure_water_vapor(x),
                    p_atm_kpa=self.p_atm_kpa))

            self.constant_v_data = PsychroCurves(
                [PsychroCurve(
                    [t_sat, t_max], [1000 * humidity_ratio(
                        saturation_pressure_water_vapor(t_sat),
                        self.p_atm_kpa), 0],
                    style, type_curve='constant_v_data',
                    label_loc=label_loc, label='{:g} m3/kg_da'.format(vol)
                    if round(vol, 3) in vol_label_values else None,
                    logger=self._logger)
                    for t_sat, t_max, vol in zip(
                    sat_points, temps_max_constant_v, vol_values)],
                family_label=self.chart_params["constant_v_label"])

        # Constant wet bulb temperature lines:
        if self.chart_params["with_constant_wet_temp"]:
            step = self.chart_params["constant_wet_temp_step"]
            start, end = self.chart_params["range_wet_temp"]
            wbt_values = f_range(start, end, step)
            wbt_label_values = self.chart_params.get(
                "constant_wet_temp_labels", [])
            label_loc = self.chart_params.get(
                "constant_wet_temp_labels_loc", .05)
            style = config["constant_wet_temp"]
            w_max_constant_wbt = [humidity_ratio(
                saturation_pressure_water_vapor(wbt), self.p_atm_kpa)
                for wbt in wbt_values]

            self.constant_wbt_data = PsychroCurves(
                [PsychroCurve(
                    [wbt, self.dbt_max],
                    [1000 * w_max,
                     1000 * humidity_ratio(
                         saturation_pressure_water_vapor(self.dbt_max)
                         * relative_humidity_from_temps(
                             self.dbt_max, wbt, p_atm_kpa=self.p_atm_kpa),
                         p_atm_kpa=self.p_atm_kpa)], style,
                    type_curve='constant_wbt_data',
                    label_loc=label_loc, label='{:g} °C'.format(wbt)
                    if wbt in wbt_label_values else None, logger=self._logger)
                    for wbt, w_max in zip(wbt_values, w_max_constant_wbt)],
                family_label=self.chart_params["constant_wet_temp_label"])

        # Saturation line:
        if True:
            sat_style = config["saturation"]
            temps_sat_line, w_sat_line = _gen_list_curves_range_temps(
                curve_constant_humidity_ratio,
                self.dbt_min, self.dbt_max, self.temp_step, [100],
                p_atm_kpa=self.p_atm_kpa)

            self.saturation = PsychroCurves(
                [PsychroCurve(
                    temps_sat_line, w_sat_line[0], sat_style,
                    type_curve='saturation', logger=self._logger)])

        # Zones
        if self.chart_params["with_zones"] or zones_file is not None:
            self.append_zones(zones_file)
Example #4
0
import psychrochart.equations as psc_e

# Temperatura de bulbo seco; pressao vapor
# entalpia = psc_e.enthalpy_moist_air()
# print(help(psc_e.specific_volume))
# print(help(psc_e.water_vapor_pressure))
# print(help(psc_e.enthalpy_moist_air))
# psc_e.relative_humidity_from_temps()
# print(help(psc_e.wet_bulb_temperature_empiric))
# print(help(psc_e.humidity_ratio_from_temps))
# t_bu_externo = psc_e.wet_bulb_temperature_empiric(33, 0.75)
hratio_externo = psc_e.humidity_ratio_from_temps(34, 26)
t_bu_refrig = psc_e.wet_bulb_temperature_empiric(-20.5, 0.925)
hratio_refrig = psc_e.humidity_ratio_from_temps(-20.5, t_bu_refrig)
w_v_pexterno = psc_e.water_vapor_pressure(hratio_externo)
w_v_prefrig = psc_e.water_vapor_pressure(hratio_refrig)
entalpia_externa = psc_e.enthalpy_moist_air(34, w_v_pexterno)
entalpia_refrigeracao = psc_e.enthalpy_moist_air(-20.5, w_v_prefrig)
densidade_refri = psc_e.specific_volume(-20.5, w_v_prefrig)
densidade_externo = psc_e.specific_volume(34, w_v_pexterno)

print("""Relação de humidade: {} 
Pressão de vapor: {}
Entalpia do ar: {}
Volume específico: {}
Densidade: {}
""".format(hratio_externo, w_v_pexterno, entalpia_externa, densidade_externo,
           1 / densidade_externo))