Introduzione all’arte della composizione tipografica con LATEX
Modelli di previsione del moto ondoso · Python è stato importante per generare le tabelle in...
Transcript of Modelli di previsione del moto ondoso · Python è stato importante per generare le tabelle in...
1
Corso di Laurea Magistrale in
Ingegneria civile per la protezione dai rischi naturali
D.M. 270
Relazione di fine tirocinio A.A. 2017 - 2018
“Modelli di previsione del moto ondoso”
Relatore: Giorgio Bellotti Tirocinante: Francesco Passaro Correlatore: Roberto Inghilesi
2
Sommario 1. L’attività di Tirocinio...................................................................................................................................... 3
1.1. Introduzione ............................................................................................................................................ 3
2. Apprendimento e conoscenza di Python e Latex .......................................................................................... 4
2.1. Introduzione .................................................................................................................................................. 4
2.2. Python ............................................................................................................................................................ 5
2.2.1. Introduzione al linguaggio .................................................................................................................... 5
2.2.2. Tipi di dato ............................................................................................................................................. 7
2.2.3. Costrutti ................................................................................................................................................. 8
2.2.4. Dato strutturato ................................................................................................................................... 10
2.2.5. Funzioni ................................................................................................................................................ 12
2.2.6. File e Directory .................................................................................................................................... 13
2.2.7. Numpy .................................................................................................................................................. 13
2.2.8. Matpoltlib ............................................................................................................................................. 16
2.2.9. Sviluppi di Python ................................................................................................................................ 18
2.3. Latex ............................................................................................................................................................ 19
2.3.1. Descrizione del linguaggio ................................................................................................................... 19
3. Studio per la determinazione delle mareggiate nei mari italiani............................................................... 20
3.1. Introduzione .......................................................................................................................................... 20
3.2. Sistema di previsione costiero MC_WAF ........................................................................................... 21
3.3. Metodo POT (Durate Parziali Sopra Soglia) ...................................................................................... 23
3.4. Script di Python..................................................................................................................................... 25
4. Stesura delle relazioni sullo stato dei mari italiani ..................................................................................... 26
4.1. Introduzione .......................................................................................................................................... 26
4.2. Relazione sullo stato dei mari italiani Maggio 2017 .......................................................................... 27
4.2.1. Descrizione generale delle mareggiate occorse nel mese .................................................................. 27
4.2.2. Episodio 6-8 Maggio: Mar Tirreno, Mar di Sardegna e Canale di Sicilia .................................... 28
4.2.3. Episodio 19-20 Maggio: Mar Ligure e Mar Tirreno Centrale ......................................................... 31
4.2.4. Episodio 25 Maggio: Mar Adriatico Meridionale ............................................................................. 33
4.2.5. Elenco mareggiate .................................................................................................................................. 34
4.2.6. Tabella a due ingressi .............................................................................................................................. 35
5. Bibliografia .................................................................................................................................................... 36
3
1. L’attività di Tirocinio
1.1. Introduzione
Il tirocinio esterno è stato svolto presso l’Istituto Superiore per la Protezione e la Ricerca Ambientale dal 15/05/2018 al 16/07/2018 per un totale di 150 ore corrispondenti a 6 CFU. L’attività è consistita nell’acquisire competenze per l’uso del linguaggio di programmazione “Python” e del linguaggio di scrittura “Latex” tramite dei corsi di formazione. Gli obiettivi sono stati quelli di studiare e valutare con il metodo POT le mareggiate nei mari italiani in un anno nel periodo tra Maggio 2017 e Aprile 2018 grazie al modello di previsione costiero MC_WAF e al software Python. Un ulteriore obiettivo è stato quello di redigere delle relazioni sullo stato dei mari italiani tramite il linguaggio di scrittura Latex per descrivere le mareggiate. Il tutto ai fini delle attività di tesi. Il tirocinio è stato suddiviso in tre fasi:
1. apprendimento e conoscenza del linguaggio di programmazione Python e del linguaggio di scrittura Latex (capitolo 2);
2. studio per la determinazione delle mareggiate nei mari italiani (capitolo 3);
3. stesura delle relazioni sullo stato dei mari italiani a descrizione delle mareggiate
tra Maggio 2017 e Aprile 2018 (capitolo 4).
4
2. Apprendimento e conoscenza di Python e Latex
2.1. Introduzione
Il primo passo del tirocinio è consistito nell’apprendimento dell’uso del linguaggio di programmazione Python e del linguaggio di scrittura Latex. Entrambi hanno permesso di raggiungere gli obiettivi prefissati e cioè lo studio, la valutazione e la descrizione delle mareggiate avvenute nei mari italiani in un anno nel periodo tra Maggio 2017 e Aprile 2018. Il primo, sfruttando la georeferenziazione delle mappe riguardanti il Mar Mediterraneo, ha permesso, in corrispondenza delle boe ondametriche posizionate su determinati punti della penisola italiana, la determinazione dei parametri fondamentali che rappresentano le mareggiate: l’altezza d’onda significativa, il periodo di picco, il periodo medio, la direzione di provenienza delle onde e il tempo di ritorno. Python è stato importante per generare le tabelle in Latex con il parametro sopraelencato dell’altezza d’onda significativa e la corrispondente frequenza di accadimento. In base a queste tabelle, conoscendo il linguaggio di scrittura Latex, è stato possibile scrivere le relazioni sullo stato dei mari che descrivono le mareggiate nell’arco di tutto l’anno e sull’intera penisola. In queste relazioni sono presenti tutti i dati e le illustrazioni prese dal modello di previsione costiero MC_WAF che specificano più approfonditamente dove e con quale intensità la mareggiata si è verificata.
5
2.2. Python
2.2.1. Introduzione al linguaggio
Python è un linguaggio di programmazione di alto livello, interpretato, orientato agli oggetti e con una semantica dinamica. Interessante per lo sviluppo rapido di applicazioni, così come per l’utilizzo come linguaggio di scripting o come linguaggio collante per connettere assieme componenti esistenti. La sintassi semplice e facile da apprendere di Python enfatizza la leggibilità. La programmazione è modulare ed il codice è riutilizzabile. L’interprete Python e l’estesa libreria standard sono disponibili sia come sorgente che in forma binaria. Python è un linguaggio interpretato che si distingue dal linguaggio compilato (es. C/C++):
Figura 1. Linguaggi interpretati e compilati
La differenza tra i 2 linguaggi sta nel processo di compilazione che è costituito da diverse fasi:
Figura 2. Processo di compilazione
6
E’ possibile definire i linguaggi distinguendoli anche per utilizzo o per caratteristiche macroscopiche:
- i linguaggi compilati adottano una tipizzazione statica e debole e cioè che una variabile può essere associata a diversi oggetti purché questi oggetti abbiano tutti lo stesso tipo (il tipo di dato può essere ignorato);
- i linguaggi interpretati adottano una tipizzazione dinamica e forte e cioè che una variabile può essere associata a più dati differenti ma solo se i tipi di dati sono coerenti tra loro.
Un linguaggio interpretato, e quindi lo stesso Python, prevede almeno 2 componenti fondamentali:
- interprete; - set di librerie base.
Python è costituito da una serie di moduli, forniti dall’installazione di base oppure aggiunti esternamente, che vengono importati grazie al comando di sistema from/import. I moduli sono raggruppati da pacchetti che hanno una struttura gerarchica rappresentata da directory. In Python tutto è un oggetto e quindi anche i moduli stessi e ovviamente anche le classi di modulo. E’ possibile perciò guardare nel modulo e interrogare i suoi dati membro o conoscere la documentazione su una generica funzione.
Figura 3. Struttura dell’oggetto
7
2.2.2. Tipi di dato
Python è un linguaggio dinamicamente e fortemente tipato. E’ possibile associare ad
un oggetto un nome simbolico che non necessita di essere dichiarato detto
“Identificatore”. In Python non esistono dichiarazioni esplicite di variabili ma vengono
create nel momento dell’assegnamento e distrutte all’uscita dello scope.
Python dispone di due tipologie di dato:
1) dati semplici:
– Int
– Long
– Float
– Complex
– String
2) contenitori:
– Tuple ()
– List []
– Dict {}
– Set
Il linguaggio mette a disposizione quattro tipi numerici di dato:
Integer (interi)
Long Integer (interi grandi)
Floating point number (reali)
Complex number (complessi)
Il modulo math fornisce le più comuni funzioni matematiche tra cui quelle
trigonometriche, potenze e logaritmi e trasformazione angoli.
Si usa il tipo bool per rappresentare valori booleani. Una variabile di tipo bool può
assumere valori TRUE e FALSE che possono essere interscambiati con i valori 1 e 0
rispettivamente.
Una stringa letterale è una sequenza di caratteri racchiusa tra doppi o singoli apici.
Per accedere al singolo carattere si può ricorrere all’operatore []. Non è possibile
modificarlo ma è possibile assegnare alla stringa un nuovo valore. Attraverso
operatori matematici, logici o metodi built in è possibile manipolare o formattare la
stringa.
8
In Python i tipi sono individuati senza necessità di dichiarazione all’interno del
codice.
Creazione di una variabile: la variabile viene creata quando le si assegna un
valore.
Tipo di una variabile: il tipo è associato all’oggetto non alla variabile.
Uso di una variabile: quando una variabile appare in un’espressione viene
rimpiazzata dall’oggetto associato.
Figura 4. Creazione, tipo e uso di una variabile
2.2.3. Costrutti
L’insieme dei costrutti che servono a gestire il flusso di esecuzione del programma è
detto “Control Flow” (strutture di controllo). I costrutti possono essere classificati in:
costrutti condizionali;
costrutti iterativi;
costrutti non locali;
costrutti fondamentali.
If è un costrutto condizionale: se la condizione è soddisfatta viene eseguito il blocco
di istruzioni corrispondente altrimenti si analizzano le condizioni di verità dei blocchi
elif (opzionale).
Il costrutto for è un costrutto iterativo che viene utilizzato per ripetere una suite di
istruzioni un numero definito di volte. Per iterare su una sequenza di interi, Python
dispone della funzione built-in range([start,] stop[, step]) che restituisce una lista di
interi.
Figura 5. Ciclo condizionale for
9
Il costrutto while permette di eseguire un blocco di istruzioni un numero indefinito
di volte finché una particolare espressione risulta True (condition==True).
Figura 6. Ciclo condizionale while
L’istruzione break interrompe l’esecuzione del loop. Per i cicli annidati break
interrompe esclusivamente l’esecuzione del loop più interno.
L’istruzione continue salta all’iterazione successiva di un ciclo. Nel caso di cicli annidati
continue agisce sul ciclo più interno.
Ai cicli condizionali for e while può essere associato un else statement a patto che
questi non terminino con break:
Figura 7. Cicli condizionali for e while con else statement
Il costrutto try-except permette di rilevare le eccezioni e generare except nel caso in
cui ci siano degli errori e try nel caso in cui non ce ne siano:
Figura 8. Costrutto try-except
Il costrutto try-except può avere un else-clause opzionale. L’else-clause viene eseguito
quando il costrutto try non genera eccezioni.
E’ possibile forzare la generazione di un’eccezione attraverso lo statement raise.
Figura 9. Statement Raise
10
2.2.4. Dato strutturato
Oltre ai tipi di dato del linguaggio come stringhe, interi o complessi Python fornisce
delle strutture dati del linguaggio che possono essere mutevoli o immutevoli e sono:
Liste
Tuple
Dizionari
list definisce un tipo di dato strutturato lista. Una lista può contenere
contemporaneamente elementi di diverso tipo. Gli elementi di una lista sono
contenuti tra []. L’ordinamento viene mantenuto poiché una lista non è una collezione
di dati ma una sequenza ordinata di dati. Le liste supportano l’operatore di
slicing[start:stop:step]. La funzione range() serve per generare liste di numeri interi.
Le liste sono contenitori dati modificabili. Gli oggetti di tipo lista contengono metodi
built_in per manipolare e modificare i dati membro:
Inserimento (append, insert o extend)
Ricerca (count o index)
Eliminazione (remove o pop)
Ordinamento (reverse o sort)
Le tuple sono sequenze ordinate di dati racchiusi tra (). Le tuple sono liste molto
particolari i cui elementi sono immutabili e non contengono pertanto metodi di
eliminazione, inserimento e ricerca. L’accesso al singolo elemento avviene attraverso
l’operatore []. Lo slicing[start:end] è ammesso anche sulle tuple. E’ possibile
convertire un dato tupla in un dato lista e viceversa rispettivamente attraverso le
funzioni list e tuple.
Un dictionary è un insieme non ordinato di oggetti. Ogni oggetto di un dictionary è
identificato univocamente da una key. Ogni elemento di un dictionary è
rappresentato da una coppia key–value. In Python le keys possono essere solo oggetti
immutabili: le tuple, per esempio, possono essere usate come chiavi di indicizzazione
di un dictionary. Come le tuple e le liste anche i dizionari sono tipi built-in. I dati sono
racchiusi tra { }, l’accesso al singolo elemento avviene attraverso [ ]. I dizionari
vengono manipolati attraverso le funzioni di Update ed Eliminazione (clear, pop).
Tabella 1. Liste, Tuple e Dizionari
11
Il ciclo for consente di iterare su oggetti iterabili come liste, tuple, stringhe, set,
dizionari.
Figura 10. Ciclo for per Liste, Tuple e Dizionari
Per ciclare sugli oggetti di un array (lista, tupla o stringa; in generale(containers)) si
utilizza il ciclo for. Il ciclo for per operare all’interno degli elementi del cointainers
utilizza un oggetto detto iteratore.
12
2.2.5. Funzioni
Una funzione è un blocco organizzato di codice che viene utilizzato per eseguire un
preciso task. Python dispone di funzioni built-in, print(), help(), dir() etc, ma è possibile
definire nuove funzioni. La definizione di una funzione in Python ha la seguente
sintassi:
Figura 11. Definizione funzione
Quando lo statement def viene eseguito crea una nuova function object e le assegna
un nome.
Figura 12. Definizione funzione oggetto
La funzione f1 non viene creata finché lo statement def non viene raggiunto ed
eseguito. In Python è importante distinguere tra oggetti mutabili e immutabili per
capire il passaggio di argomenti ad una funzione:
Immutabili, vengono passati per valore
Mutabili, vengono passati per referenza
E’ possibile chiamare una funzione utilizzando dei keyword arguments della forma
keyword=value. Python consente di utilizzare come parametro di funzione una lista
di lunghezza variabile di argomenti.
Con un asterisco * questi argomenti vengono mantenuti in una tupla:
Figura 13. Definizione Tupla
Con due asterischi ** questi argomenti vengono mantenuti in un dictionary:
Figura 14. Definizione Dizionario
Python permette di utilizzare una funzione come argomento di un’altra funzione
attraverso un riferimento ad un funcion-object. Le funzioni in Python sono strutture
molto flessibili: sono oggetti a tutti gli effetti. Questo consente a una funzione di
essere argomento di un’altra funzione, di essere assegnata ad una variabile etc.
13
2.2.6. File e Directory
Python dispone di funzionalità per gestire e manipolare files e directories che
lavorano su più piattaforme: ricercare files, navigare in directories, manipolare,
eliminare e rinominare files. Sono disponibili alcune funzioni built-in per le operazioni
più comuni di manipolazione dei file object:
creazione;
lettura;
scrittura;
posizione;
chiusura;
attributi.
Le operazioni di processamento di file e directory possono facilmente essere eseguite
tramite Python e sono:
modulo os.path;
modulo os;
modulo Shutil;
modulo Glob.
2.2.7. Numpy
NumPy è l’abbreviazione di Numerical Python: un’estensione del linguaggio pensata
per l’ottimizzazione della gestione di grosse moli di dati e utilizzata in ambito
scientifico. Introduce una modalità naturale ed efficiente per utilizzare array multi-
dimensionali e aggiunge una serie di utili funzioni matematiche di base. Numpy
fornisce un nuovo tipo di dato: un array N-dimensionale (ndarray), una struttura dati
omogenea. Le caratteristiche di un array sono:
size (numero elementi);
rank (numero assi);
shape (numero dimensioni);
itemsize (memoria singolo elemento).
Figura 15. Caratteristiche array
14
Ci sono diverse modalità per generare un array. La più semplice consiste nell’utilizzo
della funzione array(object, dtype=None, copy=1, order=None). L’array si crea
convertendo le altre strutture dati di Python con nuovi dtype definiti dall’utente.
Se il contenuto di un array è a priori ignoto, è utile usare funzioni per riempire in modo
sistematico l’array:
zeros, per creare array di soli zero;
ones, per creare array di soli uno;
empty, per creare array di certe dimensioni;
identity, per generare matrice identita nxn;
range, per creare una sequenza di numeri per gli array;
linspace, per generare sequenza di numeri uniformemente distribuita
compresa tra start e stop.
I metodi resize e reshape permettono di modificare la forma e la dimensione
dell’array. Il metodo reshape(shape, order=‘C’) restituisce una nuova struttura dati
ridistribuendo gli elementi dell’array secondo la nuova forma shape con ordine order
lasciando invariato il numero di elementi dell’array.
La funzione resize(new_shape, refcheck=True, order=False) permette di modificare la
forma dell’array e di ridimensionarlo. Resize funziona solo se l’array non è referenza
o non è referenziato.
Figura 16. Reshape in C e Fortran
L’accesso agli elementi di un array avviene tramite l’operatore []. Anche sugli array è
applicabile l’operatore di slicing[:] che però è profondamente differente rispetto a
quello delle liste. Nel caso delle liste la sotto-lista è una copia per valore della lista
originale mentre nel caso degli array la copia è di default per referenza.
Il nuovo array ha:
la shape dell’array di indici;
tipo e valori dell’array di partenza.
15
L’iterazione sugli elementi di un array può essere effettuata attraverso
ciclo for (lungo gli assi);
iteratore flat (su ogni elemento).
Le operazioni numeriche su un array sono operazioni elementari con scalari
attraverso operatori aritmetici, logici e di confronto. Numpy oltre alla definizione
dell’oggetto ndarray definisce anche le funzioni universali ufunc, che permettono di
operare elemento per elemento sull’intero array. NumPy offre più di 60 ufuncs:
funzioni trigonometriche, esponenziali, logaritmiche, funzioni di confronto e funzioni
floating point. E’ possibile a volte lavorare su array che non hanno le stesse
dimensioni, in questo caso si parla di broadcasting, il quale segue due regole:
– se gli array non hanno lo stesso numero di dimensioni, l’array più piccolo viene
ridimensionato fino a che entrambi gli array non hanno la stessa dimensione;
– array con dimensione ‘1’ lungo una particolare direzione si comportano come
l’array più grande lungo quella dimensione.
Figura 17. Broadcasting
Uno dei vantaggi nell’utilizzo degli array consiste nel fatto che molte operazioni
possono essere svolte evitando loop espliciti. Questo procedimento prende il nome
di vettorizzazione. L’object class array dispone di utili funzionalità implementate
come:
attributi (dtype, flat, itemsize, ndim, size e shape);
metodi (take, choose, compress, sort e transpose).
Per valutare una funzione 2D su una griglia si usa il comando meshgrid.
Figura 18. Meshgrid
16
2.2.8. Matpoltlib
Uno strumento per la grafica bidimensionale è fornito dalla libreria Matplotlib. La
libreria Matplotlib nasce per emulare in ambiente Python i comandi grafici di Matlab.
È sviluppata interamente in Python e utilizza il modulo Numpy per la rappresentazione
di grandi array.
Matplotlib è divisa in tre parti:
Pylab interface: set di funzioni fornite dal modulo Pylab;
Matplotlib API;
Backend: grafici per l’output su file e visuali per l’output su interfacce grafiche.
Matplotlib è disegnata per la programmazione object oriented da cui si possono
definire oggetti per colours, lines, axes, etc.
Ci sono 2 modi per usare Matplotlib:
object-oriented way: Il modo Pythonico di lavorare con Matplotlib. Il modulo
pyplot fornisce un'interfaccia alla libreria matplotlib;
pylab: un modulo che unisce Matplotlib e NumPy in un ambiente simile a
Matlab.
L’interfaccia Pylab costituisce il modo più semplice per lavorare con Matplotlib. Le
funzioni sono molto simili all’ambiente Matlab.
La funzione figure() istanzia un oggetto figura.
La funzione close(n) chiude la finestra n.
La funzione show() visualizza tutte le figure.
Figura 19. Interfaccia Pylab
17
Le principali entità su cui lavorare sono:
figure, per gestire e creare un numero arbitrario di figure;
plot e subplot, per creare grafici specificando stile e numero di colonne e righe;
line2D, per modificare dimensione stile colore etc.;
text, per gestire stringhe di testo all’interno di grafici;
axes, per gestite gli assi (simile a subplot).
Figura 20. Plot, figure, line2D, text e axes
18
2.2.9. Sviluppi di Python
Una volta acquisite le competenze per l’uso di Python, è stato possibile valutare gli
sviluppi del programma utilizzando le nozioni apprese durante il corso di formazione.
L’argomento affrontato ha riguardato “L’energia del moto ondoso nel Mar
Mediterraneo”. Per poter determinare l’energia del moto ondoso è stato necessario
importare la mappa del Mar Mediterraneo tramite il comando import basemap oltre
al modulo Numpy per le funzioni matematiche e al modulo Matplotlib per la grafica
bidimensionale. Successivamente, è stata realizzata una funzione per poter valutare
l’energia del moto ondoso che dipende dalla latitudine e longitudine, dalla profondità
del fondale marino e dalla celerità del moto ondoso lungo le due coordinate.
E’ stato così possibile determinare, in un certo istante e in qualsiasi punto, l’energia
del moto ondoso lungo tutta la superficie del Mar Mediterraneo
Figura 22. Energia del moto ondoso nel Mar Mediterraneo
19
2.3. Latex
2.3.1. Descrizione del linguaggio
Latex è un linguaggio di scrittura usato per la preparazione di testi basato sul
programma di composizione tipografica TEX. Fornisce funzioni di desktop publishing
programmabili e mezzi per l'automazione della maggior parte della composizione
tipografica, inclusa la numerazione, i riferimenti incrociati, tabelle e figure,
organizzazione delle pagine, bibliografie e molto altro.
I documenti redatti con LaTeX possono essere scritti utilizzando diverse classi:
book, per realizzare libri;
article, per articoli, soprattutto scientifici;
letter per lettere;
report;
slides per creare presentazioni.
Un documento si compone di due parti principali: il preambolo ed il corpo del
documento vero e proprio. Nel preambolo sono contenute le istruzioni principali
relative alla struttura del documento (la lingua, il formato della pagina, il numero di
colonne ecc.). Segue il corpo del documento vero e proprio, che è tutta la parte di
testo compresa fra le istruzioni \begin{document} e \end{document}.
All’inizio di un documento in Latex è previsto il preambolo che comincia con il
comando \documentclass{…} che specifica il tipo di documento da scrivere con la
classe, il tipo di foglio e il carattere.
Successivamente, per caricare i pacchetti da utilizzare riguardanti lingua, testo, grafici,
tabelle ecc. si utilizza il comando \usepackage{…}. Infine, per determinare lo stile della
pagina, e quindi i piè di pagina, si usa il comando \pagestyle{style}.
Il corpo del documento prevede l’autore (\author{…}), il titolo (\title{…}), il sottotitolo
(\maketitle{}) e i capitoli (\section{…}) e sottocapitoli (\subsection{…}) se presenti.
Alcuni dei comandi principali sono \\ o \newline per andare a capo e \newpage per
cambiare pagina. Altri riguardano il carattere e sono \underline{…} per sottolineare il
testo e \emph{…} per scrivere in corsivo. Per inserire le tabelle si usano i comandi
\begin{table}[pos] e \begin{tabular}[pos]{table spec}, con pos che può essere t, b o c
a seconda che il testo si trovi in alto, in basso o al centro della cella e table spec che
può essere l, r o c a seconda che il testo si trovi a sinistra, a destra o al centro della
cella. Per inserire invece le figure i comandi da dare a Latex sono \begin{figure}[pos]
con pos che può essere h,b,p o ! a seconda che sia al centro, in basso, in alto o non ci
sia. Mentre per i grafici il comando è \includegraphics[key] con key che specifica
larghezza, altezza, rotazione e scala del grafico da inserire.
20
3. Studio per la determinazione delle mareggiate nei mari italiani
3.1. Introduzione
Una volta acquisite le competenze necessarie in ambito informatico, l’obiettivo è
stato quello di studiare e valutare con il Metodo dei Picchi sopra soglia (POT) le
mareggiate nei mari italiani in un anno nel periodo tra Maggio 2017 e Aprile 2018
grazie al modello di previsione costiero MC_WAF fornito dall’ISPRA e al linguaggio di
programmazione Python. MC_WAF ha fornito accurate previsioni dello stato del mare
in specifiche aree costiere del Mediterraneo e nello specifico in corrispondenza delle
15 boe ondametriche della Rete Ondametrica Nazionale (RON) posizionate su
determinati punti della penisola italiana. E’ stato così possibile, grazie al seguente
modello, la determinazione dei parametri fondamentali che descrivono una
mareggiata: l’altezza d’onda significativa, il periodo di picco, il periodo medio, la
direzione di provenienza delle onde e il tempo di ritorno. Grazie alla
georeferenziazione delle mappe del Mediterraneo è stato possibile recuperare questi
dati attraverso degli script su Python per poi generare delle tabelle in Latex con i
parametri sopracitati e i grafici di altezza d’onda rispetto al tempo in relazione a un
singolo mese.
21
3.2. Sistema di previsione costiero MC_WAF
L’obiettivo del sistema di previsione marino-costiero MC_WAF (Mediterranean Coastal Wave Forecasting System) è di fornire accurate previsioni dello stato del mare
in specifiche aree costiere del Mediterraneo secondo uno schema che prevede l’utilizzo di due modelli d’onda di terza generazione, in tre livelli di cascata: dalla grande scala (Mar Mediterraneo), alla scala regionale e quindi alla scala costiera. Il WAM (Wave Model) copre tutto il Mediterraneo e produce condizioni "al contorno" sulle aree a scala regionale. Nelle sotto-aree viene impiegato ancora il WAM ma a risoluzione doppia rispetto al modello a grande scala. Lo
SWAN utilizza i risultati del WAM alla scala regionale come condizioni al contorno per simulare i processi fisici legati alla propagazione delle onde in aree costiere ed acque basse. L’operatività di MC_WAF permette non solo di integrare il sistema di monitoraggio costiero dell’ISPRA con la previsione a medio termine dello stato del mare, ma consente anche di sviluppare studi e applicazioni di lungo periodo inerenti la dinamica costiera, l’erosione, l’ingegneria costiera e la biologia marina. La struttura del sistema MC_WAF è ideata in modo da essere facilmente modificabile, permettendo l’inserimento di nuove griglie di calcolo in funzione delle diverse esigenze. La predisposizione delle griglie di calcolo segue lo schema, già ampliamente testato in un anno di simulazioni partendo dalla griglia generale su tutto il Mediterraneo (risoluzione 1/30 di grado). Le griglie sono state scelte in modo da coprire la costa tirrenica e la costa orientale della Sicilia. Sono state definite dimensioni e posizione di sei griglie di calcolo, due delle quali sono operative da marzo 2012 (G1 e G4), tutte le altre operano da luglio 2012.
Figura 23. Griglie di calcolo penisola italiana
22
A scala costiera, l’individuazione delle aree a maggiore risoluzione dipende dalle necessità applicative dell’ISPRA e dalla disponibilità di batimetrie ad alta risoluzione. Al momento sono parte attiva del sistema le tre griglie costiere annidate alla griglia regionale G1 (Marina di Carrara, Isola d’Elba ed Isola del Giglio) e due griglie costiere nella griglia G4, Terracina e Golfo di Napoli.
Figura 24. Griglie di calcolo Mar Tirreno Centro-Settentrionale
Le previsioni del vento utilizzate nel sistema MC_WAF sono prodotte dal modello meteorologico Bolam2011 del SIMM (Sistema Idro-Meteo-Mare) dell’ISPRA. Il dominio d’integrazione del SIMM permette di fornire le previsioni meteorologiche sull’intero Mare Mediterraneo con un passo di griglia di circa 10 km ogni ora. Per il modello a grande scala e per le aree regionali sono state utilizzate le carte batimetriche GEBCO (General Bathymetry Chart of Oceans) della BODC (British Oceanographic Data Centre) con risoluzione 1/2 grado. Per la scala costiera, in cui sono determinanti i processi di interazione tra onda e fondale come la rifrazione, lo shoaling ed il frangimento, è di fondamentale importanza la batimetria utilizzata. Per questo motivo le batimetrie a scala costiera sono state integrate con le mappe digitali dell’Istituto Idrografico della Marina e con ulteriori apporti forniti da diverse istituzioni a seconda dell’area costiera in esame.
23
3.3. Metodo POT (Durate Parziali Sopra Soglia)
La prima fase da affrontare in un’analisi rivolta alla previsione delle massime altezze d’onda in un determinato arco temporale prevede la selezione dei dati omogenei e indipendenti tra quelli disponibili. Le popolazioni statistiche estratte dai dati osservati possono essere distinte in due
diversi tipi, a seconda del procedimento seguito per la loro formazione: il primo
prevede il campionamento regolare della serie osservata e genera una popolazione
temporalmente aggregata; l’altro prevede un campionamento ad evento e quindi
genera una popolazione temporalmente disaggregata. Il primo procedimento è
riconducibile al metodo del campione totale (Goda, 1988), il secondo è riconducibile
al Metodo delle Durate Parziali Sopra Soglia (“Peak Over Threshold ” - Goda, 1988) o
al Metodo dei Massimi Annuali. Il metodo del campione totale non assicura a priori
né l’indipendenza né l’omogeneità dei dati che formano il campione. Al contrario, il
Metodo delle Durate Parziali Sopra Soglia, grazie alla definizione di opportuni criteri
d’individuazione degli eventi, permette la cernita di dati sia omogenei sia
indipendenti. L’indipendenza campionaria della serie dei colmi è assicurata
imponendo un valore di soglia per l’intervallo che intercorre tra due mareggiate
successive. Per far sì che i dati risultino indipendenti, l’intervallo tra un evento e il
successivo deve essere maggiore di 48 ore, selezionando solo il valore culmine della
mareggiata. Affinché i dati siano anche omogenei oltre che indipendenti, sono
utilizzati nelle analisi soltanto i valori superiori ad una seconda soglia d’altezza d’onda
posta nel nostro caso a 2 m.
Grafico 2. Altezza d’onda significativa in un mese
Infine, se l’omogeneità climatica può essere ottenuta con il metodo delle serie di
durata parziale, l’omogeneità direzionale può essere garantita imponendo
l’appartenenza della direzione media di provenienza della mareggiata a determinati
settori direzionali.
24
Al fine di individuare tali settori direzionali per ogni boa della RON, si sono prese in
considerazione diverse informazioni:
la conformazione delle aree di generazione del moto ondoso sottese da
ciascuna boa (distribuzione dei fetch geografici);
la distribuzione direzionale della frequenza di accadimento delle osservazioni;
la distribuzione direzionale dei colmi di mareggiata e della loro frequenza di
accadimento.
Sia la frequenza di accadimento dei dati osservati, sia quella dei colmi di mareggiata
possono essere calcolate imponendo diversi valori della soglia di troncamento (1.0m,
2.0m, 3.0m). Questi valori saranno poi utili nelle relazioni sullo stato dei mari italiani
per la realizzazione della “Tabella a due ingressi” in cui si ha una distribuzione
congiunta di altezza d’onda significativa e direzione di propagazione delle onde con la
relativa frequenza di accadimento.
25
3.4. Script di Python
Una volta definiti i criteri d’individuazione degli eventi con il Metodo delle durate parziali sopra soglia (POT) con cui selezionare i dati più rilevanti ai fini dello studio e della valutazione delle mareggiate sull’intera penisola italiana, si è proceduto per ogni mese con l’esecuzione di 3 script su Python realizzati dall’ISPRA: 1) mod_report.py, per generare il grafico di altezza d’onda rispetto al tempo; 2) mktable.py, per generare le tabelle a due ingressi in Latex che mettono in
relazione altezza d’onda significativa e direzione di propagazione delle onde con la relativa frequenza di accadimento;
3) mkreport.py, per generare la relazione sullo stato dei mari italiani insieme alla relativa tabella con l’elenco delle mareggiate in Latex.
Lo script principale è il terzo perché, tramite l’istruzione import, carica anche i primi 2 script permettendo, una volta eseguito, la generazione dei grafici e delle tabelle suddette. Questo processo è fondamentale visto che permette la determinazione dei valori di altezze d’onda significative, periodi di picco, periodi medi, direzioni di provenienza e tempi di ritorno delle mareggiate occorse durante tutto l’arco del mese, fondamentali per la conoscenza degli eventi di mareggiata e di seguito riportati nella stesura della relazione. Il tutto è stato reso possibile dal sistema di previsione costiero MC_WAF che ha predetto le mareggiate durante tutto l’arco temporale in cui si è compiuto lo studio. La georeferenziazione delle mappe del Mar Mediterraneo da parte di Python ha consentito di conoscere per ogni ora tutto quello che è successo sulle coste italiane dal punto di vista del moto ondoso e quindi le mareggiate occorse nei mari italiani nei mesi analizzati, prendendo come riferimento le posizioni delle boe RON. Tale scelta ha permesso, in buona parte dei casi, di poter valutare gli eventi in relazione al clima ondoso osservato.
26
4. Stesura delle relazioni sullo stato dei mari italiani
4.1. Introduzione
Conoscendo il linguaggio di scrittura Latex, in base alle tabelle generate in Python è
stato possibile redigere le relazioni sullo stato dei mari che descrivono le mareggiate
nell’arco di tutto l’anno sull’intera penisola. In queste relazioni, sono presenti tutti i
dati e le illustrazioni presi dal modello di previsione costiero MC_WAF che specificano
più approfonditamente dove e con quale intensità la mareggiata si è verificata. Si è
proceduto così con la stesura delle relazioni su Latex dopo aver osservato le
mareggiate occorse nei singoli mesi sul sistema di previsione costiero MC_WAF
presente sul sito dell’ISPRA. L’arco temporale analizzato è stato pari ad un anno ed è
durato da Maggio 2017 ad Aprile 2018 riscontrando eventi estremi come
immaginabile soprattutto nella stagione invernale. Delle 12 relazioni redatte (una per
ogni mese) cito la relazione sullo stato dei mari italiani del mese di Maggio 2017.
27
4.2. Relazione sullo stato dei mari italiani Maggio 2017
4.2.1. Descrizione generale delle mareggiate occorse nel mese
Durante il mese di maggio 2017 sono stati previsti tre episodi mareggiata. Il primo
episodio, previsto tra il 6 ed il 8 maggio ha interessato la parte occidentale della
Sardegna, il Mar Tirreno e il Canale di Sicilia. Le onde più alte sono state previste ad
Alghero con 𝐻𝑚0 = 3.6 𝑚 e Mazara del Vallo con 𝐻𝑚0 = 3.3 𝑚, valori in linea con il
clima ondoso atteso. Il secondo caso, tra il 19 ed il 20 maggio, ha interessato il Mar
Ligure, il Mar Tirreno Centrale ed in parte le coste occidentali della Sardegna. Le onde
più alte sono state previste a La Spezia con 𝐻𝑚0 = 3.1 𝑚 e a Ponza con 𝐻𝑚0 = 2.7 𝑚,
inferiori ai massimi annuali localmente attesi. L'ultimo episodio, di breve durata e
fortemente localizzato nell'Adriatico Meridionale, è comunque di un certo interesse
avendo previsto a Monopoli un'altezza significativa 𝐻𝑚0 = 4.1 𝑚 con tempo di
ritorno di 1,5 anni.
Grafico 3. Altezza d’onda significativa Maggio 2017
28
4.2.2. Episodio 6-8 Maggio: Mar Tirreno, Mar di Sardegna e Canale
di Sicilia
La mareggiata ha avuto inizio il 6 maggio con un caso di Mistral dal Golfo del Leone, e
si è propagata attraverso le Bocche di Bonifacio fino alle coste del Mar Tirreno. Sono
state previste onde con 𝐻𝑚0 = 2.5 𝑚 a Civitavecchia e 𝐻𝑚0 = 2.6 𝑚 a Ponza. Il
giorno successivo i fenomeni hanno interessato prima il Canale di Sardegna, facendo
registrare ad Alghero un'altezza d'onda 𝐻𝑚0 = 3.6 𝑚, poi il Canale di Sicilia dove il
modello ha previsto 𝐻𝑚0 = 3.3 𝑚 a Mazara.
Figura 27. MCWAF ISPRA - altezza significativa 𝑯𝒎𝟎
Mar Mediterraneo
29
Figura 28. MCWAF ISPRA - altezza significativa 𝑯𝒎𝟎
Mar Tirreno Centrale
Figura 29. MCWAF ISPRA - altezza significativa 𝑯𝒎𝟎
Mar di Sardegna
31
4.2.3. Episodio 19-20 Maggio: Mar Ligure e Mar Tirreno Centrale
Un ulteriore caso di Mistral ha caratterizzato la mareggiata proveniente dal Golfo del
Leone, prevista la notte del 19 maggio nel Mar Ligure, con 𝐻𝑚0 = 3.1 𝑚 a La Spezia.
La stessa si è propagata anche attraverso le Bocche di Bonifacio fino a lambire le coste
Tirreniche, facendo registrare a Ponza un'altezza d’onda significativa 𝐻𝑚0 = 2.7 𝑚.
Tutte le condizioni previste sono risultate in linea con il clima ondoso atteso.
Figura 31. MCWAF ISPRA - altezza significativa 𝑯𝒎𝟎
Mar Mediterraneo
Figura 32. MCWAF ISPRA - altezza significativa 𝑯𝒎𝟎
Mar Ligure
33
4.2.4. Episodio 25 Maggio: Mar Adriatico Meridionale
La mareggiata del 25 maggio ha interessato esclusivamente la zona dell'Adriatico
Meridionale. L'episodio, caratterizzato da una breve durata (8 ore), ha raggiunto
un'altezza massima a Monopoli di 𝐻𝑚0 = 4.1 𝑚, valore superiore al massimo annuale
localmente atteso.
Figura 34. MCWAF ISPRA - altezza significativa 𝑯𝒎𝟎
Mar Mediterraneo
Figura 35. MCWAF ISPRA - altezza significativa 𝑯𝒎𝟎
Mar Adriatico Meridionale
34
4.2.5. Elenco mareggiate
In Tab. sono elencate tutte le mareggiate occorse nei mari italiani nel mese di Maggio
2017, prendendo come riferimento le posizioni delle boe RON. Tale scelta permette,
in buona parte dei casi, di poter valutare gli eventi in relazione al clima ondoso
osservato. In questa tabella la direzione Dir [°N] indica la direzione di provenienza
delle onde (convenzione meteorologica).
Tabella 2. Elenco Mareggiate
35
4.2.6. Tabella a due ingressi
Si allegano infine le tabelle a due ingressi o Joint Frequency Functions (JFF) di altezza
significativa e direzione a la Spezia e Monopoli per il mese di maggio 2017. Dalle
statistiche si può osservare la distribuzione congiunta di altezza e direzione delle
onde, che caratterizza il clima ondoso mensile. In queste tabelle la direzione Dir [°N]
indica la direzione di propagazione delle onde (convenzione marina).
Tabella 3. Tabella a 2 ingressi (JFF) La Spezia
Tabella 4. Tabella a 2 ingressi (JFF) Monopoli
36
5. Bibliografia
Oetiker T., Partl H., Hyna I and Schlegl E., “The Not So Short Introduction to LATEX”.
Langtangen H. P., “A Primer on Scientific Programming with Python Scripting”.
Corsini S., Franco L., Inghilesi R. and Piscopia R., “Atlante delle Onde nei Mari Italiani
Italian Wave Atlas”.
Inghilesi R. “Statistical Analysis of Extreme Waves on the Italian Coasts from 1989 to
1999”.
Franco L., “Analisi Statistica delle Onde Estreme”.
Bellotti G., “La statistica a Lungo Termine del Moto Ondoso secondo la DNV‐RP‐C205”.
Mathiesen M., “Recommended Practice for Extreme Wave Analysis”.
Martucci G., Carniel S., Chiggiato J., Sclavo M., Lionello P., and Galati M. B., “Statistical
Trend Analysis and Extreme Distribution of Significant Wave Height from 1958 to 1999
– an Application to the Italian Seas”.
World Meteorological Organization 2008, “Guide to Hydrological Practices”.
http://www.isprambiente.gov.it/pre_mare/coastal_system/html/info.html ,
“Il Sistema di Previsione Marino-Costiero”.
http://www.isprambiente.gov.it/pre_mare/coastal_system/maps/med/mediterraneo.
html, “Previsioni dello Stato del Mare nel Mar Mediterraneo”.