PETSc, the portable, extensible toolkit for scientific computation, provides library routines for solving large sparse linear systems through the Scalable Linear Equations Solvers (SLES) component[5]. This component allows the user to easily solve linear systems that are set up in a PETSc format. These formats include a standard sparse storage format (AIJ), a block diagonal format, and an interface to enter information about a structured grid. Once the system is set up in PETSc format, there is a call to SLESSolve() which solves the system.
Some of the options to the call to SLESSolve() allow you to select from a broad range of Krylov Subspace Methods to use, in conjunction with a preconditioner. The available Krylov Subspace Methods include GMRES(k) and BiCGStab. The preconditioners available from within PETSc include Jacobi, Block Jacobi, Additive Schwarz, and Multigrid. Multigrid must be used on a structured grid from within PETSc, but it is also available for unstructured grids through a interface to hypre.
One of the strengths of PETSc is the degree of customization. There are a plethora of options available for solving linear systems, which gives a lot of flexibility within the package to adjust the way you are solving a particular system based on knowledge of the system. There are a number of monitors and logging facilities built in to PETSc to help you determine whether or not PETSc is doing a good job of solving your system. The results shown in this paper utilize PETSc's ability to monitor itself and give detailed breakdowns of function calls and timings.