W ciągu ostatnich kilku dni próbowałem debugować ten błąd. Zastanawiałem się, czy ktoś ma porady, jak postępować.
Rozwiązuję równanie Poissona dla rozkładu ładunku krokowego (powszechny problem w elektrostatyce / fizyce półprzewodników) na niejednorodnej siatce o skończonej objętości, w której nieznane są zdefiniowane w centrach komórek i strumienie na powierzchniach komórek.
profil opłat (termin źródłowy) podaje:
a warunki brzegowe są
a domena to .
Korzystam z kodu opracowanego do rozwiązania równania dyfuzja-doradztwo-reakcja (sam napisałem, aby zobaczyć moje notatki tutaj, http://danieljfarrell.github.io/FVM ). Równanie rada-dyfuzja-reakcja jest bardziej ogólnym przypadkiem równania Poissona. Rzeczywiście równanie Poissona można odzyskać, ustawiając prędkość doradczą na zero i usuwając składnik przejściowy.
Kod został przetestowany pod kątem różnych sytuacji dla jednolitych, niejednorodnych i losowych siatek i zawsze daje rozsądne rozwiązania ( http://danieljfarrell.github.io/FVM/examples.html ) dla równania dyfuzja-doradztwo-reakcja.
Aby pokazać, gdzie kod się psuje, podałem następujący przykład. Ustawiam jednolitą siatkę złożoną z 20 komórek, a następnie robię to niejednorodną , usuwając pojedynczą komórkę. Na lewym rysunku usunąłem komórkę a po prawej zostało usunięte. Dziewiąta komórka obejmuje region, w którym termin źródłowy (tj. Ładunek) zmienia znak. Błąd pojawia się, gdy siatka jest nierównomierna w regionie, w którym znak reakcji zmienia znak . Jak widać poniżej.
Wszelkie pomysły, co może być przyczyną tego problemu? Daj mi znać, jeśli pomocne byłyby dodatkowe informacje dotyczące dyskretyzacji (nie chciałem umieszczać zbyt wielu szczegółów w tym pytaniu).