Il Bar dell'Ingegneria

VerSezSLU

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

    Advanced Member

    Group
    Member
    Posts
    2,939
    Reputation
    +187

    Status
    Offline
    Una volta caricati i dati nelle variabili interne dell'algoritmo non sarebbe possibile procedere ad un loro 'ordinamento' in funzione della distanza dal bordo compresso?

    Capisco che per la bisogna serva solamente individuare la fila con maggiore distanza di tutte.
     
    Top
    .
  2.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,165
    Reputation
    +294

    Status
    Offline
    CITAZIONE (zax2013 @ 13/5/2014, 15:08) 
    Una volta caricati i dati nelle variabili interne dell'algoritmo non sarebbe possibile procedere ad un loro 'ordinamento' in funzione della distanza dal bordo compresso?

    Capisco che per la bisogna serva solamente individuare la fila con maggiore distanza di tutte.

    Certo che si.

    Ma avendo gia in testa come procedere per risolvere la cosa immediatamente per adesso preferisco mantenere i due strati superiore ed inferiore ed aggiungere il parametro layers come "range" che prenderebbe il posto dei parametri Af.gen e y.gen che avevo aggiunto nella precedente variante.

    La questione si risolve davvero con poca spesa. Non escludo comunque di poter in seguito rendere ancora piu' generico l'input degli strati di armatura raccogliendo il tuo suggerimento.
    Comunque, nel caso della mia funzione servirebbe determinare lo strato più vicino e quello piu lontano dal bordo essendo proprio questi due che mi consentono di determinare le deformazioni. Dovrei rivedere tutte quelle parti di codice in cui intevengono af ed a'f che attualmente sono fissate nelle posizioni c-distanti dai bordi.
     
    Top
    .
  3.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,165
    Reputation
    +294

    Status
    Offline
    Apriamo il file scaricato e salviamolo subito con altro nome. Io ho scelto il nome VerSezRettLayers.

    Entriamo in ambiente programmazione. Il codice si compone delle seguenti funzioni/procedure:

    - Function arcCos(numero As Double) As Double
    - Function CalcEpsilon_rottura(...)
    - Function SigmaC(...)
    - Function SigmaS(...)
    - Function asseNeutro(...)

    - Function DominioRotturaRett(...)
    - Function VsezRettSLU_Ygen01(...)

    Le prime cinque funzioni non subiscono modifica alcuna mentre le rimanenti due devono essere modificate sia nell'intestazione che nel corpo del codice per prevedere l'input del "range" dove sono depositati i dati dei livelli intemedi di armatura.

    Intendo variare anche il nome della funzione da VsezRettSLU_Ygen01 a VsezRettSLU_Layer01. Sarebbe opportuno cambiare anche il nome della funzione DominioRotturaRett(...) in modo da poter avere presenti entrambe le funzionalità nello stesso file originario. Per adesso tengo separati i due file.

    Tenete presente che in corso di variazione del codice, il foglio che invece continua ad avere le chiamate alle vecchie funzioni si riempirà di segnalazioni di errori. Di questo non ci preoccupiamo. Correggeremo il tutto alla fine.

    Per cambiare tutte le occorrenze della stringa VsezRettSLU_Ygen01 in VsezRettSLU_Layer01 basta fare ricorso alla voce di menu Modifica-->Sostituisci presente nella barra dei menu dell'ambiente VBA.

    490lEJu

    Ricordarsi di spuntare l'opzione "Progetto corrente".

    Dovreste ottenere il messaggio che sono state sostituite 39 occorrenze della stringa.

    Adesso dedichiamoci a modificare il codice relativo alla funzione DominioRotturaRett(...)

    La prima cosa da fare è la modifica dell'intestazione della funzione e cioè la lista di parametri che le vengono passati.

    Modifichiamo l'itestazione nella seguente:

    CODICE
    Public Function DominioRotturaRett(B As Double, H As Double, c As Double, _
                                     AfInF As Double, AfSup As Double, _
                                     AfParete As Double, LAyers As Range, _
                                     fCd As Double, fyd As Double, _
                                     x As Double, flag As Integer)


    in cui abbiamo tolto i due parametri AfGen e YGen che erano entrambi dei Double e sostituito con l'unico parametro Layers che invece è un oggetto "range".
     
    Top
    .
  4.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,165
    Reputation
    +294

    Status
    Offline
    Adesso scorriamo il codice della funzione che stiamo modificando fino a riscontrare la parte di codice:

    CODICE
    ' coppia di tondini a quota generica
     y = Ygen
     z = CalcEpsilon_rottura(H, c, y, x)
     w = SigmaS(z, fyd, 1)
     N_dominio = N_dominio + w * AfGen
     M_dominio = M_dominio + w * AfGen * (y - yg)


    Questa parte trattava solo di un livello generico di armatura. Dobbiamo apportare le modifiche in modo tale che tratti tutti i livelli presenti nel range Layers che abbiamo passato come argomento.

    Può però capitare il caso in cui passiamo un range vuoto.

    Modifichiamo quel codice nel modo che segue:
    - intanto poniamo il blocco relativo ai layers entro una condizione IF che controlla che in effetti il numero delle righe del range passato sia maggiore di zero, e quindi operiamo all'interno di un ciclo for... next che scansiona tutte le righe del range passato.

    CODICE
    ' parte relativa ai livelli intemedi di armatura
     If LAyers.Rows.count > 0 Then
       For count = 1 To LAyers.Rows.count
           y = LAyers.Cells(count, 1).value
           z = CalcEpsilon_rottura(H, c, y, x)
           w = SigmaS(z, fyd, 1)
           N_dominio = N_dominio + w * LAyers.Cells(count, 2).value
           M_dominio = M_dominio + w * LAyers.Cells(count, 2).value * (y - yg)
       Next
     End If


    Finito

    Passiamo alle correzioni da apportare alla funzione VsezRettSLU_Layer01()

    In questa funzione non c'e' alcun codice che richiama al contenuto del range passato come argomento, ma vi sono per contro tutta una serie di chiamate alla funzione precedente che però adesso ha cambiato l'elenco dei parametri passati.

    Vediamo infatti la presenza di tutta una serie di istruzioni uguali alle seguenti che riporto:

    DominioRotturaRett(B, H, c, AfInF, AfSup, AfParete, AfGen, Ygen, fCd, fyd, 0, 1)

    o anche

    DominioRotturaRett(B, H, c, AfInF, AfSup, AfParete, AfGen, Ygen, fCd, fyd, x, 2)

    in cui sono ancora presenti i due parametri AfGen e YGen che abbiamo sostituito con l'unico parametro LAyers.

    Dovremo munirci di pazienza ed operare la sotituizione una ad una oppure, notando che i due parametri ricorrono sempre nella stessa sequenza potremmo ancora una volta fare ricorso al Modifica-->Sostituisci.

    Modifichiamo l'intestazione della funzione VsezRettSLU_Layer01 nella seguente

    CODICE
    Public Function VsezRettSLU_Layer01(B As Double, H As Double, c As Double, _
                                   AfInF As Double, AfSup As Double, _
                                   AfParete As Double, LAyers As Range, _
                                   fCd As Double, fyd As Double, _
                                   Ned As Double, flag As Integer) As Variant


    per renderla congruente a quella della funzione DominioDiRotturaRett()

    Procediamo quindi con la sostituzione:

    55yeAze

    ottenendo ben 12 occorrenze sostituite. Controlliamo se tutto va bene. OK

    Avremmo davvero terminato con la modifica del codice, salvo il fatto che potremmo pensare di togliere completamente il parametro "AfParete" che in presenza di layer di armatura a livelli generici ha in effetti poco senso.
    Chi vuole apportare anche questa modifica deve farlo adesso iniziando naturalmente dalla modifica nella funzione DominioDiRotturaRett( sia nell'intestazione che nel corpo del codice e sia poi nella funzione VsezRettSLU_Layer01 sia nell'intestazione che nel corpo, dato che se lo fa dopo aver riadattato il foglio sarà costretto ad un nuovo riadattamento.

    Io scelgo di non operare la modifica e passo direttamente al riadattamento del foglio.
     
    Top
    .
  5.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,165
    Reputation
    +294

    Status
    Offline
    Passiamo adesso al riadattamento del foglio. Chiudiamo l'ambiente VBA e torniamo sul foglio.

    Qui dobbiamo procedere coi seguenti passi:

    - creazione del range dove depositare i dati relativi ai vari livelli di armature intermedie e dargli un nome
    (da notare che nominare il range non è strettamente necessario, potendo dare in input direttamente il range di celle con la notazione tipo A3:B7, ma io preferisco agire coi nomi dei range)
    - sostituire tutte le occorrenze della stringa VSezRettSLU_Ygen01 con il nuovo nome della funzione
    - sostituire l'elenco dei parametri sia nelle chiamate alla funzione DominioDiRotturaRett() e sia nelle chiamate alla nuova funzione VSezRettSLU_Layer01()

    In vista delle sostituzioni dell'elenco dei parametri, annoto che gi indirizzi a Afgen e Ygen erano le celle $H$5 e $I$5 e che queste ricorrono sempre nella stessa forma e sequenza nelle chiamate. Occorrerà, quindi, operare la sostituzione ;$H$5;$I$5; col nome che daremo al range dei livelli di armatura.

    Penso di organizzare la tabella dei liveli intermedi di armatura come da seguente immagine:

    6kPvODS

    in cui ho predisposto una quindicina di righe.

    Ho inserito nella cella sottostante alla dicitura N Tot. Liv, la formula =CONTA.NUMERI(B34:B48) con la quale vengono contate le celle contenente un valore numerico tra le celle B34:B48.

    Quindi nelle celle sottostanti inserisco prima la formula =SE(C34<>"";1;"") che controlla l'esistenza di un qualsiasi valore nella cella accanto e nel caso positivo inserisce il valore 1
    Nelle celle delle righe successive inserisco invece la formula =SE(C36<>"";B35+1;"") che opera l'incremento del valore precedente se trova un qualsiasi valore nella cella accanto.

    Adesso procedo a nominare il range ricorrendo ad un nome dinamico che adatta le sue dimensioni in funzione del numero di livelli riportati nella celle N Tot.Liv.

    Ci posizioniamo nella cella C34 e da menu Formule-->Gestione nomi inseriamo un nuovo nome che ho chiamato Livelli.
    Nella parte "riferito a..." scrivo la formula =SCARTO(SezRett!$C$34;0;0;SezRett!$B$33;2) confermo e torno sul foglio.

    Nel frattempo notiamo che l'intero foglio si è popolato di una infinita di messaggi di errore. Questo è semplicemente dovuto al fatto che Excel non trova le vecchie funzioni definite.

    Operiamo la prima sostituzione come da immagine che segue:
    9l55Vfm

    Per accedere alla maggiori opzioni presenti nell'immagine premere sul bottoncino Opzioni che troverete nel dialogo che vi appare prima. Ricordarsi di scegliere di effettuare la sostituzione anche nelle formule presenti nelle celle.

    otteniamo il messaggio di 36 sostituzioni eseguite.

    Procediamo adesso con la sostituzione dei riferimenti agli elenchi di parametri come da immagine che segue:

    6W9Qj6E

    ottenendo il messaggio di 1058 sostituzioni operate e vededo sparire il popolo degli errori dal foglio.

    Proviamo a vedere cosa succede modificando la tabella dei livelli intermedi e vediamo che tutto funziona fino a quando diamo almeno una livello presente, mentre va in errore quando non diamo alcun livello. L'errore torna a sparire se diamo un livello con valori nulli sia di y che di Af. Ok

    L'errore si manifesta per il fatto che quando il numero totale dei livelli presenti è zero, il range dinamico "livelli" non viene creato e quindi è come se passassimo alla funzione un nome inesistente. Poca cosa che potremmo anche risolvere all'interno della funzione stessa controllando che in effetti il range passato sia valido o meno. Ma non me ne preoccupo e pubblicherò il tutto cosi come l'ho modificato.
    Saluti

    Dimenticavo che occorre ancora modificare lo schema della sezione prevedendo il disegno dei tondini relativi ai diversi livelli. Cosa che farò poi con calma.

    dal link che segue scaricate la nuova variante:

    https://app.box.com/s/n5umnz2dkgtngcjfya78
     
    Top
    .
  6.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,165
    Reputation
    +294

    Status
    Offline
    Aggiornato il file con :

    - eliminazione del parametro AfParete
    - disegno di sei layer di armature intermedie.

    jXdJQYY



    https://app.box.com/s/n5umnz2dkgtngcjfya78
     
    Top
    .
  7.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,939
    Reputation
    +187

    Status
    Offline
    I tondini hanno solamente valore 'simbolico'.
    Ovvero, visto che l'input è una generica area di armatura la parte di disegno non ha idea che essa si 'estrinsechi' in 1-2-3-∞ tondini.

    Non voglio affatto mortificarti ;) ma se organizzavi questa porzione di tabella come per le armature inferiori e superiori, avresti avuto invece del numero layer (di fatto una informazione....inutile?) il numero barre, il diametro, l'area totale determinata da formula di foglio, e l'aggiunta della necessaria profondità della barra dal lembo compresso. Mantenendo congruenza con l'input superiore.
     
    Top
    .
  8.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,165
    Reputation
    +294

    Status
    Offline
    CITAZIONE (zax2013 @ 14/5/2014, 12:13) 
    I tondini hanno solamente valore 'simbolico'.

    esatto
    il disegno dei tondini di parete è fatto ipotizzando che ciascun layer sia composto da due tondini di diametro da me fissato a piacere.

    Colgo il tuo appunto per ricordare che il foglio che ho predisposto è solo una mascherina utile per ricordare il significato dei parametri e dei flag e che in effetti quello che conta sono le funzioni e la cartelletta del progetto in VBA.
    Quelloc he si deve utilizzare non è il foglio bensì il codice da trasferire nel proprio progetto.

    Aggiungo in risposta alla parte finale del tuo messaggio, che chiunque può procedere ad apportare le modifiche al foglio organizzandolo come meglio crede. Può quindi aggiungere delle colonne prima della tabella "livelli" una per l'inserimento del numero dei tondini, altra per l'inserimento del loro diametro e far quindi calcolare Af mediante formule di foglio.
     
    Top
    .
  9. lennon1983
        +1   -1
     
    .

    User deleted


    ragazzi che produzione. Sto anche cominciando a comprednere il linguaggio di programmazione...
    Complimenti
     
    Top
    .
  10.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,165
    Reputation
    +294

    Status
    Offline
    CITAZIONE (lennon1983 @ 14/5/2014, 17:54) 
    ragazzi che produzione. Sto anche cominciando a comprednere il linguaggio di programmazione...
    Complimenti

    Prenditi almeno l'onere di verificare qualche risultato ottenuto con le funzioni confrontandole con quelle ottenute dal mitico VCASLU del mitologico Gelfi.
    E portarne magari il report qui.
     
    Top
    .
  11. lennon1983
        +1   -1
     
    .

    User deleted


    già fatto. appena ho qualche minuto vi faccio un reportino. Sono tornato a lavoro in questi giorni dopo una settimana di malattia (e di studio) e quindi non ho ancora fatto a tempo.
     
    Top
    .
  12. enterprise_ing
        +1   -1
     
    .

    User deleted


    @afazio

    Ho notato che il calcolo del momento resistente nella versione VerSezSLU07032 fornisce valori diversi rispetto al calcolo in VerSezSLU06.

    Mi aiuti a capire da dove nasce la differenza?

    Ad. es.
    B=1000
    H=400
    c=38
    Afinf=1206
    Afsup=1206
    Afparete=0
    fcd=14,17
    fyd=391,3
    Ned=-69,69

    Ottengo un Mrd (flag 50) pari a
    -172,59 per VerSezSLU06
    -174,09 per VerSezSLU07032
     
    Top
    .
  13.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Member
    Posts
    2,939
    Reputation
    +187

    Status
    Offline
    Enterprise, sbagli a chiedere ad Afazio.

    Le ultime revisioni del file sono opera del lavoro 'congiunto' di Texitaliano e di Reversi.
    Hanno apportato qualche variazione nelle condizioni di convergenza, e nella suddivisione in striscioline della parte compressa della sezione.

    Comunque con il mio programma (il cui codice è quello, afazio, Tex, g.iaria, Reversi, lo hanno tradotto in VBA, apportando qualche variazione), io ottengo:

    Mrd=173.90 kN

    Ovvero un valore intermedio a quelli da te riscontrati (la differenza potrebbe essere dovuta a: diverso numero di striscioline in cui è stata suddivisa la zona compressa, ma più probabilmente all'area delle armature, che io inserisco come diametro e determino quindi come area, con qualche scostamento quindi rispetto a 1206 mm da te riportato).

    In ultimo: perchè fcd=14.17 MPa, invece che i più corretti 14.11 MPa?
    (Per cronaca: il 173.90 diventa 173.80 con il 14.11).


    Edit: Scusatemi, ritenevo di scrivere nella discussione relativa alla verifica a pressoflessione di sezioni generiche.

    Edited by zax2013 - 19/8/2014, 17:43
     
    Top
    .
  14.     +1   -1
     
    .
    Avatar

    Advanced Member

    Group
    Administrator
    Posts
    8,165
    Reputation
    +294

    Status
    Offline
    CITAZIONE (zax2013 @ 19/8/2014, 17:28) 
    Enterprise, sbagli a chiedere ad Afazio.

    No zax. Trattasi della mia UDF ed in questa ho lavorato solo io e nasce molto prima della traduzione del tuo codice.

    Il motivo per cui Enterprise ottiene diversi valori del momento resistente a parità di dati di input potrebbe essere ascrivibile a diversi parametri interni alla funzione (e quindi non visibili all'esterno) come il numero di divisioni e la tolleranza.
    Ricordo anche che in una occasione fu lo stesso Enterprise a chiedere come "alleggerire" i tempi di calcolo ed allora lo istruii ad entrare all'interno del codice e variare i parametri

    - Dim diVisioni As Integer ' numero di strisce in cui si suddivide la sezione
    diVisioni = 100 ' variare questa variabile per aumentare o diminuire la precisione di calcolo


    Dim precisione As Double ' variabile che gestisce la precisione oltre cui non procedere (tolleranza)
    Dim numeroCicli As Integer ' variabile che stabilisce il numero massimo di interazioni entro cui trovare la convergenza. Se non viene trovata entro questo numero allora il problema si considera non convergente e le soluzioni non sono ricavate

    precisione = 0.01
    numeroCicli = 1000

    Può quindi darsi che nelle due versioni che stai confrontando vi sia una diversa impostazione dei parametri interni.
     
    Top
    .
  15. enterprise_ing
        +1   -1
     
    .

    User deleted


    CITAZIONE (zax2013 @ 19/8/2014, 17:28) 
    Enterprise, sbagli a chiedere ad Afazio.

    Le ultime revisioni del file sono opera del lavoro 'congiunto' di Texitaliano e di Reversi.
    Hanno apportato qualche variazione nelle condizioni di convergenza, e nella suddivisione in striscioline della parte compressa della sezione.

    Comunque con il mio programma (il cui codice è quello, afazio, Tex, g.iaria, Reversi, lo hanno tradotto in VBA, apportando qualche variazione), io ottengo:

    Mrd=173.90 kN

    Ovvero un valore intermedio a quelli da te riscontrati (la differenza potrebbe essere dovuta a: diverso numero di striscioline in cui è stata suddivisa la zona compressa, ma più probabilmente all'area delle armature, che io inserisco come diametro e determino quindi come area, con qualche scostamento quindi rispetto a 1206 mm da te riportato).

    In ultimo: perchè fcd=14.17 MPa, invece che i più corretti 14.11 MPa?
    (Per cronaca: il 173.90 diventa 173.80 con il 14.11).

    Grazie...
    Confermo che il valore corretto è 14,11 ma che ho lasciato 14,17 perché trovato all'interno del file VerSezSLU06...

    Comunque, incollo immagine a sostegno del 174,09 con il VerSezSLU07032.

    https://app.box.com/s/lla2v7aaloiqw1yubvyl

    In ogni caso, mi sembra ci sia differenza non trascurabile nei confronti del VerSezSLU06 !

    Forse qualcosa ha a che fare con lo snervamento max dell'acciaio, diverso nei due fogli?

    GRAZIE
     
    Top
    .
111 replies since 18/1/2014, 19:57   10043 views
  Share  
.