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.