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 / ENDSIM

La 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

RoutineFunzione
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:
  • ITDURM: viene eroso ad ogni chiamata di clocks, e quando si annulla viene effettuata una nuova lettura della meteorologia.
  • ITDURE: viene eroso ad ogni chiamata di clocks, e quando si annulla viene effettuata una nuova lettura delle emissioni.
  • ITDURO: viene eroso ad ogni chiamata di clocks, e quando si annulla viene effettuata una nuova scrittura delle variabili di output.
  • ITDUROS: viene eroso ad ogni chiamata di clocks, e quando si annulla viene effettuato un nuovo sampling delle concentrazioni.
  • ITDURPW: viene eroso ad ogni chiamata di clocks, e quando si annulla viene effettuata una scrittura del file di output delle particelle.
  • ITDURS: indica la durata totale della simulazione in secondi, viene eroso ad ogni chiamata di clocks, e quando si annulla la simulazione termina.
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.
OUTPUTKCalcola 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.
TURPROC2Calcola le statistiche di turbolenza sulle colonne della griglia meteorologica usando OpenMP.
LAP_RAND_INIT_NEW_PARTICLEDeriva il seme casuale di una nuova particella dal seme di base e dal suo identificativo.
LAP_RAND_LOAD_STATE / LAP_RAND_SAVE_STATETrasferiscono il seme e le due cache Gaussiane tra gli array della particella e lo stato di lavoro privato del thread.
LAP_RANDUAggiorna lo stato del generatore casuale uniforme privato del thread.
BUILDINGS_SET / BUILDINGS_CHKLeggono e validano la geometria degli edifici durante SETUP.
PRIME2Valuta il deficit di velocità e gli incrementi di turbolenza per una particella nella scia di un edificio.
CALC_BUILDING_DIMENSIONSDetermina le dimensioni degli edifici proiettate lungo il vento locale e trasversalmente a esso.
WAKE_SCALES / WITHIN_WAKE / FAR_WAKE_DIMDeterminano le scale della cavità e della scia, localizzano un punto rispetto a queste regioni e calcolano le dimensioni della scia lontana.