Progetta modelli scrivendo software numerico in C ++


13

Sto cercando risorse su modelli e principi di progettazione per software numerici, potenzialmente ma non necessariamente con un focus sugli approcci orientati agli oggetti ai codici numerici.

Sono a conoscenza del testo, Scrivere software scientifico: una guida per un buon stile , ma questo si occupa ancora molto di cose come problemi in virgola mobile, come e quando ottimizzare, ecc.

Sto cercando informazioni sul quadro più ampio della progettazione di codici numerici, non su tutto ciò che riguarda algoritmi e simili.

Spero che ci siano risorse per questo, e non si è lasciati solo a leggere una biblioteca dopo l'altra, soprattutto perché non esiste una guida su come le cose progettino correttamente in modo saggio, a parte la mia conoscenza di buone espressioni e pratiche in C ++.

(Questo non è specifico della lingua, ma se ci sono contenuti specifici della lingua, preferirei C ++.)


Ho spesso pensato di scrivere un libro del genere; ma la gamma di possibili approcci è enorme (e dipende fortemente dalla tecnica numerica primaria + dal dominio del problema) e ciò che serve è più simile a un'enciclopedia. Inoltre, nessuna singola persona può avere una comprensione di tutte le possibilità. La migliore può fare se seguire la pratica del software tradizionale tenendo conto degli sviluppi hardware. Qual è la tua tecnica e dominio di interesse?
Biswajit Banerjee,

2
Un altro riferimento utile che non è del tutto mirato è "Calcolo efficace in fisica" di Anthony Scopatz e Kathryn Huff.
Brian Borchers,

@BrianBorchers Hm, sembra che metà di esso sia in un'introduzione a Python e quindi si concentri sugli strumenti di sviluppo.
user1997744

Risposte:


8

Avendo sviluppato un software numerico per 20 anni, trovo che probabilmente abbiamo usato la maggior parte dei modelli di progettazione descritti nel Libro della Banda dei Quattro ( vedi qui ). Alla fine della giornata, il software numerico è solo un software complesso e su larga scala, quindi forse non sorprende che si applichino le stesse considerazioni di progettazione come in altri software.

Esistono, naturalmente, numerosi casi specifici degli algoritmi numerici (vedi, ad esempio, qui ) ma conoscere il set "tradizionale" di schemi di progettazione è già un buon inizio.


Vorrei aggiungere che, per i calcoli numerici su hardware più recente, si dovrebbe cercare di ridurre al minimo l'inseguimento del puntatore (che usano molti dei modelli Gang of Four). Un buon punto di partenza per i progetti C ++ è github.com/isocpp/CppCoreGuidelines/blob/master/…
Biswajit Banerjee,

@BiswajitBanerjee Sì, le linee guida del C ++ sono le conoscenze di base per chiunque utilizzi il C ++ moderno. Herb Sutter è uno dei redattori e puoi sempre fidarti dei suoi consigli.
user1997744

@ user1997744 Intendevi Bjarne? Herb Sutter è anche famoso per la sua idea "sempre automatica" che porta a un codice di sola scrittura (non sono sicuro di quanto mi fiderei del suo giudizio). Inoltre, le linee guida di base del C ++ sono tutt'altro che conoscenze di base. Sarai sorpreso.
Biswajit Banerjee,

@BiswajitBanerjee Bene, se non lo sono, posso dire che non permetterei mai a uno sviluppatore di progredire oltre una singola intervista se non avessero familiarità con la maggior parte delle linee guida e del loro utilizzo (escluso il caso in cui il codice legacy può rendere questo difficile).
user1997744

6

Consiglio questo Matthew G Knepley. Linguaggi di programmazione per informatica scientifica. arXiv prestampa arXiv: 1209.1711, 2012 ( https://arxiv.org/pdf/1209.1711.pdf )

Consiglio anche di cercare e leggere altri codici, ad esempio triangolo, PETSc, MoAB, deal.II, fenics e molti altri. Non tutte le soluzioni funzioneranno per te, ma alla fine, far fronte e imparare dagli altri (sviluppatori esperti e codici di successo) è la lezione migliore su come progettare il codice.

Inoltre, penso che sia meglio aderire a un progetto esistente e diventare collaboratore o sviluppatore. A volte ti piace dare il via a qualcosa di nuovo, ma devi avere solidi argomenti per farlo.


Il mio argomento per dare il via a qualcosa di nuovo è l'esperienza di apprendimento da esso e il senso di realizzazione :)
user1997744

1
Capisco questo argomento. Avevo fatto la stessa cosa molto tempo fa. Ora penso che sia stato prematuro. Potrebbe essere che all'inizio dobbiamo fare tutti gli stessi errori. Per imparare a camminare per primo, devi cadere. Scrivendo il proprio codice, se è la prima volta, molto probabilmente sarai l'unico utente del tuo codice. Contribuendo al codice sviluppato dalla comunità, il tuo lavoro sarà probabilmente utilizzato da altri e questo ti darà senso di realizzazione e apprezzamento. Riceverai commenti / recensioni su richiesta pull, da cui imparerai e migliorerai le tue abilità.
likask

Beh, non c'è una libreria per un calcolo esoterico ultra specifico che devo fare, quindi alla fine devo davvero scrivere il mio, anche se ovviamente non è necessario reinventare tutto.
user1997744

Ottimo consiglio per partecipare a un progetto esistente open source. Sono stato attratto da una rete di programmatori molto meglio di me.
user14717
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.