Як ефективно реалізувати граничні умови Діріхле в глобальних малих матрицях жорстких кінцевих елементів


9

Мені цікаво, наскільки фактично граничні умови Діріхле в глобальних малих матрицях кінцевих елементів реалізуються ефективно. Наприклад, скажемо, що наша глобальна кінцева матриця елементів:

К=[520-102410001632-1037000203]і правий бічний векторб=[б1б2б3б4б5]

Потім застосувати умову Діріхле на перший вузол (х1=c) ми би нуль першого ряду, поставив 1 at К11, і відніміть перший стовпець з правого боку. Наприклад, наша система стала б:

К=[1000004100016320037000203]і правий бічний векторб=[cб2-2×cб3-0×cб4+1×cб5-0×c]

Це теоретично все добре і добре, але якщо наша матриця K зберігається у форматі стислих рядків (CRS), то переміщення стовпців у праву частину стає дорогим для великих систем (багато вузлів є диріхлетом). Альтернативою було б не переміщувати стовпці, що відповідають умові Діріхле, в праву частину, тобто наша система стала б:

К=[100002410001632-1037000203]і правий бічний векторб=[cб2б3б4б5]

Це, однак, суттєво відзначається тим, що система вже не симетрична, і тому ми більше не можемо використовувати попередньо обумовлений градієнт кон'югату (або інші симетричні розв'язувачі). Одне цікаве рішення, на яке я натрапив, - це «Метод великих чисел», який я знайшов у книзі «Програмування кінцевих елементів на Яві» Геннадія Нікішкова. Цей метод використовує той факт, що подвійна точність містить лише близько 16 цифр точності. Замість того, щоб ставити 1 вК11позицію ми розміщуємо велику кількість. Наприклад, наша система стає:

К=[1,0е6420-102410001632-1037000203]і правий бічний векторб=[c×1,0е64б2б3б4б5]

Переваги цього методу полягають у тому, що він підтримує симетричність матриці, при цьому є дуже ефективним для розріджених форматів зберігання. Мої запитання тоді такі:

Як зазвичай граничні умови Діріхле реалізуються в кінцевих кодах елементів для тепла / рідин? Люди зазвичай використовують метод великої кількості чи роблять щось інше? Чи є недолік методу великих чисел, який хтось може побачити? Я припускаю, що, мабуть, існує якийсь стандартний ефективний метод, застосовуваний у більшості комерційних та некомерційних кодів, який вирішує цю проблему (очевидно, я не сподіваюся, що люди будуть знати всі внутрішні дії кожного комерційного вирішеного кінцевого елемента, але ця проблема здається базовою / фундаментальною достатньо, щоб хтось, ймовірно, працював над такими проектами і міг дати керівництво).


2
Чи є у вас докази того, що це істотно сповільнює вас?
Білл Барт

@BillBarth Так, хоча завжди є шанс, що я роблю щось неефективно. Сам Геннаділій пише, що хоча явний метод легкий для повних 2d-масивів, ".. це не завжди легко отримати доступ до матричних рядків і стовпців, коли матриця знаходиться в компактному форматі". припускаючи, що явний метод може бути складнішим для ефективного впровадження. У міру написання мого коду явний метод може зайняти більше часу, ніж власне рішення.
Джеймс

1
зробіть це так, як говорить Вольфганг, і застосуйте граничні умови до матриць елементів, перш ніж збирати.
Білл Барт

@BillBarth Так, я думаю, я це зроблю. Його відео дивовижні! Я просто залишив для нього коментар / запитання про те, чи потрібно повторно збирати глобальні матриці на кожному кроці, після чого я думаю, що прийму його відповідь.
Джеймс

Відповіді:


11

В deal.II ( http://www.dealii.org - відмова від відповідальності: я один з головних авторів цієї бібліотеки), ми усуваємо цілі рядки та стовпці, і це не надто дорого в цілому. Хитрість полягає в тому, щоб використовувати той факт, що малюнок розрідженості типово симетричний, тож ви знаєте, у які рядки потрібно звернути увагу, видаляючи цілий стовпець.

Кращий підхід, на мій погляд, полягає у усуненні цих рядків та стовпців у матрицях комірок, перш ніж вони будуть додані до глобальної матриці. Там ви працюєте з повними матрицями, тому все ефективно.

Я ніколи не чув про підхід великої кількості, і не використовував би його, тому що, безумовно, це призведе до жахливо обумовлених проблем.

Для довідки алгоритми, які ми використовуємо в deal.II, описані концептуально на лекціях 21.6 та 21.65 за адресою http://www.math.colostate.edu/~bangerth/videos.html . Вони тісно відповідають вашому опису.


2
У разі проблеми, залежної від часу (скажімо, рівняння тепла), ви повторно збираєте глобальну матрицю на кожному кроці часу? Причина, про яку я запитую, полягає в тому, що у випадку ненульових умов Діріхле вам потрібна інформація з оригінальної глобальної матриці під час зміни правої сторони, але якщо ви знецінили ці стовпці протягом попереднього часового кроку, ця інформація втрачається (якщо ви її не зберігаєте у додаткових масивах). Це не буде проблемою, якщо глобальна матриця буде перекомпонована щоразу, хоча саме це я розглядаю, і що все-таки потрібно зробити, якщо використовувати адаптивну сітку.
Джеймс

1
Це залежить від програми. Усі «великі» коди вирішують нелінійні проблеми, залежні від часу, і для них зрозуміло, що вам потрібно повторно зібрати так чи інакше. Для лінійних кодів ви можете просто зберігати оригінальну матрицю і щоразу виконувати її копіювання десь в іншому місці, застосовувати граничні умови, а потім використовувати її в розв'язувачі. Для цього просто потрібно більше пам’яті, але інакше дешево.
Вольфганг Бангерт

1
О, я бачу, саме в цьому я підозрював. Я буду реалізовувати так, як ви запропонували. Гаразд, для вашої допомоги. Ці відео з підручниками по справжньому справді є хорошими btw!
Джеймс

2

Нульові БЦ легко. Для ненульових BC ви також можете використовувати множники Lagrange. Наприклад, дивіться тут . Однією з переваг LM є те, що ви можете використовувати будь-яке рівняння обмежень, хоча система стає невизначеною, тому вам потрібен відповідний вирішувач.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.