Products Environment and mobility

AERMOD

Atmospheric dispersion modelling for air permits

Dispersion results for permits, with meteorology and receptors on record.

AERMOD estimates ground-level concentrations of air pollutants near a source, and regulators accept it for permitting. GraphAtlas wraps the EPA reference implementation so results match the regulatory model, records every meteorological and terrain input, and shows each receptor against the standard.

Try the calculation Request a walkthrough

Regime
40 CFR Part 51, Appendix W
Set by
  • United States Environmental Protection Agency
Built for
  • Environmental consultancies
  • Industrial operators
  • Permitting authorities
Version
2.5
The plume of an example stack seen from the side, and the concentration that it makes at the groundThe side of the plume of an example stack 60 metres tall: the middle of the plume rises to 229 metres over the top of the stack, which is the limit that its buoyancy sets, and the lower edge of its spread comes down to the ground. Under it is the concentration at the ground along the same distance, which is highest at 2,917 metres from the stack, at 39.6 micrograms per cubic metre. A tag says that the parameters are illustrative.SIDE OF THE PLUME229 MCONCENTRATION AT THE GROUND39.6 µg/m³2,917 MILLUSTRATIVEENGINEAERMOD V2.5SET BYUS EPADATASAMPLERECEIPT7f0ac7a4 The plume of an example stack seen from the side, and the concentration that it makes at the groundThe side of the plume of an example stack 60 metres tall: the middle of the plume rises to 229 metres over the top of the stack, which is the limit that its buoyancy sets, and the lower edge of its spread comes down to the ground. Under it is the concentration at the ground along the same distance, which is highest at 2,917 metres from the stack, at 39.6 micrograms per cubic metre. A tag says that the parameters are illustrative.SIDE VIEW229 MAT THE GROUND39.6 µg/m³2,917 MILLUSTRATIVEENGINEV2.5DATASAMPLERECEIPT7f0ac7a4

Try it

Run it on sample data

Change the stack, the gas or the wind and watch the plume and the highest value at the ground move. Try stable air, which carries the plume far, and unstable air, which brings it down close. Then choose a standard in the second figure and move the receptor. The same hours give one answer as a monitor keeps them and another as a model is compared, and the figure shows where they part.

Fig. 1 A plume from an illustrative stack, in the air and on the ground

Verifying receipt

The stack

m
K
The air is 288.15 kelvin, which is 15 degrees.

The hour

m/s

Class C, slightly unstable. Air mixes a little more than it does in neutral weather, so the plume comes down a little nearer than it otherwise would.

The receptor

m

The stack is 2.5 m across, the gas leaves it at 15 m/s and it gives off 100 g/s of one pollutant. The air is at 15 degrees. None of that changes here.

Highest concentration at the ground

39.6 µg/m³

at 2.92 km downwind of the stack, on the line down the middle of the plume. For one hour of this weather.

Height above ground, m0200400600800Downwind, m →Concentration at the ground, µg/m³0204060highest 39.601,5003,0004,5006,0007,500receptor, 2.5 km
Heights are stretched to be readable, so this is not to scale. The line is the middle of the plume and the band is one spread either side of it. The curve is the concentration at the ground on the line down the middle. The dot on the curve is its highest value and the line across is the receptor.
Plume rise
229 m
Plume height
289 m
Spread across
255 m
Spread upward
176 m
At the ground
38.5 µg/m³
Wind at the top
4.8 m/s
Buoyancy flux
82.7 m4/s3
Momentum flux
225.1 m4/s2
The rise stops at
229 m, from equation 2.25 of the Handbook for unstable and neutral air
The same stack and wind in each stability class
ClassHighest at the groundWhereRelative size
206 micrograms per cubic metre378 m
89.9 micrograms per cubic metre754 m
39.6 micrograms per cubic metre2.92 km
18.8 micrograms per cubic metre9.75 km
38.1 micrograms per cubic metre6.12 km
9.30 micrograms per cubic metre10 kmedge of the range

A taller stack or a hotter gas puts the highest value farther away and lowers it. Stable air carries the plume far, so for classes E and F the highest value is often at the farthest distance that the formulas hold for.

Receipt7f0ac7a4 8e3962c9 … df00a6ed

Change the stack or the hour. The formulas run in this page and nothing leaves it.

Fig. 2 Five illustrative years of hours, read as a monitor reads them and as a model is compared

Verifying receipt

The standard

PM2.5, 24-hour. 35 µg/m³ as the 98th percentile of the days of a year, averaged over three years.

The source and the receptor

m
m
degrees, ENE
Degrees clockwise from north, from the stack to the receptor. It lies toward the east-northeast.
µg/m³

The weather is five years of hourly records made from a seed, 43,824 hours in all. Nobody measured it. The stack gives off 150 g/s, and the background is added to every hour.

As a monitor reads it

35 µg/m³

Meets the standard of 35 µg/m³

Design value for 2021 to 2023, the window that a network reports now. Earlier windows gave 36 for 2019 to 2021 (exceeds) and 36 for 2020 to 2022 (exceeds).

Appendix N. Each hour is cut off at a tenth and each day is the mean of its hours, cut off at a tenth again. A year gives its eighth highest day. The three years are averaged and rounded to a whole number.

The three values add up to 105.3 µg/m³. They may add up to 106.4 at most. AE-05 proves that edge.

As a model is compared

35.18 µg/m³

Exceeds the standard of 35 µg/m³

Mean of all 5 years, 0.18 over the level.

Appendix W, 9.2.2. Nothing is rounded. A year gives the same eighth highest day, and the five years are averaged.

The same weather meets the standard as a monitor reads it and exceeds it as a model is compared. Appendix W says that a modelled concentration should not be rounded before it is compared.

Each year of the illustrative weather, as a model takes it and as a monitor keeps it
YearTakenAs a modelAs a monitor
20198th highest day, 23 Jul8th highest day, 23 Jul34.55 µg/m³34.5 µg/m³
20208th highest day, 13 Aug8th highest day, 13 Aug35.77 µg/m³35.7 µg/m³
20218th highest day, 23 Sep8th highest day, 23 Sep37.31 µg/m³37.2 µg/m³
20228th highest day, 1 Jun8th highest day, 1 Jun34.37 µg/m³34.3 µg/m³
20238th highest day, 31 Dec8th highest day, 31 Dec33.90 µg/m³33.8 µg/m³

Values are in µg/m³. A year is read twice, from the same hours. A monitor keeps every hour and every day in whole tenths and never reads above a model, by less than 0.2 for a mean and 0.1 for a highest hour. The proof is AE-03.

5%10%15%NESW
Where the plume goes, in sixteen sectors, as a share of the hours. The diamond is the receptor. The dot in the middle is the stack. The receptor lies toward the east-northeast (ENE). The plume goes that way in 14.3% of the hours.

The highest hour in five years

132 µg/m³

19 May 2023, the hour from 13:00. The wind blew from 251° (WSW) at 11.5 m/s at ten metres, in class D, so the plume headed for 71°, 1° from the receptor.

The figure includes a background of 22.5 µg/m³. One hour does not decide a standard, but every other figure here is built from hours like it.

The day taken, checked a second way

The engine sorts the 365 days of 2023 and takes number 8 from the top. The check sorts nothing. It counts the days above the value it is given and the days at or above it, and accepts it when fewer than 8 are above and at least 8 are at or above.

Receipt3456ee92 1a3107db … 0bf4aa50

Move the stack, the receptor or the standard. The five years run in this page and nothing leaves it.

Inputs and outputs

What goes in. What comes out

The plate runs a slice of the engine. This is the whole shape of it.

What goes in

Stack
Height, inside diameter, exit speed and exit temperature of the gas, and the emission in grams per second.
Meteorology
Hourly wind speed and direction, temperature and stability class for the years that the standard asks for. The product takes them from the output of AERMET. The plate uses five illustrative years from a seed.
Receptors
The places where a concentration is wanted, each with its distance, its bearing and its height. The plate has one.
Background
What other sources already put in the air, added to each hour. It is yours to supply, and the permitting authority often agrees it with you.
Standard
The pollutant, the averaging time and the form that each receptor is compared with, such as the 98th percentile of the 24-hour mean of PM2.5.

What comes out

Concentration at each receptor
For every hour of the record, in micrograms per cubic metre.
Design value as a monitor keeps it
The daily numbers, the rank or the mean that the standard asks for, cut off and rounded as its appendix says, for each window of three years.
The same hours as a model is compared
The same record with nothing rounded, set against the level, with the margin that is left.
Highest hour
The hour of the record with the highest total, with the wind, the direction and the class that it came with.
Receipt
A hash of the inputs, the tables, the rounding and the numbers. Anyone can recompute it.

What the plate covers

In the plate above

  • A textbook Gaussian plume for one stack, with Briggs rise and open-country spread, in each of the six stability classes and from 100 m to 10 km.
  • Five illustrative years of hourly weather, made from a seed, so that the same hours are in your browser, on the server and in the proofs.
  • The levels and the forms of four standards in 40 CFR Part 50, with the rank tables and the rounding of Appendices K, N and T.
  • The same hours read two ways, as a monitor keeps them and as Appendix W says that a modelled number is compared, with a proof of where the two rules part.
  • A second routine that checks the day taken against the days of the year without sorting them, and a button that claims a day that is wrong.

In the licensed engine, not the plate

  • AERMOD itself. The product runs the program of the EPA. The plate runs a simpler plume to show the rules around its numbers, so its numbers are not a model result and are no use for a permit.
  • Building downwash, terrain, the lid of the mixing height, convective plumes, towns and the boundary layer scaling that make AERMOD what it is.
  • Real weather. AERMET, the surface and upper-air records that it reads and the checks that a year of them is complete enough.
  • The tests of completeness in the appendices, which decide whether a monitor year counts at all, and the exclusion of exceptional events. Every illustrative hour is present.
  • Many sources and many receptors, and the steps of a permit analysis that are not arithmetic, such as the choice of background and the agreement of a protocol.

Clause map

Every rule has an address

Each row names the clause, the function that carries it and the statements that check it. A test opens each file and confirms the function exists.

Rules of the regulation, the code that carries each one and the statements that check it
Reference Rule Carried by Checked by
Handbook on Atmospheric Diffusion, Table 4.5 The spread of a plume across the wind and upward grows with distance, in a form that depends on the stability class. The open-country rows hold from 100 m to 10 km. sigmaY src/kernel/aermod.ts Proved AE-02 Tested AE-07
SCREEN3 User’s Guide, Equations 5 and 7 The buoyancy flux is g × v × d² × (Ts − Ta) / (4 Ts) and the momentum flux is (Ta / Ts) × v² × (d / 2)², for a gas at speed v and temperature Ts leaving a stack of diameter d into air at Ta. fluxes src/kernel/aermod.ts Tested AE-08
AERMOD Model Formulation, Equation 91 The rise of the plume is the cube root of 3 Fm x / (b² u²) + 3 Fb x² / (2 b² u³), with the momentum flux Fm, the buoyancy flux Fb, the distance x, the wind at the stack u and the entrainment parameter b = 0.6. riseAt src/kernel/aermod.ts Tested AE-08
Handbook on Atmospheric Diffusion, Equations 2.19 and 2.25 The rise stops at the final rise of Briggs. In the stable classes E and F that is 2.6 × (F / (u s))^(1/3), and in the others 1.54 × (F / (u u*²))^0.6 × h^0.4, with the stability parameter s, the friction velocity u* and the height h of the stack. plumeSetup src/kernel/aermod.ts Tested AE-08
Handbook on Atmospheric Diffusion, Equation 4.9 and Table 4.6 The wind at the height of the stack is the wind at ten metres times (height / 10) to a power that depends on the class, from 0.07 in A and B to 0.55 in F. It stops growing at 200 m and is never below 0.5 m/s. windAtHeight src/kernel/aermod.ts Tested AE-09
Handbook on Atmospheric Diffusion, Equation 4.1 At the ground, the plume and its image in the ground add to Q / (π u σy σz) × exp(−y² / 2σy²) × exp(−H² / 2σz²), with the emission Q, the height H of the middle of the plume and the distance y across the wind. plumeAt src/kernel/aermod.ts Tested AE-10
SCREEN3 User’s Guide, Equation 8 Rise spreads the plume as well as lifting it. Each spread has the rise divided by 3.5 added to it in squares. Equation 88 of the AERMOD formulation has 0.4 over the square root of 2 where this has 1 over 3.5, which is about one per cent less. plumeAt src/kernel/aermod.ts Tested AE-08 Tested AE-10
Rule of this product, the highest value The highest concentration at the ground is the highest of 400 distances at an equal ratio from 100 m to 10 km, refined between the neighbours of the best, and the figure says when it falls at the end of the range. plume src/kernel/aermod.ts Tested AE-11
Handbook on Atmospheric Diffusion, Table 4.1 By day the class follows the wind and the strength of the sun, from A in strong sun and a light wind toward D as the wind rises or the sun weakens. At night it follows the wind and the cloud, from F in a clear sky and a light wind toward D as the wind rises. weather src/kernel/aermod.ts Tested AE-12
Rule of this product, the calendar A leap year has 366 days. The quarters of an ordinary year have 90, 91, 92 and 92 days, and the first of a leap year has one more. quarterOf src/kernel/aermod.ts Tested AE-13
40 CFR Part 50, Appendices N and T, Table 1 The highest day of a year that stands for the 98th percentile, or the 99th, is read from a table by the number of days with a valid value. The rank is the nearest above the percentile, so it is the number of days divided by 50 or by 100, rounded up. rankFor src/kernel/aermod.ts Proved AE-01 Tested AE-14
40 CFR Part 50, Appendix N, the annual mean The annual mean is the mean of the four quarterly means, so a quarter counts the same however many days it has. annualMean src/kernel/aermod.ts Tested AE-14
40 CFR Part 50, Appendices N and T, the values that a monitor keeps An hour is cut off at a tenth of a unit. A day is the mean of its hours, cut off at a tenth again, or for sulfur dioxide the highest hour. A monitor therefore reads a day below the true value and never above it. dayAsMonitor src/kernel/aermod.ts Proved AE-03 Tested AE-18
40 CFR Part 50, Appendices N and T, the design value A design value is the mean of three yearly values, rounded half up to the places of the standard: whole micrograms for the 24-hour PM2.5 standard and for sulfur dioxide, and a tenth for the annual PM2.5 standard. roundExact src/kernel/aermod.ts Proved AE-05 Tested AE-15
40 CFR Part 50, Appendix K, Equations 1 to 3 and Examples 1 to 3 The expected number of PM10 exceedances of a year adds the estimate of each quarter, rounded to a hundredth, and rounds the sum to a tenth. A quarter with extra samples is scaled by the strata that it has. expectedExceedances src/kernel/aermod.ts Tested AE-16
40 CFR Part 50, Appendix K, rounding a day A day of PM10 is rounded to the nearest 10 before it is compared with 150, so a day counts as an exceedance from 155. exceedanceEdge src/kernel/aermod.ts Proved AE-04
40 CFR 50.6, 50.17 and 50.20 PM2.5 has a 24-hour level of 35 µg/m³ for the 98th percentile and an annual level of 9.0 µg/m³ for the mean. PM10 has a level of 150 µg/m³ that may be exceeded once a year on average. Sulfur dioxide has a level of 75 ppb for the 99th percentile of the daily highest hour. FORMS src/kernel/aermod.ts Tested AE-17
40 CFR Part 51, Appendix W, Section 9.2.2 A modelled concentration should not be rounded before it is compared with the level. It is added to a background and set against the level as it stands. designRun src/kernel/aermod.ts Tested AE-19 Tested AE-20
Rule of this product, the receptor In each hour the receptor is placed along the wind and across it from its bearing and the direction of the wind. It gets nothing upwind, nothing across the wind and nothing nearer than the spread formulas hold for. modelHours src/kernel/aermod.ts Tested AE-21
Rule of this product, the check of a day A day is accepted as the nth highest of a year when fewer than n days are above it and at least n are at or above it. The check sorts nothing and does not read the engine. checkNthHighest src/kernel/aermod.ts Certified AE-06
Rule of this product, the same bits everywhere The cube root and the sine and cosine in degrees are written out, so that a receipt made in one engine is the same in every other. The platform library is not used for them. cbrt src/kernel/dmath.ts Tested KE-04
Receipt of a design run The receipt covers the input, the levels, the rank tables, the seed of the weather and every number that the figure shows. It is the same for the same input and changes when any input moves. designReceiptPayload src/kernel/aermod.ts Tested AE-22

Verification

What we claim, and how it is checked

Every statement is registered, and each says which level of assurance it has earned. The ladder is explained on the verification page.

Proved

True for every input.

  • AE-01

    For every number of days with data in a year, from 1 to 366, the rank that Table 1 of Appendix N gives for the 98th percentile is the smallest whole number that is at least 2 per cent of the days, and the rank that Table 1 of Appendix T gives for the 99th percentile is the smallest whole number that is at least 1 per cent of them. Every count of days has a rank, and more days never lower it.

    8 checks, decided by Z3 5.3.3.0 (WebAssembly) and rerun from the emitted file by Z3 5.3.3 (native) and cvc5 1.4.2 (native, nl-cov). 5 broken variants are refuted. proofs/smt2/AE-01.smt2

  • AE-02

    In every stability class both spreads of the plume grow with the distance downwind, from 100 m to 10 km. At every distance the spread of a more stable class is smaller than that of the class before it, both across the wind and upward.

    22 checks, decided by Z3 5.3.3.0 (WebAssembly) and rerun from the emitted file by Z3 5.3.3 (native) and cvc5 1.4.2 (native, nl-cov). 5 broken variants are refuted. proofs/smt2/AE-02.smt2

  • AE-03

    A day read as a monitor network keeps it is never above the same day read as a model takes it. It is below it by less than 0.2 for a mean of 24 hours and by less than 0.1 for the highest hour. The network cuts each hour off at a tenth and then cuts the mean of those off at a tenth again.

    4 checks, decided by Z3 5.3.3.0 (WebAssembly) and rerun from the emitted file by Z3 5.3.3 (native) and cvc5 1.4.2 (native, nl-cov). 3 broken variants are refuted. proofs/smt2/AE-03.smt2

Show the other 2 Show fewer
  • AE-04

    A daily value of PM10 that a monitor keeps in tenths is an exceedance of a level exactly when it is at least 5 below the next multiple of 10 above the level, so for the level of 150 it is an exceedance from 155.0 on. A day from 150.1 to 154.9 is above the level and is not counted, and every day that is counted is above the level.

    4 checks, decided by Z3 5.3.3.0 (WebAssembly) and rerun from the emitted file by Z3 5.3.3 (native) and cvc5 1.4.2 (native, nl-cov). 4 broken variants are refuted. proofs/smt2/AE-04.smt2

  • AE-05

    A design value that is the mean of three values and is rounded half up as Appendices N and T say is at most the level exactly when the three add up to at most 1064 tenths for the 24-hour PM2.5 level of 35, which holds for values kept in whole tenths, and at most 2264 for the 1-hour SO2 level of 75 ppb. The annual mean is at most 9.0 exactly when the three annual means, which need not be whole tenths, add up to less than 27.15. For PM10 the design value is at most 1.0 exactly when the three yearly counts of days add up to at most 3.

    4 checks, decided by Z3 5.3.3.0 (WebAssembly) and rerun from the emitted file by Z3 5.3.3 (native) and cvc5 1.4.2 (native, nl-cov). 2 broken variants are refuted. proofs/smt2/AE-05.smt2

Certified

True for the case in hand, with evidence anyone can recheck.

  • AE-06

    The day that the engine takes as the highest, the second highest or the nth highest of a year is accepted by a second check that sorts nothing. It counts the days above the value and the days at or above it. It refuses a value that is not at the place the engine names, and a rank that the year does not have.

    tests/kernel/aermod.test.tssrc/kernel/aermod.ts

Tested

True on every input we tried.

  • AE-07

    The spread of the plume across the wind and upward is the open-country row of Table 4.5 of the Handbook on Atmospheric Diffusion for each class. The engine gives the values that the formulas give at 100 m, 1 km and 10 km, and refuses a distance outside 100 m to 10 km, which is the range the table holds for.

    tests/kernel/aermod.test.ts

  • AE-08

    The rise of the plume follows equation 91 of the AERMOD formulation, in which a momentum term and a buoyancy term are added under a cube root. It starts from nothing, never falls and stops at the limit of the Handbook, which is equation 2.25 in the unstable and neutral classes and equation 2.19 in the stable ones. A gas no warmer than the air, a wind below calm and a stack outside the range are refused.

    tests/kernel/aermod.test.ts

  • AE-09

    The wind at the height of the stack is the wind at ten metres raised by the power that Table 4.6 gives for the class. It stops growing at 200 m and never falls below calm, which is 0.5 m/s.

    tests/kernel/aermod.test.ts

Show the other 13 Show fewer
  • AE-10

    The concentration at the ground is equation 4.1 of the Handbook with the plume and its image added, and it matches that equation worked independently, on the axis and off it. The plume carries the whole emission through every plane across the wind, which a numerical sum confirms. It is proportional to the emission, highest on the axis, equal on either side of it and nothing far to the side.

    tests/kernel/aermod.test.ts

  • AE-11

    The curve of the figure lies on 400 distances at an equal ratio from 100 m to 10 km. Its maximum is the one that an independent search finds, in every class, and no point of the curve or neighbour of it is higher. In the classes C and D a taller stack, from 30 m to 120 m, gives a lower maximum when the wind at the stack is the same.

    tests/kernel/aermod.test.ts

  • AE-12

    The illustrative weather is five years of hourly records made from a seed, 43,824 hours with the leap day of 2020. The same seed gives the same weather and another seed gives another. Every record is in the range of what it means, and stable classes come at night and unstable ones only by day, as the key of Table 4.1 says. It looks like weather, with a mean wind near 4 m/s, every class present, neutral the most common, one prevailing wind, and harder wind in winter and in the afternoon.

    tests/kernel/aermod.test.ts

  • AE-13

    The calendar knows the leap years and names every day of every year, so that each day follows the one before it. It refuses a day that the year does not have. It puts 90, 91, 92 and 92 days in the quarters of an ordinary year, and one more in the first quarter of a leap year.

    tests/kernel/aermod.test.ts

  • AE-14

    The rank tables are Table 1 of Appendices N and T, row by row. They cover every count of days from 1 to 366 once, and give the nearest rank above the percentile. The nth highest of a list agrees with sorting, and of equal values it takes the one that comes first. The annual mean is the mean of the quarterly means, so a quarter counts the same however many days it has.

    tests/kernel/aermod.test.ts

  • AE-15

    A number is read as the decimal that prints for it, so that a value such as 1.005 is cut off or rounded by its digits and not by the binary number below them. Cutting off and rounding half up agree with whole-number arithmetic on every decimal with up to five places. A fraction is rounded half up exactly, with no drift on a tie.

    tests/kernel/aermod.test.ts

  • AE-16

    The expected number of PM10 exceedances reproduces Examples 1, 2 and 3 of Appendix K, from the 2.36 of the first to the 2.19 of the third. A quarter or a year that lands on a tie rounds up, the sums agree with a whole-number formula on every quarter given, equation 3 reduces to equation 1 when each stratum has one sample, and the rate 1.05 rounds to 1.1.

    tests/kernel/aermod.test.ts

  • AE-17

    The four forms carry the levels of 40 CFR Part 50. They are 35 and 9 micrograms per cubic metre for PM2.5, 150 micrograms per cubic metre with one expected exceedance a year for PM10, and 75 parts per billion for sulfur dioxide. A name that is not a form is refused.

    tests/kernel/aermod.test.ts

  • AE-18

    The proofs about a day, an exceedance and a design value are about the formulas that the engine runs. A day read by a monitor is below the model by less than two tenths for a mean and one tenth for a highest hour, and never above it. A day of PM10 is an exceedance from 155. A mean of three values kept in tenths is rounded as the whole-number formula does.

    tests/kernel/aermod.test.ts

  • AE-19

    Worked cases, each made by hand, show where a monitor and a model part. A day of 35.37 is 35.3 to a monitor and a design value of 35 that meets the standard, and a model reads it as over. The hour 35.49999 stays 35.4 for a monitor, and 35.5 gives 36. The annual form rounds to a tenth and the model rounds nothing. Sulfur dioxide becomes parts per billion and takes the highest hour of each day. The counts of three years are averaged and rounded to a tenth, and the peak hour keeps the weather it came in.

    tests/kernel/aermod.test.ts

  • AE-20

    Over the five years the engine gives a row for every year and a window for every three. The day it takes in a year is the one that an independent sort puts at the rank of the table. A monitor never reads above a model, and by less than the cutting off at a tenth can take, and never counts more days of PM10. The value of the model is the mean of the years, the peak is the highest hour of the record, and moving the background moves a model by exactly that much. The defaults start where the figure starts, with a monitor reading 35 where the model reads just over it.

    tests/kernel/aermod.test.ts

  • AE-21

    A receptor is placed in the plume at its along-wind and cross-wind distance in every hour. Straight downwind it gets the plume of the equation. It gets nothing upwind, nothing crosswind and nothing nearer than the spread formulas hold for, and a bearing or distance that is not valid is refused. The wind rose puts a steady wind from the west-southwest in the sector toward the east-northeast.

    tests/kernel/aermod.test.ts

  • AE-22

    The receipt of a plume and the receipt of a design run are the same for the same input and different when any input moves. Running a design again changes nothing.

    tests/kernel/aermod.test.ts

Read the verification statement

Use it

The same call, anywhere

This sample is written from the input the plate starts with, so the code and the numbers cannot drift apart.

Call
import {
  defaultWeather,
  designInput,
  designReceiptPayload,
  designRun,
} from '@graphatlas/kernel/aermod';
import { receipt } from '@graphatlas/kernel/receipt';

// Five years of hourly weather that nobody measured, made from the seed 20190101.
const met = defaultWeather();

// The PM2.5, 24-hour standard, a stack of 60 m, a receptor 2500 m away at a bearing
// of 70 degrees, and 22.5 µg/m³ that is already in the air.
const input = designInput('pm25-24h', {
  stackHeight: 60, distance: 2500, bearing: 70, background: 22.5,
});

const result = designRun(input, met);
const hash = await receipt(designReceiptPayload(result));
Returns
const out = {
  years: [
    { year: 2019, rank: 8, day: 204, model: 34.5542, monitor: 34.5 },
    { year: 2020, rank: 8, day: 226, model: 35.7725, monitor: 35.7 },
    { year: 2021, rank: 8, day: 266, model: 37.3136, monitor: 37.2 },
    { year: 2022, rank: 8, day: 152, model: 34.3653, monitor: 34.3 },
    { year: 2023, rank: 8, day: 365, model: 33.8951, monitor: 33.8 },
  ],
  windows: [
    { from: 2019, to: 2021, mean: 35.8, value: 36, meets: false },
    { from: 2020, to: 2022, mean: 35.7333, value: 36, meets: false },
    { from: 2021, to: 2023, mean: 35.1, value: 35, meets: true },
  ],
  model: { mean: 35.1801, meets: false },
  peak: { year: 2023, day: 139, hour: 13, value: 132.1986, stability: 'D' },
  receipt: '3456ee921a3107dbf92974b63aea8233129f08899cc30505498d61c30bf4aa50',
};

The call and the numbers come from the engine that built this page, run on the same input as the plate above. A year gives the rank and the day of the table when the standard asks for one, and a mean or a count when it does not. The weather is the same on every machine, and a design value from it says nothing about any place. Values are rounded to four places for display. The receipt hashes the unrounded numbers.

Runs on

  • Browser
  • Edge
  • Node.js
  • Python
  • JVM
  • .NET
  • Excel
  • Command line
  • Container

Green surfaces are measured on every build of this site. Each must return the same receipt, bit for bit. The others are packaged targets that the build does not measure. How the platform works

Changes

When the rule moves, so does the engine

Publications that touch this regime, and the release that answered each.

  1. US EPA Final text

    New AERMOD modelling system release with updated meteorological preprocessing

    Shipped as AERMOD 2.4, 9 days later

Open the full feed

The next step

Bring us
one book

A scoping call, a sample book and a parallel run on your data. Most teams have the first reconciled number inside two weeks, and a receipt for it on the day.

Book a demo Work out a price