Il metodo degli elementi finiti applicato alla soluzione di un'equazione
differenziale lineare e stazionaria, cioè indipendente dal tempo, genera un
sistema lineare la cui soluzione rappresenta il vettore dei valori che la
funzione incognita assume sui nodi con i quali è stato discretizzato il
dominio di integrazione. La matrice di tale sistema è generalmente chiamata
matrice di rigidezza e nel seguito verrà indicata con il simbolo .
Ad esempio, nella soluzione del problema dell'equilibrio elastico di una
struttura gli elementi di
corrispondono alle rigidezze associate ai nodi
della griglia di calcolo e risultano funzione del modulo di Young e del
rapporto di Poisson del materiale che costituisce il corpo in esame.
Analogamente, nella soluzione di un problema di flusso
contiene i termini
di trasmissività del corpo drenante, funzione della permeabilità e degli
spessori associati a ciascun nodo della griglia.
La topologia della matrice di rigidezza, vale a dire l'ubicazione dei
coefficienti non nulli in , descritta nella memorizzazione compatta CRS
dai vettori interi JA e IA, è determinata univocamente
dalla mesh di calcolo con cui si è discretizzato il dominio di interesse.
In particolare, è la rete dei contatti nodali nella maglia computazionale
a stabilire la posizione degli elementi non nulli di
. Gli elementi
non nulli della riga
corrispondono infatti agli indici di colonna
dei
nodi con cui
risulta in contatto.
Per chiarire il concetto, ci si riferisca al patch di elementi riportato in
Figura 1. Ad esempio, nella riga 7, relativa al valore assunto
dalla funzione incognita nel nodo 7, gli elementi di non nulli saranno:
![]() |
A partire dalla tabella dei contatti nodali, definita dalla maglia
computazionale, è dunque possibile costruire i vettori JA e IA
che individuano la topologia di . Vediamo nel dettaglio l'implementazione
di questa procedura sull'esempio di Figura 2. La mesh di calcolo
viene descritta dalla successione dei nodi e dalla topologia degli elementi.
Avremo pertanto in input le seguenti strutture dati:
4 | : numero di nodi ![]() |
||
1 | ![]() |
![]() |
|
2 | ![]() |
![]() |
|
3 | ![]() |
![]() |
|
4 | ![]() |
![]() |
2 | : numero di elementi ![]() |
||||
1 | 2 | 1 | 4 | 1 | |
2 | 4 | 3 | 2 | 1 |
Applichiamo ora una procedura automatica che consenta di costruire JA
dal file topol. Definiamo come il massimo numero di contatti
nodali ammessi dalla griglia del problema, cioè il massimo numero di
elementi non nulli che possiamo trovare su ciascuna riga di
. Nel caso in
esame,
e di conseguenza il massimo numero di elementi non nulli da
memorizzare sarà
. Il vettore JA viene generato
come una successione di
componenti intere, inizialmente nulle, che
possiamo interpretare come
celle, corrispondenti alle
righe di
,
ciascuna composta di
elementi. In esse andranno inseriti gli indici di
colonna degli elementi non nulli incontrati in ciascuna riga:
La procedura seguita per la costruzione di JA può quindi essere riassunta nel seguente algoritmo:
001
002 Per
003 JA
004 Fine Per
005 Per con passo
006 JA
007 Fine Per
008 Per
009 ordinamento nodi in senso crescente in I1(3)
010 Per
011
012 Per
013
014 Se JA
015 JA I1
016 vai all'istruzione 030
017 Fine Se
018 Se JA I1
019 vai all'istruzione 013
020 Fine Se
021 Se JA I1
022 sposta gli elementi della cella una posizione in avanti
023 controlla che la posizione dell'ultimo elemento sia
I1
024 JA I1
025 vai all'istruzione 030
026 Fine Se
027 Se JA I1
028 vai all'istruzione 030
029 Fine Se
030 continua
031 Fine Per
032 Fine Per
033 Fine Per
La costruzione del vettore IA è ora quasi immediata. La posizione
dell'elemento diagonale della riga corrisponde, infatti, al primo
elemento della cella
in JA, vale a dire
. Il
valore così determinato va quindi depurato del numero di zeri rimasti
nelle celle precedenti. Il corrispondente algoritmo può pertanto essere
scritto nel modo seguente:
001 IA(1):=1
002 Per con passo
003
004 Per
005 Se JA
006
007 Fine Se
008 Fine Per
009
010 IA IA
011 Fine Per
Si noti che mediante l'algoritmo appena riportato la componente -esima
di IA viene calcolata automaticamente.
Infine, è necessario compattare il vettore JA eliminando tutti gli
zeri in esso contenuti. Per far questo è sufficiente scorrere le componenti
di JA e, quando si incontra una componente nulla, spostare tutte le
successive indietro di una posizione. Il numero di termini non nulli di
JA, che alla fine della procedura sono raggruppati nelle prime posizioni,
è il vero .
Per eseguire in modo più efficiente questa operazione conviene, mano a mano
che si scorrono le componenti di JA, contare i termini non nulli e
spostare l'-esimo termine diverso da zero in posizione
. Tale posizione
sarà necessariamente minore o tutt'al più uguale all'indice della componente
raggiunta nello scorrimento. Per effettuare la compattazione di JA si
può pertanto utilizzare il seguente algoritmo:
001
002 Per
003 Se JA
004
005 JA JA
006 Fine Se
007 Fine Per
008
Poiché sappiamo che IA deve essere uguale a
, ma i due
termini sono stati calcolati indipendentemente uno dall'altro, è sempre
consigliabile controllare la consistenza della procedura verificando che
effettivamente tale condizione sia rispettata.
Un'implementazione efficiente degli algoritmi per la costruzione della topologia della matrice di rigidezza è proposta nella subroutine TOPOL.F, messa a disposizione dello studente.