Struttura del codice LAPMOD
Organizzazione dei sorgenti, flusso di esecuzione e compiti delle routine della versione omp_parallel.
La versione omp_parallel
Questa pagina descrive l'attuale albero dei sorgenti omp_parallel. Il programma principale coordina meteorologia, emissioni, movimento delle particelle e output; OpenMP distribuisce i cicli di calcolo tra i thread.
Sequenza principale delle chiamate
LAPMOD
SETUP
INIT
LAP_RAND_SEED / RANDOM_SEED
READINP / RNPCHK
OPNFIL
SETMET or SETNMET
OPNFIL_OUT
SETTIM / SETSUB / SETEMI
BUILDINGS_SET
BUILDINGS_CHK
ODORING (when requested)
SETREC / WRHEAD
Time loop:
MET
METTI
TURPROC2 (OpenMP)
EMI
RDEMI
PRJJ or PRWT
PAPLPE
CLOCKS
GENERA
LAP_RAND_INIT_NEW_PARTICLE
LAP_RAND_LOAD_STATE
GENXYZ / GENXYZPOL
LAP_RAND_SAVE_STATE
PMOVE (OpenMP unless LDBG)
LAP_RAND_LOAD_STATE
FNDXYZ / GETVAR2 / FNDTS
NEWFLU
RND_GAUSS / LAP_RANDU
DEPOSD / DEPOSW
INTERPWIND / PRIME2
MOVE / RND_GAUSS_PR / RBNDS
LAP_RAND_SAVE_STATE
UPDATE
CCA1: OUTPUT
OUTPUT_P
OUTPUT_D (grid output interval)
Parallel sampling and reduction
OUTPUT_C (output interval)
CCA2/3: OUTPUTK
OUTPUT_P
Parallel sampling and reduction
OUTPUT_C (output interval)
PROGRESS / PRINT_DTZ / ENDSIMLa sequenza riassume le fasi principali e alcune chiamate discendenti. Le chiamate effettive dipendono dalle opzioni attive. Il catalogo comprende routine di omp_parallel e routine condivise raggiunte dal programma principale.
Catalogo delle routine
| Routine | Funzione |
|---|---|
| Routine | Funzione |
| LAPMOD | Routine principale del modello LAPMOD. |
| PRINT_DTZ | Scrive data, ora e zona temporale sulle specifiche unità (che devono essere aperte). Viene chiamata all’inizio e alla fine della simulazione. |
| SETUP | Coordina inizializzazione, validazione degli input, apertura dei file, meteorologia, emissioni e sostanze, geometria degli edifici e recettori. INIT inizializza i generatori casuali prima dell’avvio della simulazione. |
| INIT | Inizializza array, costanti e contatori. Chiama LAP_RAND_SEED per gli stati casuali delle particelle e RANDOM_SEED una sola volta per il generatore separato dei camini con copertura. |
| READINP | Questa routine legge un file di input, estrae il record contenuto tra due delimitatori del testo (tipicamente punti esclamativi) e legge il valore di input contenuto nel record. |
| READREC | Questa routine legge da una stringa la coppia di variabili descrizione e valore. I valori devono essere separati dalle corrispondenti descrizioni da un uguale '=' (per esempio number of grids = 33). I valori possono essere REALE, INTERO, CARATTERE o LOGICO come specificato dalla variabile di input IVAR. |
| LSTRIM | Restituisce la lunghezza di una stringa dopo aver eliminato gli spazi finali e i caratteri non stampabili. |
| RNPCHK | Controlla la correttezza dei valori dell’input (date, parametri che superano i valori limite, ...) ed esegue delle assegnazioni a seconda dei valori dell’input. |
| OPNFIL | Apre il file di output intermedio se richiesto. Apre il file di output di CALMET (che è input meteorologico per LAPMOD) e scrive un messaggio di errore se non lo trova. Apre il file di input che contiene le emissioni di sostanze ATTIVE e manda un messaggio di errore se non lo trova. |
| WRITINP | Scrive i valori di input sul file di log. |
| WRHEAD | Scrive gli headers del file binario di concentrazione (se LBINC = T) |
| SETMET | Inizia la lettura del file binario di CALMET quando NMET=1. Legge il record del titolo e i record con i dati fino all’ora precedente a quella d’inizio della simulazione di dispersione. Determina quante ore di dati meteo devono essere lette prima dell’inizio della simulazione. L’ora d’inizio e l’ora di fine della simulazione di LAPMOD sono LST, come nell’output binario di CALMET. Calcola i parametri turbolenti (sigma e tempi Lagrangiani) ad ogni punto della griglia. Calcola i valori medi della pressione e dell’umidità relativa al suolo usando le misure. |
| SETNMET | Gestisce la lettura iniziale dei files di CALMET nel caso in cui NMET > 1. Legge gli header records di tutti i files e verifica che si riferiscano all’identico dominio. Verifica inoltre che i files siano elencati con la corretta sequenza temporale, e che l’intervallo temporale sia compatibile con le date di simulazione di LAPMOD. Inizia la lettura del primo file binario di CALMET. Legge il record del titolo e i record con i dati fino all’ora precedente a quella d’inizio della simulazione di dispersione. Determina quante ore di dati meteo devono essere lette prima dell’inizio della simulazione. L’ora d’inizio e l’ora di fine della simulazione di LAPMOD sono LST, come nell’output binario di CALMET. Calcola i parametri turbolenti (sigma e tempi Lagrangiani) ad ogni punto della griglia. Calcola i valori medi della pressione e dell’umidità relativa al suolo usando le misure. |
| STACKTIP | Calcola l’altezza ridotta del camino a seguito dello stack tip downwash. |
| ODORING | Controlla e suggerisce opzioni specifiche per le emissioni di odori. |
| METHDR | Legge il record di titolo del file binario di CALMET. Dopo la chiamata a questa routine vengono caricate in memoria topografia, uso del territorio, dati e variabili e il puntatore è pronto per leggere i dati meteo. |
| ADD_DELTA_HOURS | Incrementa una specifica data e ora di un dato numero di ore. |
| DAYNUM | Calcola il numero del giorno. Una delle più utili applicazioni di questa routine è il calcolo del numero di giorni che intercorrono tra due date. |
| LEAPYR | Funzione logica che è vera se l’anno è bisestile, falsa negli altri casi. |
| GET_DATE | Calcola la data (ANNO, MESE, GIORNO) a partire dal giorno giuliano DAY_NUMBER. Se DAY_NUMBER assume il valore uno, la data calcolata è il 15 ottobre 1582. |
| LUSELAB | Determina l’etichetta da assegnare a ciascuna categoria di occupazione del suolo (landuse). Le assegnazioni si basano sulle categorie usate in CALMET (p 4-85 del manuale di CALMET). |
| SETDOM | Verifica che il dominio di output sia contenuto nel dominio meteorologico CALMET. Calcola gli indici iniziali e finali delle celle meteorologiche utilizzate, i parametri del dominio di dispersione e la cella meteorologica contenente ciascun punto di output LAPMOD. |
| LATLON | Calcola latitudine e longitudine di un generico punto (x,y) date le coordinate UTM in metri, il numero IZ della zona UTM, e l’emisfero (Nord o Sud). |
| UTM2LL | Converte le coordinate UTM in latitudine/longitudine. Funziona sia per l’emisfero Nord che per l’emisfero Sud. Nota: assume l’ellissoide di Clarke 1866, adattato da EPS version 2.0 (Consistente con CALMET). |
| METDAT | Legge i dati meteo dal file binario di CALMET. Legge un’ora ogni volta che viene chiamata. La lunghezza di Monin Obukhov viene trasformata nel suo inverso che viene utilizzato durante la simulazione. La velocità verticale all’uscita da questa routine è in coordinate che seguono il terreno. |
| SETREC | Legge le coordinate dei recettori discreti, se ce ne sono, e determina la loro posizione relativa all’interno del dominio computazionale. |
| CAPTOSM | Converte i nomi dei file sostituendo le lettere maiuscole con lettere minuscole. |
| SETTIM | Assegna tutti i tempi che servono nel corso della simulazione (riguardo le emissioni, riguardo la scrittura dell’output,...). |
| GETDUR | Calcola la durata in secondi di un periodo a partire da una data iniziale e una data finale. |
| SETSUB | Inizializza le proprietà radioattive delle sostanze. |
| RTBIS | Implementa la funzione erfc diminuita di una costante C. |
| SETEMI | Inizializza i parametri di emissione. |
| SOUCHK | Controlla la validità dei parametri della sorgente letti in SETEMI. |
| RECOGN | Riconosce il nome della sostanza e memorizza nella variabile IPONAM l’indice della posizione della sostanza all’interno del database. Se la sostanza non è riconosciuta LAPMOD si arresta con un messaggio di errore. |
| MET | Legge un record del file meteorologico binario di CALMET. |
| RDEMI | Legge i dati di emissione delle sorgenti, ovvero: il tasso di emissione per ciascuna sostanza, la temperatura e la velocità di uscita e la data e l’ora dell’emissione. |
| CLOCKS | Calcola il più lungo intervallo di integrazione possibile per l’attuale dato di input (IDT), aggiorna la data corrente della simulazione (IDCURS) e aggiorna il giorno giuliano corrente (il giorno uno è il primo Gennaio). Questa routine inoltre aggiorna i principali “orologi” del modello, tutti espressi in secondi:
|
| IDSET | Aggiorna il vettore contenente la data ID di un intervallo di integrazione di IDT secondi. |
| GENERA | Crea le particelle nelle posizioni disponibili, assegna identificativi e stati casuali iniziali, inizializza coordinate e proprietà e salva le cache dei generatori casuali. Questa fase viene eseguita in sequenza. |
| FHOLE | Trova il primo posto libero disponibile nel vettore delle particelle IHOLE. |
| GENXYZ | Assegna le coordinate alle particelle generate. |
| GENXYZPOL | Assegna le coordinate alle particelle generate, per sorgenti poligonali. |
| LOCPT | Valuta se un punto è all'interno di un poligono. |
| FNDXYZ | Individua gli indici dell’angolo in basso a sinistra delle cella che contiene la particella. |
| PMOVE | Integra in parallelo le particelle attive, salvo quando LDBG è abilitato. Interpola la meteorologia, sceglie i passi di integrazione locali, aggiorna fluttuazioni, deposizione e decadimento, applica le correzioni delle scie degli edifici e gestisce i confini, salvando lo stato casuale di ogni particella. |
| GETVAR2 | Estrae il valore delle variabili meteo in corrispondenza della posizione della particella per lo schema FLB. |
| FNDTS | Calcola l’intervallo di integrazione breve da usare per muovere la particella. |
| NEWFLU | Aggiorna le componenti casuali della velocità della particella. |
| RND_GAUSS | Restituisce una variabile Gaussiana usando LAP_RANDU e un valore memorizzato in una cache privata del thread. La cache viene caricata dalla particella corrente e salvata nella stessa. |
| RND_GAUSS_PR | Fornisce variabili Gaussiane per la turbolenza indotta dal pennacchio, con una cache separata privata del thread e memorizzata nello stato della particella. |
| DEPOSD | Calcola la velocità di deposizione secca per gas e particelle. |
| AERRES | Calcola la resistenza aerodinamica come proposto in Seinfeld e Pandis (1998), p. 963. |
| VSETTL | Calcola la velocità di deposizione delle particelle con un dato diametro e il numero di Schmidt. |
| VDEPAER | Calcola la velocità di deposizione per gli aerosol. |
| DEPOSW | Calcola la velocità di deposizione umida di gas e aerosol sommando il dilavamento dovuto al processo di rainout e a quello di washout. |
| MOVE | Avanza la particella usando vento locale, velocità turbolenta, velocità di sedimentazione e correzioni della scia degli edifici. Ruota le fluttuazioni orizzontali nel sistema di coordinate del modello. |
| RBNDS | Calcola la riflessione della particella se si trova sotto ZMIN (ad esempio la lunghezza di rugosità) o sopra ZINV. Sopra ZINV, se al passo precedente era nel PBL, la fluttuazione verticale della velocità viene posta a zero; se era già all’esterno non viene applicata alcuna azione. |
| UPDATE | Aggiorna NP e compatta l’array degli indirizzi attivi IADDR dopo lo spostamento. Gli array delle proprietà e degli stati casuali delle particelle rimangono indicizzati secondo le posizioni di memoria originali. |
| OUTPUT | Calcola i campionamenti CCA1 nel percorso documentato usando buffer di contributi locali ai thread. Coordina output delle particelle e deposizioni su griglia, accumula le statistiche temporali e chiama OUTPUT_C all’intervallo di output. |
| OUTPUT_P | Scrive i file delle particelle agli istanti richiesti. IPWRITE seleziona nessun output ASCII (0), ASCII dettagliato (1) o ridotto (2); LPBIN controlla separatamente l’output binario. |
| WRINFO | Scrive informazioni sulle particelle e sulle sostanze. |
| OUTPUT_D | Salva le deposizioni su file. |
| CALCDEP | Converte i campi di deposizione negli array di output e calcola gli estremi con riduzioni OpenMP di minimo e massimo. |
| WROUT | Scrive su file l’output (concentrazione o deposizione). |
| WROUT_BIN | Scrive su file binario l’output (concentrazione e deposizione) |
| PREPNAME | Prepara il nome del file di output. |
| A2TOA1 | Estrae ARRAY1D = ARRAY2D(*,ISU), ed eventualmente inverte l’ordine. NXMAX, NYMAX e NSUMAX sono parametri della chiamata. |
| WRITE_ESRI_GRD_1D | Scrive un file ESRI ASCII GRID. |
| WRITE_SURFER_GRD_1D | Scrive un file ASCII GRD per Surfer. |
| CALCCONCR | Calcola le concentrazioni in corrispondenza dei recettori discreti. |
| CALCCONCR_SA | Calcola le concentrazioni dovute ad ogni sorgente in corrispondenza ad un singolo recettore discreto quando viene attivato l'algoritmo di source attribution. |
| WROUTR | Prepara le concentrazioni per i recettori discreti da dare in output. |
| WROUTR_SA | Prepara i contributi di ogni singola sorgente alla concentrazione al singolo recettore discreto. |
| WROUTR_BIN | Scrive su file binario l’output per i recettori (concentrazione) |
| WRITE_REC | Scrive su file di output le concentrazioni in corrispondenza dei recettori discreti. |
| OUTPUT_C | Converte i campi accumulati su griglia e recettori tramite CALCCONC, CALCCONCR o CALCCONCR_SA, scrive le concentrazioni e azzera gli accumulatori di campionamento. Gestisce ciascun livello richiesto e la normalizzazione della media o del massimo dei campionamenti. |
| CALCCONC | Converte un livello della griglia in un array di output applicando conversione della sostanza, normalizzazione del volume e divisore dei campionamenti. Usa OpenMP sulle celle con riduzioni di minimo e massimo. |
| ENDSIM | Chiude i file e crea nella directory dell’output il file .ok vuoto. |
| OUTPUTK | Calcola i campionamenti CCA2/3 nel percorso documentato: selezione delle bande, BWMAX per CCA3, transizione graduale AGELIM, riduzione parallela e attribuzione alle sorgenti. Chiama OUTPUT_C all’intervallo di output. |
| TURPROC2 | Calcola le statistiche di turbolenza sulle colonne della griglia meteorologica usando OpenMP. |
| LAP_RAND_INIT_NEW_PARTICLE | Deriva il seme casuale di una nuova particella dal seme di base e dal suo identificativo. |
| LAP_RAND_LOAD_STATE / LAP_RAND_SAVE_STATE | Trasferiscono il seme e le due cache Gaussiane tra gli array della particella e lo stato di lavoro privato del thread. |
| LAP_RANDU | Aggiorna lo stato del generatore casuale uniforme privato del thread. |
| BUILDINGS_SET / BUILDINGS_CHK | Leggono e validano la geometria degli edifici durante SETUP. |
| PRIME2 | Valuta il deficit di velocità e gli incrementi di turbolenza per una particella nella scia di un edificio. |
| CALC_BUILDING_DIMENSIONS | Determina le dimensioni degli edifici proiettate lungo il vento locale e trasversalmente a esso. |
| WAKE_SCALES / WITHIN_WAKE / FAR_WAKE_DIM | Determinano le scale della cavità e della scia, localizzano un punto rispetto a queste regioni e calcolano le dimensioni della scia lontana. |