-
.
Continua leggere che scoprirai ciò che cerchi. Anche le tensioni. . -
Aurelio Verde.
User deleted
Ho visto, plinto 8 venti, di cui però manca l'ultima correzione che avevi apportato e che quattropassi doveva inserire . -
.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.. -
.
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. -
Aurelio Verde.
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) . -
Aurelio Verde.
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. . -
.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. -
.
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.. -
.
Come hai fatto a simulare le variabili strutturate in Gwbasic?
Ma Gwbasic gira ancora negli attuali sistemi Windows?. -
.
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?. -
.
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. -
.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.CITAZIONEVi saluto cordialmente
Ricambio cordialità.. -
.
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. -
.
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.......... -
.
[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.