Parte 17Momenti con data curvaturaAvendo definito la curvatura come:
epsc/(ymax-yn) oppure
(epsc-epsa)/(ymax-yamin)abbiamo visto come si è dovuto fare un certo lavoro 'preparatorio', ma tutto sommato non sconvolgente, per poter determinare il valore di curvatura che la sezione assume in corrispondenza dello snervamento e della rottura.
Per precisione 'didattica' ricordo che le curvature in tali punti dipendono, oltre che da geometria della sezione, dalle armature e dalle caratteristiche dei materiali, anche e soprattutto dal valore di sforzo normale della sezione.
E' intuibile infatti che maggiore è lo sforzo normale di compressione sulla sezione, minore diventa lo 'spazio' che separa la condizione di rottura da quella di snervamento, e più prossime tra loro diventano le rispettive curvature.
Se la duttilità sezionale è misurata dal rapporto tra curvatura a rottura e curvatura a snervamento, esso diventa via via più piccolo convergendo ad 1.0 per valori elevati di sforzo normale.
In questa parte si vedrà come calcolare, per dato sforzo normale, il momento flettente 'espresso' dalla sezione ad una data curvatura.
Ovvero si fisserà una curvatura compresa tra quella di snervamento e quella di rottura e si calcolerà il momento flettente corrispondente (i due momenti flettenti a dire il vero, poiché sempre nel caso generico ci poniamo).
Anche in questo caso Afazio sarà contento. Poiché basta un minimo di comprensione del problema per poter riutilizzare il solito ed ormai trito codice già scritto ed ampiamente sperimentato.
Guardiamo il seguente diagramma:
In pratica la barra inclinata in rosso che ho tracciato nel solito diagramma che indica le possibili configurazioni deformative della sezione a rottura, di fatto 'segna' una possibile curvatura (inclinazione della sezione sotto sollecitazione). Invece di seguire il solito 'percorso', ovvero massima deformazione nell'acciaio teso (rotazione attorno al punto A) o massima deformazione nel cls compresso (rotazione attorno al punto B), se decidiamo di non modificare l'inclinazione della barretta segnata nel grafico, di fatto ricercheremo una configurazione deformata della sezione sotto dato sforzo normale, per curvatura 'fissa'.
Ovvero definita la variabile
curv (data dalle espressioni riportate), le deformazioni possibili ai lembi estremi della sezione potranno essere solamente:
epsc=curv*(ymax-yn)
epsa=-curv*(yn-yamin)(
ymax massima ordinata della sezione,
yamin minima ordinata delle barre di armatura,
yn la posizione dell'asse neutro nel sistema di riferimento la vera 'variabile' del problema).
che altro non sono le formule inverse viste sopra.
Se volessimo avere una visione 'geometrica' della situazione queste formule indicano che le deformazioni da ricercare nei lembi inferiore e superiore si ottengono semplicemente traslando la barra rossa tracciata nella figura superiore, senza farla ruotare (come dalle frecce gialle che ho disegnato). Traslazione che comporta un aumento o diminuzione della parte compressa della sezione (ovvero di posizione dell'asse neutro) alla ricerca di quella configurazione che equilibri lo sforzo normale Nd agente nella sezione.
In pratica si riconosce che il procedimento finora seguito per ricavare momenti di rottura e di snervamento potrà continuare ad essere utilizzato, con le solite iterazioni alla ricerca dell'asse neutro, con il solito calcolo dello sforzo normale che le parti compresse e tese sono in grado di esplicare, ma con un differente 'metodo' di determinazione delle massime deformazioni della sezione, lasciando inalterata tutta la costruzione già fatta circa la determinazione corretta dell'asse neutro, e di conseguenza dei momenti, stavolta non di rottura o snervamento, ma per data curvatura della sezione.
In questa parte mi limiterò a riscrivere la sola funzione
determina_asse_neutro, nella prossima puntata invece vedrò di sviluppare una funzione di 'più alto livello' che utilizzerà proprio quest'ultima per i propri fini.
Aggiungo intanto una macro alle due già definite nella parte 15:
#define ROTT 0
#define SNERV 1
#define CURV 2
Quindi ridefinisco il prototipo di
determina_asse_neutro aggiungendo un ulteriore parametro, ovvero la curvatura curv per cui si vuol determinare l'asse neutro e relativi momenti flettenti associati:
struct risultante_n_finale determina_asse_neutro(struct poligono_sezione *,struct armature_sezione,float,int,float);
Prima del corpo di questa funzione vera e proprio devo definire una altra funzione che mi consente di calcolare correttamente le deformazioni nella sezione per data curvatura (con prototipo e quindi corpo della funzione):
struct deform_sezione calcola_deform_curv(float,float,float,float);
struct deform_sezione calcola_deform_curv(float ymax,float yamin,float yn,float curv)
{
struct deform_sezione def;
def.epsa=curv*(ymax-yn);
def.epsb=-curv*(yn-yamin);
return(def);
}
Potete vedere come si tratta di funzioncina stupida stupida, poiché ho semplicemente implementato le due formule sopra viste, assegnando il risultato ai membri della struttura
struct deform_sezione (ricordo che
epsa è la deformazione nella parte alta della sezione – lembo compresso,
epsb la deformazione della parte bassa della sezione – armatura in trazione, e che
epsb essendo di trazione è negativa per definizione). Non ho volutamente introdotto alcun controllo sulla entità di tali deformazioni, poiché intendo passare alla funzione curvature comprese tra quelle di snervamento e quelle di rottura.
Infine la funzione vera e propria
determina_asse_neutro, eccola qui:
struct risultante_n_finale determina_asse_neutro(struct poligono_sezione *polic,struct armature_sezione armc,float Nd,int dominio,float curv)
{
int register k,np;
int npm;
float ymax=-1000000.0,yamin=+1000000.0,ntot1,ntot;
double yn2,yn1,yn,delta=10.0;
struct risultante_n_finale nfin;
struct deform_sezione deform;
struct risultante_n nc,nt;
/* Per prima cosa determina ymax della sezione */
for (np=0;np<=NMAXPOLI-1;np++)
{
for (k=0;k<=polic[np].numv-1;k++)
{
if (polic[np].y[k]>ymax) { ymax=polic[np].y[k]; npm=np; }
}
}
/* Poi determina yamin tra tutte le armature */
for (k=0;k<=armc.numarm-1;k++)
{
if (armc.y[k]<yamin && armc.cong[k]==0) yamin=armc.y[k];
}
/* Quindi definisce un primo posizionamento dell'asse neutro */
yn=yamin+0.8*(ymax-yamin);
/* Inizia il ciclo iterativo alla ricerca della effettiva posizione dell'asse neutro */
/* procede con un ciclo a passo variabile, diminuendo il passo di scansione di ricerca */
/* della posizione dell'asse neutro ogni volta che la differenza tra ncompr ed ntraz cambia di segno */
do
{
/* Calcola le deformazioni ultime/snervamento della sezione */
if (dominio==ULT) deform=calcola_deform_ultime(polic,ymax,npm,yamin,yn);
if (dominio==SNERV) deform=calcola_deform_snerv(polic,ymax,npm,yamin,yn);
if (dominio==CURV) deform=calcola_deform_curv(ymax,yamin,yn,curv);
/* Calcola lo sforzo normale nella parte compressa della sezione */
nc=risult_compr(polic,armc,ymax,yamin,yn,deform);
/* Calcola lo sforzo normale della parte tesa della sezione */
nt=risult_traz(polic,armc,ymax,yamin,yn,deform);
/* Totale sforzo normale sulla sezione da confrontare con Nd */
ntot=nc.n+nt.n;
if (delta*(Nd-ntot)>0.0 && fabs(Nd-ntot)>1.0) { delta=-delta/5; yn+=delta; continue; }
if (fabs(Nd-ntot)>1.0) yn+=delta;
}
while (fabs(Nd-ntot)>1.0 && fabs(delta)>1e-6);
/* Copia nella struttura dati i risultati definitivi con il posizionamento ultimo dell'asse neutro */
nfin.ncf.n=nc.n; nfin.ncf.x=nc.x; nfin.ncf.y=nc.y;
nfin.ntf.n=nt.n; nfin.ntf.x=nt.x; nfin.ntf.y=nt.y;
nfin.yn=yn;
nfin.epsc=deform.epsa;
nfin.epss=deform.epsb;
return (nfin);
}
Rispetto alle altre volte la variabile
dominio potrà avere valori
ULT,
SNERV, e adesso anche
CURV. In funzione di questi 'indici' la funzione diventa 'tutto fare'. Può determinare l'asse neutro in condizioni di rottura, o di snervamento, o per dato valore della curvatura. Dal valore di asse neutro la funzione chiamante è poi in grado di determinare i momenti flettenti associati (di rottura, di snervamento, per data curvatura).
Spendo qualche parola in più sulle macro che ho definito. In effetti
ULT,
SNERV e
CURV, non sono altro che i numeri 0,1 e 2. Avrei potuto scrivere tranquillamente nel listato:
if (dominio==0) deform=calcola_deform_ultime(polic,ymax,npm,yamin,yn);
if (dominio==1) deform=calcola_deform_snerv(polic,ymax,npm,yamin,yn);
if (dominio==2) deform=calcola_deform_curv(ymax,yamin,yn,curv);
Ottenendo esattamente gli stessi esiti nelle elaborazioni. In effetti però chi volesse domani rivedere questo pezzetto di codice dovrebbe capire cosa fa effettivamente la funzione se la variabile dominio è uguale a 0, ad 1, a 2. E' facile in questo caso capirlo dalla struttura del listato e dalle funzioni richiamate. Ma possono esserci casi in cui questo non è così evidente. Avere quindi la possibilità di ribattezzare questi indici numerici (non sono nemmeno delle variabili) con un nome 'evocativo' migliora la leggibilità del listati.
I primi programmatori in C (o forse in linguaggi più antichi che prevedevano questa possibilità) hanno pensato bene di rendere ancora più evidente questi indici battezzandoli con nomi, non soltanto 'evocativi', ma anche scritti in maiuscolo (da qui il nome MACRO ad essi assegnato), in modo che spiccassero in tabulati che normalmente sono scritti tutti con lettere minuscole.
A tal proposito il C è un linguaggio 'case sensitive' ovvero la variabile (esempio)
dominio, è diversa da
Dominio. In ogni caso tutte le parole chiave del C (sono solamente una ventina, ad esempio
for, oppure
float) vanno sempre scritte in minuscolo, altrimenti non vengono correttamente interpretate come tali.
Tornando al problema esaminato una osservazione che ci servirà la prossima volta.
Abbiamo visto che per determinare il dominio di rottura e di snervamento abbiamo fittiziamente ruotato la sezione, piuttosto che l'asse neutro. Questo al fine di semplificare il problema analitico e di riutilizzare praticamente sempre un unico set di funzioni che ci ha permesso di superare in maniera quasi indolore il fatto che la sezione è di forma assolutamente generica.
Ciò che voglio sottolineare è che per data inclinazione dell'asse neutro si determineranno dei momenti flettenti di rottura, con asse momenti x ed y, che stanno in un determinato rapporto (asse vettore del momento risultante con certa inclinazione).
Orbene, in funzione della effettiva geometria della sezione, i momenti di snervamento Mx ed My, sempre per data inclinazione dell'asse neutro, avranno rapporto in generale differente. Così come lo stesso 'fenomeno' potrà riscontrarsi per momenti flettenti calcolati per date curvature ma a parità sempre di inclinazione dell'asse neutro.
Questo implica, e lo vedremo la prossima volta, che se vogliamo un diagramma momenti-curvatura che generalmente sta su un piano, dovremmo fare qualche ulteriore considerazione.