Pytanie: Jakie metody są dostępne w celu dokładnego i wydajnego obliczenia struktury rzadkości matrycy elementów skończonych?
Informacje: Pracuję nad solwerem Poissona Równania Ciśnienia, stosując metodę Galerkina z kwadratową podstawą Lagrange'a, napisaną w C, i używam PETSc do rzadkiego przechowywania macierzy i procedur KSP. Aby efektywnie korzystać z PETSc, muszę wstępnie przydzielić pamięć dla globalnej macierzy sztywności.
Obecnie wykonuję próbny zestaw, aby oszacować liczbę nonzeros na wiersz w następujący sposób (pseudokod)
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]++
Jednak przecenia to nnz, ponieważ niektóre interakcje węzeł-węzeł mogą wystąpić w wielu elementach.
Zastanawiałem się nad tym, aby sprawdzić, jakie interakcje i, j znalazłem, ale nie jestem pewien, jak to zrobić bez użycia dużej ilości pamięci. Mógłbym również zapętlić węzły i znaleźć wsparcie funkcji bazowej na środku tego węzła, ale wtedy musiałbym przeszukać wszystkie elementy dla każdego węzła, co wydaje się nieefektywne.
Znalazłem to ostatnie pytanie, które zawierało przydatne informacje, zwłaszcza od Stefano M., który napisał
radzę zaimplementować go w Pythonie lub C, stosując pewne teoretyczne koncepcje graficzne, tzn. rozważ elementy w macierzy jako krawędzie w grafie i oblicz strukturę rozproszeniową macierzy przylegania. Lista list lub słownik kluczy to często wybierane opcje.
Szukam więcej szczegółów i zasobów na ten temat. Wprawdzie nie znam zbyt wielu teorii grafów i nie znam wszystkich sztuczek CS, które mogą być przydatne (podchodzę do tego od strony matematycznej).
Dzięki!