Scientific Computing is by its very nature a practical subject – it requires tools and a lot of practice. To solve realistic problems we need not only fast algorithms but also a combination of good tools and fast computers. This is the subject of the current book, which emphasizes equally all three: algorithms, tools, and computers. Oftentimes such concepts and tools are taught serially across different courses and different textbooks, and hence the interconnections among them are not immediately apparent. We believe that such a close integration is important from the outset.
The book starts with a heavy dosage of C++ and basic mathematical and computational concepts, and it ends emphasizing advanced parallel algorithms that are used in modern simulations. We have tried to make this book fun to read, to somewhat demystify the subject, and thus the style is sometimes informal and personal. It may seem that this happens at the expense of rigor, and indeed we have tried to limit notation and the proving of theorems. Instead, we emphasize concepts and useful “tricks of the trade” with many code segments, remarks, reminders, and warnings throughout the book.
The material of this book has been taught at different times to students in engineering, physics, computer science, and applied mathematics at Princeton University, Brown University, and MIT over the past fifteen years. Different segments have been taught to undergraduates and graduates, and to novices as well as to experts. To this end, on all three subjects covered, we start with simple introductory concepts and proceed to more advanced topics; such bandwidth, we believe, is one strength of this book.