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?
źródło
Odpowiedzi:
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.)
źródło
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.
źródło
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
4) Konserwacja
5) Problem z licencjonowaniem
6) Współczynnik produktywności i zabawy (często pomijany!)
źródło
Zależy to od tego, czy kod można zapisać jako:
a raczej musi być napisane jako coś takiego:
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.
źródło
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 ++.
źródło