Padrões de design na escrita de software numérico em C ++

13

Estou procurando recursos em padrões e princípios de design para software numérico, potencialmente, mas não necessariamente, com foco em abordagens orientadas a objetos para códigos numéricos.

Estou ciente do texto, Writing Scientific Software: A Guide for Good Style , mas isso ainda lida muito com questões como pontos de ponto flutuante, como e quando otimizar, etc.

Estou procurando informações sobre a imagem maior do design de códigos numéricos, não sobre qualquer coisa que lide com algoritmos e coisas do gênero.

Eu espero que haja recursos para isso, e não resta apenas passar por biblioteca após biblioteca, especialmente porque não há um guia sobre como as coisas projetam corretamente de maneira correta, além do meu próprio conhecimento de boas expressões e práticas em C ++.

(Isso não é específico do idioma, mas se houver algum conteúdo específico do idioma, eu prefiro C ++.)

user1997744
fonte
Eu sempre pensei em escrever um livro assim; mas o leque de abordagens possíveis é enorme (e depende fortemente da técnica numérica primária + do domínio do problema) e o que é necessário é mais como uma enciclopédia. Além disso, nenhuma pessoa pode ter uma noção de todas as possibilidades. O melhor a fazer é seguir as práticas tradicionais de software, mantendo em mente os desenvolvimentos de hardware. Qual é a sua técnica e domínio de interesse?
precisa
2
Outra referência útil que não está bem no alvo é "Computação Efetiva em Física", de Anthony Scopatz e Kathryn Huff.
Brian Borchers
@BrianBorchers Hm, parece que metade disso está em uma introdução ao Python e depois se concentra nas ferramentas de desenvolvimento.
user1997744

Respostas:

8

Tendo desenvolvido software numérico há 20 anos, acho que provavelmente usamos a maioria dos padrões de design descritos no Livro da Gang of Four ( veja aqui ). No final do dia, o software numérico também é apenas um software complexo e de larga escala; portanto, talvez não seja surpreendente que as mesmas considerações de design se apliquem a outros softwares.

É claro que existem vários casos que são realmente específicos para algoritmos numéricos (veja, por exemplo, aqui ), mas conhecer o conjunto "tradicional" de padrões de design já é um bom começo.

Wolfgang Bangerth
fonte
Eu gostaria de acrescentar que, para cálculos numéricos em hardware mais recente, deve-se procurar minimizar a busca por ponteiros (que muitos dos padrões da Gangue dos Quatro usam). Um bom ponto de partida para projetos em C ++ é github.com/isocpp/CppCoreGuidelines/blob/master/…
Biswajit Banerjee
@BiswajitBanerjee Sim, as diretrizes principais do C ++ são conhecimentos básicos para qualquer pessoa que esteja usando o C ++ moderno. Herb Sutter é um dos editores e você sempre pode confiar nos conselhos dele.
user1997744
@ user1997744 Você quis dizer Bjarne? Herb Sutter também é famoso por sua idéia "sempre automática", que leva ao código somente para gravação (não tenho certeza do quanto eu confiaria em seu julgamento). Além disso, as diretrizes principais do C ++ estão longe de serem básicas. Você ficará surpreso.
precisa
@BiswajitBanerjee Bem, se não estiverem, posso dizer que nunca permitiria que um desenvolvedor progredisse além de uma única entrevista se não conhecesse a maioria das diretrizes e as utilizasse (excluindo onde o código legado pode tornar isso complicado).
user1997744
6

Eu recomendo este Matthew G Knepley. Linguagens de programação para computação científica. pré-impressão do arXiv arXiv: 1209.1711, 2012 ( https://arxiv.org/pdf/1209.1711.pdf )

Também aconselho a procurar e ler outros códigos, por exemplo, triângulo, PETSc, MoAB, deal.II, fenics e muitos outros. Nem todas as soluções funcionarão para você, mas no final, lidar e aprender com outras pessoas (desenvolvedores experientes e códigos bem-sucedidos) é a melhor lição de como criar código.

Além disso, acho melhor participar de um projeto existente e tornar-se colaborador ou desenvolvedor. Às vezes você gosta de começar algo novo, mas precisa ter argumentos sólidos para fazer isso.

likask
fonte
Meu argumento para lançar algo novo é a experiência de aprendizagem com ele e o sentimento de realização :)
user1997744
1
Eu entendo esse argumento. Eu tinha feito a mesma coisa há muito tempo. Agora eu acho que foi prematuro. Pode ser que no começo tudo tenha que cometer os mesmos erros. Para aprender a andar primeiro, você precisa cair. Escrevendo código próprio, se for a primeira vez, você provavelmente será o único usuário do seu código. Contribuindo com o código desenvolvido pela comunidade, seu trabalho provavelmente será usado por outras pessoas e isso lhe dará uma sensação de conquista e apreciação. Você receberá comentários / revisão a pedido, a partir do qual aprenderá e aprimorará suas habilidades.
likask
Bem, não há biblioteca para uma computação esotérica ultra-específica que eu precise fazer, então no final eu tenho que escrever minha própria, embora, é claro, não seja necessário reinventar tudo.
user1997744
Um ótimo conselho para ingressar em um projeto existente de código aberto. Fui atraído para uma rede de programadores muito melhor do que eu fazendo isso.
user14717