C ++ або Python для розробки бібліотеки CFD


13

Що б ви сказали, якими були б переваги / недоліки двох підходів до кодування загальної бібліотеки (кінцевий об'єм, фем, дг) для обчислювальної механіки континууму? Ось як я зараз бачу речі, тому, будь ласка, надайте власний досвід і не спаліть мене за моє :):

1) C ++:

  • загальне програмування, віртуальні функції, перевантаження, швидкість ...: всі жанрові інструменти + OOP, доступні для створення всього, що ви хочете

  • Бібліотеки низького рівня доступні здебільшого (відсутність широко поширених науково-технічних розробок бібліотек, таких як Python)

2) обгортки Python + для паралельних обчислень (pyOpenCL та інші)

  • величезна кількість опорних вуст різних видів

  • кодуйте, що ви думаєте: реалізація робиться дуже швидко

  • повільніший час виконання

Якби ви хотіли кодувати рамку, яка б підтримувала різні методи, працювала зі складними геометріями та проблемами, що б ви вибрали і чому?


1
Я не дуже знайомий з pyOpenCL, але загалом кажучи, Python буде занадто повільним навіть для проблем середнього розміру в 2D або 3D, якщо тільки ваші обчислювальні "ядра" не будуть реалізовані на мові низького рівня (Fortran, C тощо). )
Девід Кетчесон

Відповіді:


14

Я б прагнув отримати найкраще з обох світів і кодувати "користувальницький інтерфейс" (тобто рамки функцій, які користувач вашої бібліотеки зателефонує, щоб описати геометрію та інші властивості проблеми) в Python, щоб отримати швидку Час повороту, потім запишіть час виконання імітації в C ++.

Насправді я, мабуть, спершу знущаюся над навіть часом запуску симуляції в Python, а потім замінював би його кодом C ++ по частинах. Врешті-решт, ви можете подумати про те, щоб ваш Python-код генерував джерело C ++, щоб був скомпільований і пов’язаний з вашим режимом роботи в Інтернеті, так що фактичне моделювання зовсім не потрібно запускати в Python - лише повертайте результати в кінці. Приємна річ у цій налаштуваннях полягає в тому, що вона за своєю суттю гнучка: ви починаєте з найшвидшого і найпростішого робочого рішення, швидко дізнаєтеся, що працює, а що не працює, і як тільки вам щось подобається, ви можете почати його прискорювати.

(Ось як працює вирішувач ODE / DAE Maple, за винятком використання Maple замість Python. Повне розкриття: Я працюю на них.)


1
+1. Один з приємних бітів Python - це можливість відійти від "Чистого Python", якщо це потрібно.
Фоміт

3

Ви також можете використовувати Cython для своїх алгоритмів. По суті це Python з доданою інформацією про тип для деяких змінних, які потрібно "швидко". Він переводить код Python в код C, який згодом може бути скомпільований вашим улюбленим компілятором C. Ретельне додавання такої інформації може зробити ваш код у 150 разів швидшим, ніж наївний код Python.


2

Я думаю, що в цьому питанні є більше. Перш за все, розробник, як правило, віддасть перевагу тому, з чим йому / їй знайомі, крім значних переваг (наприклад, у продуктивності, часу розробки та інструментах). Особисто я віддаю перевагу продуктивності (час зазвичай є найбільш дефіцитним ресурсом!), І це сприяє вибору, близькому до моєї бази досвіду.

Можливо, це також є важливим для врахування

3) Час розвитку

  • скільки часу відведено на розвиток
  • коли будуть надані результати роботи? і як?
  • чи вже існує код, який може виконати роботу? (унікальність?)

4) Технічне обслуговування

  • скільки (людей) ресурсів приділяється на утримання?
  • скільки людей потрібно працювати над кодом?
  • Чи повинен бути випущений код в якийсь момент? (критерії?)
  • чи буде код покладатися на сторонні бібліотеки?

5) Питання ліцензування

  • код для дослідження?
  • код комерційних програм?

6) Фактор продуктивності та забавки (часто не помічається!)

  • Де можна бути найбільш продуктивним?
  • Де можна найбільше розважитися, розвиваючись?
  • Будь-які можливості бути частиною (соціальної) мережі?

2

Це залежить від того, чи можна ваш код записати так:

some_library_specific_type grid;

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

а точніше, слід писати приблизно так:

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

У першому випадку виберіть те, що вам найбільше подобається кодувати; у другому випадку не використовуйте жодної мови сценаріїв і не готуйтеся страждати від часу виконання.


2

Як наслідок відповіді Аллана (що власний час розробника - найцінніший ресурс): Використовуйте те, що вже зробили інші. Ви говорите, що хочете розробити бібліотеку для обчислювальної механіки континууму, але вже є декілька таких, які настільки великі, що вони майже незмінно вже матимуть все, що вам потрібно. Подивіться, наприклад, на deal.II на все, що може бути записано як проблема з кінцевими елементами, OpenFOAM для динаміки рідини або PyCLAW / CLAWPACK для гіперболічних проблем. deal.II, наприклад, просить програмувати на C ++, але насправді рівень програмування часто настільки високий, що можна сказати, що це як доменна мова для FEM-кодів, що використовують синтаксис C ++.


2
Я ніколи не стикався з бібліотекою, у якій було все необхідне ...
Джек Поульсон

Ну, але ви розумієте, я думаю, У деяких бібліотеках є «майже все», що вам може знадобитися. Наведемо лише приклад, який мені особливо добре знайомий: вирішення кінцевих елементів на повністю самоадаптованих, 3d-сітках, що працюють на 10 000+ процесорах, використовуючи deal.II та рядки коду PETSc 126. Це явно більше нуля, але насправді це дуже мала кількість, враховуючи складність того, що знаходиться під капотом.
Вольфганг Бангерт

Щоб грати в захисника диявола, тривіально запускати код на 10000 ядер, але це абсолютно інша справа, щоб зробити його масштабованим. Не багато паралельних попередніх кондиціонерів для нееліптичних рівнянь можуть навіть ефективно працювати на 300 ядрах.
Джек Поульсон

Звичайно. Але приклад, який я наводжу, є масштабованим: math.tamu.edu/~bangerth/publications/2010-distributed.pdf .
Вольфганг Бангерт

В інтересах повного розкриття інформації: я один з авторів як статті, так і коду, на який було посилатися вище, а також бібліотеки deal.II в цілому.
Вольфганг Бангерт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.