O que você diria que seriam as vantagens / desvantagens de duas abordagens para codificar uma biblioteca geral (volume finito, fem, dg) para Mecânica Computacional de Contínuo? É assim que vejo as coisas agora, então, forneça suas próprias experiências e não me chame pelas minhas :):
1) C ++:
programação genérica, funções virtuais, sobrecarga, velocidade ...: todas as ferramentas genéricas + OOP disponíveis para criar o que você quiser
bibliotecas de baixo nível disponíveis na maior parte (não existe amplo desenvolvimento de bibliotecas de ciência e engenharia, como a do Python)
2) Wrappers Python + para computação paralela (pyOpenCL e outros)
enorme quantidade de bibliotecas de suporte de vários tipos
codifique o que você pensa: a implementação é feita muito rapidamente
tempo de execução mais lento
Se você deseja codificar uma estrutura que suporte vários métodos, trabalhe com geometrias e problemas complexos, o que você escolheria e por quê?
fonte
Respostas:
Eu pretendia obter o melhor dos dois mundos e codificar a "interface do usuário" (ou seja, a estrutura de funções que o usuário da sua biblioteca chamará para descrever a geometria e outras propriedades do problema) no Python para obter o rápido tempo de resposta e, em seguida, escreva o tempo de execução da simulação em C ++.
De fato, eu provavelmente zombaria até do tempo de execução da simulação no Python primeiro e depois o substituia pelo código C ++, peça por peça. Eventualmente, você pode considerar que seu código Python gere a fonte C ++, para ser compilado e vinculado ao seu tempo de execução on-line, para que a simulação real não precise acessar o Python - apenas retorne os resultados no final. O bom dessa configuração é que ela é inerentemente ágil: você começa com a solução de trabalho mais rápida e fácil, descobre rapidamente o que funciona e o que não funciona e, depois de ter algo que gosta, pode começar a acelerar.
(É assim que o solucionador ODE / DAE do Maple funciona, exceto usando o Maple em vez do Python. Divulgação completa: trabalho para eles.)
fonte
Você também pode usar o Cython para seus algoritmos. É essencialmente Python com informações de tipo adicionadas para algumas variáveis que precisam ser "rápidas". Ele converte o código Python em código C, que pode ser compilado posteriormente pelo seu compilador C favorito. A adição cuidadosa dessas informações de tipo pode tornar seu código 150 vezes mais rápido que o código Python ingênuo.
fonte
Eu acho que há mais nessa questão. Em primeiro lugar, um desenvolvedor prefere tipicamente o que ele / ela está familiarizado, a menos que haja vantagens significativas (por exemplo, em produtividade, tempo de desenvolvimento e ferramentas). Pessoalmente, priorizo ser produtivo (o tempo é geralmente o recurso mais escasso!) E isso favorece escolhas próximas da minha base de experiências.
Talvez também seja relevante levar em consideração
3) tempo de desenvolvimento
4) Manutenção
5) Problema de licenciamento
6) Fator de produtividade e diversão (muitas vezes esquecido!)
fonte
Isso depende se o seu código pode ser escrito como:
ou melhor, deve ser escrito como algo assim:
No primeiro caso, escolha o que você mais gosta de codificar; no segundo caso, não use nenhuma linguagem de script ou prepare-se para sofrer com o tempo de execução.
fonte
Como corolário da resposta de Allan (que seu tempo de desenvolvedor é o recurso mais valioso): Use o que os outros já fizeram. Você diz que deseja desenvolver uma biblioteca para mecânica de continuum computacional, mas já existem várias que são tão grandes que quase invariavelmente já possuem tudo o que você precisa. Dê uma olhada em deal.II, por exemplo, para tudo o que pode ser escrito como um problema de elemento finito, o OpenFOAM para dinâmica de fluidos ou o PyCLAW / CLAWPACK para problemas hiperbólicos. deal.II, por exemplo, solicita que você programe em C ++, mas, na realidade, o nível de programação geralmente é tão alto que se pode dizer que é como uma linguagem específica de domínio para códigos FEM usando a sintaxe C ++.
fonte