C ++ lub Python do opracowania biblioteki CFD

13

Jakie byłyby zalety / wady dwóch podejść do kodowania biblioteki ogólnej (objętość skończona, fem, dg) dla obliczeniowej mechaniki ciągłości? Tak właśnie teraz widzę, więc proszę, przekaż swoje własne doświadczenia i nie rozpalaj mnie dla mnie :):

1) C ++:

  • ogólne programowanie, funkcje wirtualne, przeciążanie, szybkość ...: wszystkie dostępne narzędzia genreic + OOP do budowania, co chcesz

  • biblioteki niskiego poziomu są dostępne głównie (brak szerokiego rozpowszechniania bibliotek naukowych i inżynieryjnych, takich jak ta dla Pythona)

2) Opakowania Python + do obliczeń równoległych (pyOpenCL i inne)

  • ogromna ilość różnych bibliotek pomocniczych

  • kod, co myślisz: wdrożenie odbywa się naprawdę szybko

  • wolniejszy czas realizacji

Jeśli chcesz kodować platformę, która będzie obsługiwać różne metody, pracować ze złożonymi geometriami i problemami, co byś wybrał i dlaczego?

tmaric
źródło
1
PyOpenCL nie znam się dobrze, ale ogólnie mówiąc, Python będzie o wiele za wolny, aby rozwiązywać nawet problemy średniej wielkości w 2D lub 3D, chyba że „jądra” obliczeniowe są zaimplementowane w języku niskiego poziomu (Fortran, C itp.) )
David Ketcheson,

Odpowiedzi:

14

Chciałbym uzyskać najlepsze z obu światów i zakodować „interfejs użytkownika” (czyli strukturę funkcji, które wywoła użytkownik twojej biblioteki, aby opisać geometrię i inne właściwości problemu) w Pythonie, aby uzyskać szybki czas realizacji, a następnie napisz czas działania symulacji w C ++.

W rzeczywistości prawdopodobnie najpierw wyśmiewałbym nawet czas uruchamiania symulacji w Pythonie, a następnie zamieniałbym go kodem C ++ kawałek po kawałku. W końcu możesz rozważyć generowanie kodu C ++ w języku Python, który zostanie skompilowany i połączony ze środowiskiem wykonawczym online, tak aby rzeczywista symulacja nie musiała w ogóle wywoływać języka Python - zwracaj tylko wyniki na końcu. Zaletą tej konfiguracji jest to, że jest ona z natury zwinna: zaczynasz od najszybszego i najłatwiejszego działającego rozwiązania, szybko dowiadujesz się, co działa, a co nie działa, a kiedy masz coś, co lubisz, możesz zacząć go przyspieszać.

(Tak działa solver ODE / DAE Maple, z wyjątkiem używania Maple zamiast Pythona. Pełne ujawnienie: Pracuję dla nich.)

Erik P.
źródło
1
+1. Jednym z ładnych elementów Pythona jest możliwość odejścia od „czystego Pythona” w razie potrzeby.
Fomite,
3

Możesz także użyć Cython do swoich algorytmów. Zasadniczo jest to Python z dodanymi informacjami o typie niektórych zmiennych, które muszą być „szybkie”. Tłumaczy kod Pythona na kod C, który można następnie skompilować za pomocą ulubionego kompilatora C. Staranne dodanie tego typu informacji może sprawić, że Twój kod będzie nawet 150 razy szybszy niż naiwny kod Pythona.

Daniel Eberts
źródło
2

Myślę, że jest więcej tego pytania. Przede wszystkim programista zazwyczaj woli to, co zna, chyba że znaczące korzyści (np. W produktywności, czasie rozwoju i narzędziach). Osobiście traktuję priorytetowo produktywność (czas jest zazwyczaj najbardziej rzadkim zasobem!), Co sprzyja wyborom zbliżonym do mojej bazy doświadczeń.

Być może również należy wziąć pod uwagę

3) Czas rozwoju

  • ile czasu jest zarezerwowane na rozwój
  • kiedy zostaną dostarczone wyniki prac? i jak?
  • czy istnieje już kod, który może wykonać zadanie? (wyjątkowość?)

4) Konserwacja

  • ile zasobów (osób) jest przeznaczonych na utrzymanie?
  • ile osób ma pracować nad kodem?
  • Czy kod zostanie wydany w którymś momencie? (kryteria?)
  • czy kod będzie polegał na bibliotekach stron trzecich?

5) Problem z licencjonowaniem

  • jest kod do badań?
  • jest kod dla aplikacji komercyjnych?

6) Współczynnik produktywności i zabawy (często pomijany!)

  • Gdzie można być najbardziej produktywnym?
  • Gdzie najlepiej się rozwijać?
  • Jakieś możliwości bycia częścią sieci (społecznościowej)?
Allan P. Engsig-Karup
źródło
2

Zależy to od tego, czy kod można zapisać jako:

some_library_specific_type grid;

for t=0 to T do
    library_function_1(grid,...);
    library_function_2(grid,...);
end

a raczej musi być napisane jako coś takiego:

some_home_made_mixture_of_native_types grid;

for t=0 to T do
    for all grid elements as g do
        some_function(g,...);
        library_function(g,...);
    end
end

W pierwszym przypadku wybierz to, co najbardziej lubisz kodować; w drugim przypadku nie używaj żadnego języka skryptowego ani nie przygotuj się na czas wykonywania.

mbq
źródło
2

W następstwie odpowiedzi Allana (że Twój własny czas programisty jest najcenniejszym zasobem): Wykorzystaj to, co inni już zrobili. Mówisz, że chcesz stworzyć bibliotekę dla obliczeniowej mechaniki kontinuum, ale jest już kilka takich, które są tak duże, że prawie zawsze będą już miały wszystko, czego potrzebujesz. Spójrz na deal.II na przykład na wszystko, co można zapisać jako problem elementu skończonego, OpenFOAM dla dynamiki płynów lub PyCLAW / CLAWPACK dla problemów hiperbolicznych. na przykład deal.II prosi o programowanie w C ++, ale w rzeczywistości poziom programowania jest często tak wysoki, że można powiedzieć, że jest to język specyficzny dla domeny dla kodów MES z wykorzystaniem składni C ++.

Wolfgang Bangerth
źródło
2
Nigdy nie spotkałem biblioteki, w której było wszystko, czego potrzebowałem ...
Jack Poulson,
Cóż, ale rozumiesz, o co ci chodzi. Niektóre biblioteki mają „prawie wszystko”, czego możesz potrzebować. Aby przytoczyć przykład, który jestem szczególnie zaznajomiony, solver elementów skończonych na w pełni samodostosowujących się siatkach 3d działających na ponad 10 000 procesorów korzystających z linii deal.II i PETSc 126. To wyraźnie więcej niż zero, ale w rzeczywistości jest to bardzo mała liczba, biorąc pod uwagę złożoność tego, co jest pod maską.
Wolfgang Bangerth,
Aby zagrać w adwokata diabła, uruchomienie kodu na 10 000 rdzeni jest banalne, ale jest to zupełnie inna sprawa, aby był skalowalny. Niewiele równoległych warunków wstępnych dla równań nieeliptycznych może nawet skutecznie działać na 300 rdzeniach.
Jack Poulson
Pewnie. Ale przykład, który przytaczam, jest skalowalny: math.tamu.edu/~bangerth/publications/2010-distribution.pdf .
Wolfgang Bangerth,
W trosce o pełne ujawnienie: jestem jednym z autorów zarówno artykułu, jak i powyższego kodu, a także ogólnie biblioteki deal.II.
Wolfgang Bangerth,