Robitex's Blog

Ideas in the web

Archivi Mensili: aprile 2010

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.

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