Soru: Sonlu elemanlar matrisinin seyreklik yapısını doğru ve verimli bir şekilde hesaplamak için hangi yöntemler mevcuttur?
Bilgi: Ben Poisson Basınç Denklemi çözücü üzerinde çalışıyorum, Galerkin yöntemi kuadratik Lagrange temelli, C ile yazılmış ve seyrek matris depolama ve KSP rutinleri için PETSc kullanarak. PETSc'yi verimli bir şekilde kullanmak için, belleği global sertlik matrisi için önceden ayırmam gerekiyor.
Şu anda, aşağıdaki gibi satır başına sıfır olmayanların sayısını tahmin etmek için bir sahte derleme yapıyorum (sözde kod)
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]++
Bununla birlikte, bazı düğüm-düğüm etkileşimleri birden çok öğede meydana gelebileceğinden, bu nnz'yi fazla tahmin eder.
Bulduğum i, j etkileşimlerini takip etmeye çalıştım, ancak çok fazla bellek kullanmadan bunu nasıl yapacağımdan emin değilim. Ayrıca düğümler üzerinde döngü ve bu düğümde merkezli temel işlev desteğini bulmak olabilir, ama sonra her düğüm için tüm öğeleri aramak gerekir, ki bu verimsiz görünüyor.
Bazı yararlı bilgiler içeren bu son soruyu buldum , özellikle de yazan Stefano M'den
benim tavsiyem, bazı grafik teorik kavramları uygulayarak python veya C'ye uygulamak, yani matristeki elemanları bir grafikte kenarlar olarak düşünmek ve bitişiklik matrisinin sparite yapısını hesaplamaktır. Liste veya anahtar sözlüğü listesi yaygın seçimlerdir.
Bununla ilgili daha fazla ayrıntı ve kaynak arıyorum. Kuşkusuz çok fazla grafik teorisi bilmiyorum ve yararlı olabilecek tüm CS hilelerine aşina değilim (buna matematiksel açıdan yaklaşıyorum).
Teşekkürler!