Example #1
0
def gravitational_loss_in_circular_tube(temperature=293.15,  # Kelvin
                                        pressure=101.3,  # kPa
                                        particle_diameter=10,  # µm
                                        particle_density=1000,  # kg/m^3
                                        tube_diameter=0.01,  # m
                                        tube_length=0.1,  # m
                                        incline_angle=60,  # degrees from horizontal (0-90)
                                        flow_rate=3,  # cc/s
                                        mean_flow_velocity=False,  # 0.1061    # m/s)
                                        flow_type='auto',
                                        verbose=False):
    """
    Arguments
    ---------
    temperature         = 293.15,   # Kelvin
    pressure            = 101.3,    # kPa
    particle_diameter   = 10,       # µm
    particle_density    = 1000,     # kg/m^3
    tube_diameter       = 0.01,     # m
    tube_length         = 0.1,      # m
    incline_angle       = 60,       # degrees from horizontal (0-90)
    flow_rate           = 3,        # cc/s
    mean_flow_velocity  = False     #0.1061    # m/s)"""

    if not mean_flow_velocity:
        mean_flow_velocity = _tools_sampling_efficiency.flow_rate2flow_velocity(flow_rate, tube_diameter, verbose=verbose)

    if flow_type == 'auto':
        flow_type = _tools_sampling_efficiency.test_flow_type_in_tube(tube_diameter, mean_flow_velocity, temperature, pressure, verbose=verbose)

    if flow_type == 'laminar':
        sv = _tools_sampling_efficiency.settling_velocity(temperature, particle_density, particle_diameter, pressure, verbose=verbose)
        k770 = np.cos(np.pi * incline_angle / 180) * 3 * sv * tube_length / (4 * tube_diameter * mean_flow_velocity)
        if np.any((k770 ** (2. / 3)) > 1):
            fract = 0
        else:

            if np.any(k770 ** (2 / 3.) > 1):
                k771 = 0
            else:
                k771 = np.arcsin(k770 ** (1 / 3.))  # done

            fract = (1 - (2 / np.pi) * (
            2 * k770 * np.sqrt(1 - k770 ** (2 / 3)) + k771 - (k770 ** (1 / 3) * np.sqrt(1 - k770 ** (2 / 3)))))  # done
            if np.any(fract < 0):
                fract = 0
    elif flow_type == 'turbulent':
        raise ValueError('Sorry this loss mechanism has not been implemented for turbulent flow')
    else:
        raise ValueError('Unknown flow type: %s' % flow_type)
    if verbose:
        print('k770: %s' % k770)
        print('k771: %s' % k771)
        print('fraction penetrating: %s' % fract)
    return fract
Example #2
0
def loss_in_a_bent_section_of_circular_tubing(
        temperature=293.15,  # Kelvin
        pressure=101.3,  # kPa
        particle_diameter=3.5,  # µm
        particle_density=1000,  # kg/m^3
        tube_air_flow_rate=3,  # cc/s
        tube_air_velocity=False,  # m/s
        tube_diameter=0.0025,  # m
        angle_of_bend=90,  # degrees
        flow_type='auto',
        verbose=False):
    """ (B&W 8-66 to 8-68; W&B 6-52, 6-53)
        Temperature	293.15	 Kelvin
        Pressure	101.3	 kPa
        Particle Diameter	3.5	 µm
        Particle Density	1000	 kg/m^3
        Tube air velocity	6.25	 m/s
        Tube diameter	0.0025	 m
        Angle of bend	90	 degrees"""

    if not tube_air_velocity:
        tube_air_velocity = _tools_sampling_efficiency.flow_rate2flow_velocity(
            tube_air_flow_rate, tube_diameter, verbose=verbose)

    if flow_type == 'auto':
        flow_type = _tools_sampling_efficiency.test_flow_type_in_tube(
            tube_diameter,
            tube_air_velocity,
            temperature,
            pressure,
            verbose=verbose)

    velocity_ratio = 1
    stnum = _tools_sampling_efficiency.stokes_number(particle_density,
                                                     particle_diameter,
                                                     pressure,
                                                     temperature,
                                                     tube_air_velocity,
                                                     velocity_ratio,
                                                     tube_diameter,
                                                     verbose=verbose)

    if flow_type == 'laminar':

        fract = 1 - stnum * angle_of_bend * np.pi / 180.

    elif flow_type == 'turbulent':
        fract = np.exp(-2.823 * stnum * angle_of_bend * np.pi / 180)

    else:
        raise ValueError('Unknown flow type: %s' % flow_type)

    return fract
Example #3
0
def loss_at_an_abrupt_contraction_in_circular_tubing(
    temperature=293.15,  # Kelvin
    pressure=101.3,  # kPa
    particle_diameter=1,  # µm
    particle_density=1000,  # kg/m^3
    tube_air_velocity=False,  # m/s
    flow_rate_in_inlet=3,  # cc/s
    tube_diameter=0.0025,  # m
    contraction_diameter=0.00125,  # m
    contraction_angle=90,  # degrees
    verbose=False,
):
    """
    (B&W 8-69 to 8-71; W&B 6-54, 17-25)
    Temperature	293.15	 Kelvin
    Pressure	101.3	 kPa
    Particle diameter	1	 µm
    Particle density	1000	 kg/m^3
    Tube air velocity	10	 m/s
    Tube diameter	0.0025	 m
    Contraction diameter	0.00125	 m
    Contraction angle	90	 degrees
    """

    if not tube_air_velocity:
        tube_air_velocity = _tools_sampling_efficiency.flow_rate2flow_velocity(
            flow_rate_in_inlet, tube_diameter, verbose=verbose)

    st_num = _tools_sampling_efficiency.stokes_number(particle_density,
                                                      particle_diameter,
                                                      pressure,
                                                      temperature,
                                                      tube_air_velocity,
                                                      1,
                                                      contraction_diameter,
                                                      verbose=verbose)

    # st_num = (particle_density * particle_diameter * particle_diameter * 0.000000000001 * slip_correction_factor * B906 / (18*B912*B908))

    frac = 1 - (1 / (1 +
                     ((2 * st_num *
                       (1 - (contraction_diameter / tube_diameter)**2)) /
                      (3.14 * np.exp(-0.0185 * contraction_angle)))**-1.24))
    return frac
Example #4
0
def loss_in_a_bent_section_of_circular_tubing(temperature=293.15,  # Kelvin
                                              pressure=101.3,  # kPa
                                              particle_diameter=3.5,  # µm
                                              particle_density=1000,  # kg/m^3
                                              tube_air_flow_rate=3,  # cc/s
                                              tube_air_velocity=False,  # m/s
                                              tube_diameter=0.0025,  # m
                                              angle_of_bend=90,  # degrees
                                              flow_type='auto',
                                              verbose=False
                                              ):
    """ (B&W 8-66 to 8-68; W&B 6-52, 6-53)
        Temperature	293.15	 Kelvin
        Pressure	101.3	 kPa
        Particle Diameter	3.5	 µm
        Particle Density	1000	 kg/m^3
        Tube air velocity	6.25	 m/s
        Tube diameter	0.0025	 m
        Angle of bend	90	 degrees"""

    if not tube_air_velocity:
        tube_air_velocity = _tools_sampling_efficiency.flow_rate2flow_velocity(tube_air_flow_rate, tube_diameter, verbose=verbose)

    if flow_type == 'auto':
        flow_type = _tools_sampling_efficiency.test_flow_type_in_tube(tube_diameter, tube_air_velocity, temperature, pressure, verbose=verbose)

    velocity_ratio = 1
    stnum = _tools_sampling_efficiency.stokes_number(particle_density, particle_diameter, pressure, temperature, tube_air_velocity,
                                                     velocity_ratio, tube_diameter, verbose=verbose)

    if flow_type == 'laminar':

        fract = 1 - stnum * angle_of_bend * np.pi / 180.

    elif flow_type == 'turbulent':
        fract = np.exp(-2.823 * stnum * angle_of_bend * np.pi / 180)

    else:
        raise ValueError('Unknown flow type: %s' % flow_type)

    return fract
Example #5
0
def loss_at_an_abrupt_contraction_in_circular_tubing(temperature=293.15,  # Kelvin
                                                     pressure=101.3,  # kPa
                                                     particle_diameter=1,  # µm
                                                     particle_density=1000,  # kg/m^3
                                                     tube_air_velocity=False,  # m/s
                                                     flow_rate_in_inlet=3,  # cc/s
                                                     tube_diameter=0.0025,  # m
                                                     contraction_diameter=0.00125,  # m
                                                     contraction_angle=90,  # degrees
                                                     verbose=False,
                                                     ):
    """
    (B&W 8-69 to 8-71; W&B 6-54, 17-25)
    Temperature	293.15	 Kelvin
    Pressure	101.3	 kPa
    Particle diameter	1	 µm
    Particle density	1000	 kg/m^3
    Tube air velocity	10	 m/s
    Tube diameter	0.0025	 m
    Contraction diameter	0.00125	 m
    Contraction angle	90	 degrees
    """

    if not tube_air_velocity:
        tube_air_velocity = _tools_sampling_efficiency.flow_rate2flow_velocity(flow_rate_in_inlet, tube_diameter, verbose=verbose)

    st_num = _tools_sampling_efficiency.stokes_number(particle_density, particle_diameter, pressure, temperature, tube_air_velocity, 1,
                                                      contraction_diameter, verbose=verbose)


    # st_num = (particle_density * particle_diameter * particle_diameter * 0.000000000001 * slip_correction_factor * B906 / (18*B912*B908))


    frac = 1 - (1 / (1 + ((2 * st_num * (1 - (contraction_diameter / tube_diameter) ** 2)) / (
    3.14 * np.exp(-0.0185 * contraction_angle))) ** -1.24))
    return frac
Example #6
0
def inlet_efficiency_isoaxial_horizontal_sharp_edged(
        temperature=293.15,  # Kelvin
        pressure=101.3,  # kPa
        particle_diameter=15,  # µm
        particle_density=1000,  # kg/m^3
        inlet_diameter=0.0127,  # m
        inlet_length=0.1,  # m
        sampling_flow_rate=3,  # cc/s
        air_velocity_inlet=False,  # m/s
        ambient_air_speed=25.5,  # m/s
        velocity_ratio=False,  # R is 1 for isokinetic, > 1 for subisokinetic
        verbose=False):
    """
    Inlet efficiency for an isoaxial horizontal sharp-edged inlet: aspiration + transmission (B&W 8-8, 8-14, 8-16, 8-18; W&B 6-8, 6-14, 6-16, 6-18, Hinds 10-7)
    Temperature	293.15	 Kelvin
    Pressure	101.3	 kPa
    Particle diameter	15	 µm
    Particle density	1000	 kg/m^3
    Inlet diameter	0.0127	 m
    Inlet length	0.1	 m
    Air velocity in inlet (Vi)	0.05	 m/s
    Velocity ratio (Vw/Vi)	15

    Parameters
    ----------
    temperature
    pressure
    particle_diameter
    particle_density
    inlet_diameter
    inlet_length
    air_velocity_inlet
    velocity_ratio
    verbose

    Returns
    -------

    """
    if not air_velocity_inlet:
        air_velocity_inlet = _tools_sampling_efficiency.flow_rate2flow_velocity(
            sampling_flow_rate, inlet_diameter, verbose=verbose)

    if not velocity_ratio:
        velocity_ratio = ambient_air_speed / air_velocity_inlet

    st_no = _tools_sampling_efficiency.stokes_number(particle_density,
                                                     particle_diameter,
                                                     pressure,
                                                     temperature,
                                                     air_velocity_inlet,
                                                     velocity_ratio,
                                                     inlet_diameter,
                                                     verbose=verbose)
    asp_eff = 1 + (velocity_ratio -
                   1) * (1 - (1 / (1 + (2 +
                                        (0.617 / velocity_ratio)) * st_no)))

    set_vel = _tools_sampling_efficiency.settling_velocity(temperature,
                                                           particle_density,
                                                           particle_diameter,
                                                           pressure,
                                                           verbose=verbose)

    grav_param = (inlet_length / air_velocity_inlet) / (inlet_diameter /
                                                        set_vel)
    flow_reyno = _tools_sampling_efficiency.flow_reynolds_number(
        inlet_diameter,
        air_velocity_inlet,
        temperature,
        pressure,
        verbose=verbose)
    grav_eff = np.exp(
        -4.7 * (np.sqrt(grav_param * st_no / np.sqrt(flow_reyno)))**0.75)

    if velocity_ratio > 1:
        init_trans_eff = (1 + (velocity_ratio - 1) /
                          (1 + 2.66 / st_no**
                           (2 / 3))) / (1 + (velocity_ratio - 1) /
                                        (1 + 0.418 / st_no))
    else:
        init_trans_eff = 1

    def vena_contracta_efficiency():
        if velocity_ratio < 1:
            eff = np.exp(
                -75 *
                (0.09 *
                 (st_no *
                  (air_velocity_inlet - air_velocity_inlet * velocity_ratio) /
                  (air_velocity_inlet * velocity_ratio))**0.3)**2)
        else:
            eff = 1
        return eff

    vena_cont_eff = vena_contracta_efficiency()
    efficiency = asp_eff * grav_eff * init_trans_eff * vena_cont_eff
    return efficiency
Example #7
0
def gravitational_loss_in_circular_tube(
        temperature=293.15,  # Kelvin
        pressure=101.3,  # kPa
        particle_diameter=10,  # µm
        particle_density=1000,  # kg/m^3
        tube_diameter=0.01,  # m
        tube_length=0.1,  # m
        incline_angle=60,  # degrees from horizontal (0-90)
        flow_rate=3,  # cc/s
        mean_flow_velocity=False,  # 0.1061    # m/s)
        flow_type='auto',
        verbose=False):
    """
    Arguments
    ---------
    temperature         = 293.15,   # Kelvin
    pressure            = 101.3,    # kPa
    particle_diameter   = 10,       # µm
    particle_density    = 1000,     # kg/m^3
    tube_diameter       = 0.01,     # m
    tube_length         = 0.1,      # m
    incline_angle       = 60,       # degrees from horizontal (0-90)
    flow_rate           = 3,        # cc/s
    mean_flow_velocity  = False     #0.1061    # m/s)"""

    if not mean_flow_velocity:
        mean_flow_velocity = _tools_sampling_efficiency.flow_rate2flow_velocity(
            flow_rate, tube_diameter, verbose=verbose)

    if flow_type == 'auto':
        flow_type = _tools_sampling_efficiency.test_flow_type_in_tube(
            tube_diameter,
            mean_flow_velocity,
            temperature,
            pressure,
            verbose=verbose)

    if flow_type == 'laminar':
        sv = _tools_sampling_efficiency.settling_velocity(temperature,
                                                          particle_density,
                                                          particle_diameter,
                                                          pressure,
                                                          verbose=verbose)
        k770 = np.cos(np.pi * incline_angle / 180) * 3 * sv * tube_length / (
            4 * tube_diameter * mean_flow_velocity)
        if np.any((k770**(2. / 3)) > 1):
            fract = 0
        else:

            if np.any(k770**(2 / 3.) > 1):
                k771 = 0
            else:
                k771 = np.arcsin(k770**(1 / 3.))  # done

            fract = (1 - (2 / np.pi) *
                     (2 * k770 * np.sqrt(1 - k770**(2 / 3)) + k771 -
                      (k770**(1 / 3) * np.sqrt(1 - k770**(2 / 3)))))  # done
            if np.any(fract < 0):
                fract = 0
    elif flow_type == 'turbulent':
        raise ValueError(
            'Sorry this loss mechanism has not been implemented for turbulent flow'
        )
    else:
        raise ValueError('Unknown flow type: %s' % flow_type)
    if verbose:
        print('k770: %s' % k770)
        print('k771: %s' % k771)
        print('fraction penetrating: %s' % fract)
    return fract
Example #8
0
def inlet_efficiency_isoaxial_horizontal_sharp_edged(temperature = 293.15,      # Kelvin
                                                     pressure = 101.3,          # kPa
                                                     particle_diameter = 15,    # µm
                                                     particle_density = 1000,   # kg/m^3
                                                     inlet_diameter = 0.0127,   # m
                                                     inlet_length = 0.1,        # m
                                                     sampling_flow_rate = 3,    # cc/s
                                                     air_velocity_inlet = False,# m/s
                                                     ambient_air_speed =  25.5, # m/s
                                                     velocity_ratio = False,       # R is 1 for isokinetic, > 1 for subisokinetic
                                                     verbose = False
                                                     ):
    """
    Inlet efficiency for an isoaxial horizontal sharp-edged inlet: aspiration + transmission (B&W 8-8, 8-14, 8-16, 8-18; W&B 6-8, 6-14, 6-16, 6-18, Hinds 10-7)
    Temperature	293.15	 Kelvin
    Pressure	101.3	 kPa
    Particle diameter	15	 µm
    Particle density	1000	 kg/m^3
    Inlet diameter	0.0127	 m
    Inlet length	0.1	 m
    Air velocity in inlet (Vi)	0.05	 m/s
    Velocity ratio (Vw/Vi)	15

    Parameters
    ----------
    temperature
    pressure
    particle_diameter
    particle_density
    inlet_diameter
    inlet_length
    air_velocity_inlet
    velocity_ratio
    verbose

    Returns
    -------

    """
    if not air_velocity_inlet:
        air_velocity_inlet = _tools_sampling_efficiency.flow_rate2flow_velocity(sampling_flow_rate, inlet_diameter, verbose=verbose)

    if not velocity_ratio:
        velocity_ratio = ambient_air_speed/air_velocity_inlet

    st_no = _tools_sampling_efficiency.stokes_number(particle_density, particle_diameter, pressure, temperature, air_velocity_inlet, velocity_ratio, inlet_diameter, verbose=verbose)
    asp_eff = 1 + (velocity_ratio - 1) * (1 - (1 / (1 + (2 + (0.617 / velocity_ratio)) * st_no)))

    set_vel = _tools_sampling_efficiency.settling_velocity(temperature, particle_density, particle_diameter, pressure, verbose=verbose)

    grav_param =(inlet_length / air_velocity_inlet) / (inlet_diameter / set_vel)
    flow_reyno = _tools_sampling_efficiency.flow_reynolds_number(inlet_diameter, air_velocity_inlet, temperature, pressure, verbose=verbose)
    grav_eff = np.exp(-4.7 * (np.sqrt(grav_param * st_no / np.sqrt(flow_reyno)))**0.75)

    if velocity_ratio > 1:
        init_trans_eff = (1 + (velocity_ratio - 1) / (1 + 2.66 / st_no**(2/3))) / (1 + (velocity_ratio - 1) / (1 + 0.418 / st_no))
    else:
        init_trans_eff = 1

    def vena_contracta_efficiency():
        if velocity_ratio < 1:
            eff = np.exp(-75 * (0.09 * (st_no * (air_velocity_inlet - air_velocity_inlet * velocity_ratio) / (air_velocity_inlet * velocity_ratio))**0.3)**2)
        else:
            eff = 1
        return eff

    vena_cont_eff =  vena_contracta_efficiency()
    efficiency = asp_eff * grav_eff * init_trans_eff * vena_cont_eff
    return efficiency