Rozwiązuję problem fizyczny za pomocą niejawnego schematu numerycznego. To prowadzi mnie do rozwiązania równania liniowego za pomocą macierzy tridiagonalnej. Algorytm kodowałem z Wikipedii. Zastanawiam się, czy istnieje wydajna biblioteka, która pozwala optymalnie rozwiązać tego rodzaju równanie. Ważną uwagą jest to, że sama matryca zmienia się tylko, gdy zmieniają się parametry systemu, więc miałem okazję wstępnie obliczyć kilka kroków algorytmu, aby uzyskać niezłą premię za wydajność. Używam C ++.
12
Odpowiedzi:
Prawdopodobnie powinieneś zacząć od implementacji LAPACK,? Gtsv, np . Dgtsv . Jeśli chcesz wersję z pamięcią rozproszoną, możesz zacząć od p? Gtsv ScaLAPACK.
EDYCJA: Ponieważ twoja macierz nie zmienia się zbyt często, możesz uniknąć zbędnego faktoryzowania macierzy tridiagonalnej, rozkładając procedurę LAPACK? Gtsv na etap faktoryzacji? Gttrf i etap rozwiązywania? Gttrs. W ScaLAPACK istnieją podobnie nazwane procedury, które służą temu samemu celowi.
źródło
W przypadku rozproszonych systemów równoległych : Nie próbowałem ScaLAPACK, który ma równoległy trójdrożny solver, dla którego istnieją przykłady dostępne online . Z pewnym powodzeniem wypróbowałem metodę zaproponowaną przez Davida Moultona w publikacji LANL . Kodowanie tego może być więcej, niż chcesz, ale używając LAPACK, jest to proste.
źródło
Znalazłem interesujący algorytm rekurencyjny tutaj na stronie 975. Wygląda obiecująco, zastanawiam się, co mówią o tym bardziej doświadczeni ludzie.
źródło