3.1 Toward higher app complexity
3.1.1 Refactoring the tsunami simulator
3.1.2 Revisiting the cold front problem
3.1.3 An overview of Fortran program units
3.2 Don’t repeat yourself, use procedures
3.2.1 Your first function
3.2.2 Expressing finite difference as a function in the tsunami simulator
3.3 Modifying program state with subroutines
3.3.1 Defining and calling a subroutine
3.3.2 When to use a subroutine over a function?
3.3.3 Initializing water height in the tsunami simulator
3.4 Writing pure procedures to avoid side effects
3.4.1 What is a pure procedure?
3.4.2 Some restrictions on pure procedures
3.4.3 Why are pure functions important?
3.5 Writing procedures that operate on both scalars and arrays
3.6 Procedures with optional arguments
3.7 Tsunami simulator: Putting it all together
3.8 Answer key
3.8.1 Exercise 1: Modifying state with a subroutine
3.8.2 Exercise 2: Writing an elemental function that operates on both scalars and arrays
3.9 New Fortran elements, at a glance
3.10 Further reading