Here are some resources in PDF files.

- The text is Partial Differential Equations with Numerical Methods by Stig Larsson and Vidar Thomée; if you visit that link from a Purdue IP address you can download chapters of the book in PDF format without charge.
- A reference (especially for the multigrid method) is The Mathematical Theory of Finite Element Methods, by Susanne E. Brenner and L. Ridgway Scott. Again, accessing that link from a Purdue IP address should allow you to download the entire text.
- If you need a review of basic Real Analysis, study the books Basic Concepts of Mathematics and Mathematical Analysis I (the first four chapters).
- The previous Scheme standard. Use this to find out what is in standard Scheme; there are a lot of very general mathematics functions in Scheme, see the examples.
- The Gambit manual is available in either html or PDF format. Important parts to know are the interpreter, the compiler, the debugger, declarations, loading and including files, and homogeneous vectors.
- The Meroon manual. The first project describes the differences between Meroon as described in the manual and how it's installed here.

To learn how to program in this style, work through the first two chapters of The Structure and Interpretation of Computer Programs or use other resources to learn Scheme on my home page.

To use Gambit have `/pkgs/Gambit-C/current/bin/` in your
path. The regular Gambit interpreter and compiler are called `gsi`
and `gsc`; the versions of the Gambit interpreter and compiler that
have Meroon preloaded are called `gsi++` and `gsc++`.

There are sources for various software packages. I've put together a separate software installation page with some notes about how to install them yourself if you want. (But, PLEASE, read some documentation, README files, etc., to learn a bit about it on your own.)

- Gambit web site.
- The Meroon sources.
- There is the software page for this class.
- Instructions about how to use Gambit and Meroon with mpi.

I've collected some suggestions for projects. You don't need to choose a project from this list, you can choose any other project with my approval. You will need to choose a project soon after spring break. If we haven't yet covered a project on this list yet (for parabolic problems, hyperbolic problems, etc.) then look in the textbook to see what these problems are like and decide whether you'd like to work on them.

- The first draft of the first part of the first project (just to get you going with Scheme/Gambit/Meroon).
- The zeroth draft of the second part of the first project (lots of typos, unfortunately).
**Note:**Your code should not depend on the implementation technique of terms or termlists. The code in SICP uses lists for both terms and termlists of polynomials, but that can be confusing, especially for debugging. So here is some code that, first, checks the invariants of polynomials that there should be no zero coefficients and the terms should be in decreasing order (look at the Meroon documentation for initialize!), and, second, gives two alternate implementations of terms and termlists. Your code should work no matter the implementation strategy of terms or termlists.(define-class Polynomial Object ((= variable immutable:) (= terms immutable:))) (define-method (initialize! (p Polynomial)) (let ((terms (Polynomial-terms p))) ;; check that ;; (a) termlists are in decreasing order (let loop ((terms terms)) (cond ((or (empty-termlist? terms) (empty-termlist? (rest-terms terms)))) ((> (term-order (first-term terms)) (term-order (first-term (rest-terms terms)))) (loop (rest-terms terms))) (else (error "initialize! for Polynomials: terms are not in decreasing order" p)))) ;; (b) check that coeffs are not zero (let loop ((terms terms)) (cond ((empty-termlist? terms)) ((not (zero? (term-coeff (first-term terms)))) (loop (rest-terms terms))) (else (error "initialize! for Polynomials: not all term coefficients are zero" p)))) (call-next-method))) ;; implementation of termlists using Meroon objects (define-class kons Object ((= kar immutable:) (= kdr immutable:))) (define (the-empty-termlist) 'empty-termlist) (define (first-term termlist) (kons-kar termlist)) (define (rest-terms termlist) (kons-kdr termlist)) (define (empty-termlist? termlist) (eq? termlist (the-empty-termlist))) (define (adjoin-term term term-list) (if (=zero? (term-coeff term)) term-list (make-kons term term-list))) ;; end #| ;; implementation of termlists using lists (define (the-empty-termlist) '()) (define first-term car) (define rest-terms cdr) (define empty-termlist? null?) (define (adjoin-term term term-list) (if (=zero? (term-coeff term)) term-list (cons term termlist))) ;; end |# ;; the following works no matter the definition of termlist (define (empty-termlist? termlist) (equal? termlist (the-empty-termlist))) #| ;; implementation of terms using Meroon objects (define-class term Object ((= order immutable:) (= coeff immutable:))) ;; end |# ;; implementation of terms using cons (define make-term cons) (define term-order car) (define term-coeff cdr)