StikstofNu · Onderzoek · Dit is een Nederlandse vertaling van het onderzoeksrapport; de Engelse editie is de referentie.

AERIUS ontrafeld: een technische review op codeniveau van het Nederlandse rekensysteem voor stikstofdepositie (release 2026.0.0)

Versie 4.2, gepubliceerd . Door StikstofNu.

SHA-256-controlesom van het bronpaper van deze editie: 17603edfd2ba3797be81a91cedc35999eb7b3d0d288e862bd807673816b37546

Taal en referentie-editie. Dit is een Nederlandse vertaling van het paper "AERIUS deconstructed" (versie 4.2, 2026-10-30). De Engelse tekst op https://stikstofnu.nl/onderzoek/aerius-deconstructed is de referentie-editie; bij verschil of twijfel gaat de Engelse tekst voor, en de citatieregel in Bijlage B verwijst naar die Engelstalige referentie-editie. De vertaling is gemaakt met machinale hulp en is nog niet beoordeeld door een Nederlandse moedertaalspreker. Getalnotatie: in de Nederlandse tekst en tabellen staan getallen in Nederlandse notatie (decimale komma, duizendtallen gescheiden door een vaste spatie, bijvoorbeeld 55 977 en 0,00499999); de Engelse notatie (punt als decimaalteken) blijft staan binnen codefragmenten, identifiers, URL's, aanhalingen, versie- en paragraafnummers en gegevens die letterlijk uit bestanden zijn overgenomen, zoals de waarden in de tabel met sleutels van het OPS-controlebestand (paragraaf 5.5). Waarden die AERIUS zelf met een decimale komma toont, zoals 0,00, 0,005 en 0,01, staan er ongewijzigd. Verder zijn de getallen zelf, de tabellen, de identifiers, de bewijslabels, de codefragmenten en de URL's ongewijzigd overgenomen. Aanhalingen uit bronnen staan in de oorspronkelijke taal.

Dit paper is het eerste van de aerius-research-reeks.

Versie 4.2, 2026-10-30 (openbare editie, zie de editienotitie hieronder). Vastgezette upstream-versies: gitlab.com/AERIUS/AERIUS@fb8812fd74f9 ("Release 2026.0.0", 2026-10-06), aerius/IMAER-java@ecdc81b0f1e2, aerius/IMAER@f2a401b3eff2 (IMAER 6.0.2), rivm-syso/OPS@e62fdf721d67 (OPS-LT 5.3.1.0), rivm-syso/DepAC@fef2266568b8, en 34 andere repositories van de GitHub-organisatie aerius (Tabel 2 en Bijlage A).

Onafhankelijkheid en gebruik van namen. Dit is onafhankelijk onderzoek naar gepubliceerde broncode. De auteur heeft geen banden met AERIUS, het RIVM, het ministerie van Landbouw, Visserij, Voedselzekerheid en Natuur (LVVN) of BIJ12, en het werk is niet door hen opgedragen of beoordeeld. AERIUS is de naam van het rekeninstrument voor stikstofdepositie van de Nederlandse overheid; de naam wordt hier alleen gebruikt om het onderzochte systeem aan te duiden, en er wordt geen verbondenheid gesuggereerd. Niets in dit paper vervangt een officieel resultaat van AERIUS Calculator. Belangenconflict: het onderzoek is ingegeven door een afnemende rekendienst die AERIUS Connect gebruikt (voetnoot 1, hoofdstuk 10), en de Connect-batch van paragraaf 3.5 is uitgevoerd met de productiesleutel van die dienst.

Editienotitie. Dit is de openbare editie van dit paper. Het is de tekst van versie 4.2 met deze wijzigingen: verwijzingen naar werkbestanden van het onderzoeksmateriaal zijn vervangen door gewone beschrijvingen of weggelaten; exacte locatiecoördinaten worden achtergehouden; tien bevindingen die beveiligingseigenschappen van een openbare dienst betreffen, of die niet te onderscheiden zijn van of overlappen met zulke bevindingen, maken geen deel uit van deze editie, samen met de details over endpoints, limieten en run-waarnemingen die een lezer in staat zouden stellen ze te reconstrueren; en er zijn een editienotitie met een wijzigingslijst, een woordenlijst en twee bijlagen (vastgezette repositories, data en materialen) toegevoegd. De nummers van de bevindingen volgen de nummering van de volledige versie, dus de reeks heeft hiaten, en de aantallen bevindingen volgen uit het weglaten.

Wijziging van versie 4.1 naar versie 4.2, 30 oktober 2026:

  • Samenvatting en het antwoord op RQ5: de omslagkans uit de Monte Carlo van bevinding F9 staat nu per gesimuleerde trekking, 225 van de 1 560 000 trekkingen, 1,44 per 10 000 trekkingen. Versie 4.1 gaf haar per hexagoon, maar de noemer is het aantal gesimuleerde trekkingen, niet het aantal hexagonen. Geen ander resultaat, getal of bevinding is gewijzigd.

Wijzigingen van versie 4 naar versie 4.1, die de openbare editie hier vermeldt omdat de volledige versie ze aan het eind opsomt:

  • Paragraaf 8.2 en het antwoord op RQ4: de verhouding van de depositie per kilogram van K07 en K08 ten opzichte van K01 (versie 4: 1,26 tot 1,84 keer op de 488 receptoren binnen 10 km) liet zich niet uit de run-data reproduceren. Zij is vervangen door waarden die receptor voor receptor opnieuw zijn berekend en per afstandsklasse worden gegeven (klassen van 1 km van 11 km tot 15 km).
  • Samenvatting: "vrijwel geheel openbaar" is vervangen door een vermelding van wat openbaar is (applicatiecode, modelcode, modeldatapakketten). Alleen in deze editie draagt de vermelding dat de inhoud van de productdatabase gesloten is de woorden "(zie erratum)".
  • Kernresultaten: de regels die de uitkomst bepalen staan in openbare code, en de invoer die ze voedt is deels gesloten.
  • Meteorologische periode (samenvatting, kernresultaten, Tabel 1, paragraaf 2.3, F22, conclusie): "onjuist" en "weerspreekt" zijn vervangen door "wijkt af van"; in F22 is "de weergave weerspreekt de beslissing" vervangen door "de weergave wijkt af van de beslissing".
  • Paragraaf 7.3: de gebruiksvoorwaarden van OPS worden per artikel weergegeven; "alleen te verkrijgen door registratie" werd "de voorwaarden bepalen dat het gebruiksrecht wordt verkregen door registratie"; de mededeling dat de kwestie vóór verspreiding bij het RIVM aan de orde wordt gesteld is verwijderd.
  • Melden: mededelingen dat bevindingen aan anderen worden gemeld zijn verwijderd; het paper doet geen toezegging over of en wanneer een bevinding wordt gemeld.
  • De zin dat AERIUS een in de Benelux geregistreerd merk is, wat niet was geverifieerd, is vervangen door een vermelding van nominatief gebruik.
  • Een erratumverwijzing na het kernresultatenkader vermeldt wat Paper 2 vond over gepubliceerde bronkenmerken van TNO en het RIVM; zij betreft de samenvatting, de kernresultaten, paragrafen 3.6, 7.2, 8.2, 8.3, 8.4 punt 3, de antwoorden op RQ3 tot RQ5, hoofdstuk 12 en elke andere uitspraak dat de emissiefactoren of bronkenmerken gesloten zijn, en zegt dat de vergelijking 11 van de 13 jobs omvat en een eerste en gedeeltelijke is. Paragrafen 3.6, 8.3, 8.4 punt 3, het antwoord op RQ4 en hoofdstuk 12 zeggen niet langer dat de replica nog niet vergeleken was of dat de bronkenmerken zonder voorbehoud gesloten zijn.

Samenvatting

AERIUS Calculator is het programma dat de Nederlandse regelgeving voorschrijft voor het berekenen van de stikstofdepositie van projecten op habitattypen in Natura 2000-gebieden. Wij beoordelen release 2026.0.0 op codeniveau: wij hebben 39 openbare repositories vastgezet, één berekening getraceerd van IMAER-invoer tot een depositiewaarde per hexagoon, de IMAER-bibliotheek, de AERIUS-modules voor OPS en SRM2 en OPS 5.3.1.0 gebouwd en getest, en 13 jobs ingediend bij de AERIUS Connect-productiedienst. De applicatiecode, de modelcode en de modeldatapakketten zijn openbaar. Emissies worden herberekend uit activiteitsgegevens; bouwemissies worden ingelezen als kg per jaar en IMAER heeft geen veld voor de duur, dus binnen één venster van 12 maanden telt alleen de totale emissie; receptoren zijn beperkt tot relevant habitat binnen 25 km; hexagonen nabij bronnen worden gemiddeld over 96 of 384 subreceptoren; OPS draait op meteorologie van 2014 tot 2023, terwijl het handboek voor gebruikers 2005 tot 2014 noemt; en een hexagoon telt mee wanneer de onafgeronde depositie hoger is dan 0,00499999 mol/ha/j. De inhoud van de productdatabase is gesloten (zie erratum); via Connect hebben wij een deel ervan gemeten, bijvoorbeeld 0,26 g NOx/kWh voor een Stage IV-machine en identieke factoren voor Stage V. Van zeven doorslaggevende regels zijn er vier gedocumenteerd, twee gedeeltelijk en één met een andere meteorologische periode. Deze editie meldt 15 van de 25 bevindingen van de volledige versie, onder meer een afrondingsfout in de middeling over subreceptoren. In een Monte Carlo-simulatie op echte OPS-subpuntvelden met illustratieve bronnen wijzigt die fout het oordeel over het totaal NOx + NH3 nabij de grens, in beide richtingen, in 225 van de 1 560 000 gesimuleerde trekkingen (1,44 per 10 000 trekkingen).

Kernresultaten

  • De regels die bepalen of een project "depositie veroorzaakt" zijn openbare code: een hexagoon telt mee wanneer de onafgeronde stikstofdepositie hoger is dan 0,00499999 mol/ha/j, en alleen relevant habitat binnen 25 km wordt berekend. De invoer die deze regels voedt is deels gesloten (zie de erratumverwijzing hieronder).
  • Wat niet openbaar is, is een deel van de inhoud van de database, vooral de emissiefactoren, die wij voor meerdere klassen hebben gemeten met 13 AERIUS Connect-jobs. Voor mobiele werktuigen en wegen bleken de bronkenmerken gepubliceerd (zie de erratumverwijzing hieronder).
  • Binnen één venster van 12 maanden kan de duur van bouwwerkzaamheden niet in de berekening doorwerken: IMAER heeft er geen veld voor en emissies worden ingelezen als kg per jaar, dus alleen de totale emissie telt. Bij langere werkzaamheden voert de gebruiker de emissie van de slechtste 12 opeenvolgende maanden in, en het samendrukken van de werkzaamheden kan het resultaat verhogen. (Twee jobs met dezelfde invoer gaven op elke receptor identieke resultaten; dat toont dat de dienst deterministisch is, het is geen toets van de duur.)
  • Het officiële handboek beschrijft de meeste regels juist, maar niet de exacte grenstoets, en de periode die het noemt voor de weergegevens (2005 tot 2014) wijkt af van die van de dataset die de code leest (2014 tot 2023).
  • Van de 15 bevindingen in deze editie is de belangrijkste een afrondingsfout die het oordeel voor hexagonen nabij de grens kan omdraaien, in beide richtingen op het totaal NOx + NH3 dat AERIUS toetst.

Erratumverwijzing (toegevoegd in versie 4.1, uitgebreid in de tweede ronde). Waar dit paper zegt dat emissiefactoren en bronkenmerken gesloten database-inhoud zijn, of dat een replica nog niet met Connect is vergeleken (samenvatting, kernresultaten, paragrafen 3.6, 7.2, 8.2, 8.3 en 8.4 punt 3, de antwoorden op RQ3 tot RQ5, hoofdstuk 12, en elke andere uitspraak dat de emissiefactoren of bronkenmerken gesloten zijn), vond Paper 2 van deze reeks (een werkversie, één locatie) dat deze waarden voor mobiele werktuigen en voor wegen zijn gepubliceerd: door TNO (een memo van 20 juni 2025 en een bijlage uit 2026, die ook de emissiefactoren van mobiele werktuigen geeft) en door het RIVM (het blad Standaard bronkenmerken 2026). Met de gepubliceerde set voor elke categorie reproduceerde een replica die de OPS- en SRM2-code van AERIUS aanroept de resultaten van Connect voor 11 van de 13 jobs van de batch van dit paper (D02 herhaalt D01 en P01 heeft geen receptorbestand) zonder enig verschil op de afgedrukte precisie van OPS, met de aarch64-build van OPS onder emulatie en gegeven de emissies en receptor-id's van Connect. Die vergelijking is een eerste en gedeeltelijke: negen van de 11 jobs geven onderscheiden vergelijkingsresultaten, geen enkele hexagoon lag binnen 300 m van een bron, en zij wijkt af van de methode van paragraaf 8.4 (paragraaf 2.3 van Paper 2 somt de afwijkingen op). Paper 2 toont dit niet voor andere brontypen, sectoren of locaties, dus de uitspraken van dit paper over gesloten inhoud blijven gelden voor al het overige.

Trefwoorden: AERIUS; stikstofdepositie; Natura 2000; OPS; SRM2; DEPAC; IMAER; broncodereview; reproduceerbaarheid; regelgevende software; open overheidscode.


1. Titel en afbakening

De titel, de versieregel, de samenvatting, het kernresultatenkader en de trefwoorden hierboven vormen paragraaf 1. Afbakening: het Nederlandse "OwN2000"-rekenpad (Omgevingswet Natura 2000) van AERIUS Calculator en AERIUS Connect bij release 2026.0.0. De Britse variant (ADMS, "NCA"), AERIUS Monitor, Register, GRIP en het luchtkwaliteitspad CIMLK worden alleen genoemd waar zij code delen met dat pad.


2. Inleiding

2.1 Wat AERIUS is

AERIUS is een familie van webapplicaties voor stikstofdepositie op Natura 2000-gebieden. De kernmonorepo beschrijft de runtime-stroom als een single-page-applicatie die een Connect-REST-dienst aanroept, die werk via RabbitMQ en een taskmanager doorzet naar een chunker en naar OPS-, SRM- en ADMS-modelworkers, met resultaten in een database en een bestandsserver en kaarten geserveerd door GeoServer (AERIUS@fb8812f:AGENTS.md:229-247). De producten in de gedeelde codebasis zijn onder meer Calculator (vergunningberekeningen), Connect (de machine-API), Monitor, Register en GRIP (geoserver-core@83bc6b4:src/site/apt/geoserver_aerius.apt:3-8; AERIUS@fb8812f:API/ noemt api-own2000, api-analysis, api-register, api-check, api-cimlk, hoofdstuk 6). Dispersie en depositie worden berekend met twee modellen: OPS-LT, het langetermijn-Lagrangemodel van het RIVM (OPS@e62fdf7:ops_lt/src/ops_lt_main.f90:27-36), en SRM2, een wegmodel dat AERIUS in Java implementeert (AERIUS@fb8812f:SJ/srm2/algorithm/SRM2Algorithm.java).

2.2 Juridische rol

Onder de Omgevingsregeling is AERIUS Calculator de methode voor het berekenen van stikstofdepositie bij het bepalen of een activiteit een Natura 2000-activiteit is (art. 4.15; art. 6.15 zegt hetzelfde voor activiteiten die door provinciale regels worden gereguleerd), en een aanvraag om een omgevingsvergunning voor een Natura 2000-activiteit moet, waar stikstofdepositie optreedt, een berekening met AERIUS Calculator bevatten (art. 7.197h, eerste lid, onder e) [R1, R2]. De eis in art. 7.197h geldt alleen voor die vergunning, niet voor andere typen vergunningen. De versie ligt vast in Bijlage II (art. 1.4); met ingang van 6 oktober 2026 heeft een regeling van de Minister van Landbouw, Visserij, Voedselzekerheid en Natuur die bijlage gewijzigd naar versie 2026, zonder overgangsrecht, zodat de nieuwe versie ook geldt voor aanvragen die nog in behandeling zijn [R3]. De wettekst zegt zelf niet "alleen"; AERIUS stelt dat vanaf die datum alleen versie 2026 mag worden gebruikt voor toestemmingsbesluiten [R4]. In een tussenuitspraak van 2 november 2022 (Porthos, ECLI:NL:RVS:2022:3159) heeft de Afdeling bestuursrechtspraak van de Raad van State de gedeeltelijke bouwvrijstelling (art. 2.9a Wnb met art. 2.5 Bnb) buiten toepassing gelaten wegens strijd met art. 6 van de Habitatrichtlijn, zodat depositie in de bouwfase weer project voor project moet worden beoordeeld [R5]. In een uitspraak van 5 april 2023 die voor één appellant einduitspraak is en voor de overige een tussenuitspraak (ViA15, ECLI:NL:RVS:2023:1299), oordeelde zij in het tussentijdse deel dat de minister de rekenafstand van 25 km mocht toepassen, omdat hij die afdoende had onderbouwd met rapporten van het RIVM en TNO en een deskundigenoordeel dat 25 km de grens is waarbinnen OPS wetenschappelijk betrouwbare uitspraken geeft over de depositie van een individuele bron [R6]. De wetteksten zijn op 22 oktober 2026 gelezen in de primaire bronnen: wetten.overheid.nl (versie in werking vanaf 6 oktober 2026), de Staatscourant en data.rechtspraak.nl.

2.3 Waarom een review op codeniveau ertoe doet

Drie redenen motiveren de review.

  1. Transparantie. Een berekening die beslist of een vergunning nodig is, heeft het karakter van een rechtsnorm. De regels (welke hexagonen meetellen, hoe waarden dicht bij een bron worden gemiddeld, waar de grens wordt toegepast) horen kenbaar te zijn. De meeste van deze regels worden in de officiële gebruikersdocumentatie beschreven, maar enkele doorslaggevende details niet: de exacte grensvergelijking, het ontbreken van enig tijdvenster voor kortdurende emissies, en de meteorologische periode, die het Handboek 2026 op 2005 tot 2014 stelt terwijl de code 2014 tot 2023 gebruikt (Tabel 1).
  2. Reproduceerbaarheid. Een vergunningberekening moet door een derde kunnen worden gereproduceerd: het bevoegd gezag, een bezwaarmaker, een gerechtelijk deskundige. Dat vereist dat het model, de modeldata en de invoer identificeerbaar en verkrijgbaar zijn (hoofdstukken 7 en 8).
  3. Productafhankelijkheid. Afnemende diensten dienen steeds vaker berekeningen in via AERIUS Connect. Hun juistheid hangt af van ongedocumenteerd gedrag zoals stille codeconversies en uitvoerformaten (hoofdstukken 6 en 10).

Tabel 1. Zeven doorslaggevende regels naast de officiële AERIUS-gebruikersdocumentatie voor 2026. Doorzochte documenten: Handboek werken met AERIUS Calculator 2026 [R10], Instructie gegevensinvoer [R13], release notes [R7], Handboek data, Actualisatierapport, Handreiking randeffecten 25 km [R15], Handreiking hersteldoel [R14], de FAQ van de productpagina en het nieuws van 2026.

Regel zoals geïmplementeerdCodeWaar gedocumenteerdGedocumenteerd?
Een hexagoon telt mee wanneer de onafgeronde depositie NOx + NH3 hoger is dan 0,00499999 mol/ha/j; weergave met twee decimalenAERIUS@fb8812f:DB/data/sql/nl-latest/permit_lower_bounds/load.sql:1-4; paragraaf 5.8Grens 0,005: [R10] paragrafen 2.2, 2.3, 7.5.2; twee decimalen: [R13] paragraaf 11.1.5. Niet gevonden: de waarde 0,00499999, de toets op het onafgeronde totaal, de strikte vergelijking. [R15] blz. 13, 15 zegt alleen dat resultaten "> 0,005" worden getoond, wat precies 0,005 zou uitsluiten, terwijl de code die meeteltGedeeltelijk
Bouwemissies worden ingevoerd en berekend als kg per jaar, zonder tijdvensterAERIUS@fb8812f:OJ/io/BrnFileWriter.java:173; paragraaf 5.10Invoer in kg/jaar: [R10] paragraaf 6.9; "de 12 opeenvolgende maanden met de hoogste depositie": [R13] paragraaf 2.3. Niet vermeld: dat de duur bij gelijke totale emissie alleen binnen één venster van 12 maanden geen effect heeftGedeeltelijk
OPS gebruikt de prognosechemie van 2030 voor elk rekenjaar vanaf 2024getPrognoseYear, AERIUS@fb8812f:OJ/io/ControlFile5300WriterUtil.java:47-60[R10] paragrafen 7.1.4 en 4.12Ja
Subreceptoren: 384 punten onder 150 m, 96 tot 300 m, uitsluiting op 20 m, overlap met habitat, rekenkundig gemiddelde, geen voor eigen rekenpuntenfindLevel, AERIUS@fb8812f:UT/receptor/SubReceptorLevelMap.java:46-63; paragraaf 5.4[R10] paragraaf 3.6, blz. 32 tot 35. Niet vermeld: de afronding van het gemiddelde (F9)Ja
Hexagonen met hersteldoel uitgesloten van de hoofdstatistieken en gerapporteerd in een aparte bijlageextra_assessment_hexagons, AERIUS@fb8812f:DB/main/sql/calculator_common/calculator/10-public/03-functions/02-project_calculation.sql:372,391-396; paragraaf 5.9[R14] paragrafen 1.4 tot 1.6; [R10] paragraaf 7.6.2 en bijlage 36Ja
Wegen: SRM2 binnen 5 km, OPS daarbuitenMAX_SOURCE_DISTANCE, AERIUS@fb8812f:SJ/srm/SRMConstants.java:59[R10] paragrafen 3.3 en 4.3Ja
Langetermijnmeteorologie van OPS m014123c (2014 tot 2023)AERIUS@fb8812f:OJ/io/ControlFile5300WriterUtil.java:30Meerjarige meteorologie: [R10] paragraaf 4.7, die de periode 2005 tot 2014 noemt. De periode 2014 tot 2023 wordt alleen door het RIVM voor OPS 5.3.1.0 genoemd [R8]Wijkt af (F22)

Van de zeven regels zijn er vier gedocumenteerd, twee gedeeltelijk en één met een periode die afwijkt van die welke de code leest. De ongedocumenteerde delen zijn smal maar doorslaggevend nabij de grens.

2.4 Onderzoeksvragen

  • RQ1 (architectuur). Wat zijn de componenten van AERIUS 2026.0.0, hoe zijn ze gebouwd en uitgerold, en hoe werken ze samen?
  • RQ2 (rekenketen). Hoe verloopt een berekening van een IMAER-GML-bestand tot een depositiewaarde per hexagoon, en welke regels bepalen het gerapporteerde resultaat?
  • RQ3 (openheid). Welke delen van code en data zijn openbaar, welke gesloten, en welke van onze uitspraken zijn afgeleid?
  • RQ4 (offline reproduceerbaarheid). In hoeverre kan een derde een AERIUS-resultaat offline reproduceren, en welke kalibratie is daarvoor nodig?
  • RQ5 (risico's en fouten). Welke fouten, risico's en afwijkingen van de documentatie vertoont de code?

2.5 Bijdragen

(i) Een vastgezette, citeerbare kaart van het systeem (hoofdstuk 4); (ii) de rekenketen met zijn constanten en codelocaties (hoofdstuk 5); (iii) een inventaris van openbare en gesloten data (hoofdstuk 7); (iv) een beoordeling van de reproduceerbaarheid, onderbouwd met builds, offline runs en 13 Connect-productiejobs, inclusief gemeten emissiefactoren (paragraaf 5.2 en hoofdstuk 8); (v) een regel-voor-regelvergelijking met de gebruikersdocumentatie (Tabel 1); (vi) 15 bevindingen met ernst en bewijs (hoofdstuk 9).


3. Methode

3.1 Corpus

Het corpus is elke openbare repository van de GitHub-organisatie aerius die op 2026-10-22 niet leeg was, de twee RIVM-modelrepositories en de AERIUS-kernmonorepo op GitLab, elk vastgezet op één commit (Bijlage A). Tabel 2 geeft de repositories die in dit paper worden gebruikt; de overige pins zijn build- en UI-hulpmiddelen die in Bijlage A staan.

Tabel 2. Geciteerde repositories (korte SHA; de pinlijst staat in Bijlage A).

AliasRepositoryLicentiePinCommitdatumRol
AERIUSgitlab.com/AERIUS/AERIUS, branch calculator2026.0_fixes (ondiep)AGPL-3.0fb8812f2026-10-06Calculator, Connect, workers, SQL van de productdatabase, deployment
IMAER-javaaerius/IMAER-javaAGPL-3.0ecdc81b2026-09-21IMAER-parser, validators, emissieformules
IMAERaerius/IMAERgeen vermeldf2a401b2026-09-30XSD 6.0.2 en codelijsten
QGISaerius/IMAER-QGIS-pluginGPL-2.02bc81a02026-08-18Onafhankelijke Connect v8-client
OPSrivm-syso/OPSGPL-3.0e62fdf72025-03-25OPS-LT 5.3.1.0 (Fortran)
DepACrivm-syso/DepACEUPL-1.2fef22662026-10-12Zelfstandige DEPAC 5.0.5
emission-serviceaerius/emission-serviceAGPL-3.0d172ecf2026-08-26Schema en REST-API voor emissiefactoren (dataset 2023)
database-buildaerius/database-buildAGPL-3.0673f7702026-10-14Ruby-tooling voor de databasebuild
database-modulesaerius/database-modulesAGPL-3.0fba23372026-08-18Schema's voor raster, natuurgebied en habitat
taskmanageraerius/taskmanagerAGPL-3.0c5683672026-10-06Wachtrijplanner
file-serveraerius/file-serverAGPL-3.0a0ba2f32026-10-20Bestandsoverdracht (lokaal of S3)
webdocument-exporteraerius/webdocument-exportergeen vermeldb2cc5052026-09-28Headless Chrome naar PDF
geoserver-coreaerius/geoserver-coregeen vermeld83bc6b42026-09-16GeoServer-basis
source-mesh-matrixaerius/source-mesh-matrixAGPL-3.0eaef37b2026-08-24Bron-receptormatrixdienst
search, auth, rabbitmq, cicd-scripts, aerius-connect-examplesaerius/*AGPL-3.0 / geenzie Bijlage AOndersteunende diensten en historie

Van de 39 vastgezette repositories vermelden er 23 AGPL-3.0, 11 geen licentie en 5 een andere open licentie (Bijlage A). Twee repositories (aerius/vue-components, aerius/dockerfiles) waren leeg en zijn niet gekloond. De README van IMAER-java bevat boven het licentiegedeelte een disclaimer dat "no rights are granted" en dat alle niet uitdrukkelijk verleende rechten zijn voorbehouden (IMAER-java@ecdc81b:README.md:9-11).

3.2 Leesmethode

Elke component is gelezen in een aparte ronde die een werknotitie opleverde (niet gepubliceerd). De rondes volgden aanroeppaden vanaf de ingangspunten (ImaerImporter.importStream, CalculateResource, OwN2000CalculatorFactory, OPSPerformer, SRM2Calculator, SQL-statistiekfuncties) in plaats van bestanden los te lezen. Voor dit paper hebben wij daarna (a) de notities samengevoegd, (b) tegenstrijdigheden daartussen opgelost door de code op de geciteerde plaats opnieuw te lezen, en (c) de dragende uitspraken van een bewijsindex van 62 rijen opnieuw gecontroleerd in de vastgezette bronnen (de index maakt geen deel uit van deze editie). Waar een notitie en de code verschilden, gold de code als gezaghebbend.

Citatiecontrole. Elke codecitatie wordt mechanisch met een script gecontroleerd (Python-standaardbibliotheek; de resultaten per citatie worden bij het onderzoeksmateriaal bewaard). Voor elke citatie in de vormen van paragraaf 3.3 toetst het script dat (a) de alias naar een vastgezette submodule verwijst, (b) de SHA een prefix is van de vastgezette commit, (c) het bestand op die commit bestaat, (d) elke geciteerde regel of elk geciteerd bereik binnen het bestand ligt, en (e) ten minste één van maximaal drie onderscheidende identifiers of getallen uit de citerende zin of tabelrij binnen vijf regels van het geciteerde bereik voorkomt. Citaten die alleen (e) niet halen, omdat de zin omschrijft wat de code als constante noemt, zijn met de hand gecontroleerd en met een notitie in het onderzoeksmateriaal vastgelegd. Bij versie 4 heeft het paper 415 codecitaten, allemaal geslaagd voor (a) tot en met (e), waarvan 89 via een met de hand geverifieerd trefwoord. Verwijzingen naar databestanden van het onderzoeksmateriaal zijn apart op bestaan gecontroleerd, en elk getal uit de batchbestanden is daarin opnieuw nagelezen.

3.3 Bewijsconventie

Een codebewering wordt geciteerd als repo@sha:path:line, met de repositoryalias en korte SHA van Tabel 2. Om citaten leesbaar te houden worden de volgende padprefixen gebruikt. Binnen AERIUS@fb8812f:

PrefixPad
CS/source/calculator/aerius-connect-service/src/main/java/nl/overheid/aerius/connectservice/
API/source/calculator/aerius-connect-service/src/main/resources/static/api/v8/
WK/source/calculator/aerius-worker/src/main/java/nl/overheid/aerius/worker/
WUI/source/calculator/aerius-calculator-wui-client/src/main/java/nl/overheid/aerius/wui/application/
CH/source/commons-aerius/aerius-commons-chunker/src/main/java/nl/overheid/aerius/calculation/
OJ/source/commons-aerius/aerius-commons-ops/src/main/java/nl/overheid/aerius/ops/
SJ/source/commons-aerius/aerius-commons-srm/src/main/java/nl/overheid/aerius/
UT/source/commons-aerius/aerius-commons-util/src/main/java/nl/overheid/aerius/
IMA/source/commons-aerius/aerius-commons-imaer/src/main/java/nl/overheid/aerius/
EXP/source/commons-aerius/aerius-commons-export/src/main/java/nl/overheid/aerius/export/
REPO/source/commons-aerius/aerius-commons-repository/src/main/java/nl/overheid/aerius/db/
SH/source/commons-aerius/aerius-commons-shared/src/main/java/nl/overheid/aerius/shared/
DOM/source/commons-aerius/aerius-commons-domain/src/main/java/nl/overheid/aerius/
DB/source/database/src/

Binnen IMAER-java@ecdc81b: G/ = source/imaer-gml/src/main/java/nl/overheid/aerius/, U/ = source/imaer-util/src/main/java/nl/overheid/aerius/, IS/ = source/imaer-shared/src/main/java/nl/overheid/aerius/shared/, T/ = source/imaer-gml/src/test/. Documenten worden geciteerd als [Rn] (Referenties). Uitspraken die op onze lezing berusten in plaats van op letterlijke code of documenttekst zijn gemarkeerd met [INF]. Waarnemingen uit onze eigen builds en runs zijn gemarkeerd met [RUN].

3.4 Uitgevoerde builds en runs

Alle builds gebruikten kopieën in een tijdelijke map, zodat de vastgezette submodules niet zijn gewijzigd (Ubuntu 24.04, OpenJDK 21.0.12, Maven 3.9.11, GNU Fortran 13.3.0). Wij hebben IMAER-java en de AERIUS-modules aerius-commons-ops en aerius-commons-srm gebouwd, waarvan de tests slagen (171 en 212 uitgevoerd, geen fouten) [RUN]; OPS 5.3.1.0 met gfortran gebouwd (ops -r meldt L-5.3.1.0 ; 19 dec 2024) en gedraaid met het AERIUS-productiepakket ops/5.3.1.0-5, met ongeveer 1,7 s per stof voor 200 receptoren [RUN]; de DepAC-tests uitgevoerd; Nexus en de open-data-WFS anoniem en alleen-lezen bevraagd; de subreceptor-harness en de Monte Carlo-runs van F9 uitgevoerd (de F9-harness); de GitLab-API bevraagd naar nieuwere commits (paragraaf 3.7); en 13 Connect-jobs ingediend (paragraaf 3.5).

3.5 AERIUS Connect-batch

Om uitspraken te toetsen die de code alleen niet kan beslechten, hebben wij op 2026-10-22 tussen 17:24:57 en 17:26:30 UTC één batch van 13 jobs ingediend bij de AERIUS Connect-productiedienst, via een geautomatiseerde client, met toestemming van de eigenaar van de afnemende dienst en een plafond van ten hoogste 15 jobs (manifest.json; batch-uitkomst.json). De dienst meldde zowel voor als na de batch aeriusVersion 2026.0.0_20260929_655bf03b53 en databaseversie 2026.0.0_655bf03b53_calculator_nl_stable. Alle jobs gebruikten één locatie in Terwolde (exacte coördinaten worden in deze editie achtergehouden), met het Natura 2000-gebied Rijntakken op ruwweg 0,8 km, rekenjaar 2026 en één PROPOSED-situatie (manifest.json):

  • K01 tot en met K08: per job één puntbron van mobiele werktuigen (sector 3300), vijf categorieën, 100 bedrijfsuren, vermogen 40, 100 of 300 kW waar de categorie vermogen kent;
  • K09 en K10: één weg van 500 m (NON_URBAN_ROAD_NATIONAL, 60 km/u) met 10 000 lichte of 1 000 zware voertuigen per jaar;
  • D01 en D02: een bouwcase (80 uur van een Stage IV-machine van 200 kW en 60 zware voertuigen), bedoeld als een spreiding van twee weken en van twaalf maanden van dezelfde activiteit;
  • P01: de invoer van D01 met PDF-uitvoer.

Elk verzoek werd eerst gevalideerd met utility/validate?strict=true. De client diende ten hoogste 3 jobs tegelijk in en deed geen nieuwe pogingen: de eerste indieningsfout zou de batch hebben gestopt. Die is niet opgetreden. Het onderzoeksmateriaal bewaart per job de aanvraag-GML en opties, de validatie- en berekeningsresponses, de statustijdlijn en een samenvatting met de herberekende emissies, de 20 hoogste receptoren en afgeleide factoren (K01/, enz.); de resultaten per receptor worden per job bewaard als receptoren.csv.gz. Resultaten uit deze batch zijn gemarkeerd met [RUN] met het databestand als bewijs.

3.6 Wat niet is gedaan

  • Er zijn geen productiedata uit dbdata verkregen; de repository vereist inloggegevens (HTTP 401) en die zijn niet gezocht.
  • Afgezien van de 13 jobs van paragraaf 3.5, uitgevoerd met de sleutel van de afnemende dienst, is geen enkel live endpoint bevraagd buiten anonieme, alleen-lezen verkenningen.
  • Dezelfde scenario's zijn niet in de Calculator-UI doorgerekend; die vergelijking vergt een handmatige stap die niet is uitgevoerd (paragraaf 6.4).
  • Dit paper heeft geen offline replica per hexagoon met de Connect-resultaten vergeleken; Paper 2 maakte een eerste, gedeeltelijke vergelijking (erratumverwijzing na het kernresultatenkader, paragraaf 8.3).
  • De volledige Calculator-, worker- en databasestack is niet uitgerold; de chunker en de workers vereisen de PostgreSQL-productschema's en RabbitMQ.
  • Niet elke module van de monorepo is gelezen. De aggregatie van de PDF-printdata en de inhoud van de GML-export zijn alleen gelezen voor zover nodig voor paragraaf 6.

3.7 Versie-identiteit en drift

Op 2026-10-22 had het openbare GitLab-project geen tag, branch of commit die nieuwer was dan de vastgezette fb8812f ("Release 2026.0.0", 2026-10-06), waarvan de parent 71a6015 "Release 2025.3" is, en de live Calculator meldde "Version 2026.0.0" [RUN]. In 2025 volgde een hotfixrelease één dag na de jaarlijkse release; voor 2026 bestaat er na 16 dagen geen. De enige wijziging na de release die wij vonden is documentair: bijlage 1 van de Instructie gegevensinvoer is op 8 oktober 2026 vervangen. De versiestring is de manifest-Implementation-Version, van de vorm ${project.version}_${buildDateTime}_${buildRevision} (AERIUS@fb8812f:source/commons-aerius/aerius-commons-shared/pom.xml:94), dus de 2026.0.0_20260929_655bf03b53 van Connect benoemt een build van 29 september 2026 uit revisie 655bf03b53. Die revisie bestaat niet in de openbare repository (GitLab-API, HTTP 404) [RUN]. [INF] De openbare historie bestaat uit samengevoegde (squashed) releasesnapshots van een interne repository, zodat de uitgerolde build aan de openbare code gekoppeld kan worden via zijn versielabel, niet via zijn commit. Wij stellen daarom geen codedrift vast op het niveau van openbare commits, en wij kunnen verschillen tussen de build en de openbare snapshot niet uitsluiten, noch wijzigingen in de gesloten database-inhoud.


4. Systeemarchitectuur (RQ1)

4.1 Componenten

ComponentImplementatieRolBewijs
Calculator-web-UIGWT met vue-gwt en gwt-client-commonInteractieve berekeningen, printroute voor de PDFAERIUS@fb8812f:source/calculator/aerius-calculator-wui-client; WUI/print/own2000/
Connect-dienstSpring Boot, spec-first OpenAPI onder /api/v8Machine-API en UI-backend (/ui/**)AERIUS@fb8812f:API/api-common.yaml:45-46; AGENTS.md "Server APIs are spec-first"
IMAER-bibliotheekJava (JAXB), GWT-compatibele DTO'sParseren, valideren, converteren, emissies berekenenIMAER-java@ecdc81b:source/pom.xml:146-151; source/imaer-gml/pom.xml:54,64-65; source/imaer-shared/pom.xml:33,94; source/imaer-shared/src/main/resources/nl/overheid/aerius/ImaerShared.gwt.xml
TaskmanagerJava 21, RabbitMQ-clientPrioriteit en capaciteitsaandeel per clientwachtrijtaskmanager@c568367:README.md:7-10,36-52
BrokerRabbitMQ 4.2, quorum queues, berichten van 512 MBTransport; payloads zijn met gzip gecomprimeerde Java-serialisatierabbitmq@f8e5558:docker/Dockerfile:1-17; taskmanager@c568367:source/taskmanager-client/.../util/QueueHelper.java:67-75
Chunker-workerJava (aerius-commons-chunker)Splitst jobs, verdeelt engine-taken, aggregeertAERIUS@fb8812f:CH/
OPS-workerJava-wrapper (aerius-commons-ops) rond de Fortran-binary van het RIVMSchrijft .ctr, .brn, .rcp; draait OPS; leest resultatenAERIUS@fb8812f:OJ/runner/OPSPerformer.java
SRM-workerJava SRM2 (aerius-commons-srm)Wegen binnen 5 kmAERIUS@fb8812f:SJ/srm2/
Export- en PDF-workersJava; headless Chromium met iText-nabewerkingGML met resultaten; PDF-rapportAERIUS@fb8812f:WK/export/, WK/pdf/; webdocument-exporter@b2cc505:README.md:7,27-64
ProductdatabasePostgreSQL/PostGIS, gebouwd met Ruby database-buildReceptoren, habitattypen, factoren, jobs, resultaten, grenzenAERIUS@fb8812f:DB/build/versions/calculator_nl_latest.rb:19-32
BestandsserverSpring Boot, lokale schijf of S3Invoer en resultatenfile-server@a0ba2f3:README.md:3-11
GeoServerGeoServer 2.28.5 WAR; SQL-view-lagenResultaat- en contextkaarten; open-data-WFSgeoserver-core@83bc6b4:pom.xml:25,58; AERIUS@fb8812f:source/geoserver/
ZoekenSpring Boot; PDOK Locatieserver en N2000-WFSKaartzoekfunctiesearch@aa19ff2:README.md:5-23; search-service-pdok-locatieservice/; search-service-n2000-assessment-areas-nl/
Source-mesh-matrixSpring Boot, ClickHouseVooraf berekende bron-receptorwaarden (GRIP-context) [INF]source-mesh-matrix@eaef37b:README.md:1-4

4.2 Technologieën en uitrol

De Java-diensten richten zich op Java 21 (taskmanager@c568367:source/Dockerfile:16; AERIUS@fb8812f:docker/common/api/Dockerfile.template:2-19). De Docker-compositie voor NL omvat database-calculator, taskmanager, api, calculator-server, geoserver-calculator, geoserver-opendata, worker, worker-pdf, worker-ops, worker-srm en een OpenTelemetry-collector (AERIUS@fb8812f:docker/NL/docker-compose.yaml:21-72). Productie draait op AWS (eu-west-1): ECS-diensten, Aurora PostgreSQL 17, S3 voor de bestandsserver, SES voor e-mail, met Terraform-modules uit een privérepository (AERIUS@fb8812f:terraform/application_services/app.hcl:1-104; terraform/basicinfra/modules.json:1-7). De productiedimensionering staat 2 tot 12 chunker-taken van 8 processen toe, 2 tot 36 OPS-worker-taken van 8 processen, 2 SRM-processen en 2 tot 4 PDF-taken op spotcapaciteit (AERIUS@fb8812f:terraform/.../service_sizing.tf:5-25; services.yaml.tftpl:337-338,387-388,618-619), en de taskmanager adverteert 96 connect-(chunker-)slots, 288 OPS-slots en 16 SRM-slots (services.yaml.tftpl:100-108). CI gebruikt Jenkins met een gedeelde bibliotheek en GitHub Actions die naar Nexus publiceren (cicd-scripts@aed3251:jenkins-library/vars/cicdPipeline.groovy; AERIUS@fb8812f:Jenkinsfile-QA).

4.3 Diagram

flowchart LR
  subgraph Clients
    UI["Calculator UI (GWT)"]
    CL["Connect v8 clients"]
  end
  subgraph API["Connect service /api/v8"]
    IMP["Import + validate<br/>IMAER-java + GMLHelperImpl"]
    EM["Emissions recomputed<br/>(DB factors, year)"]
    JOB["Job: created -> queuing"]
  end
  DB[("PostgreSQL/PostGIS<br/>product DB (dbdata)")]
  FS[("File server<br/>S3")]
  TM["RabbitMQ + taskmanager<br/>priority, maxCapacityUse"]
  subgraph Workers
    CH["Chunker<br/>situations x receptor chunks"]
    OPS["OPS worker<br/>OPS 5.3.1.0 Fortran"]
    SRM["SRM worker<br/>Java SRM2, within 5 km"]
    EXP["Export: GML with results"]
    PDF["PDF worker<br/>Chromium + iText"]
  end
  GS["GeoServer<br/>wms views, open data WFS"]
  UI --> API
  CL -->|"multipart, api-key"| API
  IMP --> EM --> JOB
  IMP <--> DB
  EM <--> DB
  JOB -->|"scenario JSON"| FS
  JOB -->|"connect_export_small/large<br/>calculator_ui_*"| TM
  TM --> CH
  CH -->|"one task per engine"| OPS
  CH --> SRM
  OPS -->|"results"| CH
  SRM -->|"results"| CH
  CH -->|"sum per receptor"| DB
  DB -->|"threshold, statistics (SQL)"| EXP
  DB --> PDF
  EXP --> FS
  PDF --> FS
  FS -->|"resultUrl"| CL
  DB --> GS --> UI
StapComponentInvoerUitvoer
1Connect-dienstIMAER-GML, opties, sleutelGevalideerd scenario, herberekende emissies, job
2TaskmanagerTaak per wachtrijVrijgegeven taak op prioriteit en capaciteitsaandeel
3ChunkerJobEngine-taken per situatie en receptorchunk; opgetelde resultaten
4OPS- en SRM-workersBronnen, receptorenDepositie per receptor en stof
5ProductdatabaseResultatenStatistieken na toepassing van de grens (SQL)
6Export- en PDF-workersStatistieken, resultatenGML met resultaten, PDF-rapport op de bestandsserver

4.4 Doorloop

Een client post IMAER-GML-bestanden en JSON-opties naar own2000/calculate met een api-key-header (AERIUS@fb8812f:API/api-own2000.yaml:44-76). De Connect-dienst importeert en valideert elk bestand met IMAER-java en een databasegestuurde hulpklasse, herberekent emissies, vervangt de opties door de vaste formele beoordelingsset, maakt een job aan, schrijft het scenario naar de bestandsserver en stuurt een taak naar de taskmanager (AERIUS@fb8812f:CS/resource/CalculateResource.java:65-95; CS/service/AbstractCalculateService.java:93-106,242-249,308-322). De taskmanager geeft taken per clientwachtrij vrij op grond van prioriteit en capaciteitsaandeel (taskmanager@c568367:source/taskmanager/src/main/java/nl/aerius/taskmanager/scheduler/priorityqueue/PriorityTaskScheduler.java:146-173,237-252). De chunker splitst de job per situatie en receptorchunk en stuurt per engine één taak naar de OPS- en SRM-workers; hij telt hun resultaten per receptor op en slaat ze op (hoofdstuk 5). Toepassing van de grens en de statistieken zijn SQL-functies over de opgeslagen waarden. Export-workers schrijven GML met resultaten of renderen de PDF vanaf een printroute, slaan het resultaat op de bestandsserver op en zetten de resultUrl van de job (AERIUS@fb8812f:WK/export/ExportEmailHandler.java:68-82).

Antwoord op RQ1. AERIUS 2026.0.0 is een op wachtrijen gebaseerde Java-service-architectuur op AWS: een spec-first REST-dienst, een prioriteits-taskmanager boven RabbitMQ, een chunker die uitwaaiert naar een OPS-worker (die de Fortran-binary van het RIVM omhult) en een Java-SRM2-worker, PostgreSQL/PostGIS voor data, resultaten en de beslisregels, een door S3 ondersteunde bestandsserver en GeoServer. De applicatiecode is openbaar in de GitLab-monorepo; de infrastructuurmodules, de productieconfiguratiewaarden en de database-inhoud niet.


5. De rekenketen in detail (RQ2)

5.1 IMAER-invoer en validatie

Standaard. IMAER is een GML 3,2-applicatieschema dat door ShapeChange wordt gegenereerd; de huidige versie is 6.0.2 in de namespace http://imaer.aerius.nl/6.0, gedeeld met 6.0.0 en 6.0.1 (IMAER@f2a401b:gmlapplicatieschema/6.0.2/IMAER.xsd:1,9-14). De wijziging van 6.0.1 naar 6.0.2 voegt alleen power (kW) toe aan StandardOffRoadMobileSource (IMAER.xsd:3666-3670). Eén bestand bevat één situatie met een SituationMetadata waarvan het situationType REFERENCE, PROPOSED, TEMPORARY, OFF_SITE_REDUCTION, COMBINATION_REFERENCE of COMBINATION_PROPOSED is (IMAER.xsd:3287-3350). Het verplichte bronattribuut sectorId is een vrij geheel getal (IMAER.xsd:1622); geldige codes worden bepaald door codelijsten ("waardelijsten"), niet door het schema. In de lijst van 6.0.2 ontbreken de sectoren 3210 en 3220 en is 3300 "Mobiele werktuigen" aanwezig (IMAER@f2a401b:waardelijst/6.0.2/20260928/IMAER_sectors_20260928.csv:13, tegenover waardelijst/6.0.0/20240926/IMAER_sectors_20240926.csv:13-14).

Importpijplijn. ImaerImporter.importStream herkent de IMAER-versie aan de namespace, valideert optioneel tegen de XSD, zet het situatiejaar vanuit het importjaar of <imaer:year>, leest dan de bronnen, valideert ze, herberekent hun emissies en valideert opnieuw (IMAER-java@ecdc81b:G/importer/ImaerImporter.java:135-167,197-213,335-337). Connect importeert met USE_IMPORTED_LANDUSES, INCLUDE_SOURCES, USE_VALID_SECTORS, VALIDATE_SOURCES en VALIDATE_AGAINST_SCHEMA, en dus zonder INCLUDE_RESULTS, INCLUDE_CALCULATION_POINTS en WARNING_ON_GEOMETRY_LIMITS (AERIUS@fb8812f:CS/service/ScenarioService.java:118-122,139-141; CS/resource/OwN2000CalculateResource.java:66). Resultaten in een geüploade GML worden verwijderd en eigen rekenpunten daarin worden niet gelezen (IMAER-java@ecdc81b:G/importer/ImaerImporter.java:248-257,268-275).

Validatiecodes. Alle fout- en waarschuwingscodes staan in IMAER-java@ecdc81b:IS/exception/ImaerExceptionReason.java. Drie mechanismen verdienen aandacht.

  • Omzetting van oude codes en waarschuwing 5266. Het sector-ID loopt via GMLConversionData.getSectorId, dat voor de oude code een conversie in een verouderingstabel opzoekt; als de conversie als issueWarning is gemarkeerd, wordt waarschuwing 5266 GML_SECTOR_OUT_OF_DATE toegevoegd met het oude ID, het nieuwe ID en het bronlabel. Als de resulterende sector niet geldig is, wordt de sector stilzwijgend 1800 met waarschuwing 5218 (IMAER-java@ecdc81b:G/gml/base/GMLConversionData.java:134-168,201-218; IS/exception/ImaerExceptionReason.java:624-631). De tabel wordt per IMAER-versielezer eenmaal uit een supplier gelezen (G/gml/base/GMLVersionReaderFactory.java:51), die AERIUS implementeert tegen system.gml_conversions (type, old_value, new_value, issue_warning) (AERIUS@fb8812f:IMA/importer/GMLConversionRepository.java:72-75,111-127). Voor 2026 wordt die tabel geladen uit system/system.gml_conversions_sector_20260528.txt in dbdata (AERIUS@fb8812f:DB/data/sql/nl-common/system_26/gml_conversions_26.sql:3), dat niet openbaar is. De openbare testmock zet 3219 om naar 3300 met een waarschuwing (IMAER-java@ecdc81b:T/java/nl/overheid/aerius/test/TestValidationAndEmissionHelper.java:444-450). [INF] Een omzetting van 3220 naar 3300 met waarschuwing voor IMAER 6.0-bestanden is consistent met de codelijsten en met het waargenomen gedrag, maar kan niet uit openbare bronnen worden geverifieerd. Omdat de namespace niet veranderde, kan een 6,0-GML die in 2025 geldig was nu stilzwijgend een andere sector krijgen; de XSD kan dit niet opsporen.
  • Overige conversies. Offroadcodes van vóór 3.1 worden Stage-codes met waarschuwing 5234 en geschatte bedrijfsuren (IMAER-java@ecdc81b:G/gml/base/conversion/MobileSourceOffRoadConversion.java:37-56); verwijderde voertuigcodes geven 5267 (G/gml/base/GMLConversionData.java:260-266); een ontbrekende maximumSpeed bij NON_URBAN_ROAD_NATIONAL of NON_URBAN_ROAD_GENERAL wordt 60 km/u met waarschuwing 5272 (G/gml/base/source/road/GML2Road.java:126-145; G/gml/base/GMLConversionData.java:54).
  • Keuze van de offroadmethode. Per subbron kiest de validator POWER als power > 0 en de database zegt dat de categorie vermogen verwacht; FUEL als brandstof is opgegeven en verwacht wordt; alleen bedrijfsuren (NOT_REQUIRED) als de categorie geen van beide verwacht; anders fout 1041 (IMAER-java@ecdc81b:U/validation/OffRoadValidator.java:76-98,100-105). Vermogen buiten het bereik van de categorie geeft 1042 (:136-149). Welke categorieën vermogen accepteren, en hun bereiken, zijn databasegegevens. In de Connect-batch accepteerde strikte validatie vermogen voor de vier categorieën die wij met vermogen verstuurden (40, 100 en 300 kW) en accepteerde zij categorie ZUT met alleen bedrijfsuren, zonder fout of waarschuwing, en zonder 5266 voor sector 3300 [RUN, K01/validate.json tot K08/validate.json].

Hoe waarschuwingen de client bereiken. Connect kopieert elke importwaarschuwing als {code, message} naar de synchrone CalculateResponse.warnings, en de berekening start nog steeds (AERIUS@fb8812f:CS/resource/CalculateResource.java:80-86; CS/service/ResponseService.java:93-97). Waarschuwingen worden niet bij de job opgeslagen: JobStatus heeft geen waarschuwingenveld (AERIUS@fb8812f:API/api-common.yaml:560-600). utility/validate geeft ze ook terug en maakt er fouten van met strict=true (CS/resource/UtilityResource.java:149-164).

5.2 Emissieberekening

Herberekening bij import. GMLHelper.enforceEmissions "Recalculates the emissions on all given emission sources" (IMAER-java@ecdc81b:G/gml/base/GMLHelper.java:32-41), en Connect roept refreshEmissions/enforceEmissions aan met de databasefactoren voor het rekenjaar op elke bron (AERIUS@fb8812f:CS/service/AbstractCalculateService.java:247-249; CS/service/EmissionsSourcesService.java:71-73). Emissiewaarden in de GML blijven daarom alleen behouden voor generieke EmissionSource-features ("Nothing to calculate, just return the existing values", IMAER-java@ecdc81b:U/shared/emissions/EmissionsCalculator.java:143-147) en voor eigen subbronnen (U/shared/emissions/OffRoadMobileEmissionsCalculator.java:72-77). Een calculationYear in de Connect-opties overschrijft het jaar van elk bestand (AERIUS@fb8812f:API/api-common-abstract.yaml:31-38; CS/service/AbstractCalculateService.java:242-246).

Mobiele werktuigen (IMAER-java@ecdc81b:U/shared/emissions/OffRoadMobileEmissionsCalculator.java:82-121,123-161):

if power > 0:   E_s [kg/y] = EF_kWh,s [g/kWh] * P [kW] * t [h/y] / 1000
else:           E_s [kg/y] = max(0, EF_l,s * L_fuel + EF_h,s * t + EF_AdBlue,s * min(L_AdBlue, r_max * L_fuel))

De vermogenstak heeft geen belastingsfactor en geen stationair- of AdBlue-term. [INF] Elke belastingscorrectie moet in de EF_kWh per categorie zijn verwerkt, waarvan de waarden niet openbaar zijn: de supplier-interface geeft standaard een lege map terug (U/shared/emissions/OffRoadMobileEmissionFactorSupplier.java:46-51), en de enige getallen per kWh in openbare code zijn testmocks (TestValidationAndEmissionHelper.java:167,374-375,760-765).

Wegverkeer, SRM2-wegen (IMAER-java@ecdc81b:U/shared/emissions/SRMRoadEmissionsCalculator.java:40-64,84-134):

EF_v [g/km] = (1 - f_stag,v) * EF_normal(area, roadType, v, vmax, strict) + f_stag,v * EF_stag(...)
E   [kg/y]  = sum_v ( EF_v * N_v [vehicles/y] ) * tunnelFactor * length [m] / 1e6

waarbij tijdseenheden worden omgerekend naar per jaar (HOUR 8760, DAY 365, MONTH 12; IS/domain/v2/base/TimeUnit.java:24-29). De factorsleutel (gebied, wegtype, voertuigtype, maximumsnelheid, strikte handhaving) bevat geen jaar; het jaar is een eigenschap van de databasesnapshot (U/shared/emissions/RoadEmissionFactorSupplier.java:32-51). Stagnatie is een invoerfractie, geen gemodelleerde grootheid. Emissies schalen lineair met de getekende weglengte.

Gemeten via Connect [RUN]. De aanvraag-GML's van de batch bevatten alleen activiteitsgegevens, geen emissiewaarden; de teruggegeven GML bevat door de dienst herberekende emissies, waaruit de onderstaande factoren volgen (K01/samenvatting.json tot K10/samenvatting.json):

JobCategorie of voertuigActiviteitNOx (kg/j)NH3 (kg/j)Afgeleide factor
K01, K02SIV75560DSJ (Stage IV, 75 tot 560 kW, SCR)100 u bij 100 en 300 kW2,6; 7,80,21; 0,63NOx 0,26, NH3 0,021 g/kWh
K05, K06SV75560DSJ (Stage V, 75 tot 560 kW, SCR)100 u bij 100 en 300 kW2,6; 7,80,21; 0,63identiek aan Stage IV
K03, K04SIIIB75560DSN (Stage IIIB, 75 tot 560 kW, geen SCR)100 u bij 100 en 300 kW11; 330,007; 0,021NOx 1,1, NH3 0,0007 g/kWh
K07SIV56DSN (Stage IV, onder 56 kW, geen SCR)100 u bij 40 kW5,840,0028NOx 1,46, NH3 0,0007 g/kWh
K08ZUT (geen vermogensinvoer)100 u200,147NOx 200, NH3 1,47 g/u
K09licht verkeer, 60 km/u10 000 voertuigen/j op 500 m0,71350,0835NOx 0,1427 g per voertuigkilometer
K10zwaar vrachtverkeer, 60 km/u1 000 voertuigen/j op 500 m1,76430,0542NOx 3,5285 g per voertuigkilometer

Een verdrievoudiging van het vermogen verdrievoudigde elke emissie exact (K01 tegenover K02, K03 tegenover K04, K05 tegenover K06), zoals de vermogensformule voorspelt. Stage V en Stage IV met SCR hebben identieke factoren in de database van 2026, en hun resultaatsamenvattingen zijn identiek tot en met de 20 hoogste receptoren (K05/samenvatting.json tegenover K01/samenvatting.json). Deze factoren gelden voor rekenjaar 2026 en databaseversie 2026.0.0_655bf03b53_calculator_nl_stable; het zijn metingen van gesloten data, geen gepubliceerde tabel.

5.3 Formele opties, opsplitsing van jobs en verdeling

Formele opties. Connect vervangt de opties van de gebruiker door een vaste set: stoffen NH3, NOx en NO2; resultaatsleutels NH3- en NOx-depositie; methode FORMAL_ASSESSMENT (CUSTOM_POINTS op verzoek); stapeling aan; maximale afstand van 25 km aan; subreceptoren ENABLED_RECEPTORS_ONLY op zoomniveau 1 zonder herpositionering of splitsing; standaardmeteorologie (setMeteo(null)). Twee waarden komen uit de invoer: het jobtype (standaard PROCESS_CONTRIBUTION) en het type ondergrens voor vergunningen, waarvoor de grens uit de database wordt gelezen en de optiewaarde op het label 0,005 wordt gezet; zolang "arithmetic" het enige type is, heeft de tweede geen effect (AERIUS@fb8812f:UT/calculation/OwN2000CalculationOptionsUtil.java:58-92; CS/service/OwN2000CalculateService.java:110-116). Het meegeven van een ondergrens voor vergunningen via Connect is uitgeschakeld ("TODO AER-4028", OwN2000CalculateService.java:114-115). De modelversies worden gestempeld uit databaseconstanten, MODEL_VERSION_OPS = STABLE en MODEL_VERSION_SRM = OWN2000_2026 (AERIUS@fb8812f:DB/data/sql/nl-stable/system/version_constants.sql:10-11; CH/theme/own2000/OwN2000CalculatorFactory.java:143-144,179-180).

Opsplitsing. (1) Eén JobPacket per situatie en jaar (AERIUS@fb8812f:CH/conversion/JobPackets.java:86-92). (2) Elke bron wordt omgezet voor OPS, en bronnen in wegsectoren worden bovendien omgezet voor SRM2, waarbij de engine per sector uit de database komt (CH/theme/own2000/OwN2000SourceConverter.java:65-71; CH/conversion/CalculationEngineProvider.java:30-41). Voor OPS worden lijnen puntbronnen om de 25 m en polygonen een raster van 100 m van gewogen punten (IMA/conversion/OPSSourceConverter.java:113-127,140-163,184-191; DOM/calculation/domain/CalculationConstants.java:27,32). (3) Receptoren worden per Natura 2000-gebied uitgedeeld, het dichtstbijzijnde gebied eerst, binnen OWN2000_MAX_DISTANCE_M = 25_500 van een bron, waarbij de opmerking een marge van 500 m noemt omdat "the actual distance is calculated in OPS" (CH/natura2k/Natura2kReceptorStore.java:71-78; CH/theme/own2000/OwN2000DistanceWorkDistributor.java:56-59,89). (4) De chunkgrootte is clamp(ceil(maxEngineUnits / #engineSources), minReceptors, maxReceptors) (CH/base/WorkDistributor.java:78-85), met 100 000 eenheden en 5 tot 850 000 receptoren voor worker-exports ("higher will crash ops") en 20 000 eenheden en 5 tot 2 000 receptoren voor UI-berekeningen (DB/data/sql/nl-common/system/product_constants.sql:11-18).

Verdeling. Voor elke situatie en chunk bouwt de chunker per engine één taak met de brongroepen per sector (CH/base/WorkBySectorHandlerImpl.java:60-73), waarbij OPS wordt afgebeeld op WorkerType.OPS en SRM2 op WorkerType.ASRM (CH/theme/own2000/OwN2000CalculationTaskFactory.java:79-80). Brongroepen van wegsectoren krijgen de OPS-optie -mindist en staan onder ROADS (:102-108,119). De OPS-worker draait één OPS-proces per sectorgroep en stof (OJ/runner/OPSPerformer.java:105-108,145-156).

Wachtrijen en prioriteiten. Connect-berekeningen gaan naar connect_export_large wanneer de complexiteit van het scenario (punten plus ceil(lijnlengte / 25 m) plus ceil(polygoonoppervlak / 100 m in het kwadraat)) calculatorLargeCalculationsSplit overschrijdt (standaard 100), anders naar connect_export_small (CS/service/OwN2000CalculateService.java:161-164; CS/config/ConnectProperties.java:42,59; CS/util/ScenarioUtil.java:123-145). In de taskmanagerconfiguratie die in het image is ingebakken hebben deze wachtrijen prioriteit 0 met maxCapacityUse 0,4 en 0,2, tegenover prioriteit 4 en 1,0 voor calculator_ui_small en prioriteit 5 voor input_export (AERIUS@fb8812f:docker/common/taskmanager/queue_config/priority-task-scheduler.connect.json; docker/common/taskmanager/Dockerfile.template:2,10). Een taak wordt vrijgegeven wanneer de pool één worker heeft, wanneer meer dan één worker vrij is en de wachtrij onder zijn capaciteitsaandeel zit, of wanneer er in de wachtrij niets draait (taskmanager@c568367:.../PriorityTaskScheduler.java:146-173). [INF] Connect-werk krijgt daardoor ten hoogste 40 % (klein) of 20 % (groot) van de chunkercapaciteit zolang andere wachtrijen bezet zijn.

5.4 Receptorselectie

Receptorset. Receptoren komen uit permit_required_receptors_view, dat SELECT receptor_id FROM included_receptors is (AERIUS@fb8812f:REPO/own2000/ReceptorRepository.java:41-42,57-71; DB/main/sql/common/areas_hexagons_and_receptors/04-views/02-receptors.sql:7-12). included_receptors bevat receptoren waarvan de hexagoon op zoomniveau 1 een gebied met een kritische depositiewaarde (KDW) van het type relevant_habitat snijdt, verenigd met extra_assessment_receptors ("hexagons with a hersteldoel") (DB/main/sql/common/areas_hexagons_and_receptors/04-views/setup/mapping_areas_receptors.sql:19-35; .../02-tables/02-receptors_hexagons.sql:40-52,124-142). Hexagonen van een Natura 2000-gebied die niet op relevant habitat liggen, worden niet berekend. De openbare open-datalaag die uit included_receptors is gebouwd, bevat 252 818 features [RUN] (DB/main/sql/calculator_common/opendata/general.sql:173-187).

Raster. Receptoren zijn middelpunten van hexagonen van 1 ha op zoomniveau 1 (straal 62,04 m) op een RD-Nieuw-raster met 1 529 hexagonen per rij (IMAER-java@ecdc81b:IS/domain/geo/ReceptorGridSettings.java:34; database-modules@fba2337:source/modules/src/main/sql/database-modules/aerius_constants/nl-constants.sql:4-24). Een receptor-ID wordt met een gesloten formule omgezet in coördinaten (IMAER-java@ecdc81b:IS/geometry/ReceptorUtil.java:89-98).

25 km. De chunker houdt receptoren binnen 25,5 km aan; OPS -maxdist zet daarna elk bron-receptorpaar voorbij DISTMAX = 25000 m op nul (OPS@e62fdf7:ops_lt/src/m_commonconst_lt.f90:55; m_ops_check_reken.f90:42-52). Resultaten van exact nul worden bij formele beoordelingen niet opgeslagen (AERIUS@fb8812f:CH/theme/own2000/OwN2000RelevantResultsFilter.java:27-34; CH/TotalResultDBHandler.java:88-90). Met de productiebinary gaven receptoren op 25,0 tot 26 km exact nul [RUN].

Subreceptoren. Voor hexagonen nabij een bron is de hexagoonwaarde het gemiddelde over de punten erin (AERIUS@fb8812f:DOM/shared/domain/theme/own2000/OwN2000SubReceptorConstants.java; UT/receptor/SubReceptorLevelMap.java:46-63; UT/receptor/Hexagon2EquilateralTriangles.java:55-63):

Afstand van hexagoonmiddelpunt tot dichtstbijzijnde bronNiveauPunten
d < 150 m4384
150 m <= d < 300 m396
d >= 300 mgeenalleen het hexagoonmiddelpunt

De punten zijn middelpunten van gelijkzijdige driehoeken die de hexagoon betegelen, afgerond op 4 decimalen (UT/receptor/HexagonEquilateralTrianglesUtil.java:36,71-80). Alleen punten waarvan de driehoek relevant habitat binnen de hexagoon snijdt, en die op meer dan 20 m van een bron liggen, blijven behouden; als er geen overblijft, wordt de hexagoon niet berekend (CH/subreceptor/SubReceptorPointSupplier.java:78-131; CH/subreceptor/RelevantGeometryUtil.java:69-101; DOM/shared/domain/theme/own2000/OwN2000SubReceptorConstants.java:49). Het middelpunt wordt dan niet naar het model gestuurd (DOM/calculation/EngineInputData.java:184-188). Het gemiddelde is rekenkundig over de subpunten met een resultaat ongelijk aan nul wanneer de maximale afstand aan staat (UT/receptor/AbstractSubReceptorAggregator.java:175-209; OJ/subreceptor/OPSSubReceptorAggregator.java:33-44); de BigDecimal-afronding ervan is bevinding F9. Eigen rekenpunten krijgen geen subreceptoren (IMAER-java@ecdc81b:IS/domain/calculation/SubReceptorsMode.java:44-48).

Hoogtes. OPS ontvangt geen -varz tenzij receptoren een hoogte hebben, zodat N2000-receptoren worden berekend op de OPS-standaard van 4 m (AERIUS@fb8812f:OJ/runner/OPSRunnerOptions.java:59-60,84-86; OPS@e62fdf7:USER_MANUAL.md:79). SRM2 gebruikt 1,5 m (AERIUS@fb8812f:SJ/srm/SRMConstants.java:51).

5.5 OPS-integratie

AERIUS draait de OPS-binary van het RIVM; het implementeert OPS niet opnieuw. Het pakket is 5.3.1.0-5 en de binary moet OPS-version: L-5.3.1.0 ; Release date: 19 dec 2024 melden (AERIUS@fb8812f:OJ/version/OPSVersion.java:27-32), overeenkomstig de vastgezette bron (OPS@e62fdf7:ops_lt/src/m_commonconst_lt.f90:66-67). De release notes van 2026 stellen dat OPS en SRM2 in Calculator 2026 ongewijzigd zijn [R7], en het RIVM koppelt OPS 5.3.1.0 aan Calculator 2025 [R8]. OPS 5.3.1.0 bevat zijn eigen DEPAC 4.3 (OPS@e62fdf7:ops_lt/ops_lib/src/m_depac.f90:15-22,394); de zelfstandige DepAC 5.0.5-repository is niet wat AERIUS 2026 draait (DepAC@fef2266:VERSION; README.md:82,87,90) [INF].

Opdrachtregel. -v -i settings.ctr [-perc] [-varz] [-maxdist] [-mindist] [-allow_sigz0_point_source] (AERIUS@fb8812f:OJ/runner/OPSRunnerOptions.java:33-39,75-97): -perc wordt afgedwongen voor formele beoordelingen (CH/theme/own2000/OwN2000CalculationTaskFactory.java:126); -maxdist volgt useMaxDistance; -mindist wordt alleen gezet voor groepen van wegsectoren; -allow_sigz0_point_source wordt voor 5.3.1.0-5 altijd gezet (OPSRunnerOptions.java:65,93-95; OPS@e62fdf7:ops_lt/src/m_ops_get_arg.f90:223-224).

Controlebestand. De onderstaande waarden worden geschreven door OJ/io/ControlFileWriter.java met standaardwaarden uit OJ/io/OPSSetting.java en versieregels uit OJ/io/ControlFile5300WriterUtil.java; een verwacht bestand staat in de testresources (source/commons-aerius/aerius-commons-ops/src/test/resources/nl/overheid/aerius/ops/io/linux_settings_17_latest.ctr).

SleutelWaardeBewijs
YEARrekenjaar; 2030 voor elk jaar >= 2024, met achtervoegsel prognosis tenzij chemie ACTUAL is gevraagdControlFile5300WriterUtil.java:47-60; OPSVersion.java:27-28
COMPCODE2 (NOx) of 3 (NH3)ControlFileWriter.java:219-246
CONVRATEEMEPOPSSetting.java:43
EMCORFAC1.0OPSSetting.java:49
ROADSsector-ID's van alle wegsectoren; ROADSopt alleen wanneer ROADS niet leeg isControlFile5300WriterUtil.java:43-45; OJ/io/ControlFileOptions.java:52
RECEPTYPE2 (puntreceptoren)OPSSetting.java:59
ROUGHNESS0.0 (kaarten en waarden per receptor)OPSSetting.java:68
Z0FILE / LUFILEz0_jr_250_lgn2023.ops / lu_250_lgn2023.opsControlFile5300WriterUtil.java:33-35; ControlFileWriter.java:58,180-183
METEOTYPE0 (interpoleer zes regio's)OPSSetting.java:71
MTFILEm014123c.*, de langetermijnstatistieken 2014 tot 2023 (het RIVM documenteert deze set voor OPS 5.3.1.0 [R8]; het Handboek 2026 noemt 2005 tot 2014 [R10, paragraaf 4.7], bevinding F22)ControlFile5300WriterUtil.java:30
DEPUNIT3 (mol/ha/j)OPSSetting.java:74

Landgebruik. Trajectruwheid en landgebruik komen uit de LGN2023-kaarten; bij de receptor geven -perc-kolommen de gemiddelde z0, het dominante landgebruik en negen landgebruikspercentages per receptor uit ops_terrain_properties_20250619 (OJ/io/RcpFileWriter.java:53-56,125-170; OJ/background/TerrainPropertiesReader.java:36-92). Een receptor die in dat bestand ontbreekt, krijgt z0 = 0,1 m en "overige natuur" (OJ/runner/OPSPerformer.java:62-64,126-133).

Emissiebestand. BRN-versie 4: q [g/s] = E [kg/y] / 31,536 (OJ/io/BrnFileWriter.java:173; IMAER-java@ecdc81b:IS/domain/Substance.java:102), coördinaten afgerond op 1 m, cat = sector-ID, area = 1, bronnen zonder emissie overgeslagen (BrnFileWriter.java:113,157-160,171; OJ/domain/OPSSource.java:108). Werktuigen nemen hoogte, warmte-inhoud, spreiding en dagprofiel uit de kenmerkenset van de offroadcategorie, of de sectorstandaard (IMA/conversion/OffRoadMobileSourceExpander.java:68-70,103-117); wegen voorbij 5 km nemen de sectorstandaarden voor wegen (IMA/importer/GMLHelperImpl.java:203-221). Deze waarden staan in dbdata.

Resultaten lezen. De totale depositie wordt uit vaste kolommen gelezen en negatieve waarden worden op nul afgekapt (OJ/io/ResultColumn.java:30-42; OJ/io/ResultDataFileReader.java:147-151). OPS schrijft vier significante cijfers [RUN]. Teruggegeven coördinaten zijn op 1 m afgerond, dus de chunker leidt het receptor-ID opnieuw af en herstelt het exacte middelpunt (CH/theme/own2000/OwN2000CalculatorFactory.java:129-138).

Gevolgen [INF]. Elk rekenjaar vanaf 2024 gebruikt in OPS dezelfde prognosechemie en achtergrondkaarten van 2030. Omdat het NH3-compensatiepunt in DEPAC de achtergrondconcentraties NH3 en SO2 als invoer neemt (OPS@e62fdf7:ops_lt/src/m_ops_resist_rek.f90:589-616), hangt de NH3-depositie van het project af van die achtergrondkaart. De ROADS-optie is inert in standaardruns: OPS past zijn SRM2-achtige wegparameterisatie alleen binnen 5 km toe (OPS@e62fdf7:USER_MANUAL.md:752-754; ops_lt/src/m_ops_vchem.f90:258), en AERIUS geeft brongroepen van wegen alleen met -mindist aan OPS.

5.6 SRM2

SRM2 is een Java-implementatie die wordt geselecteerd via AeriusSRMVersion.STABLE("OWN2000_2026", SRM2_2025, "depositionvelocity-vd_zoomlevel-2_all_20250620", "presrm-lu-2.502", "2.504-1", PROGNOSE_METEO_14_23, LANDUSE, false), waarbij het laatste argument OpenCL uitschakelt (AERIUS@fb8812f:SJ/srm/version/AeriusSRMVersion.java:41-42). Een ontwikkeldocument zegt nog steeds dat OpenCL vereist is (AERIUS@fb8812f:doc/development_setup.md:838-839).

Algoritme. Wegen worden gesplitst in segmenten van ten hoogste 2 m met emissie per meter E / 31,536 / length (SJ/srm2/algorithm/SRM2Algorithm.java:187-199; SJ/srm2/conversion/AbstractSRMConverter.java:64-83). De concentratie is een Gaussische lijnsegmentkern, gesommeerd over 36 windsectoren met de PreSRM-windroos van de receptor, met sigma_z = a R^b / (1 + 0.5 (1 - exp(-(R/2800)^2))) + sigma_z0, parameters per vier ruwheidsklassen, en een meteorologische correctie die tussen Schiphol en Eindhoven wordt geïnterpoleerd (SRM2Algorithm.java:72-122,204-206; SJ/srm2/algorithm/RoughnessUtil.java:33-71; SJ/srm2/algorithm/MeteoUtil.java:45-144). De initiële dispersie hangt af van snelweg of niet, hoogteligging, schermen en wanden (AERIUS@fb8812f:source/commons-aerius/aerius-commons-shared/src/main/java/nl/overheid/aerius/srm2/conversion/Sigma0Calculator.java:27-89). Tunnelfactoren onder 0,001 laten een segment vervallen (SJ/srm2/conversion/SRM2SegmentSRMConverter.java:42,102-117). NO2 volgt NO2 = NOx f_direct + NO O3 / (NO + K) met K = 100 en achtergrond-O3 per sector (SJ/srm2/algorithm/SRM2AlgorithmNOx.java:49,145-195). Depositie is de concentratie maal een depositiesnelheid per receptor uit een CSV van zoomniveau 2 en een afstandsfactor a ln(clamp(R, 25, 1000)) + b (SJ/srm2/algorithm/DVFactor.java:26-63; SJ/srm/backgrounddata/SRMDepositionVelocityMap.java:30-107).

5 km. MAX_SOURCE_DISTANCE = 5000 (SJ/srm/SRMConstants.java:59); receptoren zonder bron binnen 5 km krijgen nul (SJ/srm2/calculation/SRM2Calculator.java:55,128). Voorbij 5 km wordt dezelfde weg door OPS met -mindist berekend (OPS@e62fdf7:ops_lt/src/m_commonconst_lt.f90:54). [INF] Omdat OPS punten van 25 m gebruikt en SRM2 segmenten van 2 m, is de naad bij 5 km consistent tot ongeveer 12 m.

5.7 Aggregatie

De resultatenwachtrij van de chunker wacht op alle sectorgroepresultaten van een punt en telt ze per resultaatsleutel op, waarbij NaN wordt overgeslagen; OPS plus SRM2 is een gewone som (AERIUS@fb8812f:CH/theme/own2000/OwN2000CalculationResultQueue.java:25-29; CH/base/AggregatedCalculationResultQueue.java:146-201). De totale stikstof NOXNH3_DEPOSITION is NOx-depositie plus NH3-depositie, bij het lezen afgeleid en als eigen resultaatset opgeslagen (SH/domain/result/EmissionResults.java:88-103; REPO/calculator/CalculationRepository.java:576-583). Resultaten worden onafgerond opgeslagen (DB/main/sql/calculator_common/calculations/02-tables.sql:147-154). De projectbijdrage per receptor is voorgesteld minus referentie minus off-site-reductie (DB/main/sql/calculator_common/calculator/10-public/03-functions/02-project_calculation.sql:7-24).

5.8 Grens en afronding

De ondergrens voor vergunningen is databasegegeven: permit_lower_bounds (code, label, value) = ('arithmetic', 0.005, 0.00499999) (AERIUS@fb8812f:DB/data/sql/nl-latest/permit_lower_bounds/load.sql:1-4; identiek in nl-stable). Het label is de weergegeven waarde en de waarde is "the nearest not included value" voor de vergelijking (SH/domain/calculation/PermitLowerBound.java:21-26). Er bestaat ook een constante PRONOUNCEMENT_THRESHOLD_VALUE = '0.00499999' ("Drempelwaarde. Only show results for receptors that have a deposition above this threshold") (DB/main/sql/common/constants/nl_constants.sql:3-6). De statistiekbasis filtert ABS(calculation_results.result) > v_permit_lower_bound op depositie (DB/main/sql/calculator_common/calculator/10-public/03-functions/02-project_calculation.sql:336-341), en dezelfde regel komt voor bij projectresultaten, receptorselectie, tijdelijk effect, in combinatie, archief en de kaartlagen (02-project_calculation.sql:79-95,106-122; 05-temporary_effect.sql:75-91; 06-in_combination.sql:100,241; 07-archive_contribution.sql:96,237; DB/main/sql/calculator_common/calculations/04-views/11-wms.sql:61). De hulpfunctie ae_abs_threshold geldt alleen voor depositie van stof 1711 (NOx + NH3) (DB/main/sql/calculator_common/calculations/04-views/02-result_functions.sql:7-16).

Afronding is alleen voor weergave: twee decimalen (EMISSION_RESULT_DISPLAY_ROUNDING_LENGTH = 2, DB/data/sql/nl-common/system/product_constants.sql:22-26; WUI/i18n/MessageFormatter.java:220-235), en het PDF-overzicht toont "-" onder het label en leidt anders de precisie af van de schaal van het label (WUI/print/own2000/Overview.java:270-295,323-351). [INF] De beslissing wordt dus genomen op de onafgeronde depositie NOx + NH3 (strikt groter dan 0,00499999), en zowel toenames als afnamen onder de grens vallen weg. Een waarde van 0,005 telt mee en wordt weergegeven als 0,01. Label en waarde verschillen in een smal venster: een meetellende waarde in (0,00499999; 0,005) wordt bij twee decimalen als 0,00 getoond, en het PDF-overzicht toont "-" voor een gebied waarvan de maximale toename onder het label 0,005 ligt, dat het als vergelijkingswaarde neemt en waaruit het twee decimalen afleidt (WUI/print/own2000/Overview.java:275,290,323-326,351; WUI/util/PermitLowerBoundDisplayUtil.java:72-87). Buiten dat venster telt een weergegeven 0,00 niet mee. Gemiddelden over subreceptoren met een lange decimale schaal en sommen van NOx + NH3 kunnen in het venster terechtkomen; in de gesommeerde Monte Carlo van F9 gebeurde dit bij 4 van 1,56 miljoen steekproeven [RUN, sum_near_summary.txt]. De Handreiking over randeffecten bij 25 km zegt dat de Calculator alleen resultaten "> 0,005" toont [R15, blz. 13 en 15], wat op de grens in strijd is met de code. In de Connect-batch was de hoogste hexagoonwaarde van de bouwcase D01 0,00228 mol/ha/j, dus geen hexagoon zou meetellen; K04 (33 kg NOx/j) en K08 (20 kg NOx/j) waren de enige jobs met één bron waarvan hexagonen boven de grens lagen [RUN, D01/samenvatting.json, K04/samenvatting.json, K08/samenvatting.json].

5.9 Maximum per Natura 2000-gebied en hexagonen met hersteldoel

ae_fill_project_stats_assessment_area berekent per beoordelingsgebied, hexagoontype en overlaptype de maximale toename max(result) FILTER (result > 0), de maximale afname, aantallen en oppervlak, over de statistiekbasis, dat wil zeggen over onafgeronde hexagoonwaarden boven de grens, gekoppeld aan relevant habitat (AERIUS@fb8812f:DB/.../02-project_calculation.sql:325-398,496-513). De hexagoontypen zijn relevant_hexagons (relevant habitat), exceeding_hexagons (receptoren in exceeding_receptors, "for which the (nitrogen) deposition exceeds the critical deposition value (KDW - 70 mol)") en extra_assessment_hexagons (hersteldoel) (DB/main/sql/common/areas_hexagons_and_receptors/01-types.sql:82-83; DB/main/sql/common/areas_hexagons_and_receptors/04-views/setup/mapping_areas_receptors.sql:73-92; DB/main/sql/common/areas_hexagons_and_receptors/02-tables/02-receptors_hexagons.sql:96-104). Voor het OwN2000-projectrapport gebruikt de PDF EXCEEDING_HEXAGONS, en voor de hersteldoelbijlage EXTRA_ASSESSMENT_HEXAGONS (SH/domain/pdf/ResultsKeyCollector.java:154-162). Dit komt overeen met het Handboek, dat zegt dat PDF-resultaten altijd die van de "OwN2000-registratieset (de overbelaste en bijna overbelaste relevante hexagonen)" zijn [R10, paragraaf 7.6.2]. De lijst van dergelijke hexagonen voor 2026 is exceeding_receptors_20260622.txt in dbdata (DB/data/sql/nl-common/areas_hexagons_and_receptors/data/general_26.sql:32); de open-datalaag bevat per hexagoon een vlag exceeding (DB/main/sql/calculator_common/opendata/general.sql:58). [INF] De cijfers in de PDF betreffen daarom relevante hexagonen waarvan de totale depositie boven de kritische depositiewaarde min 70 mol/ha/j ligt; de volledige set relevante hexagonen staat in de GML-resultaten. De markeringsreceptor (ae_fill_project_stats_markers) is de eerste op resultaat aflopend, daarna op receptor-ID (02-project_calculation.sql:551-573). Hexagonen met een hersteldoel worden van deze statistieken uitgesloten en apart samengevat (:372,391-396,607,619-655,686,698-712); zij verschijnen alleen in de bijlage "Hulpmiddel beoordeling hexagonen met een hersteldoel" (paragraaf 6.3).

5.10 Bouwemissies en tijdelijk effect

In de keten zit geen logica voor tijdvensters. OPS ontvangt q = E / 31,536 g/s met EMCORFAC 1.0 (AERIUS@fb8812f:OJ/io/BrnFileWriter.java:173; OJ/io/OPSSetting.java:49), en SRM2 deelt door dezelfde constante (paragraaf 5.6). De IMAER-activiteitsgegevens zijn per jaar (bedrijfsuren per jaar, voertuigen per tijdseenheid omgerekend naar per jaar; paragraaf 5.2). Een bouwactiviteit die E kg in enkele weken uitstoot, wordt daarom berekend als E kg per jaar, continu uitgestoten over het meteorologische jaar met het dagprofiel van de bron. De Instructie gegevensinvoer legt de annualisering bij de gebruiker: de depositie wordt gemodelleerd voor "de aaneengesloten 12 maanden [...] waarvoor de depositie het hoogst is" [R13, paragraaf 2.3]. IMAER heeft geen veld voor de duur: de offroadbron draagt brandstof, bedrijfsuren en AdBlue per jaar en een vermogen (IMAER@f2a401b:gmlapplicatieschema/6.0.2/IMAER.xsd:3651-3670), en verkeer wordt per tijdseenheid gegeven (paragraaf 5.2). [RUN] De twee coderingen van de batch, D01 (activiteit gespreid over twee weken) en D02 (dezelfde activiteit over twaalf maanden), zijn daarom op de namen na dezelfde GML (D01/request.gml, D02/request.gml), en hun resultaten waren identiek op alle 56 071 receptoren met een maximaal absoluut verschil van 0 (duurtoets.json). De toets bevestigt dat de duur niet in de berekening kan doorwerken en dat twee afzonderlijke jobs met dezelfde invoer bitidentieke resultaten geven; zij toetst geen duurparameter, omdat er geen bestaat. Voor meerjarige bouw vereist het jobtype MAX_TEMPORARY_EFFECT TEMPORARY-situaties (IMAER-java@ecdc81b:IS/domain/calculation/CalculationJobType.java:50-96), en de SQL neemt per receptor het maximum over de tijdelijke berekeningen, waarbij "the hexagon set of the union of all temporary situations" leidend is (AERIUS@fb8812f:DB/main/sql/calculator_common/calculations/04-views/02-result_functions.sql:375-404). [INF] De duur heeft dus alleen geen effect voor werk dat binnen één venster van 12 maanden past. Voor langer werk voert de gebruiker de emissie in van de 12 opeenvolgende maanden met de hoogste depositie [R13, paragraaf 2.3], of één TEMPORARY-situatie per periode met MAX_TEMPORARY_EFFECT; het samendrukken van het werk verhoogt de emissie in het slechtste venster of de slechtste periode en kan daarom het resultaat verhogen.

Antwoord op RQ2. Een IMAER-bestand wordt geparseerd en gevalideerd; codes kunnen stilzwijgend uit een databasetabel worden omgezet; emissies van standaardbronnen worden herberekend uit activiteitsgegevens en gesloten factoren voor het rekenjaar; de opties worden vervangen door een vaste formele set; de job wordt gesplitst per situatie en per receptorchunk van hexagonen met relevant habitat binnen 25 km; OPS (meteorologie 2014 tot 2023, prognosechemie van 2030 voor jaren vanaf 2024, landgebruik per receptor) berekent alle bronnen en SRM2 voegt wegen binnen 5 km toe; hexagonen binnen 300 m van een bron nemen het gemiddelde van 96 of 384 subpunten met habitat; engine- en sectorresultaten worden gesommeerd; en in SQL telt een hexagoon mee wanneer de onafgeronde depositie NOx + NH3 hoger is dan 0,00499999 mol/ha/j, met een weergave in twee decimalen.


6. Producten en interfaces

6.1 Connect API v8

Endpoints. Het openbare NL-profiel publiceert de specificaties common, own2000 en analysis onder /api/v8 (AERIUS@fb8812f:source/calculator/aerius-connect-service/src/main/resources/application-nl.properties:1-12; API/api-common.yaml:45-46).

EndpointGedragBewijs
POST /utility/validate (strict){successful, errors, warnings}; strict maakt van waarschuwingen foutenAPI/api-common.yaml:58-88; CS/resource/UtilityResource.java:113-170
POST /utility/validateAndConvert, /utility/convertOmzetten naar de nieuwste IMAER; convert negeert waarschuwingenAPI/api-common.yaml:113-182
GET /jobs, GET /jobs/{key}, POST /jobs/{key}/cancelJobs weergeven en beherenCS/resource/JobsResource.java:49-74
receptorSetsSets van eigen rekenpuntenAPI/api-common.yaml:333-415
GET /info/version{aeriusVersion, databaseVersion}API/api-common.yaml:416-429
POST /own2000/calculateHoofdberekening (hoofdstuk 5)API/api-own2000.yaml:44-126
POST /analysis/own2000Analyse van eigen rekenpuntenAPI/api-analysis.yaml:45-78

Verzoek. Multipart met een JSON-deel options (outputType GML of PDF; optioneel calculationYear, sendEmail standaard true, receptorSetName, appendices, calculationPointsType), een JSON-array files en binaire fileParts; een deel wordt aan een item gekoppeld wanneer zijn bestandsnaam eindigt op de fileName van het item (API/api-common-abstract.yaml:24-68; CS/resource/CalculateResource.java:105-126). Meerdere bestanden van hetzelfde situatietype zonder groupId worden samengevoegd tot één situatie, en een OFF_SITE_REDUCTION zonder factor krijgt 0,3 (CS/service/ScenarioService.java:177-196,315-319).

Waargenomen gedrag [RUN]. In de batch gaven 13 indieningen binnen 93 seconden, ten hoogste 3 gelijktijdig, geen fout (batch-uitkomst.json). Elke GML-job duurde van aanmaak tot einde 16 tot 33 s, de PDF-job 58 s. Een werktuigjob meldde 58 537 punten en sloeg een resultaat ongelijk aan nul op voor 55 977 receptoren; een job met een weg meldde 117 224 punten, eindigde met numberOfPointsCalculated 58 612 bij COMPLETED, en sloeg resultaten op voor 56 027 receptoren (56 071 voor het gecombineerde geval) (batch-uitkomst.json; K01/samenvatting.json; K09/samenvatting.json). [INF] Punten worden bij wegen eenmaal per engine (OPS en SRM2) geteld, terwijl de voortgangsteller er één van dekt, zodat de puntentellers niet als voltooiingscontrole kunnen dienen.

Foutgedrag. Validatiefouten geven HTTP 200 met successful:false, niet de 440 die in de specificatie staat (CS/resource/CalculateResource.java:79-91; API/api-own2000.yaml:75-76). Fouten in opties, sleutel, situatiemix en jaar worden HTTP 400 met een gelokaliseerd bericht en een referentie, zonder de numerieke code (CS/service/ResponseService.java:71-87). Connect zet interne toestanden om naar RUNNING (voorbereiden, berekenen, nabewerken) en INITIALIZED (in de wachtrij), en geeft andere namen ongewijzigd door, zodat een zojuist aangemaakte job CREATED meldt (CS/service/JobsService.java:89-96). Voor PDF-uitvoer wordt het jobtype afgedwongen op PROCESS_CONTRIBUTION: precies één PROPOSED-situatie, optioneel één REFERENCE- en OFF_SITE_REDUCTION-situatie, en TEMPORARY wordt met HTTP 400 geweigerd voordat een job wordt aangemaakt (CS/service/OwN2000CalculateService.java:101-107; CS/util/CalculationJobTypeValidator.java:57-77).

6.2 Het PDF-rapport

De PDF-worker maakt per PROPOSED-situatie een PDF AERIUS_projectberekening en, voor Connect, altijd een bijlage AERIUS_extra_beoordeling, en zipt ze (AERIUS@fb8812f:WK/pdf/RIVMPdfCustomerProvider.java:40-58; WK/pdf/PdfExportHandler.java:79-125; CS/service/OwN2000CalculateService.java:120-153). Headless Chromium print de SPA-route /print?..., die de printdata van de job uit de Connect-dienst leest (EXP/util/PdfUrlBuilder.java:43-72), met het mechanisme van webdocument-exporter@b2cc505:src/main/java/nl/aerius/print/ExportJob.java:139-191. iText voegt daarna paginaopmaak toe, een watermerk als het releasetype niet PRODUCTION is, de bijlage en de titel, en schrijft het bestand opnieuw weg (EXP/util/PdfContentProcessor.java:114-233).

Ingebedde ZIP. Alleen de projectberekening draagt een bijlage (SH/domain/PdfProductType.java:41-48): een ZIP met GML-bestanden voor de REFERENCE, de OFF_SITE_REDUCTION en de PROPOSED-situatie, met resultaten maar zonder hexagoonpolygonen, elk met een nieuwe vergunningreferentie; TEMPORARY-situaties worden nooit bijgevoegd (WK/pdf/PdfCalculatorWorkerFactory.java:173-178; WK/pdf/PdfSituationFilter.java:36-39,52-53,84-97; IMA/importer/PermitGMLWriter.java:52-55). Hij is ingebed als bestandsbijlage met MIME application/zip. [RUN] De projectberekening van job P01 bevestigde dit: zij draagt één ingebed bestand AERIUS_<timestamp>_<token>_onderzoek-connect-batch-1-P01.zip, en de PDF extra-beoordeling heeft geen bijlage (P01/samenvatting.json). Wij hebben de ingebedde ZIP uitgepakt en de receptorresultaten ervan vergeleken met de resultaat-GML van job D01, die dezelfde invoer had: beide bevatten 56 071 receptoren, met identieke waarden op elke receptor en geen enkele die in slechts één van beide voorkomt (P01/embedded-vs-D01.json). De PDF-route en de GML-route leveren dus hetzelfde rekenresultaat voor dezelfde invoer. Opnieuw importeren accepteert dit formaat en twee verouderde formaten met GML in het Info-woordenboek (IMA/paa/PAAImport.java:49-98; IMA/paa/LegacyPAAImport.java:42-48).

Gegevensbewaring. Na een PDF-job worden de rekenresultaten uit de database verwijderd, tenzij de worker is geconfigureerd met keepResultsAfterExport of de situatienaam een vaste tekenreeks bevat (WK/pdf/PdfCalculatorWorkerFactory.java:73,215-235; bevinding F20).

6.3 De hersteldoelbijlage

Het "Hulpmiddel beoordeling hexagonen met een hersteldoel" is OWN2000_EXTRA_ASSESSMENT_APPENDIX (AERIUS@fb8812f:DB/data/sql/common/i18n/messages/messages_nl.sql:15,17; EXP/PdfGenerator.java:97-104). Een hexagoon met een hersteldoel is een receptor in extra_assessment_receptors, dat wil zeggen gedekt door een habitat in een eerdere dataset zoals T0 maar nu niet meer, "for instance if the goal is to restore the habitat" (DB/main/sql/common/areas_hexagons_and_receptors/02-tables/02-receptors_hexagons.sql:124-142); de lijst voor 2026 is grid.extra_assessment_receptors_20260604.txt (DB/data/sql/nl-common/areas_hexagons_and_receptors/data/general_26.sql:11). De bijlage bevat per gebied de maximale bijdrage op zulke hexagonen boven de grens (02-project_calculation.sql:619-655). Zij bevat geen GML (PdfProductType.java:44-48). De Handreiking noemt een regel die uit de subreceptorlogica volgt: wanneer een bron binnen 300 m van een hexagoon met een hersteldoel ligt, wordt voor die hexagoon geen resultaat getoond [R14, paragraaf 1.5], omdat subreceptoren alleen behouden blijven waar zij relevant habitat overlappen, en een hexagoon met een hersteldoel er geen heeft (paragraaf 5.4; [R10] paragraaf 3.6).

6.4 Calculator-UI tegenover Connect

AspectUI (/ui/calculation)Connect (own2000/calculate)Bewijs
ModeloptiescreateOwN2000CalculationSetOptionsidemUiCalculateService.java:177; OwN2000CalculateService.java:111
PDF-jobtypeuit UI-optiesafgedwongen PROCESS_CONTRIBUTIONUiCalculateService.java:208-219; OwN2000CalculateService.java:101-107
Geüploade resultaten, eigen rekenpuntengelezenverwijderd, niet gelezenImporterWorker.java:84-95; ScenarioService.java:118-122
Chunking2 000 receptoren per taaktot 850 000CH/theme/own2000/OwN2000CalculatorFactory.java:147-151
Wachtrijprioriteit4 (kleine UI)0paragraaf 5.3
Export van eerdere resultatenhergebruik via FAST_EXPORT mogelijkaltijd een nieuwe berekeningUiCalculateService.java:243-283

[INF] Voor hetzelfde scenario, dezelfde opties en dezelfde dataversie zouden beide paden identieke resultaten per receptor moeten geven: de opties komen uit hetzelfde hulpprogramma, de emissies worden door dezelfde code herberekend, en de end-to-endtests van Connect vergelijken resultaatwaarden exact met golden fixtures (AERIUS@fb8812f:source/calculator/aerius-connect-service-test/src/test/e2e/cypress/e2e/common/commonPage.ts:1068-1110). Of de chunkgrootte de OPS-resultaten per receptor beïnvloedt, is niet geverifieerd. Een vergelijking van dezelfde invoer in de Calculator-UI met de Connect-resultaten van K01 en D01 is voorbereid als handmatige stap (manifest.json, item M01) en was nog niet uitgevoerd toen deze versie werd geschreven, zodat deze uitspraak een afleiding blijft.


7. Data (RQ3, datazijde)

7.1 Wat elke stap nodig heeft

StapDataStatus
Parseren en validerenXSD en codelijstenOpenbaar (IMAER@f2a401b)
Coderemaps (5266)system.gml_conversions_sector_20260528Gesloten (dbdata)
EmissiesOffroad-EF per liter, uur, kWh, AdBlue-verhouding; vermogensvlaggen en bereiken; weg-EF per snelheidsprofiel en stagnatie; landbouw, scheepvaart, koude startGesloten (dbdata; bijv. DB/data/sql/nl-common/emission_factors/*_26.sql)
BronkenmerkenOffroad-categoriesets (mobile_source_off_road_characteristic_sets_20250828, ..._category_characteristics_20250527); sectorstandaarden (sector_default_source_characteristics_20260728)Gesloten (DB/data/sql/nl-common/emission_factors/mobile_source_off_road_26.sql:6-7; DB/data/sql/nl-common/sectors/data_26.sql:1-5)
Receptorset en habitatgeometrieincluded_receptors, hexagonen, relevante habitattypen, hersteldoellijstGesloten als bestanden; openbaar als WFS-lagen (7,3)
Gebiedsvolgorde en statistiekenassessment_areas, receptors_to_assessment_areasGesloten (dbdata); [INF] te vervangen door de Natura 2000-grenzen van PDOK
OPSBinary, meteo, chemie- en achtergrondkaarten, LGN2023, gebouwentabellen, terrein per receptorOpenbaar (7,3)
SRM2PreSRM-windroosen en achtergronden, z0-kaarten, depositiesnelhedenOpenbaar (7.3)
Grens, weergave, limietenpermit_lower_bounds, system.constantsOpenbaar (SQL in git)
Achtergronddepositie (voor rapportage, niet voor de projectbijdrage)receptor_background_results_20260727 en gerelateerdeGesloten als bestanden (DB/data/sql/nl-common/receptor_backgrounds/data_26.sql:1-3); openbaar als open-datalaag [INF] (7,3)

7.2 Gesloten: dbdata

De productdatabase wordt gebouwd met Ruby-tooling die databestanden downloadt van https://nexus.aerius.nl/repository met basisauthenticatie (AERIUS@fb8812f:DB/build/config/AeriusSettings.rb:12,21-23; database-build@673f770:bin/SyncDBData.rb:133-141; bin/HTTPSDownloader.rb:93-95). Anonieme verzoeken aan .../repository/dbdata/aeriusII/... gaven HTTP 401 [RUN]. De oudere emission-service toont hetzelfde patroon voor zijn eigen dataset (2023), waarvan de laatste datawijziging 2023-12-21 was en die geen endpoint voor offroad of per kWh heeft (emission-service@d172ecf:source/database/src/data/sql/datasets/load.sql:62-70; source/rest-service/.../repository/). Geen enkel databestand in welke repository dan ook gaat vergezeld van een checksum of grootte (bevinding F15).

7.3 Openbaar: modelpakketten en open data

De OPS-worker downloadt modeldata van ops.model.data.url = https://nexus.aerius.nl/repository/resources met het patroon <model>/<version>.tar.gz, zonder inloggegevens in de code (AERIUS@fb8812f:source/calculator/aerius-worker/src/main/config/worker.template.properties:47,76; UT/util/ModelDataUtil.java:73-92,156-167). Anonieme downloads slaagden [RUN] voor:

  • resources/ops/5.3.1.0-5.tar.gz (338 174 856 bytes): OPS-binaries voor Linux amd64 en aarch64 en Windows, 140 meteobestanden voor afzonderlijke jaren en de langetermijnsets m014123c.* en m005114c.*, chemiekaarten voor actueel (2018 tot 2024) en prognose (2024 tot 2035, 2040), LGN2023-kaarten voor z0 en landgebruik, dvepre.ops, pmdpre.ops, gammawater.ops en de gebouwentabellen;
  • resources/ops/ops_terrain_properties_20250619.tar.gz: terrein per receptor voor 6 778 036 receptoren;
  • resources/srm/aerius-presrm-2.504-1.tar.gz, presrm-lu-2.502.tar.gz en depositionvelocity-vd_zoomlevel-2_all_20250620.tar.gz (AERIUS@fb8812f:SJ/srm/worker/SRMDataUtilPreloader.java:74-89).

De open-data-WFS op https://connect.aerius.nl/opendata/wfs biedt lagen base_geometries (terreineigenschappen, hexagonen met relevantie- en KDW-vlaggen, koppelingen van hexagoon naar habitat, relevante habitattypen, hexagonen met hersteldoel) en een werkruimte depositions met achtergronddepositie (AERIUS@fb8812f:DB/main/sql/calculator_common/opendata/general.sql:1-187; source/geoserver/aerius-geoserver-opendata/); resultType=hits-queries slaagden anoniem [RUN]. In de Terraform van de AERIUS-repository staat /opendata/* achter Cognito (terraform/application_services/app.hcl:27-28), dus de repository beslist niet of productie bedoelt dat het anoniem is.

Gebruiksvoorwaarden voor OPS, neutraal weergegeven. Er bestaan drie verspreidingsroutes. (1) De OPS-broncode is gepubliceerd op GitHub onder GPL-3.0 (OPS@e62fdf7:LICENSE); de README zegt dat het model eigendom is van het RIVM en dat een uitvoerbaar bestand "met omgevingsdata" van de RIVM-website kan worden gedownload (OPS@e62fdf7:README.MD:8-12). (2) Het RIVM verspreidt OPS-Pro, met de meteorologische statistieken en kaarten, na registratie en aanvaarding van de "Gebruiksvoorwaarden OPS-PRO" [R9]; de link naar die voorwaarden op het formulier gaf op 2026-10-22 HTTP 404, en het document (versie 1.1, 25 juli 2012) is elders op rivm.nl gepubliceerd [R16]. De voorwaarden bepalen dat het gebruiksrecht wordt verkregen door registratie, en dat alle andere wijzen van verkrijging van OPS-Pro "zullen worden aangemerkt als een inbreuk op de rechten van het RIVM" (art. 2.1); dat kopieën voor anderen niet zijn toegestaan (art. 2.4); dat gebruik buiten de meegeleverde interface schriftelijke toestemming vereist (art. 2.6); dat gebreken met het RIVM moeten worden besproken voordat zij bekend worden gemaakt (art. 2.7); dat publicaties OPS-Pro moeten vermelden (art. 4.1); en dat software en data na gebruik moeten worden vernietigd (art. 8.2) [R16]. De OPS-meteohandleiding voegt toe dat "External users cannot produce meteo statistics themselves" (OPS@e62fdf7:USER_MANUAL.md:821). (3) De AERIUS-repository resources serveert het pakket ops/5.3.1.0-5 met de binaries, meteorologie en kaarten van het RIVM zonder registratie; de 412 items bevatten geen licentie-, gebruiksvoorwaarden- of README-bestand [RUN]. Onze OPS-runs gebruikten route (3), net als de eigen workers van AERIUS; wij hebben ons niet geregistreerd voor OPS-Pro en de voorwaarden niet aanvaard. Of die voorwaarden voor route (3) gelden, en onder welke voorwaarden het pakket voor onderzoek mag worden gebruikt, is uit het gepubliceerde materiaal niet vast te stellen, en dit paper beslist daar niet over. Dit paper verspreidt het pakket niet verder. In overeenstemming met art. 4.1: de OPS-resultaten in dit paper zijn geheel of gedeeltelijk verkregen met het OPS-model van het RIVM, versie 5.3.1.0 [R17].

Antwoord op RQ3. Openbaar: alle applicatiecode (GitLab-monorepo en GitHub-bibliotheken), de IMAER-standaard, de broncode van OPS en DepAC, de modelpakketten van OPS en SRM2, het terreinbestand per receptor, de beslisregels en weergaveconstanten (SQL in git), en de receptor- en habitatgeometrie als WFS-lagen. Gesloten: de dbdata-bestanden (emissiefactoren, bronkenmerken, sectorstandaarden, coderemaps, gebiedsgeometrieën en koppelingen, bestanden met achtergronddepositie), productieconfiguratiewaarden, Terraform-modules en containerimages. Afgeleid: de omzetting van 3220 naar 3300, effectieve productielimieten en wachtrijconfiguratie, de anonieme status van open data in productie, en elke hierboven met [INF] gemarkeerde uitspraak.


8. Beoordeling van de reproduceerbaarheid (RQ4)

8.1 Wat een offline replica kan

Een replica kan de openbare writers, runner en subreceptor-aggregator van aerius-commons-ops draaien met het OPS-productiepakket, de Java-SRM2Calculator met de openbare SRM-data, en de subreceptorgeometrie uit aerius-commons-util, met receptoren en habitatgeometrie uit de WFS [RUN voor de componenten; INF voor de harness]. De chunker en de workers hebben de productschema's en RabbitMQ nodig, maar een dunne harness die OPSPerformer en SRM2Calculator rechtstreeks aanroept, omzeilt beide [INF]. Onze OPS-run met een controlebestand in AERIUS-formaat was in ongeveer 1,7 s per stof voor 200 receptoren klaar [RUN].

8.2 Wat het niet kan zonder kalibratie

De gesloten invoer bestaat uit de emissiefactoren en de bronkenmerken (hoogte, warmte-inhoud, spreiding, dagprofiel). De batch mat de eerste rechtstreeks (paragraaf 5.2). De tweede werkt alleen door via de depositie, die de batch voor één locatie toont (K01/samenvatting.json tot D01/samenvatting.json; hexagoonwaarden in mol/ha/j):

JobNOx; NH3 (kg/j)Hoogste hexagoonWaarvan NOx; NH3NOx-depositie per kg NOx
K01 (Stage IV, SCR, 100 kW)2,6; 0,210,001380,00066; 0,000722,5e-4
K02 (idem, 300 kW)7,8; 0,630,004140,00198; 0,002162,5e-4
K03 (Stage IIIB, 100 kW)11; 0,0070,002890,00287; 0,000022,6e-4
K04 (Stage IIIB, 300 kW)33; 0,0210,008670,00860; 0,000072,6e-4
K07 (Stage IV onder 56 kW, 40 kW)5,84; 0,00280,001970,00196; 0,000013,4e-4
K08 (ZUT, 100 u)20; 0,1470,007140,00658; 0,000563,3e-4
K09 (licht verkeer)0,714; 0,0840,000680,00033; 0,000354,6e-4
K10 (zwaar verkeer)1,764; 0,0540,001190,00096; 0,000235,4e-4
D01, D02 (bouwcase)4,27; 0,3390,002280,00111; 0,00117n.v.t.

Er volgen drie waarnemingen [RUN]. Ten eerste schaalt de depositie bij een vaste categorie met de emissie: een verdrievoudiging van het vermogen vermenigvuldigde de hoogste hexagoonwaarde met 3,000 (K01, K02) en 2,999 (K03, K04), binnen de vier significante cijfers die OPS afdrukt. Ten tweede is de hoogste hexagoon niet in elke job dezelfde receptor (receptor 5100297 op 1 156,6 m van de bron voor K01, K02, K05, K06, K09, K10 en D01; receptor 5098769 op 1 170,4 m voor K03, K04, K07 en K08), zodat de laatste kolom deels verschillende hexagonen vergelijkt. Receptor voor receptor vergeleken over alle 55 977 receptoren is de NOx-depositie per kg NOx van K02 tot K06 gelijk aan die van K01 binnen 0,1 % (5e tot 95e percentiel), terwijl K07 (Stage IV onder 56 kW) en K08 (ZUT) per kg meer deponeren op receptoren nabij de bron. De onderstaande tabel geeft de verhouding tot K01 (per receptor de NOx-depositie per kg NOx van K07 of K08 gedeeld door die van K01) per afstandsklasse vanaf het bronpunt van K01 (berekend uit K01/receptoren.csv.gz, K07/receptoren.csv.gz en K08/receptoren.csv.gz met de emissies van de samenvatting.json-bestanden):

Afstand tot de bronReceptorenK07: minimum; mediaan; maximumK08: minimum; mediaan; maximum
onder 2 km431,29; 1,37; 1,511,26; 1,34; 1,46
2 tot 5 km541,38; 1,66; 1,801,34; 1,59; 1,72
5 tot 10 km3911,03; 1,56; 1,841,02; 1,51; 1,78
10 tot 10,05 km71,46; 1,48; 1,721,43; 1,45; 1,67
10,05 tot 11 km1211,04; 1,48; 1,661,04; 1,45; 1,62
11 tot 12 km3160,99; 1,19; 1,580,99; 1,19; 1,54
12 tot 13 km8780,99; 1,18; 1,530,99; 1,18; 1,50
13 tot 14 km1 3080,99; 1,01; 1,490,99; 1,01; 1,47
14 tot 15 km2 0970,99; 1,01; 1,430,99; 1,01; 1,42
voorbij 15 km50 7620,95; 1,01; 1,410,95; 1,01; 1,40

De verhouding verandert niet bij een grens op 10 km: zij is het hoogst tussen 2 en 10 km, haar mediaan is tot 11 km nog ongeveer 1,5, ongeveer 1,2 tussen 11 en 13 km en ongeveer 1,0 vanaf 13 km, en de 7 receptoren tussen 10 en 10,05 km hebben nog steeds verhoudingen van 1,43 tot 1,72. Over de 488 receptoren binnen 10 km is de verhouding 1,03 tot 1,84 voor K07 (mediaan 1,55; 5e tot 95e percentiel 1,33 tot 1,75) en 1,02 tot 1,78 voor K08 (mediaan 1,51; 1,30 tot 1,68); over alle 55 977 receptoren is de mediaan 1,009 voor K07 en 1,011 voor K08. De drie vermogenscategorieën gedragen zich dus als één set bronkenmerken en de twee andere categorieën verschillen. Dit komt het meest aannemelijk door de gesloten bronkenmerken (hoogte, warmte-inhoud, spreiding of dagprofiel), en het is de grootte van de fout die een replica maakt als zij voor alle categorieën één set kenmerken gebruikt. Ten derde draagt bij de Stage IV-machine met SCR de 0,21 kg NH3 meer depositie bij dan de 2,6 kg NOx; per kg deponeert NH3 op deze hexagoon ongeveer 14 keer meer dan NOx. Deze getallen gelden voor één locatie en één release.

8.3 Verwachte precisie van een replica

[INF] Met dezelfde OPS-binary, hetzelfde datapakket, hetzelfde controlebestand en dezelfde invoer zouden OPS-resultaten tot het laatste afgedrukte cijfer reproduceerbaar moeten zijn, aangezien OPS deterministisch is en per receptor wordt geparallelliseerd; de bitidentieke resultaten van D01 en D02 ondersteunen dit voor de productiedienst [RUN, duurtoets.json]. OPS drukt vier significante cijfers af [RUN], een relatieve resolutie van 1e-4 (5e-7 mol/ha/j nabij 0,005). Het gemiddelde over subreceptoren voegt een afrondingsfout toe (F9). Hoe nauw een offline replica met geschatte bronkenmerken per hexagoon met Connect overeenstemt, is in dit paper niet gemeten. Paper 2 maakte een eerste, gedeeltelijke vergelijking voor 11 van de 13 jobs op één locatie, met de gepubliceerde bronkenmerken (erratumverwijzing na het kernresultatenkader); zijn jobs hadden geen hexagoon binnen 300 m van een bron, waar het subreceptorgemiddelde geldt. Een replica ondersteunt daarom gevoeligheidsstudies, en geen van beide papers toont aan dat zij een oordeel nabij 0,005 ondersteunt.

8.4 Kalibratie via Connect en de geplande vergelijking

  1. Emissiefactoren (gedaan voor zeven klassen). Eén job per categorie met bekende activiteit geeft de factor, omdat het vermogenspad lineair is: EF_kWh = E * 1000 / (P * t) [RUN, paragraaf 5.2]. Wegfactoren volgen op dezelfde wijze per (wegtype, voertuigtype, snelheid, jaar).
  2. Versie. Elk batchresultaat legt /info/version vóór en na de batch vast (paragraaf 3.5); het releasebeleid zegt dat jaarlijkse actualisaties en hotfixes resultaten mogen wijzigen en functionele releases niet (AERIUS@fb8812f:doc/product_versions.md:33-70).
  3. Bronkenmerken en dispersie (hier gepland; Paper 2 voerde een eerste, gedeeltelijke versie met afwijkingen uit). De methode is vóór de vergelijking vastgelegd. (a) Draai de replica-harness (OPSPerformer en SRM2Calculator met de productiepakketten, subreceptoren zoals in de F9-harness) op de exacte aanvraag-GML's van K01 tot K10, met de factoren van paragraaf 5.2. (b) Pas voor elke werktuigcategorie hoogte, warmte-inhoud en spreiding aan op de Connect-resultaten per receptor van één vermogensniveau (K01, K03, K07, K08), met kleinste kwadraten op de log-depositie over alle receptoren met een resultaat ongelijk aan nul. (c) Valideer zonder opnieuw te fitten op de achtergehouden jobs (K02, K04, K06) en op het gecombineerde geval D01. (d) Rapporteer per job het relatieve verschil van de hoogste hexagoon, de verdeling van de verhoudingen per receptor (mediaan, 5e en 95e percentiel), en de overeenstemming van de set hexagonen boven 0,00499999, met de resultaten per receptor die in het datapakket van de batch zijn bewaard. (e) Acceptatiecriteria, vastgesteld vóór de vergelijking: de replica mag alleen voor gevoeligheidsanalyse worden gebruikt als de mediane verhouding per receptor binnen 1 % van 1 ligt en het 95 %-bereik binnen 5 %; geen enkel niveau van overeenstemming maakt haar tot een vervanging van een oordeel (hoofdstuk 10).

8.5 Grenzen van eigen rekenpunten

Eigen rekenpunten krijgen geen subreceptoren (IMAER-java@ecdc81b:IS/domain/calculation/SubReceptorsMode.java:44-48), dus binnen 300 m van een bron geven zij de waarde in één punt op 4 m (OPS) of 1,5 m (SRM2), niet het habitatgemiddelde van 96 of 384 punten. Eigen rekenpunten in een berekenings-GML worden niet gelezen; Connect heeft voor CUSTOM_POINTS een receptorSetName nodig (AERIUS@fb8812f:CS/service/AbstractCalculateService.java:255-269), en hoogtes van eigen rekenpunten worden gewist tenzij receptorhoogtes zijn ingeschakeld (CH/theme/own2000/OwN2000CalculatorFactory.java:181-190). De terreinopzoeking voor eigen rekenpunten is niet getraceerd. Voor kalibratie nabij bronnen moeten FORMAL-resultaten worden gebruikt.

Antwoord op RQ4. Omdat modelcode, modeldata, terrein, receptorset en beslisregels openbaar zijn, is een offline replica van de OPS- en SRM2-delen realistisch en zou zij bij identieke invoer vrijwel exact moeten zijn. Emissiefactoren kunnen via Connect worden gemeten, zoals wij voor zeven klassen deden. Wat een getrouwe replica, voor zover dit paper laat zien, nog in de weg stond, zijn de bronkenmerken, die dit paper als gesloten beschouwde (Paper 2 vond ze gepubliceerd voor mobiele werktuigen en wegen; erratumverwijzing na het kernresultatenkader) en waarvan het effect op de depositie per kg tussen categorieën verschilt: voor K07 en K08 heeft de verhouding tot K01 in elke afstandsklasse onder 10 km een mediaan tussen 1,34 en 1,66 en ongeveer 1,5 over de 488 receptoren binnen 10 km van onze testlocatie (afzonderlijke receptoren 1,02 tot 1,84), tegenover ongeveer 1,01 voorbij 15 km (paragraaf 8.2). Paper 2 maakte een eerste, gedeeltelijke vergelijking per hexagoon van een replica met Connect (11 van de 13 jobs, één locatie, geen hexagoon binnen 300 m van een bron); de kalibratie van paragraaf 8.4 zoals gepland is niet uitgevoerd. Een replica ondersteunt gevoeligheidsanalyse, en geen van beide papers toont aan dat zij een betrouwbaar oordeel 0,00 tegenover 0,01 ondersteunt.


9. Bevindingen (RQ5)

Ernstschaal: Hoog: kan een voor de vergunning relevant resultaat wijzigen of een beveiligingseigenschap voor veel gebruikers in gevaar brengen; Gemiddeld: raakt juistheid, integriteit of beschikbaarheid onder realistische omstandigheden; Laag: beperkte impact of onwaarschijnlijke omstandigheden; Info: documentatie, hygiëne of interpretatierisico.

IDBevindingBewijsErnst
F7Ongedocumenteerde toestand CREATED. JobStatus.status is in de specificatie een vrije tekenreeks, en de mapping geeft CREATED ongewijzigd door voor een job die nog niet in de wachtrij staat. Clients die statussen opsommen, kunnen deze verkeerd indelen.API/api-common.yaml:573-575; CS/service/JobsService.java:89-96Laag
F8Specificatie tegenover gedrag bij fouten. De specificatie verklaart 440 voor validatiefouten; de code geeft 200 met successful:false. Fouten in opties, sleutel, situatiemix en jaar zijn 400 met gelokaliseerde tekst en zonder numerieke code.API/api-own2000.yaml:75-76; CS/resource/CalculateResource.java:79-91; CS/service/ResponseService.java:71-87Laag
F9Subreceptorgemiddelde afgerond op de decimale schaal van de som. Het gemiddelde is BigDecimal.valueOf(sum).divide(BigDecimal.valueOf(n), HALF_UP), dat de schaal behoudt van de kortste decimale weergave van sum, zodat de fout een halve eenheid van de laatste decimaal kan bereiken; bijvoorbeeld 0.48 / 96 = 0.01 (werkelijk 0,005) en 0.4 / 96 = 0.0 (werkelijk 0,0042) [RUN, jshell]. Met de echte AERIUS 2026.0.0-klassen en de OPS-productiebinary op 4 680 hexagoonresultaten (390 hexagonen, 6 emissieniveaus, 2 stoffen) waren 25,3 % van de sommen kort (ten hoogste 6 decimalen); 6,5 % van de gemiddelden week relatief meer dan 1e-4 af en de grootste fout was 1,1 % (2.622 / 96 geeft 0,027 tegenover 0,0273125); geen van deze hexagonen veranderde van oordeel [RUN, main.csv]. Twee Monte Carlo-runs herschaalden de echte subpuntvelden naar gemiddelden tussen 0,004 en 0,006 mol/ha/j. (a) Op het gemiddelde van één stof week het oordeel bij 0,00499999 af in 302 van 1,56 miljoen steekproeven (1,9e-4); in 297 daarvan werd het gemiddelde meegeteld hoewel het exacte gemiddelde onder de grens ligt, en de omslagkans stijgt tot 0,2 voor exacte gemiddelden binnen 5e-7 onder de grens [RUN]. (b) AERIUS past de grens toe op het totaal NOx + NH3, de som van twee afzonderlijk afgeronde gemiddelden (SH/domain/result/EmissionResults.java:88-103). Op de 390 gepaarde NOx- en NH3-velden, met een willekeurig NH3-aandeel, week het oordeel over het totaal af in 225 van 1,56 miljoen steekproeven (1,4e-4): 119 telden mee met een exact totaal onder de grens en 106 telden niet mee met een exact totaal erboven, tot 0,006 mol/ha/j; de omslagkans was 0,07 voor exacte totalen binnen 5e-7 onder de grens en 1,1e-3 voor totalen erboven tot 0,0051 [RUN, sum_near_summary.txt]. [INF] Elk componentgemiddelde is kleiner dan het totaal en wordt op zijn eigen schaal afgerond, zodat de fout niet bij 0,005 verankerd is en in beide richtingen werkt; op de beslisvariabele slaat de fout niet consequent door naar het meetellen van de hexagoon. Een som met één decimaal en een gemiddelde onder 0,05 geeft 0,0. De bronkenmerken zijn illustratief, en totalen over meerdere sectorgroepen, die verdere afgeronde termen toevoegen, zijn niet gemodelleerd. Dezelfde deling bestaat in de releases van 2023, 2024 en 2025 [RUN]. De juiste bewerking is een deling met een vaste MathContext of schaal.AERIUS@fb8812f:UT/receptor/AbstractSubReceptorAggregator.java:203-209Laag tot gemiddeld (juistheid nabij de grens)
F10Ontbrekende refererende sleutel op voertuigcategorie. road_categories_fkey_road_vehicle_categories is gedeclareerd op road_type_category_id met verwijzing naar road_type_categories, zodat de voertuigcategorie nooit wordt gecontroleerd en het wegtype tweemaal. De fout zit in het sjabloon van de emission-service en in het kernproductschema.emission-service@d172ecf:source/database/src/main/sql/template/02-emission_factors/02-tables/roads.sql:111; AERIUS@fb8812f:DB/main/sql/calculator_common/emission_factors/02-tables/roads.sql:111Laag (data-integriteit)
F11Dataset nature2022 wijst naar schema nature2021. [INF] Een verzoek om nature2022 geeft data van 2021. Beperkt tot de bevroren emission-service.emission-service@d172ecf:source/database/src/data/sql/datasets/load.sql:48Laag
F12Receptor-ID-functie gedocumenteerd als foutief. ae_determine_receptor_id_from_coordinates(x, y, zoomlevel) draagt de opmerking "Note! This function contains a bug and only works for zoom level 1", en de methode ervan wordt beschreven in een niet-openbaar document. Wij vonden alleen aanroepers in unittests (zoom 1).AERIUS@fb8812f:DB/main/sql/common/geometric_utils/receptors.sql:34-36; database-modules@fba2337:source/modules/src/main/sql/database-modules/build_grid/02-geometric-utils/02-receptors.sql:34,68Info (latent)
F13OPS-handleiding noemt DIR_BG, code leest DIRBG. Een gebruiker die de handleiding volgt, krijgt stilzwijgend de standaard achtergrondmap.OPS@e62fdf7:USER_MANUAL.md:733; ops_lt/src/m_ops_read_ctr.f90:272; ops_lt/tst/level_1/resources/tst_m_ops_read_bg/tst_manual_dir_bg.ctr:22Laag
F14Verouderde documentatie van standaardwaarden. Een Javadoc zegt nog dat 80 km/u wordt gezet voor NON_URBAN_ROAD_NATIONAL; de code zet sinds 2026-06-26 60. Een ontwikkelgids zegt dat SRM2 OpenCL vereist; de OwN2000-standaard is CPU.IMAER-java@ecdc81b:G/gml/base/source/road/GML2Road.java:117,126-145 (commit b21b03ee); AERIUS@fb8812f:doc/development_setup.md:838-839Info
F15Herkomst van data niet verifieerbaar. Voor geen enkel dbdata-bestand is een checksum of grootte vastgelegd, en de HTTPS-downloader schrijft de responsbody weg ongeacht de statuscode, zodat een foutpagina als data zou kunnen worden geladen.database-build@673f770:bin/HTTPSDownloader.rb:24-40; README.md:75-99Laag tot gemiddeld (reproduceerbaarheid)
F16Testconfiguratie tegenover onzekerheid over productie. Wachtrijprioriteiten, capaciteitsaandelen, Connect-limieten en chunkercapaciteit zijn zichtbaar als repositorystandaarden of ingebakken image-configuraties, maar productie kan ze overschrijven met omgevingsvariabelen en Terraform die niet in de repository staan. Een eerdere lezing nam wachtrijnamen uit een testbestand van de taskmanager dat afwijkt van de meegeleverde configuratie.taskmanager@c568367:source/taskmanager/src/test/resources/queue/priority-task-scheduler.ops.json; AERIUS@fb8812f:docker/common/taskmanager/queue_config/priority-task-scheduler.connect.json; terraform/.../services.yaml.tftpl:151-163; services.tf:2Info (bedreiging voor validiteit)
F18Berekening van source-mesh-matrix is een stub. CalculationService.calculate geeft random.nextDouble() terug. Niets in het OwN2000-pad gebruikt het.source-mesh-matrix@eaef37b:source/api/src/main/java/nl/aerius/smm/api/matrix/service/CalculationService.java:35-46Info
F19Hexagonen met hersteldoel vallen buiten de hoofdstatistieken. Wie alleen de hoofd-PDF leest, ziet geen bijdragen op hexagonen met een hersteldoel; ze staan alleen in de bijlage.DB/.../02-project_calculation.sql:372,391-396,607,619-655,686,698-712Info (interpretatie)
F20Op naam gebaseerde bewaarschakelaar. Resultaten worden na een PDF-job verwijderd, tenzij de worker is geconfigureerd met keepResultsAfterExport of de situatienaam een vaste frase bevat. Gedrag dat afhangt van voor de gebruiker zichtbare tekst is kwetsbaar en ongedocumenteerd.WK/pdf/PdfCalculatorWorkerFactory.java:73,215-235Laag
F22Gebruikersdocumentatie wijkt af van de code over de meteorologische periode en de grens. Het Handboek 2026 stelt dat OPS meerjarige meteorologie voor 2005 tot 2014 gebruikt [R10, paragraaf 4.7]; de code gebruikt m014123c, de statistieken 2014 tot 2023 die het RIVM voor OPS 5.3.1.0 documenteert [R8]. De Handreiking over randeffecten zegt alleen dat resultaten "> 0,005" worden getoond [R15], terwijl de code een waarde van exact 0,005 meetelt. Omgekeerd wordt een meetellende waarde in (0,00499999; 0,005) in het PDF-overzicht, dat met het label 0,005 vergelijkt, als "-" getoond, en bij twee decimalen als 0,00 (paragraaf 5.8), zodat in dat venster de weergave afwijkt van de beslissing.AERIUS@fb8812f:OJ/io/ControlFile5300WriterUtil.java:30; AERIUS@fb8812f:DB/data/sql/nl-latest/permit_lower_bounds/load.sql:1-4; WUI/print/own2000/Overview.java:290,323-326Laag (documentatie van een juridisch instrument)
F23Uitgerolde build niet te herleiden tot een openbare commit. Connect meldt 2026.0.0_20260929_655bf03b53; de revisie 655bf03b53 bestaat niet in de openbare repository, waarvan de releasecommit een week na die build is gedateerd [RUN]. Een derde kan een resultaat alleen via het versielabel aan openbare code koppelen.AERIUS@fb8812f:source/commons-aerius/aerius-commons-shared/pom.xml:94; paragraaf 3.7Info (reproduceerbaarheid)

Methodologische waarnemingen (geen fouten). Bouwemissies worden gemodelleerd als jaarlijkse continue emissies (paragraaf 5.10). Elk rekenjaar vanaf 2024 gebruikt in OPS de prognosechemie van 2030 (paragraaf 5.5). Alleen hexagonen met relevant habitat worden berekend (paragraaf 5.4). Dit zijn modelkeuzes waarvan de eigenaren de beweegredenen zouden moeten documenteren; in de repositories vonden wij zulke documentatie niet.

Antwoord op RQ5. De code toont geen fout waarvan wij in onze eigen berekeningen konden aantonen dat zij een gerapporteerd vergunningresultaat wijzigt, maar wel één juistheidsfout die in een Monte Carlo op herschaalde echte OPS-velden het oordeel over het totaal NOx + NH3 wijzigt voor exacte totalen tussen 0,004 en 0,006 mol/ha/j, in beide richtingen, in 225 van de 1 560 000 gesimuleerde trekkingen, 1,44 per 10 000 trekkingen (F9), diverse afwijkingen tussen specificatie en documentatie (F7, F8, F13, F14, F22), zwakheden in schema en dataherkomst (F10, F11, F12, F15), en ongedocumenteerd gedrag dat een gebruiker van de resultaten moet kennen (F19, F20). De grootste bedreiging voor onafhankelijke verificatie is geen fout maar de gesloten database-inhoud, de niet-gepubliceerde productieconfiguratie (F16) en de ontbrekende schakel tussen uitgerolde build en openbare commit (F23).

9.1 Reikwijdte van deze editie

De volledige versie van dit paper meldt 25 bevindingen. Tien daarvan betreffen beveiligingseigenschappen van een openbare dienst, of zijn niet te onderscheiden van of overlappen met zulke bevindingen, en maken geen deel uit van deze editie. De hier gemelde bevindingen worden alleen naar impact en codelocatie beschreven. De nummers van de bevindingen volgen de volledige versie.


10. Principes voor gebruikers van de berekening

De volgende principes volgen uit hoofdstukken 5 tot en met 9 en gelden voor iedereen die berekeningen voorbereidt of controleert, inclusief diensten die ze via AERIUS Connect indienen.1 Productspecifiek operationeel advies valt buiten de reikwijdte van dit paper.

  1. Stuur activiteitsgegevens, geen emissies. Standaardemissies van werktuigen en wegen worden herberekend uit activiteitsgegevens en gesloten factoren voor het rekenjaar; emissiewaarden in de GML blijven alleen behouden voor generieke bronnen en eigen subbronnen (paragraaf 5.2; IMAER-java@ecdc81b:U/shared/emissions/EmissionsCalculator.java:143-147). Een invoerbestand is dus een verklaring van activiteit, en de emissies zijn wat de geldende release berekent.
  2. Pas de oordeelsregel exact toe. Een hexagoon telt mee als zijn onafgeronde depositie NOx + NH3 hoger is dan 0,00499999 mol/ha/j, vóór de weergave in twee decimalen (paragraaf 5.8; AERIUS@fb8812f:DB/main/sql/calculator_common/calculator/10-public/03-functions/02-project_calculation.sql:336-341). Een waarde van exact 0,005 telt mee. Een weergegeven 0,00 telt niet mee, behalve in het venster (0,00499999; 0,005), waar een meetellende waarde als 0,00 en in het PDF-overzicht als "-" wordt getoond; lees nabij de grens de onafgeronde waarde in de GML-resultaten. Hexagonen met een hersteldoel worden apart gerapporteerd en vragen een eigen beoordeling (paragraaf 6.3).
  3. Binnen één venster van 12 maanden telt alleen de totale bouwemissie. IMAER heeft geen veld voor de duur en de berekening leest de emissie als kg per jaar, dus het verkorten van werk dat al binnen 12 maanden past verandert het resultaat niet, en het verlagen van het totaal wel (paragraaf 5.10). Voor langer werk voert de gebruiker de emissie van de 12 opeenvolgende maanden met de hoogste depositie in [R13, paragraaf 2.3], of gebruikt hij TEMPORARY-situaties met MAX_TEMPORARY_EFFECT, en het samendrukken van het werk kan die emissie en dus het resultaat verhogen.
  4. Leg bij elk resultaat de AERIUS-versie vast. Factoren, kenmerken en receptorsets zijn database-inhoud die met elke actualisatie verandert; /info/version geeft de applicatie- en databaseversie, en de uitgerolde build is alleen via het label aan de openbare code te koppelen (paragraaf 3.7; AERIUS@fb8812f:API/api-common.yaml:416-429).
  5. Gebruik een offline replica alleen voor analyse, nooit voor oordelen. Een replica kan een resultaat verklaren en verkennen, maar haar overeenstemming met de officiële berekening is per hexagoon nog niet gemeten (paragraaf 8.3), en alleen een berekening met AERIUS Calculator voldoet aan de wettelijke eis (paragraaf 2.2).

11. Beperkingen en bedreigingen voor de validiteit

  • Versiedrift. De uitspraken gelden voor de vastgezette commits. Op 2026-10-22 was geen enkele openbare commit, tag of branch nieuwer dan fb8812f, en de live Calculator meldde 2026.0.0 (paragraaf 3.7). De uitgerolde Connect-build (2026.0.0_20260929_655bf03b53) noemt een revisie die niet in de openbare repository staat, zodat de gelijkheid van uitgerolde en openbare code wordt aangenomen op grond van het versielabel en niet is geverifieerd (F23). Gesloten database-inhoud kan veranderen zonder zichtbare codewijziging.
  • Code tegenover uitrol. Productie kan configuratie overschrijven (F16) en zou andere modelversies dan STABLE kunnen draaien: de versie is een databaseconstante (STABLE in de nl-stable-build, LATEST in nl-latest), en workers nemen preloadversies en de SRM-OpenCL-schakelaar uit workerproperties (AERIUS@fb8812f:DB/data/sql/nl-stable/system/version_constants.sql:10-11; DB/data/sql/nl-latest/system/version_constants.sql:10; UT/worker/EngineWorkerConfigurationBuilder.java:37,138-140; SJ/srm/domain/SRMConfigurationBuilder.java:43,62). Connect meldde databaseversie calculator_nl_stable (paragraaf 3.5).
  • Gesloten data. Emissiefactoren zijn nu voor zeven klassen gemeten; andere categorieën, andere rekenjaren en de bronkenmerken blijven ongemeten, en uitspraken over coderemaps steunen op testfixtures.
  • Eén locatie, één release. De Connect-batch gebruikte één locatie en rekenjaar 2026. De depositie per kg hangt af van de afstand tot habitat en van het gebied, dus paragraaf 8.2 illustreert ordes van grootte en generaliseert ze niet. Geen enkele receptor van de batch lag binnen 300 m van een bron: de dichtstbijzijnde receptor lag 1 157 m van de werktuigbron en 699 m van de weg (berekend uit */receptoren.csv.gz), zodat de live batch geen subreceptoren, F9 of de uitsluiting op 20 m heeft beproefd; K04 en K08 gaven de waarden het dichtst bij de grens.
  • Nog te maken vergelijkingen. De vergelijking van UI en Connect (paragraaf 6.4) en de kalibratie van de replica per hexagoon (paragraaf 8.4) zijn niet gemaakt.
  • Illustratieve kenmerken in offline runs. De F9-runs gebruikten echte AERIUS-klassen en de OPS-productiebinary, maar illustratieve bronkenmerken en posities; de Monte Carlo-runs nemen aan dat de vorm van het veld vast blijft wanneer het niveau verandert, en de gesommeerde run trekt het NH3-aandeel uniform, wat niet met echte projecten hoeft overeen te komen.
  • Gedeeltelijke lezing. Niet elke module is gelezen; de aggregatie van PDF-data en de GML-export zijn slechts gedeeltelijk gelezen. Alle codecitaten slagen voor de mechanische controle van paragraaf 3.2, maar een citaat dat naar de juiste regels wijst, kan toch verkeerd worden gelezen.
  • Eén onderzoeksinspanning. De lezing is gedaan door één onderzoeksinspanning die door een afnemende toepassing is ingegeven (voetnoot 1), wat de aandacht kan verleggen naar het Connect-pad en kleine projecten.

12. Conclusie

AERIUS 2026.0.0 is opener dan de GitHub-organisatie alleen doet vermoeden: de Calculator, Connect, de chunker, de OPS-wrapper, een Java-SRM2 en de SQL die de ondergrens voor vergunningen toepast zijn allemaal openbare code onder AGPL-3.0, en de modeldata van OPS en SRM2 zijn anoniem te downloaden, hoewel de gebruiksvoorwaarden voor de OPS-data onduidelijk zijn (paragraaf 7.3). De regels die een gerapporteerd resultaat bepalen, zijn exact te benoemen: hexagonen met relevant habitat binnen 25 km; gemiddelden over habitat-subreceptoren binnen 300 m van een bron; OPS op meteorologie van 2014 tot 2023 met prognosechemie van 2030 voor elk jaar vanaf 2024; SRM2 voor wegen binnen 5 km; jaarlijkse behandeling van bouwemissies, zodat binnen één venster van 12 maanden alleen het totaal telt; en een strikte vergelijking van onafgeronde depositie NOx + NH3 met 0,00499999 mol/ha/j. De meeste van deze regels zijn in het Handboek gedocumenteerd, maar de exacte grenstoets en het ontbreken van een tijdvenster niet, en de meteorologische periode die het noemt (2005 tot 2014) wijkt af van de dataset die de code leest (2014 tot 2023). Dertien jobs op de productiedienst bevestigden de herberekening van emissies, de lineariteit van de vermogensformule, het determinisme van resultaten en het PDF-formaat (het ontbreken van een veld voor de duur volgt uit het IMAER-schema, niet uit een meting), en maten emissiefactoren die anders gesloten zijn, onder meer de gelijkheid van Stage V en Stage IV. Gesloten blijven de overige database-inhoud en de productieconfiguratie en, voor andere brontypen dan de mobiele werktuigen en wegen die Paper 2 toetste, weten wij niet of de bronkenmerken zijn gepubliceerd (voor mobiele werktuigen en wegen vond Paper 2 ze gepubliceerd; erratumverwijzing na het kernresultatenkader). Van de 15 bevindingen in deze editie verdient de schaalafhankelijke afronding van subreceptorgemiddelden (F9), die op het totaal NOx + NH3 in beide richtingen afwijkt, als eerste de aandacht van de eigenaren. Het publiceren van checksums voor dbdata-releases, van de commit van elke uitgerolde build en van een korte technische beschrijving van de beslisregels zou vergunningberekeningen aanzienlijk makkelijker onafhankelijk verifieerbaar maken.



Woordenlijst voor lezers buiten het vakgebied

  • AERIUS Calculator, AERIUS Connect. Het Nederlandse programma voor het berekenen van stikstofdepositie (Calculator) en zijn machine-interface (Connect, een web-API die een berekening als bestand aanneemt en resultaten teruggeeft). Een Connect-job is één ingediende berekening.
  • IMAER, GML. IMAER is het uitwisselingsformaat voor AERIUS-invoer en -resultaten. Het is een applicatieschema van GML, een XML-formaat voor geografische data. Eén IMAER-bestand beschrijft één situatie (bronnen en, bij resultaten, depositiewaarden).
  • OPS, SRM2, DEPAC. De dispersie- en depositiemodellen achter de resultaten: OPS (het langetermijnmodel van het Rijksinstituut voor Volksgezondheid en Milieu, RIVM, geschreven in Fortran), SRM2 (een wegmodel dat AERIUS in Java implementeert) en DEPAC (de module voor depositiesnelheid binnen OPS).
  • Natura 2000, relevant habitat, hersteldoel. Natura 2000-gebieden zijn beschermde natuurgebieden. Relevant habitat is het habitattype waarvoor AERIUS depositie berekent. Een hexagoon met een hersteldoel is een hexagoon waar habitat moet worden hersteld; AERIUS rapporteert die apart.
  • Hexagoon, receptor, subreceptor. AERIUS berekent depositie per hexagoon van 1 ha (zoomniveau 1); het middelpunt van de hexagoon is de receptor. Dicht bij een bron is de hexagoonwaarde het gemiddelde over 96 of 384 subreceptoren binnen de hexagoon.
  • mol/ha/j, NOx, NH3. Depositie wordt gegeven in mol stikstof per hectare per jaar. NOx (stikstofoxiden) en NH3 (ammoniak) zijn de twee uitgestoten stoffen die tot een stikstoftotaal worden opgeteld (NOx + NH3).
  • De grens 0,00499999. Een hexagoon telt mee wanneer zijn onafgeronde depositie NOx + NH3 hoger is dan 0,00499999 mol/ha/j; de weergave toont twee decimalen (paragraaf 5.8 van dit paper).
  • RD-Nieuw. Het Nederlandse nationale coördinatenstelsel (Rijksdriehoeksstelsel), in meters.
  • Handboek, Instructie gegevensinvoer, Handreiking. Nederlandse gebruikersdocumenten van AERIUS: de gebruikershandleiding, de instructie voor gegevensinvoer en handreikingen.
  • Omgevingsregeling, Staatscourant, ECLI. De Nederlandse ministeriële regeling onder de Omgevingswet; de Staatscourant, het officiële publicatieblad van de Nederlandse overheid; en de ECLI, de Europese jurisprudentie-identifier (European Case Law Identifier) van een uitspraak.
  • [INF], [RUN]. Bewijslabels (paragraaf 3.3 van dit paper): [INF] markeert een uitspraak die op onze lezing berust in plaats van op letterlijke code of documenttekst; [RUN] markeert een waarneming uit onze eigen builds en runs.

Referenties

Code (zie Tabel 2 en Bijlage A voor de pins; alles op de vastgezette commits)

  • [C1] AERIUS-kernmonorepo, gitlab.com/AERIUS/AERIUS @ fb8812fd74f9b5a548c8772fde3a7e21be238e54, AGPL-3.0.
  • [C2] aerius/IMAER-java @ ecdc81b0f1e25f484ca5cc28f289c669eea78989; aerius/IMAER @ f2a401b3eff26d20103fe1b0fc887d805228b808.
  • [C3] rivm-syso/OPS @ e62fdf721d67 (OPS-LT 5.3.1.0), inclusief USER_MANUAL.md; rivm-syso/DepAC @ fef2266568b8.
  • [C4] aerius/emission-service @ d172ecf6b7c1; aerius/database-build @ 673f770d5e8c; aerius/database-modules @ fba2337c90cd.
  • [C5] aerius/taskmanager @ c5683670a984; aerius/file-server @ a0ba2f3bd4b7; aerius/webdocument-exporter @ b2cc50546592; aerius/geoserver-core @ 83bc6b4841cd; aerius/source-mesh-matrix @ eaef37bab5c0; aerius/IMAER-QGIS-plugin @ 2bc81a006091.

Documenten


Bijlage A. Vastgezette repositories

Alle repositories zijn openbaar; twee andere repositories van de GitHub-organisatie waren leeg en zijn niet gekloond. Commit-id's zijn de pins van 12 tekens die in de codecitaten worden gebruikt; de volledige commit-id's van de hoofdrepositories staan bij de Referenties.

RepositoryLicentie (upstream)Vastgezette commitCommitdatum
aerius/vue-gwtmit2edb081b57332026-08-26
aerius/webdocument-exporternoneb2cc505465922026-09-28
aerius/vue-geo-componentsagpl-3.08b48d7dab4a22026-09-30
aerius/toolsnone3002bf136b2f2026-08-20
aerius/taskmanageragpl-3.0c5683670a9842026-10-06
aerius/sld-generator-maven-pluginagpl-3.0526086a0fb8b2026-08-26
aerius/tomcat-standaloneagpl-3.08709f18e87272026-09-09
aerius/tetrisnone234bab501a132024-01-19
aerius/searchagpl-3.0aa19ff2b8ffa2026-10-20
aerius/mongo-initializragpl-3.03c2d66a5f3472026-08-26
aerius/rabbitmqagpl-3.0f8e5558d9a7c2026-08-26
aerius/jooq-postgis-spatiallgpl-3.012559e4cf25d2026-08-26
aerius/source-mesh-matrixagpl-3.0eaef37bab5c02026-08-24
aerius/IMAER-javaagpl-3.0ecdc81b0f1e22026-09-21
aerius/gwt-client-common-jsonagpl-3.04418f8da46162023-05-11
aerius/IMAER-QGIS-plugingpl-2.02bc81a0060912026-08-18
aerius/IMAERnonef2a401b3eff22026-09-30
aerius/gwt-client-commonagpl-3.0b0142dc130a32026-10-08
aerius/gwt-beans-maven-pluginnone947e83340bb02026-08-26
aerius/github-actionsagpl-3.0202e9f9cbc4b2026-10-01
aerius/grip-docsagpl-3.083df36ba1f582026-10-21
aerius/github-actions-testnone604c6c0fb3b82026-08-25
aerius/geoserver-corenone83bc6b4841cd2026-09-16
aerius/emission-serviceagpl-3.0d172ecf6b7c12026-08-26
aerius/easternone3372c98e326e2026-08-26
aerius/database-modulesagpl-3.0fba2337c90cd2026-08-18
aerius/file-serveragpl-3.0a0ba2f3bd4b72026-10-20
aerius/atlasagpl-3.09f9e1a1560d32023-05-11
aerius/database-buildagpl-3.0673f770d5e8c2026-10-14
aerius/backlog-toolingnone15df1c7eefa12026-03-11
aerius/authagpl-3.046694608b25d2025-10-28
aerius/autovalue-processorsagpl-3.02d54aaf642382023-05-11
aerius/cicd-scriptsagpl-3.0aed325179b3a2026-10-22
aerius/aerius-imaer-templatesnonef1054b4f3dd32015-11-12
aerius/aerius-root-pomagpl-3.06b0f9360cdde2026-08-26
aerius/aerius-connect-examplesnone1e7dfea5570c2016-09-29
rivm-syso/OPSgpl-3.0e62fdf721d672025-03-25
rivm-syso/DepACeupl-1.2fef2266568b82026-10-12
gitlab.com/AERIUS/AERIUS (branch calculator2026.0_fixes, shallow)agpl-3.0fb8812fd74f92026-10-06

Bijlage B. Data en materialen

Bestandsnamen zoals K01/samenvatting.json, receptoren.csv.gz of cmp_arm64_K01.json in de tekst verwijzen naar het onderzoeksdatapakket van de onderzoeksreeks: aanvraagbestanden, samenvattingen van resultaten en resultaten per receptor van de Connect-jobs, en de scripts, harnesses en resultaatbestanden van de offline runs. De namen zijn Nederlands waar de bestanden door de onderzoeksclient zijn aangemaakt.

  • Beschikbaarheid van data: Het onderzoeksdatapakket en de harness zijn nog niet gepubliceerd. Ze zijn op verzoek beschikbaar via het onderstaande contactadres.
  • Licentie van deze tekst: © 2026 StikstofNu. Citeren met bronvermelding en een link naar het paper is welkom; alle overige rechten voorbehouden.
  • Hoe te citeren en DOI: Dit paper heeft geen DOI. Citeer (de Engelstalige referentie-editie) als: StikstofNu, "AERIUS deconstructed: a code-level technical review of the Dutch nitrogen deposition calculation system (release 2026.0.0)", versie 4.2, https://stikstofnu.nl/onderzoek/aerius-deconstructed, 30 oktober 2026.
  • Contact voor correcties: info@alexandermooij.com, het contactadres dat stikstofnu.nl in zijn gebruiksvoorwaarden en privacyverklaring publiceert.

Footnotes

  1. Het motiverende geval is StikstofNu, een rekendienst voor kleine projecten die AERIUS Connect gebruikt. Het onderzoeksmateriaal wordt gescheiden gehouden van de code van dat product. ↩

Bronnen