Revisione del repository: 8 settembre 2026. Questa pagina descrive CCA1, CCA2 e CCA3, le relative bande e il building downwash. I riferimenti ai sorgenti riguardano omp_parallel.

Rilascio graduale del limite AGELIM

AGELIM > 0 definisce la durata del rilascio graduale del limite orizzontale legato alla griglia per CCA2/3. All'emissione le bande sono limitate a min(h_nominal, abs(OUTGRID)); si avvicinano alle bande nominali quando l'età si avvicina ad AGELIM. Cambia lo smoothing, senza modificare il moto delle particelle o sostituire il kernel con un conteggio per celle.

For 0 <= age < AGELIM:
    u = max(0, min(1, age / AGELIM))
    w = u*u*(3 - 2*u)
    h_limited = min(h_nominal, abs(OUTGRID))
    h_effective = h_limited + (h_nominal - h_limited)*w
For age >= AGELIM:
    h_effective = h_nominal

La regola si applica separatamente a HX e HY, dopo BWMAX per CCA3. HZ resta invariata. Si conserva il comportamento per AGELIM <= 0, compreso il limite storico della griglia a età esattamente zero con AGELIM=0. Nell'input attuale, AGELIM=0 non modifica le particelle di età positiva.

Il raccordo conserva il riferimento alla dimensione della griglia. CCA2 mantiene la discontinuità intrinseca di concentrazione al bordo del kernel uniforme, anche se il rilascio delle bande è continuo.

Confronto tra il precedente salto della banda a 1800 secondi e il raccordo cubico continuo
Esempio con h_nominal=20+3*sqrt(age) m, OUTGRID=50 m e AGELIM=1800 s. I valori illustrano la regola e non sono nuovi valori predefiniti di input.

Implementazione: code/omp_parallel/outputk.f90. AGEW è privata del thread e viene calcolata per ogni particella prima della normalizzazione e della scansione dei recettori. Anche le implementazioni seriali ripristinano le bande nominali CCA2 per ciascuna particella quando è attivo il limite di età positivo, evitando il riuso delle bande ridotte della particella precedente.

Riferimento al parametro di input. Nel repository: docs/LAPMOD_AGELIM_RACCORDO_2026-09-08.md e relativa patch.

Kernel documentati: CCA1, CCA2 e CCA3

CCAProfiloScale nominaliRoutine
1Gaussiano; supporto diretto limitato da SIGNUMSIGMA_H, SIGMA_ZOUTPUT
2Uniforme a parallelepipedo; sperimentaleBMFU, griglia di output e altezza di rimescolamentoOUTPUTK
3Ellissoide parabolicoCoefficienti H* dipendenti dall’età e BWMAXOUTPUTK

La selezione avviene in code/omp_parallel/lapmod.for; il campionamento in output.f90 e outputk.f90 della stessa cartella.

Bande del kernel parabolico CCA3

CCA3 nominal bands, with age t in seconds:
HX = min(HXA + HXB*sqrt(t) + HXC*t, BWMAX(1))
HY = min(HYA + HYB*sqrt(t) + HYC*t, BWMAX(2))
HZ = min(HZA + HZB*sqrt(t),         BWMAX(3))

Le bande sono semiassi del supporto, non deviazioni standard del kernel. Per l'ellissoide parabolico normalizzato in spazio libero, la deviazione standard lungo ciascun asse è h/sqrt(7). Confrontare kernel con bande nominali uguali non equivale a confrontarli a parità di varianza di smoothing.

Limitazioni dell'implementazione

Building downwash: percorso PRIME2 attivo

Bellasio R. and Bianconi R. (2026) Implementation of Building Downwash in the LAPMOD Atmospheric Dispersion Model. Chemical Engineering Transactions, Vol. 127, 241-246. doi:10.3303/CET26127041

Gli edifici modificano il trasporto delle particelle tramite PRIME2. Nella scia il modello calcola un deficit del vento medio orizzontale e incrementi del moto turbolento laterale e verticale. È un effetto distinto dallo stack-tip downwash: LSTD controlla quest'ultimo, mentre BUILDINGS_FILE fornisce gli edifici per PRIME2.

Usare BUILDINGS_FILE = NO per disattivare gli edifici, oppure indicare il file della geometria. Le impronte rettangolari usano quattro vertici; strutture aerodinamiche come i serbatoi usano larghezza e centro. Vedere il formato del file e la descrizione teorica.

  1. Con NBUILDINGS > 0, PMOVE campiona il vento meteorologico alla particella e ricava valori ausiliari di vento e turbolenza a 30 m dal suolo.
  2. PRIME2 usa il vento orizzontale locale per orientare le coordinate edificio/scia. Applica il primo edificio corrispondente nell'ordine del file; non somma gli effetti delle scie sovrapposte. Con velocità orizzontale locale inferiore a 0.1 m/s restituisce correzioni nulle.
  3. MOVE ruota le fluttuazioni usando la direzione locale, poi applica deficit di velocità e fattori di incremento laterale e verticale.
  4. Se VELOCITY_DEFICIT > 0 e ISBUOY=1, PMOVE imposta ISBUOY=0 e termina la fase esplicita di plume rise della particella.

Riferimenti: code/omp_parallel/pmove.f90 e move.f90. PRIME2, BUILDINGS_SET, BUILDINGS_CHK, WAKE_SCALES, WITHIN_WAKE e FAR_WAKE_DIM sono routine condivise incluse dalla compilazione di code/omp_parallel/lapmod.for.

Separazione corretta delle direzioni del vento locale e a 30 m

L'interpolazione ausiliaria memorizza ora la direzione in PSN30/PCS30, senza sovrascrivere PSN/PCS alla particella. Questi ultimi vengono passati a MOVE per ruotare le fluttuazioni e proiettare l'incremento di turbolenza laterale. Valori ausiliari e variabili di correzione sono privati nel ciclo OpenMP delle particelle.

INTERPWIND at 30 m: PWIND30, PSN30, PCS30
MOVE at the particle: PWIND, PCS, PSN

In precedenza, l'attivazione del ramo degli edifici poteva sostituire in MOVE la direzione locale con quella a 30 m, anche fuori da una scia. La correzione è rilevante quando la direzione varia con la quota: conserva il vettore del vento medio locale e corregge la direzione usata per il moto fluttuante.

Verifica della correzione della direzione

Le verifiche archiviate REV-03 comprendono 240 casi per implementazione a ciascuno di due livelli di ottimizzazione. Confrontano gli argomenti effettivi delle chiamate INTERPWIND/MOVE con un calcolo indipendente del vento locale. Le implementazioni corrette superano le prove; il riferimento precedente fallisce 48 casi su 240. Questa prova mirata non esegue l'intera PMOVE.

Un insieme separato di 18 simulazioni complete di dieci minuti verifica rotazione del vento con edifici, vento uniforme con edifici e rotazione senza edifici. I due controlli conservano gli output confrontati prima e dopo. Con rotazione ed edifici, traiettorie e concentrazioni cambiano come atteso. I file delle particelle omp_parallel verificati coincidono con uno e quattro thread; le somme delle concentrazioni possono differire per arrotondamento. Sono verifiche numeriche di regressione, non una nuova validazione osservativa di PRIME2.

Rapporto e risultati nel repository: docs/LAPMOD_REV03_APPLICATA_2026-09-07.md e LAPMOD_REV03_APPLICATA_2026-09-07_validation.json.

Verifica della modifica AGELIM

Le verifiche archiviate confrontano CCA2/3 con formule indipendenti e comprendono età miste, ordine invertito delle particelle, entrambi i percorsi dei recettori, la soglia e AGELIM <= 0. Coprono le tre varianti mantenute, l'albero storico dei sorgenti e la routine seriale di staging. OpenMP è stato verificato con uno e quattro thread.

I confronti prima/dopo verificano AGELIM disattivato. Intorno a 1800 s, la massima variazione relativa L2 del campo CCA3 a particelle ferme tra passi consecutivi di 0.01 s è stata 4.91e-6.

Tutte le 32 simulazioni complete di dieci minuti sono terminate correttamente. Nei 12 confronti prima/dopo della stessa variante a un thread, i file delle particelle sono identici. AGELIM=0 conserva anche i due file di concentrazione confrontati, mentre AGELIM=300 modifica le concentrazioni come atteso. Queste verifiche sono distinte dalla validazione con osservazioni atmosferiche.

I tre eseguibili Windows sono stati ricompilati e installati. In quell'aggiornamento non sono stati prodotti una build Linux o un nuovo pacchetto di distribuzione seriale. Riepilogo numerico e hash dei sorgenti/eseguibili: docs/LAPMOD_AGELIM_RACCORDO_2026-09-08_validation.json.

Input · Teoria delle concentrazioni · Struttura del codice · Sistema LAPMOD