Mi chiedo come le condizioni al contorno di Dirichlet nelle matrici globali di elementi finiti sparsi siano effettivamente implementate in modo efficiente. Ad esempio, supponiamo che la nostra matrice globale di elementi finiti fosse:
Quindi per applicare una condizione di Dirichlet sul primo nodo ( ) dovremmo azzerare la prima riga, mettere un 1 in e sottrarre la prima colonna dal lato destro. Ad esempio il nostro sistema diventerebbe: K = \ begin {bmatrix} 1 & 0 & 0 & 0 & 0 \\ 0 & 4 & 1 & 0 & 0 \\ 0 & 1 & 6 & 3 & 2 \\ 0 & 0 & 3 & 7 & 0 \\ 0 & 0 & 2 & 0 & 3 \ end {bmatrix} \ hspace {5mm} \ text {e vettore sul lato destro} \ hspace {5mm} b = \ begin {bmatrix} c \\ b2-2 \ times {c} \\ b3-0 \ times {c} \\ b4 + 1 \ times {c} \\ b5-0 \ times {c} \\ \ end {bmatrix} K 11 K = [ 1 0 0 0 0 0 4 1 0 0 0 1 6 3 2 0 0 3 7 0 0 0 2 0 3 ]
Questo va bene in teoria, ma se la nostra matrice K è memorizzata nel formato di riga compressa (CRS), spostare le colonne sul lato destro diventa costoso per i sistemi di grandi dimensioni (con molti nodi che sono dirichlet). Un'alternativa sarebbe quella di non spostare le colonne corrispondenti a una condizione di Dirichlet sul lato destro, ovvero il nostro sistema diventerebbe:
Ciò ha tuttavia un grande inconveniente in quanto il sistema non è più simmetrico e quindi non potremmo più utilizzare il gradiente coniugato precondizionato (o altri solutori simmetrici). Una soluzione interessante che ho trovato è il "Metodo dei grandi numeri" che ho trovato nel libro "Programmazione di elementi finiti in Java" di Gennadiy Nikishkov. Questo metodo utilizza il fatto che la doppia precisione contiene solo circa 16 cifre di precisione. Invece di mettere un 1 nella posizione posizioniamo un numero elevato. Ad esempio il nostro sistema diventa: K = [ 1.0 e 64 2 0 - 1 0 2 4 1 0 0 0 1 6 3 2 - 1 0 3 7 0 0 0 2 0 3 ]
I vantaggi di questo metodo sono che mantiene la simmetria della matrice pur essendo molto efficiente per i formati di archiviazione sparsi. Le mie domande quindi sono le seguenti:
Come vengono tipicamente implementate le condizioni al contorno di Dirichlet in codici ad elementi finiti per calore / fluidi? Le persone usano il metodo di grandi numeri di solito o fanno qualcos'altro? C'è qualche svantaggio nel metodo dei grandi numeri che qualcuno può vedere? Suppongo che ci sia probabilmente un metodo standard efficiente usato nella maggior parte dei codici commerciali e non commerciali che risolve questo problema (ovviamente non mi aspetto che le persone conoscano tutti i meccanismi interni di ogni risolutore di elementi finiti commerciali, ma questo problema sembra fondamentale / fondamentale abbastanza che qualcuno probabilmente ha lavorato a tali progetti e potrebbe fornire una guida).