Robitex's Blog

Ideas in the web

Spettri sismici Parte 1


Spettri sismici

Seismic Spectrum

Seismic Spectrum

La nuova normativa D.M. 14/01/2008 “Norme Tecniche per le Costruzioni”, in breve NTC 2008, entrata in vigore a metà del 2009 poco dopo il sisma in Abruzzo, ha introdotto una nuova mappatura del rischio sismico basata sul progetto S1 dell’INGV – Istituto Nazionale di Geofisica e Vulcanologia.

La pericolosità sismica dipende ora non più dai confini amministrativi dei comuni, ma dal punto d’interesse stesso, individuato in coordinate geografiche nel datum ED50.

Se anche a voi piace determinare gli spettri per proprio conto vi propongo un percorso tra gli strumenti del mondo (La)TeX, in particolare con Asymptote, con cui ottenere il grafico degli spettri sismici in formato vettoriale, pronto da inserire nella relazione tecnica del progetto strutturale.

Asymptote e gli spettri sismici

Oltre che ad imparare la programmazione con Asymptote (è consigliabile consultare il manuale di Asymptote presente nella vostra installazione o reperibile in rete), costruiremo gli spettri passo passo leggendo direttamente il paragrafo 3.2.3 della NTC 2008.

Questo post introduce l’argomento concentrandosi solo sullo spettro elastico di progetto allo stato limite di salvaguardia della vita per la sola componente orizzontale, e per un terreno di pianura di tipo B. Nei prossimi vedremo come il linguaggio di Asymptote possa implementare una pratica e completa interfaccia ai dati ed alle elaborazioni.

Installazione di Asymptote

Se avete una distribuzione LaTeX recente già installata sul vostro PC, qualsiasi sia il sistema operativo, tutto il software necessario è già pronto per l’uso, altrimenti potete rivolgervi indifferentemente a TeX Live 2009 (per Linux, Mac OS X, Windows, ecc) o MiKTeX 2.8 (per Windows), oppure potete installare esclusivamente Asymptote scaricandolo da questo link ed inserire nella relazione il grafico in uno dei nel formati grafici per esempio gif o png.

Calcolare lo spettro

Cominciamo!!! Avviate un editor di testo (Blocco Note, SciTE, Emacs, Gedit, ecc ecc), e scriviamo il seguente codice per instanziare le prime variabili:

// loading modulo graph
import graph;

// accelerazione di gravità (valore standard) in m/s2
real g = 9.80665;

// coefficiente di amplificazione topografica
real st = 1.0;

// fattore di struttura (spettri elastici)
real q = 1.0;

// eta per spettri di progetto
real eta = 1/q;

La sintassi è simile a Java, con le dichiarazione di tipo (real per le variabili numeriche in virgola mobile), il punto e virgola finale e le righe di commento che iniziano con il doppio slash.

Vediamo ora la prima funzione che restituisce il valore del coefficiente stratigrafico per un suolo di tipo B dalla tabella 3.2.V della NTC:

\displaystyle 1{,}00 \leq 1{,}40 - 0{,}40 F_0 \frac{a_g}{g}\leq 1{,}20

e la sua implementazione in Asymptote:

// funzione del coefficiente di amplificazione
// stratigrafica per il suolo tipo B
real ss( real agsug, real f0 ) {
	real tmp = 1.40 - 0.40 * f0 * agsug;
	if ( tmp < 1.00 ) {
		tmp = 1.0;
	}

	if ( tmp > 1.20 ) {
		tmp = 1.20;
	}
	return tmp;
}

Scriviamo adesso il codice per determinare i periodi caratteristici dello spettro a partire dai parametri fondamentali del sito a_g/g, F_0, T_C^*, per un periodo di ritorno corrispondente allo SLV, e per un sito di esempio:

// parametri fondamentali del sito
// agrel=ag/g, f0=F0, tcstar=Tc*
//
real agrel  = 0.1946;
real f0     = 2.423;
real tcstar = 0.28;

real tc = 1.10 * tcstar^(-0.20) * tcstar;
real tb = tc / 3 ;
real td = 4.0 * agrel + 1.60;

L’espressione dei quattro tratti dello spettro sono le seguenti (3.2.3.2.1 NTC 2008):

\displaystyle S_1 = a_g S \eta F_0 \left(\frac{T}{T_B}+\frac{1}{\eta F_0}\left(1-\frac{1}{T_B}\right)\right)

\displaystyle S_2 = a_g S \eta F_0

\displaystyle S_3 = a_g S \eta F_0\frac{T_c}{T}

\displaystyle S_4 = a_g S \eta F_0 \frac{T_cT_D}{T^2}

assegnamo quindi altrettante funzioni che restituiscono il valore dello spettro rapportato all’accelerazione di gravità:

// costante moltiplicativa
real s0 = agrel * ss(agrel, f0) * st * f0;

// primo tratto dello spettro
real s1(real T) {
  return  s0 * ((T/tb) + 1/(eta*f0) * (1 - (T/tb)));
}

// secondo tratto
real s2(real T) {
   return s0;
}

// terzo tratto
real s3(real T) {
   return s0 * tc / T;
}

// quarto tratto
real s4(real T) {
   return s0 * tc * td / T^2;
}

Graficare lo spettro

Tutto è pronto per disegnare il grafico. Basta scrivere una funzione chiamata appunto plot, che restituisce un oggetto di tipo guide, ovvero una curva a sua volta restituita dalla funzione di libreria graph. Il simbolo & è l’operatore di concatenazione delle singole curve, mentre il tratto orizzontale dello spettro è stato ottenuto tracciando direttamente un segmento tra il punto (tb, s0) ed il punto (tc, s0), utilizzando il simbolo -- secondo una sintassi molto comune tra i pacchetti grafici in LaTeX. La funzione graph accetta tre argomenti: il primo è la funzione che determina la curva mentre il secondo ed il terzo, delimitano l’intervallo di tracciamento sull’asse x.
La nostra funzione plot, accetta un numero inteso come limite complessivo del grafico sull’asse x, in modo da poter controllare la “coda”:

guide plot(real xmax){
	return 	graph(s1, 0, tb) &
		(tb, s0) -- (tc, s0) &
		graph(s3, tc, td)    &
		graph(s4, td, xmax);
}

Prepariamo l’area del grafico con l’ausilio di una libreria apposita integrata in Asymptote chiamata graph (modulo spiegato in dettaglio nel manuale di Asymptote):

// dimensione del grafico
size(16cm, 10cm, IgnoreAspect);

xlimits( 0 , 4.32);
ylimits( 0 , 0.70);

// etichettatura assi e caratterizzazione griglia
xaxis("$T$ (s)",
	BottomTop(),
	LeftTicks( Label(fontsize(8)),
		ptick=lightgray,
		pTick=gray,
		extend = true
	)
		);
yaxis("$S_{e}/g$" ,
	LeftRight(),
	RightTicks( Label(fontsize(8)),
		pTick=lightgray,
		extend = true
		)
	);

Plottiamo lo spettro passando alla funzione draw la nostra curva ed aggiungiamo una legenda:

// plottaggio spettro
draw(plot(4.2) , blue + 1.80 , "SLV");

// aggiungi legenda
add(legend(), (2.8 , 0.6) , UnFill );

Da notare come il linguaggio di Asymptote gestisca le proprietà di spessore e colore del tratto, semplicemente sommando il nome del colore con il valore dello spessore. Forse non sarà così elegante e qualche programmatore Java storcerà il naso, ma è senza dubbio comodo.
Tutte le funzioni sono spiegate nel manuale di Asymptote, in particolare la funzione add() e la funzione legend() utilizzate nell’ultima parte del codice.

Confezioniamo il tutto

Se avete seguito fin qui il codice digitato nel vostro editor dovrebbe essere questo:

// loading modulo graph
import graph;

// accelerazione di gravità (valore standard) in m/s2
real g = 9.80665;

// coefficiente di amplificazione topografica
real st = 1.0;

// fattore di struttura (spettri elastici)
real q = 1.0;

// eta per spettri di progetto
real eta = 1/q;

// funzione del coefficiente di amplificazione
// stratigrafica per il suolo tipo B
real ss( real agsug, real f0 ) {
	real tmp = 1.40 - 0.40 * f0 * agsug;
	if ( tmp < 1.00 ) {
		tmp = 1.0;
	}

	if ( tmp > 1.20 ) {
		tmp = 1.20;
	}
	return tmp;
}

//
// parametri fondamentali del sito
// agrel=ag/g, f0=F0, tcstar=Tc*
//
real agrel  = 0.1946;
real f0     = 2.423;
real tcstar = 0.28;

real tc = 1.10 * tcstar^(-0.20) * tcstar;
real tb = tc / 3 ;
real td = 4.0 * agrel + 1.60;

// costante moltiplicativa
real s0 = agrel * ss(agrel, f0) * st * f0;

// primo tratto dello spettro
real s1(real T) {
  return  s0 * ((T/tb) + 1/(eta*f0) * (1 - (T/tb)));
}

// secondo tratto
real s2(real T) {
   return s0;
}

// terzo tratto
real s3(real T) {
   return s0 * tc / T;
}

// quarto tratto
real s4(real T) {
   return s0 * tc * td / T^2;
}

guide plot(real xmax){
	return 	graph(s1, 0, tb)     &
		(tb, s0) -- (tc, s0) &
		graph(s3, tc, td)    &
		graph(s4, td, xmax);
}

// dimensione del grafico
size(16cm, 10cm, IgnoreAspect);

xlimits( 0 , 4.32);
ylimits( 0 , 0.70);

// etichettatura assi e caratterizzazione griglia
xaxis("$T$ (s)",
	BottomTop(),
	LeftTicks( Label(fontsize(8)),
		ptick=lightgray,
		pTick=gray,
		extend = true
	)
		);
yaxis("$S_{e}/g$" ,
	LeftRight(),
	RightTicks( Label(fontsize(8)),
		pTick=lightgray,
		extend = true
		)
	);

// plottaggio spettro
draw(plot(4.2) , blue + 1.80 , "SLV");

// aggiungi legenda
add(legend(), (2.8 , 0.6) , UnFill );

Bene. Salvato il file con l’estensione *.asy per esempio con il nome spettro.asy, basta aprire una finestra di comando (in gergo *nix il Terminale) e scrivere il comando di compilazione (spostatevi con il comando cd nella directory dove risiede il file):

asy -f pdf spettro.asy

Se non avviene automaticamente, aprite il file pdf di output e controllate il risultato. Confrontatelo anche con questo compilato da me.

Per oggi chiudiamo qui. La prossima volta ci occuperemo di generalizzare per le altre situazioni il codice con il paradigma di programmazione object oriented, concettualizzando lo spettro in un oggetto.
Alla prossima.

6 risposte a “Spettri sismici Parte 1

  1. Pingback:Spettri sismici – Parte 2 « Robitex's Blog

  2. Stefano 23/10/2010 alle 13:01

    Salve e grazie per l’articolo. So di essere un po’ in ritardo nel commento, ma ho da poco installato l’ultima versione di TeXworks disponibile e stavo cercando di capirci qualcosa.

    Leggendo questo articolo si dice che se si ha una delle ultime distribuzione Latex non c’è bisogno di scaricare Asymtote separatamente.

    Quello che non mi è chiaro è se scrivendo il codice direttamente in TeXworks sia possibile ottenere un risultato del genere o se in qualche modo c’è da passare comunque per Asymtote (quando leggo nell’articolo: “e la sua implementazione in Asymptote:”).

    Grazie,
    Stefano

    • robitex 23/10/2010 alle 23:44

      Già, Asymptote è entrato non da molto nei repository di CTAN (l’archivio internet che riceve il materiale e lo consegna agli utenti), quindi è possibile gestirlo direttamente con i programmi con cui l’utente gestisce la propria installazione locale. In TeX Live, tale programma è costituito da tlmgr (TeX Live Manager), con cui si può installare, aggiornare o disistallare Asymptote.

      Esiste anche un pacchetto LaTeX (asymptote.sty) con cui puoi eseguire codice Asymptote ed inserirne il risultato direttamente da un sorgente (compilando due volte).

      Mi rendo conto che le cose sono complesse, ciò è semplicemente dovuto alla vastità del software disponibile nel mondo TeX. Io stesso nel post, non ho l’obiettivo di spiegare i dettagli delle installazioni e dei modi di compilazione, ma solo che è possibile esprimere un oggetto come uno spettro sismico con un linguaggio. Sto infatti mettendo a punto un nuovo modo più evoluto di costruire e concepire concettualmente lo spettro sismico, utilizzando al meglio le caratteristiche sottostanti del linguaggio stesso di Asymptote. Sarà possibile costruire spettri elastici e di progetto, insiemi di curve per diversi stali limite, ecc, sempre naturalmente con la qualità vettoriale di un grafico, che rimane tale quando viene inserito in un documento con LaTeX (con \includegraphics o con codice asy).

      Grazie per il tuo interessamento.

  3. Stefano 24/10/2010 alle 17:09

    Grazie a te per la risposta, è stato tutto molto chiaro, era quello che avevo bisogno di sapere.

    Credo di dover cominciare un po’ più dalle basi, nonostante abbiamo (a grandi linee) capito come si si debba comportare in un caso del genere.

    Il fatto di potersi costruire autonomamente un grafico vettoriale del genere è una cosa niente male, anche perchè credo che, da qui poi si possa spaziare molto (come dicevi).

    Sono uno studente universitario di ingegneria civile e fino ad ora abbiamo sempre utilizzato fogli excel “preformattati” per studiare gli spettri sismici, solo che sarebbe piaciuto imparare “qualcosa in più”.

    Grazie ancora, e resterò sintonizzato per eventuali sviluppi!

    • robitex 25/10/2010 alle 08:28

      Se proprio vuoi il mio parere, a questo punto non ti rimane che imparare LaTeX e avrai molte soddisfazioni compresa quella di inserire disegni CAD (quindi vettoriali) perfettamente in scala nei propri documenti.

      Alla prossima!

  4. Stefano 25/10/2010 alle 13:32

    Grazie del consiglio, credo in effetti che sia il caso di pensarci veramente.

    Alla prossima!

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: