Вопрос: Какие методы доступны для точного и эффективного расчета разреженной структуры матрицы конечных элементов?
Информация: я работаю над решателем уравнения давления Пуассона, использую метод Галеркина с квадратичной базой Лагранжа, написанный на 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, потому что некоторые взаимодействия узел-узел могут происходить в нескольких элементах.
Я подумал о том, чтобы попытаться отследить, какие взаимодействия i, j я обнаружил, но я не уверен, как это сделать без использования большого количества памяти. Я также мог бы зацикливаться на узлах и находить поддержку базисной функции в центре этого узла, но тогда мне пришлось бы искать все элементы для каждого узла, что кажется неэффективным.
Я нашел этот недавний вопрос, который содержал некоторую полезную информацию, особенно от Стефано М., который написал
Мой совет - реализовать его на python или C, применяя некоторые теоретические концепции графа, то есть рассматривать элементы в матрице как ребра графа и вычислять разреженную структуру матрицы смежности. Список списков или словарь ключей являются общими вариантами.
Я ищу больше деталей и ресурсов по этому вопросу. По общему признанию, я не знаю много теории графов, и я не знаком со всеми трюками CS, которые могли бы быть полезными (я подхожу к этому с математической стороны).
Благодарность!