Je travaille sur un projet où j'ai deux domaines couplés adv-diff via leurs termes sources respectifs (un domaine ajoute de la masse, l'autre soustrait la masse). Par souci de concision, je les modélise en régime permanent. Les équations sont votre équation de transport d'advection-diffusion standard avec un terme source ressemblant à ceci:
Où est le flux diffusif et advectif pour l'espèce , et est le terme source pour l'espèce .
J'ai pu écrire un solveur pour mon problème en utilisant la méthode de Newton-Raphson, et j'ai complètement couplé les deux domaines en utilisant une matrice de masse de bloc, à savoir:
Le terme est utilisé pour déterminer la matrice jacobienne et mettre à jour à la fois et :
ou
Pour accélérer les choses, je ne calcule pas le jacobien à chaque itération - en ce moment, je joue avec toutes les cinq itérations, ce qui semble fonctionner assez bien et maintenir la solution stable.
Le problème est: je vais passer à un système plus grand où les deux domaines sont en 2D / 2.5D, et le calcul de la matrice jacobienne va rapidement épuiser mes ressources informatiques disponibles. Je construis ce modèle pour être utilisé dans un paramètre d'optimisation plus tard, donc je ne peux pas non plus être derrière le volant à chaque itération pour régler le facteur d'amortissement, etc.
Ai-je raison de chercher ailleurs un algorithme plus robuste et plus adapté à mon problème, ou est-ce aussi bon que possible? J'ai examiné un peu la quasi-linéarisation, mais je ne sais pas dans quelle mesure elle est applicable à mon système.
Y a-t-il d'autres algorithmes lisses que j'ai pu manquer qui peuvent résoudre un système d'équations non linéaires sans avoir à recalculer le jacobien comme offen?
Réponses:
Je suppose que la limitation en 2D et 3D stocke le jacobien.
Une option consiste à conserver les dérivées temporelles et à utiliser un "pseudo" pas de temps explicite pour itérer jusqu'à l'état stationnaire. Normalement, le nombre CFL dont vous avez besoin pour les systèmes diffusifs et réactifs peut devenir prohibitif. Vous pouvez essayer la multigrille non linéaire (elle est également appelée multigrille de stockage à approximation complète) et le pas de temps local pour accélérer la convergence.
L'autre option consiste à utiliser un schéma entièrement implicite comme vous le faites actuellement, mais pas à stocker le Jacobien global. Vous pouvez utiliser un schéma implicite sans matrice. (où est le jacobien) peut être résolu avec un solveur de sous-espace Krylov comme GMRES et BiCGStab en utilisant le fait que Cela est dû au fait que GMRES et BiCGStab ne nécessitent pas de matrice LHS , ils ont seulement besoin de pouvoir calculer son produit un vecteur .
Maintenant, avec une valeur appropriée de (généralement environ pour les flotteurs à double précision), vous pouvez exécuter une boucle de Newton sans jamais calculer ni stocker un jacobien. Je sais pertinemment que cette technique est utilisée pour résoudre certains cas non triviaux en dynamique des fluides computationnelle. Notez cependant que le nombre d'évaluations de la fonction sera supérieur à celui d'une technique de stockage matriciel, au lieu de nécessiter un produit vecteur matriciel.ϵ 10−7 F
Une autre chose à noter est que si votre système est tel qu'un préconditionneur puissant est nécessaire (c.-à-d. Jacobi ou block-Jacobi ne suffira pas), vous voudrez peut-être essayer d'utiliser la méthode mentionnée ci-dessus comme plus fluide dans un schéma multigrille. Si vous voulez essayer un préconditionneur point-ou bloc-Jacobi, vous pouvez calculer et stocker uniquement les éléments diagonaux ou blocs diagonaux du jacobien, ce qui n'est pas beaucoup. Je mentionnerais également qu'un préconditionneur Gauss-Seidel ou SSOR peut être possible à implémenter sans stocker explicitement un jacobien. Cet article décrit la mise en œuvre d'un GMRES sans matrice préconditionné avec Gauss-Seidel symétrique sans matrice dans le contexte de la dynamique des fluides computationnelle.
la source
D'après mon expérience avec les équations de Navier-Stokes, on peut très bien faire sans schémas totalement implicites.
Si vous voulez juste un schéma numérique rapide pour la solution de l'évolution temporelle, jetez un œil aux schémas IMEX (implicite-explicite); voir par exemple cet article d'Ascher, Ruuth, Spiteri Méthodes Runge-Kutta implicites-explicites pour les équations aux dérivées partielles dépendantes du temps .
Vous pouvez même essayer d'utiliser simplement un schéma d'intégration de temps d'ordre élevé explicite avec un contrôle de taille d'étape (comme Matlab
ODE45
). Cependant, vous pouvez rencontrer des problèmes en raison de la rigidité de votre système, qui provient de la partie diffusante. Heureusement, la partie diffusive est linéaire de sorte qu'elle peut être traitée implicitement (ce qui est l'idée des schémas IMEX).la source
Au début, j'ai pensé à n'ajouter qu'une remarque, mais l'espace n'était pas suffisant, alors j'ajoute une brève description de mes expériences avec ce sujet.
Tout d'abord, en regardant votre notation de je ne vois pas la forme couplée, je suppose que et doivent tous deux dépendre de et . De plus, si et sont des représentations matricielles d'approximations de et alors elles ne devraient pas dépendre seulement de , mais aussi des valeurs voisines, mais cela peut être seulement une mauvaise compréhension de votre notation .Fcoupled b1 b2 c1,i c2,i A1 A2 F1 F2 ci
En guise de commentaire général, je voudrais ajouter que l'utilisation du jacobien analytique semble être le seul moyen d'obtenir une convergence quadratique du solveur itératif non linéaire (c'est-à-dire le solveur Newton-Raphson dans votre cas). L'avez-vous observé dans votre cas? C'est assez important, car sinon il pourrait y avoir un malentendu dans vos approximations (linéarisation).
Dans toutes les applications dans lesquelles j'étais impliqué (certaines d'entre elles incluaient des calculs à grande échelle), nous n'avions jamais eu de problème avec la consommation de temps d'assemblage du jacobien, le problème le plus long était toujours d'appliquer un solveur linéaire. Le jacobien analytique (si disponible) a toujours été dans les applications sur lesquelles je travaillais sur le choix préféré en raison de la convergence quadratique. Dans quelques cas, un tel solveur non linéaire produit une matrice qui cause des problèmes à la convergence du solveur linéaire itératif, nous avons donc essayé d'utiliser une linéarisation plus simple que la jacobienne analytique pour aider le solveur linéaire. Un tel compromis entre le comportement du solveur algébrique non linéaire et linéaire en fonction de la linéarisation du système algébrique non linéaire était toujours délicat et je ne pouvais pas donner de recommandation générale.
Mais vous avez raison de dire que l'inconvénient (ou la propriété) du jacobien analytique pour le système des PDE est qu'il produit un système algébrique couplé, donc si vous découplez ce système de quelque manière que ce soit, par exemple en résolvant séparément l'approximation de chaque PDE par, disons, le fractionnement itératif méthode, puis à nouveau vous perdez la convergence quadratique du solveur global. Mais au moins si vous résolvez séparément chaque PDE discrétisé (découplé), vous pouvez à nouveau accélérer la solution de ce problème particulier en utilisant la méthode de Newton-Raphson.
la source