SCIENTIFIC SOFTWARE: A GUIDE TO GOOD STYLE
CONTENTS PART I NUMERICAL SOFTWARE WHY NUMERICAL SOFTWARE? EF?CIENT KERNELS RAPID CHANGE LARGE-SCALE PROBLEMS SCIENTI?C COMPUTATION AND NUMERICAL ANALYSIS THE TROUBLE WITH REAL NUMBERS FIXED-POINT ARITHMETIC ALGORITHM STABILITY VS PROBLEM STABILITY NUMERICAL ACCURACY AND RELIABILITY PRIORITIES CORRECTNESS NUMERICAL STABILITY ACCURATE DISCRETIZATION FLEXIBILITY EF?CIENCY: TIME AND MEMORY FAMOUS DISASTERS PATRIOT MISSILES ARIANE SLEIPNER A OIL RIG COLLAPSE EXERCISES PART II DEVELOPING SOFTWARE BASICS OF COMPUTER ORGANIZATION UNDER THE HOOD: WHAT A CPU DOES CALLING ROUTINES: STACKS AND REGISTERS ALLOCATING VARIABLES COMPILERS, LINKERS, AND LOADERS CONTENTS SOFTWARE DESIGN SOFTWARE ENGINEERING SOFTWARE LIFE-CYCLE PROGRAMMING IN THE LARGE PROGRAMMING IN THE SMALL PROGRAMMING IN THE MIDDLE INTERFACE DESIGN TOP-DOWN AND BOTTOM-UP DEVELOPMENT DON’T HARD-WIRE IT UNNECESSARILY! COMMENTS DOCUMENTATION CROSS-LANGUAGE DEVELOPMENT MODULARITY AND ALL THAT DATA STRUCTURES PACKAGE YOUR DATA! AVOID GLOBAL VARIABLES! MULTIDIMENSIONAL ARRAYS FUNCTIONAL REPRESENTATION VS DATA STRUCTURES FUNCTIONS AND THE “ENVIRONMENT PROBLEM” SOME COMMENTS ON OBJECT-ORIENTED SCIENTI?C SOFTWARE DESIGN FOR TESTING AND DEBUGGING INCREMENTAL TESTING LOCALIZING BUGS THE MIGHTY “PRINT” STATEMENT GET THE COMPUTER TO HELP USING DEBUGGERS DEBUGGING FUNCTIONAL REPRESENTATIONS ERROR AND EXCEPTION HANDLING COMPARE AND CONTRAST TRACKING BUGS STRESS TESTING AND PERFORMANCE TESTING RANDOM TEST DATA 10 EXERCISES PART III EF?CIENCY IN TIME, EF?CIENCY IN MEMORY 11 BE ALGORITHM AWARE NUMERICAL ALGORITHMS DISCRETE ALGORITHMS NUMERICAL ALGORITHM DESIGN TECHNIQUES 12 COMPUTER ARCHITECTURE AND EF?CIENCY CACHES AND MEMORY HIERARCHIES A TOUR OF THE PENTIUM 4T M ARCHITECTURE VIRTUAL MEMORY AND PAGING THRASHING DESIGNING FOR MEMORY HIERARCHIES DYNAMIC DATA STRUCTURES AND MEMORY HIERARCHIES PIPELINING AND LOOP UNROLLING BASIC LINEAR ALGEBRA SOFTWARE (BLAS) LAPACK 12 10 CACHE-OBLIVIOUS ALGORITHMS AND DATA STRUCTURES 12 11 INDEXING VS POINTERS FOR DYNAMIC DATA STRUCTURES 13 GLOBAL VS LOCAL OPTIMIZATION PICKING ALGORITHMS VS KEYHOLE OPTIMIZATION WHAT OPTIMIZING COMPILERS DO HELPING THE COMPILER ALONG PRACTICALITIES AND ASYMPTOTIC COMPLEXITY 14 GRABBING MEMORY WHEN YOU NEED IT DYNAMIC MEMORY ALLOCATION GIVING IT BACK GARBAGE COLLECTION LIFE WITH GARBAGE COLLECTION CONSERVATIVE GARBAGE COLLECTION DOING IT YOURSELF MEMORY TIPS 15 MEMORY BUGS AND LEAKS BEWARE: UNALLOCATED MEMORY! BEWARE: OVERWRITING MEMORY! BEWARE: DANGLING POINTERS! BEWARE: MEMORY LEAKS! DEBUGGING TOOLS PART IV TOOLS 16 SOURCES OF SCIENTI?C SOFTWARE NETLIB BLAS GAMS OTHER SOURCES 17 UNIX TOOLS AUTOMATED BUILDS: MAKE REVISION CONTROL: RCS, CVS, SUBVERSION AND BITKEEPER PRO?LING: PROF AND GPROF TEXT MANIPULATION: GREP, SED, AWK, ETC OTHER TOOLS WHAT ABOUT MICROSOFT WINDOWS? PART V DESIGN EXAMPLES 18 CUBIC SPLINE FUNCTION LIBRARY CREATION AND DESTRUCTION OUTPUT EVALUATION SPLINE CONSTRUCTION PERIODIC SPLINES PERFORMANCE TESTING 19 MULTIGRID ALGORITHMS DISCRETIZING PARTIAL DIFFERENTIAL EQUATIONS OUTLINE OF MULTIGRID METHODS IMPLEMENTATION OF FRAMEWORK COMMON CHOICES FOR THE FRAMEWORK A ?RST TEST THE OPERATOR INTERFACE AND ITS USES DEALING WITH SPARSE MATRICES A SECOND TEST REFERENCES