Ich bin auf der Suche nach Büchern, Artikeln, Blog-Posts oder allgemein veröffentlichtem Material, das sich speziell mit der Verwendung moderner C ++ - Funktionen (Bewegungssemantik, STL, Iteratoren, verzögerte Auswertung usw.) im wissenschaftlichen Rechnen befasst. Kannst du welche vorschlagen?
Ich denke, dass diese neuen Funktionen das Schreiben von effizientem Code erleichtern werden, aber ich habe keine wirklichen Beispiele gefunden. Die meisten Referenzen, die ich gelesen habe, beziehen sich auf allgemeine Verwendungen von C ++ und enthalten keine Beispiele für wissenschaftliches Rechnen. Ich suche also nach Beispielen (müssen keine Beispiele für Produktionscodes sein, sondern nur pädagogische Beispiele auf der Ebene von beispielsweise numerischen Rezepten) für wissenschaftlichen Computercode mit modernen C ++ - Funktionen.
Beachten Sie, dass ich nicht nach Bibliotheken frage, die diese Funktionen verwenden. Ich frage nach Artikeln / Büchern / usw., in denen erklärt wird, wie ich diese Funktionen im wissenschaftlichen Rechnen nutzen kann.
quelle
Antworten:
Zwei Beispiele für Bibliotheken, die moderne C ++ - Konstrukte verwenden:
http://eigen.tuxfamily.org
http://arma.sourceforge.net/
http://hpac.rwth-aachen.de/teaching/sem-accg-14/Armadillo.pdf (Präsentation zu Ausdrucksvorlagen in Armadillo)
http://www.cgal.org
Hinweis:
Moderne C ++ - Konstrukte sind sehr elegant und können sehr unterhaltsam sein. Es ist sowohl eine Stärke als auch eine Schwäche: Wenn Sie sie verwenden, ist es so verlockend, mehrere Ebenen von Vorlagen / Spezialisierungen / Lambdas hinzuzufügen, dass Sie am Ende manchmal mehr "Administration" als effektiven Code im Programm erhalten (mit anderen Worten, Ihr Programm "spricht" mehr über das Problem als über die Beschreibung der Lösung. Das richtige Gleichgewicht zu finden ist sehr subtil. Schlussfolgerung: Man muss die Entwicklung des "Signal / Rausch" -Verhältnisses im Code verfolgen, indem man misst :
Alles, was die ersten beiden erhöht, kann als Kosten betrachtet werden (weil es das Programm möglicherweise schwieriger zu verstehen und zu warten macht), alles, was die letzten beiden verringert, ist ein Gewinn .
Beispielsweise kann das Einführen einer Abstraktion (einer virtuellen Klasse oder einer Vorlage) den Code faktorisieren und das Programm vereinfachen ( gain ). Wenn sie jedoch niemals nur einmal abgeleitet / instanziiert wird, entstehen Kosten für keinen damit verbundenen Gewinn (wiederum ist dies der Fall) subtil, weil der Gewinn später in der zukünftigen Entwicklung des Programms eintreten kann, daher gibt es keine "goldene Regel").
Der Komfort des Programmierers ist auch ein wichtiger Faktor, der beim Kosten-Nutzen-Verhältnis berücksichtigt werden muss: Bei zu vielen Vorlagen kann sich die Kompilierungszeit erheblich verlängern und das Parsen von Fehlermeldungen erschweren.
Siehe auch
Inwieweit ist generische und Metaprogrammierung mit C ++ - Vorlagen in der Computerwissenschaft nützlich?
quelle
Ich würde vorschlagen, sich Deal.II anzuschauen. Es verwendet die STL, eigene Iteratoren, gemeinsame Zeiger usw.
Die verschiedenen linearen Löser können die verschiedenen Matrizen aufgrund ihres Aufbaus verwenden. Ich habe keine Verwendung der Bewegungssemantik gefunden, aber das bedeutet nicht, dass sie nicht vorhanden sind. Hier ist ein Link.
quelle
Die HPX- Bibliothek nutzt eine Reihe von C ++ 11-Funktionen wie Move-Konstruktoren und strebt eine vollständige Implementierung von N4409 (Working Draft, Technische Spezifikation für C ++ - Erweiterungen für Parallelität) an.
Sie haben eine Liste von Veröffentlichungen auf ihrer Website, die eine Reihe von Beispielen für die Verwendung der Bibliothek zur Beschleunigung der wissenschaftlichen Berechnung enthält. Es gibt auch eine so interessante Diskussion über die Bibliothek und ihre Verwendung von modernem C ++ in dieser CppCast-Episode .
quelle
Ich schlage vor, einen Blick auf Scientific and Engineering C ++ zu werfen: Eine Einführung mit fortgeschrittenen Techniken und Beispielen von Barton und Nackmann .
Die Tatsache, dass dieses Buch 1994 veröffentlicht wurde, scheint Ihr Kriterium der "modernen Techniken" zu verletzen. Barton und Nackmann waren jedoch auf dem neuesten Stand der Möglichkeiten, die mit C ++ - Vorlagen zu dieser Zeit möglich waren, und die innovativen Techniken, die sie für eine gute Leistung entwickelten, werden in den neuesten C ++ - Klassenbibliotheken immer noch verwendet.
quelle
Neben deal.ii (das hier bereits vorgeschlagen wurde) können Sie sich auch die Dune- Bibliothek ansehen, die einige erweiterte C ++ - Funktionen wie Template-Metaprogrammierung, Iteratorbereiche, intelligente Zeiger usw. ausführlich nutzt. Es gibt auch einen aktuellen Preprint von Joachim Schöberl, der die Verwendung von C ++ 11-Funktionen, wie zum Beispiel Lambda-Funktionen, zur Vereinfachung der Implementierung der Finite-Elemente-Methoden in NGSolve kommentiert. BoostAußerdem gibt es einige Bibliotheken, die sich mit wissenschaftlicher Programmierung befassen, wie uBLAS, Graph usw. Ich denke, in den meisten dieser Bibliotheken finden Sie gute Beispiele für die Verwendung von modernem C ++. Beachten Sie jedoch, dass Sie möglicherweise auch auf schlechte Beispiele für die Verwendung von Advanced / Modern C ++ stoßen. In einigen Fällen hatte ich beim Lesen des Codes / der Dokumentation das Gefühl, dass die Dinge gelegentlich stark verallgemeinert sind, um fortgeschrittene Fähigkeiten wie TMP zu demonstrieren, wobei für 99% aller potenziellen Anwendungen auch eine einfachere Implementierung das tun würde Job.
quelle
Das Buch "Leitfaden zum wissenschaftlichen Rechnen in C ++" von Pitt-Francis & Whiteley wurde geschrieben, um genau diese Fragen zu beantworten (Verwendung von STL, Iteratoren usw.). Es ist über Amazon oder als E-Book beim Verlag erhältlich .
Offenlegung - Ich arbeite in der gleichen Forschungsgruppe wie die Autoren, denke aber immer noch, dass es eine sehr gute Ressource dafür ist!
quelle
Ich denke, dass dieses Buch wie ich perfekt für Sie ist: Discovering Modern C ++: Ein Intensivkurs für Wissenschaftler, Ingenieure und Programmierer (C ++ In-Depth) von Peter Gottschling, insbesondere wenn es in Verbindung mit Programmierprinzipien und der Anwendung von Übungen verwendet wird C ++ 2nd Edition Bjarne Stroustrup. Der Erfinder von C ++. Beide sollten einen festen Boden zum Stehen bieten.
quelle
Die Blaze-Bibliothek für lineare Algebra nutzt C ++ 14 in Form von abgeleiteten und nachgestellten Rückgabetypen. Andere moderne C ++ - Funktionen, die verwendet werden
constexpr
, sind Alias-Vorlagen und eine ganze Reihe von Vorlagen-Metaprogrammierungen mit dem Ausdruck SFINAE.Sie können auch Initialisierungslisten für Ihre Vektoren und Matrizen verwenden, z
Weitere Details finden Sie auf der Einstiegsseite .
quelle