MatLab Differenze Finite su dominio non rettangolare

mk89ing1
Salve a tutti, disperato gioco la carta aiuto da casa.
Allora, ho un condotto interpalare (senza la presenza delle pale) di una pompa. Quello che sto cercando di fare è applicare il metodo delle differenze finite per ricercare la funzione di corrente e quella potenziale all'interno del condotto.
Fatta la discretizzazione del condotto (x e y dei vari nodi interni) ho la necessità di andare ad associare ad ogni nodo i 4 che lo circondano. E qui è buio totale. ho tutte le coordinate dei nodi interni e dei punti con cui ho costruito il condotto ma proprio non riesco ad uscire da questo problema. Vi prego sono disperato :cry: :cry:

Risposte
Raptorista1
Ciao, come sono messi i tuoi nodi? Sono a caso o con qualche ordine? Puoi mostrare un pezzo della mesh?

mk89ing1
In pratica i nodi sono stati calcolati con il primo in basso a sinistra salendo verso la corona

Raptorista1
Questa griglia non ha un aspetto particolarmente bello, ma è quello che succede di solito quando si usano le differenze finite per domini non cartesiani.
Se vuoi tenere traccia di quali nodi sono "vicini" a quali altri, con una griglia che non è completamente strutturata non hai molto da fare se non memorizzare una matrice \(n \times 4\) in cui nella riga \(i\)-esima compaiono gli indici dei quattro nodi "vicini" al nodo \(i\). Fai attenzione che non è nemmeno garantito che ci siano esattamente quattro nodi vicini, ad esempio per alcuni nodi sul bordo non è chiaro quali siano e quanti siano questi nodi vicini.
Che tipo di equazioni devi risolvere? Forse ti semplificheresti la vita con un metodo diverso, o facendo la griglia in un altro modo.

mk89ing1
In pratica devo risolvere l'equazione di Laplace e tracciare per interpolazione un paio di linee di corrente significative ( 25% 50% 75%). Il contorno superiore corrisponde alla linea di corrente Psi=100% mentre la linea inferiore, cioè il profilo del mozzo, corrisponde alla linea di corrente Psi=0%. Tutti i nodi hanno 4 "vicini", nel caso di nodi vicini al bordo può succedere che il nodo accanto non sia quello definito dalla griglia "ufficiale" ma si venga a creare una griglia tagliata con un nodo che cade esattamente sul bordo stesso del mozzo (immagine esemplificativa).
In più coi miei compagni avevamo pensato di creare un'unica matrice nella quale mettere nelle varie colonne: [Xnodo Ynodo Lambda1 Lambda2 Lambda3 Lambda4 (Xnodo a destra) (Ynodo a destra) (Xnodo a sinistra) (Ynodo a sinistra)] In questo modo crediamo (speriamo) di venirne a capo. Per delucidazione Lambda è distanza relativa tra i nodi riferita alla lunghezza nominale della griglia

Raptorista1
Nel caso del nodo numero 1 della tua immagine precedente, quali sono i suoi quattro vicini? E del nodo immediatamente a destra del nodo 1?
Quali condizioni al bordo hai per l'equazione?

mk89ing1
Per il nodo #1 non vi è bisogno di una definizione dei nodi adiacenti in quanto la funzione da calcolare Psi è nota a priori. La risoluzione del campo fluido è legata solamente ai nodi interni della mesh mentre tutti i gli altri diventano che giacciono sul contorno sono i termini noti.
Come condizioni al contorno ho: PSI=0 lungo il profilo inferiore (profilo del mozzo), PSI=100 lungo il profilo superiore (profilo di corona).
L'algoritmo di base (per quanto dice il prof) consiste nello scrivere l'equazione e di risolverla col metodo del rilassamento attraverso più iterazioni.

Raptorista1
Ok, con condizioni di Dirichlet è vero quello che dici sui nodi adiacenti. La formula non mi è familiare, ma immagino sia una qualche media pesata che approssima la derivata. Tornando al problema principale, la tua griglia non è strutturata e quindi secondo me conviene memorizzare una matrice come dicevo sopra. Non ho capito cosa sono queste \(\lambda\): non si possono calcolare direttamente dalle coordinate dei nodi senza memorizzarle?

mk89ing1
Quella formula deriva dall'applicazione del concetto di derivata visto no come limite ma come differenza finita all'equazione di Laplace.
Per quanto riguarda lambda è semplicemente la distanza tra due nodi adiacenti diviso la spaziatura della griglia di discretizzazione. Serve per tenere conto dei nodi vicini al bordo dove la distanza non è uguale allo spazio tra i nodi interni proprio per via della presenza fisica del contorno.
Per rispondere alla tua domanda si è possibile calcolarle ma avevamo pensato che averle in un array fosse più comodo in termini di codice (premettendo che il programma non è fatto per vincere le olimpiadi del codice più veloce :D .
Ma a questo punto vorrei sapere cosa intendi per griglia strutturata e come affronteresti tu la discretizzazione

Raptorista1
Una griglia è strutturata se sai indicare i nodi adiacenti ad un nodo dato in un modo che è indipendente dal nodo in questione. Tipicamente si mettono in corrispondenza i nodi con delle coordinate intere, in modo che il nodo \((i,j)\) sia adiacente ai nodi \((i+1,j)\), \((i,j+1)\) e così via. Questo è difficile da fare perché sui bordi i nodi non sono più allineati, eccetera. Memorizzare i numeri va bene uguale, la discretizzazione va bene.

mk89ing1
Posso chiederti se hai a disposizione un esempio o un pezzo di codice per riuscire a capire come indicizzare il mio problema o quanto meno provarci.

Raptorista1
Se la fai non strutturata, puoi indicizzare i nodi come vuoi.

mk89ing1
Buongiorno Raptorista,
alla fine ho risolto nel più estremo dei modi. Il codice iniziale si proponeva di essere completamente automatico qualunque fosse il dominio di partenza. Il problema fondamentale è proprio il tipo di discretizzazione utilizzata. Con l'ausilio di Autocad ed Excel alla fino non ho fatto altro che trascrivere le coordinate dei nodi in un foglio Excel e importarle in matlab.
Sicuramente proverò ad automatizzare almeno il passaggio Autocad-->Excel appena capisco perché il comando DATAEXTRACTION non funziona :smt012 .


Rispondi
Per rispondere a questa discussione devi prima effettuare il login.