Skip to content

Determine the sound power of a whole multisource industrial plant from a contour round it, by ISO 8297 - #911

Merged
jmrplens merged 1 commit into
standards/iec-61094-5-8-comparison-calibrationfrom
standards/iso-8297-multisource-plants
Oct 1, 2026
Merged

jmrplens merged 1 commit into
standards/iec-61094-5-8-comparison-calibrationfrom
standards/iso-8297-multisource-plants

Conversation

@jmrplens

@jmrplens jmrplens commented Sep 30, 2026 •

Copy link
Copy Markdown
Owner

A quarry, a crushing plant or a petrochemical complex is too large for the enveloping surface of ISO 3744 and too full of sources to measure one at a time. ISO 8297:1994 measures the plant as one source, for the prediction of the levels at its neighbours. This adds that engineering method as phonometry.emission.sound_power_plant, stacked on the ECAC Doc 29 Appendix D branch, whose SAE ARP 866A transcription of ISO 3891 it reuses rather than copies.

The contour (clause 9). plant_measurement_contour takes the plant area and the measurement contour as two polygons in metres, checks that they are simple and that the contour encloses the plant without touching it, and lays equidistant positions along it. With no position_count it picks the fewest that meet 9.1.1 c); your own layout and the positions a river or a building made you leave out go in as position_count and omitted_positions. The result gives the distances to the perimeter and their mean, the microphone direction of 9.4, the aspect angle at each position, the largest aspect angle anywhere on the contour (exact along every edge outside the convex hull of the plant, found in closed form), Sp, Sm, l, Dm, the prescribed microphone height of 9.3, the window of 9.1.1 a), the largest plant dimension and the receiver distance of 0.2 a). plant_characteristic_height_m gives H of 9.2 c) with NOTE 7.

The sound power (clause 10). plant_sound_power, or contour.sound_power, runs the nine steps: the background correction of Table 2, the energy average, the cap of 10.2 and 10.3 with a SoundPowerWarning and a record of which levels were replaced, the area, proximity, microphone and air absorption terms, L_W per octave band and L_WA with the Annex E corrections of ISO 3744. Every step is derived on request from the readings the result keeps, and the result carries the uncertainty of Table 1. The air absorption is Table 3 as printed, or, given a temperature and a humidity, the ISO 3891 Annex A coefficient at the one-third-octave band centred on each octave.

Table 3 and the weather. Table 3 says it is taken from ISO 3891 at 15 °C and 70 %, but it departs from that coefficient at 125 Hz, 4 kHz and 8 kHz, where ISO 3891 Table 9 itself prints other values, and no single weather reproduces every row. The table is used as printed and the difference is stated, not corrected. The consequence is written where the choice is made: passing 15 °C and 70 % gives about 0.0074 sqrt(Sm) dB more at 8 kHz than passing no weather, 1.4 dB for the plant of the guide, so the weather is for a measurement whose weather differs markedly, which is when Table 3 asks for it.

The verdict. check_plant_measurement returns one PlantMeasurementCheck on clauses 1.2, 6 b), 7.1, 9.1, 9.3, 9.5.1, 9.5.3 and 10.2, with passes, failures, deviations, one PlantRequirement row per requirement and a truth value that raises. Four rows are advisory, listed in deviations without deciding passes, because the standard lets them go unmet provided the report says so: the microphone height of 9.3, held as a height to stand at to within the 5 % to which 9.2 reads H and Sm, so a microphone too high is reported as well as one too low; the preferred background margin of 10 dB; a level more than 5 dB above the average; and the "approximately 320 m" of 1.2. Given leq_range_db, the check holds an integrated reading to the 0.5 dB either way of 9.5.3. plant_steady_reading_db reads a sound level meter by 9.5.2.

Parts of an area (0.2 b). partial_plant_contributions puts together parts measured on their own contours, band by band and A-weighted, with each part's share of the total. Sources raised above the plant stay out of the sum, as clause 11 asks.

Every result has .plot(): the plan of the contour in the manner of Figure 1, the power beside the contour average, the margin of every requirement with the advisory rows hatched and marked hollow, and the parts against their sum. The contour and every result keep read-only copies of the arrays they are given, and the three printed tables are published as read-only mappings.

What breaks. Nothing. The module and its names are new; the only shared code it uses, the ARP 866A transcription in aircraft, is called and not changed, through a new dependency of emission on aircraft that the architecture test records.

Guide. A new guide in English and Spanish, with its docs/ mirror, measures an L-shaped crushing and screening plant whose eight sources have a known power: ISO 8297 finds 113.5 dB(A) against the 113.0 dB(A) they radiate, within half a decibel in the bands that carry L_WA and well inside Table 1. It puts the plant beside an asphalt plant of the same area, shows Table 3 against the formula it cites, and draws six figures, each with the code that draws it.

How it was checked. The standard prints no worked example, so no single printed number anchors the chain. What it does print is checked, read on the pages of BS ISO 8297:1994 (PDF pages 9 to 16, printed folios 1 to 8): Tables 1, 2 and 3, and the bound of NOTE 11, -0.9 dB and -1.9 dB, which the proximity term lg(d/(4 sqrt(Sp))) meets at the two ends of 9.1.1 a) and which confirms that the term carries no factor 10. The weather path reproduces ISO 3891 Table 9 at 15 °C in every octave band to its printed decimal. Closed forms cover the rest: a point source on the ground at the centre of a circular contour gives its own power back as the microphones come down to the ground, and 10 lg((R^2 + R h)/(R^2 + h^2)) more at height h; a square plant seen from a square contour d out subtends 2 atan(L/(2d)) at the middle of each side whatever the positions. These are rows of the conformance report. The module tests pin every edge of the verdict (a mean distance of exactly 5 m, a 3 dB angle of exactly 30 degrees, a background exactly 6 dB and 10 dB down, one omission in ten, a level exactly 5 dB above the average, a plant of 330 m), the layout search against an exhaustive one, the band tolerance, and the read-only storage.

Four misprints of ISO 8297:1994 are registered in the errata, all without effect on any number: the aspect angle written with the symbol of the microphone's angle in 9.1.1 b), with a strict bound in the callout of Figure 1; the 31.5 Hz octave printed as 31 in Table 3; the area term written with a lower-case subscript in 10.4; and "characteristics height" in the heading of 3.7.

Gates. On this branch ruff check and ruff format are clean (1274 files), mypy is clean on 670 files of src, scripts, the stub and the typing tests, and bandit is clean; the conformance report (1793 of 1793 checks), the API reference, the llms files, the site reports, the catalogue data and the PyPI readme regenerate without a diff; the test modules this change adds or touches pass (422 passed); and the checks on frozen constants, parameter units, published sources, errata evidence, em dashes, digit grouping and markdown hazards, the guides index (162 guides) and the language parity pass. This branch is the top of its stack, so the heavy gates ran here, on every change of the stack together: the full suite passes (25 145 passed, 71 skipped), every documentation snippet runs (7159 blocks over 723 pages), the site builds (971 pages) with 0 type errors, 0 warnings and clean HTML validation, a fresh regeneration of the figures and the example fiches reproduces all 3172 committed figures and 75 fiches unchanged and passes the figure checks on contrast, language, annotations, ticks, decimal points, legends, tick and text clearance and minus signs, and the 43 published clips match the code that draws them.

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @jmrplens, your pull request is larger than the review limit of 150,000 diff characters

@coderabbitai

coderabbitai Bot commented Sep 30, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 59 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 2 included reviews currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Repository: jmrplens/phonometry/.coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: 554ffef6-b37a-4081-92d5-99c87957e5dc

📥 Commits

Reviewing files that changed from the base of the PR and between ba2d588 and 0e56312.

⛔ Files ignored due to path filters (27)
  • .github/badges/conformance-summary.svg is excluded by !**/*.svg
  • .github/badges/conformance-summary_dark.svg is excluded by !**/*.svg
  • .github/images/plant_air_absorption.svg is excluded by !**/*.svg
  • .github/images/plant_air_absorption_dark.svg is excluded by !**/*.svg
  • .github/images/plant_air_absorption_es.svg is excluded by !**/*.svg
  • .github/images/plant_air_absorption_es_dark.svg is excluded by !**/*.svg
  • .github/images/plant_measurement_check.svg is excluded by !**/*.svg
  • .github/images/plant_measurement_check_dark.svg is excluded by !**/*.svg
  • .github/images/plant_measurement_check_es.svg is excluded by !**/*.svg
  • .github/images/plant_measurement_check_es_dark.svg is excluded by !**/*.svg
  • .github/images/plant_measurement_contour.svg is excluded by !**/*.svg
  • .github/images/plant_measurement_contour_dark.svg is excluded by !**/*.svg
  • .github/images/plant_measurement_contour_es.svg is excluded by !**/*.svg
  • .github/images/plant_measurement_contour_es_dark.svg is excluded by !**/*.svg
  • .github/images/plant_partial_contributions.svg is excluded by !**/*.svg
  • .github/images/plant_partial_contributions_dark.svg is excluded by !**/*.svg
  • .github/images/plant_partial_contributions_es.svg is excluded by !**/*.svg
  • .github/images/plant_partial_contributions_es_dark.svg is excluded by !**/*.svg
  • .github/images/plant_proximity_uncertainty.svg is excluded by !**/*.svg
  • .github/images/plant_proximity_uncertainty_dark.svg is excluded by !**/*.svg
  • .github/images/plant_proximity_uncertainty_es.svg is excluded by !**/*.svg
  • .github/images/plant_proximity_uncertainty_es_dark.svg is excluded by !**/*.svg
  • .github/images/plant_sound_power.svg is excluded by !**/*.svg
  • .github/images/plant_sound_power_dark.svg is excluded by !**/*.svg
  • .github/images/plant_sound_power_es.svg is excluded by !**/*.svg
  • .github/images/plant_sound_power_es_dark.svg is excluded by !**/*.svg
  • site/src/generated/api-sidebar.mjs is excluded by !**/generated/**
📒 Files selected for processing (58)
  • .zenodo.json
  • CHANGELOG.md
  • README.md
  • README_PYPI.md
  • docs/CONFORMANCE.md
  • docs/ERRATA.es.md
  • docs/ERRATA.md
  • docs/README.md
  • docs/conformance.json
  • docs/devices/emission/index.md
  • docs/devices/emission/sound-power-plant.md
  • docs/devices/index.md
  • docs/reference/api/index.md
  • docs/reference/bibliography.md
  • docs/start/getting-started.md
  • docs/start/why-phonometry.md
  • llms-full.txt
  • llms.txt
  • scripts/api_taxonomy.py
  • scripts/conformance/domains/aircraft.py
  • scripts/conformance/domains/intensity.py
  • scripts/conformance/registry.py
  • scripts/figures/devices.py
  • scripts/figures/i18n.py
  • scripts/figures/registry.py
  • scripts/generate_graphs.py
  • site/public/llms/llms-devices-emission.txt
  • site/public/llms/llms-devices.txt
  • site/public/llms/llms-reference.txt
  • site/public/llms/llms-start.txt
  • site/src/content/docs/devices/emission/index.mdx
  • site/src/content/docs/devices/emission/sound-power-plant.mdx
  • site/src/content/docs/devices/index.mdx
  • site/src/content/docs/es/devices/emission/index.mdx
  • site/src/content/docs/es/devices/emission/sound-power-plant.mdx
  • site/src/content/docs/es/devices/index.mdx
  • site/src/content/docs/es/index.mdx
  • site/src/content/docs/es/reference/bibliography.md
  • site/src/content/docs/es/reference/conformance.mdx
  • site/src/content/docs/es/reference/errata.md
  • site/src/content/docs/es/start/guides.md
  • site/src/content/docs/index.mdx
  • site/src/content/docs/reference/api/index.md
  • site/src/content/docs/reference/api/power/sound-power-plant.md
  • site/src/content/docs/reference/bibliography.md
  • site/src/content/docs/reference/conformance.mdx
  • site/src/content/docs/reference/errata.md
  • site/src/content/docs/start/guides.md
  • site/src/data/topics.mjs
  • src/phonometry/_plot/emission_plant.py
  • src/phonometry/emission/__init__.py
  • src/phonometry/emission/sound_power_plant.py
  • tests/emission/test_sound_power_plant.py
  • tests/reference_data/__init__.py
  • tests/reference_data/emission.py
  • tests/result_factories.py
  • tests/test_package_architecture.py
  • tests/test_result_plots.py
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Autopilot is currently an internal CodeRabbit preview.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@jmrplens
jmrplens added this pull request to stack #900 September 30, 2026 17:59
@github-actions github-actions Bot added documentation Improvements or additions to documentation conformance Standard clause coverage, reference values or errata errata Confirmed defect in a published standard, tracked in docs/ERRATA.md validation Reference data and oracles used to check results against normative values api Public API surface, naming and deprecations figures Generated plots, diagrams and animations site Documentation website i18n English and Spanish translations area: emission Sound power and source emission area: core Shared internals and cross-cutting code every domain depends on labels Sep 30, 2026
@codecov

codecov Bot commented Sep 30, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 96.81%. Comparing base (246cc34) to head (0e56312).

Additional details and impacted files
@@                                Coverage Diff                                 @@
##           standards/iec-61094-5-8-comparison-calibration     #911      +/-   ##
==================================================================================
- Coverage                                           96.81%   96.81%   -0.01%     
==================================================================================
  Files                                                 430      432       +2     
  Lines                                               81613    82535     +922     
==================================================================================
+ Hits                                                79017    79904     +887     
- Misses                                               2596     2631      +35     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions

github-actions Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Numerical conformance

All 1793 conformance checks pass, across 109 domains and 519 standards

1793/1793 checks pass across 109 domains and 519 standards (223 normative designations, 123 further published sources).

Used in the tables below is how much of that clause's published tolerance the deviation consumes: 100 % sits exactly on the limit, 5 % uses a twentieth of the allowance, and a dash means the clause states no two-sided tolerance for the quantity, so there is no budget to spend. It is reported and never used to decide a verdict, which is settled at full precision before any rounding.

New checks (349)

Standard Quantity Deviation Used
IEC 61672-1:2013 Table 4 Reference responses and limits of LAFmax - LA and LAE - LA, 12 durations 0 0 %
IEC 61672-1:2013 Table 4 Reference responses and limits of LASmax - LA, 9 durations 0 0 %
IEC 61672-1:2013 Table 4, Equations (7) and (8) Reference toneburst responses against 10 lg(1 - exp(-Tb/tau)) and 10 lg(Tb/T0) 0 0 %
IEC 61672-1:2013 Table 5 Reference differences LCpeak - LC and limits, 5 test signals 0 0 %
IEC 61672-1:2013 Table B.1 Maximum-permitted uncertainties, 31 printed rows (the F and S decay rates in two) 0 0 %
IEC 61672-3:2013 12.16 with IEC 61672-1:2013 Table 3 Acoustical weighting at 8 kHz, class 1, upper limit 0 0 %
IEC 61672-3:2013 12.16 with IEC 61672-1:2013 Table 3 Acoustical weighting at 8 kHz, class 1, lower limit 0 0 %
IEC 61672-3:2013 12.16 with IEC 61672-1:2013 Table 3 Acoustical weighting at 125 Hz, class 2, lower limit 0 0 %
IEC 61672-3:2013 12.16 with IEC 61672-1:2013 Table 3 Acoustical weighting at 8 kHz, class 2, upper limit 0 0 %
IEC 61672-3:2013 13.10 with IEC 61672-1:2013 Table 3 Electrical weighting A at 16 kHz, class 1, lower limit 0 0 %
IEC 61672-3:2013 13.10 with IEC 61672-1:2013 Table 3 Electrical weighting C at 1 kHz, class 1, upper limit 0 0 %
IEC 61672-3:2013 13.10 with IEC 61672-1:2013 Table 3 Electrical weighting Z at 8 kHz, class 2, lower limit 0 0 %
… 337 more

Removed checks (3)

Standard Quantity Deviation Used
ISO 10140-5:2010+A1 Annex B, Table B.1 Reference elements end-to-end: printed Rw (C; Ctr) of all three exact -
ISO 10140-5:2010+A1 Annex C, Table C.1 Reference floors end-to-end: printed Ln,t,r,0,w (CI) of both exact -
SAE ARP 5534 pure-tone coefficient (ISO 9613-1) Mid-band α at 1 kHz, 25 °C, 70 % RH, 101.325 kPa, dB/m 0 dB/m 0 %

Closest to their published limit (top 5)

The rows with the least room left, so the ones a change is most likely to push over.

Standard Quantity Deviation Used
ISO/TR 17534-3:2015 Table 3 Ground-projected path length dp, m 0.005 m 100 %
DIN 4150-2:1999-06 Annex C, Example 5 KB_FTr with hammer b) in the rest hours, Formula (5) -0.005 100 %
DIN 4150-2:1999-06 Annex C, Example 8 KB_FTm over the record with the passage maxima alone -0.0005 100 %
E DIN 4150-2:2023-08 Annex B, Table B.1 KB_FTm,Zug of the metro north by Formula (5) -0.0005 100 %
Long 2e Table 14.9 (worked duct-borne sheet, supply path) Fan to room, 8 octave bands -> 52/42/30/18/9/-2/-2/-1 dB at the receiver 1 dB 100 %

Pass Tests & coverage: 151500 tests, 0 failures (all green)
Python Version Tests Failures Coverage Status
macos-latest-3.13 25250 0 96.8% Pass Passed
macos-latest-3.14 25250 0 96.8% Pass Passed
ubuntu-latest-3.13 25250 0 96.8% Pass Passed
ubuntu-latest-3.14 25250 0 96.8% Pass Passed
windows-latest-3.13 25250 0 96.8% Pass Passed
windows-latest-3.14 25250 0 96.8% Pass Passed

Full report at this commit: docs/CONFORMANCE.md · docs/conformance.json · full CI artifacts

@jmrplens
jmrplens force-pushed the standards/iso-8297-multisource-plants branch from ba2d588 to d4d6669 Compare October 1, 2026 00:22
@jmrplens
jmrplens force-pushed the standards/iso-8297-multisource-plants branch from d4d6669 to 6277e2c Compare October 1, 2026 03:24
@jmrplens
jmrplens force-pushed the standards/iso-8297-multisource-plants branch from 6277e2c to 89daed8 Compare October 1, 2026 06:10
…m a contour round it, by ISO 8297

A quarry, a crushing plant or a petrochemical complex is too large for an enveloping surface and too full of sources to measure one at a time, so ISO 8297:1994 measures the plant as one source for the prediction of the levels at its neighbours. The new emission.sound_power_plant module lays the positions on a contour drawn as a polygon round the plant, with the distances, aspect angles, microphone directions and heights of clause 9, and runs the nine steps of clause 10 to the octave-band and A-weighted sound power with the uncertainty of Table 1. The air absorption is Table 3 as printed, or the ISO 3891 Annex A coefficient for the weather of the measurement. check_plant_measurement gives one verdict on the requirements of clauses 1.2, 6 b), 7.1, 9.1, 9.3, 9.5.1, 9.5.3 and 10.2, keeping apart those the standard lets go unmet if reported, and partial_plant_contributions puts together the parts of an industrial area measured on their own contours. Every result has a plot, a new guide in English and Spanish measures a crushing plant whose sources are known and lands within half a decibel of their power, and four misprints of the standard are in the errata.
@jmrplens
jmrplens force-pushed the standards/iso-8297-multisource-plants branch from 89daed8 to 0e56312 Compare October 1, 2026 08:04
@sonarqubecloud

sonarqubecloud Bot commented Oct 1, 2026

Copy link
Copy Markdown

@jmrplens
jmrplens merged commit 9692e35 into main Oct 1, 2026
49 checks passed
@jmrplens
jmrplens deleted the standards/iso-8297-multisource-plants branch October 1, 2026 09:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

api Public API surface, naming and deprecations area: core Shared internals and cross-cutting code every domain depends on area: emission Sound power and source emission conformance Standard clause coverage, reference values or errata documentation Improvements or additions to documentation errata Confirmed defect in a published standard, tracked in docs/ERRATA.md figures Generated plots, diagrams and animations i18n English and Spanish translations site Documentation website validation Reference data and oracles used to check results against normative values

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant