Robitex's Blog

Ideas in the web

Archivi Categorie: Ingegneria

L’Arte della pericolosità sismica – Parte 2


Sommario

Con un nuovo tocco di colore, torniamo sulla mappa della pericolosità sismica italiana per produrre un’altra pagina artistica. Questa volta useremo una scala di colori con quelli della nostra bandiera…

Colore italiano

Riprendendo il codice illustrato in questo post, è sufficiente creare una nuova funzione Lua, riportata in seguito, per ottenere la mappa sottostante:

La mappa di pericolosità sismica in versione tricolore

La mappa di pericolosità sismica in versione tricolore

Il colore, funzione dell’accelerazione, varierà da verde per il valore minimo a bianco per l’accelerazione media, fino ad arrivare al rosso per l’accelerazione massima.
In LaTeX, un colore può essere miscelato facilmente con il bianco specificandone dopo il nome ed un punto esclamativo, un valore variabile da 0 a 100. Il valore nullo corrisponde al colore bianco, mentre il valore 100 lascia intatto il colore.
Così, l’espressione ‘green!50’ corrisponde al colore bianco con il 50% di verde.

Il codice seguente mostra la funzione che genera l’espressione del colore in funzione dell’accelerazione. Valori bassi di pericolosità saranno rappresentati da un colore verde mescolato con sempre meno bianco a mano a mano che l’accelerazione decresce, mentre valori elevati saranno rappresentati da un colore rosso mescolato ad una componente decrescente di bianco:

-- funzione di interpolazione lineare
local function linear(x,x1,x2,y1,y2)
   return y1 + (y2-y1)*(x-x1)/(x2-x1)
end

-- funzione scala di colori dal verde al rosso
-- passando per il bianco
local function green2red(ag)
   local agmean = (agmax+agmin)/2
   local basecol, val
   if ag < agmean then
      basecol = 'green'
      val = linear(ag, agmin, agmean, 100, 0)
   else
      basecol = 'red'
      val = linear(ag, agmean, agmax, 0, 100)
   end
   
   return string.format('%s!%d', basecol, val)
end

Ho stampato anche questa nuova mappa, naturalmente a colori, e l’ho appesa in ufficio a beneficio della collezione primavera estate 2012.
Ciao.

L’Arte della pericolosità sismica


Sommario

Attraverso i software del mondo TeX, creeremo una visualizzazione artistica della mappa di pericolosità sismica italiana contenuta nella norma D.M. 14/01/2008. L’elaborazione grafica sarà opera del potente pacchetto TikZ progettato per LaTeX, mentre un piccolo programma in Lua si occuperà della costruzione logica.

Pericolosità sismica S1

Il progetto S1 di INGV, l’Istituto Nazionale di Geofisica e Vulcanologia, recepito poi dalla normativa tecnica, ha definito la pericolosità sismica nel territorio italiano attraverso una griglia di punti distanti uno dall’altro poco più di 5 km.
L’idea è quella di replicare le rappresentazioni grafiche diffuse dall’INGV con gli strumenti del mondo TeX, realizzando mappe a colori con i valori dell’accelerazione di picco al suolo PGA, Peak Ground Accelaration (un risultato è riportato in fondo all’articolo).

Immagine della mappa S1 tratta dal sito INGV

Immagine della mappa S1 tratta dal sito INGV

Struttura del codice

Ecco una descrizione di come verranno elaborati i dati:

  • uno script principale in Lua, efficiente linguaggio di scripting, leggerà i dati della pericolosità producendone un file di testo contenente comandi grafici per TikZ;
  • un sorgente LaTeX elaborerà i comandi producendo la mappa grafica in formato pdf.

I dati

Ho tradotto la tabella scaricabile dal sito del Consiglio dei Lavori Pubblici, contentente i dati di pericolosità sismica, in una forma direttamente comprensibile da Lua: ecco come appare il contenuto del file di dati che ho chiamato ‘GridS1.lua’:

GridS1 = {
[13111] = {lon=6.5448, lat=45.134, Tr30={0.0263, 2.50, 0.18}, Tr50={0.0340, 2.51, 0.21}, ...ecc
[13333] = {lon=6.5506, lat=45.085, Tr30={0.0264, 2.49, 0.18}, Tr50={0.0341, 2.51, 0.21}, ...ecc
[13555] = {lon=6.5564, lat=45.035, Tr30={0.0264, 2.50, 0.18}, Tr50={0.0340, 2.51, 0.20}, ...ecc
...ecc

Creare i comandi grafici

Disegneremo per ciascun punto della griglia S1, un quadratino colorato secondo una data scala di colori associata al valore della PGA, ma per farlo dobbiamo risolvere due problemi:

  • tradurre la coppia longitudine, latitudine dei punti in coordinate nel piano x, y;
  • associare un colore al valore di accelerazione.

Il sorgente Lua mostrato nel seguito dapprima carica in memoria i dati strutturati della griglia, determina i valori minimi e massini dell’accelerazione tra tutti i 10751 punti (per il tempo di ritorno di 475 anni) utili in seguito, poi definisce le due funzioni fondamentali di trasformazione delle coordinate (trasf()) e di associazione valore->colore (wavecolor).

Preparato il terreno, lo script si conclude con la funzione go(), che scrive su un file esterno chiamato defpoint.tex, le istruzioni TikZ di disegno.

Notate che la funzione go() accetta come argomenti anche delle funzioni. Il vantaggio immediato di questo tipo di programmazione disponibile in Lua è che la funzione go() diviene indipendente sia dal tipo di trasformazione di coordinate che dalla scala di colore (io ho scelto di lavorare con la definizione di colore basato sulla lunghezza d’onda della luce con rapporto lineare rispetto alla PGA).

Per i più curiosi, nei commenti del codice sono riportati i due punti della maglia S1 corrispondenti al punto sismicamente più pericoloso e quello meno pericoloso sul territorio della penisola italiana…

-- carica la tabella dati dal file GridS1.lua
dofile "GridS1.lua"

-- funzione di massimo o minimo valore
local function S1(funval, key)
   local rif = funval(GridS1[13111])
   local id

   for idx, t in pairs(GridS1) do
      local val = funval(t)
      if key == "max" then
         if  val > rif then
            rif = val
            id = idx
         end
      elseif key == "min" then
         if val < rif then
             rif = val
             id = idx
          end
       else
          error("The key '"..key"' is not supported.")
       end
    end
    return rif, id
end
-- funzioni di estrazione dati singolo nodo
local function Lat(t)
    return t.lat
end
local function Lon(t)
    return t.lon
end
local function Ag475(t)
    return t.Tr475[1]
end
local function countNode()
    local i = 0
    for _, t in pairs(GridS1) do
       i = i + 1
    end
    return i
end
-- valori minimi e massimi dei dati di mappa
local agmax, idmax = S1(Ag475, 'max')  --> 0.278 , 49640
local agmin, idmin = S1(Ag475, 'min')  --> 0.0364, 12693

-- latitudine
local latmax = S1(Lat, 'max')   --> 47.178
local latmin = S1(Lat, 'min')   --> 36.573

-- longitudine
local lonmax = S1(Lon, 'max')   --> 18.594
local lonmin = S1(Lon, 'min')   --> 6.5448

-- numero nodi S1 (solo per saperlo...)
local numnode = countNode()     --> 10751

-- funzione di servizio
local function makecmdfile(fn, t)
   local outputfile = assert(io.open(fn..".tex","w"))
   outputfile:write(table.concat(t,"\n"))
   outputfile:close()
end

-- restituisce le coordinate di mappa
-- da quelle geografiche
local function trasf(lon, lat)
   -- fattore di conversione gradi->cm
   local f = 4.1

   return 0.80*lon*f, lat*f
end

-- funzione scala di colori wavelets
local function wavecolor(ag)
   local w1 = 363
   local w2 = 814
   local m = 80
   w1 = w1 + m
   w2 = w2 - m
   return w1 + (w2-w1)*(ag-agmin)/(agmax-agmin)
end

-- maschera di formato disegno
local cmask = '\\convertcolorspec{wave}{%d}{rgb}\\col\\color[rgb]{\\col}'
local dmask = '\\draw (%0.3f,%0.3f) node {};'

-- filename = nome senza estensione del file risultato
-- fcoord = funzione di trasformazione coordinate
-- fcolor = funzione di trasformazione colore
local function go(filename, fcoord, fcolor)
   -- memorizzazione comandi
   local t = {}
   for id, dati in pairs(GridS1) do
      local ag = Ag475(dati)
      local lt = Lat(dati)
      local ln = Lon(dati)

      t[#t+1] = string.format(cmask, fcolor(ag))
      t[#t+1] = string.format(dmask, fcoord(ln,lt))
   end

   makecmdfile(filename, t)
end

-- esecuzione
go('defpoint', trasf, wavecolor)

Creare la mappa

Per creare la mappa è sufficiente compilare con pdfLaTeX questo minuscolo file:

\documentclass{standalone}
\usepackage{tikz}
\usepackage{xcolor}
\tikzstyle{every node}=[
    fill,
    minimum size=0.1pt
]

\begin{document}
\begin{tikzpicture}
\input{defpoint}
\end{tikzpicture}
\end{document}

Risultato

La mappa risultato è questa, insieme di 10751 quadratini colorati in modo diverso uno dall’altro (fate un click sull’immagine per scaricarla, un’esperienza da brivido…):

Mappa della pericolosità sismica italiana

La mappa della pericolosità sismica italiana risultato dell’elaborazione descritta nell’articolo

Note tecniche

Per riprodurre la mappa eseguendo il codice mostrato nel post, occorre disporre di una installazione TeX, come TeX Live o MiKTeX, e l’interprete Lua, tutti strumenti gratuiti, o meglio, liberi.
Avremo potuto lavorare con un unico strumento (Lua incorporata in TeX, ovvero LuaTeX, ma lascio il facile esercizio al lettore che non perderà l’occasione di inventarsi nuove scale di colore… 🙂
Alla prossima!

L’esplosione di Caina


Salire sulla montagna di detriti

I tre edifici di Caina sono stati demoliti con circa 75 kg di microcariche di tritolo sabato 14 maggio 2011 alle 15:05.

Il filmato quì sotto girato da un mio collega in posizione migliore della mia (grazie…), mostra l’evento a cui hanno assistito in molti e che ha provocato in molti emozioni forti.
Emozioni e pensieri sulla storia recente della città di Carrara, su un quartiere testimone del passato e presenza urbana da 60 anni, imploso in meno di due secondi.
Ma è assistere al fatto in se che suscita a mio avviso l’emozione più grande perché in fondo si tratta della morte istantanea, quasi un esecuzione, dovuta all’uso dell’esplosivo, di edifici che sono stati la casa di tante famiglie.
E allora fa effetto. Una stretta al cuore. Solo dopo nuove emozioni di affacciano, quelle dell’orgoglio.

TeX, bello ed affidabile


Felicità

Sono proprio contento di TeX, un programma che ha già più di 32 anni di storia. I motivi derivano dall’esperienza nell’averlo utilizzato ormai dal 2007, quindi da quattro anni, per produrre ogni sorta di documenti, dalla lettera in serie ai fax, attività di “comunicazione epistolare”, ai documenti più importanti come le relazioni tecniche di progetto.

Soddisfazione

E proprio stamani un fatto conferma e testimonia ciò che offre TeX, professionalità dei documenti, forma tipografica impeccabile, vantaggi nella gestione informatica dei contenuti digitali (file di testo, immagini, grafica vettoriale, PDF ecc), ma anche affidabilità.
Un collega infatti, nel mezzo della mattinata, ha prodotto una specie di urlo, variegato e difficile da descrivere tipo “NOOoooOOoooOOO…” che si è diffuso per il corridoio, dovuto alla perdita di un documento scritto in Word (R) divenuto un ammasso di caratteri alieni. Peccato.

Affidabilità

Con TeX questo è assai difficile che si verifichi, infatti si gestiscono i dati nel formato più universale ed affidabile che si conosca: essenzialmente testo puro ASCII, che non solo garantisce di rimanere leggibile anche nel futuro, ma consente all’utente di adoperare un numero sbalorditivo di programmi diversi, da Blocco Note di Windows, agli editor più geek di Linux, come Vi ed Emacs, per la lettura.
Non c’è pericolo che il programma faccia a pezzi il file del documento ne che spariscano i programmi in grado di leggere i file. È questo che chiamo affidabilità.

Continuità

Se uso TeX e LaTeX da quattro anni, sono anche autorizzato, oltre che a sfoggiare un sorrisetto diciamo beffardo mentre allargo le braccia confermando che la relazione, il mio collega, la deve proprio riscrivere, a lanciare questo messaggio:

utilizzate TeX e compagni anche in ambito lavorativo ovunque voi siate e qualunque cosa stiate scrivendo!!!

In primis quelli che hanno scritto la tesi con LaTeX e che poi hanno ripiegato per strumenti più “visuali” e “veloci”, ma anche gli altri che devono redarre lettere aziendali, fatture od appunti, presentazioni ed insomma, tutto quello che deve essere, in una parola, professionale.

Dedica sorridente a:

Dedicato a tutti gli utilizzatori di TeX, che sanno come apprezzare le sfumature del sorriso e che forse si sanno spiegare quello enigmatico della Gioconda di Leonardo…

Il terremoto come fenomeno poissoniano: il tempo di ritorno


Scarica l’articolo in formato PDF per la stampa

Probabilità poissoniana di accadimento

La distribuzione poissoniana delle probabilità ipotizza che se un evento è del tutto casuale, allora la probabilità che accada n volte nel periodo T è data dalla relazione seguente, noto il valore di y, il numero medio di accadimenti nel periodo considerato:

\displaystyle p_{n}=\frac{y^n}{n!}e^{-y}.

Se per esempio un evento casuale capita mediamente una volta l’anno (y=1), la probabilità che capiti due volte l’anno è di soli 18,4%.

La probabilità dipende quindi dall’intervallo di tempo di riferimento V_R, periodo in cui è noto il numero medio di accadimenti dell’evento casuale.
Se dividiamo il numero medio di accadimenti con il periodo ad esso correlato, otteniamo la frequenza media di accadimento dell’evento \lambda.

\displaystyle y=\lambda V_R.

Se invece al contrario, dividiamo il periodo di riferimento con il numero medio di accadimenti, otteniamo l’intervallo di tempo medio tra gli accadimenti dell’evento. Questo intervallo è chiamato periodo di ritorno T_R.
Il periodo di ritorno e la frequenza sono uno l’inverso dell’altro.

Chiediamoci ora la probabilità che l’evento casuale non si verifichi nel periodo di riferimento. La relazione di Poisson per nessun evento diventa (zero fattoriale vale 1):

\displaystyle p_{0}=\frac{(\lambda V_R)^0}{0!}e^{-\lambda V_R}=e^{-\lambda V_R}.

Il complemento ad uno di p_0 è la probabilità che almeno un evento si verifichi nel periodo considerato, in formule:

\displaystyle p_{n \geq 1}=p_{VR}=1-e^{-\lambda V_R}.

Questa relazione ci permette di ottenere la relazione tra il periodo di ritorno e la probabilità di superamento, fissato il periodo di riferimento. Con qualche semplice passaggio:

\displaystyle T_R=-\frac{V_R}{\log(1-p_{VR})}.

Le curve di frequenza/probabilità

Mettiamo su un grafico semi-logaritmico, quello che abbiamo appena trattato con il pacchetto PGFPlots, un componente software utilizzabile all’interno di un documento LaTeX, con l’ausilio di Gnuplot per sopperire alle capacità di calcolo di TeX.
Operativamente, occorre scrivere il testo sintatticamente corretto (il codice) che successivamente viene elaborato da pdflatex per produrre il grafico nel formato pdf (fate click sull’immagine sottostante per scaricare il risultato).

Probabilità poissoniana di un evento puramente casuale

Dal punto di vista della dotazione software, occorre una distribuzione TeX in configurazione abbastanza completa e recente (TeX Live 2010), gnuplot ed (opzionale) la suite Image Magick per tradurre il pdf in un file immagine. Tutti i programmi citati sono liberi e disponibili per vari sistemi operativi, compreso Windows.
Una volta copiato il codice in un file di testo, chiamato per fissare le idee pvr.tex, la sequenza completa dei comandi da terminale sarà:

$ pdflatex -shell-escape pvr
$ pdfcrop --margin=3 pvr.pdf pvr.pdf
$ convert -density 120 pvr.pdf pvr.png

Un breve commento al codice: si può arrivare abbastanza velocemente a scriverlo con un po’ di lavoro di rifinitura come vedete dalla sfilza di opzioni passate all’ambiente semilogxaxis. Una volta che si sono decisi i dettagli del grafico, risulta molto semplice plottare le funzioni. Basta costruire il comando \addplot gnuplot dando le opzioni di identificazione (id) e l’intervallo di dominio e scrivere l’espressione della funzione voluta. Anzi, a ben vedere si tratta di un’ottima interfaccia a gnuplot, per costruire grafici in formato vettoriale (pdf).

\documentclass{minimal}
\usepackage{pgfplots}
\thispagestyle{empty}

\begin{document}
\begin{tikzpicture}
\begin{semilogxaxis}[
    xlabel={Frequenza media nel periodo, $\lambda=1/T_R$},
    ylabel={Probabilit\'a per $n\geq1$, $p_{V_R}$},
    ytick={0,0.2,0.4,0.6,0.8,1},
    yticklabels={0\%,20\%,40\%,60\%,80\%,100\%},
    grid=both,
    xmin=0.001,
    xmax=0.1,
    ymin=0,
    ymax=1,
    no markers,
    line width=1pt,
    width=15cm,
    height=9cm,
    smooth,
    legend pos=north west]
    
\addplot gnuplot[id=pvriv,domain=0.001:0.1] {1-exp(-x*200)};
\addlegendentry{$V_R = 200$ anni};

\addplot gnuplot[id=pvriii,domain=0.001:0.1]{1-exp(-x*100)};
\addlegendentry{$V_R = 100$ anni};

\addplot gnuplot[id=pvrii,domain=0.001:0.1] {1-exp( -x*50)};
\addlegendentry{$V_R = 50$ anni};

\addplot gnuplot[id=pvri,domain=0.001:0.1]  {1-exp( -x*10)};
\addlegendentry{$V_R = 10$ anni};

\end{semilogxaxis}
\end{tikzpicture}
\end{document}

Probabilità dell’evento sismico

Il terremoto non è un evento puramente casuale per il semplice fatto che il susseguirsi degli eventi sismici di una stessa regione, narra la storia evolutiva delle strutture di faglia e quindi non sono eventi indipendenti uno dall’altro ne eventi puramente casuali.

Tuttavia la nuova normativa tecnica D.M. 14 gennaio 2008, fa l’assunzione che la probabilità di accadimento del terremoto sia poissoniana, usufruendo della semplicità matematica del modello ma commettendo un errore considerato comunque accettabile.
Infatti in una stessa regione, per intervalli di tempo dell’ordine di qualche migliaia d’anni, è ragionevole supporre che le faglie attive continuino ad evolversi costantemente nel tempo mantenendo immutate le velocità relative ed i meccanismi d’interazione.
Nel lungo periodo invece i mutamenti di placche e microplacche della crosta comportano che le faglie aumentino o diminuiscano la loro pericolosità. Nel futuro ci attenderà un assetto completamente mutato, ma per raggiungerlo i passi sono talmente piccoli che possiamo approssimarli a nessun movimento.

Allora possiamo rispondere alla domanda: qual’è la probabilità che almeno un evento sismico con periodo di ritorno di 475 anni si verifichi nell’intervallo di 50 anni (intervallo in cui una costruzione può dirsi efficiente)?

\displaystyle p_{VR}=1-e^{-50/475}=0.10

La risposta è quindi il 10% (corrisponde allo Stato limite di salvaguardia della vita per il periodo di riferimento di 50 anni), ed è chiamata nel linguaggio della norma probabilità di superamento (o di eccedenza).
Terremoti più intesi avranno un tempo di ritorno più lungo e di conseguenza probabilità più piccole di verificarsi nel periodo di riferimento, ed è appunto questo il fenomeno che misuriamo con la legge delle probabilità di Poisson.

Conclusioni: le norme tecniche e la ricerca

Le nuove normative tecniche (Eurocodici ed NTC 2008) mettono in risalto ancor di più la tendenza non tanto ad essere prestazionali nell’approccio alla sicurezza, ma soprattutto a discendere direttamente ed esclusivamente dalle trattazioni scientifiche dei problemi. In conseguenza è possibile ritrovare l’origine e le motivazioni nascoste delle prescrizioni e ciò rende il processo normativo maggiormente trasparente, chiarendo quali ipotesi sono state assunte ed il loro contesto di validità.

Con l’avanzamento delle conoscenze, le norme tecniche divengono sempre più aderenti alla complessità dei fenomeni e questo esige una sempre maggiore preparazione di base da parte dei progettisti e, poiché la ricerca scientifica è un fatto internazionale, tendono ad essere sempre più somiglianti una con l’altra.

Dunque l’ampliarsi di quelle che sono le capacità di fare, in altri termini l’ampliarsi dell’ingegneria, induce di conseguenza alla specializzazione dei progettisti, a cui è affidato il difficile compito di mantenere l’equilibrio tra profondità ed ampiezza della conoscenza, ed un uniformarsi delle normative che svolgono una vera e propria selezione naturale dei risultati delle ricerche prodotte nel mondo.

La pericolosità sismica nella rete dell’INGV


Scarica l’articolo in formato PDF per la stampa

Database sismologici aperti

Non tutti sanno che l’Istituto Nazionale di Geofisica e Vulcanologia mette a disposizione sul web non solo le informazioni generali sull’origine di terremoti e vulcani in Italia e nel mondo, ma anche i database sismologici storici ed attuali con i dati provenienti direttamente dalla rete dei sismografi.
Questo post vi aiuterà in qualche modo a consultare queste risorse ed a rendervi meglio conto di cosa siano le conseguenze dei fenomeni tettonici in evoluzione da sempre sul nostro pianeta.

Iside

Connessi alla home page dell’INGV trovate nel menù a sinistra la voce Banche Dati che vi apre lo sconfinato mondo dei dati geofisici più diversi.

Quello che ci interessa è per esempio ricercare i terremoti che si sono verificati in Italia nei primi due giorni di febbraio accedendo ad Iside, l’accesso ai dati strumentali della rete di rilevamento (circa 250 stazioni).
Cliccate in alto alla voce Terremoti->Localizzazioni. Si aprirà il form per eseguire l’interrogazione. Inseriamo l’intervallo di date dal 1/02/2011 al 2/02/2011, inseriamo il codice di controllo antibot (consiglio caldamente che vi registriate sul sito anche per sostenere le attività di INGV oltre che per evitare di reinserire ogni volta il codice) e premiamo il pulsante ‘Cerca’.

Il sistema mi restituisce ben 43 eventi sismici mostrati nella mappa sottostante, di cui solo 4 superano la soglia della magnitudo 2. Clicchiamo il pulsante “Mostra mappa” per constatare che tutti questi piccoli sismi, difficilmente rilevati dalla popolazione, sono accaduti sull’appenino centrale.
Tra l’altro la mappa è disponibile anche in formato vettoriale Postscript, in formato testuale CSV (Comma Separated Value), ed in kml il formato gestito da Google Earth.

Earthquakes from 2011/02/01 to 2011/02/03 in Italy

Earthquakes from 2011/02/01 to 2011/02/03 in Italy

Emidius

Nel sito emidius, sempre di INGV, potete invece consultare il database macrosismico che riporta le registrazioni storiche dei terremoti italiani tratte da documenti d’archivio, e che quindi si basano su testimonianze degli effetti prodotti dai terremoti.

Al solito, facciamo click sul link di menù sulla sinistra chiamato “Consultazione per località”, per elencare i terremoti storicamente registrati nella nostra capitale: Roma.
Selezionando la lettera R in alto e la città di Roma nell’elenco alfabetico che di conseguenza compare a sinistra, si vedrà la tabella con i dati delle registrazioni ed il grafico che vi riporto qui sotto:

Rome earthquake history

Rome earthquake history

Il progetto S1

Il progetto S1 è essenzialmente lo studio sulla pericolosità sismica su cui si fonda la nuova normativa tecnica italiana D.M. 14 gennaio 2008. Se volete visualizzare i dati della vostra aerea collegatevi al sito esse1. Cercate il comune digitandone il nome in basso a destra nel campo “Search Municipality”, poi cambiate la scala nel campo soprastante, diciamo 200.000 e fate click su “Change scale/center”. Poi attivate il basso il flag “Show the grid points with the value of:” e date un “Redraw the map” cliccando sul pulsante con la freccia circolare.
Quello che vi appare qui sotto è l’applicazione del procedimento descritto per il comune di Roma.

Seismic hazard for the Rome city

Seismic hazard for the city of Rome

Adesso prendete in alto a destra della pagina lo strumento d’informazione chiamato “Graph on the grid point” (click sul radio bottom) e selezionate un punto di griglia che compare nella mappa (quadratino colorato). Vi appariranno le curve dell’accelerazione sismica PGA con le probabilità di accadimento, per tre diversi valori del percentile (derivati dall’analisi statistica dei modelli adottati (sedici scenari)).

Infine, selezionate, sempre nello stesso menù, lo strumento “Disaggregation graph” e cliccate sul punto di griglia d’interesse. Appare un grafico che mostra per il sito in esame come si distribuisce la pericolosità con la distanza. Se il grafico mostra zone colorate concentrate entro una breve distanza significa che il sito si trova nei pressi di una faglia attiva, se invece vi sono aeree colorate più ampie, vorrà dire che la pericolosità deriva da regioni sismogenetiche lontane.

INGVterremoti

L’Istituto INGV ha perfino un canale YuoTube dove brevi filmati illustrano la genesi di terremoti e Tsunami ed le ricerche più recenti, come quella del video linkato qui sotto, relativo al sisma dell’Aquila, dove in tempi molto brevi utilizzando dati dai satelliti dei sistemi GPS, non solo si è riusciti a stimare lo spostamento del terreno causato dal sisma dell’Aquila (che si è abbassato di 20 centimetri in accordo al tipo di faglia di tipo normale) ma, soprattutto, si è riusciti a mettere a punto un modello confermato sperimentalmente della faglia di Paganica stessa.

Cosa significa tutto ciò?

La comunicazione scientifica via web è uno strumento importante almeno da tre punti di vista:
1- si tratta di informazioni utili immediatamente consultabili dagli utenti (studenti, ricercatori, amministratori, progettisti, incaricati di protezione civile e semplici cittadini);
2- è un incentivazione al lavoro scientifico stesso affinché non manchino i fondi necessari e non si chiudano le possibilità di attivare nuovi progetti di ricerca;
3- è la partecipazione e collaborazione tra sorgenti del sapere e comunità che sortisce effetti senza dubbio importanti sulle scelte.

Se si parla di rischio sismico, abbiamo gli strumenti per valutare la pericolosità ed intervenire opportunamente in prevenzione sul patrimonio edilizio. Solo in questo modo il paese si svilupperà nel verso giusto avvantaggiandosi opportunamente delle conoscenze scientifiche e tecnologiche invece di ignorarne l’esistenza.

Pensare al pianeta in termini della sua struttura tettonica complessiva è una dimensione nuova che convive con la quotidianità fatta dei problemi dello studio, del lavoro e della famiglia. Forse ci stiamo avvicinando ad essere un umanità mutata che vede il pianeta non più come una sconfinata distesa oltre i dintorni in cui ognuno vive, ma come un luogo dove si è tutto e parte, dove l’orizzonte si sposta fuori da noi stessi per abbracciare un intero pianeta.

Verticalizzare nodi in Nolian


Scarica l’articolo nel formato PDF per la stampa

Nolian scripting series, episode 3

Verticalizzare! Quando?

Di solito non modello le fondazioni a platea direttamente in InMod perché preferisco costruire la mesh per conto mio direttamente in Nolian, mi è capitato quindi, di importare da un file binario, i dati di una platea di una struttura molto simile rispetto in quella in lavorazione (in realtà la stessa struttura modificata in varie versioni, sigh!).

L’operazione è riuscita perfettamente ma alcuni nodi al piede dei pilastri, risultavano collegati alla mesh con un rigel non perfettamente verticale. Nolian ha aggiustato le posizioni dei nodi che capitavano vicini a nodi esistenti, di sua spontanea volontà.

Per rendere i rigel di nuovo verticali, occorreva risistemare le coordinate dei nodi corrispondenti della mesh, ma ecco che una manciata di righe di codice Lua può abbreviarci il lavoro.

La nuova funzione axy()

Ho pensato ad una funzione chiamata axy(), ovvero assegna x ed y, con il seguente funzionamento: seleziono il nodo al piede del pilastro e poi quello sulla platea, dopo di che la funzione esce fatta la modifica.

Ecco il codice da gestire secondo le indicazioni contenute nel primo episodio (ricordo che dopo la configurazione sarà disponibile in console il comando axy() ):

function axy(x,y)
     if not x or not y then
          print("Sel node con la posizione planimetrica desiderata...")
          _sel.doselect( true )
          local nodobase = _sel.nodes()
          _sel.clear()
          if #nodobase > 1 then
             print ("Selezionati più nodi, riprova.")
             return
          else
	     local p = _n.get(nodobase[1])
	     x = p.x
             y = p.y
          end
     end
     
     print("Selezionare nodo da cambiare con x=" .. x .." e y="..y .." ...")
   
     _sel.doselect( true )
     local nodo = _sel.nodes()
     _sel.clear()
     
     if #nodo > 1 then
         print ("Selezionati più nodi, riprova.")
         return
     end
     
     local pointAux = {}
     pointAux.x = x
     pointAux.y = y
     nodeIndex = nodo[1]
     
     _n.set(nodeIndex, pointAux)
end

Commento al codice

La prima parte del codice della funzione non fa altro che decidere se le coordinate planimetriche sono o no state specificate dall’utente. Se no, aspetta che si selezioni un nodo prelevandone poi i valori utili delle coordinate con la funzione di libreria _n.get() che, come recita il manuale stringatissimo di Softing (più stringato di così…), restituisce il punto relativo all’indice del nodo specificato. Punto che non è altro che una tabella Lua con chiavi x, y, e z.
Riassumendo, la funzione _sel.nodes() restituisce una tabella con gli indici dei nodi selezionati, che in realtà in questo caso sono solo uno, appunto di posizione 1. L’indice dell’array viene passato alla _n.get() per il prelievo dei valori.

La seconda parte invece, effettua l’assegnazione ad un secondo nodo selezionato: si crea infatti un punto detto pointAux con le nuove coordinate e lo si passa alla funzione _n.set() assieme all’indice del nodo selezionato. Più difficile a dirsi che a farsi!

Grazie ed alla prossima!

Assegnare le coordinate x y o z ai nodi in Nolian


Nolian scripting series, episode 2

Prima che finisca questo video che spesso mi accompagna nel pensare a mio padre, e prima che venga Natale, vi posto una versione evoluta del codice della puntata precedente alias episode 1.

Un paio di modifiche…

Per prima cosa ho ampliato la funzione al caso in cui l’utente non specifichi la coordinata da applicare, desumendola da un nodo campione selezionato dall’utente stesso.

Possiamo quindi lanciare il comando az(), cliccare su un nodo che si trova già alla quota desiderata (coordinata z), e selezionare i nodi destinazione. Oppure possiamo specificare il valore di zeta, sempre tra parentesi tonde, e applicare la modifica selezionando direttamente i nodi sul modello.

La seconda modifica è a livello implementativo per la generalizzazione della funzionalità: ho scritto una metafunzione che ho chiamato assegnaCoordNodi che accetta come primo argomento una stringa relativa al nome dell’asse coordinato “x”, “y” o “z”. In questo modo è immediato scrivere le funzioni utente ax(), ay(), ed az(), tutte con la stessa sintassi e con lo stesso comportamento.

Adesso potete assegnare ad un qualsiasi gruppo di nodi del modello in Nolian una coordinata x, y o z. Ecco il codice:

-- libreria delle funzioni personali in Nolian
--
-- Copyright (c) 2010 Roberto Giacomelli
-- email: giaconet dot mailbox at gmail dot com
--
-- 2010/12/15
-- released under the term of https://robitex.wordpress.com/legalese

-- meta function
-- Assegna ai nodi selezionati una stessa coordinata
function assegnaCoordNodi( coord , val )
   if not coord then
       print ("Errore di libreria: asse coordinato non specificato.")
       return
   elseif not(coord ~= "x" or  coord ~= "y" or coord ~= "z") then
       print ("Errore di libreria: asse "..coord .." non riconosciuto.")
       print("Deve essere o 'x' o 'y' o 'z'")
       return
   end
   
   if not val then
      print("Selezionare il nodo con la "..coord.." desiderata...")
      _sel.doselect( true )
      local nodobase = _sel.nodes()
      _sel.clear()
      if #nodobase > 1 then
         print ("Selezionati più nodi, riprova.")
         return
      else
         val = _n.get(nodobase[1])[coord]
      end
   end
   
   print("Selezionare nodi da cambiare con " .. coord .."="..val .." ...")
   
   _sel.doselect( true )
   nodi = _sel.nodes()
   _sel.clear()
   
   local pointAux = {}
   for i, nodeIndex in ipairs( nodi ) do
       pointAux[coord] = val
       _n.set(nodeIndex, pointAux)
   end
   
   print( #nodi .." nodi modificati con coord. " .. coord .. "=" ..val)
end


function ax(x)
   assegnaCoordNodi("x", x)
end

function ay(y)
   assegnaCoordNodi("y", y)
end

function az(z)
   assegnaCoordNodi("z", z)
end

Un uso con variabili

Per come è costruita Lua, nella console (nella finestra di comando dello scripting interno di Nolian che appare con CTRL + T), abbiamo a disposizione un ambiente interattivo completo. Ciò significa che possiamo settare variabili ed utilizzare espressioni numeriche come argomento delle funzioni ax, ay, az. Per esempio questa sessione in console è valida:

> z1 = 145.5
> z2 = 258.5
> az ( (z1+z2)/2 )
> az (2/3*(z1+z2))

Le variabili rimangono disponibili fino all’uscita da Nolian. Possiamo perfino pre-caricare valori costanti inserendoli nel file mylib.lua, file dove abbiamo deciso di custodire i nostri script. Sempre più fantastico vero?

So,
Dedicated to my father.

Assegnare coordinate ai nodi in Nolian


Nolian scripting series, episode 1

Scarica l’articolo in PDF per la stampa

Benvenuti,
da qualche versione a questa parte Nolian permette l’esecuzione di comandi personalizzati. Questa funzionalità è chiamata dalla Softing scripting interno.
Questo post è il primo di una spero lunga e proficua serie dedicata a potenziare le nostre capacità di modellazione agli elementi finiti in Nolian. Lasciate un commento per qualsiasi cosa.

Il primo problema che affrontiamo è questo: assegnare una stessa coordinata ad un gruppo di nodi. Ci dilungheremo solo per questa volta sulle questioni pratiche per poi risolvere brillantemente ciò che con le funzioni standard risulta noioso.

Questioni implementative

Con il roboante titolo di questo paragrafo, intendo spiegare come far eseguire un nostro comando con riferimento alla versione EWS32 di Nolian.
La prima e piacevole cosa da sapere è che il motore di scripting interno funziona con Lua. La bellissima notizia è motivata dal fatto che Lua è un linguaggio elegante e potente, e con esso è possibile non solo gestire ogni aspetto del nostro modello ma anche ideare comandi con una sintassi flessibile, in puro stile hacker.

The Nolian scripting Console

The Nolian scripting Console

1 – Avviamo dunque una sessione di Nolian e premiamo la combinazione di tasti CTRL + T per avviare la console di scripting.
La console offre una riga di comando ed un pannello testuale per visualizzare l’output (vedi screenshot). D’ora in poi quando diremo console ci riferiremo ad essa.

2 – Operazione matematica
Al prompt della console che non è altro che un ambiente di comando Lua, per prima cosa eseguiamo un calcolo digitando:

> 2*math.pi*100

Il risultato è prontamente stampato nella finestra di output.

3 – Creazione di una prima funzione
Metti che non ci ricordiamo l’area di una barra d’acciaio, allora al prompt digitiamo riga dopo riga il seguente codice:

> function area( d )
>> return math.pi * d^2 / 4
>> end
> area (1.4)
> area(1.2)
> area(1.6)

Da questo momento fino a che non viene definitivamente chiusa la sessione di Nolian, la funzione area() sarà a disposizione.

Il nostro primo vero script

Creiamo una nuova directory nella cartella d’installazione di Nolian chiamata lua, dove sistemeremo i file di testo dei nostri script, quindi aprite un editor (vi consiglio l’ottimo e gratuito SciTE), scrivete il codice print(“Ciao, questo è il mio primo script!”) e salvate il file con il nome primo.lua nella directory appena creata.
Eseguite lo script dando in console il comando dofile(“lua/primo.lua”).

Caricando in questo modo un file, tutte le funzioni in esso contenute vengono compilate e caricate nell’ambiente di scripting interno. Useremo questa tecnica per scrivere un file di nome mylib.lua, nella solita directory lua, caricando il quale avremo a disposizione le nostre funzioni personalizzate.

Ai nodi un ordinata

La funzione per assegnare un dato valore per la coordinata z dei nodi selezionati, si chiamerà az (assegna zeta). La selezione di un gruppo di nodi si implementa con la funzione _sel.doselect() memorizzata nella tabella _sel.
Poi dovremo gestire i nodi selezionati tramite un array contenente gli indici degli stessi:

_sel.doselect( true )
nodi = _sel.nodes()
_sel.clear()

Per ogni nodo dovremo poi modificare la coordinata zeta con la funzione _n.set(nodeIndex, pointAux) che si aspetta come primo argomento l’indice del nodo e come secondo argomento un punto, ovvero una tabella (l’unica struttura dati messa a disposizione da Lua), contenente la chiave z settata al valore voluto.

Queste funzioni, che cominciano un po’ discutibilmente con il carattere di trattino basso, sono quelle che ci permettono di interagire con il modello attualmente caricato nella sessione di Nolian.
Ecco il codice completo della funzione:

-- libreria delle funzioni personali in Nolian
--
-- Copyright (c) 2010 Roberto Giacomelli
-- email: giaconet dot mailbox at gmail dot com
--
-- 2010/12/15
-- released under the term of https://robitex.wordpress.com/legalese

-- Assegna ai nodi selezionati una stessa coordinata zeta
function az( z )
   if not z then
      print"Coordinata non specificata!"
      return
   end

   _sel.doselect( true )
   nodi = _sel.nodes()
   _sel.clear()
   
   local pointAux = {}
   for i, nodeIndex in ipairs( nodi ) do
       pointAux.z = z
       _n.set(nodeIndex, pointAux)
   end
end

Il suo uso è semplice: carichiamo la funzione memorizzata nel file individuato precedentemente, con dofile(“lua/mylib.lua”) in console. Poi diamo il comando seguente ed eseguiamo la selezione. I nodi prenderanno la quota specificata.

> az( 1203 )

Conclusioni

Uno script Lua non è altro che un file di testo. Caricando nostre librerie, possiamo accedere a funzioni che abbreviano senza errori e senza fatica l’inserimento dei dati del modello in Nolian.

Bibliografia

Acquistate il PiL e aiuterete lo sviluppo di Lua!!! Pure utile è la guida in linea di Nolian alla sezione dedicata.
The End.

Un quadro strutturale


Come volevasi dimostrare

Un’idea è sempre un’idea.
Sto osservando lo schermo che propone viste tridimensionali di una struttura a telaio i cui elementi hanno colori casuali, a volte scelti in automatico senza un criterio dal software di modellazione durante le operazioni di modifica.

Osservo lo schermo e, ad un tratto, mi sembra di vedere una composizione. Eccola (intanto che ammirate vi saluto, ciao):

Quadro strutturale n. 1

Quadro strutturale n. 1

%d blogger hanno fatto clic su Mi Piace per questo: