-
.
Nel mio file excel in cui depositavo le funzioni che via via esploravo per poi darle in pasto a zax, avevo predisposto tre tabelle numeriche relative ai coefficienti Ny di Terzaghi, Kumbolajar e Martin e quindi avevo scritto la funzione interpolante come segue: CODICEFunction InterpolaNy(fi As Double, tabella() As Double) As Double
' fi deve essere dato in radianti ma qui deve essere trasferito in gradi
Dim i As Integer
Dim j As Integer
Dim pi As Double
pi = 4 * Atn(1)
Dim nTot As Integer
nTot = UBound(tabella()) - LBound(tabella()) + 1
If fi = 0 Then
InterpolaNy = 0
Exit Function
Else
i = 0
Do While i <= nTot - 1
If tabella(i, 0) < fi * 180 / pi Then
i = i + 1
Else
j = i
Exit Do
End If
Loop
If j = 0 Then j = nTot - 1
i = j - 1
End If
InterpolaNy = tabella(i, 1) + (tabella(j, 1) - tabella(i, 1)) * (fi * 180 / pi - tabella(i, 0)) / (tabella(j, 0) - tabella(i, 0))
End Function
La funzione InterpolaNy(fi As Double, tabella() As Double) As Double accetta come parametro fi e la tabella dove si deve condurre l'interpolazione.
La formula dell'interpolazione poi è banale.
La chiamata delle funzione avviene tramite l'istruzione:
Ny = InterpolaNy(0.4477 , tab_Martin())
[è il caso di 25.65 gradi da interpolare nella tabella di Martin]
Nel "parente brutto di Califfo" in cui ho voluto clonare l'interfaccia creata da zax ma in Lazarus, avevo invece scritto una funzione interpolante per ciascun ennegammista che aveva dato i suoi valori sotto forma tabellare:
Ecco per esempio quella relativa a Martin:CITAZIONEFunction TabellaMartin(fi:real):real;
var
tabella :array[1..2, 0..60] of real;
i,j:integer;
begin
if fi<=0 then
begin
result:=0.00;
exit;
end;
for i:= 0 to 60 do tabella[1,i]:=i ;
tabella[2,0]:=0.0000;
tabella[2,1]:=0.0118;
tabella[2,2]:=0.0286;
tabella[2,3]:=0.0506;
tabella[2,4]:=0.0786;
tabella[2,5]:=0.1134;
tabella[2,6]:=0.1560;
tabella[2,7]:=0.2078;
tabella[2,8]:=0.2701;
tabella[2,9]:=0.3445;
tabella[2,10]:=0.4332;
tabella[2,11]:=0.5382;
tabella[2,12]:=0.6622;
tabella[2,13]:=0.8083;
tabella[2,14]:=0.9799;
tabella[2,15]:=1.1814;
tabella[2,16]:=1.4175;
tabella[2,17]:=1.6939;
tabella[2,18]:=2.0175;
tabella[2,19]:=2.3960;
tabella[2,20]:=2.8389;
tabella[2,21]:=3.3574;
tabella[2,22]:=3.9645;
tabella[2,23]:=4.6760;
tabella[2,24]:=5.5108;
tabella[2,25]:=6.4913;
tabella[2,26]:=7.6447;
tabella[2,27]:=9.0036;
tabella[2,28]:=10.6076;
tabella[2,29]:=12.5050;
tabella[2,30]:=14.7543;
tabella[2,31]:=17.4275;
tabella[2,32]:=20.6131;
tabella[2,33]:=24.4203;
tabella[2,34]:=28.9849;
tabella[2,35]:=34.4761;
tabella[2,36]:=41.1059;
tabella[2,37]:=49.1416;
tabella[2,38]:=58.9219;
tabella[2,39]:=70.8787;
tabella[2,40]:=85.5656;
tabella[2,41]:=103.6970;
tabella[2,42]:=126.2030;
tabella[2,43]:=154.3000;
tabella[2,44]:=189.5920;
tabella[2,45]:=234.2130;
tabella[2,46]:=291.0260;
tabella[2,47]:=363.9070;
tabella[2,48]:=458.1500;
tabella[2,49]:=581.0670;
tabella[2,50]:=742.8630;
tabella[2,51]:=957.9470;
tabella[2,52]:=1246.9200;
tabella[2,53]:=1639.6300;
tabella[2,54]:=2179.9300;
tabella[2,55]:=2933.2500;
tabella[2,56]:=3998.8500;
tabella[2,57]:=5529.9300;
tabella[2,58]:=7767.5800;
tabella[2,59]:=11099.1000;
tabella[2,60]:=16161.0000;
i:=0; j:=0;
While i <60 do
begin
If tabella[1, i] < fi * 180 / pi Then
i := i + 1
Else
begin
j := i;
Break;
End
end;
if j=0 then j:=60 ;
i:=j-1;
result:=Tabella[2,i]+(Tabella[2,j]-Tabella[2,i])*(fi*180/pi-Tabella[1,i])/
(tabella[1,j]-tabella[1,i]);
end;
Qui avrei potuto generalizzare unica funzione interpolante togliendo i dati numerici dal codice e depositandoli o in un file esterno (come penso faccia zax) oppure un un componente StringGrid in una qualche pagina occulta dell'interfaccia.
P.S.: In merito al codice di Tex per adesso non mi sono certo intrufolato all'interno di quella sfilza di case e mi sono solo limitato a sapere che queste funzioni lunghe e noiose sono quelle che procedono all'interpolazione dei dati per fissata temperatura. So che ci sono e quando nel successivo codice leggerò una qualche istruzione che le richiama sapro' che proprio li sta interpolando.
Capisco anche la fretta di Tex di pervenire ad un risultato visibile (le interpolazioni sono cose che tutto sommato non si vedono) e poi sulla base dei risultati della prima bozza di codice funzionante iniziare a discutere.. -
.
@afazio, @zax
Come detto in questa fase sono più interessato ad ottenere un risultato utile confrontabile.
Dal punto di vista tecnico la procedura proposta è più elegante, ma presenta un overhead rispetto a quanto già fatto, e questo è dovuto al fatto che tocca precaricare le tabelle prima della elaborazione.
In questo senso rimpiango l'istruzione DATA del QBasic o del FORTRAN77, ma il linguaggio che utilizziamo è il VBA e vedremo di trovare un giusto compromesso tra efficienza, leggibilità e manutenibilità del codice.
Andiamo in maniera semplicistica a spiegare perchè ci sono due tabelle di coefficienti riduttori relative al comportamento alle alte temperature del calcestruzzo.
A seconda della natura della roccia con la quale è realizzato l’inerte si registrano differenti comportamenti alle alte temperature, è facile intuire come l’utilizzo di inerti a basso coefficiente di espansione termica si comportino meglio alle alte temperature. Infatti minore è l’espansione termica dell’aggregato minori sono le tensioni che si generano all’interfaccia pasta di cemento inerte minori sono le possibilità che si formino fessure e distaccamenti di materiali.
Altre proprietà termiche degli inerti quali conducibilità e la capacità termica degli inerti rivestono un ruolo fondamentale quando si vuole progettare un calcestruzzo resistente al fuoco, infatti sono caratteristiche relative alla capacità che gli inerti hanno di assorbire e dissipare calore.
Sostanzialmente l’adottare aggregati aventi valori di capacità è conducibilità termica equivale aumentare la resistenza al fuoco della struttura, arrestando la crescita della temperatura e ritardando il tempo necessario perchè questa si diffonda all’interno della struttura.
La natura dell’inerte influenza in modo sensibile il calcestruzzo ed in particolare la sua resistenza meccanica.
I calcestruzzi calcarei come quelli leggeri (argilla espansa e sabbia) in prossimità dei 750°C perdono il 25% della resistenza a compressione iniziale mentre quelli silicei, registrano un calo di resistenza triplo rispetto ai primi.
Per interpolare i coefficienti tabellari ho implementato la seguente funzione:CODICE'----------------------------------------------------------------------------------------------
' Interpolazione lineare
' dati in ingresso:
' T1 --> temperatura punto A
' T2 --> temperatura punto B
' T3 --> temperatura punto C interno alla linea congiungente A con B
' A --> valore in A
' B --> valore in B
' dati in uscita:
' restituisce il valore C interpolato
' autore: Tex
' data: Agosto 2014
'----------------------------------------------------------------------------------------------
Private Function CfIntLin(T1 As Double, T2 As Double, T3 As Double, a As Double, b As Double) As Double
Dim denom As Double
denom = T2 - T1
If denom = 0# Then
CfIntLin = (a + b) / 2
Else
CfIntLin = a + (T3 - T1) * (b - a) / denom
End If
End Function
Edited by texitaliano64 - 10/8/2014, 11:34Attached Image. -
.
La formulazione parametrica del diagramma tensioni/deformazioni è la seguente: CODICE'----------------------------------------------------------------------------------------------
' legame deformazioni-sforzo del calcestruzzo riscaldato ad alte temperature
' dati in ingresso:
' def --> deformazione
' fd --> resistenza massima del calcestruzzo alla temperatura T
' epsc0 --> deformazione cuspide del legame costitutivo alla temperatura T
' epscu --> deformazione ultima del legame costitutivo alla temperatura T
' dati in uscita:
' tensione corrispondente alla deformazione def
' autore: Tex
' data: Agosto 2014
'----------------------------------------------------------------------------------------------
Public Function legame_cls_fire(def As Double, epsc0 As Double, epscu As Double, fd As Double) As Double
Select Case def
Case Is >= epsc0
'tratto discendente lineare
legame_cls_fire = CfIntLin(epsc0, epscu, def, fd, 0#)
Case Is <= 0#
legame_cls_fire = 0#
Case Else
legame_cls_fire = 3 * def * fd / (epsc0 * (2# + (def / epsc0) ^ 3))
End Select
End Function
Come riportato nella tabella sottostante:Attached Image. -
.
Per quanto detto poco sopra posto il grafico variazione della resistenza a compressione del calcestruzzo in funzione della temperatura. Attached Image. -
.
Quà invece si illustra la variazione del grafico parametrico sigma-epsilon di un calcestruzzo con aggregati silicei in funzione della temperatura. Attached Image. -
.
Ora illustriamo la curva parametrica relativa all'acciaio sia ordinario che da pretensione sottoposto alle alte temperature: CODICE'----------------------------------------------------------------------------------------------
' legame deformazioni-sforzo dell'acciaio ordinario e da pretensione riscaldato ad alte temperature
' dati in ingresso:
' def --> deformazione
' fsp_teta --> tensione oltre la quale inizia il tratto curvo
' fsy_teta --> tensione dove inizia il tratto orrizzontale
' Es_teta --> modulo secante primo tratto rettilineo
' opzionali:
' epsst_teta --> deformazione in cui inizia il tratto discendente, per acciaio ordinario 0.15
' epssu_teta --> deformazione ultima, per acciaio ordinario 0.2
' dati in uscita:
' tensione corrispondente alla deformazione def
' autore: Tex
' data: Agosto 2014
'----------------------------------------------------------------------------------------------
Public Function legame_steel_fire(def As Double, Es_teta As Double, fsp_teta As Double, fsy_teta As Double, _
Optional epsst_teta As Double = 0.15, Optional epssu_teta As Double = 0.2) As Double
Dim epssp_teta As Double
Dim epssy_teta As Double
epssp_teta = fsy_teta / Es_teta
epssy_teta = 0.02
Dim a As Double
Dim b As Double
Dim c As Double
c = (fsy_teta - fsp_teta) ^ 2 / ((epssy_teta - epssp_teta) * Es_teta - 2# * (fsy_teta - fsp_teta))
a = ((epssy_teta - epssp_teta) * (epssy_teta - epssp_teta + c / Es_teta)) ^ 0.5
b = (c * (epssy_teta - epssp_teta) * Es_teta + c ^ 2) ^ 0.5
Dim eps As Double
eps = Abs(def)
Dim sigma As Double
Select Case eps
Case Is <= epssp_teta
sigma = eps * Es_teta
Case epssp_teta To epssy_teta
sigma = fsp_teta - c + (b / a) * (a ^ 2 - (epssy_teta - eps) ^ 2) ^ 0.5
Case epssy_teta To epsst_teta
sigma = fsy_teta
Case epsst_teta To epssu_teta
sigma = fsy_teta * (1# - (eps - epsst_teta) / (epssu_teta - epsst_teta))
Case Is >= epssu_teta
sigma = 0#
End Select
legame_steel_fire = Sgn(def) * sigma
End Function
Il codice della funzione è una implementazione delle formule riporate nella tabella sottostante.Attached Image. -
.
Per l'acciaio ordinario abbiamo due tabelle una per la classe N ed una per la classe X.
Qualora non si abbiano dati comprovati sul tipo di acciaio si opta per la classe N.Attached Image. -
.
Questa tabella invece contiene i coefficienti per l'acciaio tipo X. Attached Image. -
.
Per gli acciai da pretensione la faccenda è più complicata, in quanto dobbiamo tener conto di un fattore beta parametrizzato anch'esso.
Quà il codice per ricavare il Beta in funzione del tipo di acciaio da pretensione, che può essere di tipo A (fili o trefoli ordinario classe 1 NTC2008 11.3.3.3) o tipo B (fili o trefoli ordinario classe 2 NTC2008 11.3.3.3):CODICE'----------------------------------------------------------------------------------------------
' funzione per calcolare il coefficiente Beta
' ingresso:
' fpk --> tensione caratteristica di snervamento trefoli
' fp1k --> tensione caratteristica all'1% di deformazione sotto carico (0.9*fpk)
' Ep --> modulo di elasticità trefoli
' Cl_AB --> 1 per classe A, 2 per classe B
' uscita:
' Beta
' autore: Tex
' data: agosto 2014
'----------------------------------------------------------------------------------------------
Private Function trova_beta(fpk As Double, fp1k As Double, Ep As Double, Cl_AB As Integer) As Double
'euk = 0.035 deformazione di rottura 35 per mille
Const euk As Double = 0.035
'limite di deformazione nel caso di tratto incrudente
Dim eud As Double
eud = 0.9 * euk
Dim Beta As Double
If Cl_AB = 1 Then
'Classe A
Beta = ((eud - fp1k / Ep) / (euk - fp1k / Ep)) * ((fpk - fp1k) / fpk) + fp1k / fpk
Else
'Classe B
Beta = 0.9
End If
trova_beta = Beta
End Function
Edited by texitaliano64 - 11/8/2014, 17:20Attached Image. -
.
Ecco visivamente il grafico della funzione parametrica sigma-epsilon dell'acciao ordinario e da pretensione alle alte temperature: Attached Image. -
.
A questo punto noi dovremmo concentrarci sull'analisi termica della nostra sezione di elemento strutturale, per far questo abbiamo bisogno di alcune elementi.
La curva di incendio standard parametrizzata ISO834 ha una formulazione in cui la temperatura è funzione del tempo espresso in minuti primi.
teta=teta = 20+345*ln(8*t+1)/ln(10)
In xmaxima possiamo visualizzarne il grafico:CITAZIONE(%i11) load(implicit_plot);
(%o11)
C:/PROGRA~2/MAXIMA~1.2/share/maxima/5.31.2/share/contrib/implicit_plot.lisp
(%i12) implicit_plot (teta = 20+345*log(8*t+1)/log(10),[t, 0, 180], [teta,20,1200]);
rat: replaced 2.302585092994046 by 11249839/4885743 = 2.302585092994044Attached Image. -
.
Altre curve di incendio nominali comparate alla ISO834: Attached Image. -
.
Come si usano queste curve?
Supponiamo sia richiesta una R30.
Se assumo t=30 min, dalla curva nominlae standard ISO834 ottengo una temperatura pari a:
T = 20 +345*Log10(8*30+1) = 842 °C
Questa temperatura è quella da applicare sulle superfici esposte della nostra sezione?. -
.
Si esatto, la temperatura ricavata da questa formula parametrica in funzione del tempo di esposizione è applicata alle superfici esposte all'incendio del nostro elemento strutturale che vogliamo verificare agli SLU.
La temperatura dei gas che è esclusivamente dipendente dal tempo, è applicata a partire dall'inizio dell'incendio time=0 fino al punto in cui noi vogliamo fare la verifica, ad esempio time=90 minuti primi, nei lati del manufatto esposti alle fiamme.
La temperatura iniziale è fissata convenzionalmente a 20°C.
Curve di incendio nominali standard
Edited by texitaliano64 - 30/8/2015, 18:34Attached Image. -
.
Il calcestruzzo è un materiale che subisce delle modificazioni chimico fisiche durante l'esposizione alle alte temperature.
Per tener conto di ciò sono codificate delle funzioni parametriche che descrivono tali cambiamenti.
In particolare abbiamo la riduzione della massa, la diminuzione della conducibilità termica, e l'aumento del calore specifico.
A tale riguardo allego le formulazioni proposte dall'EC2:
(La conducibilità termica Klowerlimit è adottata per calcestruzzo calcareo, mentre Kupperlimit per calcestruzzo siliceo)Attached Image.