| Preface | p. ix |
| Numerical Software | p. 1 |
| Why numerical software? | p. 3 |
| Efficient kernels | p. 4 |
| Rapid change | p. 5 |
| Large-scale problems | p. 6 |
| Scientific computation and numerical analysis | p. 8 |
| The trouble with real numbers | p. 8 |
| Fixed-point arithmetic | p. 18 |
| Algorithm stability vs. problem stability | p. 19 |
| Numerical accuracy and reliability | p. 23 |
| Priorities | p. 30 |
| Correctness | p. 30 |
| Numerical stability | p. 32 |
| Accurate discretization | p. 32 |
| Flexibility | p. 33 |
| Efficiency: time and memory | p. 35 |
| Famous disasters | p. 36 |
| Patriot missiles | p. 36 |
| Ariane 5 | p. 37 |
| Sleipner A oil rig collapse | p. 38 |
| Exercises | p. 39 |
| Developing Software | p. 43 |
| Basics of computer organization | p. 45 |
| Under the hood: what a CPU does | p. 45 |
| Calling routines: stacks and registers | p. 47 |
| Allocating variables | p. 51 |
| Compilers, linkers, and loaders | p. 53 |
| Software design | p. 57 |
| Software engineering | p. 57 |
| Software life-cycle | p. 57 |
| Programming in the large | p. 59 |
| Programming in the small | p. 61 |
| Programming in the middle | p. 67 |
| Interface design | p. 70 |
| Top-down and bottom-up development | p. 75 |
| Don't hard-wire it unnecessarily! | p. 77 |
| Comments | p. 78 |
| Documentation | p. 80 |
| Cross-language development | p. 82 |
| Modularity and all that | p. 87 |
| Data structures | p. 90 |
| Package your data! | p. 90 |
| Avoid global variables! | p. 91 |
| Multidimensional arrays | p. 92 |
| Functional representation vs. data structures | p. 96 |
| Functions and the "environment problem" | p. 97 |
| Some comments on object-oriented scientific software | p. 106 |
| Design for testing and debugging | p. 118 |
| Incremental testing | p. 118 |
| Localizing bugs | p. 120 |
| The mighty "print" statement | p. 120 |
| Get the computer to help | p. 122 |
| Using debuggers | p. 129 |
| Debugging functional representations | p. 130 |
| Error and exception handling | p. 132 |
| Compare and contrast | p. 135 |
| Tracking bugs | p. 136 |
| Stress testing and performance testing | p. 137 |
| Random test data | p. 141 |
| Exercises | p. 143 |
| Efficiency in Time, Efficiency in Memory | p. 147 |
| Be algorithm aware | p. 149 |
| Numerical algorithms | p. 149 |
| Discrete algorithms | p. 151 |
| Numerical algorithm design techniques | p. 153 |
| Computer architecture and efficiency | p. 156 |
| Caches and memory hierarchies | p. 156 |
| A tour of the Pentium 4[superscript T M] architecture | p. 158 |
| Virtual memory and paging | p. 164 |
| Thrashing | p. 164 |
| Designing for memory hierarchies | p. 165 |
| Dynamic data structures and memory hierarchies | p. 168 |
| Pipelining and loop unrolling | p. 168 |
| Basic Linear Algebra Software (BLAS) | p. 170 |
| LAPACK | p. 178 |
| Cache-oblivious algorithms and data structures | p. 184 |
| Indexing vs. pointers for dynamic data structures | p. 185 |
| Global vs. local optimization | p. 187 |
| Picking algorithms vs. keyhole optimization | p. 187 |
| What optimizing compilers do | p. 188 |
| Helping the compiler along | p. 191 |
| Practicalities and asymptotic complexity | p. 192 |
| Grabbing memory when you need it | p. 195 |
| Dynamic memory allocation | p. 195 |
| Giving it back | p. 197 |
| Garbage collection | p. 198 |
| Life with garbage collection | p. 199 |
| Conservative garbage collection | p. 202 |
| Doing it yourself | p. 203 |
| Memory tips | p. 205 |
| Memory bugs and leaks | p. 208 |
| Beware: unallocated memory! | p. 208 |
| Beware: overwriting memory! | p. 208 |
| Beware: dangling pointers! | p. 210 |
| Beware: memory leaks! | p. 214 |
| Debugging tools | p. 215 |
| Tools | p. 217 |
| Sources of scientific software | p. 219 |
| Netlib | p. 220 |
| BLAS | p. 220 |
| LAPACK | p. 221 |
| GAMS | p. 221 |
| Other sources | p. 221 |
| Unix tools | p. 223 |
| Automated builds: make | p. 223 |
| Revision control: RCS, CVS, Subversion and Bitkeeper | p. 226 |
| Profiling: prof and gprof | p. 228 |
| Text manipulation: grep, sed, awk, etc. | p. 230 |
| Other tools | p. 232 |
| What about Microsoft Windows? | p. 233 |
| Design Examples | p. 237 |
| Cubic spline function library | p. 239 |
| Creation and destruction | p. 242 |
| Output | p. 244 |
| Evaluation | p. 244 |
| Spline construction | p. 247 |
| Periodic splines | p. 257 |
| Performance testing | p. 260 |
| Multigrid algorithms | p. 262 |
| Discretizing partial differential equations | p. 262 |
| Outline of multigrid methods | p. 264 |
| Implementation of framework | p. 265 |
| Common choices for the framework | p. 272 |
| A first test | p. 273 |
| The operator interface and its uses | p. 276 |
| Dealing with sparse matrices | p. 279 |
| A second test | p. 282 |
| Review of vectors and matrices | p. 287 |
| Identities and inverses | p. 288 |
| Norms and errors | p. 289 |
| Errors in solving linear systems | p. 291 |
| Trademarks | p. 292 |
| References | p. 293 |
| Index | p. 299 |
| Table of Contents provided by Ingram. All Rights Reserved. |