at main
4 folders
6 files
Verdicts on a printed limit that read the decimal value, not its last bits (#914)
A quantity computed from decimal readings (a difference, a mean, a ratio, a spread) and judged against a limit a standard prints in decimal is now settled to nine decimal places before it meets that limit, and a half is rounded on the settled value, so 32,3 - 26,3 dB and 32,2 - 26,2 dB are the same 6 dB margin on every machine. One private helper does this for the whole library, and the six local copies of the same nine-decimal rule now go through it. The settled value only decides the verdict; every result keeps the value it computed. Two results change shape at a degenerate input: room.open_plan_metrics returns NaN for a distance when the STI does not fall with distance, and a hammer and floor that are critically damped in decimal get the critically damped pulse instead of NaN.
A resilient layer is a catalogue row, and the dynamic-stiffness functions name their units (#865)
* A resilient layer is a catalogue row, and the dynamic-stiffness functions name their units
ResilientLayer is now an io.CatalogueRow like every other published row: its
quantities are optional, it carries the hedges a page can print in place of a
number, and Hopkins Table A3 moves out of the module into
materials/resilient/data/hopkins-2007-table-a3.json. PUBLISHED_RESILIENT_LAYERS
is keyed "hopkins-2007-table-a3/<row>" like every catalogue, and the credit of
the four rebond foams is attributed_to["row"].
The row gains apparent_dynamic_stiffness_n_m3, the apparent stiffness s't of a
test specimen, beside dynamic_stiffness_n_m3, the s' of the installed layer
that Formula 2 takes. The heading of Table A3 prints s', which the book's List
of symbols (PDF page 23, printed p. xxii) defines as the stiffness of the
installed material and keeps apart from the apparent s't, and Section
3.11.3.1.2 (PDF page 387, printed p. 360) uses the two the same way. So the
fifteen rows keep their values in dynamic_stiffness_n_m3, every number they
returned before they return now, and no packaged row holds an s't; the module
banner and the reference data stop calling them s't.
A layer that gives only s't goes through EN 29052-1 clause 8.2 on its way to
Formula 2. natural_frequency takes the lateral airflow resistivity as
airflow_resistivity_pa_s_m2, in the unit every catalogue holds it in, divides
it by a thousand for the kPa thresholds (which moves no value across either
threshold), and below 100 kPa s/m2 takes the enclosed-gas stiffness as
gas_stiffness_n_m3. Without the resistivity it refuses with CatalogueError,
saying that s't is not s' and what to pass. A layer that gives s' refuses the
two keywords, since nothing would read them.
The functions of the module name their units: resonant_frequency_hz,
total_mass_per_area_kg_m2, thickness_m, apparent_stiffness_n_m3,
airflow_resistivity_kpa_s_m2, gas_stiffness_n_m3, dynamic_stiffness_n_m3,
mass_per_area_kg_m2 and floor_mass_per_area_kg_m2. The resistivity of
installed_dynamic_stiffness is taken by name only, because it is the one
quantity here in kPa s/m2, and below 100 kPa s/m2 a missing gas term is no
longer read as zero. There are no aliases; the migration guide lists every
rename.
The catalogue page generator sends the resilient layers through the same
section() as every other row type instead of building their keys and credit
by hand, and the page data it writes is byte for byte what it was. The golden
fingerprint gains a step that re-keys the fifteen rows, names their table and
turns the credit into a mapping, and a test pins that it moves those rows and
nothing else.
* A bound on a layer's s't is refused by name, and Table A3's blank densities say where they come from
A resilient layer whose apparent stiffness s't is a declared bound, with no
value of s' either, used to fall through to the refusal for s' and say the
page gave no stiffness at all. It now names the s't cell and its bound and
says why no resistivity or gas term turns it into s'. A row that gives s'
refuses the enclosed-gas stiffness passed on its own, as it already refused
the resistivity, and both refusals are tested.
Hopkins Table A3 prints four densities once for a block of rows and leaves
the cell blank on another row of it. Those four rows now carry the figure
marked carried, naming the row that prints it, as Ver and Beranek Table 8.7
does, and the catalogue page shows them as carried with the same values. The
fingerprint step for the resilient layers lists them.
The guide says what a test report gives under EN 29052-1 clause 9 e), s't
and s'a with s' only if possible, takes the thickness of Formula 7 under the
test load that clause 9 b) has the report state, shows the refusal as it
prints, and quotes Hopkins for how large the enclosed-gas term can be.
The unit of critical_angle depended on which function you called (#757)
* The unit of critical_angle depended on which function you called
#755 closed the bare names of the geometry. These are the compounds built
on the same words, and one of them is worse than anything the first pass
found: in weston_regimes.py, WestonRegimeBoundaries.critical_angle is in
radians and weston_regime_boundaries(critical_angle=...) one screen below
it takes degrees, while seabed_reflection.py has it in degrees again. The
same name, 57 times apart. The field is critical_angle_rad now and the two
overrides critical_angle_deg, which is what the function converts to
anyway.
The rest, read off each docstring: degrees for bank_angle, path_angle(s),
grazing_angle, launch_angles, arrival_angles, source_angle and
limiting_angle; radians for incidence_angle and angle_limit; metres for
the thirteen diameters; steradians for solid_angle; per second for
sound_speed_gradient; nepers per radian for reflection_loss_gradient and
its override. runway_gradient becomes runway_gradient_ratio, because its
own docstring says dimensionless.
Two public functions were caught by the sweep and put back:
critical_angle(c1, c2) and reflection_loss_gradient(seabed). The rule is
about parameters; what a function returns is said by its return type.
element_diameter and pitch_diameter stay bare in the guard's exemptions,
because the bearing formulae use them only as the ratio d/D.
The guard matches the geometric quantities as whole words inside a name
now, so critical_angle and duct_diameter are held to the rule and
triangles is not, and the two tuples of the first pass collapse into one.
No value changes: the same 995 conformance checks with the same numbers.
One clip is re-rendered, because its scene reaches the renamed parameters.
* The geometric conditions with a default are written by name too
The rule of #756 now reaches the names #755 and this branch renamed.
Thirteen more conditions carry a default and could still be passed as a
bare number.
piston_directivity_pattern and hydrophone_depths take a star before
their angle argument, which keeps the quantity the call is about
positional.
Nine result dataclasses take KW_ONLY after the fields they are about,
among them ApproachStep and DepartureStep, whose ANP steps were being
written as five numbers in a row against a column of sheet C-6.2.
* Say both halves of the rule in the guard's own docstring
Six places where the clause and the code had parted, from a microphone standing under its own clearance to an area that is not one number (ISO 10847, ISO 11820, ISO 11821, EN 16487) (#785)
* Six places where the clause and the code had parted, from a microphone standing under its own clearance to an area that is not one number (ISO 10847, ISO 11820, ISO 11821, EN 16487)
The reference microphone of ISO 10847 could stand lower than 7.2.2 allows.
The clause puts it at least 1,5 m above the top edge of the barrier with
"shall", and its NOTE lets a close source raise it until it looks 10 degrees
over the top; the height returned was the NOTE's alone whenever the source was
nearer than 15 m, which for a 3 m barrier 5 m away is 4,34 m against the 4,5 m
the clause asks for, and past 80 degrees a negative height. It is the higher of
the two now, and where no height reaches the 10 degrees the clearance holds and
a warning says why. The test and the conformance row had both pinned the short
geometry as correct.
ISO 11820 caps its energy subtraction at 3 dB, and Table 1 prints what that
3 dB is: the correction at a 3 dB margin, which the subtraction writes
unrounded as 3,0206 dB. The cap is judged on the margin of the two energy means
now, so the two routes the clause offers agree at the boundary they share and a
printed 3,0 dB pair is no longer decided by floating point. The window that
keeps such a pair out of the cap is the one the module declares and nothing
wider: the comparison names a relative tolerance of zero, as every other
closeness test in the package does, so the constant sets the tolerance it
documents instead of three times it. ISO 11821 7.4 c) reports the attenuation
of a screen to the nearest whole decibel, which the result now gives with
rounded() and rounded_a_weighted() as the barrier, enclosure and cabin results
already did.
The two loss functions of ISO 11820 took their areas as single numbers, where
the area of a diffuse room is a quarter of its absorption and moves with the
reverberation time band by band. They take each area and the field correction
as one value or one per band, and the two fields of the result are arrays of
one value per band even when single values went in. The thesis oracle that had
to be driven one band at a time is one call per table.
check_ceiling_specimen judged three of the limits clause 4 of EN 16487 prints
and published the rest as constants nothing applied. It judges the support
units of 4.1.1.2.3.6 and, given one value per measurement, the 50 % of 4.2.2;
the verdict carries both, and a type E depth other than 200 mm passes with a
warning that no longer calls the arrangement outside the test code. And
room_to_room_transmission gains receiver_distance_m, the direct field the
partition radiates into the receiving room, from Equations (7-71) and (7-72) of
Barron (2003), whose Example 7-6 a new conformance row holds; Norton's Equation
(4.101) is its far limit and stays the default.
The unit guard then read the new humidity_ok as a humidity without its unit: a
parameter typed bool holds a verdict and no number of the quantity it names, so
it is outside the rule. The printed tables the tests and the conformance rows
of these standards both read were transcribed twice, once on each side; they
are transcribed once now, in tests/reference_data, with the document, the folio
and the PDF page of each, and the report regenerates value for value.
The guides say all of it in both languages, with the mirrors, the curated API
table and the errata entry for the 6,2 dB of ISO 14257 Equation (4), which
stays as printed and is now stated where it is spent.
* Two receiver-correction rows a single band could satisfy, and a denominator with two spellings (ISO 10847, ISO 11820)
Both ISO 10847 receiver-correction rows read the largest shift across the three bands, so a correction that reached one band and left the other two alone would still have printed the 6 dB of the pressure doubling and passed. They now read the largest absolute departure from 6 dB, which is a statement about every band, and the 6 dB is written into the expected column as prose so the row still says what it is checking.
The Ver and Beranek absorption row said it was checking a quarter of the printed Sabine absorption area. It multiplies the quarter back up and compares the full printed 10,7 m2, so the row described a different quantity from the one it evaluates.
`receiving_absorption` is the denominator of the reverberant term, and the two books write that term over two different quantities: Norton over S2 alpha2 and Barron over the room constant R2. The module prose, the function docstring and the guide all say so, but the parameter line said only the first, and the parameter tables of the reference pages print that line on its own, away from the paragraph that explains it. It now names both, with the link to `room_constant` beside the one to `equivalent_absorption_area`.
The normalisation cell of the API table printed `spectrum_distribution_value(values, PINK_NOISE_WEIGHTS_DB values)`, two arguments juxtaposed with no accessor between them. The second argument is a sequence of the six weights, so it is `list(PINK_NOISE_WEIGHTS_DB.values())`.
* The background of Annex B case A goes with the label that carries it, not with the coordinates beside it (ISO 11690-3)
Table B.5 prints the 50 dB of background against the workstation it calls W1, and the entry already registered that the labels of that table are the half it gets right: Figure B.1 puts W1 beside machine M2, and that is where the levels of Table B.6 come back. The background was being heard in the far corner instead, which is where the other label belongs.
It is worth 0,004 dB, both readings round to the tenth Table B.6 prints, and no verdict moves. What changes is the second decimal of the two recomputed levels the entry quotes, 82,09 dB and 80,27 dB becoming 82,10 dB and 80,26 dB, and the entry now says where the background sits and what the other reading would cost.
The two counts in the Annex B check labels were written out by hand while the cells they describe were counted in the code beside them, so a row added or removed would have left the prose saying six and twelve. They come from the cells now.
* The Eq. (4) offset row judges every claim it prints, not only the first (ISO 14257)
The row publishes three findings about the fourteen Annex C values: the sum of the Table 1 weights puts none of them outside their rounding, the printed 6,2 dB puts nine outside, and every departure the printed constant gives is high. Its verdict only counted the first. The other two were computed and printed beside it and never judged, so the row would have gone on passing the day the printed constant agreed with the annex, while still saying it does not.
All three are judged now, with a fourth the description also claims, that none of the high cells reaches a second unit of the tenth. The nine is recorded as the finding it is rather than derived, and the fourteen comes from the cells. Made to fail both ways before committing: with the recorded count set as if the constant agreed with the annex, and with the printed departures pushed low.
In the release note, "both use one the angle governs now" becomes "both now use the height the angle governs".
* The two Annex B distances in the ISO 11690-3 entry are the ones the coordinates give
The entry said the position Table B.5 calls W2 is one metre from machine M2 and the one it calls W1 eleven metres from the nearer machine. From the printed coordinates they are 1,17 m and 11,42 m: W2 stands a metre away in plan but 0,6 m higher than the machine. Both now read 1,2 m and 11,4 m, in English and in Spanish. The argument does not change, since the near position is still the quieter one the table claims.
* The generated artefacts are regenerated on top of the measurement diagrams
Moving the layer onto main kept llms-full.txt, the materials absorbers bundle and the conformance artefact as this layer had written them, which dropped what the diagram stack added to the suspended ceilings guide and the ISO 4866 re-citation. Regenerated from the tree, they carry both.
Resilient moduli, damping treatments, carpets and the nonlinearity of solids (#850)
* Three small catalogues: resilient moduli, damping treatments and carpets
Vigran's Table 8.3 gives the dynamic modulus of six resilient materials
under a static load of about 2 kPa, from which a layer's dynamic
stiffness is the modulus over its thickness. Table 14.2 of Harris (1977)
rates eight asphalt felt treatments by the decay rate of the chapter's
standard steel panel at 160 Hz, held as a decay rate and not converted
into a loss factor the page does not print. Harris 3e Tables 30.2 and
30.3 describe nineteen carpets by their pile and rate them by their noise
reduction coefficient.
Five pile weights of Table 30.2 print an imperial half that is not the
metric one: three follow from 0.035 kg/m2 per oz/yd2 rather than the
0.0339 of the definition, one from neither, and one lost a digit to a
decimal comma. They are registered, and the four in doubt serve nothing.
* The nonlinearity parameter of solids
Rossing's Table 6.5 gives the ultrasonic beta of eight solids at room
temperature, averaged over the pure-mode directions of a cubic crystal.
It is the page's own beta, -(3 + K3/K2), which for a liquid is B/A + 2
and not B/A, and the module and the catalogue page say so. Five rows are
structures rather than materials; the misspelt Flourite is kept as
printed and registered.
* Carpets after the absorption areas, and what the page says of fibre
The carpets section split the absorption section from its areas and the
finder cut it at the wrong heading. The chapter's own text says the type
of fibre makes no significant difference, and the prose now says so.
The one carpet printed with a wood fibre carries a note pointing at its
wool twin in Table 30.3.
* The catalogue filter matches every word column the table shows