Comment mettre en œuvre efficacement les conditions aux limites de Dirichlet dans les matrices de raidnes globales à éléments finis clairsemées


9

Je me demande comment les conditions aux limites de Dirichlet dans les matrices d'éléments finis clairsemées globales sont effectivement mises en œuvre efficacement. Par exemple, disons que notre matrice d'éléments finis globale était:

K=[520-102410001632-1037000203]et vecteur de droiteb=[b1b2b3b4b5]

Ensuite, pour appliquer une condition de Dirichlet sur le premier nœud ( ), nous allons mettre à zéro la première ligne, mettre un 1 à K 11 et soustraire la première colonne du côté droit. Par exemple, notre système deviendrait: 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 ]X1=cK11

K=[1000004100016320037000203]et vecteur de droiteb=[cb2-2×cb3-0×cb4+1×cb5-0×c]

K=[100002410001632-1037000203]et vecteur de droiteb=[cb2b3b4b5]

K11

K=[1.0e6420-102410001632-1037000203]et vecteur de droiteb=[c×1.0e64b2b3b4b5]

Les avantages de cette méthode sont qu'elle maintient la symétrie de la matrice tout en étant très efficace pour les formats de stockage clairsemés. Mes questions sont alors les suivantes:

Comment les conditions aux limites de Dirichlet sont-elles généralement implémentées dans les codes d'éléments finis pour la chaleur / les fluides? Les gens utilisent-ils généralement la méthode des grands nombres ou font-ils autre chose? Y a-t-il un inconvénient à la méthode des grands nombres que quelqu'un peut voir? Je suppose qu'il existe probablement une méthode standard efficace utilisée dans la plupart des codes commerciaux et non commerciaux qui résout ce problème (évidemment, je ne m'attends pas à ce que les gens connaissent tous les rouages ​​internes de chaque solveur commercial à éléments finis, mais ce problème semble fondamental / fondamental assez que quelqu'un a probablement travaillé sur de tels projets et pourrait fournir des conseils).


2
Avez-vous des preuves que cela vous ralentit considérablement?
Bill Barth

@BillBarth Oui, bien qu'il y ait toujours la possibilité que je fasse quelque chose de manière inefficace. Gennadily lui-même écrit que, même si la méthode explicite est facile pour les tableaux 2D complets, "... il n'est pas toujours facile d'accéder aux lignes et colonnes de la matrice lorsqu'une matrice est au format compact." ce qui suggère que la méthode explicite peut être plus difficile à mettre en œuvre efficacement. Comme mon code est actuellement écrit, la méthode explicite peut prendre plus de temps que la résolution réelle.
James

1
faites-le comme le dit Wolfgang et appliquez des conditions aux limites des matrices d'éléments avant de les assembler.
Bill Barth

@BillBarth Oui, je pense que je vais le faire. Ses vidéos sont incroyables! Je viens de lui laisser un commentaire / question à savoir si vous devez réassembler les matrices globales à chaque pas de temps, après quoi je pense que j'accepterai sa réponse.
James

Réponses:


11

Dans deal.II ( http://www.dealii.org - clause de non-responsabilité: je suis l'un des principaux auteurs de cette bibliothèque), nous éliminons les lignes et les colonnes entières, et ce n'est pas trop cher dans l'ensemble. L'astuce consiste à utiliser le fait que le modèle de densité est généralement symétrique, de sorte que vous savez quelles lignes vous devez examiner lors de l'élimination d'une colonne entière.

À mon avis, la meilleure approche consiste à éliminer ces lignes et colonnes dans les matrices de cellules, avant de les ajouter à la matrice globale. Là, vous travaillez avec des matrices complètes, donc tout est efficace.

Je n'ai jamais entendu parler de l'approche des grands nombres et je ne l'utiliserais pas car cela entraînera sûrement des problèmes terriblement mal conditionnés.

Pour référence, les algorithmes que nous utilisons dans deal.II sont décrits conceptuellement dans les cours 21.6 et 21.65 à http://www.math.colostate.edu/~bangerth/videos.html . Ils correspondent étroitement à votre description.


2
Dans le cas d'un problème dépendant du temps (disons l'équation de la chaleur), réassemblez-vous la matrice globale à chaque pas de temps? La raison pour laquelle je pose la question est que dans le cas de conditions Dirichlet non nulles, vous avez besoin d'informations de la matrice globale d'origine lors de la modification du côté droit, mais si vous avez mis à zéro ces colonnes lors du pas de temps précédent, ces informations sont perdues (sauf si vous les stockez dans des tableaux supplémentaires). Ce ne serait pas un problème si la matrice globale est réassemblée à chaque pas de temps, ce qui est ce que j'envisage de faire et ce qui devrait être fait de toute façon si vous utilisez un maillage adaptatif.
James

1
Cela dépend de l'application. Tous les "gros" codes résolvent des problèmes dépendant du temps non linéaires, et pour ceux-ci, il est clair que vous devez réassembler d'une manière ou d'une autre. Pour les codes linéaires, vous pouvez simplement stocker la matrice d'origine, et à chaque étape de temps la copier ailleurs, appliquer des conditions aux limites, puis les utiliser dans le solveur. Cela nécessite juste plus de mémoire, mais est par ailleurs bon marché.
Wolfgang Bangerth

1
Ah je vois que c'est ce que je soupçonnais. Je vais mettre en œuvre comme vous l'avez suggéré. C'est pour votre aide. Ces vidéos de tutoriel deallii sont vraiment bonnes btw!
James

2

Zéro BC est facile. Pour les BC non nuls, vous pouvez également utiliser des multiplicateurs de Lagrange. Par exemple, voir ici . L'un des avantages des LM est que vous pouvez utiliser n'importe quelle équation de contrainte, bien que le système devienne indéfini, vous avez donc besoin d'un solveur approprié.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.