J'ai essayé de déboguer cette erreur ces derniers jours, je me suis demandé si quelqu'un avait des conseils sur la façon de procéder.
Je résous l'équation de Poisson pour une distribution de charge par étapes (un problème courant en électrostatique / physique des semi-conducteurs) sur un maillage de volume fini non uniforme où l'inconnu est défini sur les centres des cellules et les flux sur les faces des cellules.
le profil de charge (le terme source) est donné par:
et les conditions aux limites sont,
et le domaine est .
J'utilise du code développé pour résoudre l'équation d'advection-diffusion-réaction (je me suis écrit voir mes notes ici, http://danieljfarrell.github.io/FVM ). L'équation advection-diffusion-réaction est un cas plus général de l'équation de Poisson. En effet, l'équation de Poisson peut être récupérée en mettant la vitesse d'advection à zéro et en supprimant le terme transitoire.
Le code a été testé contre un certain nombre de situations pour des grilles uniformes, non uniformes et aléatoires et produit toujours des solutions raisonnables ( http://danieljfarrell.github.io/FVM/examples.html ) pour l'équation d'advection-diffusion-réaction.
Pour montrer où le code tombe en panne, j'ai fait l'exemple suivant. J'ai installé un maillage uniforme de 20 cellules, puis je l'ai rendu non uniforme en supprimant une seule cellule. Dans la figure de gauche, j'ai supprimé la cellule et dans la droite a été supprimée. La neuvième cellule couvre la région où le terme source (c'est-à-dire la charge) change de signe. Le bogue apparaît lorsque la grille n'est pas uniforme dans une région où le terme de réaction change de signe . Comme vous pouvez le voir ci-dessous.Ω 9
Des idées, quelle pourrait être la cause de ce problème? Faites-moi savoir si de plus amples informations concernant la discrétisation seraient utiles (je ne voulais pas ajouter trop de détails à cette question).
la source
Réponses:
En passant, votre documentation github est fantastique.
Ce n'est qu'une supposition des méthodes DG, qui peuvent avoir des problèmes similaires si les flux numériques ne sont pas choisis avec soin (je suppose que les méthodes FV sont un sous-ensemble des méthodes DG). Si vous utilisez l'interpolation à partir des centres cellulaires pour définir vos flux, cela devrait être équivalent à utiliser la moyenne comme flux numérique dans DG et à utiliser une base constante par morceaux. Pour les méthodes DG standard pour Poisson, cela conduit à des solutions numériquement non uniques - vous pouvez obtenir un espace nul non trivial pour l'opérateur discret, ce qui, à mon avis, est à l'origine de vos problèmes dans le deuxième exemple. Voir ce document DG pour leur théorie à ce sujet du côté DG.
Je vais essayer de simuler un exemple pour FV qui montre comment cela entre en jeu.
Edit: voici donc un petit exemple de ce qui se passe. Considérez les cellules 1-9 et 11-20 dans lesquelles . Du côté droit (11-20), nous avons raison de la condition de Neumann, qui nous indique par conservation pour cette cellule que . Puisque le flux est la moyenne des valeurs des cellules, cela nous indique que est constant sur toutes ces cellules.ρ(x)=0 f(x20)=0 f(x19)=…=f(x11)=0 ϕ(x)
Du côté gauche (1-9), nous avons . Si et que nous utilisons des cellules fantômes, alors . La conservation sur les quelques cellules suivantes donne que (c'est-à-dire pente constante). Cependant, notez que cela peut être n'importe quelle pente, juste constante.f(xi+1)−f(xi)=0 f(−10)=0 f(−10)=ϕ9.5−ϕghost=ϕ9.5 f(xi)=f(−10)=ϕ9.5
Le problème survient dans la cellule du milieu. Comme Jan l'a mentionné, vous sous-échantillonnez le forçage dans le deuxième maillage. Cela jette les équations d'équilibre à ce point, vous donne une erreur dans , qui se propage ensuite vers l'arrière et gâche à la fois la pente dans la moitié gauche du domaine ainsi que la valeur de .f(10) ϕ(9.5)
Cette sensibilité aux erreurs de forçage est ce qui pose problème - contrairement aux méthodes FEM ou FD qui appliquent explicitement la condition de Dirchlet à , FV l'applique faiblement en utilisant des nœuds fantômes. Intuitivement, l'imposition faible du nœud fantôme revient à définir également une condition Neumann à votre limite gauche. Si vous avez deux conditions Neumann pour un problème de diffusion, votre problème est mal posé et a une solution non unique (vous pouvez ajouter n'importe quelle constante à ce problème et toujours avoir une solution). Vous n'obtenez pas tout à fait cela au niveau discret ici, mais vous obtenez un comportement très sensible et dépendant du maillage comme vous le voyez dans vos expériences.x=−10
la source
La première chose à noter est vos conditions aux limites. Comme vous pouvez modifier la pente et la valeur, vous n'avez ni conditions de Dirichlet, ni Neumann.
Ensuite, chaque ligne droite est une solution où le côté droit est nul. Vous avez cette partie.
Vos flux dépendent probablement de . Utilisez-vous le bon où vous éliminez une cellule?hh h
la source