Что бы вы сказали о преимуществах / недостатках двух подходов к кодированию общей (конечного объема, fem, dg) библиотеки для вычислительной механики сплошных сред? Вот как я вижу вещи прямо сейчас, поэтому, пожалуйста, предоставьте свой собственный опыт и не подгоняйте меня к моему :):
1) C ++:
универсальное программирование, виртуальные функции, перегрузка, скорость ...: все инструменты общего назначения + ООП доступны для создания того, что вы хотите
в основном доступны низкоуровневые библиотеки (нет широко распространенных научно-технических библиотек, таких как Python)
2) Python + обертки для параллельных вычислений (pyOpenCL и другие)
огромное количество поддерживающих библиотек разных видов
код, что вы думаете: реализация делается очень быстро
медленное время выполнения
Если бы вы хотели написать код, который бы поддерживал различные методы, работал со сложной геометрией и проблемами, что бы вы выбрали и почему?
Ответы:
Я хотел бы получить лучшее из обоих миров и кодировать «пользовательский интерфейс» (то есть структуру функций, которые пользователь вашей библиотеки будет вызывать для описания геометрии и других свойств проблемы) в Python, чтобы получить быстрый время выполнения, затем запишите время выполнения моделирования в C ++.
Фактически, я бы, вероятно, сначала смоделировал даже время выполнения симуляции в Python, а затем заменил бы его на кусочек кода C ++. В конце концов, вы можете подумать о том, чтобы ваш код Python генерировал исходный код C ++, чтобы он был скомпилирован и связан с вашей средой выполнения в Интернете, так что фактическое моделирование вообще не должно вызывать Python - только возвращать результаты в конце. Хорошая особенность этой установки в том, что она по своей природе гибкая: вы начинаете с самого быстрого и простого рабочего решения, вы быстро узнаете, что работает, а что нет, и как только у вас появится что-то, что вам понравится, вы можете начать его ускорять.
(Так работает решатель ODE / DAE Maple, за исключением использования Maple вместо Python. Полное раскрытие: я работаю для них.)
источник
Вы также можете использовать Cython для своих алгоритмов. По сути это Python с добавленной информацией о типе для некоторых переменных, которые должны быть «быстрыми». Он переводит код Python в код C, который впоследствии может быть скомпилирован вашим любимым компилятором C. Тщательное добавление информации этого типа может сделать ваш код в 150 раз быстрее, чем простой код Python.
источник
Я думаю, что есть еще к этому вопросу. Прежде всего, разработчик, как правило, предпочитает то, с чем он / она знаком, за исключением значительных преимуществ (например, в производительности, времени разработки и инструментах). Лично я отдаю приоритет продуктивности (время, как правило, самый дефицитный ресурс!), И это способствует выборам, которые близки к моей базе опыта.
Возможно, также важно принять во внимание
3) Время разработки
4) Техническое обслуживание
5) Вопрос лицензирования
6) Коэффициент производительности и веселья (часто упускается из виду!)
источник
Это зависит от того, может ли ваш код быть написан как:
точнее должно быть написано как то так:
В первом случае выберите то, что вам больше всего нравится в коде; во втором случае не используйте какой-либо язык сценариев или готовьтесь страдать от времени выполнения.
источник
Как следствие ответа Аллана (что ваше собственное время разработчика - самый ценный ресурс): используйте то, что уже сделали другие. Вы говорите, что хотите разработать библиотеку для вычислительной механики континуума, но уже есть несколько таких больших, что почти всегда они будут иметь все, что вам нужно. Посмотрите на deal.II, например, для всего, что может быть записано как задача с конечными элементами, OpenFOAM для динамики жидкости или PyCLAW / CLAWPACK для гиперболических задач. deal.II, например, просит вас программировать на C ++, но на самом деле уровень программирования часто настолько высок, что можно сказать, что он похож на предметно-ориентированный язык для кодов FEM, использующих синтаксис C ++.
источник