Програмування методу кінцевих різниць

виписувати Вручну коефіцієнти СЛАР і вводити їх в програму — не найефективніший спосіб програмування методу кінцевих різниць, тому що для кожної нової варіації постановки задачі потрібно писати нову програму. Логічніше розробити загальний солвер для більш широкого класу задач, що спростить програмування і тестування. Тестування алгоритмів МКР утруднене, так як точне рішення невідомо, але загальний солвер можна протестувати на завданнях з заданим точним рішенням.
Автором розроблено солвер Joker FDM для рішення 1 — і 2-мірних задач спряження для еліптичних рівнянь методом кінцевих різниць.
Постановка завдання
Розглядається прямокутна область. Горизонтальна сторона прямокутника поділяється на imageпроміжків, вертикальна — на imageпроміжків. Таким чином, весь прямокутник поділяється на imageпрямокутних подобластей.
У кожній image-ї підобласті image, задається система диференціальних рівнянь реакції-дифузії
image
з граничними умовами Діріхле, Неймана або Робіна та умовами спряження типу неідеального контакту або ідеального контакту.
Детальну постановку задачі див. GitHub Wiki, для перегляду формул, установіть розширення для Chrome.
Солвер застосовувався автором для обчислення рішення дифузійної моделі складного теплообміну (нелінійна система двох рівнянь).
Не у всіх скінченно-елементних решателях є функція розв'язання задач сполучення зі стрибком рішення на границі розділу (неідеальний контакт). Зазначимо пакет FEniCS, в якому є така функція.
Опис алгоритму
В області запроваджується сітка: кожен x — і y-проміжок розбивається на рівні частини.
Застосовується різницева схема 2-го порядку, описана в книзі Самарського, Андрєєва «Різницеві методи для еліптичних рівнянь».
Для лінеаризації нелінійних рівнянь використовується метод Ньютона. Цей метод добре зарекомендував себе для вирішення рівнянь складного теплообміну.
Формулювання і обґрунтування одновимірної різницевої схеми див. wiki.
Опис солвера
1-мірний солвер реалізований на Octave і C++, 2-мірний – тільки на C++.
Різницеві рівняння записуються у вигляді суми одновимірних різницевих операторів по x і y і нелінійного точкового оператора. Реалізація загального алгоритму через суму одновимірних операторів дозволяє не розглядати велику кількість типів вузлів (внутрішні, на стороні прямокутника, в кутовій точці, на кордоні розділу подобластей, на стороні прямокутника і на межі розділу, в кутовій точці на границях розділу). Для запису рівнянь використовується зрозумілий синтаксис з перевантаженням операцій.
Для вирішення СЛАУ застосовується ітераційний метод з бібліотеки MTL4.
В подальшому планується реалізувати 3-мірний солвер аналогічним чином.
Висновок
Можна програмувати метод кінцевих різниць по-простому: виписати різницеві рівняння для конкретної задачі, ввести коефіцієнти в програму і викликати функцію вирішення СЛАУ.
Більш продуктивно розробити загальний солвер, який можна протестувати на завданнях з відомим рішенням.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.