Parte 10Ritornando sui propri passi – Le deformazioni a rotturaVisti gli interventi di Renato ed Alberto Ferrari rettifico alcune cose della parte 8 riguardanti la deformazione a rottura della sezione.
Approfitto della figura che Renato ha gentilmente postato per rubargliela e riaggiustare il discorso.
La figura può essere letta in due modi:
1) Ho una certa situazione deformativa, da cui ricavo la posizione dell'asse neutro;
2) Ho una certa posizione dell'asse neutro, da cui ricavo la situazione deformativa.
E' questa seconda via quella che perseguirò.
Definiamo un po' di cose:
yn: ordinata dell'asse neutro;
ymax: massima ordinata tra tutti i vertici della sezione;
yamin: minima ordinata tra tutte le barre di armatura;
?a: deformazione in corrispondenza di ymax;
?b: deformazione in corrispondenza di yamin;
?yd: deformazione massima dell'acciaio (valore negativo se di trazione);
?cu: deformazione massima nel calcestruzzo (valore positivo se di compressione)
?c0: deformazione in cui termina il tratto parabolico del “classico” diagramma parabola-rettangolo
Conoscendo le deformazioni in ymax ed yamin, per l'ipotesi di conservazione della planarità, si ricava la deformazione in qualsiasi altra fibra della sezione. Infatti per ogni fibra posta alla generica quota y, si avrà:
?=?a+(?b-?a)*(ymax-y)/(ymax-yamin)Dove ?b e ?a vanno inseriti con il loro effettivo segno nella formula.
Le situazioni che possono riscontrarsi guardando la figura sono solamente tre, ovvero:
a) Posizione dell'asse neutro: +?>yn>(??yd?*ymax+?cu*yamin)/(?cu+??yd?)
In questo caso:
?a=?yd*(yn-ymax)/(yn-yamin)?b=?yd (valore negativo)
Come suggerito da Renato, ad ?yd viene assegnato il valore -0.0675 (pari al 90% di 7.5% deformazione a rottura di un acciaio B450C – vedi §4.1.2.1.2.3 e Tab. 11.3.Ib)
b) Posizione dell'asse neutro (??yd?*ymax+?cu*yamin)/(?cu+??yd?)?yn>yamin
In questo caso:
?a=?cu
?b=?cu*(yn-yamin)/(yn-ymax)c) Posizione dell'asse neutro yamin?yn>-?
In questo caso il diagramma ruota attorno al punto di deformazione ?c0 posto a quota
yc0=yamin+?c0*(ymax-yamin)/?cu, e quindi:
?a=?c0*(ymax-yn)/(yc0-yn)
?b=?c0*(yamin-yn)/(yc0-yn)Osservate come io abbia dato un valore numerico alla sola deformazione massima ?yd, lasciando le altre grandezze “indefinite”. Perchè a questo punto scatta quanto detto da Alberto Ferrari circa i differenti valori di ?c0 ed ?cu per i calcestruzzi con classe di resistenza superiore a C50/60 (vedi §4.1.2.1.2.2).
Questo fatto, come accennato in un post precedente, comporta delle ulteriori elaborazioni da fare prima di definire la corretta deformazione della sezione.
Intanto occorrerà modificare la struttura dati dei poligoni, inserendo anche tre nuovi valori:
struct poligono_sezione
{
float x[100]; /* coordinata x del vertice */
float y[100]; /* coordinata y del vertice */
int numv; /* numero di vertici del poligono */
float omog; /* coefficiente di omogeneizzazione */
int traz; /* 0=non reagente a trazione; 1=reagente a trazione */
char classe[8]; /* NUOVO Classe di resistenza del cls */
float fd; /* Resistenza massima di calcolo */
int dominio; /* 0=parabola-rettangolo (cls) 1=bilatera (acciaio) */
int fase; /* A futura memoria per gestire fasi di realizzazione */
float epsc0; /* NUOVO deformazione di fine parabola del dominio */
float epscu; /* NUOVO deformazione ultima del dominio */
};
Io immagino che ci sia una porzione di programma che in funzione di un input dell'Utente (la classe di resistenza) calcoli con le formule di normativa i valori corretti di epsc0 ed epscu.
Poi bisognerà rettificare la funzione che avendo in entrata la deformazione restituisce il valore alfa da moltiplicare per fd per ottenere la tensione di rottura. La funzione presentata nella parte 8, se ricordate, presentava dei valori fissi, che ovviamente adesso non vanno più bene.
Per la parte parabolica del diagramma, facendo passare la parabola per i punti 0;0 e ?c0;1 ed imponendo la tangenza orizzontale in questo ultimo punto, si ottengono i parametri della parabola: a=-1/?co^2 e b=2/?c0
Pertanto la funzione, aggiungendo il parametro epsc0 in ingresso, diventa:
float parabola_rett(float,float); /* Prototipo della funzione */
float parabola_rett(float def,float epsc0)
{
float alfa;
if (def>=epsc0) alfa=1.0;
else alfa=-pow(def,2)/pow(epsc0,2)+2*def/epsc0;
return (alfa);
}
A questo punto sarei pronto, rettificando tutto quanto ho rettificato, a presentare la funzione che, dato un certo valore yn di ordinata dell'asse neutro determina le deformazioni nei punti di maggiore e minore “altezza” della sezione.
Non senza prima però aggiungere un ulteriore tassello alla questione.
Infatti, se la sezione è costituita da più poligoni, e se alcuni di questi poligoni sono costituiti da calcestruzzo con classe di resistenza superiore a C50/60, e quindi con valori di ?cu ed ?c0 differenti dai soliti 3.5 per mille (minore di tale valore) e 2 per mille (maggiore di tale valore), chi ci garantisce che la deformazione in ymax del 3.5 per mille (poiché per esempio ymax è di un vertice appartenente ad un poligono “normale”) sia compatibile con la massima deformazione possibile di un vertice del poligono “special”, magari posto pochi centimetri più in basso di ymax?
Nella figura successiva viene presentato proprio il caso di cui parlo.
Chiaramente quindi, la funzione che definisce le deformazioni limite della sezione, dovrà tenere conto del problema.
Correggere le cose sembra semplice a prima vista (la linea rossa della figura rimette a posto le cose), però, riflettendo, la deformata che “comanda” a questo punto è quella del poligono “forte” (quello più scuro della figura), e questo dovrà rispettare le condizioni a) b) o c) comunque (massima tensione di rottura in un lembo piuttosto che nell'altro).
Però gli effettivi casi che possono realmente verificarsi sono il b) (in quanto al lembo superiore si ha già una deformazione limite, il materiale cls) oppure il c).
Allora, per il caso b) le nuove deformazioni, indicate con ?'a ed ?'b in figura, valgono:
?'a=?'cu*(ymax-yn)/(y'max-yn)
?'b=?'cu*(yn-yamin)/(yn-y'max)Invece nel caso c) si modifica anche il punto di rotazione della sezione, ovvero:
y'c0=yamin+?'c0*(y'max-yamin)/?'cu, e quindi:
?'a=?'c0*(ymax-yn)/(y'c0-yn)
?'b=?'c0*(yamin-yn)/(y'c0-yn)Questi controlli di “congruenza” vanno estesi a tutti i poligoni che costituiscono la sezione, ritoccando di volta in volta i numeri. Certamente è uno ed uno solo il poligono che “comanda”.
Infine ecco una nuova struttura dati:
struct deform_ultime_sezione
{
float epsa;
float epsb;
};
Ed ecco la funzione (preceduta dal solito prototipo), che restituisce proprio una struttura dati come quella di cui sopra:
struct deform_ultime_sezione calcola_deform_ultime(struct poligono_sezione *,float,int,float,float);
/* Dati di ingresso della funzione ------------------------ */
/* ymax=massima ordinata della sezione in cls */
/* npm=numero del poligono in cui si ha la massima ordinata */
/* yamin=minima ordinata delle armature */
/* yn=ordinata asse neutro */
struct deform_ultime calcola_deform_ultime(struct poligono_sezione *polic,float ymax,int npm,float yamin,float yn)
{
int register k,np;
float y1[5],yc0,dpa;
struct deform_ultime_sezione def;
/* Calcola le massime ordinate di ogni singolo poligono */
for (np=0;np<4;np++)
{
y1[np]=-1000000.0;
for (k=0;k<=polic[np].numv-1;k++)
{
if (polic[np].y[k]>y1[np]) y1[np]=polic[np].y[k];
}
}
/* Definisce le deformazioni ultime della sezione */
if (yn>(fabs(epsyd)*ymax+polic[npm].epscu*yamin)/(polic[npm].epscu+fabs(epsyd)))
{
def.epsa=epsyd*(yn-ymax)/(yn-yamin);
def.epsb=epsyd;
}
if (yn<=(fabs(epsyd)*ymax+polic[npm].epscu*yamin)/(polic[npm].epscu+fabs(epsyd)) && yn>yamin)
{
def.epsa=polic[npm].epscu;
def.epsb=polic[npm].epscu*(yn-yamin)/(yn-ymax);
}
if (yn<=yamin)
{
yc0=yamin+polic[npm].epsc0*(ymax-yamin)/polic[npm].epscu;
def.epsa=polic[npm].epsc0*(ymax-yn)/(yc0-yn);
def.epsb=polic[npm].epsc0*(yamin-yn)/(yc0-yn);
}
/* Controlla che per tutti i contorni valga quanto ricavato */
for (np=0;np<=4;np++)
{
if (np==npm || polic[np].numv==0) continue;
dpa=def.epsa+(def.epsb-def.epsa)*(ymax-y1[np])/(ymax-yamin);
if (dpa>polic[np].epscu)
{
if (yn<=(fabs(epsyd)*y1[np]+polic[np].epscu*yamin)/(polic[np].epscu+fabs(epsyd)) && yn>yamin)
{
def.epsa=polic[np].epscu*(ymax-yn)/(y1[np]-yn);
def.epsb=polic[np].epscu*(yn-yamin)/(yn-y1[np]);
}
if (yn<=yamin)
{
yc0=yamin+polic[np].epsc0*(y1[np]-yamin)/polic[np].epscu;
def.epsa=polic[np].epsc0*(ymax-yn)/(yc0-yn);
def.epsb=polic[np].epsc0*(yamin-yn)/(yc0-yn);
}
}
}
return(def);
}
Come vedete non ho fatto altro che implementare tutte le formule prima ricavate. La variabile epsyd è una variabile di tipo globale. Ovviamente si presuppone che prima di chiamare per la prima volta questa funzione il programma abbia già provveduto a calcolare preventivamente ymax ed yamin.
E' stato complicato, non difficile. Speriamo bene per i prossimi “mattoni”.