Il Bar dell'Ingegneria

FIRE 2D

« Older   Newer »
 
  Share  
.
  1.     +1   +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    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:

    CODICE
    Function 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:

    CITAZIONE
    Function 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.
     
    Top
    .
  2.     +1   -1
     
    .
    Avatar

    Member

    Group
    Member
    Posts
    766
    Reputation
    +23

    Status
    Offline
    @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:34
    Attached Image
    Tabelle-cls

     
    Top
    .
  3.     +1   -1
     
    .
    Avatar

    Member

    Group
    Member
    Posts
    766
    Reputation
    +23

    Status
    Offline
    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
    modello_cls

     
    Top
    .
  4.     +1   -1
     
    .
    Avatar

    Member

    Group
    Member
    Posts
    766
    Reputation
    +23

    Status
    Offline
    Per quanto detto poco sopra posto il grafico variazione della resistenza a compressione del calcestruzzo in funzione della temperatura.
    Attached Image
    modello_cls_T

     
    Top
    .
  5.     +1   -1
     
    .
    Avatar

    Member

    Group
    Member
    Posts
    766
    Reputation
    +23

    Status
    Offline
    Quà invece si illustra la variazione del grafico parametrico sigma-epsilon di un calcestruzzo con aggregati silicei in funzione della temperatura.
    Attached Image
    modello_cls_Tx

     
    Top
    .
  6.     +1   -1
     
    .
    Avatar

    Member

    Group
    Member
    Posts
    766
    Reputation
    +23

    Status
    Offline
    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
    modello_acciaio

     
    Top
    .
  7.     +1   -1
     
    .
    Avatar

    Member

    Group
    Member
    Posts
    766
    Reputation
    +23

    Status
    Offline
    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
    Tabella-acciaio_N

     
    Top
    .
  8.     +1   -1
     
    .
    Avatar

    Member

    Group
    Member
    Posts
    766
    Reputation
    +23

    Status
    Offline
    Questa tabella invece contiene i coefficienti per l'acciaio tipo X.
    Attached Image
    Tabella-acciaio_X

     
    Top
    .
  9.     +1   -1
     
    .
    Avatar

    Member

    Group
    Member
    Posts
    766
    Reputation
    +23

    Status
    Offline
    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:20
    Attached Image
    Tabella_Beta

     
    Top
    .
  10.     +1   -1
     
    .
    Avatar

    Member

    Group
    Member
    Posts
    766
    Reputation
    +23

    Status
    Offline
    Ecco visivamente il grafico della funzione parametrica sigma-epsilon dell'acciao ordinario e da pretensione alle alte temperature:
    Attached Image
    lc_steel

     
    Top
    .
  11.     +1   -1
     
    .
    Avatar

    Member

    Group
    Member
    Posts
    766
    Reputation
    +23

    Status
    Offline
    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.302585092994044
    Attached Image
    ISO834

     
    Top
    .
  12.     +1   -1
     
    .
    Avatar

    Member

    Group
    Member
    Posts
    766
    Reputation
    +23

    Status
    Offline
    Altre curve di incendio nominali comparate alla ISO834:
    Attached Image
    Fire_curves

     
    Top
    .
  13.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,163
    Reputation
    +294

    Status
    Offline
    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?
     
    Top
    .
  14.     +1   -1
     
    .
    Avatar

    Member

    Group
    Member
    Posts
    766
    Reputation
    +23

    Status
    Offline
    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:34
    Attached Image
    fc

     
    Top
    .
  15.     +1   -1
     
    .
    Avatar

    Member

    Group
    Member
    Posts
    766
    Reputation
    +23

    Status
    Offline
    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
    prop_mat

     
    Top
    .
137 replies since 5/8/2014, 16:29   10514 views
  Share  
.