Питання: Які методи доступні для точного та ефективного обчислення структури розрідженості матриці кінцевих елементів?
Інформація: Я працюю над рішенням рівняння тиску Пуассона, використовуючи метод Галеркіна з квадратичною основою Лагранжа, написаний на C, і використовую PETSc для розрідженого зберігання матриць і підпрограм KSP. Щоб ефективно використовувати PETSc, мені потрібно заздалегідь виділити пам'ять для глобальної матриці жорсткості.
В даний час я роблю макетну збірку, щоб оцінити кількість ненулів у рядку наступним чином (псевдокод)
int nnz[global_dim]
for E=1 to NUM_ELTS
for i=1 to 6
gi = global index of i
if node gi is free
for j=1 to 6
gj = global index of j
if node gj is free
nnz[i]++
Це, однак, завищує nnz, оскільки деякі взаємодії вузла-вузла можуть відбуватися в декількох елементах.
Я розглядав спробу відстежити, які я, j взаємодії знайшов, але не знаю, як це зробити, не використовуючи багато пам'яті. Я також міг би перебирати вузли і знаходити підтримку базової функції, зосередженої на цьому вузлі, але тоді мені доведеться шукати всі елементи для кожного вузла, що здається неефективним.
Я знайшов це нещодавнє запитання, яке містило корисну інформацію, особливо від Стефано М, який писав
моя порада полягає в тому, щоб реалізувати це в python або C, застосовуючи деякі теоретичні поняття графа, тобто розглядати елементи в матриці як ребра в графіку та обчислити структуру нерівномірності матриці суміжності. Список списків або словник клавіш - це звичайний вибір.
Я шукаю більше деталей та ресурсів з цього приводу. Я, правда, не знаю багато теорій графіків, і я не знайомий з усіма хитрощами, які можуть бути корисними (я підходжу до цього з математичної сторони).
Спасибі!