For a given discontinuous galerkin (DG) implementation for Navier-Stokes, targeting 10,000 to 1,000,000 4th order cells in 3D, I'm using PETSc's suite of linear/non-linear solvers on the back-end. It seems to me that there are two broad methods of implicitly solving the discretization. One can explicitly form the Jacobian in a sparse format and use whatever tools are available to solve it, or use a Jacobian-Free Newton-Krylov method that approximates the jacobian-vector products by evaluating the right-hand-side by finite differences. Advantages and disadvantages I see of each:
Explicit Jacobian
- Con - Requires a large amount of memory (precisely how much? can I do this with <100GB total memory?)
- Con - Requires writing code to evaluate the Jacobian and store it
- Pro - Allows the use of black-box preconditioners already present in PETSc
Jacobian-Free Newton-Krylov
- Pro - Minimal memory needs
- Con - Unknown how often to re-linearize or what finite difference steps to use, how often to restart, etc.
- Con - must write own preconditioners.
I'd like some input from those more familiar with these methods as to the advantages and disadvantages of them. Am I right to assume the explicit jacobian would be much faster?