Skip to content
This documentation describes version 4.0.0, which is not released yet. The current version on PyPI is 3.3.0 and does not carry everything described here.

noise_control.valves

Control valve aerodynamic noise (IEC 60534-8-3:2010).

A control valve throttles a compressible fluid by turning pressure into velocity and then throwing that velocity away in a free jet inside the pipe. A small, well-characterised fraction of the jet’s stream power comes back as sound, most of it radiated not by the valve but by the pipe wall downstream, which is why the method ends in a transmission loss and not in a sound power level.

The standard is a chain with a branch in the middle. The branch is the regime: how far the throttling has gone, from subsonic flow in the vena contracta (regime I) through the onset of choking to the fully developed shock cells of regime V. Five printed pressure ratios, Equations (3) to (7), cut the differential pressure ratio into those five intervals, and Table 3 gives each one its own Mach number, its own acoustical efficiency and its own peak frequency. Everything before the branch (the pressure ratios, the jet diameter) and everything after it (the internal level at the pipe wall, the pipe transmission loss, the level outside) is common to all five.

What is new in the 2010 edition, and what this module therefore does. The 1997 method produced one number. This one produces a third-octave spectrum: Equation (19) spreads the internal level around the peak frequency, Equation (20a) gives the pipe a transmission loss that changes with frequency through the ring and coincidence frequencies of Equations (21) to (23), and only Equation (25) collapses the result back to a single A-weighted level at 1 m. The band set is the 33 one-third-octave bands from 12,5 Hz to 20 kHz, printed as Table 5.

Three things in Annex A do not reproduce themselves, and all three are recorded in docs/ERRATA.md:

  • The piping geometry factor is printed as , but every one of the six printed vena contracta pressures needs to come out. The five examples that print a value of all give , which is to six digits and not .
  • The equivalent orifice diameter is printed as m in all six columns, where Equation (8c) with the annex’s own and m² gives m. The valve style modifier printed on the next row, , is the ratio of the printed m to m, so the annex computed with the larger value and printed the smaller one.
  • Two frequency factors of Table A.2 are printed one power of ten low, and , in a column Table 6 makes proportional to and which therefore has to rise. The transmission losses printed two rows below them are what the corrected factors give.

This module implements Clause 5, the standard trim case, with the noise-reducing trims of Clause 6 and the expander of Clause 7 alongside it. The hydrodynamic case of IEC 60534-8-4, where the fluid is a liquid, is phonometry.noise_control.valves_hydrodynamic.

Auto-generated from the source docstrings by scripts/generate_api_docs.py (make api-docs). Do not edit by hand.

Constant (tuple).

AERODYNAMIC_A_WEIGHTING_DB = (-63.4, -56.7, -50.5, -44.7, -39.4, -34.6, -30.2, -26.2, -22.5, -19.1, -16.1, -13.4, -10.9, -8.6, -6.6, -4.8, -3.2, -1.9, -0.8, 0.0, 0.6, 1.0, 1.2, 1.3, 1.2, 1.0, 0.5, -0.1, -1.1, -2.5, -4.3, -6.6, -9.3)
AerodynamicValveNoise(
regime: int,
boundaries: RegimeBoundaries,
pressure_ratio: float,
vena_contracta_pressure_pa: float,
jet_diameter_m: float,
mach: float,
acoustical_efficiency: float,
stream_power: float,
sound_power: float,
sound_power_level: float,
peak_frequency: float,
outlet_mach: float,
pipe_mach: float,
velocity_correction: float,
internal_level: float,
frequencies: NDArray[np.float64],
band_internal_level: NDArray[np.float64],
band_transmission_loss: NDArray[np.float64],
band_external_level: NDArray[np.float64],
external_level: float,
pipe_frequencies: PipeFrequencies,
expander: ExpanderNoise | None,
)

What IEC 60534-8-3 Clause 5 says about one operating point.

Attributes

NameDescription
regimeWhich of the five regimes of Clause 5.2 the valve is in.
boundariesThe four pressure ratios that placed it there.
pressure_ratio of Equation (1).
vena_contracta_pressure_pa of Equation (2), in Pa. It goes negative past the choking point, where the equation is being read outside the range it means anything in.
jet_diameter_m of Equation (9), in m.
machThe Mach number Table 3 uses in this regime.
acoustical_efficiency, the fraction of the stream power that leaves as sound.
stream_power, in W.
sound_power of Equation (11), in W.
sound_power_level of Equation (12), in dB.
peak_frequency from Table 3, in Hz.
outlet_mach of Equation (15), which Clause 5 is only valid below 0,3.
pipe_mach of Equation (17), before the 0,3 limit.
velocity_correction of Equation (16), in dB.
internal_level of Equation (18), in dB.
frequenciesThe 33 one-third-octave band centres of Table 5, in Hz.
band_internal_level of Equation (19), in dB.
band_transmission_loss of Equation (20a), in dB.
band_external_level of Equation (24), in dB.
external_level of Equation (25), in dB.
pipe_frequenciesThe ring and coincidence frequencies the transmission loss is shaped by.
expanderWhat Clause 7 says the flow leaving the valve outlet makes, or None when no expander was given. When it is present its spectrum is already in band_internal_level, and so in band_external_level and external_level, combined with the trim by Equation (43); this field carries the outlet flow on its own, which is the only place it can be read apart.

Constant (float).

AIR_SOUND_SPEED_M_S = 343.0
coincidence_frequencies(
internal_diameter_m: float,
wall_thickness: float,
downstream_sound_speed: float,
*,
pipe_sound_speed: float = 5000.0,
air_sound_speed: float = 343.0,
) -> PipeFrequencies

Equations (21), (22) and (23).

Parameters

NameDescription
internal_diameter_m of the downstream pipe, in m.
wall_thickness of the pipe wall, in m.
downstream_sound_speed in the fluid downstream of the valve, in m/s.
pipe_sound_speed, 5 000 m/s for steel by NOTE 4.
air_sound_speed, 343 m/s by NOTE 3.

Returns: The three frequencies, in Hz.

Raises

ExceptionWhen
ValueErrorIf any argument is not positive and finite.
combine_internal_levels(*levels: NDArray[np.float64]) -> NDArray[np.float64]

Equation (43): two internal spectra at the same pipe wall, added.

The valve trim and the expander are two sources inside one pipe, so they add in energy and not in level, and the sum is what Equation (24) then takes through the wall.

Parameters

NameDescription
levelsTwo or more band level arrays of the same shape, in dB.

Returns: Their energy sum, in dB.

Raises

ExceptionWhen
ValueErrorIf fewer than two are given, or they disagree in shape.

Constant (phonometry.noise_control.valves.Expander).

DownstreamPipe(
internal_diameter_m: float,
wall_thickness: float,
density: float,
*,
speed_of_sound: float = 5000.0,
air_sound_speed: float = 343.0,
atmospheric_pressure_pa: float = 101325.0,
standard_pressure_pa: float = 101325.0,
)

The pipe the noise actually comes out of, and what surrounds it.

The last four fields are the values the standard prints for a steel pipe in air at atmospheric pressure, and they are defaults for that reason, not settings anyone is expected to change.

Attributes

NameDescription
internal_diameter_m, in m.
wall_thickness, in m.
density of the pipe material, in kg/m³.
speed_of_sound in the pipe wall, in m/s.
air_sound_speed outside the pipe, in m/s.
atmospheric_pressure_pa, in Pa.
standard_pressure_pa, in Pa.
Expander(
contraction: float = 0.93,
efficiency_correction: float = -3.0,
strouhal_number: float = 0.2,
)

The transition piece downstream of the valve (Clause 7).

A valve whose outlet is narrower than the pipe it discharges into makes a second jet, at the step. Clause 7 is the method for it, and 7.1 limits the method to a transition of 30 degrees total included angle: a steeper cone makes the flow unstable in ways the standard does not model.

Attributes

NameDescription
contraction of Equation (35). NOTE 1 puts it at 0,93 for straight pattern globe valves and as low as 0,7 for some rotary ones, and says there are no data for the rest.
efficiency_correction for the expander, which is its own row of Table 4 and not the valve’s: the table prints -3,0.
strouhal_number for the expander, 0,2 in Table 4.
expander_noise(
frequencies: NDArray[np.float64],
*,
mass_flow: float,
downstream_density: float,
downstream_sound_speed: float,
internal_diameter_m: float,
throat_diameter_m: float,
velocity_correction: float,
expander: Expander = ...,
) -> ExpanderNoise

Clause 7: the noise the flow makes leaving the valve outlet.

The two caps are the clause’s: is limited to Mach 0,8 and to the sonic velocity, so a step that would otherwise be computed as supersonic is computed at Mach one instead.

Parameters

NameDescription
frequenciesThe band centre frequencies, in Hz.
mass_flow, in kg/s.
downstream_density, in kg/m³.
downstream_sound_speed, in m/s.
internal_diameter_m of the downstream pipe, in m.
throat_diameter_m, the smaller of the valve outlet and the expander inlet, in m.
velocity_correction of Equation (16), in dB, which Equation (41) adds exactly as Equation (18) does.
expanderThe transition piece.

Returns: An ExpanderNoise.

Raises

ExceptionWhen
ValueErrorIf a physical quantity is not positive and finite, if the two signed dB corrections are not finite, or if the throat is wider than the pipe. The efficiency correction of Table 4 and the velocity correction of Equation (16) are both signed, and the expander’s own row prints .

Constant (float).

EXPANDER_PIPE_MACH_LIMIT = 0.8
ExpanderNoise(
pipe_velocity: float,
inlet_velocity: float,
mach: float,
stream_power: float,
acoustical_efficiency: float,
sound_power: float,
peak_frequency: float,
internal_level: float,
band_internal_level: NDArray[np.float64],
)

What Clause 7 says the flow leaving the valve outlet makes.

Attributes

NameDescription
pipe_velocity of Equation (34), in m/s, after the Mach 0,8 cap.
inlet_velocity of Equation (35), in m/s, after the sonic cap.
mach of Equation (39).
stream_power of Equation (36), in W.
acoustical_efficiency of Equation (38).
sound_power of Equation (40), in W.
peak_frequency of Equation (37), in Hz.
internal_level of Equation (41), in dB.
band_internal_level of Equation (42), in dB.

Constant (mapping).

FLOW_COEFFICIENT_CONSTANTS = {'Cv': 0.0046, 'Kv': 0.0049}
flow_regime(pressure_ratio: float, boundaries: RegimeBoundaries) -> int

Which of the five regimes of Clause 5.2 a pressure ratio falls in.

The clause prints the five intervals half open, each one closed at the top: , then , then , then , and finally .

Table 3 prints the last one as , which would put the single point in two regimes at once. Clause 5.2 is the normative text and its list is consistent, so this follows the clause; docs/ERRATA.md records the disagreement.

Parameters

NameDescription
pressure_ratio of Equation (1).
boundariesThe output of pressure_ratio_boundaries.

Returns: The regime number, 1 to 5.

Raises

ExceptionWhen
ValueErrorIf the pressure ratio is not a finite number in (0, 1).
GasStream(
mass_flow: float,
inlet_pressure_pa: float,
outlet_pressure_pa: float,
inlet_density: float,
inlet_temperature_k: float,
specific_heat_ratio: float,
molecular_mass: float,
)

The gas and the operating point, which Clause 5.1 reads first.

Attributes

NameDescription
mass_flow, in kg/s.
inlet_pressure_pa, absolute, in Pa.
outlet_pressure_pa, absolute, in Pa.
inlet_density, in kg/m³.
inlet_temperature_k, absolute, in K.
specific_heat_ratio.
molecular_mass, in kg/kmol.

Constant (float).

GLOBE_CONTRACTION_COEFFICIENT = 0.93
internal_spectrum(
internal_level: float,
peak_frequency: float,
frequencies: NDArray[np.float64],
) -> NDArray[np.float64]

Equation (19): the internal level spread over the third-octave bands.

The two brackets are not symmetric: the spectrum falls as above the peak and as below it, so a valve is heard further above its peak than below it. The 8 dB is what turns an overall level into a one-third-octave one; the NOTE to Table 7 puts 3 dB there for octave bands instead.

Parameters

NameDescription
internal_level of Equation (18), in dB.
peak_frequency from Table 3, in Hz.
frequenciesThe band centre frequencies, in Hz.

Returns: The internal level in each band, in dB.

Raises

ExceptionWhen
ValueErrorIf the peak frequency is not positive and finite, or a band centre is not.
jet_diameter_m(
flow_coefficient: float,
style_modifier: float,
pressure_recovery: float,
*,
coefficient: str = 'Cv',
) -> float

The jet diameter of Equation (9).

Parameters

NameDescription
flow_coefficient, the required flow coefficient of the valve at the travel being examined.
style_modifier, from valve_style_modifier.
pressure_recovery, or for a valve with no attached fittings.
coefficientWhich flow coefficient flow_coefficient is, "Cv" or "Kv", which selects from Table 1.

Returns: , in m.

Raises

ExceptionWhen
ValueErrorIf a value is not positive and finite, or the coefficient is not one Table 1 prints a constant for.

Constant (mapping).

LAST_STAGE_AREA_CONSTANTS = {'Cv': 48900.0, 'Kv': 42300.0}
last_stage_flow_coefficient(
total_area: float,
*,
coefficient: str = 'Cv',
) -> float

Equation (27): the flow coefficient of the last stage, from its area.

6.3 asks for in place of everywhere in Clause 5, and says to use this only when the manufacturer does not state one.

Parameters

NameDescription
total_area, the total flow area of the last stage, in m².
coefficientWhich flow coefficient to return, "Cv" or "Kv", which selects from Table 1.

Returns: .

Raises

ExceptionWhen
ValueErrorIf the area is not positive and finite, or the coefficient is not one Table 1 prints a constant for.

Constant (float).

MACH_LIMIT_STANDARD_TRIM = 0.3

Constant (float).

MAXIMUM_PASSAGE_ASPECT = 4.0
multiple_passage_jet_diameter(
flow_coefficient: float,
style_modifier: float,
passage_length: float,
passage_diameter_m: float,
*,
coefficient: str = 'Cv',
) -> float

Equation (26): the jet diameter of a single-stage, many-passage trim.

6.2 replaces the pressure recovery factor of Equation (9) with that bracket, which is what a drilled cage does instead: a long hole recovers less than a short one, and NOTE 1 caps the ratio at 4 because the bracket would otherwise reach zero at 15.

NOTE 2 adds two conditions on the geometry rather than on the arithmetic, and neither is checked here: above a pressure ratio of 4 the valve style modifier only holds when the wall between passages is thicker than , and it fails altogether once the outlet Mach number passes 0,2.

Parameters

NameDescription
flow_coefficient of the valve.
style_modifier, from valve_style_modifier.
passage_length of one flow passage, in m.
passage_diameter_m of one flow passage, in m; the hydraulic diameter for a passage that is not round.
coefficient"Cv" or "Kv", selecting .

Returns: , in m.

Raises

ExceptionWhen
ValueErrorIf a value is not positive and finite, or the coefficient is not one Table 1 prints a constant for.
multistage_trim_conditions(
*,
inlet_pressure_pa: float,
outlet_pressure_pa: float,
inlet_density: float,
flow_coefficient: float,
last_stage_coefficient: float,
) -> MultistageConditions

Equations (27) to (29): the last stage seen as a valve of its own.

A multistage trim drops most of the pressure before the stage that makes the noise, so Clause 5 is run on that stage: 6.3 substitutes the stagnation pressure at its inlet for , the density there for , and for .

Which equation gives is NOTE 3’s, and it is a two-step reading rather than a formula:

With the note says to assume , take (28a), and fall through to (28b) if the answer it gives turns out to be or more. Below a valve ratio of two, (28c) applies directly.

Parameters

NameDescription
inlet_pressure_pa at the valve inlet, absolute, in Pa.
outlet_pressure_pa at the valve outlet, in Pa.
inlet_density at the valve inlet, in kg/m³.
flow_coefficient of the whole valve.
last_stage_coefficient of the last stage, from last_stage_flow_coefficient or from the manufacturer.

Returns: A MultistageConditions, whose three fields stand in for the valve’s own inlet when the chain is run: the stagnation pressure and density go into the GasStream in place of and , and the flow coefficient into the ValveTrim in place of .

Raises

ExceptionWhen
ValueErrorIf a value is not positive and finite, or the outlet pressure is not below the inlet.
MultistageConditions(
flow_coefficient: float,
stagnation_pressure_pa: float,
stagnation_density: float,
equation: str,
)

What a multistage trim hands Clause 5 in place of the valve inlet.

Attributes

NameDescription
flow_coefficient of the last stage, Equation (27).
stagnation_pressure_pa at the inlet of the last stage, in Pa, from whichever of Equations (28a) to (28c) NOTE 3 selects.
stagnation_density there, in kg/m³, Equation (29).
equationWhich of "28a", "28b" and "28c" was used, because the branch is a reading of NOTE 3 rather than an arithmetic fact and a report should say which one it took.

Constant (float).

PIPE_SOUND_SPEED_M_S = 5000.0
pipe_transmission_loss(
frequencies: NDArray[np.float64],
*,
internal_diameter_m: float,
wall_thickness: float,
valve_outlet_diameter_m: float,
downstream_density: float,
downstream_sound_speed: float,
pipe_density: float,
pipe_sound_speed: float = 5000.0,
air_sound_speed: float = 343.0,
atmospheric_pressure_pa: float = 101325.0,
standard_pressure_pa: float = 101325.0,
) -> NDArray[np.float64]

Equation (20a): what the pipe wall keeps in, band by band.

The result is a large negative number, and Equation (24) adds it to the internal level, so the sign is not a convention this module chose.

Parameters

NameDescription
frequenciesThe band centre frequencies, in Hz.
internal_diameter_m, in m.
wall_thickness, in m.
valve_outlet_diameter_m, in m, which selects the damping factor of Equation (20b) and is the valve outlet and not the pipe.
downstream_density, in kg/m³.
downstream_sound_speed, in m/s.
pipe_density of the pipe material, in kg/m³.
pipe_sound_speed, in m/s.
air_sound_speed, in m/s.
atmospheric_pressure_pa, in Pa.
standard_pressure_pa, in Pa.

Returns: The transmission loss in each band, in dB, negative.

Raises

ExceptionWhen
ValueErrorIf an argument is not positive and finite.

Constant (float).

PIPE_WALL_MACH_LIMIT = 0.3
PipeFrequencies(
ring: float,
internal_coincidence: float,
external_coincidence: float,
)

The three frequencies Clause 5.5 shapes the transmission loss with.

Attributes

NameDescription
ring of Equation (21), where the pipe rings as a circumference of one wavelength.
internal_coincidence of Equation (22).
external_coincidence of Equation (23).
pressure_ratio_boundaries(
specific_heat_ratio: float,
pressure_recovery: float,
) -> RegimeBoundaries

The regime boundaries of Equations (3) to (7).

Parameters

NameDescription
specific_heat_ratio of the flowing fluid.
pressure_recovery, or when the valve has attached fittings, which is what the NOTE to Table 3 asks for and what every example in Annex A uses.

Returns: The four boundaries and the recovery factor behind two of them.

Raises

ExceptionWhen
ValueErrorIf either argument is not positive and finite, or if the specific heat ratio is not above one.

Constant (int).

REGIME_CHOKED = 2

Constant (int).

REGIME_CONSTANT_EFFICIENCY = 5

Constant (int).

REGIME_COUNT = 5

Constant (int).

REGIME_SHOCK = 4

Constant (int).

REGIME_SUBSONIC = 1

Constant (int).

REGIME_SUPERSONIC = 3
RegimeBoundaries(
vena_contracta: float,
critical: float,
break_point: float,
constant_efficiency: float,
recovery: float,
)

The four pressure ratios that cut Clause 5.2 into five regimes.

Attributes

NameDescription
vena_contracta, where the flow in the vena contracta first reaches the speed of sound, Equation (3).
critical, the same point seen from the valve inlet, Equation (4).
break_point, where the jet stops growing and shock cells take over, Equation (6).
constant_efficiency, where the acoustical efficiency stops rising with pressure ratio, Equation (7).
recovery, the recovery correction factor of Equation (5), which the other two are written in terms of.
stage_level_correction(
last_stage_level: float,
stages: int,
inlet_pressure_pa: float,
stagnation_pressure_pa: float,
) -> float

Equation (31): what the stages before the last one add.

Clause 5 is run on the last stage alone, and this puts the others back. The exponent is small, so the correction barely notices how many stages there are: two stages and eight differ by 26 % of a term that is itself only a few decibels.

Parameters

NameDescription
last_stage_level of Equation (18) computed on the last stage, in dB.
stages, the number of throttling stages, at least two.
inlet_pressure_pa at the valve inlet, in Pa.
stagnation_pressure_pa at the last stage, in Pa.

Returns: for the whole trim, in dB.

Raises

ExceptionWhen
ValueErrorIf the stage count is below two, or a pressure is not positive and finite, or the stagnation pressure exceeds the inlet.

Constant (float).

STANDARD_ATMOSPHERE_PA = 101325.0

Constant (float).

STRUCTURAL_LOSS_REFERENCE_HZ = 1.0

Constant (float).

UNIVERSAL_GAS_CONSTANT = 8314.0

Constant (mapping).

VALVE_ACOUSTIC_STYLES = {'globe parabolic plug': (-4.2, 0.19), 'globe V-port plug': (-4.2, 0.19), 'globe ported cage': (-3.8, 0.2), 'globe multihole to open': (-4.8, 0.2), 'globe multihole to close': (-4.4, 0.2), 'butterfly eccentric': (-4.2, 0.3), 'butterfly swing-through': (-4.2, 0.3), 'butterfly fluted vane': (-4.2, 0.3), 'butterfly 60 deg flat disk': (-4.2, 0.3), 'eccentric rotary plug': (-3.6, 0.3), 'segmented ball 90 deg': (-3.6, 0.3), 'drilled hole plate': (-4.8, 0.2), 'expander': (-3.0, 0.2)}
valve_aerodynamic_noise(
stream: GasStream,
valve: ValveTrim,
pipe: DownstreamPipe,
*,
expander: Expander | None = None,
) -> AerodynamicValveNoise

The whole of Clause 5, from the operating point to the level at 1 m.

The chain is Clause 5.7’s own flow chart: the pressure ratios of 5.1 and 5.2, the geometry of 5.3, the regime-dependent stream power and acoustical efficiency of 5.4, then the pipe transmission loss of 5.5 and the external level of 5.6, which are common to every regime.

Parameters

NameDescription
streamThe gas and the operating point, a GasStream.
valveThe valve at the travel being examined, a ValveTrim.
pipeThe downstream pipe and what surrounds it, a DownstreamPipe.
expanderThe transition piece downstream of the valve. Give one when the valve outlet is narrower than the pipe and the outlet Mach number has passed 0,3, which is when NOTE 1 to Equation (15) sends the calculation to Clause 7. The flow leaving the outlet is then a second source, and Equation (43) adds it to the trim inside the pipe: the band_internal_level of the result is the sum of the two, and the transmission loss and the external level follow from that sum.

Returns: An AerodynamicValveNoise carrying every printed intermediate as well as the level at 1 m.

Raises

ExceptionWhen
ValueErrorIf a value is outside the range its equation is written for.
valve_style_modifier(
passage_area: float,
wetted_perimeter: float,
passages: int,
) -> float

The valve style modifier of Equations (8a) to (8c).

compares the hydraulic diameter of one flow passage with the diameter of the single circular orifice that would pass the same total area. A cage full of small holes has a small and a small jet; a single large port has near one.

Parameters

NameDescription
passage_area, the area of a single flow passage, in m².
wetted_perimeter of that passage, in m.
passages, the number of independent flow passages.

Returns: , dimensionless.

Raises

ExceptionWhen
ValueErrorIf an argument is not positive and finite, or if the passage count is not a whole number.

A valve read outside the conditions IEC 60534-8-3 prints for it.

ValveTrim(
flow_coefficient: float,
style_modifier: float,
pressure_recovery: float,
outlet_diameter_m: float,
efficiency_correction: float,
strouhal_number: float,
coefficient: str = 'Cv',
)

The valve, at the travel being examined.

Every field is a manufacturer’s datum except the last two, which Table 4 prints as typical values for a valve style and NOTE 1 to that table calls typical only.

Attributes

NameDescription
flow_coefficient.
style_modifier, from valve_style_modifier.
pressure_recovery, or with attached fittings.
outlet_diameter_m of the valve outlet, in m.
efficiency_correction from Table 4.
strouhal_number from Table 4.
coefficientWhich flow coefficient flow_coefficient is, "Cv" or "Kv", which selects from Table 1.