¿Cuáles diría que serían las ventajas / desventajas de dos enfoques para codificar una biblioteca general (volumen finito, fem, dg) para la Mecánica de Continuo Computacional? Así es como veo las cosas ahora, así que por favor brinde sus propias experiencias y no me llame por las mías :):
1) C ++:
programación genérica, funciones virtuales, sobrecarga, velocidad ...: todas las herramientas genreic + OOP disponibles para construir lo que quieras
bibliotecas de bajo nivel disponibles en su mayoría (no hay un amplio desarrollo de bibliotecas de ciencia e ingeniería como la de Python)
2) Python + envoltorios para computación paralela (pyOpenCL y otros)
gran cantidad de bibliotecas de apoyo de varios tipos
codifique lo que piensa: la implementación se realiza realmente rápido
tiempo de ejecución más lento
Si quisieras codificar un marco que admitiera varios métodos, trabajar con geometrías y problemas complejos, ¿qué elegirías y por qué?
fuente
Respuestas:
Mi objetivo sería obtener lo mejor de ambos mundos y codificar la "interfaz de usuario" (es decir, el marco de funciones que el usuario de su biblioteca llamará para describir la geometría y otras propiedades del problema) en Python para obtener la información rápida. tiempo de respuesta, luego escriba el tiempo de ejecución de la simulación en C ++.
De hecho, probablemente me burlaría incluso del tiempo de ejecución de la simulación en Python primero, luego lo reemplazaría por código C ++ pieza por pieza. Eventualmente, podría considerar que su código Python genere una fuente C ++, para ser compilada y vinculada a su tiempo de ejecución en línea, de modo que la simulación real no necesite llamar a Python en absoluto, solo devuelva los resultados al final. Lo bueno de esta configuración es que es inherentemente ágil: comienza con la solución de trabajo más rápida y fácil, descubrirá rápidamente qué funciona y qué no funciona, y una vez que tenga algo que le guste, puede comenzar a acelerarlo.
(Así es como funciona el solucionador ODE / DAE de Maple, excepto el uso de Maple en lugar de Python. Divulgación completa: trabajo para ellos).
fuente
También puede usar Cython para sus algoritmos. Es esencialmente Python con información de tipo agregada para algunas variables que necesitan ser "rápidas". Traduce el código de Python a código C, que posteriormente puede ser compilado por su compilador de C favorito. La adición cuidadosa de este tipo de información puede hacer que su código sea hasta 150 veces más rápido que el código ingenuo de Python.
fuente
Creo que hay más en esta pregunta. En primer lugar, un desarrollador generalmente preferirá lo que está familiarizado a menos que tenga ventajas significativas (por ejemplo, en productividad, tiempo de desarrollo y herramientas). Personalmente, le doy prioridad a ser productivo (¡el tiempo suele ser el recurso más escaso!) Y esto favorece opciones que están cerca de mi base de experiencia.
Quizás también sea relevante tener en cuenta son
3) tiempo de desarrollo
4) mantenimiento
5) Problema de licencia
6) Productividad y factor de diversión (¡a menudo se pasa por alto!)
fuente
Esto depende de si su código se puede escribir como:
o más bien debe escribirse como algo así:
En el primer caso, elija lo que más le guste codificar; en el segundo caso, no use ningún lenguaje de script ni se prepare para sufrir el tiempo de ejecución.
fuente
Como corolario a la respuesta de Allan (que su propio tiempo de desarrollador es el recurso más valioso): use lo que otros ya han hecho. Usted dice que desea desarrollar una biblioteca para la mecánica de la computación continua, pero ya hay varias de ellas que son tan grandes que casi invariablemente ya tendrán todo lo que necesita. Eche un vistazo a deal.II, por ejemplo, para todo lo que se puede escribir como un problema de elementos finitos, OpenFOAM para dinámica de fluidos o PyCLAW / CLAWPACK para problemas hiperbólicos. deal.II, por ejemplo, le pide que programe en C ++, pero en realidad el nivel de programación a menudo es tan alto que se podría decir que es como un lenguaje específico de dominio para códigos FEM que usan la sintaxis de C ++.
fuente