Il Bar dell'Ingegneria

Verifiche sezioni complesse in c.a. agli SLE ed SLU

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

    Advanced Member

    Group
    Member
    Posts
    2,942
    Reputation
    +187

    Status
    Offline
    Continua leggere che scoprirai ciò che cerchi. Anche le tensioni.
     
    Top
    .
  2. Aurelio Verde
        +1   -1
     
    .

    User deleted


    Ho visto, plinto 8 venti, di cui però manca l'ultima correzione che avevi apportato e che quattropassi doveva inserire :)
     
    Top
    .
  3.     +1   +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    CITAZIONE (Aurelio Verde @ 8/12/2014, 11:26) 
    Ho visto, plinto 8 venti, di cui però manca l'ultima correzione che avevi apportato e che quattropassi doveva inserire :)

    Ciao Aurelio;

    ho scritto la funzione nei seguenti linguaggi:

    - VBA per excel
    - ObjectPascal in Lazarus
    - OOBasic in OpenOffice


    L'inizio è stato un topic aperto da me che poneva il problema: Quattropassi sui quattro vertici

    ha prontamente risposto Zax con il codice in C++ rendendo disponibile anche un piccolo programmino e subito tradotto da me in VBA.

    Successivamente per diletto ho provato a scriverlo in Lazarus ed infine in occasione della valutazione della possibilità di poter traslocare in ambiente OpenOffice anche in quest'ultimo ambiente ( Ne ho parlato qui ).

    Ultimamente (forse due o tre mesi fa) ho aggiunto alla UDF la possibilità di far uscire anche le tensioni nei vertici del poligono parzializzato.

    Considerando che siamo concittadini e che abbiamo conoscenze in comune, se mi dai il tempo di predisporre un file apposito, penso di renderlo pubblico nel topic da cui ha avuto origine il problema.
     
    Top
    .
  4.     +1   -1
     
    .
    Avatar

    Member

    Group
    Member
    Posts
    766
    Reputation
    +23

    Status
    Offline
    Aggiornamento funzione che determina la posizione dell'asse neutro col metodo della secante.

    CODICE
    ' --------------------------------------------------------------------------
    ' Nome Sub          :determina_asse_neutro(
    ' Scopo funzione   : Calcola la posizione effettiva dell'asse neutro in modo
    '                    che la somma algebrica delle risultanti di compressio-
    '                    ne e trazione sia proprio Nd (sforzo normale di solle-
    '                    citazione)
    ' Parametri formali: Struttura dati con tutti i poligoni che costituiscono la
    '                    sezione, struttura dati con tutte le armature della se-
    '                    zione. Nd=sforzo normale di sollecitazione.
    '                    ult_snerv flag per determinare cosa si cerca, se Mr, Ms
    '                    oppure momenti a data curvatura, curv=curvatura
    ' Valore restituito: Struttura dati con varie informazioni: risultanti di
    '                    compressione e trazione, posizioni risultanti, posizio-
    '                    ne asse neutro, deformazioni limite a rottura sezione
    ' Implementazione  : Luglio 2011
    ' Autore           : Zax2010
    ' traduzione in VBA : Afazio Settembre 2012
    ' modifica          : Tex Dicembre 2014
    ' --------------------------------------------------------------------------
    Sub determina_asse_neutro(ByRef polic As TipoPoligono, armc As armature_sezione, _
                               ByRef nfin As risultante_n_finale, _
                               nd As Double, ult_snerv As Integer, curv As Double)
    Dim k As Integer, np As Integer
    Dim npm As Integer
    Dim ymax As Double: ymax = -1000000#
    Dim yamin As Double: yamin = 1000000#
    Dim ntot As Double, ntot1 As Double, ntot2 As Double
    Dim yn As Double, yn1 As Double, yn2 As Double
    Dim delta As Double: delta = 10#
    Dim diff As Double
    Dim deform As deform_sezione
    Dim nc As risultante_n, nt As risultante_n
    ' Per prima cosa determina ymax della sezione
    For np = 0 To NMAXPOLI - 1
       For k = 0 To polic(np).numv - 1
           If (polic(np).y(k) > ymax) Then
               ymax = polic(np).y(k)
               npm = np
           End If
       Next
    Next
    ' Poi determina yamin tra tutte le armature
    For k = 0 To armc.numarm - 1
         If (armc.y(k) < yamin And armc.cong(k) = 0) Then yamin = armc.y(k)
    Next

    ' Calcola le deformazioni ultime/snervamento della sezione
    yn1 = yamin - 1#
    If (ult_snerv = ULT) Then deform = calcola_deform_ultime(polic, ymax, npm, yamin, yn1)
    If (ult_snerv = SNERV) Then deform = calcola_deform_snerv(polic, ymax, npm, yamin, yn1)
    If (ult_snerv = curv) Then deform = calcola_deform_curv(ymax, yamin, yn1, curv)
    ' Calcola lo sforzo normale nella parte compressa della sezione
    nc = risult_compr(polic, armc, ymax, yamin, yn1, deform)
    ' Calcola lo sforzo normale della parte tesa della sezione
    nt = risult_traz(polic, armc, ymax, yamin, yn1, deform)
    ' Totale sforzo normale sulla sezione da confrontare con Nd
    ntot1 = nc.n + nt.n

    ' Calcola le deformazioni ultime/snervamento della sezione
    yn2 = ymax + 1#
    If (ult_snerv = ULT) Then deform = calcola_deform_ultime(polic, ymax, npm, yamin, yn2)
    If (ult_snerv = SNERV) Then deform = calcola_deform_snerv(polic, ymax, npm, yamin, yn2)
    If (ult_snerv = curv) Then deform = calcola_deform_curv(ymax, yamin, yn2, curv)
    ' Calcola lo sforzo normale nella parte compressa della sezione
    nc = risult_compr(polic, armc, ymax, yamin, yn2, deform)
    ' Calcola lo sforzo normale della parte tesa della sezione
    nt = risult_traz(polic, armc, ymax, yamin, yn2, deform)
    ' Totale sforzo normale sulla sezione da confrontare con Nd
    ntot2 = nc.n + nt.n

    Dim cont As Integer 'contatore tentativi

    'inizializzo contatore massimo numero di tentativi
    cont = 0
       
    Do While cont < 50 'max 50 tentativi
       cont = cont + 1
       Dim denom As Double
       denom = (ntot2 - ntot1)
       If denom = 0# Then
           yn = (yn1 + yn2) / 2
       Else
           yn = (yn1 * ntot2 - yn2 * ntot1) / denom
       End If
       ' Calcola le deformazioni ultime/snervamento della sezione
       If (ult_snerv = ULT) Then deform = calcola_deform_ultime(polic, ymax, npm, yamin, yn)
       If (ult_snerv = SNERV) Then deform = calcola_deform_snerv(polic, ymax, npm, yamin, yn)
       If (ult_snerv = curv) Then 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
       diff = nd - ntot
       If Abs(diff) < 0.01 Then Exit Do
       If Sgn(ntot) <> Sgn(ntot1) Then
           yn2 = yn
           ntot2 = ntot
       Else
           yn1 = yn
           ntot1 = ntot
       End If
    Loop

    'asse neutro esterno alla sezione
    If cont = 50 Then
       ' 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 (ult_snerv = ULT) Then deform = calcola_deform_ultime(polic, ymax, npm, yamin, yn)
           If (ult_snerv = SNERV) Then deform = calcola_deform_snerv(polic, ymax, npm, yamin, yn)
           If (ult_snerv = curv) Then 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
           diff = nd - ntot
           If Abs(diff) > 0.01 Then
               If (delta * diff) > 0# Then
                   delta = -delta / 5
                   yn = yn + delta
               Else
                   yn = yn + delta
               End If
           Else
               Exit Do
           End If
       Loop While Abs(delta) > 0.000001
    End If

    ' 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

    End Sub
     
    Top
    .
  5. Aurelio Verde
        +1   -1
     
    .

    User deleted


    AFAZIO sono commosso. Ci conosciamo da ingegneri.info, che non frequento da 6-7 anni, e siamo pure concittadini. Allora è vero che il colpevole va ricercato sempre tra le mura domestiche :) Tornando a noi. Sarà un mesetto che giravo attorno al problema. Ringrazio tutti voi, siete preziosi. Afazio, rimango in tua attesa. Intanto mi studio l'aggiornamento di Tex! Grazie a funzione da voi rese pubbliche, ho implementato nel mio foglio, il disegno delle armature del plinto (passo per me impensabile senza i vostri codici OPEN)
     
    Top
    .
  6. Aurelio Verde
        +1   -1
     
    .

    User deleted


    Ok, ora ho riletto per intero il topic Quattropassi sui quattro vertici. Che dite se spostiamo la discussione la, evitando di fare confusione in questo topic per i futuri lettori? Mi appello a voi che saprete il da farsi meglio di me.
     
    Top
    .
  7.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    CITAZIONE (Aurelio Verde @ 8/12/2014, 19:30) 
    Ok, ora ho riletto per intero il topic Quattropassi sui quattro vertici. Che dite se spostiamo la discussione la, evitando di fare confusione in questo topic per i futuri lettori? Mi appello a voi che saprete il da farsi meglio di me.

    Abbiamo aperto, invece, un nuovo topic IL PIEDE DEL VENTO , in cui ho proprio adesso dato il link da dove scaricare il file excel aggiornato col calcolo delle tensioni.

    In questo nuovo topic intendiamo estendere il codice anche per altre forme diverse dalla rettangolare purchè poligoni regolari.
    Naturalmente sei libero di poter intervenire ovunque.

    ciao
     
    Top
    .
  8.     +1   -1
     
    .
    Avatar

    Junior Member

    Group
    Member
    Posts
    40
    Reputation
    0

    Status
    Offline
    per Zax
    Seguo con interesse il forum anche se,anziano, conosco solo il basic
    Ho implementato la parte relativa allo SLU in gwbasic.
    In fase di verifica con VCASLU ho notato che la parte di codice

    If yn <= yamin Then
    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)

    non sembra funzionare in quanto se con yn=yamin effettivamente restituisce def.epsa=0.0035 e def.epsb=0
    con yn=0 (al bordo inferiore della sezione) restituisce def.epsa=0.00339 invece di 0.0035 e def.epsb=0.000145 invece di 0.0015 con un copriferro di 3 cm
    Mi sembra che nel codice sia stato trascurato il campo 5 relativo agli accorciamenti (pressoflessione con sfruttamento parziale dell'acciaio inferiore compresso e che anche quello relativo al campo 6 non funzioni perfettamente.
    Personalmente ho distinto yn<=yamin ma >= ymin( con cui ho indicato il bordo inferiore) (campo 5)
    e yn <=ymin (campo 6)
    Ho scritto, pertanto, le due linee di codice

    1830 IF YN<=YFMIN AND YN>= YMIN THEN DEFA=ECU : DEFB=ECU*(YFMIN-YN)/(YMAX-YMIN) : REM CAMPO 5

    1840 IF YN<=YMIN THEN YCO=(YMAX-YMIN)*ECO/ECU : DEFA=ECO*(YMAX-YMIN + ABS(YMIN-YN))/(YCO+ABS(YMIN-YN)) : DEFB=ECO*(-YN+YFMIN)/(YCO+ABS(YMIN-YN)) : DEFC=ECO*(YMIN-YN)/(YCO+ABS(YMIN-YN)) : REM CAMPO 6

    La seconda linea è un poco ridondante ma così è: non ho saputo fare di meglio; il problema infatti è quando la sezione ruota è va tutta nel quadrante negativo. Da notare che ambedue funzionano nel caso che YN=0
    Per una migliore comprensione ECO=0.002 ; ECU=0.0035 ; DEFC calcola la deformazione del cls al bordo inferiore; per il resto è facile la corrispondenza con il codice originario.
    Mi farebbe piacere sapere cosa ne pensi.
    Ti saluto cordialmente ringraziandoti per aver sviscerato l'argomento fornendo anche il codice.
     
    Top
    .
  9.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    CITAZIONE (otavresir @ 25/3/2015, 00:41) 
    Ho implementato la parte relativa allo SLU in gwbasic.

    Come hai fatto a simulare le variabili strutturate in Gwbasic?
    Ma Gwbasic gira ancora negli attuali sistemi Windows?
     
    Top
    .
  10.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,942
    Reputation
    +187

    Status
    Offline
    Riservato, per l'esplicitazione delle formule inserite nel codice ti riporto qui:

    La teoria che mancava

    Proprio lì nel post che si intitola "Parte 5 - Verifiche SLU - Si comincia", è riportato il classico diagramma con i vari campi di rottura.
    Il caso c) trattato è proprio quello che interessa noi.

    Infatti nel codice si determina dapprima il valore di yc0, posizione di rotazione della 'configurazione deformata' della sezione attorno al valore eps_c0 (2 per mille).
    L'unica cosa che posso, adesso, riscontrare è che nel diagramma postato la posizione di yc0 verrebbe determinata facendo riferimento alla altezza totale della sezione, invece le formule che riporto determinano yc0 con l'altezza utile. Ma può anche darsi che al momento io non 'veda' benissimo.

    Peraltro proprio questa potrebbe essere la discrepanza che trovi. Per configurazioni in cui la posizione dell'asse neutro si trova proprio sul bordo inferiore della sezione, per me la sezione ha già cominciato a 'ruotare' attorno al punto con eps_co=0.002, ecco quindi che è corretto non riscontrare il valore di 0.0035 al bordo compresso.
    Evidentemente con il codice che hai scritto (vedo infatti la variabile YMIN) tu inizi a far ruotare il diagramma quando l'asse neutro raggiunge il bordo inferiore della sezione e non il ferro posto più in basso.

    Quale sarà la 'vera' soluzione?
     
    Top
    .
  11.     +1   -1
     
    .
    Avatar

    Junior Member

    Group
    Member
    Posts
    40
    Reputation
    0

    Status
    Offline
    per Afazio
    ho usato le subroutine...
    per il gwbasic uso il portatile e parto da CD-ROM avendo registrato un CD di partenza con sopra il DOS di Windows 98 e utilizzo un drive della mitsumi electric che mi permette di leggere e formattare le pen drive
    come si dice: di necessità... virtù
    Con calma inserirò nel post le videate del dominio e della sezione...

    Per Zax
    http://www.webalice.it/orrione/File%20pdf/...niNormaliCA.pdf

    Per le configurazioni deformate della sezione allo slu ho fatto riferimento alla figura 5 e alla teoria riportata nella lezione di T.d.C. di cui all'indirizzo sopra riportato.
    Nella figura a cui fai riferimento il passaggio dell'asse neutro dall'armatura inferiore al bordo inferiore della sezione non sembra molto chiaro.

    "L'unica cosa che posso, adesso, riscontrare è che nel diagramma postato la posizione di yc0 verrebbe determinata facendo riferimento alla altezza totale della sezione, invece le formule che riporto determinano yc0 con l'altezza utile. Ma può anche darsi che al momento io non 'veda' benissimo."

    Esatto: la discrepanza sta proprio nell'aver utilizzato l'altezza utile della sezione invece dell'altezza della sezione come indicato nella figura 5 sopra citata: yco con l'altezza di sezione pari a 70 cm nel primo caso è uguale a 41.28571 mentre nel secondo è uguale a 40 cm pari proprio ai 4/7 di 70
    0.0035 : h = 0.002 : yco ---> yco=4/7 h

    Il problema è sorto nel testare il programma con VCASLU nel caso di sezioni pressoinflesse con sfruttamento parziale dell'acciaio inferiore compresso o con sezioni compresse con piccola eccentricità.
    VCASLU sembra seguire la seconda ipotesi.

    Ho dovuto introdurre la variabile ymin in quanto quando yn diventa negativo il codice sembra che non funzioni specialmente nel ruotare la sezione nei quadranti negativi.

    Vi saluto cordialmente
     
    Top
    .
  12.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,169
    Reputation
    +294

    Status
    Offline
    CITAZIONE (otavresir @ 25/3/2015, 11:21) 
    per Afazio
    ho usato le subroutine...
    per il gwbasic uso il portatile e parto da CD-ROM avendo registrato un CD di partenza con sopra il DOS di Windows 98 e utilizzo un drive della mitsumi electric che mi permette di leggere e formattare le pen drive
    come si dice: di necessità... virtù
    Con calma inserirò nel post le videate del dominio e della sezione...

    Interessante.

    In questo modo abbiamo lo zax-code oltre che in C/C++ anche in VB (quello di Tex) in VBA per excel quello qui riportato, anche una versione in GWBASIC. Magari quando ne avrò voglia lo riporto in Pascal/Lazarus.


    Hai mai pensato ad una sorta di emancipazione da Gwbasic ad uno dei basic per Window non per forza di tipo commerciale?
    Texitaliano ha dato il link ad alcune versioni free del Basic che girano su sistemi windows e coi quali si puo' inserire un minimo di interfaccia grafica.
    Le istruzioni elementari del basic sono praticamente uguali a quelli del Gwbasic. Spariscono i numeri di linea ma ad adeguarsi ci vuol proprio niente.

    CITAZIONE
    Vi saluto cordialmente

    Ricambio cordialità.
     
    Top
    .
  13.     +1   -1
     
    .
    Avatar

    Junior Member

    Group
    Member
    Posts
    40
    Reputation
    0

    Status
    Offline
    Per Zax
    In effetti guardando meglio, anche nella figura da te citata
    https://image.forumfree.it/9/4/9/2/5/4/1/1395590858.png
    mi sembra che il pivot sia C e che disti dal bordo inferiore , per asse neutro tra bordo inferiore della sezione e - infinito , di h*epso/epsu con h altezza della sezione;
    mentre il pivot sia B, per asse neutro compreso tra armatura inferiore e bordo inferiore della sezione.
    Ti saluto cordialmente
     
    Top
    .
  14.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,942
    Reputation
    +187

    Status
    Offline
    Otavresir, è come dici tu.

    Ho postato la figura prelevata da qualche parte in rete, e poi ho elaborato le varie formule partendo da un assunto differente.
    Tra l'altro in ingegneriaforum mi avevano già fatto notare alcuni errori nella definizione degli assetti deformativi a rottura della sezione e a quel tempo avevo meglio corretto il tiro.
    Evidentemente non ho guardato benissimo.

    Adesso sono andato a riscontrare una immagine analoga con quella da me postata nella circolare n. 252 AA.GG. del 15/10/1996 e relativa al D.M. 1996.
    Anche in quel caso il polo C viene ricavato a partire dall'altezza totale della sezione e non dalla utile.

    Ho toppato.

    Chissà nei sacri testi.........
     
    Top
    .
  15.     +1   -1
     
    .
    Avatar

    Junior Member

    Group
    Member
    Posts
    40
    Reputation
    0

    Status
    Offline
    [QUOTE=afazio,25/3/2015, 12:13 ?t=63303200&st=255#entry571707648]

    Hai mai pensato ad una sorta di emancipazione da Gwbasic ad uno dei basic per Window non per forza di tipo commerciale?
    Texitaliano ha dato il link ad alcune versioni free del Basic che girano su sistemi windows e coi quali si puo' inserire un minimo di interfaccia grafica.

    [QUOTE]

    Sinceramente ho qualche difficoltà;
    sono un poco anziano : ho iniziato con le schede perforate e l'Univac nel 1975...
    Forse proverò con Lazarus: mi sta simpatico. Ho seguito un poco le tue lezioni
    Ti saluto
     
    Top
    .
390 replies since 26/9/2012, 10:47   29408 views
  Share  
.